1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
|
<?php namespace GuzzleHttp\Handler;
use GuzzleHttp\Psr7\Response; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\StreamInterface;
/** * Represents a cURL easy handle and the data it populates. * * @internal */ final class EasyHandle { /** @var resource cURL resource */ public $handle;
/** @var StreamInterface Where data is being written */ public $sink;
/** @var array Received HTTP headers so far */ public $headers = [];
/** @var ResponseInterface Received response (if any) */ public $response;
/** @var RequestInterface Request being sent */ public $request;
/** @var array Request options */ public $options = [];
/** @var int cURL error number (if any) */ public $errno = 0;
/** @var \Exception Exception during on_headers (if any) */ public $onHeadersException;
/** * Attach a response to the easy handle based on the received headers. * * @throws \RuntimeException if no headers have been received. */ public function createResponse() { if (empty($this->headers)) { throw new \RuntimeException('No headers have been received'); }
// HTTP-version SP status-code SP reason-phrase $startLine = explode(' ', array_shift($this->headers), 3); $headers = \GuzzleHttp\headers_from_lines($this->headers); $normalizedKeys = \GuzzleHttp\normalize_header_keys($headers);
if (!empty($this->options['decode_content']) && isset($normalizedKeys['content-encoding']) ) { $headers['x-encoded-content-encoding'] = $headers[$normalizedKeys['content-encoding']]; unset($headers[$normalizedKeys['content-encoding']]); if (isset($normalizedKeys['content-length'])) { $headers['x-encoded-content-length'] = $headers[$normalizedKeys['content-length']];
$bodyLength = (int) $this->sink->getSize(); if ($bodyLength) { $headers[$normalizedKeys['content-length']] = $bodyLength; } else { unset($headers[$normalizedKeys['content-length']]); } } }
// Attach a response to the easy handle with the parsed headers. $this->response = new Response( $startLine[1], $headers, $this->sink, substr($startLine[0], 5), isset($startLine[2]) ? (string) $startLine[2] : null ); }
public function __get($name) { $msg = $name === 'handle' ? 'The EasyHandle has been released' : 'Invalid property: ' . $name; throw new \BadMethodCallException($msg); } }
|