public function fromHTTPRequest(Request $request) { $body = $request->getBody(); $meta = array(); // override method $rqMethodHeader = 'X-Psc-Cms-Request-Method'; if (in_array($method = $request->getHeaderField($rqMethodHeader), array(Service::PUT, Service::DELETE))) { $this->log('Request-Method durch HTTP-Header ' . $rqMethodHeader . ' überschrieben zu: ' . $method); unset($body->{$rqMethodHeader}); } else { $method = constant('Psc\\Net\\Service::' . $request->getMethod()); // Request::GET => ServiceRequest::GET } // revision $revisionHeader = 'X-Psc-Cms-Revision'; if (($revision = $request->getHeaderField($revisionHeader)) != '') { $meta['revision'] = $revision; unset($body->{$revisionHeader}); } // convert bodyAsJSON to native if (is_object($body) && count($body) === 1 && isset($body->bodyAsJSON)) { $body = $this->jsonConverter->parse($body->bodyAsJSON); } // convert json request to native if (is_string($body) && $request->isContentType('application/json')) { $body = $this->jsonConverter->parse($body); } return new ServiceRequest($method, $request->getParts(), $body, $request->getQuery(), $request->getFiles(), $meta); }
public function testPreconditionRequestCanBeSerializedBidirectional() { $request = Request::create('GET', '/request-acceptance/nice/api/url/', array('some' => 'header')); $unserialized = unserialize(serialize($request)); $this->assertInstanceof('Psc\\Net\\HTTP\\Request', $unserialized); $this->assertEquals($request, $unserialized); }
public function testAccepting() { $jsonRequest = Request::create(Request::GET, '/', NULL, array('Accept' => 'application/json, text/javascript, */*; q=0.01')); $this->assertTrue($jsonRequest->accepts('application/json'), 'accept field is: ' . $jsonRequest->getHeaderField('accept')); $this->assertFalse($jsonRequest->accepts('text/html')); $htmlRequest = Request::create(Request::GET, '/', NULL, array('Accept' => 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8')); $this->assertTrue($htmlRequest->accepts('text/html')); $this->assertFalse($htmlRequest->accepts('application/json')); }
/** * @return Psc\Net\HTTP\Request */ public function createHTTPRequest($methodString, $resource, $GET = array(), $POST = array(), $COOKIE = array(), $accept = NULL) { \Psc\Code\Code::value($methodString, 'GET', 'POST'); $project = \Psc\PSC::getProject(); $baseUrl = $project->getHostUrl('base'); $SERVER = array('HTTP_HOST' => $baseUrl->getHost(), 'HTTP_USER_AGENT' => 'Mozilla/5.0 (Windows NT 6.0; rv:7.0.1) Gecko/20100101 Firefox/7.0.1', 'HTTP_ACCEPT' => $accept ?: 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8', 'HTTP_ACCEPT_LANGUAGE' => 'en-us,en;q=0.5', 'HTTP_ACCEPT_ENCODING' => 'gzip, deflate', 'HTTP_ACCEPT_CHARSET' => 'ISO-8859-1,utf-8;q=0.7,*;q=0.7', 'HTTP_CONNECTION' => 'keep-alive', 'SERVER_NAME' => $baseUrl->getHost(), 'DOCUMENT_ROOT' => (string) $project->dir('www'), 'REDIRECT_QUERY_STRING' => 'request=' . $resource, 'REDIRECT_URL' => $resource, 'GATEWAY_INTERFACE' => 'CGI/1.1', 'SERVER_PROTOCOL' => 'HTTP/1.1', 'REQUEST_METHOD' => $methodString, 'QUERY_STRING' => 'request=' . $resource, 'REQUEST_URI' => $resource, 'SCRIPT_NAME' => '/api.php', 'PHP_SELF' => '/api.php', 'REQUEST_TIME' => time()); //$request = create($uri, $method = 'GET', $parameters = array(), $cookies = array(), $files = array(), $server = array(), $content = null) $request = SfRequest::create((string) $baseUrl . '/' . ltrim($resource, '/'), $methodString, $methodString === 'POST' ? $POST : $GET, $COOKIE, array(), $SERVER); $request = Request::infer($request); return $request; }
/** * Erstellt einen Request aus den Umgebungsvariablen * * wird eine Umgebungsvariable mit NULL übergeben (oder ausgelassen), wird die global Umgebungsvariable genommen * infer() ist also äquivalent mit: * infer($_GET, $_POST, $_COOKIE, $_SERVER) * * ist $_GET['mod_rewrite_request'] gesetzt wird dies als resource genommen * * @TODO Symfony hierfür nehmen (am besten ganz ersetzen) * * @deprecated das übergeben von Variablen ist strongly discouraged! */ public static function infer(SfRequest $sfRequest = NULL) { if (!isset($sfRequest)) { $sfRequest = SfRequest::createFromGlobals(); } // alternativ könnten wir den code aus sf kopieren oder sf mal patchen.. $method = NULL; switch ($sfRequest->getMethod()) { // wertet schon X-HTTP-METHOD-OVERRIDE aus case 'POST': $method = Request::POST; break; case 'PUT': $method = Request::PUT; break; case 'DELETE': $method = Request::DELETE; break; case 'PATCH': $method = Request::PATCH; break; case 'GET': default: $method = Request::GET; break; } $request = new Request($method, rawurldecode($sfRequest->getPathInfo())); $request->setQuery($sfRequest->query->all()); $request->setReferer($sfRequest->server->get('HTTP_REFERER')); $request->setUserAgent($sfRequest->server->get('HTTP_USER_AGENT')); $request->setPreferredLanguages($sfRequest->getLanguages()); $header = $request->getHeader(); foreach ($sfRequest->headers->all() as $key => $value) { // wir verschönern hier z.B. X_REQUESTED_WITH zu X-Requested-With $key = mb_strtolower($key); $key = \Psc\Preg::replace_callback($key, '/(^|-)([a-z]{1})/', function ($m) { return ($m[1] === '' ? NULL : '-') . mb_strtoupper($m[2]); }); // das ist voll doof, aber aus legacy gründen müssen wir das machen // schöner wäre auch die sf Requests / Header zu benutzen, dann wären wir durch if (count($value) === 1) { // unwrap arrays mit nur einem eintrag $value = current($value); } $header->setField($key, $value); } /* Body */ if (mb_strpos($request->getHeaderField('Content-Type'), 'application/x-www-form-urlencoded') === 0) { $request->setBody($sfRequest->request->all()); } elseif (mb_strpos($request->getHeaderField('Content-Type'), 'multipart/form-data') === 0) { $request->setBody($sfRequest->request->all()); $files = array(); foreach ($sfRequest->files->all() as $key => $sfFile) { if ($sfFile instanceof \Symfony\Component\HttpFoundation\File\UploadedFile) { if (!$sfFile->isValid()) { throw new \Psc\Exception('Cannot Upload File: ' . $sfFile->getClientOriginalName() . ' Error Code: ' . $sfFile->getErorr() . ' size: ' . $sfFile->getClientSize()); } else { $files[$key] = $f = new \Psc\System\UploadedFile($sfFile->getPathName()); $f->setOriginalName($sfFile->getClientOriginalName()); } $request->setFiles($files); } // FIXME else: kann auch ein array von files sein oder ein array von array ... // aber wie machen wir das in den files array rein? } } else { $request->setBody($sfRequest->getContent()); // really raw } return $request; }
/** * returns a importable string representation of the request * @return string */ protected function dumpRequest(Request $request) { $body = $request->getBody(); $dump = "Body of request is:\n"; if (is_object($body) || is_array($body)) { $dump .= json_encode($body); } elseif (is_string($body)) { $dump .= sprintf('"%s"', $body); } return $dump; }
public function initRequest(Request $request = NULL) { $this->request = $request ?: Request::infer(); // infer() von $_GET usw ... $con = $this->request->getHeaderField('X-Psc-Cms-Connection'); if (!empty($con)) { $this->setConnectionName($con); } if ($this->request->hasHeaderField('X-Psc-Cms-Debug-Level')) { $this->setDebugLevel((int) $this->request->getHeaderField('X-Psc-Cms-Debug-Level')); } // so rum überschreiben wir den X-Psc-Cms-Connection Header (was ja safe ist) if ($this->isTesting()) { $this->setConnectionName('tests'); } }
/** * @return list($format, $mimeContentType) */ public function decideFormat(ServiceResponse $response, Request $request) { if ($response->getFormat() !== NULL) { $format = $response->getFormat(); } elseif ($request->accepts('application/json')) { $format = ServiceResponse::JSON; } else { $format = ServiceResponse::HTML; } return array($format, $this->getContentType($format)); }
public function init(Request $request = NULL) { $this->request = $request ?: Request::infer(); return $this; }
<?php try { /** * Ein Script was den Request aus den Globals Inferred und serialisiert ausgibt */ $request = \Psc\Net\HTTP\Request::infer(); print serialize($request); } catch (\Exception $e) { $message = $e->getMessage() . ' ' . $e->getFile() . ':' . $e->getLine(); $message = str_replace(array("\n", "\"r"), ' ', $message); $response = \Psc\Net\HTTP\Response::create(500, (string) $e, array('X-Psc-CMS-Error' => 'true', 'X-Psc-CMS-Error-Message' => $message)); $response->output(); }