python – 解析原始HTTP标头
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了python – 解析原始HTTP标头,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3142字,纯文字阅读大概需要5分钟。
内容图文
我有一串原始HTTP,我想表示对象中的字段.有没有办法解析HTTP字符串中的各个标头?
'GET /search?sourceid=chrome&ie=UTF-8&q=ergterst HTTP/1.1\r\nHost: www.google.com\r\nConnection: keep-alive\r\nAccept: application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5\r\nUser-Agent: Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_6; en-US) AppleWebKit/534.13 (KHTML, like Gecko) Chrome/9.0.597.45 Safari/534.13\r\nAccept-Encoding: gzip,deflate,sdch\r\nAvail-Dictionary: GeNLY2f-\r\nAccept-Language: en-US,en;q=0.8\r\n
[...]'
解决方法:
标准库中有很好的工具可用于解析RFC 821标头,也可用于解析整个HTTP请求.下面是一个示例请求字符串(请注意,Python将其视为一个大字符串,即使我们将其分为几行以便于阅读),我们可以将其提供给我的示例:
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'
)
正如@TryPyPy指出的那样,你可以使用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解析应该以不需要我们编写九行代码来正确调用它的方式进行分解,但是你能做什么呢?以下是如何使用这个简单的类:
# 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')"
我更喜欢使用这样的标准库,因为我怀疑他们已经遇到并解决了任何可能会让我感到困惑的边缘情况,如果我尝试使用正则表达式重新实现Internet规范.
内容总结
以上是互联网集市为您收集整理的python – 解析原始HTTP标头全部内容,希望文章能够帮你解决python – 解析原始HTTP标头所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。