標準ライブラリには、RFC 821ヘッダーの解析と、HTTP要求全体の解析用に優れたツールがあります。 @TryPyPyが指摘するように、
request_text = (
'GET /who/ken/trust.html HTTP/1.1\r\n'
'Host: cm.bell-labs.com\r\n'
'Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.3\r\n'
'Accept: text/html;q=0.9,text/plain\r\n'
'\r\n'
)
:ここでは、私の例に送り込むことができ、例えば要求文字列(Pythonは、我々は、読みやすくするために、いくつかのラインを渡ってそれを壊しているにもかかわらず、一つの大きな文字列として扱うことに注意してください)ですあなたは、ヘッダーを解析するmimetools.Message
を使用することができます - 私たちは、あなたがそれを作成完了したら結果Message
オブジェクトは、ヘッダーの辞書のように作用することを追加する必要がありますけれども:
# Ignore the request line and parse only the headers
from mimetools import Message
from StringIO import StringIO
request_line, headers_alone = request_text.split('\r\n', 1)
headers = Message(StringIO(headers_alone))
print len(headers) # -> "3"
print headers.keys() # -> ['accept-charset', 'host', 'accept']
print headers['Host'] # -> "cm.bell-labs.com"
しかし、これを、当然のことながら、要求ラインを無視しますか、あなた自身でそれを解析します。はるかに良い解決策があることが判明しました。
標準ライブラリは、BaseHTTPRequestHandler
を使用すると、HTTPを解析します。標準ライブラリのHTTPツールとURLツールのすべての問題は、文字列を解析するために必要な作業は、(a)文字列をStringIO()
にラップし、(b) raw_requestline
を解析する準備が整うようにしてください。(c)パース中に発生したエラーコードをキャプチャするのではなく、クライアントに書き戻すのではなくキャプチャします。だからここ
は、標準ライブラリのクラスの私達の専門である:
再び
from BaseHTTPServer import BaseHTTPRequestHandler
from StringIO import StringIO
class HTTPRequest(BaseHTTPRequestHandler):
def __init__(self, request_text):
self.rfile = StringIO(request_text)
self.raw_requestline = self.rfile.readline()
self.error_code = self.error_message = None
self.parse_request()
def send_error(self, code, message):
self.error_code = code
self.error_message = message
、私は標準ライブラリの人々は、HTTP解析が9を書くために私たちを必要としないようにして破られるべきであることを認識していた希望します適切に呼び出すためのコード行はありますが、何ができますか?ここでは、この単純なクラスを使用する方法である:
# Using this new class is really easy!
request = HTTPRequest(request_text)
print request.error_code # None (check this first)
print request.command # "GET"
print request.path # "/who/ken/trust.html"
print request.request_version # "HTTP/1.1"
print len(request.headers) # 3
print request.headers.keys() # ['accept-charset', 'host', 'accept']
print request.headers['host'] # "cm.bell-labs.com"
エラーが解析中に存在する場合、error_code
はNone
ではありません。
# Parsing can result in an error code and message
request = HTTPRequest('GET\r\nHeader: Value\r\n\r\n')
print request.error_code # 400
print request.error_message # "Bad request syntax ('GET')"
私が疑うので、私はこのような標準ライブラリを使用して好みます彼らはすでに遭遇し、正規表現で自分自身でインターネット仕様を再実装しようとすると、私を噛んでしまう可能性のあるあらゆる場合を解決しました。
ありますか? – Broseph
mimetoolsは2以降廃止予定です。3 –
@Broseph Gowthamの答えを参照してください。 – JeromeJ