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 _f(t): if len(t) > 0: tar = hex2int(t[:2], int_len=2) length = hex2int(t[2:4], int_len=2) value = t[4:4+length] if settings.DEBUG: print 'tlv:', tar, length, value return ''.join(['%02.f' %tar, '%011.f' %length, value, _f(t[4+length:])]) return ''
def _f(t): if len(t) > 0: tar = hex2int(t[:2], int_len=2) length = hex2int(t[2:4], int_len=2) value = t[4:4 + length] if settings.DEBUG: print 'tlv:', tar, length, value return ''.join([ '%02.f' % tar, '%011.f' % length, value, _f(t[4 + length:]) ]) return ''
def _parse_request_args(self, tlv): pos = 0 while pos < len(tlv): tag = hex2int(tlv[pos:pos + 2], int_len=2) # print 'tag', tag if not tag: break length = hex2int(tlv[pos + 2:pos + 4], int_len=2) value = tlv[pos + 4:pos + 4 + length] if tag == REQ_TAG_SESSION_ID: self.session_id = value if tag == REQ_TAG_FILENAME: self.file_name = value pos = pos + 4 + length
def _parse_request_args(self, tlv): pos = 0 while pos < len(tlv): tag = hex2int(tlv[pos : pos + 2], int_len=2) # print 'tag', tag if not tag: break length = hex2int(tlv[pos + 2 : pos + 4], int_len=2) value = tlv[pos + 4 : pos + 4 + length] if tag == REQ_TAG_SESSION_ID: self.session_id = value if tag == REQ_TAG_FILENAME: self.file_name = value pos = pos + 4 + length
def push_file(app_id, filename, session_id, server_ip, server_port): print 'put file to : %s:%s' %(server_ip, server_port) f = open(filename, 'r') content = f.read() f.close() m = hashlib.md5() m.update(content) file_hash = m.digest() file_size = len(content) file_name = f.name request = '' request += int2hex(26 + 4 * 2 + len(session_id) + len(file_name)) request += int2hex(app_id, int_len=2) request += int2hex(file_size) request += file_hash request += int2hex(1, int_len=2) request += int2hex(len(session_id), int_len=2) request += session_id request += int2hex(2, int_len=2) request += int2hex(len(file_name), int_len=2) request += file_name s = open_conn(server_ip, server_port) time.sleep(1) ##################################################### 测试链接超时性 s.sendall(request) response = s.recv(2) # 请求结果2个字节 result = hex2int(response, int_len=2) if result == RESULT_ALLOW_UPLOAD: time.sleep(1) ################################################## 测试链接超时性 print "let's pushing ..." p = int(file_size / 10) sum_ = 0 for _k in range(1, 10): c_ = content[p*(_k-1): p*_k] sum_ += len(c_) print ' %d%% [%d/%d] ...' %(_k * 10, sum_, file_size) time.sleep(1) ############################################### 测试链接超时性 s.sendall(c_) print ' %d%% [%d/%d] ...' %((_k + 1) * 10, sum_ + len(content[p*_k: ]), file_size) s.sendall(content[p*_k: ]) try: upload_response = s.recv(6) # 这6个字节分别为:4个字节的包长度,2个字节的上传结果 # 正常上传结果 packet_len = hex2int(upload_response[:4]) result = hex2int(upload_response[4:6], int_len=2) except: result = hex2int(upload_response[:2], int_len=2) # 上传过程中发生异常,则只有2字节 if result == RESULT_UPLOAD_SUCCESS: tlv = s.recv(packet_len - 6) pos = 0 f_url = None while pos < len(tlv): tag = hex2int(tlv[pos:pos+2], int_len=2) if not tag: break length = hex2int(tlv[pos+2:pos+4], int_len=2) value = tlv[pos+4:pos+4+length] pos += 4 + length if tag == 10: # 文件路径tag f_url = value else: print 'unknow tag:::::::::', tag break print 'f_url::::::::::::', f_url else: print 'upload error::::', result else: if result == RESULT_FILE_EXIST: # 文件已经存在 print 'file exist!!' pak_len = hex2int(s.recv(4)) - 4 pak = s.recv(pak_len) p = 0 f_url = None while p < pak_len: t = hex2int(pak[p:p+2], int_len=2) # print "tag::", t if not t: break length = hex2int(pak[p+2:p+4], int_len=2) # print 'len::', length value = pak[p+4:p+4+length] # print 'value::', value p += 4 + length if t == 10: # 文件路径tag f_url = value else: print 'unknow tag:::::::::', t break print 'f_url::::::::::::', f_url else: print 'upload error::::', if result == RESULT_WRONG_FILE_TYPE: print u'不允许的文件类型' elif result == RESULT_INVALID_ARGS: print u'参数无效' elif result == RESULT_FILE_TOO_LARGE: print u'文件太大' elif result == RESULT_AUTH_FAIL: print u'认证错误' elif result == RESULT_BUSY: print u'系统繁忙' elif result == RESULT_FS_ERROR: print u'文件系统异常' else: print u'未知错误[%s]' %result s.close()
def push_file(app_id, filename, session_id, server_ip, server_port): print 'put file to : %s:%s' % (server_ip, server_port) f = open(filename, 'r') content = f.read() f.close() m = hashlib.md5() m.update(content) file_hash = m.digest() file_size = len(content) file_name = f.name request = '' request += int2hex(26 + 4 * 2 + len(session_id) + len(file_name)) request += int2hex(app_id, int_len=2) request += int2hex(file_size) request += file_hash request += int2hex(1, int_len=2) request += int2hex(len(session_id), int_len=2) request += session_id request += int2hex(2, int_len=2) request += int2hex(len(file_name), int_len=2) request += file_name s = open_conn(server_ip, server_port) time.sleep( 1) ##################################################### 测试链接超时性 s.sendall(request) response = s.recv(2) # 请求结果2个字节 result = hex2int(response, int_len=2) if result == RESULT_ALLOW_UPLOAD: time.sleep( 1) ################################################## 测试链接超时性 print "let's pushing ..." p = int(file_size / 10) sum_ = 0 for _k in range(1, 10): c_ = content[p * (_k - 1):p * _k] sum_ += len(c_) print ' %d%% [%d/%d] ...' % (_k * 10, sum_, file_size) time.sleep( 1) ############################################### 测试链接超时性 s.sendall(c_) print ' %d%% [%d/%d] ...' % ( (_k + 1) * 10, sum_ + len(content[p * _k:]), file_size) s.sendall(content[p * _k:]) try: upload_response = s.recv(6) # 这6个字节分别为:4个字节的包长度,2个字节的上传结果 # 正常上传结果 packet_len = hex2int(upload_response[:4]) result = hex2int(upload_response[4:6], int_len=2) except: result = hex2int(upload_response[:2], int_len=2) # 上传过程中发生异常,则只有2字节 if result == RESULT_UPLOAD_SUCCESS: tlv = s.recv(packet_len - 6) pos = 0 f_url = None while pos < len(tlv): tag = hex2int(tlv[pos:pos + 2], int_len=2) if not tag: break length = hex2int(tlv[pos + 2:pos + 4], int_len=2) value = tlv[pos + 4:pos + 4 + length] pos += 4 + length if tag == 10: # 文件路径tag f_url = value else: print 'unknow tag:::::::::', tag break print 'f_url::::::::::::', f_url else: print 'upload error::::', result else: if result == RESULT_FILE_EXIST: # 文件已经存在 print 'file exist!!' pak_len = hex2int(s.recv(4)) - 4 pak = s.recv(pak_len) p = 0 f_url = None while p < pak_len: t = hex2int(pak[p:p + 2], int_len=2) # print "tag::", t if not t: break length = hex2int(pak[p + 2:p + 4], int_len=2) # print 'len::', length value = pak[p + 4:p + 4 + length] # print 'value::', value p += 4 + length if t == 10: # 文件路径tag f_url = value else: print 'unknow tag:::::::::', t break print 'f_url::::::::::::', f_url else: print 'upload error::::', if result == RESULT_WRONG_FILE_TYPE: print u'不允许的文件类型' elif result == RESULT_INVALID_ARGS: print u'参数无效' elif result == RESULT_FILE_TOO_LARGE: print u'文件太大' elif result == RESULT_AUTH_FAIL: print u'认证错误' elif result == RESULT_BUSY: print u'系统繁忙' elif result == RESULT_FS_ERROR: print u'文件系统异常' else: print u'未知错误[%s]' % result s.close()