|
@@ -90,18 +90,14 @@ class Http
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
$length = $crlfPos + 4;
|
|
$length = $crlfPos + 4;
|
|
|
- $firstLine = explode(" ", strstr($buffer, "\r\n", true), 3);
|
|
|
|
|
- if (!in_array($firstLine[0], ['GET', 'POST', 'OPTIONS', 'HEAD', 'DELETE', 'PUT', 'PATCH'])) {
|
|
|
|
|
- $connection->close("HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\n\r\n", true);
|
|
|
|
|
- return 0;
|
|
|
|
|
- }
|
|
|
|
|
- $header = substr($buffer, 0, $crlfPos);
|
|
|
|
|
- if (!str_contains($header, "\r\nHost: ") && $firstLine[2] === "HTTP/1.1") {
|
|
|
|
|
|
|
+ $method = strstr($buffer, ' ', true);
|
|
|
|
|
+ if (!in_array($method, ['GET', 'POST', 'OPTIONS', 'HEAD', 'DELETE', 'PUT', 'PATCH'])) {
|
|
|
$connection->close("HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\n\r\n", true);
|
|
$connection->close("HTTP/1.1 400 Bad Request\r\nContent-Length: 0\r\n\r\n", true);
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if ($pos = stripos($header, "\r\nContent-Length: ")) {
|
|
|
|
|
|
|
+ $header = substr($buffer, 0, $crlfPos);
|
|
|
|
|
+ if ($pos = strpos($header, "\r\nContent-Length: ")) {
|
|
|
$length += (int)substr($header, $pos + 18, 10);
|
|
$length += (int)substr($header, $pos + 18, 10);
|
|
|
$hasContentLength = true;
|
|
$hasContentLength = true;
|
|
|
} else if (preg_match("/\r\ncontent-length: ?(\d+)/i", $header, $match)) {
|
|
} else if (preg_match("/\r\ncontent-length: ?(\d+)/i", $header, $match)) {
|
|
@@ -119,10 +115,10 @@ class Http
|
|
|
$connection->close("HTTP/1.1 413 Payload Too Large\r\n\r\n", true);
|
|
$connection->close("HTTP/1.1 413 Payload Too Large\r\n\r\n", true);
|
|
|
return 0;
|
|
return 0;
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
return $length;
|
|
return $length;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+
|
|
|
/**
|
|
/**
|
|
|
* Http decode.
|
|
* Http decode.
|
|
|
*
|
|
*
|
|
@@ -132,7 +128,22 @@ class Http
|
|
|
*/
|
|
*/
|
|
|
public static function decode(string $buffer, TcpConnection $connection): Request
|
|
public static function decode(string $buffer, TcpConnection $connection): Request
|
|
|
{
|
|
{
|
|
|
|
|
+ static $requests = [];
|
|
|
|
|
+ if (isset($requests[$buffer])) {
|
|
|
|
|
+ $request = $requests[$buffer];
|
|
|
|
|
+ $request->connection = $connection;
|
|
|
|
|
+ $connection->request = $request;
|
|
|
|
|
+ $request->properties = [];
|
|
|
|
|
+ return $request;
|
|
|
|
|
+ }
|
|
|
$request = new static::$requestClass($buffer);
|
|
$request = new static::$requestClass($buffer);
|
|
|
|
|
+ if (!isset($buffer[TcpConnection::MAX_CACHE_STRING_LENGTH])) {
|
|
|
|
|
+ $requests[$buffer] = $request;
|
|
|
|
|
+ if (\count($requests) > TcpConnection::MAX_CACHE_SIZE) {
|
|
|
|
|
+ unset($requests[key($requests)]);
|
|
|
|
|
+ }
|
|
|
|
|
+ $request = clone $request;
|
|
|
|
|
+ }
|
|
|
$request->connection = $connection;
|
|
$request->connection = $connection;
|
|
|
$connection->request = $request;
|
|
$connection->request = $request;
|
|
|
return $request;
|
|
return $request;
|
|
@@ -154,21 +165,24 @@ class Http
|
|
|
|
|
|
|
|
if (!is_object($response)) {
|
|
if (!is_object($response)) {
|
|
|
$extHeader = '';
|
|
$extHeader = '';
|
|
|
- if ($connection->headers) {
|
|
|
|
|
- foreach ($connection->headers as $name => $value) {
|
|
|
|
|
- if (is_array($value)) {
|
|
|
|
|
- foreach ($value as $item) {
|
|
|
|
|
- $extHeader .= "$name: $item\r\n";
|
|
|
|
|
- }
|
|
|
|
|
- } else {
|
|
|
|
|
- $extHeader .= "$name: $value\r\n";
|
|
|
|
|
|
|
+ $contentType = 'text/html;charset=utf-8';
|
|
|
|
|
+ foreach ($connection->headers as $name => $value) {
|
|
|
|
|
+ if ($name === 'Content-Type') {
|
|
|
|
|
+ $contentType = $value;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (is_array($value)) {
|
|
|
|
|
+ foreach ($value as $item) {
|
|
|
|
|
+ $extHeader .= "$name: $item\r\n";
|
|
|
}
|
|
}
|
|
|
|
|
+ } else {
|
|
|
|
|
+ $extHeader .= "$name: $value\r\n";
|
|
|
}
|
|
}
|
|
|
- $connection->headers = [];
|
|
|
|
|
}
|
|
}
|
|
|
|
|
+ $connection->headers = [];
|
|
|
$response = (string)$response;
|
|
$response = (string)$response;
|
|
|
$bodyLen = strlen($response);
|
|
$bodyLen = strlen($response);
|
|
|
- return "HTTP/1.1 200 OK\r\nServer: workerman\r\n{$extHeader}Connection: keep-alive\r\nContent-Type: text/html;charset=utf-8\r\nContent-Length: $bodyLen\r\n\r\n$response";
|
|
|
|
|
|
|
+ return "HTTP/1.1 200 OK\r\nServer: workerman\r\n{$extHeader}Connection: keep-alive\r\nContent-Type: $contentType\r\nContent-Length: $bodyLen\r\n\r\n$response";
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
if ($connection->headers) {
|
|
if ($connection->headers) {
|