Example #1
0
    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
Example #3
0
    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()
Example #4
0
    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()
Example #5
0
 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"))
Example #7
0
    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
Example #8
0
    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
Example #9
0
    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)
Example #10
0
    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)