http request/response parser
Project description
http-parser
HTTP request/response parser for Python compatible with Python 2.x (>=2.6), Python 3 and Pypy. If possible a C parser based on http-parser from Ryan Dahl will be used.
http-parser is under the MIT license.
Project url: https://github.com/benoitc/http-parser/
Requirements:
Python 2.6 or sup. Pypy latest version.
Cython if you need to rebuild the C code (Not needed for Pypy)
Installation
$ pip install http-parser
Or install from source:
$ git clone git://github.com/benoitc/http-parser.git $ cd http-parser && python setup.py install
Note: if you get an error on MacOSX try to install with the following arguments:
$ env ARCHFLAGS=”-arch i386 -arch x86_64” python setup.py install
Usage
http-parser provide you parser.HttpParser low-level parser in C that you can access in your python program and http.HttpStream providing higher-level access to a readable,sequential io.RawIOBase object.
To help you in your day work, http-parser provides you 3 kind of readers in the reader module: IterReader to read iterables, StringReader to reads strings and StringIO objects, SocketReader to read sockets or objects with the same api (recv_into needed). You can of course use any io.RawIOBase object.
Example of HttpStream
ex:
#!/usr/bin/env python import socket from http_parser.http import HttpStream from http_parser.reader import SocketReader def main(): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) try: s.connect(('gunicorn.org', 80)) s.send("GET / HTTP/1.1\r\nHost: gunicorn.org\r\n\r\n") r = SocketReader(s) p = HttpStream(r) print p.headers() print p.body_file().read() finally: s.close() if __name__ == "__main__": main()
Example of HttpParser:
#!/usr/bin/env python import socket # try to import C parser then fallback in pure python parser. try: from http_parser.parser import HttpParser except ImportError: from http_parser.pyparser import HttpParser 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() if __name__ == "__main__": main()
You can find more docs in the code (or use a doc generator).
Copyright
2011,2012 (c) Benoît Chesneau <benoitc@e-engura.org>
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
File details
Details for the file http-parser-0.8.1.tar.gz
.
File metadata
- Download URL: http-parser-0.8.1.tar.gz
- Upload date:
- Size: 150.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
File hashes
Algorithm | Hash digest | |
---|---|---|
SHA256 | b0584869b735f7a39a3d3a1699d1307f43143a032a8f21b48d2c2e815da0afde |
|
MD5 | 6cc089365e3ae758e5f5cda0f2f8f788 |
|
BLAKE2b-256 | 026a2460c0df8ebef22d9b7bd7eac44072dae4a42acbf0bccf7102d22d3ee0cc |