/** * 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; }