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 파일 파싱하는 소스코드
728x90
반응형
'+ Development > Python' 카테고리의 다른 글
[Python] pycrypto Module(모듈)을 이용한 암/복호화 하기 (0) | 2019.09.11 |
---|---|
[Python] HTTP - 일반적인 Response Header 파싱 코드(Lv.2) (0) | 2019.08.21 |
[Python] regex 값을 dict 로 가져오기 (0) | 2019.08.12 |
[Python] 홀수, 짝수 나누기 (0) | 2019.07.13 |
[Python] 연산자 정리 (0) | 2018.09.23 |
댓글