使用python实现HTTP请求报文是否结束的判断。

2018-03-07  本文已影响0人  scrappyzhang

1. 目的

使用python实现HTTP请求报文是否结束的判断。

2. 项目意义

3. 项目技术要点

4. HTTP协议

5. 技术细节

完整源码链接:
https://github.com/ScrappyZhang/http_request_close_judgement

    def _request_end(self, client_socket):
        # 判断并解析请求数据
        recv_data = ''
        request_header = ''  # 请求头字符串
        request_headers = {}  # 请求头解析后的字典
        content_entity = ''  # 实体
        content_length = 0  # 实体长度
        request_line = ''  # 请求行
        while True:
            # 完整读取请求数据
            recv_data_s = client_socket.recv(256)
            print('接收长度为', len(recv_data_s))
            if recv_data_s == b'':
                request_line = '0'
                return request_line, request_headers, content_entity
            try:
                recv_data_s = recv_data_s.decode()
            except Exception as e:
                recv_data_s = recv_data_s.decode('gbk')

            if "\r\n\r\n" not in recv_data:
                recv_data += recv_data_s
            if "\r\n\r\n" not in recv_data:
                pass

            else:
                if request_header == '':
                    # 第一次接收到, 空行 说明请求头结束
                    space_line_index = recv_data.index("\r\n\r\n")
                    request_header = recv_data[0: space_line_index]
                    content_entity = recv_data[space_line_index + 4:]
                    for index, request in enumerate(request_header.split('\r\n')):
                        if index == 0:
                            request_line = request
                        else:
                            key = request.split(':')[0]
                            value = request.lstrip(key).lstrip(':')
                            key = key.strip(' ').lower()
                            value = value.strip(' ')
                            request_headers[key] = value

                    if "content-length" in request_headers.keys():
                        # 查看content_length是否在请求头,若在,需要获取其值
                        content_length = int(request_headers['content-length'])
                        if content_length == len(content_entity.encode()):
                            print("接收请求数据完毕")
                            return request_line, request_headers, content_entity
                    else:
                        # 不存在则说明只有请求头,没有实体
                        return request_line, request_headers, content_entity
                else:
                    # 实体数据
                    content_entity += recv_data_s
                    if content_length == len(content_entity.encode()):
                        print("接收请求数据完毕")
                        return request_line, request_headers, content_entity
上一篇 下一篇

猜你喜欢

热点阅读