class Session: def __init__(self, current_key_hex, partner_key_hex): # self.body = [] self.parser = HttpParser(kind=2, decompress=True) self.data_bytes = 0 self.total_bytes = 0 self.current_key_hex = current_key_hex self.partner_key_hex = partner_key_hex self.is_request = None self.service = None def getPartner(self): return sessions[partner_key_hex] def getService(self): if (self.is_request == False): return self.getPartner().getService() if (self.is_request is None): return '_unknown' if (self.service is None): self.service = getServiceForQS(self.parser.get_query_string()) return self.service def eat(self, payload_string, bytes_sent): received_len = len(payload_string) self.data_bytes += received_len self.total_bytes += bytes_sent parsed_len = self.parser.execute(payload_string, received_len) # assert received_len == parsed_len # if self.parser.is_headers_complete(): # eprint(self.parser.get_headers()) # if self.parser.is_partial_body(): # self.body.append(self.parser.recv_body()) # if self.parser.is_message_complete(): # eprint("".join(self.body)) if self.parser.get_status_code() is not 0: self.is_request = False addBytesOutboundFromService(bytes_sent, self.getService()) # eprint(payload_string) elif self.parser.is_message_begin(): self.is_request = True addBytesInboundToService(bytes_sent, self.getService()) else: addBytesUnknownboundToService(bytes_sent, self.getService()) # if (self.parser.is_headers_complete() and not self.parser.is_message_complete()): # eprint("expected: %s, so far: %d" % (self.parser.get_headers().get('CONTENT-LENGTH'), self.data_bytes)) if self.parser.is_message_complete(): eprint("end!")
class QHttpConnection(QObject): newRequest = pyqtSignal(QHttpRequest, QHttpResponse) disconnected = pyqtSignal() def __init__(self, sock, parent = None): super(QHttpConnection, self).__init__(parent) self.m_sock = sock self.m_body = [] self.m_parser = HttpParser() self.m_request = QHttpRequest(self) self.m_request = None self.m_response = QHttpResponse(self) self.m_response = None self.m_sock.readyRead.connect(self._onReadyRead) self.m_sock.disconnected.connect(self._onDisconnected) self.m_sock.bytesWritten.connect(self._onBytesWritten) return def write(self, data): self.m_sock.write(data) return def _onReadyRead(self): #qDebug('hehe') qtdata = self.m_sock.readAll() pydata = qtdata.data() np = self.m_parser.execute(pydata, len(pydata)) qDebug(str(np) + '=?' + str(len(pydata))) #qDebug(qtdata) #qDebug(qtdata.toHex()) #print(self.m_parser._body) #print(self.m_parser._body) #qDebug(str(self.m_parser.is_message_begin())) #qDebug(str(self.m_parser.is_message_complete())) #qDebug(str(self.m_parser.is_headers_complete())) if self.m_parser.is_headers_complete(): if self.m_request != None: qWarning('alread have a request object') else: self.m_request = QHttpRequest(self) _qogc.add(self.m_request) # qDebug(str(self.m_request)) # print(self.m_parser.get_headers()) True ### body area # qDebug(str(self.m_parser.is_message_begin())) # not use lines,这个可能指的是在客户端时,数据下载完成标识吧。 if self.m_parser.is_message_begin() and self.m_request != None: qDebug('body coming...') self.m_request.hasBody() mth = self.m_parser.get_method() # qDebug(mth) if mth == 'GET': if self.m_parser.is_headers_complete(): self.m_response = QHttpResponse(self) self.m_response.done.connect(self._onResponseDone) _qogc.add(self.m_response) self.newRequest.emit(self.m_request, self.m_response) pass elif mth == 'POST': if self.m_parser.is_partial_body(): self.m_body.append(self.m_parser.recv_body()) if self.m_parser.is_message_complete(): print(b''.join(self.m_body)) elif mth == 'CONNECT': if self.m_parser.is_headers_complete(): if self.m_response != None: qWarning('alread have a response object') else: self.m_response = QHttpResponse(self) self.m_response.done.connect(self._onResponseDone) _qogc.add(self.m_response) self.newRequest.emit(self.m_request, self.m_response) else: qDebug('hdr not complete') True else: qWarning("not impled method:" + mth) self.m_sock.close() return def _onDisconnected(self): # qDebug('hehe') self.disconnected.emit() return def _onBytesWritten(self, count): # qDebug('hehe') return def _onResponseDone(self): self.m_sock.disconnectFromHost() self.m_sock.close() # qDebug(str(self.m_request)) return def close(self): self.m_sock.flush() self.m_sock.close() return def last(self): return
class QHttpConnection(QObject): newRequest = pyqtSignal(QHttpRequest, QHttpResponse) disconnected = pyqtSignal() def __init__(self, sock, parent=None): super(QHttpConnection, self).__init__(parent) self.m_sock = sock self.m_body = [] self.m_parser = HttpParser() self.m_request = QHttpRequest(self) self.m_request = None self.m_response = QHttpResponse(self) self.m_response = None self.m_sock.readyRead.connect(self._onReadyRead) self.m_sock.disconnected.connect(self._onDisconnected) self.m_sock.bytesWritten.connect(self._onBytesWritten) return def write(self, data): self.m_sock.write(data) return def _onReadyRead(self): #qDebug('hehe') qtdata = self.m_sock.readAll() pydata = qtdata.data() np = self.m_parser.execute(pydata, len(pydata)) qDebug(str(np) + '=?' + str(len(pydata))) #qDebug(qtdata) #qDebug(qtdata.toHex()) #print(self.m_parser._body) #print(self.m_parser._body) #qDebug(str(self.m_parser.is_message_begin())) #qDebug(str(self.m_parser.is_message_complete())) #qDebug(str(self.m_parser.is_headers_complete())) if self.m_parser.is_headers_complete(): if self.m_request != None: qWarning('alread have a request object') else: self.m_request = QHttpRequest(self) _qogc.add(self.m_request) # qDebug(str(self.m_request)) # print(self.m_parser.get_headers()) True ### body area # qDebug(str(self.m_parser.is_message_begin())) # not use lines,这个可能指的是在客户端时,数据下载完成标识吧。 if self.m_parser.is_message_begin() and self.m_request != None: qDebug('body coming...') self.m_request.hasBody() mth = self.m_parser.get_method() # qDebug(mth) if mth == 'GET': if self.m_parser.is_headers_complete(): self.m_response = QHttpResponse(self) self.m_response.done.connect(self._onResponseDone) _qogc.add(self.m_response) self.newRequest.emit(self.m_request, self.m_response) pass elif mth == 'POST': if self.m_parser.is_partial_body(): self.m_body.append(self.m_parser.recv_body()) if self.m_parser.is_message_complete(): print(b''.join(self.m_body)) elif mth == 'CONNECT': if self.m_parser.is_headers_complete(): if self.m_response != None: qWarning('alread have a response object') else: self.m_response = QHttpResponse(self) self.m_response.done.connect(self._onResponseDone) _qogc.add(self.m_response) self.newRequest.emit(self.m_request, self.m_response) else: qDebug('hdr not complete') True else: qWarning("not impled method:" + mth) self.m_sock.close() return def _onDisconnected(self): # qDebug('hehe') self.disconnected.emit() return def _onBytesWritten(self, count): # qDebug('hehe') return def _onResponseDone(self): self.m_sock.disconnectFromHost() self.m_sock.close() # qDebug(str(self.m_request)) return def close(self): self.m_sock.flush() self.m_sock.close() return def last(self): return