History of changes¶
v0.10.0 (2020-08-14)¶
Other changes:
- Drop support for Python 3.4.
- Support Python 3.8.
- Make error messages returned by match failures less ambiguous (#98).
v0.9.0 (2019-05-15)¶
Bug fixes:
- Allow a broader range of characters in header values. This violates the RFC, but is apparently required for compatibility with real-world code, like Google Analytics cookies (#57, #58).
- Validate incoming and outgoing request paths for invalid characters. This prevents a variety of potential security issues that have affected other HTTP clients. (#69).
- Force status codes to be integers, thereby allowing stdlib HTTPStatus IntEnums to be used when constructing responses (#72).
Other changes:
v0.8.1 (2018-04-14)¶
Bug fixes:
- Always return headers as
bytes
objects (#60)
Other changes:
- Added proper license notices to the Javascript used in our documentation (#61)
v0.8.0 (2018-03-20)¶
Backwards incompatible changes:
- h11 now performs stricter validation on outgoing header names and header values: illegal characters are now rejected (example: you can’t put a newline into an HTTP header), and header values with leading/trailing whitespace are also rejected (previously h11 would silently discard the whitespace). All these checks were already performed on incoming headers; this just extends that to outgoing headers.
New features:
- New method
Connection.send_failed()
, to notify aConnection
object when data returned fromConnection.send()
was not sent.
Bug fixes:
- Make sure that when computing the framing headers for HEAD responses, we produce the same results as we would for the corresponding GET.
- Error out if a request has multiple Host: headers.
- Send the Host: header first, as recommended by RFC 7230.
- The Expect: header is case-insensitive, so use case-insensitive matching when looking for 100-continue.
Other changes:
- Better error messages in several cases.
- Provide correct
error_status_hint
in exception raised when encountering an invalidTransfer-Encoding
header. - For better compatibility with broken servers, h11 now tolerates responses where the reason phrase is missing (not just empty).
- Various optimizations and documentation improvements.
v0.7.0 (2016-11-25)¶
New features (backwards compatible):
- Made it so that sentinels are instances of themselves, to enable certain dispatch tricks on
the return value of
Connection.next_event()
(see issue #8 for discussion). - Added
Data.chunk_start
andData.chunk_end
properties to theData
event. These provide the user information about where chunk delimiters are in the data stream from the remote peer when chunked transfer encoding is in use. You probably shouldn’t use these, but sometimes there’s no alternative (see issue #19 for discussion). - Expose
Response.reason
attribute, making it possible to read or set the textual “reason phrase” on responses (issue #13).
Bug fixes:
v0.6.0 (2016-10-24)¶
This is the first release since we started using h11 to write non-trivial server code, and this experience triggered a number of substantial API changes.
Backwards incompatible changes:
- Split the old
receive_data()
into the newreceive_data()
andnext_event()
, and replaced the oldPaused
pseudo-event with the newNEED_DATA
andPAUSED
sentinels. - Simplified the API by replacing the old
Connection.state_of()
,Connection.client_state
,Connection.server_state
with the newConnection.states
. - Renamed the old
prepare_to_reuse()
to the newstart_next_cycle()
. - Removed the
Paused
pseudo-event.
Backwards compatible changes:
- State machine: added a
DONE
->MUST_CLOSE
transition triggered by our peer being in theERROR
state. - Split
ProtocolError
intoLocalProtocolError
andRemoteProtocolError
(see Error handling). Use case: HTTP servers want to be able to distinguish between an error that originates locally (which produce a 500 status code) versus errors caused by remote misbehavior (which produce a 4xx status code). - Changed the
PRODUCT_ID
fromh11/<verson>
topython-h11/<version>
. (This is similar to what requests uses, and much more searchable than plain h11.)
Other changes:
- Added a minimal benchmark suite, and used it to make a few small optimizations (maybe ~20% speedup?).
v0.5.0 (2016-05-14)¶
- Initial release.