/** * Returns a Request from specified stream context and path. * * If an existing Request is given, the stream context options * are set on the specified Request object. * * @param resource $context Stream context resource. * @param string $path Path to use as url. * @param Request $existing Optional, existing request. * * @return Request */ public static function createRequestFromStreamContext($context, $path, Request $existing = null) { $http = self::getHttpOptionsFromContext($context); $request = $existing; if (empty($request)) { $method = !empty($http['method']) ? $http['method'] : 'GET'; $request = new Request($method, $path, array()); } if (!empty($http['header'])) { $headers = HttpUtil::parseHeaders(HttpUtil::parseRawHeader($http['header'])); foreach ($headers as $key => $value) { $request->setHeader($key, $value); } } if (!empty($http['content'])) { $request->setBody($http['content']); } if (!empty($http['user_agent'])) { $request->setHeader('User-Agent', $http['user_agent']); } if (isset($http['follow_location'])) { $request->setCurlOption(CURLOPT_FOLLOWLOCATION, (bool) $http['follow_location']); } if (isset($http['max_redirects'])) { $request->setCurlOption(CURLOPT_MAXREDIRS, $http['max_redirects']); } if (isset($http['timeout'])) { $request->setCurlOption(CURLOPT_TIMEOUT, $http['timeout']); } // TODO: protocol_version return $request; }
/** * 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_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])) { $headerParts[0] = rtrim($headerParts[0], ':'); $headerParts[1] = null; } $request->setHeader($headerParts[0], $headerParts[1]); } break; case CURLOPT_FILE: case CURLOPT_HEADER: case CURLOPT_WRITEFUNCTION: case CURLOPT_HEADERFUNCTION: case CURLOPT_UPLOAD: // Ignore header, file and writer functions. // These options are stored and will be handled later in handleOutput(). break; default: $request->setCurlOption($option, $value); break; } }