diff --git a/Builds/VisualStudio2015/RippleD.vcxproj b/Builds/VisualStudio2015/RippleD.vcxproj
index 2b8fe0fb2..d919a37f5 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj
+++ b/Builds/VisualStudio2015/RippleD.vcxproj
@@ -264,6 +264,8 @@
+
+
@@ -400,8 +402,6 @@
-
-
diff --git a/Builds/VisualStudio2015/RippleD.vcxproj.filters b/Builds/VisualStudio2015/RippleD.vcxproj.filters
index 9bf79914a..62447e0c6 100644
--- a/Builds/VisualStudio2015/RippleD.vcxproj.filters
+++ b/Builds/VisualStudio2015/RippleD.vcxproj.filters
@@ -555,6 +555,9 @@
beast\unit_test
+
+ beast
+
beast\core
@@ -759,9 +762,6 @@
beast\http
-
- beast\http
-
beast\http
diff --git a/src/beast/CHANGELOG.md b/src/beast/CHANGELOG.md
index 383491ba7..2dcb1650c 100644
--- a/src/beast/CHANGELOG.md
+++ b/src/beast/CHANGELOG.md
@@ -1,3 +1,47 @@
+1.0.0-b34
+
+* Fix and tidy up CMake build scripts
+
+--------------------------------------------------------------------------------
+
+1.0.0-b33
+
+* Require Visual Studio 2015 Update 3 or later
+
+HTTP
+
+* Use fwrite return value in file_body
+
+WebSocket
+
+* Set internal state correctly when writing frames
+* Add decorator unit test
+* Add write_frames unit test
+
+--------------------------------------------------------------------------------
+
+1.0.0-b32
+
+* Add io_service completion invariants test
+* Update CMake scripts for finding packages
+
+API Changes:
+
+* Remove http Writer suspend and resume feature
+
+--------------------------------------------------------------------------------
+
+1.0.0-b31
+
+* Tidy up build settings
+* Add missing dynabuf_readstream member
+
+WebSocket
+
+* Move the handler, don't copy it
+
+--------------------------------------------------------------------------------
+
1.0.0-b30
WebSocket
diff --git a/src/beast/CMakeLists.txt b/src/beast/CMakeLists.txt
index 61a243c03..c82014589 100644
--- a/src/beast/CMakeLists.txt
+++ b/src/beast/CMakeLists.txt
@@ -1,6 +1,6 @@
# Part of Beast
-cmake_minimum_required (VERSION 3.2)
+cmake_minimum_required (VERSION 3.5.2)
project (Beast)
@@ -8,10 +8,13 @@ set_property (GLOBAL PROPERTY USE_FOLDERS ON)
if (MSVC)
# /wd4244 /wd4127
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /MP /W4 /wd4100 /bigobj /D _WIN32_WINNT=0x0601 /D _SCL_SECURE_NO_WARNINGS=1 /D _CRT_SECURE_NO_WARNINGS=1")
- set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd")
- set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /Oi /Ot /GL /MT")
- set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Oi /Ot /MT")
+ add_definitions (-D_WIN32_WINNT=0x0601)
+ add_definitions (-D_SCL_SECURE_NO_WARNINGS=1)
+ add_definitions (-D_CRT_SECURE_NO_WARNINGS=1)
+
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4100 /wd4244 /wd4251 /MP /W4 /bigobj")
+ set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /Oi /Ot /GL")
+ set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Oi /Ot")
set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
@@ -19,17 +22,12 @@ if (MSVC)
# for RelWithDebInfo builds, disable incremental linking
# since CMake sets it ON by default for that build type and it
# causes warnings
+ #
string (REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" replacement_flags
${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO})
set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${replacement_flags})
else()
- set(Boost_USE_STATIC_LIBS ON)
- set(Boost_USE_MULTITHREADED ON)
- find_package(Boost REQUIRED COMPONENTS coroutine context thread filesystem program_options system)
- include_directories(SYSTEM ${Boost_INCLUDE_DIRS})
- link_directories(${Boost_LIBRARY_DIR})
-
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads)
@@ -37,7 +35,42 @@ else()
"${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -Wpedantic -Wno-unused-parameter")
endif()
-add_definitions ("-DBOOST_COROUTINES_NO_DEPRECATION_WARNING")
+#-------------------------------------------------------------------------------
+#
+# Boost
+#
+
+option (Boost_USE_STATIC_LIBS "Use static libraries for boost" ON)
+
+set (Boost_NO_SYSTEM_PATHS ON)
+set (Boost_USE_MULTITHREADED ON)
+
+unset (Boost_INCLUDE_DIR CACHE)
+unset (Boost_LIBRARY_DIRS CACHE)
+find_package (Boost REQUIRED COMPONENTS
+ coroutine
+ context
+ filesystem
+ program_options
+ system
+ thread
+ )
+
+include_directories (SYSTEM ${Boost_INCLUDE_DIRS})
+link_libraries (${Boost_LIBRARIES})
+
+if (MSVC)
+ add_definitions (-DBOOST_ALL_NO_LIB) # disable autolinking
+elseif (MINGW)
+ link_libraries(ws2_32 mswsock)
+endif()
+
+add_definitions (-DBOOST_COROUTINES_NO_DEPRECATION_WARNING=1) # for asio
+
+#-------------------------------------------------------------------------------
+#
+# OpenSSL
+#
if (APPLE AND NOT DEFINED ENV{OPENSSL_ROOT_DIR})
find_program(HOMEBREW brew)
@@ -50,9 +83,29 @@ endif()
find_package(OpenSSL)
-if (MINGW)
- link_libraries(${Boost_LIBRARIES} ws2_32 mswsock)
-endif()
+#
+#-------------------------------------------------------------------------------
+
+function(DoGroupSources curdir rootdir folder)
+ file(GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*)
+ foreach(child ${children})
+ if(IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child})
+ DoGroupSources(${curdir}/${child} ${rootdir} ${folder})
+ elseif(${child} STREQUAL "CMakeLists.txt")
+ source_group("" FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
+ else()
+ string(REGEX REPLACE ^${rootdir} ${folder} groupname ${curdir})
+ string(REPLACE "/" "\\" groupname ${groupname})
+ source_group(${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
+ endif()
+ endforeach()
+endfunction()
+
+function(GroupSources curdir folder)
+ DoGroupSources(${curdir} ${curdir} ${folder})
+endfunction()
+
+#-------------------------------------------------------------------------------
if ("${VARIANT}" STREQUAL "coverage")
set(CMAKE_CXX_FLAGS
@@ -75,25 +128,6 @@ elseif ("${VARIANT}" STREQUAL "release")
set(CMAKE_BUILD_TYPE RELEASE)
endif()
-function(DoGroupSources curdir rootdir folder)
- file(GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*)
- foreach(child ${children})
- if(IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child})
- DoGroupSources(${curdir}/${child} ${rootdir} ${folder})
- elseif(${child} STREQUAL "CMakeLists.txt")
- source_group("" FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
- else()
- string(REGEX REPLACE ^${rootdir} ${folder} groupname ${curdir})
- string(REPLACE "/" "\\" groupname ${groupname})
- source_group(${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child})
- endif()
- endforeach()
-endfunction()
-
-function(GroupSources curdir folder)
- DoGroupSources(${curdir} ${curdir} ${folder})
-endfunction()
-
include_directories (extras)
include_directories (include)
diff --git a/src/beast/Jamroot b/src/beast/Jamroot
index 543305236..277100ab2 100644
--- a/src/beast/Jamroot
+++ b/src/beast/Jamroot
@@ -93,19 +93,20 @@ project beast
/boost/filesystem//boost_filesystem
/boost/program_options//boost_program_options
BOOST_ALL_NO_LIB=1
+ BOOST_COROUTINES_NO_DEPRECATION_WARNING=1
multi
shared
on
gcc:-std=c++11
gcc:-Wno-unused-parameter
+ gcc:-Wno-unused-variable # Temporary until we can figure out -isystem
clang:-std=c++11
clang:-Wno-unused-parameter
- gcc:-Wno-unused-variable # Temporary until we can figure out -isystem
clang:-Wno-unused-variable # Temporary until we can figure out -isystem
msvc:_SCL_SECURE_NO_WARNINGS=1
msvc:_CRT_SECURE_NO_WARNINGS=1
- msvc:"/wd4100 /bigobj"
- msvc,release:"/Ob2 /Oi /Ot"
+ msvc:"/wd4100 /wd4251 /bigobj"
+ msvc:release:"/Ob2 /Oi /Ot"
LINUX:_XOPEN_SOURCE=600
LINUX:_GNU_SOURCE=1
SOLARIS:_XOPEN_SOURCE=500
diff --git a/src/beast/README.md b/src/beast/README.md
index ef9b317d7..1dcf4b52a 100644
--- a/src/beast/README.md
+++ b/src/beast/README.md
@@ -1,12 +1,7 @@
-[](https://gitter.im/vinniefalco/Beast?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [![Build Status]
-(https://travis-ci.org/vinniefalco/Beast.svg?branch=master)](https://travis-ci.org/vinniefalco/Beast) [![codecov]
-(https://codecov.io/gh/vinniefalco/Beast/branch/master/graph/badge.svg)](https://codecov.io/gh/vinniefalco/Beast) [![coveralls]
-(https://coveralls.io/repos/github/vinniefalco/Beast/badge.svg?branch=master)](https://coveralls.io/github/vinniefalco/Beast?branch=master) [![Documentation]
-(https://img.shields.io/badge/documentation-master-brightgreen.svg)](http://vinniefalco.github.io/beast/) [![License]
-(https://img.shields.io/badge/license-boost-brightgreen.svg)](LICENSE_1_0.txt)
+[](https://gitter.im/vinniefalco/Beast?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://travis-ci.org/vinniefalco/Beast) [](https://codecov.io/gh/vinniefalco/Beast) [](https://coveralls.io/github/vinniefalco/Beast?branch=master) [](http://vinniefalco.github.io/beast/) [](LICENSE_1_0.txt)
# HTTP and WebSocket built on Boost.Asio in C++11
@@ -78,9 +73,17 @@ The library has been submitted to the
## Requirements
-* Boost 1.58 or higher
-* C++11 or greater
+* Boost 1.58 or later
+* C++11 or later
+
+When using Microsoft Visual C++, Visual Studio 2015 Update 3 or later is required.
+
+These components are optionally required in order to build the
+tests and examples:
+
* OpenSSL (optional)
+* CMake 3.7.2 or later (optional)
+* Properly configured bjam/b2 (optional)
## Building
@@ -102,19 +105,27 @@ Boost.Coroutine library. Please visit the Boost documentation for
instructions on how to do this for your particular build system.
For the examples and tests, Beast provides build scripts for Boost.Build (bjam)
-and CMake. Developers using Microsoft Visual Studio can generate Visual Studio
+and CMake. It is possible to generate Microsoft Visual Studio or Apple
+Developers using Microsoft Visual Studio can generate Visual Studio
project files by executing these commands from the root of the repository:
-
```
cd bin
-cmake .. # for 32-bit Windows build
+cmake .. # for 32-bit Windows builds
cd ../bin64
cmake .. # for Linux/Mac builds, OR
cmake -G"Visual Studio 14 2015 Win64" .. # for 64-bit Windows builds
```
+When using Apple Xcode it is possible to generate Xcode project files
+using these commands:
+
+```
+cd bin
+cmake -G Xcode .. # for Apple Xcode builds
+```
+
To build with Boost.Build, it is necessary to have the bjam executable
in your path. And bjam needs to know how to find the Boost sources. The
easiest way to do this is make sure that the version of bjam in your path
diff --git a/src/beast/doc/quickref.xml b/src/beast/doc/quickref.xml
index 96002191c..874c5a693 100644
--- a/src/beast/doc/quickref.xml
+++ b/src/beast/doc/quickref.xml
@@ -42,7 +42,6 @@
request_header
response
response_header
- resume_context
streambuf_body
string_body
@@ -190,6 +189,7 @@
buffer_cat
prepare_buffer
prepare_buffers
+ system_category
to_string
write
diff --git a/src/beast/doc/types/Writer.qbk b/src/beast/doc/types/Writer.qbk
index 90d4e6e39..aef4601ce 100644
--- a/src/beast/doc/types/Writer.qbk
+++ b/src/beast/doc/types/Writer.qbk
@@ -28,8 +28,6 @@ In this table:
* `m` denotes a value of type `message const&` where
`std::is_same:value == true`.
-* `rc` is an object of type [link beast.ref.http__resume_context `resume_context`].
-
* `ec` is a value of type [link beast.ref.error_code `error_code&`]
* `wf` is a [*write function]: a function object of unspecified type provided
@@ -72,8 +70,8 @@ In this table:
]
]
[
- [`a.write(rc, ec, wf)`]
- [`boost::tribool`]
+ [`a.write(ec, wf)`]
+ [`bool`]
[
Called repeatedly after `init` succeeds. `wf` is a function object
which takes as its single parameter any value meeting the requirements
@@ -81,12 +79,7 @@ In this table:
must remain valid until the next member function of `writer` is
invoked (which may be the destructor). This function returns `true`
to indicate all message body data has been written, or `false` if
- there is more body data. If the return value is `boost::indeterminate`,
- the implementation will suspend the operation until the writer invokes
- `rc`. It is the writers responsibility when returning
- `boost::indeterminate`, to acquire ownership of `rc` via move
- construction and eventually call it or else undefined behavior
- results. This function must be `noexcept`.
+ there is more body data.
]
]
]
@@ -139,7 +132,6 @@ public:
Postconditions:
If return value is `true`:
- * Callee does not take ownership of resume.
* Callee made zero or one calls to `write`.
* There is no more data remaining to write.
@@ -147,18 +139,6 @@ public:
* Callee does not take ownership of resume.
* Callee made one call to `write`.
- If return value is boost::indeterminate:
- * Callee takes ownership of `resume`.
- * Caller suspends the write operation
- until `resume` is invoked.
-
- When the caller takes ownership of resume, the
- asynchronous operation will not complete until the
- caller destroys the object.
-
- @param resume A functor to call to resume the write operation
- after the writer has returned boost::indeterminate.
-
@param ec Set to indicate an error. This will cause an
asynchronous write operation to complete with the error.
@@ -167,17 +147,12 @@ public:
the writer must guarantee that the buffers remain valid until the
next member function is invoked, which may be the destructor.
- @return `true` if there is no more data to send,
- `false` when there may be more data,
- boost::indeterminate to suspend.
-
- @note Undefined behavior if the callee takes ownership
- of resume but does not return boost::indeterminate.
+ @return `true` if there is no more data to send,
+ `false` when there may be more data.
*/
template
- boost::tribool
+ bool
write(
- resume_context&&,
error_code&,
WriteFunction&& wf) noexcept;
};
diff --git a/src/beast/examples/CMakeLists.txt b/src/beast/examples/CMakeLists.txt
index 6d9e8edb3..edb8e3339 100644
--- a/src/beast/examples/CMakeLists.txt
+++ b/src/beast/examples/CMakeLists.txt
@@ -15,6 +15,8 @@ add_executable (http-crawl
if (NOT WIN32)
target_link_libraries(http-crawl ${Boost_LIBRARIES} Threads::Threads)
+else()
+ target_link_libraries(http-crawl ${Boost_LIBRARIES})
endif()
add_executable (http-server
@@ -29,8 +31,11 @@ add_executable (http-server
if (NOT WIN32)
target_link_libraries(http-server ${Boost_LIBRARIES} Threads::Threads)
+else()
+ target_link_libraries(http-server ${Boost_LIBRARIES})
endif()
+
add_executable (http-example
${BEAST_INCLUDES}
${EXTRAS_INCLUDES}
@@ -39,8 +44,11 @@ add_executable (http-example
if (NOT WIN32)
target_link_libraries(http-example ${Boost_LIBRARIES} Threads::Threads)
+else()
+ target_link_libraries(http-example ${Boost_LIBRARIES})
endif()
+
add_executable (websocket-echo
${BEAST_INCLUDES}
websocket_async_echo_server.hpp
@@ -50,8 +58,11 @@ add_executable (websocket-echo
if (NOT WIN32)
target_link_libraries(websocket-echo ${Boost_LIBRARIES} Threads::Threads)
+else()
+ target_link_libraries(websocket-echo ${Boost_LIBRARIES})
endif()
+
add_executable (websocket-example
${BEAST_INCLUDES}
${EXTRAS_INCLUDES}
@@ -60,4 +71,6 @@ add_executable (websocket-example
if (NOT WIN32)
target_link_libraries(websocket-example ${Boost_LIBRARIES} Threads::Threads)
+else()
+ target_link_libraries(websocket-example ${Boost_LIBRARIES})
endif()
diff --git a/src/beast/examples/file_body.hpp b/src/beast/examples/file_body.hpp
index 8aef3f2de..00f2b5434 100644
--- a/src/beast/examples/file_body.hpp
+++ b/src/beast/examples/file_body.hpp
@@ -10,10 +10,9 @@
#include
#include
-#include
#include
+#include
#include
-#include
#include
#include
@@ -38,7 +37,8 @@ struct file_body
writer& operator=(writer const&) = delete;
template
- writer(message const& m) noexcept
+ writer(message const& m) noexcept
: path_(m.body)
{
}
@@ -54,8 +54,8 @@ struct file_body
{
file_ = fopen(path_.c_str(), "rb");
if(! file_)
- ec = boost::system::errc::make_error_code(
- static_cast(errno));
+ ec = error_code{errno,
+ system_category()};
else
size_ = boost::filesystem::file_size(path_);
}
@@ -67,19 +67,25 @@ struct file_body
}
template
- boost::tribool
- write(resume_context&&, error_code&,
- WriteFunction&& wf) noexcept
+ bool
+ write(error_code& ec, WriteFunction&& wf) noexcept
{
if(size_ - offset_ < sizeof(buf_))
buf_len_ = static_cast(
size_ - offset_);
else
buf_len_ = sizeof(buf_);
- auto const nread = fread(buf_, 1, sizeof(buf_), file_);
- (void)nread;
- offset_ += buf_len_;
- wf(boost::asio::buffer(buf_, buf_len_));
+ auto const nread = fread(
+ buf_, 1, sizeof(buf_), file_);
+ if(ferror(file_))
+ {
+ ec = error_code(errno,
+ system_category());
+ return true;
+ }
+ BOOST_ASSERT(nread != 0);
+ offset_ += nread;
+ wf(boost::asio::buffer(buf_, nread));
return offset_ >= size_;
}
};
diff --git a/src/beast/include/beast/config.hpp b/src/beast/include/beast/config.hpp
new file mode 100644
index 000000000..b87262c77
--- /dev/null
+++ b/src/beast/include/beast/config.hpp
@@ -0,0 +1,27 @@
+//
+// Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
+//
+// Distributed under the Boost Software License, Version 1.0. (See accompanying
+// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+
+#ifndef BEAST_CONFIG_HPP
+#define BEAST_CONFIG_HPP
+
+/*
+ _MSC_VER and _MSC_FULL_VER by version:
+
+ 14.0 (2015) 1900 190023026
+ 14.0 (2015 Update 1) 1900 190023506
+ 14.0 (2015 Update 2) 1900 190023918
+ 14.0 (2015 Update 3) 1900 190024210
+*/
+
+#if defined(_MSC_FULL_VER)
+#if _MSC_FULL_VER < 190024210
+static_assert(false,
+ "This library requires Visual Studio 2015 Update 3 or later");
+#endif
+#endif
+
+#endif
diff --git a/src/beast/include/beast/core.hpp b/src/beast/include/beast/core.hpp
index ed777e54b..9377cd99f 100644
--- a/src/beast/include/beast/core.hpp
+++ b/src/beast/include/beast/core.hpp
@@ -8,6 +8,8 @@
#ifndef BEAST_CORE_HPP
#define BEAST_CORE_HPP
+#include
+
#include
#include
#include
diff --git a/src/beast/include/beast/core/async_completion.hpp b/src/beast/include/beast/core/async_completion.hpp
index af5c67d2c..8c7f64d9f 100644
--- a/src/beast/include/beast/core/async_completion.hpp
+++ b/src/beast/include/beast/core/async_completion.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_ASYNC_COMPLETION_HPP
#define BEAST_ASYNC_COMPLETION_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/bind_handler.hpp b/src/beast/include/beast/core/bind_handler.hpp
index a9094abb4..1b2d11daf 100644
--- a/src/beast/include/beast/core/bind_handler.hpp
+++ b/src/beast/include/beast/core/bind_handler.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_BIND_HANDLER_HPP
#define BEAST_BIND_HANDLER_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/buffer_cat.hpp b/src/beast/include/beast/core/buffer_cat.hpp
index cd2062621..a0c892a71 100644
--- a/src/beast/include/beast/core/buffer_cat.hpp
+++ b/src/beast/include/beast/core/buffer_cat.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_BUFFER_CAT_HPP
#define BEAST_BUFFER_CAT_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/buffer_concepts.hpp b/src/beast/include/beast/core/buffer_concepts.hpp
index 5348724b0..545689eb3 100644
--- a/src/beast/include/beast/core/buffer_concepts.hpp
+++ b/src/beast/include/beast/core/buffer_concepts.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_BUFFER_CONCEPTS_HPP
#define BEAST_BUFFER_CONCEPTS_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/buffers_adapter.hpp b/src/beast/include/beast/core/buffers_adapter.hpp
index 9dadf7f13..36220d056 100644
--- a/src/beast/include/beast/core/buffers_adapter.hpp
+++ b/src/beast/include/beast/core/buffers_adapter.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_BUFFERS_ADAPTER_HPP
#define BEAST_BUFFERS_ADAPTER_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/consuming_buffers.hpp b/src/beast/include/beast/core/consuming_buffers.hpp
index 8e09ac584..4d8d42a64 100644
--- a/src/beast/include/beast/core/consuming_buffers.hpp
+++ b/src/beast/include/beast/core/consuming_buffers.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_CONSUMING_BUFFERS_HPP
#define BEAST_CONSUMING_BUFFERS_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/dynabuf_readstream.hpp b/src/beast/include/beast/core/dynabuf_readstream.hpp
index 44501a658..e914d434d 100644
--- a/src/beast/include/beast/core/dynabuf_readstream.hpp
+++ b/src/beast/include/beast/core/dynabuf_readstream.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_DYNABUF_READSTREAM_HPP
#define BEAST_DYNABUF_READSTREAM_HPP
+#include
#include
#include
#include
@@ -145,6 +146,13 @@ public:
return next_layer_;
}
+ /// Get a const reference to the next layer.
+ next_layer_type const&
+ next_layer() const
+ {
+ return next_layer_;
+ }
+
/// Get a reference to the lowest layer.
lowest_layer_type&
lowest_layer()
diff --git a/src/beast/include/beast/core/error.hpp b/src/beast/include/beast/core/error.hpp
index f94e52b5c..b8c78687c 100644
--- a/src/beast/include/beast/core/error.hpp
+++ b/src/beast/include/beast/core/error.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_ERROR_HPP
#define BEAST_ERROR_HPP
+#include
#include
#include
@@ -22,6 +23,14 @@ using system_error = boost::system::system_error;
/// The type of error category used by the library
using error_category = boost::system::error_category;
+/// A function to return the system error category used by the library
+#if GENERATING_DOCS
+error_category const&
+system_category();
+#else
+using boost::system::system_category;
+#endif
+
/// The type of error condition used by the library
using error_condition = boost::system::error_condition;
diff --git a/src/beast/include/beast/core/handler_alloc.hpp b/src/beast/include/beast/core/handler_alloc.hpp
index 4037efc51..08a395c3e 100644
--- a/src/beast/include/beast/core/handler_alloc.hpp
+++ b/src/beast/include/beast/core/handler_alloc.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HANDLER_ALLOC_HPP
#define BEAST_HANDLER_ALLOC_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/handler_concepts.hpp b/src/beast/include/beast/core/handler_concepts.hpp
index 2e3854d37..e118072ae 100644
--- a/src/beast/include/beast/core/handler_concepts.hpp
+++ b/src/beast/include/beast/core/handler_concepts.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HANDLER_CONCEPTS_HPP
#define BEAST_HANDLER_CONCEPTS_HPP
+#include
#include
#include
diff --git a/src/beast/include/beast/core/handler_helpers.hpp b/src/beast/include/beast/core/handler_helpers.hpp
index 2ff589ad4..53112e7f1 100644
--- a/src/beast/include/beast/core/handler_helpers.hpp
+++ b/src/beast/include/beast/core/handler_helpers.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HANDLER_HELPERS_HPP
#define BEAST_HANDLER_HELPERS_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/handler_ptr.hpp b/src/beast/include/beast/core/handler_ptr.hpp
index 46dc5265c..52650656e 100644
--- a/src/beast/include/beast/core/handler_ptr.hpp
+++ b/src/beast/include/beast/core/handler_ptr.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HANDLER_PTR_HPP
#define BEAST_HANDLER_PTR_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/placeholders.hpp b/src/beast/include/beast/core/placeholders.hpp
index 5272bb28e..c11277893 100644
--- a/src/beast/include/beast/core/placeholders.hpp
+++ b/src/beast/include/beast/core/placeholders.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_PLACEHOLDERS_HPP
#define BEAST_PLACEHOLDERS_HPP
+#include
#include
namespace beast {
diff --git a/src/beast/include/beast/core/prepare_buffer.hpp b/src/beast/include/beast/core/prepare_buffer.hpp
index 2d05aa316..ab0fae645 100644
--- a/src/beast/include/beast/core/prepare_buffer.hpp
+++ b/src/beast/include/beast/core/prepare_buffer.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_PREPARE_BUFFER_HPP
#define BEAST_PREPARE_BUFFER_HPP
+#include
#include
#include
diff --git a/src/beast/include/beast/core/prepare_buffers.hpp b/src/beast/include/beast/core/prepare_buffers.hpp
index 4f1d6f1aa..7db31b5b8 100644
--- a/src/beast/include/beast/core/prepare_buffers.hpp
+++ b/src/beast/include/beast/core/prepare_buffers.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_PREPARE_BUFFERS_HPP
#define BEAST_PREPARE_BUFFERS_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/static_streambuf.hpp b/src/beast/include/beast/core/static_streambuf.hpp
index 748111b02..75ced50a3 100644
--- a/src/beast/include/beast/core/static_streambuf.hpp
+++ b/src/beast/include/beast/core/static_streambuf.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_STATIC_STREAMBUF_HPP
#define BEAST_STATIC_STREAMBUF_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/static_string.hpp b/src/beast/include/beast/core/static_string.hpp
index 96e842ef1..6ba5332ca 100644
--- a/src/beast/include/beast/core/static_string.hpp
+++ b/src/beast/include/beast/core/static_string.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_WEBSOCKET_STATIC_STRING_HPP
#define BEAST_WEBSOCKET_STATIC_STRING_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/stream_concepts.hpp b/src/beast/include/beast/core/stream_concepts.hpp
index 6e7765736..5f0ba3adf 100644
--- a/src/beast/include/beast/core/stream_concepts.hpp
+++ b/src/beast/include/beast/core/stream_concepts.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_STREAM_CONCEPTS_HPP
#define BEAST_STREAM_CONCEPTS_HPP
+#include
#include
#include
diff --git a/src/beast/include/beast/core/streambuf.hpp b/src/beast/include/beast/core/streambuf.hpp
index 3683f68a9..537094c1a 100644
--- a/src/beast/include/beast/core/streambuf.hpp
+++ b/src/beast/include/beast/core/streambuf.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_STREAMBUF_HPP
#define BEAST_STREAMBUF_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/to_string.hpp b/src/beast/include/beast/core/to_string.hpp
index 110022e0c..e391ea2d5 100644
--- a/src/beast/include/beast/core/to_string.hpp
+++ b/src/beast/include/beast/core/to_string.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_TO_STRING_HPP
#define BEAST_TO_STRING_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/core/write_dynabuf.hpp b/src/beast/include/beast/core/write_dynabuf.hpp
index 54c365a53..646e78749 100644
--- a/src/beast/include/beast/core/write_dynabuf.hpp
+++ b/src/beast/include/beast/core/write_dynabuf.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_WRITE_DYNABUF_HPP
#define BEAST_WRITE_DYNABUF_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/http.hpp b/src/beast/include/beast/http.hpp
index dcb327918..b4c7734f1 100644
--- a/src/beast/include/beast/http.hpp
+++ b/src/beast/include/beast/http.hpp
@@ -8,6 +8,8 @@
#ifndef BEAST_HTTP_HPP
#define BEAST_HTTP_HPP
+#include
+
#include
#include
#include
@@ -19,7 +21,6 @@
#include
#include
#include
-#include
#include
#include
#include
diff --git a/src/beast/include/beast/http/basic_dynabuf_body.hpp b/src/beast/include/beast/http/basic_dynabuf_body.hpp
index cdae120aa..a2c090149 100644
--- a/src/beast/include/beast/http/basic_dynabuf_body.hpp
+++ b/src/beast/include/beast/http/basic_dynabuf_body.hpp
@@ -8,12 +8,11 @@
#ifndef BEAST_HTTP_BASIC_DYNABUF_BODY_HPP
#define BEAST_HTTP_BASIC_DYNABUF_BODY_HPP
+#include
#include
#include
-#include
#include
#include
-#include
namespace beast {
namespace http {
@@ -87,9 +86,8 @@ private:
}
template
- boost::tribool
- write(resume_context&&, error_code&,
- WriteFunction&& wf) noexcept
+ bool
+ write(error_code&, WriteFunction&& wf) noexcept
{
wf(body_.data());
return true;
diff --git a/src/beast/include/beast/http/basic_fields.hpp b/src/beast/include/beast/http/basic_fields.hpp
index 30913c8fe..2589c827a 100644
--- a/src/beast/include/beast/http/basic_fields.hpp
+++ b/src/beast/include/beast/http/basic_fields.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_BASIC_FIELDS_HPP
#define BEAST_HTTP_BASIC_FIELDS_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/http/basic_parser_v1.hpp b/src/beast/include/beast/http/basic_parser_v1.hpp
index 939cf2c63..cda14a002 100644
--- a/src/beast/include/beast/http/basic_parser_v1.hpp
+++ b/src/beast/include/beast/http/basic_parser_v1.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_BASIC_PARSER_v1_HPP
#define BEAST_HTTP_BASIC_PARSER_v1_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/http/chunk_encode.hpp b/src/beast/include/beast/http/chunk_encode.hpp
index fabdd1b56..a437fe183 100644
--- a/src/beast/include/beast/http/chunk_encode.hpp
+++ b/src/beast/include/beast/http/chunk_encode.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_CHUNK_ENCODE_HPP
#define BEAST_HTTP_CHUNK_ENCODE_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/http/concepts.hpp b/src/beast/include/beast/http/concepts.hpp
index 9d43080cf..2e83fe7a4 100644
--- a/src/beast/include/beast/http/concepts.hpp
+++ b/src/beast/include/beast/http/concepts.hpp
@@ -8,11 +8,10 @@
#ifndef BEAST_HTTP_TYPE_CHECK_HPP
#define BEAST_HTTP_TYPE_CHECK_HPP
+#include
#include
#include
-#include
#include
-#include
#include
#include
@@ -50,38 +49,6 @@ struct has_content_length>
-struct is_Writer : std::false_type {};
-
-template
-struct is_Writer().init(
- std::declval())
- // VFALCO This is unfortunate, we have to provide the template
- // argument type because this is not a deduced context?
- //
- ,std::declval().template write(
- std::declval(),
- std::declval(),
- std::declval())
- )> > : std::integral_constant::value &&
- std::is_convertible().template write(
- std::declval(),
- std::declval(),
- std::declval())),
- boost::tribool>::value
- >
-{
- static_assert(std::is_same<
- typename M::body_type::writer, T>::value,
- "Mismatched writer and message");
-};
-
-#else
-
template
class is_Writer
{
@@ -99,10 +66,9 @@ class is_Writer
template().template write(
- std::declval(),
std::declval(),
std::declval()))
- , boost::tribool>>
+ , bool>>
static R check2(int);
template
static std::false_type check2(...);
@@ -120,8 +86,6 @@ public:
>;
};
-#endif
-
template
class is_Parser
{
diff --git a/src/beast/include/beast/http/empty_body.hpp b/src/beast/include/beast/http/empty_body.hpp
index a1efddc29..40f549d9f 100644
--- a/src/beast/include/beast/http/empty_body.hpp
+++ b/src/beast/include/beast/http/empty_body.hpp
@@ -8,12 +8,11 @@
#ifndef BEAST_HTTP_EMPTY_BODY_HPP
#define BEAST_HTTP_EMPTY_BODY_HPP
+#include
#include
#include
-#include
#include
#include
-#include
#include
#include
@@ -59,9 +58,8 @@ private:
}
template
- boost::tribool
- write(resume_context&&, error_code&,
- WriteFunction&& wf) noexcept
+ bool
+ write(error_code&, WriteFunction&& wf) noexcept
{
wf(boost::asio::null_buffers{});
return true;
diff --git a/src/beast/include/beast/http/fields.hpp b/src/beast/include/beast/http/fields.hpp
index 649fbf779..7c2ef2a59 100644
--- a/src/beast/include/beast/http/fields.hpp
+++ b/src/beast/include/beast/http/fields.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_FIELDS_HPP
#define BEAST_HTTP_FIELDS_HPP
+#include
#include
#include
diff --git a/src/beast/include/beast/http/header_parser_v1.hpp b/src/beast/include/beast/http/header_parser_v1.hpp
index 40f532054..c6f732d21 100644
--- a/src/beast/include/beast/http/header_parser_v1.hpp
+++ b/src/beast/include/beast/http/header_parser_v1.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_HEADERS_PARSER_V1_HPP
#define BEAST_HTTP_HEADERS_PARSER_V1_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/http/impl/write.ipp b/src/beast/include/beast/http/impl/write.ipp
index 7e97eebd4..a6e640254 100644
--- a/src/beast/include/beast/http/impl/write.ipp
+++ b/src/beast/include/beast/http/impl/write.ipp
@@ -9,7 +9,6 @@
#define BEAST_HTTP_IMPL_WRITE_IPP
#include
-#include
#include
#include
#include
@@ -21,7 +20,6 @@
#include
#include
#include
-#include
#include
#include
#include
@@ -296,8 +294,6 @@ class write_op
// VFALCO How do we use handler_alloc in write_preparation?
write_preparation<
isRequest, Body, Fields> wp;
- resume_context resume;
- resume_context copy;
int state = 0;
data(Handler& handler, Stream& s_,
@@ -375,27 +371,9 @@ public:
: d_(std::forward(h),
s, std::forward(args)...)
{
- auto& d = *d_;
- auto sp = d_;
- d.resume = {
- [sp]() mutable
- {
- write_op self{std::move(sp)};
- self.d_->cont = false;
- auto& ios = self.d_->s.get_io_service();
- ios.dispatch(bind_handler(std::move(self),
- error_code{}, 0, false));
- }};
- d.copy = d.resume;
(*this)(error_code{}, 0, false);
}
- explicit
- write_op(handler_ptr d)
- : d_(std::move(d))
- {
- }
-
void
operator()(error_code ec,
std::size_t bytes_transferred, bool again = true);
@@ -460,8 +438,9 @@ operator()(error_code ec, std::size_t, bool again)
case 1:
{
- boost::tribool const result = d.wp.w.write(
- std::move(d.copy), ec, writef0_lambda{*this});
+ auto const result =
+ d.wp.w.write(ec,
+ writef0_lambda{*this});
if(ec)
{
// call handler
@@ -470,12 +449,6 @@ operator()(error_code ec, std::size_t, bool again)
std::move(*this), ec, false));
return;
}
- if(boost::indeterminate(result))
- {
- // suspend
- d.copy = d.resume;
- return;
- }
if(result)
d.state = d.wp.chunked ? 4 : 5;
else
@@ -491,20 +464,15 @@ operator()(error_code ec, std::size_t, bool again)
case 3:
{
- boost::tribool result = d.wp.w.write(
- std::move(d.copy), ec, writef_lambda{*this});
+ auto const result =
+ d.wp.w.write(ec,
+ writef_lambda{*this});
if(ec)
{
// call handler
d.state = 99;
break;
}
- if(boost::indeterminate(result))
- {
- // suspend
- d.copy = d.resume;
- return;
- }
if(result)
d.state = d.wp.chunked ? 4 : 5;
else
@@ -533,8 +501,6 @@ operator()(error_code ec, std::size_t, bool again)
break;
}
}
- d.copy = {};
- d.resume = {};
d_.invoke(ec);
}
@@ -640,37 +606,12 @@ write(SyncWriteStream& stream,
wp.init(ec);
if(ec)
return;
- std::mutex m;
- std::condition_variable cv;
- bool ready = false;
- resume_context resume{
- [&]
- {
- std::lock_guard lock(m);
- ready = true;
- cv.notify_one();
- }};
- auto copy = resume;
- boost::tribool result =
- wp.w.write(std::move(copy), ec,
- detail::writef0_lambda{stream,
- wp.sb, wp.chunked, ec});
+ auto result = wp.w.write(
+ ec, detail::writef0_lambda<
+ SyncWriteStream, decltype(wp.sb)>{
+ stream, wp.sb, wp.chunked, ec});
if(ec)
return;
- if(boost::indeterminate(result))
- {
- copy = resume;
- {
- std::unique_lock lock(m);
- cv.wait(lock, [&]{ return ready; });
- ready = false;
- }
- boost::asio::write(stream, wp.sb.data(), ec);
- if(ec)
- return;
- result = false;
- }
wp.sb.consume(wp.sb.size());
if(! result)
{
@@ -678,17 +619,11 @@ write(SyncWriteStream& stream,
stream, wp.chunked, ec};
for(;;)
{
- result = wp.w.write(std::move(copy), ec, wf);
+ result = wp.w.write(ec, wf);
if(ec)
return;
if(result)
break;
- if(! result)
- continue;
- copy = resume;
- std::unique_lock lock(m);
- cv.wait(lock, [&]{ return ready; });
- ready = false;
}
}
if(wp.chunked)
diff --git a/src/beast/include/beast/http/message.hpp b/src/beast/include/beast/http/message.hpp
index 51cd8ae6c..70cfbf19c 100644
--- a/src/beast/include/beast/http/message.hpp
+++ b/src/beast/include/beast/http/message.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_MESSAGE_HPP
#define BEAST_HTTP_MESSAGE_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/http/parse.hpp b/src/beast/include/beast/http/parse.hpp
index b99fb57fd..bcc8b0f52 100644
--- a/src/beast/include/beast/http/parse.hpp
+++ b/src/beast/include/beast/http/parse.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_PARSE_HPP
#define BEAST_HTTP_PARSE_HPP
+#include
#include
#include
diff --git a/src/beast/include/beast/http/parse_error.hpp b/src/beast/include/beast/http/parse_error.hpp
index 3dfcc0372..7b0dc08c0 100644
--- a/src/beast/include/beast/http/parse_error.hpp
+++ b/src/beast/include/beast/http/parse_error.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_PARSE_ERROR_HPP
#define BEAST_HTTP_PARSE_ERROR_HPP
+#include
#include
namespace beast {
diff --git a/src/beast/include/beast/http/parser_v1.hpp b/src/beast/include/beast/http/parser_v1.hpp
index a86ac0503..be1aed1e2 100644
--- a/src/beast/include/beast/http/parser_v1.hpp
+++ b/src/beast/include/beast/http/parser_v1.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_PARSER_V1_HPP
#define BEAST_HTTP_PARSER_V1_HPP
+#include
#include
#include
#include
diff --git a/src/beast/include/beast/http/read.hpp b/src/beast/include/beast/http/read.hpp
index 598180362..54dd57963 100644
--- a/src/beast/include/beast/http/read.hpp
+++ b/src/beast/include/beast/http/read.hpp
@@ -8,6 +8,7 @@
#ifndef BEAST_HTTP_READ_HPP
#define BEAST_HTTP_READ_HPP
+#include
#include
#include