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