/** * Sets a cURL option on a Request. * * @param Request $request Request to set cURL option to. * @param integer $option cURL option to set. * @param mixed $value Value of the cURL option. * @param resource $curlHandle cURL handle where this option is set on (optional). */ public static function setCurlOptionOnRequest(Request $request, $option, $value, $curlHandle = null) { switch ($option) { case CURLOPT_URL: $request->setUrl($value); break; case CURLOPT_FOLLOWLOCATION: $request->getParams()->set('redirect.disable', !$value); break; case CURLOPT_MAXREDIRS: $request->getParams()->set('redirect.max', $value); break; case CURLOPT_CUSTOMREQUEST: $request->setMethod($value); break; case CURLOPT_POST: if ($value == true) { $request->setMethod('POST'); } break; case CURLOPT_POSTFIELDS: // todo: check for file @ if (is_array($value)) { foreach ($value as $name => $fieldValue) { $request->setPostField($name, $fieldValue); } if (count($value) == 0) { $request->removeHeader('Content-Type'); } } else { $request->setBody($value); } break; case CURLOPT_HTTPHEADER: foreach ($value as $header) { $headerParts = explode(': ', $header, 2); if (isset($headerParts[1])) { $request->setHeader($headerParts[0], $headerParts[1]); } } break; case CURLOPT_HEADER: case CURLOPT_WRITEFUNCTION: case CURLOPT_HEADERFUNCTION: // Ignore writer and header functions. // These options are stored and will be handled later in handleOutput(). break; case CURLOPT_READFUNCTION: // Guzzle provides a callback to let curl read the body string. // To get the body, this callback is called manually. $bodySize = $request->getCurlOptions()->get(CURLOPT_INFILESIZE); Assertion::notEmpty($bodySize, "To set a CURLOPT_READFUNCTION, CURLOPT_INFILESIZE must be set."); $body = call_user_func_array($value, array($curlHandle, fopen('php://memory', 'r'), $bodySize)); $request->setBody($body); break; default: $request->getCurlOptions()->set($option, $value); break; } }