在Python中手动捕获套接字编程中的HTTPError / Exceptions

时间:2017-03-05 08:26:46

标签: python sockets exception

我将原始HTTP标头发送到网站,我想手动检测400 Bad Request404 Not Found等错误,而不使用urllibRequests包。我发送了HEAD这样的请求:

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)

我应该如何手动捕获例外?

1 个答案:

答案 0 :(得分:0)

一种方法是使用正则表达式手动搜索HTTP响应。

另一种方法是从http-parser项目的http_parser.c模块中移植您需要的东西。 可以从这里下载:https://pypi.python.org/pypi/http-parser/

您可以使用适用于套接字级别的http-parser来解析HTTP响应。

以下是描述:

http-parser为您提供C语言中的parser.HttpParser低级解析器,您可以在python程序中访问它,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()