
On Mon, Feb 1, 2010 at 11:49 PM, Phil Endecott < spam_from_boost_dev@chezphil.org> wrote:
Peter Petrov wrote:
First, Spirit is unsuitable for the task - it consumes all the input in one pass, and doesn't support the case when the HTTP request arrives in more than one read. The real solution is a state-machine-based parser, just like the one in the Asio HTTP example.
I disagree in general. My parser is primarily an HTTP request _header_ parser, and the headers are normally relatively small. For most requests (i.e. GETs) the request body doesn't add much, and in those cases it is likely that the whole request can be got in a single read. In fact browser implementations go to some lengths to make their requests fit in single network packets (about 1500 bytes) for performance reasons, and single network packets will generally be accessible as single reads.
Of course I'm also talking about a header-only parser. The request body is naturally read separately. Your assumption about the single-TCP-packet HTTP requests however is wrong. I made the mistake of assuming the same thing initially as well. But at least Opera has the habit of sending requests across packet boundaries far too often. In my case though, most requests travel on long-lived HTTP 1.1 keep-alive connections, which might be a trigger for this. Regards, Peter