<?php
namespace Guzzle\Http\Message;
use Guzzle\Common\Collection;
use Guzzle\Http\EntityBody;
use Guzzle\Http\Url;
use Guzzle\Parser\ParserRegistry;
class RequestFactory implements RequestFactoryInterface {
protected static $instance;
protected $requestClass = 'Guzzle\\Http\\Message\\Request';
protected $entityEnclosingRequestClass = 'Guzzle\\Http\\Message\\EntityEnclosingRequest';
public static function getInstance() {
if (!static::$instance) {
static::$instance = new static();
}
return static::$instance;
}
public function fromMessage($message) {
$parsed = ParserRegistry::getInstance()
->getParser('message')
->parseRequest($message);
if (!$parsed) {
return false;
}
$request = $this
->fromParts($parsed['method'], $parsed['request_url'], $parsed['headers'], $parsed['body'], $parsed['protocol'], $parsed['version']);
if (!isset($parsed['headers']['Expect']) && !isset($parsed['headers']['expect'])) {
$request
->removeHeader('Expect');
}
return $request;
}
public function fromParts($method, array $urlParts, $headers = null, $body = null, $protocol = 'HTTP', $protocolVersion = '1.1') {
return $this
->create($method, Url::buildUrl($urlParts, true), $headers, $body)
->setProtocolVersion($protocolVersion);
}
public function create($method, $url, $headers = null, $body = null) {
$method = strtoupper($method);
if ($method == 'GET' || $method == 'HEAD' || $method == 'TRACE' || $method == 'OPTIONS') {
$c = $this->requestClass;
$request = new $c($method, $url, $headers);
if ($body) {
$request
->setResponseBody(EntityBody::factory($body));
}
return $request;
}
$c = $this->entityEnclosingRequestClass;
$request = new $c($method, $url, $headers);
if ($body) {
$isChunked = (string) $request
->getHeader('Transfer-Encoding') == 'chunked';
if ($method == 'POST' && (is_array($body) || $body instanceof Collection)) {
$files = array();
foreach ($body as $key => $value) {
if (is_string($value) && strpos($value, '@') === 0) {
$files[$key] = $value;
unset($body[$key]);
}
}
if (count($body) > 0) {
$request
->addPostFields($body);
}
if (!empty($files)) {
$request
->addPostFiles($files);
}
if ($isChunked) {
$request
->setHeader('Transfer-Encoding', 'chunked');
}
}
elseif (is_resource($body) || $body instanceof EntityBody) {
$request
->setBody($body, (string) $request
->getHeader('Content-Type'), $isChunked);
}
else {
$request
->setBody((string) $body, (string) $request
->getHeader('Content-Type'), $isChunked);
}
}
return $request;
}
}