/** * Create an instance from an input string. * @param string $str the stringified response * @return \vakata\http\Response the response instance * @codeCoverageIgnore */ public static function fromString($str) { $res = new self(); $break = strpos($str, "\r\n\r\n") === false ? "\n" : "\r\n"; // just in case someone breaks RFC 2616 list($headers, $message) = explode($break . $break, (string) $str, 2); $headers = explode($break, preg_replace("(" . $break . "\\s+)", " ", $headers)); if (isset($headers[0]) && substr($headers[0], 0, 5) === 'HTTP/') { $temp = explode(' ', substr($headers[0], 5)); $res->setProtocolVersion($temp[0]); $res->setStatusCode((int) $temp[1]); unset($headers[0]); $headers = array_values($headers); } foreach (array_filter($headers) as $v) { $v = explode(':', $v, 2); $res->setHeader(trim($v[0]), trim($v[1])); } $res->setBody($message); $res->removeHeader('Content-Length'); $res->removeHeader('Transfer-Encoding'); return $res; }
/** * Create an instance from a stringified request. * @param string $str the stringified request * @return \vakata\http\Request the request instance * @codeCoverageIgnore */ public static function fromString($str) { $req = new self(); $break = strpos($str, "\r\n\r\n") === false ? "\n" : "\r\n"; // just in case someone breaks RFC 2616 list($headers, $message) = explode($break . $break, $str, 2); $headers = explode($break, preg_replace("(" . $break . "\\s+)", " ", $headers)); if (isset($headers[0]) && strlen($headers[0])) { $temp = explode(' ', $headers[0]); if (in_array($temp[0], ['GET', 'POST', 'HEAD', 'PATCH', 'PUT', 'OPTIONS', 'TRACE', 'DELETE'])) { $req->setMethod($temp[0]); $req->setUrl($temp[1]); if (isset($temp[2])) { $req->setProtocolVersion(substr($temp[2], 5)); } unset($headers[0]); $headers = array_values($headers); } } foreach (array_filter($headers) as $v) { $v = explode(':', $v, 2); $req->setHeader(trim($v[0]), trim($v[1])); } if ($req->hasHeader('Host')) { $host = explode(':', $req->getHeader('Host'), 2); $req->getUrl()->setHost($host[0]); if (isset($host[1]) && (int) $host[1]) { $req->getUrl()->setPort($host[1]); } } if (strpos($req->getHeader('Content-Type'), 'multipart') !== false) { $bndr = trim(explode(' boundary=', $req->getHeader('Content-Type'))[1], '"'); $parts = explode($break . '--' . $bndr, $break . $message); array_pop($parts); array_shift($parts); $post = []; foreach ($parts as $item) { list($head, $body) = explode($break . $break, $item, 2); $head = explode($break, preg_replace("(" . $break . "\\s+)", " ", $head)); foreach ($head as $h) { if (strpos(strtolower($h), 'content-disposition') === 0) { $cd = explode(';', $h); $name = ''; $file = ''; foreach ($cd as $p) { if (strpos(trim($p), 'name=') === 0) { $name = trim(explode('name=', $p)[1], ' "'); } if (strpos(trim($p), 'filename=') === 0) { $file = trim(explode('filename=', $p)[1], ' "'); } } if ($file) { $req->addUpload($name, $body, $file); } else { $post[$name] = $body; } } } } $req->setBody(http_build_query($post)); } elseif (strlen($message)) { $req->setBody($message); } $req->removeHeader('Content-Length'); $req->removeHeader('Transfer-Encoding'); return $req; }