All notable changes to this project will be documented in this file, in reverse chronological order by release.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #379 removes extension of
SplFileInfo
by theUploadedFile
class. The signatures ofgetSize()
are potentially incompatible, andUploadedFile
is intended to work with arbitrary PHP and PSR-7 streams, whereasSplFileInfo
can only model files on the filesystem. While this is technically a BC break, we are treating it as a bugfix, as the class was broken for many use cases.
- Nothing.
- Nothing.
- Nothing.
- #376 adds support for using the X-Forwarded-Host header for determining the originally requested host name when marshaling the server request.
- #378 updates the
UploadedFile
class to extendSplFileInfo
, allowing developers to make use of those features in their applications.
- Nothing.
- Nothing.
- Nothing.
- #377 enables UploadedFile to stand in and be used as an SplFileInfo object.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #372 fixes issues that occur in the
Zend\Diactoros\Uri
class when invalid UTF-8 characters are present the user-info, path, or query string, ensuring they are URL-encoded before being consumed. Previously, such characters could result in a fatal error, which was particularly problematic when marshaling the request URI for an application request cycle.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
-
#370 updates
Zend\Diactoros\marshalHeadersFromSapi()
to ensure all underscores in header name keys are converted to dashes (fixing issues with header names such asCONTENT_SECURITY_POLICY
, which would previously resolve improperly tocontent-security_policy
). -
#370 updates
Zend\Diactoros\marshalHeadersFromSapi()
to ignore header names from the$server
array that resolve to integers; previously, it would raise a fatal error.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #363 modifies detection of HTTPS schemas via the
$_SERVER['HTTPS']
value such that an empty HTTPS-key will result in a scheme ofhttp
and nothttps
.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #355 adds
phpdbg
to the list of accepted non-SAPI enviornments for purposes of callingUploadedFile::moveTo()
.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #349 fixes an issue when marshaling headers with values of
0
or0
from the SAPI, ensuring they are detected and injected into the ServerRequest properly.
- #345 adds support for PHP 7.3.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #349 fixes an issue when marshaling headers with values of
0
or0
from the SAPI, ensuring they are detected and injected into the ServerRequest properly.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #344 provides a fix to ensure that headers with a value of "0" are retained.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #337 ensures that the
ServerRequestFactory::createServerRequest()
method creates aphp://temp
stream instead of aphp::input
stream, in compliance with the PSR-17 specification.
-
#326 adds PSR-17 HTTP Message Factory implementations, including:
Zend\Diactoros\RequestFactory
Zend\Diactoros\ResponseFactory
Zend\Diactoros\ServerRequestFactory
Zend\Diactoros\StreamFactory
Zend\Diactoros\UploadedFileFactory
Zend\Diactoros\UriFactory
These factories may be used to produce the associated instances; we encourage users to rely on the PSR-17 factory interfaces to allow exchanging PSR-7 implementations within their applications.
-
#328 adds a package-level exception interface,
Zend\Diactoros\Exception\ExceptionInterface
, and several implementations for specific exceptions raised within the package. These include:Zend\Diactoros\Exception\DeserializationException
(extendsUnexpectedValueException
)Zend\Diactoros\Exception\InvalidArgumentException
(extendsInvalidArgumentException
)Zend\Diactoros\Exception\InvalidStreamPointerPositionException
(extendsRuntimeException
)Zend\Diactoros\Exception\SerializationException
(extendsUnexpectedValueException
)Zend\Diactoros\Exception\UnreadableStreamException
(extendsRuntimeException
)Zend\Diactoros\Exception\UnrecognizedProtocolVersionException
(extendsUnexpectedValueException
)Zend\Diactoros\Exception\UnrewindableStreamException
(extendsRuntimeException
)Zend\Diactoros\Exception\UnseekableStreamException
(extendsRuntimeException
)Zend\Diactoros\Exception\UntellableStreamException
(extendsRuntimeException
)Zend\Diactoros\Exception\UnwritableStreamException
(extendsRuntimeException
)Zend\Diactoros\Exception\UploadedFileAlreadyMovedException
(extendsRuntimeException
)Zend\Diactoros\Exception\UploadedFileErrorException
(extendsRuntimeException
)
-
#329 adds return type hints and scalar parameter type hints wherever possible. The changes were done to help improve code quality, in part by reducing manual type checking. If you are extending any classes, you may need to update your signatures; check the signatures of the class(es) you are extending for changes.
-
#162 modifies
Serializer\Request
such that it now no longer raises anUnexpectedValueException
via itstoString()
method when an unexpected HTTP method is encountered; this can be done safely, as the value can never be invalid due to other changes in the same patch. -
#162 modifies
RequestTrait
such that it now invalidates non-string method arguments to either the constructor orwithMethod()
, raising anInvalidArgumentException
for any that do not validate.
- Nothing.
-
#308 removes the following methods from the
ServerRequestFactory
class:normalizeServer()
(useZend\Diactoros\normalizeServer()
instead)marshalHeaders()
(useZend\Diactoros\marshalHeadersFromSapi()
instead)marshalUriFromServer()
(useZend\Diactoros\marshalUriFromSapi()
instead)marshalRequestUri()
(useUri::getPath()
from theUri
instance returned bymarshalUriFromSapi()
instead)marshalHostAndPortFromHeaders()
(useUri::getHost()
andUri::getPort()
from theUri
instances returned bymarshalUriFromSapi()
instead)stripQueryString()
(useexplode("?", $path, 2)[0]
instead)normalizeFiles()
(useZend\Diactoros\normalizeUploadedFiles()
instead)
-
#295 removes
Zend\Diactoros\Server
. You can use theRequestHandlerRunner
class from zendframework/zend-httphandlerrunner to provide these capabilities instead. -
#295 removes
Zend\Diactoros\Response\EmitterInterface
and the various emitter implementations. These can now be found in the package zendframework/zend-httphandlerrunner, which also provides a PSR-7-implementation agnostic way of using them.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #364 modifies detection of HTTPS schemas via the
$_SERVER['HTTPS']
value such that an empty HTTPS-key will result in a scheme ofhttp
and nothttps
.
- Nothing.
-
#325 changes the behavior of
ServerRequest::withParsedBody()
. Per -
PSR-7, it now no longer allows values other than
null
, arrays, or objects. -
#325 changes the behavior of each of
Request
,ServerRequest
, andResponse
in relation to the validation of header values. Previously, we allowed empty arrays to be provided viawithHeader()
; however, this was contrary to the PSR-7 specification. Empty arrays are no longer allowed.
- Nothing.
- Nothing.
-
#325 ensures that
Uri::withUserInfo()
no longer ignores values of0
(numeric zero). -
#325 fixes how header values are merged when calling
withAddedHeader()
, ensuring that array keys are ignored.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #324 fixes a reference
to an undefined variable in the
ServerRequestFactory
, which made it impossible to fetch a specific header by name.
- Nothing.
-
This release modifies how
ServerRequestFactory
marshals the request URI. In prior releases, we would attempt to inspect theX-Rewrite-Url
andX-Original-Url
headers, using their values, if present. These headers are issued by the ISAPI_Rewrite module for IIS (developed by HeliconTech). However, we have no way of guaranteeing that the module is what issued the headers, making it an unreliable source for discovering the URI. As such, we have removed this feature in this release of Diactoros.If you are developing a middleware application, you can mimic the functionality via middleware as follows:
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; use Zend\Diactoros\Uri; public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface { $requestUri = null; $httpXRewriteUrl = $request->getHeaderLine('X-Rewrite-Url'); if ($httpXRewriteUrl !== null) { $requestUri = $httpXRewriteUrl; } $httpXOriginalUrl = $request->getHeaderLine('X-Original-Url'); if ($httpXOriginalUrl !== null) { $requestUri = $httpXOriginalUrl; } if ($requestUri !== null) { $request = $request->withUri(new Uri($requestUri)); } return $handler->handle($request); }
If you use middleware such as the above, make sure you also instruct your web server to strip any incoming headers of the same name so that you can guarantee they are issued by the ISAPI_Rewrite module.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
-
#321 updates the logic in
Uri::withPort()
to ensure that it checks that the value provided is either an integer or a string integer, as only those values may be cast to integer without data loss. -
#320 adds checking within
Response
to ensure that the provided reason phrase is a string; anInvalidArgumentException
is now raised if it is not. This change ensures the class adheres strictly to the PSR-7 specification. -
#319 provides a fix to
Zend\Diactoros\Response
that ensures that the status code returned is always an integer (and never a string containing an integer), thus ensuring it strictly adheres to the PSR-7 specification.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
-
#318 fixes the logic for discovering whether an HTTPS scheme is in play to be case insensitive when comparing header and SAPI values, ensuring no false negative lookups occur.
-
#314 modifies error handling around opening a file resource within
Zend\Diactoros\Stream::setStream()
to no longer use the second argument toset_error_handler()
, and instead check the error type in the handler itself; this fixes an issue when the handler is nested inside another error handler, which currently has buggy behavior within the PHP engine.
- Nothing.
- #313 changes the reason phrase associated with the status code 425 to "Too Early", corresponding to a new definition of the code as specified by the IANA.
- Nothing.
- Nothing.
- #312 fixes how the
normalizeUploadedFiles()
utility function handles nested trees of uploaded files, ensuring it detects them properly.
- #307 adds the following functions under the
Zend\Diactoros
namespace, each of which may be used to derive artifacts from SAPI supergloabls for the purposes of generating aServerRequest
instance:normalizeServer(array $server, callable $apacheRequestHeaderCallback = null) : array
(main purpose is to aggregate theAuthorization
header in the SAPI params when under Apache)marshalProtocolVersionFromSapi(array $server) : string
marshalMethodFromSapi(array $server) : string
marshalUriFromSapi(array $server, array $headers) : Uri
marshalHeadersFromSapi(array $server) : array
parseCookieHeader(string $header) : array
createUploadedFile(array $spec) : UploadedFile
(creates the instance from a normal$_FILES
entry)normalizeUploadedFiles(array $files) : UploadedFileInterface[]
(traverses a potentially nested array of uploaded file instances and/or$_FILES
entries, including those aggregated under mod_php, php-fpm, and php-cgi in order to create a flat array ofUploadedFileInterface
instances to use in a request)
- Nothing.
-
#307 deprecates
ServerRequestFactory::normalizeServer()
; the method is no longer used internally, and users should instead useZend\Diactoros\normalizeServer()
, to which it proxies. -
#307 deprecates
ServerRequestFactory::marshalHeaders()
; the method is no longer used internally, and users should instead useZend\Diactoros\marshalHeadersFromSapi()
, to which it proxies. -
#307 deprecates
ServerRequestFactory::marshalUriFromServer()
; the method is no longer used internally. Users should usemarshalUriFromSapi()
instead. -
#307 deprecates
ServerRequestFactory::marshalRequestUri()
. the method is no longer used internally, and currently proxies tomarshalUriFromSapi()
, pulling the discovered path from theUri
instance returned by that function. Users should usemarshalUriFromSapi()
instead. -
#307 deprecates
ServerRequestFactory::marshalHostAndPortFromHeaders()
; the method is no longer used internally, and currently proxies tomarshalUriFromSapi()
, pulling the discovered host and port from theUri
instance returned by that function. Users should usemarshalUriFromSapi()
instead. -
#307 deprecates
ServerRequestFactory::getHeader()
; the method is no longer used internally. Users should copy and paste the functionality into their own applications if needed, or rely on headers from a fully-populatedUri
instance instead. -
#307 deprecates
ServerRequestFactory::stripQueryString()
; the method is no longer used internally, and users can mimic the functionality via the expression$path = explode('?', $path, 2)[0];
. -
#307 deprecates
ServerRequestFactory::normalizeFiles()
; the functionality is no longer used internally, and users can usenormalizeUploadedFiles()
as a replacement. -
#303 deprecates
Zend\Diactoros\Response\EmitterInterface
and its various implementations. These are now provided via the zendframework/zend-httphandlerrunner package as 1:1 substitutions. -
#303 deprecates the
Zend\Diactoros\Server
class. Users are directed to theRequestHandlerRunner
class from the zendframework/zend-httphandlerrunner package as an alternative.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #301 adds stricter comparisons within the
uri
class to ensure non-empty values are not treated as empty.
- Nothing.
- #293 updates
Uri::getHost()
to cast the value viastrtolower()
before returning it. While this represents a change, it is fixing a bug in our implementation: the PSR-7 specification for the method, which follows IETF RFC 3986 section 3.2.2, requires that the host name be normalized to lowercase.
- Nothing.
- Nothing.
- #290 fixes
Stream::getSize()
such that it checks that the result offstat
was succesful before attempting to return itssize
member; in the case of an error, it now returnsnull
.
-
#285 adds a new custom response type,
Zend\Diactoros\Response\XmlResponse
, for generating responses representing XML. Usage is the same as with theHtmlResponse
orTextResponse
; the response generated will have aContent-Type: application/xml
header by default. -
#280 adds the response status code/phrase pairing "103 Early Hints" to the
Response::$phrases
property. This is a new status proposed via RFC 8297. -
#279 adds explicit support for PHP 7.2; previously, we'd allowed build failures, though none occured; we now require PHP 7.2 builds to pass.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #273 updates each of the SAPI emitter implementations to emit the status line after emitting other headers; this is done to ensure that the status line is not overridden by PHP.
- Nothing.
- Nothing.
- #273 modifies how
the
SapiEmitterTrait
callsheader()
to ensure that a response code is always passed as the third argument; this is done to prevent PHP from silently overriding it.
- Nothing.
-
#270 changes the behavior of
Zend\Diactoros\Server
: it no longer creates an output buffer. -
#270 changes the behavior of the two SAPI emitters in two backwards-incompatible ways:
-
They no longer auto-inject a
Content-Length
header. If you need this functionality, zendframework/zend-expressive-helpers 4.1+ provides it viaZend\Expressive\Helper\ContentLengthMiddleware
. -
They no longer flush the output buffer. Instead, if headers have been sent, or the output buffer exists and has a non-zero length, the emitters raise an exception, as mixed PSR-7/output buffer content creates a blocking issue. If you are emitting content via
echo
,print
,var_dump
, etc., or not catching PHP errors or exceptions, you will need to either fix your application to always work with a PSR-7 response, or provide your own emitters that allow mixed output mechanisms.
-
- Nothing.
- Nothing.
- Nothing.
-
#205 adds support for PHP 7.2.
-
#250 adds a new API to
JsonResponse
to avoid the need for decoding the response body in order to make changes to the underlying content. New methods include:getPayload()
: retrieve the unencoded payload.withPayload($data)
: create a new instance with the given data.getEncodingOptions()
: retrieve the flags to use when encoding the payload to JSON.withEncodingOptions(int $encodingOptions)
: create a new instance that uses the provided flags when encoding the payload to JSON.
-
#249 changes the behavior of the various
Uri::with*()
methods slightly: if the value represents no change, these methods will return the same instance instead of a new one. -
#248 changes the behavior of
Uri::getUserInfo()
slightly: it now (correctly) returns the percent-encoded values for the user and/or password, per RFC 3986 Section 3.2.1.withUserInfo()
will percent-encode values, using a mechanism that prevents double-encoding. -
#243 changes the exception messages thrown by
UploadedFile::getStream()
andmoveTo()
when an upload error exists to include details about the upload error. -
#233 adds a new argument to
SapiStreamEmitter::emit
,$maxBufferLevel
between the$response
and$maxBufferLength
arguments. This was done because theServer::listen()
method passes only the response and$maxBufferLevel
to emitters; previously, this often meant that streams were being chunked 2 bytes at a time versus the expected default of 8kb.If you were calling the
SapiStreamEmitter::emit()
method manually previously, you will need to update your code.
- Nothing.
- #248 fixes how the
Uri
class provides user-info within the URI authority; the value is now correctly percent-encoded , per RFC 3986 Section 3.2.1.
- Nothing.
- Nothing.
- #260 removes support for HHVM, as tests have failed against it for some time.
-
#247 fixes the
Stream
andRelativeStream
__toString()
method implementations to check if the streamisSeekable()
before attempting torewind()
it, ensuring that the method does not raise exceptions (PHP does not allow exceptions in that method). In particular, this fixes an issue when using AWS S3 streams. -
#252 provides a fix to the
SapiEmitterTrait
to ensure that anySet-Cookie
headers in the response instance do not override those set by PHP when a session is created and/or regenerated. -
#257 provides a fix for the
PhpInputStream::read()
method to ensure string content that evaluates as empty (including0
) is still cached. -
#258 updates the
Uri::filterPath()
method to allow parens within a URI path, per RFC 3986 section 3.3 (parens are within the character set "sub-delims").
-
#219 adds two new classes,
Zend\Diactoros\Request\ArraySerializer
andZend\Diactoros\Response\ArraySerializer
. Each exposes the static methodstoArray()
andfromArray()
, allowing de/serialization of messages from and to arrays. -
#236 adds two new constants to the
Response
class:MIN_STATUS_CODE_VALUE
andMAX_STATUS_CODE_VALUE
.
-
#240 changes the behavior of
ServerRequestFactory::fromGlobals()
when no$cookies
argument is present. Previously, it would use$_COOKIES
; now, if aCookie
header is present, it will parse and use that to populate the instance instead.This change allows utilizing cookies that contain period characters (
.
) in their names (PHP's built-in cookie handling renames these to replace.
with_
, which can lead to synchronization issues with clients). -
#235 changes the behavior of
Uri::__toString()
to better follow proscribed behavior in PSR-7. In particular, prior to this release, if a scheme was missing but an authority was present, the class was incorrectly returning a value that did not include a//
prefix. As of this release, it now does this correctly.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #241 changes the
constraint by which the package provides
psr/http-message-implementation
to simply1.0
instead of~1.0.0
, to follow how other implementations provide PSR-7.
- Nothing.
- Nothing.
-
#161 adds additional validations to header names and values to ensure no malformed values are provided.
-
#234 fixes a number of reason phrases in the
Response
instance, and adds automation from the canonical IANA sources to ensure any new phrases added are correct.
- Nothing.
- Nothing.
- Nothing.
- #226 fixed an
issue with the
SapiStreamEmitter
causing the response body to be cast to(string)
and also be read as a readable stream, potentially producing double output.
- Nothing.
- Nothing.
- Nothing.
- #223
#224 fixed an issue
with the
SapiStreamEmitter
consuming too much memory when producing output for readable bodies.
- Nothing.
- Nothing.
- Nothing.
- #222 fixes the
SapiStreamEmitter
's handling of theContent-Range
header to properly only emit a range of bytes if the header value is in the formbytes {first-last}/length
. This allows using other range units, such asitems
, without incorrectly emitting truncated content.
- #208 adds several
missing response codes to
Zend\Diactoros\Response
, including:- 226 ('IM used')
- 308 ('Permanent Redirect')
- 444 ('Connection Closed Without Response')
- 499 ('Client Closed Request')
- 510 ('Not Extended')
- 599 ('Network Connect Timeout Error')
- #211 adds support
for UTF-8 characters in query strings handled by
Zend\Diactoros\Uri
.
- Nothing.
- Nothing.
- Nothing.
- #170 prepared documentation for publication at https://zendframework.github.io/zend-diactoros/
- #165 adds support
for Apache
REDIRECT_HTTP_*
header detection in theServerRequestFactory
. - #166 adds support for UTF-8 characters in URI paths.
- #204 adds testing against PHP 7.1 release-candidate builds.
- Nothing.
- Nothing.
- #186 fixes a typo
in a variable name within the
SapiStreamEmitter
. - #200 updates the
SapiStreamEmitter
to implement a check forisSeekable()
prior to attempts to rewind; this allows it to work with non-seekable streams such as theCallbackStream
. - #169 ensures that
response serialization always provides a
\r\n\r\n
sequence following the headers, even when no message body is present, to ensure it conforms with RFC 7230. - #175 updates the
Request
class to set theHost
header from the URI host if no header is already present. (Ensures conformity with PSR-7 specification.) - #197 updates the
Uri
class to ensure that string serialization does not include a colon after the host name if no port is present in the instance.
- Nothing.
- Nothing.
- Nothing.
- #160 fixes HTTP
protocol detection in the
ServerRequestFactory
to work correctly with HTTP/2.
- #119 adds the 451
(Unavailable for Legal Reasons) status code to the
Response
class.
- Nothing.
- Nothing.
- #117 provides validation of the HTTP protocol version.
- #127 now properly
removes attributes with
null
values when callingwithoutAttribute()
. - #132 updates the
ServerRequestFactory
to marshal the request path fragment, if present. - #142 updates the
exceptions thrown by
HeaderSecurity
to include the header name and/or value. - #148 fixes several stream operations to ensure they raise exceptions when the internal pointer is at an invalid position.
- #151 ensures URI fragments are properly encoded.
- Nothing.
- Nothing.
- Nothing.
- #135 fixes the
behavior of
ServerRequestFactory::marshalHeaders()
to no longer omitCookie
headers from the aggregated headers. While the values are parsed and injected into the cookie params, it's useful to have access to the raw headers as well.
- #124 adds four
more optional arguments to the
ServerRequest
constructor:array $cookies
array $queryParams
null|array|object $parsedBody
string $protocolVersion
ServerRequestFactory
was updated to pass values for each of these parameters when creating an instance, instead of using the relatedwith*()
methods on an instance.
- Nothing.
- Nothing.
- #122 updates the
ServerRequestFactory
to retrieve the HTTP protocol version and inject it in the generatedServerRequest
, which previously was not performed.
- Nothing.
- Nothing.
- Nothing.
- #113 fixes an issue in the response serializer, ensuring that the status code in the deserialized response is an integer.
- #115 fixes an
issue in the various text-basd response types (
TextResponse
,HtmlResponse
, andJsonResponse
); due to the fact that the constructor was not rewinding the message body stream,getContents()
was thus returningnull
, as the pointer was at the end of the stream. The constructor now rewinds the stream after populating it in the constructor.
- #110 adds
Zend\Diactoros\Response\SapiEmitterTrait
, which provides the following private method definitions:injectContentLength()
emitStatusLine()
emitHeaders()
flush()
filterHeader()
TheSapiEmitter
implementation has been updated to remove those methods and instead compose the trait.
- #111 adds
a new emitter implementation,
SapiStreamEmitter
; this emitter type will loop through the stream instead of emitting it in one go, and supports content ranges.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- Nothing.
- #101 fixes the
withHeader()
implementation to ensure that if the header existed previously but using a different casing strategy, the previous version will be removed in the cloned instance. - #103 fixes the
constructor of
Response
to ensure that null status codes are not possible. - #99 fixes
validation of header values submitted via request and response constructors as
follows:
- numeric (integer and float) values are now properly allowed (this solves some reported issues with setting Content-Length headers)
- invalid header names (non-string values or empty strings) now raise an exception.
- invalid individual header values (non-string, non-numeric) now raise an exception.
- #88 updates the
SapiEmitter
to emit aContent-Length
header with the content length as reported by the response body stream, assuming thatStreamInterface::getSize()
returns an integer. - #77 adds a new
response type,
Zend\Diactoros\Response\TextResponse
, for returning plain text responses. By default, it sets the content type totext/plain; charset=utf-8
; per the other response types, the signature isnew TextResponse($text, $status = 200, array $headers = [])
. - #90 adds a new
Zend\Diactoros\CallbackStream
, allowing you to back a stream with a PHP callable (such as a generator) to generate the message content. Its constructor accepts the callable:$stream = new CallbackStream($callable);
- Nothing.
- Nothing.
- #77 updates the
HtmlResponse
to set the charset to utf-8 by default (if no content type header is provided at instantiation).
- #98 adds
JSON_UNESCAPED_SLASHES
to the defaultjson_encode
flags used byZend\Diactoros\Response\JsonResponse
.
- Nothing.
- Nothing.
- #96 updates
withPort()
to allownull
port values (indicating usage of default for the given scheme). - #91 fixes the
logic of
withUri()
to do a case-insensitive check for an existingHost
header, replacing it with the new one.
- #73 adds caching of the vendor directory to the Travis-CI configuration, to speed up builds.
- Nothing.
- Nothing.
- #71 fixes the
docblock of the
JsonResponse
constructor to typehint the$data
argument asmixed
. - #73 changes the
behavior in
Request
such that if it marshals a stream during instantiation, the stream is marked as writeable (specifically, modewb+
). - #85 updates the
behavior of
Zend\Diactoros\Uri
's variouswith*()
methods that are documented as accepting strings to raise exceptions on non-string input. Previously, several simply passed non-string input on verbatim, others normalized the input, and a few correctly raised the exceptions. Behavior is now consistent across each. - #87 fixes
UploadedFile
to ensure thatmoveTo()
works correctly in non-SAPI environments when the file provided to the constructor is a path.
- Nothing.
- Nothing.
- Nothing.
- #67 ensures that
the
Stream
class only acceptsstream
resources, not any resource.
- Nothing.
- Nothing.
- Nothing.
- #64 fixes the
behavior of
JsonResponse
with regards to serialization ofnull
and scalar values; the new behavior is to serialize them verbatim, without any casting.
-
#52, #58, #59, and #61 create several custom response types for simplifying response creation:
Zend\Diactoros\Response\HtmlResponse
accepts HTML content via its constructor, and sets theContent-Type
totext/html
.Zend\Diactoros\Response\JsonResponse
accepts data to serialize to JSON via its constructor, and sets theContent-Type
toapplication/json
.Zend\Diactoros\Response\EmptyResponse
allows creating empty, read-only responses, with a default status code of 204.Zend\Diactoros\Response\RedirectResponse
allows specifying a URI for theLocation
header in the constructor, with a default status code of 302.
Each also accepts an optional status code, and optional headers (which can also be used to provide an alternate
Content-Type
in the case of the HTML and JSON responses).
- Nothing.
- #43 removed both
ServerRequestFactory::marshalUri()
andServerRequestFactory::marshalHostAndPort()
, which were deprecated prior to the 1.0 release.
- #29 fixes request method validation to allow any valid token as defined by RFC 7230. This allows usage of custom request methods, vs a static, hard-coded list.
- Nothing.
- Nothing.
- Nothing.
- #60 fixes
the behavior of
UploadedFile
when the$errorStatus
provided at instantiation is notUPLOAD_ERR_OK
. Prior to the fix, anInvalidArgumentException
would occur at instantiation due to the fact that the upload file was missing or invalid. With the fix, no exception is raised until a call tomoveTo()
orgetStream()
is made.
This is a security release.
A patch has been applied to Zend\Diactoros\Uri::filterPath()
that ensures that
paths can only begin with a single leading slash. This prevents the following
potential security issues:
- XSS vectors. If the URI path is used for links or form targets, this prevents
cases where the first segment of the path resembles a domain name, thus
creating scheme-relative links such as
//example.com/foo
. With the patch, the leading double slash is reduced to a single slash, preventing the XSS vector. - Open redirects. If the URI path is used for
Location
orLink
headers, without a scheme and authority, potential for open redirects exist if clients do not prepend the scheme and authority. Again, preventing a double slash corrects the vector.
If you are using Zend\Diactoros\Uri
for creating links, form targets, or
redirect paths, and only using the path segment, we recommend upgrading
immediately.
- #25 adds documentation. Documentation is written in markdown, and can be converted to HTML using bookdown. New features now MUST include documentation for acceptance.
- Nothing.
- Nothing.
- #51 fixes
MessageTrait::getHeaderLine()
to return an empty string instead ofnull
if the header is undefined (which is the behavior specified in PSR-7). - #57 fixes the
behavior of how the
ServerRequestFactory
marshals upload files when they are represented as a nested associative array. - #49 provides several
fixes that ensure that Diactoros complies with the PSR-7 specification:
MessageInterface::getHeaderLine()
MUST return a string (that string CAN be empty). Previously, Diactoros would returnnull
.- If no
Host
header is set, the$preserveHost
flag MUST be ignored when callingwithUri()
(previously, Diactoros would not set theHost
header if$preserveHost
wastrue
, but noHost
header was present). - The request method MUST be a string; it CAN be empty. Previously, Diactoros
would return
null
. - The request MUST return a
UriInterface
instance fromgetUri()
; that instance CAN be empty. Previously, Diactoros would returnnull
; now it lazy-instantiates an emptyUri
instance on initialization.
- ZF2015-05 was
addressed by altering
Uri::filterPath()
to prevent emitting a path prepended with multiple slashes.
- #48 drops the minimum supported PHP version to 5.4, to allow an easier upgrade path for Symfony 2.7 users, and potential Drupal 8 usage.
- Nothing.
- Nothing.
- Nothing.
- #27 adds phonetic pronunciation of "Diactoros" to the README file.
- #36 adds property
annotations to the class-level docblock of
Zend\Diactoros\RequestTrait
to ensure properties inherited from theMessageTrait
are inherited by implementations.
- Nothing.
- Nothing.
- #41 fixes the
namespace for test files to begin with
ZendTest
instead ofZend
. - #46 ensures that
the cookie and query params for the
ServerRequest
implementation are initialized as arrays. - #47 modifies the
internal logic in
HeaderSecurity::isValid()
to use a regular expression instead of character-by-character comparisons, improving performance.
- #10 adds
Zend\Diactoros\RelativeStream
, which will return stream contents relative to a given offset (i.e., a subset of the stream).AbstractSerializer
was updated to create aRelativeStream
when creating the body of a message, which will prevent duplication of the stream in-memory. - #21 adds a
.gitattributes
file that excludes directories and files not needed for production; this will further minify the package for production use cases.
- Nothing.
- Nothing.
- #9 ensures that attributes are initialized to an empty array, ensuring that attempts to retrieve single attributes when none are defined will not produce errors.
- #14 updates
Zend\Diactoros\Request
to use aphp://temp
stream by default instead ofphp://memory
, to ensure requests do not create an out-of-memory condition. - #15 updates
Zend\Diactoros\Stream
to ensure that write operations trigger an exception if the stream is not writeable. Additionally, it adds more robust logic for determining if a stream is writeable.
First stable release, and first release as zend-diactoros
.
- Nothing.
- Nothing.
- Nothing.
- Nothing.