1: <?php
2: namespace Ratchet\Http;
3: use Ratchet\MessageInterface;
4: use Ratchet\ConnectionInterface;
5: use GuzzleHttp\Psr7 as gPsr;
6:
7: 8: 9: 10: 11:
12: class HttpRequestParser implements MessageInterface {
13: const EOM = "\r\n\r\n";
14:
15: 16: 17: 18: 19:
20: public $maxSize = 4096;
21:
22: 23: 24: 25: 26: 27:
28: public function onMessage(ConnectionInterface $context, $data) {
29: if (!isset($context->httpBuffer)) {
30: $context->httpBuffer = '';
31: }
32:
33: $context->httpBuffer .= $data;
34:
35: if (strlen($context->httpBuffer) > (int)$this->maxSize) {
36: throw new \OverflowException("Maximum buffer size of {$this->maxSize} exceeded parsing HTTP header");
37: }
38:
39: if ($this->isEom($context->httpBuffer)) {
40: $request = $this->parse($context->httpBuffer);
41:
42: unset($context->httpBuffer);
43:
44: return $request;
45: }
46: }
47:
48: 49: 50: 51: 52:
53: public function isEom($message) {
54: return (boolean)strpos($message, static::EOM);
55: }
56:
57: 58: 59: 60:
61: public function parse($headers) {
62: if (function_exists('http_parse_message')) {
63: $parts = http_parse_message($headers);
64:
65: return new gPsr\Request(
66: $parts->requestMethod
67: , $parts->requestUrl
68: , $parts->headers
69: , null
70: , $parts->httpVersion
71: );
72: } else {
73: return gPsr\parse_request($headers);
74: }
75: }
76: }
77: