본문 바로가기
+ Development/Python

[Python] HTTP - 일반적인 Request Header 파싱 코드(Lv.1)

by 염불법사 2019. 8. 15.
728x90
반응형
Python 을 이용한 HTTP 패킷 파싱하기 1회차 

HTTP 패킷 Header 파일의 파싱하기 위한 코드를 공유합니다.

※  Request Header  

       네이버 검색하는 패킷 Header 입니다.

 


GET /search.naver?where=nexearch&query=%EA%B0%95%EC%A0%95%ED%98%B8&ie=utf8&sm=tab_lve HTTP/1.1
Host: search.naver.com
Connection: keep-alive
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Referer: https://search.naver.com/search.naver?where=nexearch&query=%EC%88%80&ie=utf8&sm=tab_lve
Accept-Encoding: gzip, deflate
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
Cookie: NNB=QRPUSH5OLR6FY; nx_ssl=2; npic=Hze7oH1Jn8xXCl6dfoLhoWgXeHH26E26gGgzVeueHB+RWd4XIxinTwHqchS8E0mQCA==; _naver_usersession_=GmXINRv2anIKSbP1283o0w==; page_uid=U5eFIwpySEKssuYQXGdssssstkd-420901

 

※ Request Header 파싱 코드


import os
from io import BytesIO
import urllib
from http.server import BaseHTTPRequestHandler

class HTTPRequestHeader(BaseHTTPRequestHandler):
    __query_string = None
    __http_header_dir = None

    def __init__(self, http_header_dir):
        self.__http_header_dir = http_header_dir
        self.__read_header()

    def __read_header(self):
        """
            Header 파일 ( request.head 파일 )을 읽어서 각 Meta 정보를 설정
        """
        header_file = os.path.join(self.__http_header_dir, 'request.head')
        try:
            if os.path.exists(header_file):
                with open(header_file, 'rb') as fd:
                    self.rfile = fd
                    self.error_code = self.error_message = None
                    self.raw_requestline = self.rfile.readline()
                    self.parse_request()
                    self.parser_query_string()
                    self.send_header("REQUEST_METHOD", "POST")
            else:
                print("Http Request - Read Header {0}".format(header_file))
                raise FileNotFoundError
        except IOError as e:
            print("Http Request - Read Header {0}".format(e))
            raise FileNotFoundError

    def parser_query_string(self):
        """
        	Path 에서 Query String 부분만 가저와서 Key, Value 형태로 가저옴.
        """
        try:
            q_string = self.path.split("?")[1]
            self.query_string = urllib.parse.parse_qs(q_string)
        except Exception as e:
            pass

    @property
    def host(self):
        """
           Header에 host Meta 정보를 가저옴.
        """
        return self.headers.get('host')

    @property
    def query_string(self):
        return self.__query_string

    @query_string.setter
    def query_string(self, val):
        self.__query_string = val

    @property
    def method(self):
        """
            Method 정보를 라이브러리 안에서 command 변수 정보가 있음.
        """
        return self.command


if __name__ == '__main__':
    """
         HTTPRequestHeader 첫번째 파라미터로 request.head 파일을 경로 지정
    """
    request_header = HTTPRequestHeader("./")
    print(request_header.host)
    print(request_header.path)
    print(request_header.query_string)
    print(request_header.method)

 

◈  파싱된 출력 내용.


 

첨부파일 

→  request.head    :  네이버에 검색한 HTTP Request Header 

→  request.py    :   Request 파일 파싱하는 소스코드 

 

request.head
0.00MB
request.py
0.00MB

728x90
반응형

댓글


loading