/**
  * Creates a new request object. Uses the system environment and global
  * variables to put necessary parameters into place.
  *
  * @param   string method
  * @param   peer.URL url
  */
 protected function newRequest($method, \peer\URL $url)
 {
     $q = $url->getQuery();
     $_SERVER['REQUEST_METHOD'] = $method;
     $_SERVER['SERVER_PROTOCOL'] = 'HTTP/1.1';
     $_SERVER['HTTP_HOST'] = $url->getHost();
     $_SERVER['REQUEST_URI'] = $url->getPath('/') . ($q ? '?' . $q : '');
     $_SERVER['QUERY_STRING'] = $q;
     if ('https' === $url->getScheme()) {
         $_SERVER['HTTPS'] = 'on';
     }
     $_REQUEST = $url->getParams();
 }
 /**
  * Handle a single request
  *
  * @param   string method request method
  * @param   string query query string
  * @param   [:string] headers request headers
  * @param   string data post data
  * @param   peer.Socket socket
  * @return  int
  */
 public function handleRequest($method, $query, array $headers, $data, Socket $socket)
 {
     $url = new URL('http://' . (isset($headers['Host']) ? $headers['Host'] : $this->serverName) . $query);
     $request = $this->request->invoke($this->scriptlet, array());
     $response = $this->response->invoke($this->scriptlet, array());
     // Fill request
     $request->method = $method;
     $request->env = $this->env;
     $request->env['SERVER_PROTOCOL'] = 'HTTP/1.1';
     $request->env['REQUEST_URI'] = $query;
     $request->env['QUERY_STRING'] = substr($query, strpos($query, '?') + 1);
     $request->env['HTTP_HOST'] = $url->getHost();
     if ('https' === $url->getScheme()) {
         $request->env['HTTPS'] = 'on';
     }
     if (isset($headers['Authorization'])) {
         if (0 === strncmp('Basic', $headers['Authorization'], 5)) {
             $credentials = explode(':', base64_decode(substr($headers['Authorization'], 6)));
             $request->env['PHP_AUTH_USER'] = $credentials[0];
             $request->env['PHP_AUTH_PW'] = $credentials[1];
         }
     }
     $_COOKIE = array();
     if (isset($headers['Cookie'])) {
         foreach (explode(';', $headers['Cookie']) as $cookie) {
             sscanf(trim($cookie), "%[^=]=%[^\r]", $name, $value);
             $_COOKIE[$name] = $value;
         }
     }
     $request->setHeaders($headers);
     try {
         $this->scriptlet->service($request, $response);
     } catch (ScriptletException $e) {
         $e->printStackTrace();
         $this->sendErrorMessage($socket, $e->getStatus(), $e->getClassName(), $e->getMessage());
         return;
     }
     $h = array();
     foreach ($response->headers as $header) {
         list($name, $value) = explode(': ', $header, 2);
         if (isset($h[$name])) {
             $h[$name] = array($h[$name], $value);
         } else {
             $h[$name] = $value;
         }
     }
     $this->sendHeader($socket, $response->statusCode, '', $h);
     $socket->write($response->getContent());
     return $response->statusCode;
 }
 /**
  * Creates a new request object
  *
  * @param   string method
  * @param   peer.URL url
  * @return  scriptlet.HttpScriptletRequest
  */
 protected function newRequest($method, URL $url)
 {
     $q = $url->getQuery('');
     $req = new \scriptlet\HttpScriptletRequest();
     $req->method = $method;
     $req->env['SERVER_PROTOCOL'] = 'HTTP/1.1';
     $req->env['REQUEST_URI'] = $url->getPath('/') . ($q ? '?' . $q : '');
     $req->env['QUERY_STRING'] = $q;
     $req->env['HTTP_HOST'] = $url->getHost();
     if ('https' === $url->getScheme()) {
         $req->env['HTTPS'] = 'on';
     }
     $req->setHeaders(array());
     $req->setParams($url->getParams());
     return $req;
 }
Esempio n. 4
0
 /**
  * Parse DSN
  *
  * @param   string dsn
  * @return  bool success
  */
 protected function _parsedsn($dsn)
 {
     if (null === $dsn) {
         return true;
     }
     $u = new URL($dsn);
     if (!$u->getHost()) {
         throw new \lang\IllegalArgumentException('DSN parsing failed ["' . $dsn . '"]');
     }
     // Scheme
     switch (strtoupper($u->getScheme())) {
         case 'ESMTP':
             $this->ext = true;
             break;
         case 'SMTP':
             $this->ext = false;
             break;
         default:
             throw new \lang\IllegalArgumentException('Scheme "' . $u->getScheme() . '" not supported');
     }
     // Copy host and port
     $this->host = $u->getHost();
     $this->port = $u->getPort() ? $u->getPort() : 25;
     // User & password
     if ($u->getUser()) {
         $this->auth = $u->getParam('auth', SMTP_AUTH_PLAIN);
         $this->user = $u->getUser();
         $this->pass = $u->getPassword();
     }
 }
 public function doCreate()
 {
     $req = $this->newRequest('GET', new URL('http://localhost/'));
     $res = new \scriptlet\HttpScriptletResponse();
     $s = newinstance('scriptlet.xml.XMLScriptlet', [], '{
   public function needsSession($request) { return true; }
 }');
     $s->service($req, $res);
     $this->assertEquals(HttpConstants::STATUS_FOUND, $res->statusCode);
     // Check URL from Location: header contains the session ID
     with($redirect = new URL(substr($res->headers[0], strlen('Location: '))));
     $this->assertEquals('http', $redirect->getScheme());
     $this->assertEquals('localhost', $redirect->getHost());
     $this->assertEquals(sprintf('/xml/psessionid=%s/static', session_id()), $redirect->getPath());
     $this->assertEquals([], $redirect->getParams(), $redirect->getURL());
 }
 public function handleSessionInitializationError()
 {
     $req = $this->newRequest('GET', new URL('http://localhost/?psessionid=MALFORMED'));
     $res = new HttpScriptletResponse();
     $s = newinstance('scriptlet.HttpScriptlet', [], ['needsSession' => function ($request) {
         return true;
     }, 'handleSessionInitialization' => function ($request) {
         if (!preg_match('/^a-f0-9$/', $request->getSessionId())) {
             throw new IllegalArgumentException('Invalid characters in session id');
         }
         parent::handleSessionInitialization($request);
     }, 'handleSessionInitializationError' => function ($request, $response) {
         $request->getURL()->addParam('relogin', 1);
         return $request->session->initialize(null);
     }]);
     $s->service($req, $res);
     $this->assertEquals(HttpConstants::STATUS_FOUND, $res->statusCode);
     // Check URL from Location: header contains the session ID
     with($redirect = new URL(substr($res->headers[0], strlen('Location: '))));
     $this->assertEquals('http', $redirect->getScheme());
     $this->assertEquals('localhost', $redirect->getHost());
     $this->assertEquals('/', $redirect->getPath());
     $this->assertEquals(session_id(), $redirect->getParam('psessionid'));
     $this->assertEquals('1', $redirect->getParam('relogin'));
 }
 /**
  * Send proxy request
  *
  * @param  peer.Socket $s Connection to proxy
  * @param  peer.http.HttpRequest $request
  * @param  peer.URL $url
  */
 protected function proxy($s, $request, $url)
 {
     $request->setTarget(sprintf('%s://%s%s%s', $url->getScheme(), $url->getHost(), $url->getPort() ? ':' . $url->getPort() : '', $url->getPath('/')));
 }
Esempio n. 8
0
 /**
  * Get transport implementation for a specific URL
  *
  * @param   peer.URL url
  * @return  peer.http.HttpTransport
  * @throws  lang.IllegalArgumentException in case the scheme is not supported
  */
 public static function transportFor(URL $url)
 {
     sscanf($url->getScheme(), '%[^+]+%s', $scheme, $arg);
     if (!isset(self::$transports[$scheme])) {
         throw new \lang\IllegalArgumentException('Scheme "' . $scheme . '" unsupported');
     }
     $transport = self::$transports[$scheme]->newInstance($url, $arg);
     $transport->setProxy(self::$settings->proxy($scheme));
     return $transport;
 }