def get_file_upload(self): try: if len(self.request.files) != 1: raise errors.InvalidInputFormat( "cannot accept more than a file upload at once") chunk_size = len(self.request.files['file'][0]['body']) total_file_size = int( self.request.arguments['flowTotalSize'][0] ) if 'flowTotalSize' in self.request.arguments else chunk_size flow_identifier = self.request.arguments['flowIdentifier'][ 0] if 'flowIdentifier' in self.request.arguments else generateRandomKey( 10) if ((chunk_size / (1024 * 1024)) > GLSettings.memory_copy.maximum_filesize or (total_file_size / (1024 * 1024)) > GLSettings.memory_copy.maximum_filesize): log.err("File upload request rejected: file too big") raise errors.FileTooBig( GLSettings.memory_copy.maximum_filesize) if flow_identifier not in GLUploads: f = GLSecureTemporaryFile(GLSettings.tmp_upload_path) GLUploads[flow_identifier] = f else: f = GLUploads[flow_identifier] f.write(self.request.files['file'][0]['body']) if 'flowChunkNumber' in self.request.arguments and 'flowTotalChunks' in self.request.arguments: if self.request.arguments['flowChunkNumber'][ 0] != self.request.arguments['flowTotalChunks'][0]: return None uploaded_file = {} uploaded_file['filename'] = self.request.files['file'][0][ 'filename'] uploaded_file['content_type'] = self.request.files['file'][0][ 'content_type'] uploaded_file['body_len'] = total_file_size uploaded_file['body_filepath'] = f.filepath uploaded_file['body'] = f upload_time = time.time() - f.creation_date track_handler(self) return uploaded_file except errors.FileTooBig: raise # propagate the exception except Exception as exc: log.err("Error while handling file upload %s" % exc) return None
def on_finish(self): """ Here is implemented: - The performance analysts - the Request/Response logging """ # file uploads works on chunk basis so that we count 1 the file upload # as a whole in function get_file_upload() if not self.filehandler: track_handler(self) self.handler_time_analysis_end() self.handler_request_logging_end()
def execution_check(self): self.request.execution_time = datetime.now() - self.request.start_time if self.request.execution_time.seconds > self.handler_exec_time_threshold: err_tup = ("Handler [%s] exceeded execution threshold (of %d secs) with an execution time of %.2f seconds", self.name, self.handler_exec_time_threshold, self.request.execution_time.seconds) log.err(tid=self.request.tid, *err_tup) self.state.schedule_exception_email(self.request.tid, *err_tup) track_handler(self) if self.uniform_answer_time: needed_delay = (float(Settings.side_channels_guard) - (float(self.request.execution_time.microseconds) / float(1000))) / float(1000) if needed_delay > 0: return deferred_sleep(needed_delay)
def execution_check(self): self.request.execution_time = datetime.now() - self.request.start_time if self.request.execution_time.seconds > self.handler_exec_time_threshold: err_tup = ("Handler [%s] exceeded execution threshold (of %d secs) with an execution time of %.2f seconds", self.name, self.handler_exec_time_threshold, self.request.execution_time.seconds) log.err(tid=self.request.tid, *err_tup) self.state.schedule_exception_email(*err_tup) track_handler(self) if self.uniform_answer_time: needed_delay = (Settings.side_channels_guard - (self.request.execution_time.microseconds / 1000)) / 1000 if needed_delay > 0: return deferred_sleep(needed_delay)
def execution_check(self): self.request.execution_time = datetime.now() - self.request.start_time if self.request.execution_time.seconds > self.handler_exec_time_threshold: error = "Handler [%s] exceeded execution threshold (of %d secs) with an execution time of %.2f seconds" % \ (self.name, self.handler_exec_time_threshold, self.request.execution_time.seconds) log.err(error) send_exception_email(error) track_handler(self) if self.uniform_answer_time: needed_delay = (GLSettings.side_channels_guard - (self.request.execution_time.microseconds / 1000)) / 1000 if needed_delay > 0: yield deferred_sleep(needed_delay)
def get_file_upload(self): try: if len(self.request.files) != 1: raise errors.InvalidInputFormat("cannot accept more than a file upload at once") chunk_size = len(self.request.files['file'][0]['body']) total_file_size = int(self.request.arguments['flowTotalSize'][0]) if 'flowTotalSize' in self.request.arguments else chunk_size flow_identifier = self.request.arguments['flowIdentifier'][0] if 'flowIdentifier' in self.request.arguments else generateRandomKey(10) if ((chunk_size / (1024 * 1024)) > GLSettings.memory_copy.maximum_filesize or (total_file_size / (1024 * 1024)) > GLSettings.memory_copy.maximum_filesize): log.err("File upload request rejected: file too big") raise errors.FileTooBig(GLSettings.memory_copy.maximum_filesize) if flow_identifier not in GLUploads: f = GLSecureTemporaryFile(GLSettings.tmp_upload_path) GLUploads[flow_identifier] = f else: f = GLUploads[flow_identifier] f.write(self.request.files['file'][0]['body']) if 'flowChunkNumber' in self.request.arguments and 'flowTotalChunks' in self.request.arguments: if self.request.arguments['flowChunkNumber'][0] != self.request.arguments['flowTotalChunks'][0]: return None uploaded_file = { 'name': self.request.files['file'][0]['filename'], 'type': self.request.files['file'][0]['content_type'], 'size': total_file_size, 'path': f.filepath, 'body': f, 'description': self.request.arguments.get('description', [''])[0] } self.request._start_time = f.creation_date track_handler(self) return uploaded_file except errors.FileTooBig: raise # propagate the exception except Exception as exc: log.err("Error while handling file upload %s" % exc) return None