/** * 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; }
/** * @param string $request * @param string $location * @param string $action * @param integer $version * @param int $one_way * * @throws \VCR\VCRException It this method is called although VCR is disabled. * * @return string SOAP response. */ public function doRequest($request, $location, $action, $version, $one_way = 0) { if ($this->status === self::DISABLED) { throw new VCRException('Hook must be enabled.', VCRException::LIBRARY_HOOK_DISABLED); } $vcrRequest = new Request('POST', $location); $contentType = $version == SOAP_1_2 ? 'application/soap+xml' : 'text/xml'; $vcrRequest->addHeader('Content-Type', $contentType . '; charset=utf-8; action="' . $action . '"'); $vcrRequest->setBody($request); $requestCallback = self::$requestCallback; $response = $requestCallback($vcrRequest); return (string) $response->getBody(true); }
/** * @param string $request * @param string $location * @param string $action * @param integer $version * @param int $one_way * * @throws \VCR\VCRException It this method is called although VCR is disabled. * * @return string SOAP response. */ public function doRequest($request, $location, $action, $version, $one_way = 0, $options = array()) { if ($this->status === self::DISABLED) { throw new VCRException('Hook must be enabled.', VCRException::LIBRARY_HOOK_DISABLED); } $vcrRequest = new Request('POST', $location); $contentType = $version == SOAP_1_2 ? 'application/soap+xml' : 'text/xml'; $vcrRequest->setHeader('Content-Type', $contentType . '; charset=utf-8; action="' . $action . '"'); $vcrRequest->setBody($request); if (!empty($options['login'])) { $vcrRequest->setAuthorization($options['login'], $options['password']); } /* @var \VCR\Response $response */ $requestCallback = self::$requestCallback; $response = $requestCallback($vcrRequest); return $response->getBody(); }
/** * 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; } }
/** * Makes sure we've properly handled the POST body, such as ensuring that * CURLOPT_INFILESIZE is set if CURLOPT_READFUNCTION is set. * * @param Request $request Request to set cURL option to. * @param resource $curlHandle cURL handle associated with the request. */ public static function validateCurlPOSTBody(Request $request, $curlHandle = null) { $readFunction = $request->getCurlOption(CURLOPT_READFUNCTION); if (is_null($readFunction)) { return; } // Guzzle 4 sometimes sets the post body in CURLOPT_POSTFIELDS even if // they have already set CURLOPT_READFUNCTION. if ($request->getBody()) { return; } $bodySize = $request->getCurlOption(CURLOPT_INFILESIZE); Assertion::notEmpty($bodySize, "To set a CURLOPT_READFUNCTION, CURLOPT_INFILESIZE must be set."); $body = call_user_func_array($readFunction, array($curlHandle, fopen('php://memory', 'r'), $bodySize)); $request->setBody($body); }