我将原始HTTP标头发送到网站,我想手动检测400 Bad Request
或404 Not Found
等错误,而不使用urllib
或Requests
包。我发送了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)
我应该如何手动捕获例外?
答案 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()