Releases: amphp/http-server
2.1.3
2.1.2
2.1.1
2.1.0
- Added
CallableMiddleware
(#313) - Improved exception logging (#306)
- Added setting to
Options
to pass theRequest
object to the logger context. The option defaults to off. (#310) - Fixed HTTP/2 streams closing if the response was sent before the request body was fully received. (#304)
- Fixed HTTP/2 window size for too large request bodies, so they can be rejected instead of hanging
2.0.1
2.0.0
This release provides compatibility with amphp/socket
v1.0. Please see the amphp/socket
release notes for more information on changes in that library. While most code using this library should not require major changes, some compatibility breaks with v1.x were made.
Summary of compatibility breaks from v1.x to v2.0
- Updated to
league/uri@^6
. Consequentially, PHP 7.2+ is now required. - Renamed
Server
toHttpServer
. An alias ofServer
toHttpServer
was kept for backward compatibility with v1.x, but may be removed in a future version. - Added
Push
object for pushed resources.Response::getPush()
now returns an array ofPush
objects. - Upgrade callbacks (those set with
Response::upgrade()
) now receive an instance ofAmp\Socket\EncryptableSocket
, an interface extendingAmp\Socket\Socket
, as the parameter to the callback function. Upgrade callback are now run as a coroutine if a generater is returned. Coroutine (or promise returned from the callback) failures are logged to the server log. Driver\Client
returns an instance ofAmp\Socket\SocketAddress
fromgetLocalAddress()
andgetRemoteAddress()
. The methodsgetLocalPort()
andgetRemotePort()
have been removed. The IP address and port are available on the instance ofSocketAddress
returned.Driver\Client::getCryptoContext()
has been replaced withgetTlsInfo()
, which now returns an instance ofAmp\Socket\TlsInfo
for encrypted clients ornull
for plaintext clients.- HTTP/2 protocol is now declared as
"2"
instead of"2.0"
in requests and responses (see https://http2.github.io/faq/#is-it-http20-or-http2). - Refactored HTTP/2 flood prevention to be based on a ratio between payload and non-payload bytes received, inspired by NGINX's flood prevention. Some options were removed:
- Removed
Options::getMinimumAverageFrameSize()
andwithMinimumAverageFrameSize()
. - Removed
Options::getFramesPerSecondLimit()
andwithFramesPerSecondLimit()
.
- Removed
- Removed
Options::getConnectionTimeout()
andwithConnectionTimeout()
. HTTP/1.x and HTTP/2 connection timeouts are now separate and can be set using thehttp1Timeout
(default 15 seconds) andhttp2Timeout
(default 60 seconds) options.
Trailers
The Trailers
object has been refactored to contain a list of header declared trailer fields (which may be empty) and a promise for an Amp\Http\Message
object containing the future trailer values. Trailers in requests have been moved from the request body to the Request
object. Request::getTrailers()
returns a Trailers
object having two methods:
Trailers::getFields()
: Returns an array of declared trailer fields (this list may be empty, but still receive trailers).Trailers::await()
: Returns a promise that is resolved with aAmp\Http\Message
instance once all trailers have been received.
Trailers are now supported in responses. A new Response
constructor parameter or Response::setTrailers(Trailers $trailers)
may be used to set a Trailers
object for the response. The promise provided to the Trailers
constructor should be resolved with an array of header values indexed by the header field name, similar to header field array provided to the Response
constructor or Response::setHeaders()
.
Other backward compatibility breaks unlikely to affect application code
Driver\Http1Driver
andDriver\Http2Driver
constructors now require an instance ofPsr\Log\LoggerInterface
as the final parameter.Promise
parameter forTrailers
object removed fromRequestBody
constructor.void
returns added tostart()
,onClose()
, andclose()
methods inDriver\Client
interface.void
return added toTimeReference::onTimeUpdate()
.- HTTP/2 pseudo headers (header fields starting with a colon (:) such as
:method
or:status
) cannot be used inRequest
andResponse
. Accordingly, these header fields are no longer included in requests generated by the server. The values of these headers are used to populate request properties and should be accessed by getters inRequest
. - Removed
TimeReference
andSystemTimeReference
. UseAmp\Http\formatDateHeader()
in theamphp/[email protected]
package to generate the value for an HTTP header value containing a date. - Refactored
TimeoutCache
and renamed some methods. Client timeouts are no longer updated withinClient
, ratherHttpDriver
implementations must update the client timeout. Users should be unaffected by this change unless they implemented their ownClient
orHttpDriver
. HttpDriverFactory::selectDriver()
now requires instances ofErrorHandler
,Psr\Log\LoggerInterface
, andOptions
in addition to theClient
instance.
New Features
- The original casing of HTTP/1.x request headers is now available through
Request::getRawHeaders()
. - Added
Request::getAttributes()
to retrieve an array of all request attributes andRequest::removeAttribute()
to remove an attribute. - Added
Request::removeAttribute()
. - Added
ClientException::getClient()
that returns theClient
that caused the error. - Back-pressure from consumption of request bodies is now used to control window sizes in HTTP/2. Window sizes are only increased in small increments instead of the entire allowable body size. This will improve memory consumption when handling large request bodies.
- Added
tlsSetupTimeout
inOptions
. Default is 5 seconds.
Upgrading from v1.x
We believe only minor changes will be necessary for applications to upgrade from v1.x to v2.0. As trailers and upgrade responses are uncommon for applications, the most likely concern for upgraders is the shift to SocketAddress
in Client::getLocalAddress()
and Client::getRemoteAddress()
, changes to methods in Options
, as well as the changes made in amphp/socket
v1.0.
2.0.0 RC4
Http2Driver
now uses an HTTP/2 parser shared withamphp/http-client
. RemovedHttp2Exception
and child classes, which have been replaced by exception classes inamphp/http
.- Upgraded to
amphp/hpack
@^3
. - Renamed
Request::getPush()
togetPushes()
.
1.1.3
2.0.0 RC3
- Updated to
league/uri@^6
. Consequentially, PHP 7.2+ is now required. - Renamed
Server
toHttpServer
. An alias ofServer
toHttpServer
was kept for backward compatibility with v1.x, but may be removed in a future version. - Added
Push
object for pushed resources.Response::getPush()
now returns an array ofPush
objects. - Restored
Client::isUnix()
method. - Added
ClientException::getClient()
that returns theClient
that caused the error. - Renamed
Trailers::awaitMessage()
toawait()
. - Added
Request::removeAttribute()
. - Back-pressure from consumption of request bodies is now used to control window sizes in HTTP/2. Window sizes are only increased in small increments instead of the entire allowable body size. This will improve memory consumption when handling large request bodies.
- Refactored HTTP/2 flood prevention to be based on a ratio between payload and non-payload bytes received, inspired by NGINX's flood prevention. Some options were removed:
- Removed
Options::getMinimumAverageFrameSize()
andwithMinimumAverageFrameSize()
. - Removed
Options::getFramesPerSecondLimit()
andwithFramesPerSecondLimit()
.
- Removed
- Removed
Options::getConnectionTimeout()
andwithConnectionTimeout()
. HTTP/1.x and HTTP/2 connection timeouts are now separate and can be set using thehttp1Timeout
(default 15 seconds) andhttp2Timeout
(default 60 seconds) options. - Added
tlsSetupTimeout
option. Default is 5 seconds. - Removed
TimeReference
andSystemTimeReference
. UseAmp\Http\formatDateHeader()
in theamphp/[email protected]
package to generate the value for an HTTP header value containing a date. - Refactored
TimeoutCache
and renamed some methods. Client timeouts are no longer updated withinClient
, ratherHttpDriver
implementations must update the client timeout. Users should be unaffected by this change unless they implemented their ownClient
orHttpDriver
. HttpDriverFactory::selectDriver()
now requires instances ofErrorHandler
,Psr\Log\LoggerInterface
, andOptions
in addition to theClient
instance.
2.0.0 RC2
Note: This is a pre-release, there might be breaking changes in the final stable version.
- HTTP/2 protocol is now declared as "2" instead of "2.0" in requests and responses (see https://http2.github.io/faq/#is-it-http20-or-http2).
- Added
Request::getAttributes()
to retrieve an array of all request attributes andRequest::removeAttribute()
to remove an attribute.