Beast.HTTP:

New classes are introduced to represent HTTP messages and their
associated bodies. The parser interface is reworked to use CRTP,
error codes, and trait checks.

New classes:

* basic_headers

  Models field/value pairs in a HTTP message.

* message

  Models a HTTP message, body behavior defined by template argument.
  Parsed message carries metadata generated during parsing.

* parser

  Produces parsed messages.

* empty_body, string_body, basic_streambuf_body

  Classes used to represent content bodies in various ways.

New functions:

* read, async_read, write, async_write

  Read and write HTTP messages on a socket.

New concepts:

* Body: Represents the HTTP Content-Body.
* Field: A HTTP header field.
* FieldSequence: A forward sequence of fields.
* Reader: Parses a Body from a stream of bytes.
* Writer: Serializes a Body to buffers.

basic_parser changes:

* add write methods which throw exceptions instead
* error_code passed via parameter instead of return value
* fold private member calls into existing callbacks
* basic_parser uses CRTP instead of virtual members
* add documentation on Derived requirements for CRTP

impl/http-parser changes:

* joyent renamed to nodejs to reflect upstream changes
This commit is contained in:
Vinnie Falco
2016-03-11 06:40:37 -05:00
parent f25b448a49
commit bcbe22c780
88 changed files with 6843 additions and 1867 deletions

View File

@@ -246,6 +246,8 @@
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\asio\buffers_adapter.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\asio\buffers_debug.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\asio\consuming_buffers.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\asio\handler_alloc.h">
@@ -361,62 +363,88 @@
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\hash\xxhasher.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\basic_headers.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\basic_parser.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\body.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\chunk_encode.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\detail\error.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\detail\writes.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\detail\write_preparation.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\empty_body.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\error.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\fields.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\headers.h">
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\HTTP.unity.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\impl\basic_parser.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<None Include="..\..\src\beast\beast\http\impl\basic_headers.ipp">
</None>
<None Include="..\..\src\beast\beast\http\impl\basic_parser.ipp">
</None>
<ClCompile Include="..\..\src\beast\beast\http\impl\http-parser\http_parser.c">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\impl\http-parser\http_parser.h">
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\impl\joyent_parser.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\impl\joyent_parser.h">
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\impl\method.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\impl\URL.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<None Include="..\..\src\beast\beast\http\impl\message.ipp">
</None>
<None Include="..\..\src\beast\beast\http\impl\read.ipp">
</None>
<None Include="..\..\src\beast\beast\http\impl\write.ipp">
</None>
<ClInclude Include="..\..\src\beast\beast\http\message.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\method.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\parser.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\read.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\reason.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\resume_context.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\rfc2616.h">
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\tests\chunked_encoder.test.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
<ClCompile Include="..\..\src\beast\beast\http\src\beast_http_nodejs_parser.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\parser.test.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\rfc2616.test.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\URL.test.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\urls_large_data.cpp">
<ExcludedFromBuild>True</ExcludedFromBuild>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\tests\urls_large_data.h">
<ClInclude Include="..\..\src\beast\beast\http\src\nodejs_parser.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\URL.h">
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_chunked_encoder_test.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_message_test.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_parser_test.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_rfc2616_test.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\streambuf_body.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\string_body.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\type_check.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\write.h">
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\is_call_possible.h">
</ClInclude>
@@ -454,6 +482,10 @@
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\unity\beast_hash_unity.cpp">
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\unity\beast_http_unity.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug.classic|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release.classic|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\unity\beast_streams_unity.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug.classic|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release.classic|x64'">True</ExcludedFromBuild>
@@ -1728,6 +1760,10 @@
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\ripple\beast\net\impl\URL.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClInclude Include="..\..\src\ripple\beast\net\IPAddress.h">
</ClInclude>
<ClInclude Include="..\..\src\ripple\beast\net\IPAddressConversion.h">
@@ -1738,10 +1774,16 @@
</ClInclude>
<ClInclude Include="..\..\src\ripple\beast\net\IPEndpoint.h">
</ClInclude>
<ClCompile Include="..\..\src\ripple\beast\net\tests\beast_http_URL_test.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\..\src\ripple\beast\net\tests\IPEndpoint.test.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='debug|x64'">True</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='release|x64'">True</ExcludedFromBuild>
</ClCompile>
<ClInclude Include="..\..\src\ripple\beast\net\URL.h">
</ClInclude>
<ClInclude Include="..\..\src\ripple\beast\nudb.h">
</ClInclude>
<ClInclude Include="..\..\src\ripple\beast\nudb\api.h">

View File

@@ -49,14 +49,20 @@
<Filter Include="beast\http">
<UniqueIdentifier>{7138D215-DA65-98D5-EF7D-C9896685201E}</UniqueIdentifier>
</Filter>
<Filter Include="beast\http\detail">
<UniqueIdentifier>{3E84AA4C-CB48-99F0-EB35-5603FF633A51}</UniqueIdentifier>
</Filter>
<Filter Include="beast\http\impl">
<UniqueIdentifier>{932F732F-F09E-5C50-C8A1-D62342CCAA1F}</UniqueIdentifier>
</Filter>
<Filter Include="beast\http\impl\http-parser">
<UniqueIdentifier>{59E40DE8-464F-35ED-5F22-E7B52FDE3ECD}</UniqueIdentifier>
</Filter>
<Filter Include="beast\http\tests">
<UniqueIdentifier>{7FFB535D-F2F1-0B27-4C2F-28A6BAFDE4ED}</UniqueIdentifier>
<Filter Include="beast\http\src">
<UniqueIdentifier>{CCA07C08-BF91-95E2-4980-7D56A618C37E}</UniqueIdentifier>
</Filter>
<Filter Include="beast\http\src\test">
<UniqueIdentifier>{5F7F2E0C-4CDE-B1E1-1668-E06768D6FFD3}</UniqueIdentifier>
</Filter>
<Filter Include="beast\streams">
<UniqueIdentifier>{7944CEAB-F8F9-1E2B-CD03-B3D9F78B20E9}</UniqueIdentifier>
@@ -552,6 +558,9 @@
<ClInclude Include="..\..\src\beast\beast\asio\buffers_adapter.h">
<Filter>beast\asio</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\asio\buffers_debug.h">
<Filter>beast\asio</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\asio\consuming_buffers.h">
<Filter>beast\asio</Filter>
</ClInclude>
@@ -699,6 +708,12 @@
<ClInclude Include="..\..\src\beast\beast\hash\xxhasher.h">
<Filter>beast\hash</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http.h">
<Filter>beast</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\basic_headers.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\basic_parser.h">
<Filter>beast\http</Filter>
</ClInclude>
@@ -708,33 +723,48 @@
<ClInclude Include="..\..\src\beast\beast\http\chunk_encode.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\detail\error.h">
<Filter>beast\http\detail</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\detail\writes.h">
<Filter>beast\http\detail</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\detail\write_preparation.h">
<Filter>beast\http\detail</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\empty_body.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\error.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\fields.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\headers.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\HTTP.unity.cpp">
<Filter>beast\http</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\impl\basic_parser.cpp">
<None Include="..\..\src\beast\beast\http\impl\basic_headers.ipp">
<Filter>beast\http\impl</Filter>
</ClCompile>
</None>
<None Include="..\..\src\beast\beast\http\impl\basic_parser.ipp">
<Filter>beast\http\impl</Filter>
</None>
<ClCompile Include="..\..\src\beast\beast\http\impl\http-parser\http_parser.c">
<Filter>beast\http\impl\http-parser</Filter>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\impl\http-parser\http_parser.h">
<Filter>beast\http\impl\http-parser</Filter>
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\impl\joyent_parser.cpp">
<None Include="..\..\src\beast\beast\http\impl\message.ipp">
<Filter>beast\http\impl</Filter>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\impl\joyent_parser.h">
</None>
<None Include="..\..\src\beast\beast\http\impl\read.ipp">
<Filter>beast\http\impl</Filter>
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\impl\method.cpp">
</None>
<None Include="..\..\src\beast\beast\http\impl\write.ipp">
<Filter>beast\http\impl</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\impl\URL.cpp">
<Filter>beast\http\impl</Filter>
</ClCompile>
</None>
<ClInclude Include="..\..\src\beast\beast\http\message.h">
<Filter>beast\http</Filter>
</ClInclude>
@@ -744,28 +774,46 @@
<ClInclude Include="..\..\src\beast\beast\http\parser.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\read.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\reason.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\resume_context.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\rfc2616.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClCompile Include="..\..\src\beast\beast\http\tests\chunked_encoder.test.cpp">
<Filter>beast\http\tests</Filter>
<ClCompile Include="..\..\src\beast\beast\http\src\beast_http_nodejs_parser.cpp">
<Filter>beast\http\src</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\parser.test.cpp">
<Filter>beast\http\tests</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\rfc2616.test.cpp">
<Filter>beast\http\tests</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\URL.test.cpp">
<Filter>beast\http\tests</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\tests\urls_large_data.cpp">
<Filter>beast\http\tests</Filter>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\tests\urls_large_data.h">
<Filter>beast\http\tests</Filter>
<ClInclude Include="..\..\src\beast\beast\http\src\nodejs_parser.h">
<Filter>beast\http\src</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\URL.h">
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_chunked_encoder_test.cpp">
<Filter>beast\http\src\test</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_message_test.cpp">
<Filter>beast\http\src\test</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_parser_test.cpp">
<Filter>beast\http\src\test</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\http\src\test\beast_http_rfc2616_test.cpp">
<Filter>beast\http\src\test</Filter>
</ClCompile>
<ClInclude Include="..\..\src\beast\beast\http\streambuf_body.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\string_body.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\type_check.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\http\write.h">
<Filter>beast\http</Filter>
</ClInclude>
<ClInclude Include="..\..\src\beast\beast\is_call_possible.h">
@@ -807,6 +855,9 @@
<ClCompile Include="..\..\src\beast\beast\unity\beast_hash_unity.cpp">
<Filter>beast\unity</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\unity\beast_http_unity.cpp">
<Filter>beast\unity</Filter>
</ClCompile>
<ClCompile Include="..\..\src\beast\beast\unity\beast_streams_unity.cpp">
<Filter>beast\unity</Filter>
</ClCompile>
@@ -2211,6 +2262,9 @@
<ClCompile Include="..\..\src\ripple\beast\net\impl\IPEndpoint.cpp">
<Filter>ripple\beast\net\impl</Filter>
</ClCompile>
<ClCompile Include="..\..\src\ripple\beast\net\impl\URL.cpp">
<Filter>ripple\beast\net\impl</Filter>
</ClCompile>
<ClInclude Include="..\..\src\ripple\beast\net\IPAddress.h">
<Filter>ripple\beast\net</Filter>
</ClInclude>
@@ -2226,9 +2280,15 @@
<ClInclude Include="..\..\src\ripple\beast\net\IPEndpoint.h">
<Filter>ripple\beast\net</Filter>
</ClInclude>
<ClCompile Include="..\..\src\ripple\beast\net\tests\beast_http_URL_test.cpp">
<Filter>ripple\beast\net\tests</Filter>
</ClCompile>
<ClCompile Include="..\..\src\ripple\beast\net\tests\IPEndpoint.test.cpp">
<Filter>ripple\beast\net\tests</Filter>
</ClCompile>
<ClInclude Include="..\..\src\ripple\beast\net\URL.h">
<Filter>ripple\beast\net</Filter>
</ClInclude>
<ClInclude Include="..\..\src\ripple\beast\nudb.h">
<Filter>ripple\beast</Filter>
</ClInclude>