HTTP_Request2_Response
Overview
HTTP_Request2_Response encapsulates a HTTP response message and provides
easy access to different parts of it. It also contains static helper methods
HTTP_Request2_Response::decodeGzip() and
HTTP_Request2_Response::decodeDeflate()
for decoding response bodies encoded by Content-Encoding: gzip
(as defined in
RFC 1952) and
Content-Encoding: deflate
(RFC 1950), respectively.
An instance of this class will usually be returned by HTTP_Request2::send() method. You can also build an instance yourself using either helper methods of HTTP_Request2_Adapter_Mock or manually (see below).
You can use the following methods for accessing various parts of HTTP response:
getStatus(),
getReasonPhrase(),
getVersion(),
getHeader(),
getCookies(),
getBody().
Note that the response object will not contain the response body if
'store_body'
configuration parameter was set to FALSE. Also note that
getBody() always returns body completely decoded, if for some reason you want
to access body still encoded by gzip
/ deflate
you'll need
to use Observers and Socket adapter.
Accessing response parts
<?php
$request = new HTTP_Request2('http://www.example.com/');
$response = $request->send();
echo "Response status: " . $response->getStatus() . "\n";
echo "Human-readable reason phrase: " . $response->getReasonPhrase() . "\n";
echo "Response HTTP version: " . $response->getVersion() . "\n";
echo "Response headers:\n";
foreach ($response->getHeader() as $k => $v) {
echo "\t{$k}: {$v}\n";
}
echo "Value of a specific header (Content-Type): " . $response->getHeader('content-type') . "\n";
echo "Cookies set in response:\n";
foreach ($response->getCookies() as $c) {
echo "\tname: {$c['name']}, value: {$c['value']}" .
(empty($c['expires'])? '': ", expires: {$c['expires']}") .
(empty($c['domain'])? '': ", domain: {$c['domain']}") .
(empty($c['path'])? '': ", path: {$c['path']}") .
", secure: " . ($c['secure']? 'yes': 'no') . "\n";
}
echo "Response body:\n" . $response->getBody();
?>
Building the Response Manually
The class is designed to be used in "streaming" scenario, building the response as it is being received:
Building the response (pseudocode)
<?php
$statusLine = read_status_line();
$response = new HTTP_Request2_Response($statusLine);
do {
$headerLine = read_header_line();
$response->parseHeaderLine($headerLine);
} while ($headerLine != '');
while ($chunk = read_body()) {
$response->appendBody($chunk);
}
?>
Everything is straightforward enough, but a few things need considering:
- Constructor will throw an exception if the provided string does not look like a valid response status line.
- It is necessary to pass an empty string to parseHeaderLine() to indicate the end of response headers: this triggers some additional processing (e.g. cookie parsing).