def response_http(self, status): headers = [( "Content-Length", 0, )] if status[0:3] == "101": headers += [( "Connection", "Upgrade", ), ( "Upgrade", "websocket", )] headers += [("Sec-WebSocket-Accept", wslib.gen_handshake_key(self.__http_ws_key))] headers += [("Sec-WebSocket-Protocol", "chat")] headers += [ ("X-Auth-Id", hashlib.sha256(self.__http_auth_id.encode()).hexdigest()) ] s = httputils.build_http1x_resp_header(status, headers) self.add_evt_write(self.fileno) self.writer.write(s.encode("iso-8859-1"))
def handle_http_response_header(self): size = self.writer.size() rdata = self.writer._getvalue() p = rdata.find(b"\r\n\r\n") if p < 0 and size > 4096: return False if p < 12: return False p += 4 try: resp, kv_pairs = httputils.parse_http1x_response_header( rdata[0:p].decode("iso-8859-1")) except httputils.Http1xHeaderErr: return False # 重写头部连接字段,数据传输完毕后就关闭连接 resp_headers = [] for k, v in kv_pairs: if k.lower() == "connection": resp_headers.append(( "Connection", "close", )) continue resp_headers.append(( k, v, )) data = httputils.build_http1x_resp_header(resp[1], resp_headers) self.writer.write(data.encode("iso-8859-1")) self.writer.write(rdata[p:]) self.__http_response_header_ok = True return True
def response_error(self): resp_sts = httputils.build_http1x_resp_header("400 Bad Request", [("Sec-WebSocket-Version", 13), ], version="1.1") self.writer.write(resp_sts.encode("iso-8859-1")) self.add_evt_write(self.fileno) self.delete_this_no_sent_data()
def __response_http_tunnel_proxy_handshake(self): """响应HTTP隧道代理结果 :return: """ resp_data = httputils.build_http1x_resp_header("200 Connection Established", [ ("Server", "Proxy-Server"), ("Connection", "Keep-Alive") ]) self.__send_data(resp_data.encode("iso-8859-1"))
def send_http_response(self, status): kv_pairs = [("Server", "Socks2Https"), ("Content-Length", 0), ( "Connection", "close", )] s = httputils.build_http1x_resp_header(status, kv_pairs) self.add_evt_write(self.fileno) self.writer.write(s.encode("iso-8859-1"))
def __do_handshake(self, byte_data): try: sts = byte_data.decode("iso-8859-1") except UnicodeDecodeError: self.response_error() return False try: rs = httputils.parse_htt1x_request_header(sts) except: self.response_error() return False req, headers = rs dic = {} for k, v in headers: k = k.lower() dic[k] = v if "sec-websocket-key" not in dic: return False ws_version = dic.get("sec-websocket-version", 0) is_err = False try: ws_version = int(ws_version) if ws_version != 13: is_err = True except ValueError: is_err = True if is_err: self.response_error() return False if not self.on_handshake(req, headers): self.response_error() return False sec_ws_key = dic["sec-websocket-key"] resp_sec_key = websocket.gen_handshake_key(sec_ws_key) resp_headers = [("Upgrade", "websocket"), ("Connection", "Upgrade"), ("Sec-WebSocket-Accept", resp_sec_key)] resp_headers += self.__ext_handshake_resp_headers resp_sts = httputils.build_http1x_resp_header( "101 Switching Protocols", resp_headers, version="1.1") self.writer.write(resp_sts.encode("iso-8859-1")) self.add_evt_write(self.fileno) return True
def __do_handshake(self, byte_data): try: sts = byte_data.decode("iso-8859-1") except UnicodeDecodeError: self.response_error() return False try: rs = httputils.parse_htt1x_request_header(sts) except: self.response_error() return False req, headers = rs dic = {} for k, v in headers: k = k.lower() dic[k] = v if "sec-websocket-key" not in dic: return False ws_version = dic.get("sec-websocket-version", 0) is_err = False try: ws_version = int(ws_version) if ws_version != 13: is_err = True except ValueError: is_err = True if is_err: self.response_error() return False if not self.on_handshake(req, headers): self.response_error() return False sec_ws_key = dic["sec-websocket-key"] resp_sec_key = websocket.gen_handshake_key(sec_ws_key) resp_headers = [("Upgrade", "websocket"), ("Connection", "Upgrade"), ("Sec-WebSocket-Accept", resp_sec_key)] resp_headers += self.__ext_handshake_resp_headers resp_sts = httputils.build_http1x_resp_header("101 Switching Protocols", resp_headers, version="1.1") self.writer.write(resp_sts.encode("iso-8859-1")) self.add_evt_write(self.fileno) return True
def send_header(self, status, kv_pairs): """发送http响应头 :param status: :param kv_pairs: :return: """ self.__is_send_header = True new_kv_pairs = self.__filter_response_header(kv_pairs) new_kv_pairs.append(("Server", self.__SERVER,)) s = httputils.build_http1x_resp_header(status, new_kv_pairs) byte_s = s.encode("iso-8859-1") self.writer.write(byte_s) self.add_evt_write(self.fileno)
def send_response(self, status, headers): s = httputils.build_http1x_resp_header(status, headers) byte_data = s.encode("iso-8859-1") self.writer.write(byte_data) self.add_evt_write(self.fileno)