46 $mediator =
new RequestMediator($request, $requestCurlOptions->get(
'emit_io'));
47 $tempContentLength =
null;
49 $bodyAsString = $requestCurlOptions->get(self::BODY_AS_STRING);
53 if(($pos = strpos($url,
'#')) !== false ){
55 $url = substr($url, 0, $pos);
61 CURLOPT_CONNECTTIMEOUT => 150,
62 CURLOPT_RETURNTRANSFER =>
false,
63 CURLOPT_HEADER =>
false,
64 CURLOPT_PORT => $request->
getPort(),
65 CURLOPT_HTTPHEADER => array(),
66 CURLOPT_WRITEFUNCTION => array($mediator,
'writeResponseBody'),
67 CURLOPT_HEADERFUNCTION => array($mediator,
'receiveResponseHeader'),
69 ? CURL_HTTP_VERSION_1_0 : CURL_HTTP_VERSION_1_1,
71 CURLOPT_SSL_VERIFYPEER => 1,
73 CURLOPT_SSL_VERIFYHOST => 2
76 if (defined(
'CURLOPT_PROTOCOLS')) {
78 $curlOptions[CURLOPT_PROTOCOLS] = CURLPROTO_HTTP | CURLPROTO_HTTPS;
82 if ($acceptEncodingHeader = $request->
getHeader(
'Accept-Encoding')) {
83 $curlOptions[CURLOPT_ENCODING] = (string) $acceptEncodingHeader;
89 if ($requestCurlOptions->get(
'debug')) {
90 $curlOptions[CURLOPT_STDERR] = fopen(
'php://temp',
'r+');
92 if (
false === $curlOptions[CURLOPT_STDERR]) {
93 throw new RuntimeException(
'Unable to create a stream for CURLOPT_STDERR');
96 $curlOptions[CURLOPT_VERBOSE] =
true;
100 if ($method ==
'GET') {
101 $curlOptions[CURLOPT_HTTPGET] =
true;
102 } elseif ($method ==
'HEAD') {
103 $curlOptions[CURLOPT_NOBODY] =
true;
105 unset($curlOptions[CURLOPT_WRITEFUNCTION]);
106 } elseif (!($request instanceof EntityEnclosingRequest)) {
107 $curlOptions[CURLOPT_CUSTOMREQUEST] = $method;
110 $curlOptions[CURLOPT_CUSTOMREQUEST] = $method;
113 if ($request->getBody()) {
116 $curlOptions[CURLOPT_POSTFIELDS] = (string) $request->getBody();
119 if ($tempContentLength = $request->
getHeader(
'Content-Length')) {
120 $tempContentLength = (int) (
string) $tempContentLength;
123 if (!$request->
hasHeader(
'Content-Type')) {
124 $curlOptions[CURLOPT_HTTPHEADER][] =
'Content-Type:';
127 $curlOptions[CURLOPT_UPLOAD] =
true;
129 if ($tempContentLength = $request->
getHeader(
'Content-Length')) {
130 $tempContentLength = (int) (
string) $tempContentLength;
131 $curlOptions[CURLOPT_INFILESIZE] = $tempContentLength;
134 $curlOptions[CURLOPT_READFUNCTION] = array($mediator,
'readRequestBody');
136 $request->getBody()->seek(0);
143 if (
count($request->getPostFiles())) {
144 $postFields = $request->getPostFields()->useUrlEncoding(
false)->urlEncode();
145 foreach ($request->getPostFiles() as $key => $data) {
146 $prefixKeys =
count($data) > 1;
147 foreach ($data as $index => $file) {
149 $fieldKey = $prefixKeys ?
"{$key}[{$index}]" : $key;
150 $postFields[$fieldKey] = $file->getCurlValue();
153 } elseif (
count($request->getPostFields())) {
154 $postFields = (string) $request->getPostFields()->useUrlEncoding(
true);
157 if ($postFields !==
false) {
158 if ($method ==
'POST') {
159 unset($curlOptions[CURLOPT_CUSTOMREQUEST]);
160 $curlOptions[CURLOPT_POST] =
true;
162 $curlOptions[CURLOPT_POSTFIELDS] = $postFields;
169 $curlOptions[CURLOPT_HTTPHEADER][] =
'Expect:';
174 if (
null !== $tempContentLength) {
179 foreach ($requestCurlOptions->toArray() as $key => $value) {
180 if (is_numeric($key)) {
181 $curlOptions[$key] = $value;
186 if (!isset($curlOptions[CURLOPT_ENCODING])) {
187 $curlOptions[CURLOPT_HTTPHEADER][] =
'Accept:';
192 $curlOptions[CURLOPT_HTTPHEADER][] = $line;
196 if (
null !== $tempContentLength) {
197 $request->
setHeader(
'Content-Length', $tempContentLength);
204 if ($requestCurlOptions->get(
'progress')) {
207 $curlOptions[CURLOPT_PROGRESSFUNCTION] =
function () use ($mediator,
$handle) {
208 $args = func_get_args();
212 if (is_resource($args[0])) {
216 call_user_func_array(array($mediator,
'progress'), $args);
218 $curlOptions[CURLOPT_NOPROGRESS] =
false;
221 curl_setopt_array(
$handle, $curlOptions);
223 return new static(
$handle, $curlOptions);
237 throw new InvalidArgumentException(
'Invalid handle provided');
260 public function close()
262 if (is_resource($this->handle)) {
263 curl_close($this->handle);
265 $this->handle =
null;
275 return is_resource($this->handle);
285 return $this->
isAvailable() ? curl_error($this->handle) :
'';
295 if ($this->errorNo) {
299 return $this->
isAvailable() ? curl_errno($this->handle) : CURLE_OK;
311 $this->errorNo = $error;
323 public function getInfo($option =
null)
325 if (!is_resource($this->handle)) {
329 if (
null !== $option) {
330 return curl_getinfo($this->handle, $option) ?:
null;
333 return curl_getinfo($this->handle) ?: array();
343 public function getStderr($asResource =
false)
345 $stderr = $this->
getOptions()->get(CURLOPT_STDERR);
355 $e = stream_get_contents($stderr);
356 fseek($stderr, 0, SEEK_END);
378 return $this->
isAvailable() ? $this->handle :
null;
399 if (!$request->getResponse()) {
404 $request->getResponse()->setInfo($this->
getInfo());
413 while (($line = fgets($log)) !==
false) {
414 if ($line && $line[0] ==
'>') {
415 $headers = substr(trim($line), 2) .
"\r\n";
416 while (($line = fgets($log)) !==
false) {
417 if ($line[0] ==
'*' || $line[0] ==
'<') {
420 $headers .= trim($line) .
"\r\n";
429 if (!empty($parsed[
'headers'])) {
430 $request->setHeaders(array());
431 foreach ($parsed[
'headers'] as $name => $value) {
432 $request->setHeader($name, $value);
435 if (!empty($parsed[
'version'])) {
436 $request->setProtocolVersion($parsed[
'version']);
450 $curlOptions = array();
451 foreach ($config as $key => $value) {
452 if (is_string($key) && defined($key)) {
454 $key = constant($key);
456 if (is_string($value) && defined($value)) {
457 $value = constant($value);
459 $curlOptions[$key] = $value;