On Mon, Jul 3, 2017 at 4:23 PM, Peter Dimov via Boost
Every request will need a method and a target, so having to call members to set them feels unnecessary. A constructor ought to have been provided. will fix
the drain loop is basically a requirement for every correct program, so it should have been encapsulated into a helper function. (Even though the example as written does illustrate the use of a drain_buffer.) will fix
I'm not particularly fond of the design decision to declare parts that in practice every user of the library will need as "out of scope".
The ASIO coupling did leave me with one question, whether it would be possible for the library to accommodate OS-specific file to socket transfers such as the one provided by TransmitFile:
https://msdn.microsoft.com/en-us/library/windows/desktop/ms740565(v=vs.85).a...
The answer is: YES.
I have developed a working prototype writing HTTP messages to streams
synchronously and asynchronously using ::TransmitFile. This is
accomplished by providing class file_body_win32 which becomes aliased
to file_body on Windows. Then, overloads of the write functions are
provided which work on messages with the file_body type. These write
functions require boost::asio::basic_stream_socket<Protocol> for the
stream, otherwise ::TransmitFile cannot be used as there is no native
SOCKET object available (the implementation resorts to the regular
write in this case).
This behavior is entirely transparent to users. You can declare:
http::request