2014-09-11 2 views
1

HTTP 헤더를 구문 분석하기 위해 Python3에 짧은 함수를 작성했습니다. 누구든지 코드를 살펴보고 다르게 할 수있는 코드가 있다면 코드를 더 잘 만들 수 있는지 궁금합니다. 현재 내가 필요한 결과를 산출하고 있지만이 코드가 원하는 결과를 내지 못하는 상황이 있는지 확실하지 않습니다.파이썬 3 HTTP 헤더가 코드를 파싱 할 수 있습니까?

코멘트에 앙드레에서 언급 한 바와 같이
def _parse_headers(self, headers): 
    lines = headers.split("\r\n") 
    info = lines[0].split(" ") 

    method = None 
    path = None 
    protocol = None 
    headers = {} 

    if len(info) > 0: 
    method = info[0] 
    if len(info) > 1: 
    path = info[1] 
    if len(info) > 2: 
    protocol = info[2] 

    for line in lines[1:]: 
    if line: 
     parts = line.split(":") 
     key = None 
     value = None 
     if len(parts) > 0: 
     key = parts[0] 
     if len(parts) > 1: 
     value = parts[1] 
     if not key is None and not value is None: 
     headers[key.strip().upper()] = value.strip() 

    return { 
    "method": method, 
    "path": path, 
    "protocol": protocol, 
    "headers": headers 
    } 
+0

[이 답변] (http://stackoverflow.com/a/5955949/2629998) 표준 라이브러리의 메서드를 사용하여 헤더를 구문 분석하는 좋은 방법을 제공합니다. 자체 코드를 롤링하는 대신 사용하십시오. –

+0

여기에 몇 가지 문제점이 있습니다. 이것은 여러 줄에 걸쳐있는 헤더를 제대로 처리하지 못하고':'문자가 포함 된 헤더를 제대로 처리하지 못합니다. '\ r \ n' 줄 바꿈만을 인식하는 문제도 있지만,'\ n' 줄 바꿈이 엄격히 일치하지는 않습니다. 명시 적으로 수락하거나 거절해야합니다. –

+0

기존 파싱 라이브러리 사용을 권장하는 다른 포스터에 동의합니다. 그러나 만약 당신이 "자신의 것을 굴리기"를 원한다면,이 해킹으로''if'' 구조를 제거 할 수 있습니다 :'method, path, protocol = (info + 3 * [None]) [: 3]'. 하지만 ** ** 해킹입니다. :) –

답변

1

는, HTTP를 구문 분석하지 않는 한 연습으로, 가볍게 할되지 않습니다 :

이 내가 가진 것입니다. 실제 프로그램에서는 가능하다면 기존의 성숙한 구현을 고수해야합니다.

전체 메시지 구조를 넘어서 모든 헤더에는 고유 한 내부 구조가 있으며, 자주 해석해야합니다. Werkzeughelp there입니다.

코드에 명백한 특정 문제는 다음과 같습니다

  • 헤더 Host: www.example.com:80는, 그것의 값으로 www.example.com을 반환합니다 주어진;
  • 같은 이름의 여러 헤더가있는 경우 마지막 헤더의 값만 반환됩니다.
+0

첫 번째 글 머리 기호를 수정했지만 두 번째 글은 어떻게 해결할 수 있습니까? – TechnoCF

+0

@TechnoCF [전자 메일 헤더 용] (https://docs.python.org/3/library/email.message.html#email.message.Message)와 유사한 데이터 구조를 사용하십시오.이 메시지 형식의 원본이기 때문입니다 . [표준 'http.server'를보십시오.] (https://docs.python.org/3/library/http.server.html#http.server.BaseHTTPRequestHandler.MessageClass) –

관련 문제