39 $this->contextOptions = stream_context_get_options(
$context);
45 throw new InvalidArgumentException(
'$context must be an array or resource');
49 $request->
dispatch(
'request.before_send', array(
50 'request' => $request,
51 'context' => $this->context,
52 'context_options' => $this->contextOptions
63 ->setCustomData(
'request', $request)
75 protected function setContextValue($wrapper, $name, $value, $overwrite =
false)
77 if (!isset($this->contextOptions[$wrapper])) {
78 $this->contextOptions[$wrapper] = array($name => $value);
79 } elseif (!$overwrite && isset($this->contextOptions[$wrapper][$name])) {
82 $this->contextOptions[$wrapper][$name] = $value;
83 stream_context_set_option($this->context, $wrapper, $name, $value);
94 $this->context = $this->
createResource(
function () use ($params, $options) {
95 return stream_context_create($options, $params);
117 $headers = $request->getHeaderLines();
120 if (!$request->hasHeader(
'Connection')) {
121 $headers[] =
'Connection: close';
125 $this->
setContextValue(
'http',
'protocol_version', $request->getProtocolVersion());
136 $this->url = $request->
getUrl(
true);
156 if ($request->getCurlOptions()->get(CURLOPT_SSL_VERIFYPEER)) {
158 if ($cafile = $request->getCurlOptions()->get(CURLOPT_CAINFO)) {
174 if (!($request instanceof EntityEnclosingRequestInterface)) {
178 if (
count($request->getPostFields())) {
179 $this->
setContextValue(
'http',
'content', (
string) $request->getPostFields(),
true);
180 } elseif ($request->getBody()) {
181 $this->
setContextValue(
'http',
'content', (
string) $request->getBody(),
true);
185 if (isset($this->contextOptions[
'http'][
'content'])) {
186 $headers = isset($this->contextOptions[
'http'][
'header']) ? $this->contextOptions[
'http'][
'header'] : array();
187 $headers[] =
'Content-Length: ' . strlen($this->contextOptions[
'http'][
'content']);
199 if ($proxy = $request->getCurlOptions()->get(CURLOPT_PROXY)) {
213 $http_response_header =
null;
221 $className = isset($params[
'stream_class']) ? $params[
'stream_class'] : __NAMESPACE__ .
'\\Stream';
224 $stream =
new $className($fp);
227 if (isset($http_response_header)) {
228 $this->lastResponseHeaders = $http_response_header;
243 foreach ($this->lastResponseHeaders as $header) {
244 if ((stripos($header,
'Content-Length:')) === 0) {
245 $stream->setSize(trim(substr($header, 15)));
261 set_error_handler(
function ($_, $msg, $file, $line) use (&$errors) {
269 $resource = call_user_func($callback);
270 restore_error_handler();
273 $message =
'Error creating resource. ';
274 foreach ($errors as $err) {
275 foreach ($err as $key => $value) {
276 $message .=
"[$key] $value" . PHP_EOL;
279 throw new RuntimeException(trim($message));