Commit Graph

458 Commits

Author SHA1 Message Date
Vinnie Falco
d7e9a7ca3c Better handler_ptr (API Change):
fix #242

* Add public constructors
* Add handler_ptr::empty()
* Add handler_ptr::element_type
* Remove make_handler_ptr free function
* Compiler error if element_type is an array type
* handler_ptr::get() returns nullptr if no object is owned
2017-07-20 08:12:14 -07:00
Vinnie Falco
911617c43f Add permessage-deflate WebSocket extension:
This implements the permessage-deflate WebSocket
extension as described in HyBi Working Group
draft-ietf-hybi-permessage-compression-28:
https://tools.ietf.org/html/draft-ietf-hybi-permessage-compression-28

This extension allows messages to be compressed using
the raw "deflate" algorithm described in RFC 1951,
"DEFLATE Compressed Data Format Specification version 1.3":
https://www.ietf.org/rfc/rfc1951.txt
2017-07-20 08:12:14 -07:00
Denis Andrejew
48c57b0538 Fix code sample in websocket.qbk 2017-07-20 08:12:14 -07:00
Denis Andrejew
3d1488a4e5 Fix typos in design.qbk 2017-07-20 08:12:14 -07:00
Vinnie Falco
93e58f7dab Update documentation examples
fix #222
2017-07-20 08:12:14 -07:00
Vinnie Falco
01e1fa2dc9 Implement asio dealloc-before-invoke guarantee:
fix #215

This change guarantees that temporary memory allocated
through the asio hooks by the Beast implementation is
deallocated before invoking the final handler when performing
composed operations.

The change is accomplished by replacing std::shared_ptr with
a thread-safe custom container handler_ptr to manage composed
operation state. The container tracks other instances which
manage the same object and resets them in a safe way before
invoking the final handler.

handler_ptr is provided as a public interface so that users of
this library can utilize the same idiom to write their own
composed operations.
2017-07-20 08:12:14 -07:00
Vinnie Falco
5089cf59ee Add zlib module:
The zlib module is a port of ZLib's raw deflate
algorithm to header-only C++11.
2017-07-20 08:12:14 -07:00
Vinnie Falco
e3848e7281 Refactor HTTP identifier names (API Change):
fix #171

Several names and  HTTP identifiers are renamed to be
more consistent, self-explanatory, and concise:

* "Fields" is a collection of HTTP header fields (rfc7230 section 3.2)
* "Header" is the Start Line plus Fields. Another way to look at it is,
  the HTTP message minus the body.
* `basic_fields` replaces `basic_headers`
* `fields` replaces `headers`
* `Fields` replaces `Headers` in template parameter lists
* `header` replaces `message_headers`
* `header::fields` replaces `message_headers::fields`

The changes are cosmetic and do not affect run-time behavior.
2017-07-20 08:12:13 -07:00
Vinnie Falco
6afa6afc98 Fix consuming_buffers value_type (API Change):
This fixes a bug where instantiations of consuming_buffers with
buffer sequence types whose value_type is not const_buffer or
mutable_buffer can cause compilation errors.

The function consumed_buffers is removed.
2017-07-20 08:12:13 -07:00
Vinnie Falco
8f535ba74f prepared_buffers is private (API Change) 2017-07-20 08:12:13 -07:00
Vinnie Falco
8035dac88c Add write, async_write, operator<< for message_headers:
fix #155

This adds overloads of write, async_write, and operator<<
for message_headers.
2017-07-20 08:12:13 -07:00
Vinnie Falco
f98ec17121 Make chunk_encode public:
fix #154, fix #156

This adds public interfaces for transforming buffer
sequences into their chunk-encoded equivalents. The
transformations are O(1) in space and time.
2017-07-20 08:12:13 -07:00
Vinnie Falco
50bc9a58cd Refactor message and message_headers declarations:
message_headers is now a set of partial class template
specializations instead of a template class alias. This solves
a problem where template functions taking message_headers as a
parameter could not deduce argument types, since std::conditional
obscured the deduced context.

Both classes are refactored to share declarations using an #ifdef,
to eliminate an ugly set of extra declarations needed when building
the documentation.

Copy and move class special members are added.

A new function message::base() is provided which returns the
message_headers portion of a message.
2017-07-20 08:12:13 -07:00
Vinnie Falco
f904759877 Add websocket::stream pong and async_pong 2017-07-20 08:12:13 -07:00
Vinnie Falco
f56d4fe74b Close connection during async_read on close frame:
fix #163
2017-07-20 08:12:13 -07:00
Vinnie Falco
4f68ec7b7b Doc fixes 2017-07-20 08:12:13 -07:00
Vinnie Falco
f3b22f74b2 Add headers_parser:
This allows just the HTTP headers to be parsed, and
the choice of body to be deferred to a subsequent
call to parse.
2017-07-20 08:12:13 -07:00
Vinnie Falco
e45a6418ee Tidy up documentation:
fix #135

* Fix broken references
* Move doc debug headers to extras/
* Add rfc7230 utility classes to quick reference
2017-07-20 08:12:13 -07:00
Vinnie Falco
a4d8a154b1 Refine message class hierarchy:
Two new objects, request_headers and response_headers,
represent the portion of HTTP messages excluding the body.
2017-07-20 08:12:13 -07:00
Vinnie Falco
056d6b94c2 Rework HTTP concepts (API Change):
fix #139, fix #140

* Writer uses write instead of operator()
* Refactor traits to use void_t
* Remove is_ReadableBody, is_WritableBody
* Add has_reader, has_writer, is_Reader, is_Writer
* More friendly compile errors on failed concept checks
2017-07-20 08:12:13 -07:00
Vinnie Falco
f110e51dd1 HTTP Reader (API Change):
fix #114, fix #117, fix #136

* Added init() to Reader requirements
* Reader must be nothrow constructible
* Reader is now constructed right before reading the body
  - The message passed on construction is filled in
2017-07-20 08:12:13 -07:00
Vinnie Falco
14f13cc74a Fix Writer exemplar in docs 2017-07-20 08:12:13 -07:00
Vinnie Falco
aed6c0e288 Relax ForwardIterator requirements in FieldSequence 2017-07-20 08:12:13 -07:00
Vinnie Falco
2106f364f6 Add pause option to on_headers interface:
* on_headers returns enum body_what
* body_what::pause lets caller receive headers during the parse
2017-07-20 08:12:12 -07:00
Vinnie Falco
bca43529b0 Refine Parser concept:
* Parser is not HTTP-specific
* parse algorithms are in their own header
* Update documentation
2017-07-20 08:12:12 -07:00
Vinnie Falco
113ecb0c34 Put back missing Design section in docs 2017-07-20 08:12:12 -07:00
Vinnie Falco
5855b34d6e Make auto_fragment a boolean option 2017-07-20 08:12:12 -07:00
Vinnie Falco
1156b483c4 Rename to write_buffer_size 2017-07-20 08:12:12 -07:00
Vinnie Falco
6b0b016b21 Tidy up error types:
* Restructure header material
* Clean up namespace type injections
* Remove extraneous 'success' constants
2017-07-20 08:12:12 -07:00
Vinnie Falco
19c4ae3140 Fix doc reference section 2017-07-20 08:12:12 -07:00
Vinnie Falco
9135cdff1a Fix message_v1 constructor 2017-07-20 08:12:12 -07:00
Vinnie Falco
e8527babeb Add Secure WebSocket example 2017-07-20 08:12:12 -07:00
Vinnie Falco
2ad5223d80 Add HTTPS example 2017-07-20 08:12:12 -07:00
Vinnie Falco
c5bd32e39d Use bin/sh 2017-07-20 08:12:12 -07:00
Vinnie Falco
9cc65c8850 Update and tidy documentation 2017-07-20 08:12:12 -07:00
Keaton Okkonen
b7201be164 Update README.md (fix #62) 2017-07-20 08:12:09 -07:00
Vinnie Falco
3518e4861b Number error codes from 1 (fix #54) 2017-07-20 08:12:09 -07:00
Vinnie Falco
796f20314c Update HTTP documentation (fix #61, #60, #59) 2017-07-20 08:12:09 -07:00
Vinnie Falco
2c4bdf933e Update documentation and images 2017-07-20 08:12:09 -07:00
Vinnie Falco
a345327c7b Add WebSocket implementation comparison doc 2017-07-20 08:12:07 -07:00
Vinnie Falco
98adfdb79c Update Example code in documentation 2017-07-20 08:12:07 -07:00
Vinnie Falco
344e4c942c Add skip_body parser option 2017-07-20 08:12:07 -07:00
Vinnie Falco
19f15046b0 Fixes and documentation for teardown and use with SSL:
This solves a problem where clang and gcc locate the deleted
version of teardown and async_teardown instead of the overloaded
version. It requires overloads to add `teardown_tag` into the signature
so that the rules for argument dependent lookup can find the
right function. Improve documentation of teardown requirements

The documentation is updated to clearly explain the need for including
<beast/websocket/ssl.hpp> to use SSL streams with WebSocket.

The default implementations of teardown and async_teardown now use
static_assert to alert the user of improper usage, with comments
providing guidance for resolving the error.
2017-07-20 08:12:07 -07:00
Vinnie Falco
589e18c199 rfc7230 compliance, limits, and tests for basic_parser_v1:
New parser set_option function for controlling independent size limits
on headers and body. By default request and response parsers are set up
with reasonable limits to prevent resource exhaustion attacks.

* Parser adheres strictly to rfc7230
* Increased test coverage
* Headers and body maximum size limit options
2017-07-20 08:12:07 -07:00
Vinnie Falco
6c30ee1a98 Rename concept to DynamicBuffer (API change):
Conform to the Networking TS by renaming the Streambuf concept
to DynamicBuffer in all places. Values of types meeting the
requirements of DynamicBuffer are renamed to dynabuf.

See:
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4478.html#requirements.dynamic_buffers

* Headers renamed
* Formal parameter names renamed
* Template argument types renamed
* Documentation updated
2017-07-20 08:12:07 -07:00
Vinnie Falco
e8019fa9d4 Add message swap members and free functions 2017-07-20 08:12:07 -07:00
Vinnie Falco
19256b85f0 HTTP improvements:
* Increased code coverage

* New Body concepts:
    is_Body
    is_ReadableBody
    is_WritableBody
2017-07-20 08:12:07 -07:00
Vinnie Falco
039244cda4 WebSocket ping, fixes, coverage:
* Improve test coverage
* tests for invokable in composed ops

* Update documentation
* Add License badge to README
* Target Windows 7 SDK and later
* Make role_type private
* Remove extra unused masking functions
* Allow stream reuse / reconnect after failure
* Restructure logic of composed operations
* Allow 0 for read_message_max meaning no limit
* Respect keep alive when building HTTP responses
* Check version in upgrade request
* Response with 426 status on unsupported WebSocket version
* Remove unnecessary Sec-WebSocket-Key in HTTP responses
* Rename to mask_buffer_size

* Remove maybe_throw
* Add ping, async_ping, async_on_pong
* Add ping_op
* Add pong_op
* Fix crash in accept_op
* Fix suspend in close_op
* Fix read_frame_op logic
* Fix crash in read_op
* Fix races in echo sync and async echo servers
2017-07-20 08:12:07 -07:00
Vinnie Falco
da313a002e Update documentation:
* http parse functions
* Parser concept
* More detail on concepts
* Better hyperlinking
2017-07-20 08:12:07 -07:00
Vinnie Falco
4f1b9089b8 Parser concept, fixes:
A new concept Parser is introduced with routines to read from a stream
into the parser. This solves a problem with the old read interface where
messages must be default constructible and move assignable.

Parser fixes:

* Fix detect invalid reason-phrase octets
* Fix write_eof to set the 'complete' state on success
* Fix consider parse complete if eof received on empty body

WebSocket:

* Increase coverage
2017-07-20 08:12:06 -07:00
Vinnie Falco
c49cde844b New constructors for message:
The message class now behaves like a pair with respect to the construction
of the body and headers. Additional constructors allow construction of
just the body portion from a tuple, leaving the headers default
constructed.

Previous constructors are removed as they were a notational convenience
for assembling HTTP/1 requests and responses. They are not necessary
as this library aims at library writers and not end users.
2017-07-20 08:12:06 -07:00
Vinnie Falco
3484996048 Tidy up core sources:
The core headers are moved to their own directory (but remain in
the same namespace).
2017-07-20 08:12:06 -07:00
Vinnie Falco
133e7a3b16 Improvements to increase code coverage:
* Don't include the test code in coverage reports
* Add test code for missing coverage

Other:

* Improve the README.md
* Fix warning in sha1_context
* Tidy up the examples use of namespaces
* Various fixes to documentation and javadocs
2017-07-20 08:12:06 -07:00
Vinnie Falco
313620ce7e Tidy up tests, build scripts, and documentation:
* Concepts split up into individual files
* Function definitions moved to .ipp files
* Add more tests to fill gaps in coverage
* Fix documentation Xsl
2017-07-20 08:12:06 -07:00
Vinnie Falco
c309f53ed2 Distinguish HTTP/1 messages from general HTTP messages:
The version field is moved into message_v1, all public interfaces
are reworked to identify HTTP/1 wire format operations (suffix "_v1")
versus general HTTP.
2017-07-20 08:12:05 -07:00
Vinnie Falco
4104eca1f1 WebSocket refactoring and tests:
websocket:

* Move echo server to test/
* Fix warnings
* Fix maskgen being uncopyable
* Simplify utf8_checker special member declarations
* Fix stream move assignable when owning the next layer
* Add javadocs for stream special members
* Add stream unit tests
* Move throwing member definitions to the .ipp file
* Use get_lowest_layer in stream declaration
* Perform type checks at each call site instead of constructor
* Demote close_code to a non-class enum:
    Otherwise, application specific close codes
    cannot be assigned without using static_cast.

core:

* Add streambuf_readstream special members tests
* Add move assignment operator to streambuf_readstream
* Add detail/get_lowest_layer trait
* Add static_string tests
* Move static_string from websocket to core
2017-07-20 08:12:05 -07:00
Vinnie Falco
a0b04bdff2 Refactor beast core, http, tests, and examples:
* Fix warnings
* Port cmake scripts to linux
* Add command line options for running test suites
* Add examples to CMakeLists
* Return std::uint64_t from writer::content_length
* basic_parser::write takes asio::const_buffer instead of pointer and size
* Turn message test back on now that it passes
* Rename to http::headers, use std::allocator, remove http_headers
* http::message::method is now a string
* Refactor to_string for ConstBufferSequence
* Remove chunk_encode from the public interface
* Initialize members for default constructed iterators
* Disallow default construction for dependent buffer sequences

Refactor http::message serialization:

* Serialization no longer creates a copy of the
  headers and modifies them
* New function prepare(), sets Connection, Transfer-Encoding,
  Content-Length based on the body attributes and caller options.
  Callers can use prepare() to have the fields set automatically,
  or they can set the fields manually.
* Use write for operator<<
* Tests for serialization
2017-07-20 08:12:05 -07:00
Vinnie Falco
9a3a42a644 Truncate history, version 1.0.0-b2 2017-07-20 08:01:46 -07:00