예제 #1
0
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
예제 #2
0
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
예제 #3
0
 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 ''
예제 #4
0
 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 ''
예제 #5
0
파일: base.py 프로젝트: kingxsp/FileUpload
    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
예제 #6
0
파일: base.py 프로젝트: nic562/FileUpload
    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
예제 #7
0
파일: client.py 프로젝트: nic562/FileUpload
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()
예제 #8
0
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()