Example #1
1
 /**
  * Apply cookies for request
  * @param Request $req
  */
 public function applyCookie($req)
 {
     // fetch cookies
     $host = $req->getHeader('host');
     $path = $req->getUrlParam('path');
     $cookies = $this->fetchCookieToSend($host, $path);
     if ($this !== $req) {
         $cookies = array_merge($cookies, $req->fetchCookieToSend($host, $path));
     }
     // add to header
     $req->setHeader('cookie', null);
     foreach (array_chunk(array_values($cookies), 3) as $chunk) {
         $req->addHeader('cookie', implode('; ', $chunk));
     }
 }
Example #2
0
 /**
  * Extracts and returns the full URI (including both host and resource URIs) of the current Request, by striping the query string.
  * @param Request $request Request to extract the URI from
  * @return string URI
  */
 private static function getFullURI(Request $request)
 {
     $host = $request->getHeader("HTTP_HOST");
     //if ($request->getHeader("HTTP_X_FORWARDED_HOST") != null) $host = $request->getHeader("HTTP_X_FORWARDED_HOST");
     $URI = "http://" . $host . "/" . self::getPath($request);
     return $URI;
 }
 /**
  * {@inheritdoc}
  */
 public function createResponse(Application $application, Request $request, Socket $socket) : Response
 {
     if ($request->getMethod() !== 'GET') {
         $sink = new MemorySink('Only GET requests allowed for WebSocket connections.');
         return new BasicResponse(Response::METHOD_NOT_ALLOWED, ['Connection' => 'close', 'Upgrade' => 'websocket', 'Content-Length' => $sink->getLength(), 'Content-Type' => 'text/plain'], $sink);
     }
     if (!in_array('upgrade', array_map('trim', explode(',', strtolower($request->getHeader('Connection')))), true) || strtolower($request->getHeader('Upgrade')) !== 'websocket') {
         $sink = new MemorySink('Must upgrade to WebSocket connection for requested resource.');
         return new BasicResponse(Response::UPGRADE_REQUIRED, ['Connection' => 'close', 'Upgrade' => 'websocket', 'Content-Length' => $sink->getLength(), 'Content-Type' => 'text/plain'], $sink);
     }
     if (!$this->protocol->isProtocol($request)) {
         $sink = new MemorySink('Unsupported protocol version.');
         return new BasicResponse(Response::UPGRADE_REQUIRED, ['Connection' => 'close', 'Content-Length' => $sink->getLength(), 'Content-Type' => 'text/plain', 'Upgrade' => 'websocket', 'Sec-WebSocket-Version' => $this->getSupportedVersions()], $sink);
     }
     return $this->protocol->createResponse($application, $request, $socket);
 }
 public function hasBadWordpressTrackback()
 {
     // Fake WordPress trackbacks
     // Real ones do not contain Accept:, and have a charset defined
     // Real WP trackbacks may contain Accept: depending on the HTTP transport being used by the sending host
     return $this->request->hasHeader('content-type') && strpos($this->request->getUserAgent(), 'wordpress') !== false && strpos($this->request->getHeader('content-type'), 'charset=') !== false;
 }
Example #5
0
 /**
  * @param \Request $request
  * @return void
  * @throws AuthenticationException
  */
 public function __construct(\Request $request)
 {
     $header = $request->getHeader('Authentication');
     if (false != $header) {
         list($method, $auth) = sscanf($header, "%s %s");
         $this->auth = $auth;
         $this->type = $method;
     } else {
         throw new AuthenticationException(401, 'No valid access token sent!');
     }
 }
 /**
  * (non-PHPdoc)
  * @see HttpClient::send()
  */
 public function send(Request $request)
 {
     $ch = $this->curlAdapter->init($request->getUri());
     $this->curlAdapter->setOption($ch, $this->curlAdapter->getOptConstant('CUSTOMREQUEST'), $request->getMethod());
     $headers = array();
     foreach ($request->getHeader() as $name => $value) {
         $headers[] = $request->getHeader()->joinField($name, $value);
     }
     $this->curlAdapter->setOption($ch, $this->curlAdapter->getOptConstant('HTTPHEADER'), $headers);
     $this->curlAdapter->setOption($ch, $this->curlAdapter->getOptConstant('POSTFIELDS'), $request->getPayload());
     $this->curlAdapter->setOption($ch, $this->curlAdapter->getOptConstant('RETURNTRANSFER'), 1);
     $this->curlAdapter->setOption($ch, $this->curlAdapter->getOptConstant('HEADERFUNCTION'), array($this, 'headerCallback'));
     $this->response->flush();
     $content = $this->curlAdapter->exec($ch);
     if (false === $content) {
         throw new \RuntimeException($this->curlAdapter->getError($ch), $this->curlAdapter->getErrno($ch));
     }
     $this->response->setContent($content);
     $this->response->setStatusCode($this->curlAdapter->getInfo($ch, $this->curlAdapter->getInfoConstant('HTTP_CODE')));
     $this->curlAdapter->close($ch);
     return clone $this->response;
 }
Example #7
0
 /**
  * {@inheritdoc}
  */
 public function buildOutgoingResponse(Response $response, Request $request = null, float $timeout = 0, bool $allowPersistent = false) : \Generator
 {
     if ('upgrade' === strtolower($response->getHeader('Connection'))) {
         return $response;
     }
     if ($allowPersistent && null !== $request && 'keep-alive' === strtolower($request->getHeader('Connection'))) {
         $response = $response->withHeader('Connection', 'keep-alive')->withHeader('Keep-Alive', sprintf('timeout=%d, max=%d', $this->keepAliveTimeout, $this->keepAliveMax));
     } else {
         $response = $response->withHeader('Connection', 'close');
     }
     $response = $response->withoutHeader('Content-Encoding');
     if ($this->compressionEnabled && null !== $request && $request->hasHeader('Accept-Encoding') && $response->hasHeader('Content-Type') && preg_match('/gzip|deflate/i', $request->getHeader('Accept-Encoding'), $matches)) {
         $encoding = strtolower($matches[0]);
         $contentType = $response->getHeader('Content-Type');
         foreach ($this->compressTypes as $pattern) {
             if (preg_match($pattern, $contentType)) {
                 $response = $response->withHeader('Content-Encoding', $encoding);
                 break;
             }
         }
     }
     return yield from $this->buildOutgoingStream($response, $timeout);
 }
 /**
  * 验证token
  * @return bool true为合法,false为非法
  */
 protected function verifyToken()
 {
     $request = new Request();
     $token = $request->getHeader('singou-token');
     //如果token不为空则检查,为空放行
     if (!empty($token)) {
         $model_token = new Token();
         $dbToken = $model_token->findFirst(array('token' => $token));
         $offset = time() - intval($dbToken->expire());
         if ($offset < 0) {
             return false;
         }
         return true;
     }
 }
 protected function isRequestComplete()
 {
     $contentLength = $this->request->getHeader('Content-Length');
     // if there is no content length, there should
     // be no content so we can say it's done
     if (!$contentLength) {
         return true;
     }
     // if the content is present and has the
     // right length, we're good to go
     if ($contentLength[0] && strlen($this->buffer) >= $contentLength[0]) {
         // store the expected content length
         $this->length = $contentLength[0];
         return true;
     }
     return false;
 }
Example #10
0
 /**
  * Authorizes a request
  *
  * @param Request $request
  * @return Request
  */
 protected static function authorize($request)
 {
     try {
         $token = str_replace('Basic ', '', $request->getHeader('Authorization'));
         $decrypted = base64_decode($token);
         list($username, $password) = explode(':', $decrypted);
         $user = User::find(array('username' => $username));
         if (!$user) {
             throw new Exception();
         } elseif (password_verify($password, $user->get('password'))) {
             $request->user = $user;
         } else {
             throw new Exception();
         }
     } catch (Exception $e) {
         static::response(array(), 401, 'Not Authorized');
     }
     return $request;
 }
Example #11
0
 public function __construct()
 {
     Core::$curent_class = get_called_class();
     // initialisation de la variable locale time limit
     Core::setTimeLimit();
     // initialisation des constantes des chemins de l'application
     Core::setPathConst();
     // initialisation des constantes issus du fichier de parametres
     Core::SetParameters();
     // initialisation du DNS (PDO)
     Core::SetDns();
     // initialisation de l'autoloader de classe
     spl_autoload_register(array(__CLASS__, 'setAutoload'), true, false);
     //tret
     // initialisation des requetes serveur
     Request::init();
     /*Core::$abstract= new AbstractModel();*/
     // initialisation de la session
     Session::start();
     $_SESSION = array();
     /*session_destroy();
       exit;/**/
     // initialisation de l'instance PDO
     Core::$pdo = new PdoControllers(new PdoInstance(DSN, DB_USER, DB_PASS));
     // initialisation du filemanager
     //Core::$file_manager = new FileManager();
     // initialisation de la base de données
     if (DB_RESET) {
         Core::setTimeLimit(0);
         DbInit::init();
         Core::setTimeLimit();
     }
     // initialisation Twig
     $path = Request::getController() != 'asset' ? View : Asset;
     Core::$twig = new Twig_Environment(new Twig_Loader_Filesystem($path), array('cache' => TWIG_CACHE == 1 ? CACHE : false, 'auto_reload' => TWIG_AUTO_RELOAD == 1 ? true : false));
     Core::$twig->addExtension(new Project_Twig_Extension(Core::$curent_class));
     // initialisation du header de la page
     header(Request::getHeader());
 }
 public static function asText()
 {
     self::getInstance();
     if (isset(self::$_instance)) {
         if (Request::getHeader("X-Powered-By") == "XMLHTTPRequestHola") {
             header("Content-type: application/json");
         }
         for ($i = 0; $i < count(self::$_headers); $i++) {
             header(self::$_headers[$i]["key"] . ": " . self::$_headers[$i]["value"]);
         }
         if (Request::getHeader("X-Powered-By") != "XMLHTTPRequestHola") {
             echo self::$_docType;
         } else {
             self::$_content = iconv("windows-1251", "UTF-8", self::$_content);
         }
         //echo self::$_content; die;
         //self::$_content = iconv( "UTF-8", "windows-1251", self::$_content );
         self::$_content = iconv("UTF-8", "windows-1251", self::$_content);
         return (string) self::$_content;
     } else {
         return NULL;
     }
 }
Example #13
0
 /**
  * Will render some text.
  * 
  * Is the _base_ method for render_file.
  * 
  * This method is useful when you want to output some text without using the template engine
  * 
  * In case the action was already performed we will silently exit,
  * otherwise, we set the response status and body and
  * switch the action_performed flag to <i>TRUE</i>
  * 
  * @param string text [optional]the text you want to send, default is an empty string
  * @param Response::SC_* status, [optional] status code, default is 200 OK
  */
 protected function render_text($text = '', $status = NULL)
 {
     if ($this->action_performed) {
         $this->logger->warn('[Medick] >> Action already performed...');
         return;
     }
     $status = $status === NULL ? HTTPResponse::SC_OK : $status;
     // add ETag header
     if ($this->use_etag && $status == HTTPResponse::SC_OK && strlen($text) > 0) {
         $this->set_etag_headers($text);
         if ($this->request->getHeader('If-None-Match') == md5($text)) {
             $this->logger->debug('[Medick] >> Got response from browser cache (code=304, body="").');
             $this->_perform(HTTPResponse::SC_NOT_MODIFIED, '');
         } else {
             $this->_perform($status, $text);
         }
     } else {
         $this->_perform($status, $text);
     }
     $this->action_performed = TRUE;
     $this->logger->debug('[Medick] >> Action performed.');
     if ($this->session->hasValue('flash')) {
         $this->session->removeValue('flash');
     }
 }
Example #14
0
 /**
  * {@inheritdoc}
  */
 public function validateResponse(Request $request, Response $response) : bool
 {
     if (Response::SWITCHING_PROTOCOLS !== $response->getStatusCode()) {
         return false;
     }
     if ('upgrade' !== strtolower($response->getHeader('Connection'))) {
         return false;
     }
     if ('websocket' !== strtolower($response->getHeader('Upgrade'))) {
         return false;
     }
     $key = $request->getHeader('Sec-WebSocket-Key');
     if (!$response->hasHeader('Sec-WebSocket-Accept')) {
         return false;
     }
     return $this->responseKey($key) === $response->getHeader('Sec-WebSocket-Accept');
 }
Example #15
0
 /**
  * @param Request $request
  * @param bool $redirectsEnabled
  * @param int $maxRedirects
  * @return Response
  * @throws RequestException
  */
 public function send(Request $request, $redirectsEnabled = false, $maxRedirects = 20)
 {
     /// Is there curl_init function
     if (!function_exists('curl_init')) {
         throw new RequestException('curl_init doesn\'t exists. Is curl extension instaled and enabled?');
     }
     /// Dont send request without url
     if (!$request->getUrl()) {
         return new Response();
     }
     $url = $request->getUrl();
     if (!empty($this->params)) {
         $url .= '?' . http_build_query($this->params);
     }
     @curl_setopt($this->handle, CURLOPT_URL, $url);
     if ($request->getJSON() !== null) {
         $request->addHeaders(array('Content-Type' => 'application/json'));
     }
     $this->setCookies($request->getCookies());
     $this->setHeaders($request->getHeaders());
     $this->setMethod($request->getMethod());
     /// Set post fields to CURL handle
     if (count($request->getPostFields()) > 0 || $request->getJSON()) {
         $fields = $request->getJSON() ? json_encode($request->getJSON()) : $request->getPostFields();
         $this->setPostFields($fields, $request->getMethod(), $request->getHeader('Content-Type'));
         $request->setJSON(null);
     }
     /// Execute
     $response = curl_exec($this->handle);
     /// Remove content type header to not be used in further requests
     $request->unsetHeader('Content-Type');
     /// Handle CURL error
     if ($response == FALSE) {
         throw new RequestException("CURL error [" . curl_errno($this->handle) . "]: " . curl_error($this->handle), curl_errno($this->handle));
     }
     /// Separate response header and body
     /// Http 100 workaround
     $parts = explode("\r\n\r\nHTTP/", $response);
     $parts = (count($parts) > 1 ? 'HTTP/' : '') . array_pop($parts);
     list($headers, $body) = explode("\r\n\r\n", $parts, 2);
     $response = new Response(curl_getinfo($this->handle, CURLINFO_HTTP_CODE), $headers, $body);
     /// If cookiesEnabled then call addCookies with response cookies
     if ($request->isCookiesEnabled()) {
         $request->addCookies($response->getCookies());
     }
     /// Are redirects enabled? (Also check redirects count)
     if ($redirectsEnabled && ($response->getCode() == 301 || $response->getCode() == 302 || $response->getCode() == 303) && $this->redirectCount < $maxRedirects) {
         $response = $this->doFollow($request, $response, $maxRedirects);
     } else {
         if ($this->redirectCount == $maxRedirects) {
             throw new RequestException("Maximum of " . $maxRedirects . " redirects reached.");
         }
         $this->redirectCount = 0;
     }
     return $response;
 }
Example #16
0
 public function __invoke(Request $request, Response $response, ...$args)
 {
     if ($request->getMethod() !== "GET") {
         $response->setStatus(HTTP_STATUS["METHOD_NOT_ALLOWED"]);
         $response->setHeader("Allow", "GET");
         $response->setHeader("Aerys-Generic-Response", "enable");
         $response->end();
         return;
     }
     if ($request->getProtocolVersion() !== "1.1") {
         $response->setStatus(HTTP_STATUS["HTTP_VERSION_NOT_SUPPORTED"]);
         $response->setHeader("Aerys-Generic-Response", "enable");
         $response->end();
         return;
     }
     $body = $request->getBody();
     if (!$body instanceof NullBody) {
         $response->setStatus(HTTP_STATUS["BAD_REQUEST"]);
         $response->setReason("Bad Request: Entity body disallowed for websocket endpoint");
         $response->setHeader("Connection", "close");
         $response->setHeader("Aerys-Generic-Response", "enable");
         $response->end();
         return;
     }
     $hasUpgradeWebsocket = false;
     foreach ($request->getHeaderArray("Upgrade") as $value) {
         if (strcasecmp($value, "websocket") === 0) {
             $hasUpgradeWebsocket = true;
             break;
         }
     }
     if (empty($hasUpgradeWebsocket)) {
         $response->setStatus(HTTP_STATUS["UPGRADE_REQUIRED"]);
         $response->setHeader("Aerys-Generic-Response", "enable");
         $response->end();
         return;
     }
     $hasConnectionUpgrade = false;
     foreach ($request->getHeaderArray("Connection") as $value) {
         $values = array_map("trim", explode(",", $value));
         foreach ($values as $token) {
             if (strcasecmp($token, "Upgrade") === 0) {
                 $hasConnectionUpgrade = true;
                 break;
             }
         }
     }
     if (empty($hasConnectionUpgrade)) {
         $response->setStatus(HTTP_STATUS["UPGRADE_REQUIRED"]);
         $response->setReason("Bad Request: \"Connection: Upgrade\" header required");
         $response->setHeader("Upgrade", "websocket");
         $response->setHeader("Aerys-Generic-Response", "enable");
         $response->end();
         return;
     }
     if (!($acceptKey = $request->getHeader("Sec-Websocket-Key"))) {
         $response->setStatus(HTTP_STATUS["BAD_REQUEST"]);
         $response->setReason("Bad Request: \"Sec-Websocket-Key\" header required");
         $response->setHeader("Aerys-Generic-Response", "enable");
         $response->end();
         return;
     }
     if (!in_array("13", $request->getHeaderArray("Sec-Websocket-Version"))) {
         $response->setStatus(HTTP_STATUS["BAD_REQUEST"]);
         $response->setReason("Bad Request: Requested Websocket version unavailable");
         $response->setHeader("Sec-WebSocket-Version", "13");
         $response->setHeader("Aerys-Generic-Response", "enable");
         $response->end();
         return;
     }
     $handshaker = new Handshake($response, $acceptKey);
     $onHandshakeResult = $this->application->onHandshake($request, $handshaker, ...$args);
     if ($onHandshakeResult instanceof \Generator) {
         $onHandshakeResult = (yield from $onHandshakeResult);
     }
     $request->setLocalVar("aerys.websocket", $onHandshakeResult);
     $handshaker->end();
 }
Example #17
0
 public function testGetHeaderArray()
 {
     $request = new Request('http://google.com', 'GET');
     $request->setHeader('field', array('value1', 'value2'));
     $this->assertEquals('value1,value2', $request->getHeader('field'), 'Wrong value');
 }