-
-
Notifications
You must be signed in to change notification settings - Fork 166
Expand file tree
/
Copy pathRequestHeaderParser.php
More file actions
75 lines (59 loc) · 1.8 KB
/
RequestHeaderParser.php
File metadata and controls
75 lines (59 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
<?php
namespace React\Http;
use Evenement\EventEmitter;
use Exception;
use GuzzleHttp\Psr7 as g7;
/**
* @event headers
* @event error
*/
class RequestHeaderParser extends EventEmitter
{
private $buffer = '';
private $maxSize = 4096;
public function feed($data)
{
if (strlen($this->buffer) + strlen($data) > $this->maxSize) {
$this->emit('error', array(new \OverflowException("Maximum header size of {$this->maxSize} exceeded."), $this));
return;
}
$this->buffer .= $data;
if (false !== strpos($this->buffer, "\r\n\r\n")) {
try {
$this->parseAndEmitRequest();
} catch (Exception $exception) {
$this->emit('error', [$exception]);
}
$this->removeAllListeners();
}
}
protected function parseAndEmitRequest()
{
list($request, $bodyBuffer) = $this->parseRequest($this->buffer);
$this->emit('headers', array($request, $bodyBuffer));
}
public function parseRequest($data)
{
list($headers, $bodyBuffer) = explode("\r\n\r\n", $data, 2);
$psrRequest = g7\parse_request($headers);
$parsedQuery = [];
$queryString = $psrRequest->getUri()->getQuery();
if ($queryString) {
parse_str($queryString, $parsedQuery);
}
$headers = array_map(function($val) {
if (1 === count($val)) {
$val = $val[0];
}
return $val;
}, $psrRequest->getHeaders());
$request = new Request(
$psrRequest->getMethod(),
$psrRequest->getUri()->getPath(),
$parsedQuery,
$psrRequest->getProtocolVersion(),
$headers
);
return array($request, $bodyBuffer);
}
}