Example #1
0
 /**
  * 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;
 }