def do_upload(socket, remote_address): # print remote_address socket._status = SOCKET_STATUS_WAITING # 标记链接状态 error_code = '' fileobj = FileObjWrapper(socket.makefile()) # 读取上传请求 try: request_head = fileobj.read(26) # print 'request head', repr(request_head) packet_length = hex2int(request_head[:4]) # 第一次参数接受、解析出错,就不理会 except: try: fileobj.write(int2hex(RESULT_INVALID_ARGS, int_len=2)) fileobj.close() except: pass return socket._status = SOCKET_STATUS_WORKING # 标记链接状态 app_id = hex2int(request_head[4:6], int_len=2) file_size = hex2int(request_head[6:10]) file_hash = request_head[10:26] try: handler = get_app_handler(app_id, file_size, file_hash) except FileSizeError: fileobj.write(int2hex(RESULT_FILE_TOO_LARGE, int_len=2)) fileobj.close() return except Exception: log.error(traceback.format_exc()) fileobj.write(int2hex(RESULT_FS_ERROR, int_len=2)) fileobj.close() return if not handler: # 找不到授权应用 fileobj.write(int2hex(RESULT_INVALID_ARGS, int_len=2)) fileobj.close() return socket.timeout = handler.CONNECTION_TIMEOUT # 设置线程总超时时长,秒 # 读取请求TLV参数 tlv = fileobj.read(packet_length - 26) try: handler.handle_request(tlv) except InvalidArgsError: error_code = RESULT_INVALID_ARGS except AuthenticateError: error_code = RESULT_AUTH_FAIL except FileTypeError: error_code = RESULT_WRONG_FILE_TYPE except FileExistError, e: fileobj.write(int2hex(RESULT_FILE_EXIST, int_len=2)) fileobj.write(int2hex(4 + len(e.message))) # 4个字节是这个长度值本身长度 fileobj.write(e.message) fileobj.close() return
def _handler_head(self, msg): if len(msg) > self.UPLOAD_PACK_HEAD_MAXSIZE: self.failConnection() return try: app_id = int(msg[:4]) file_hash = msg[4:36] file_size = int(msg[36:47]) tlv = msg[47:] except: self.closeConnection('%02.f' % RESULT_INVALID_ARGS) return if settings.DEBUG: print '''\npack head: app_id: %s file_hash: %s file_size: %s tlv: %s ''' % (app_id, file_hash, file_size, tlv) file_hash = file_hash.decode('hex') # 适应后端 转换成16位字符 try: handler = get_app_handler(app_id, file_size, file_hash) except FileSizeError: self.closeConnection('%02.f' % RESULT_FILE_TOO_LARGE) return except Exception: log.error(traceback.format_exc()) self.closeConnection('%02.f' % RESULT_FS_ERROR) return if not handler: self.closeConnection('%02.f' % RESULT_INVALID_ARGS) return try: tlv = self.format_tlv(tlv) except: self.closeConnection('%02.f' % RESULT_INVALID_ARGS) return error_code = '' # 读取请求TLV参数 try: handler.handle_request(tlv) if settings.DEBUG: print 'file name:', handler.file_name print 'file type:', handler.file_type except InvalidArgsError: error_code = RESULT_INVALID_ARGS except AuthenticateError: error_code = RESULT_AUTH_FAIL except FileTypeError: error_code = RESULT_WRONG_FILE_TYPE except FileExistError, e: self.closeConnection('%02.f' % RESULT_FILE_EXIST + self.unformat_tlv(e.message)) return
def _handler_head(self, msg): if len(msg) > self.UPLOAD_PACK_HEAD_MAXSIZE: self.failConnection() return try: app_id = int(msg[:4]) file_hash = msg[4:36] file_size = int(msg[36:47]) tlv = msg[47:] except: self.closeConnection('%02.f' %RESULT_INVALID_ARGS) return if settings.DEBUG: print '''\npack head: app_id: %s file_hash: %s file_size: %s tlv: %s ''' %(app_id, file_hash, file_size, tlv) file_hash = file_hash.decode('hex') # 适应后端 转换成16位字符 try: handler = get_app_handler(app_id, file_size, file_hash) except FileSizeError: self.closeConnection('%02.f' %RESULT_FILE_TOO_LARGE) return except Exception: log.error(traceback.format_exc()) self.closeConnection('%02.f' %RESULT_FS_ERROR) return if not handler: self.closeConnection('%02.f' %RESULT_INVALID_ARGS) return try: tlv = self.format_tlv(tlv) except: self.closeConnection('%02.f' %RESULT_INVALID_ARGS) return error_code = '' # 读取请求TLV参数 try: handler.handle_request(tlv) if settings.DEBUG: print 'file name:', handler.file_name print 'file type:', handler.file_type except InvalidArgsError: error_code = RESULT_INVALID_ARGS except AuthenticateError: error_code = RESULT_AUTH_FAIL except FileTypeError: error_code = RESULT_WRONG_FILE_TYPE except FileExistError, e: self.closeConnection('%02.f' %RESULT_FILE_EXIST + self.unformat_tlv(e.message)) return