2017-03-05 3 views
0

生のHTTPヘッダーをWebサイトに送信しています。400 Bad Requestまたは404 Not Foundなどのエラーを手動でurllibまたはRequestsパッケージを使用せずに手動で検出したいとします。PythonのソケットプログラミングでHTTPError /例外を手動でキャッチ

head_request = "HEAD " + url_path + " HTTP/1.1\nHost: %s\r\n\r\n" % (host) 
socket_id = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
socket_id.connect((host, 80)) 
socket_id.send(head_request) 
recv_head = socket_id.recv(1024) 

どのように私は手動で例外をキャッチする必要があります。私はこのようなHEADリクエストを送信していますか?

答えて

0

1つの方法は、正規表現を使用してHTTP応答を手動で検索することです。

別の方法は、http-parserプロジェクトのhttp_parser.cモジュールから必要なものを移植することです。 ここからダウンロードできます:https://pypi.python.org/pypi/http-parser/

HTTPレスポンスは、ソケットレベルで動作するhttp-parserを使用して解析できます。ここで

は説明です:

のhttp-パーサをあなたのPythonプログラムにアクセスすることができますCでparser.HttpParser低レベルのパーサを提供し、http.HttpStream読める、シーケンシャルIOに高いレベルのアクセスを提供します.RawIOBaseオブジェクト。ここで

はあなたが与えた例にかかる方法で、Pythonでのソケットを使用してHTTP応答を解析する方法である:これは私の質問に答えていない

https://github.com/benoitc/http-parser/tree/master/http_parser

def main(): 

    p = HttpParser() 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    body = [] 
    try: 
     s.connect(('gunicorn.org', 80)) 
     s.send("GET/HTTP/1.1\r\nHost: gunicorn.org\r\n\r\n") 

     while True: 
      data = s.recv(1024) 
      if not data: 
       break 

      recved = len(data) 
      nparsed = p.execute(data, recved) 
      assert nparsed == recved 

      if p.is_headers_complete(): 
       print p.get_headers() 

      if p.is_partial_body(): 
       body.append(p.recv_body()) 

      if p.is_message_complete(): 
       break 

      print "".join(body) 

    finally: 
     s.close() 
+0

、私が探しています私の質問で明示的に言及したように、外部ライブラリを使用しない400、404などの特定のエラーを手動で処理する方法。 – Jarvis

+0

私は、HTTPエラーを検出する手作業の手段を見つけるための質問に直接対処するために私の答えを修正しました。私はそれがあなたを助けたと思った。 –