summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/beast
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 18:45:59 +0000
commit19fcec84d8d7d21e796c7624e521b60d28ee21ed (patch)
tree42d26aa27d1e3f7c0b8bd3fd14e7d7082f5008dc /src/boost/libs/beast
parentInitial commit. (diff)
downloadceph-upstream.tar.xz
ceph-upstream.zip
Adding upstream version 16.2.11+ds.upstream/16.2.11+dsupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/boost/libs/beast')
-rw-r--r--src/boost/libs/beast/CHANGELOG.md3535
-rw-r--r--src/boost/libs/beast/CMakeLists.txt251
-rw-r--r--src/boost/libs/beast/CONTRIBUTING.md65
-rw-r--r--src/boost/libs/beast/Jamfile131
-rw-r--r--src/boost/libs/beast/LICENSE_1_0.txt23
-rw-r--r--src/boost/libs/beast/README.md277
-rw-r--r--src/boost/libs/beast/azure-pipelines.yml359
-rw-r--r--src/boost/libs/beast/example/CMakeLists.txt14
-rw-r--r--src/boost/libs/beast/example/Jamfile32
-rw-r--r--src/boost/libs/beast/example/advanced/CMakeLists.txt11
-rw-r--r--src/boost/libs/beast/example/advanced/Jamfile13
-rw-r--r--src/boost/libs/beast/example/advanced/server-flex/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/advanced/server-flex/Jamfile22
-rw-r--r--src/boost/libs/beast/example/advanced/server-flex/advanced_server_flex.cpp1030
-rw-r--r--src/boost/libs/beast/example/advanced/server/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/advanced/server/Jamfile15
-rw-r--r--src/boost/libs/beast/example/advanced/server/advanced_server.cpp700
-rw-r--r--src/boost/libs/beast/example/common/root_certificates.hpp151
-rw-r--r--src/boost/libs/beast/example/common/server_certificate.hpp124
-rw-r--r--src/boost/libs/beast/example/echo-op/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/echo-op/Jamfile15
-rw-r--r--src/boost/libs/beast/example/echo-op/echo_op.cpp377
-rw-r--r--src/boost/libs/beast/example/http/CMakeLists.txt11
-rw-r--r--src/boost/libs/beast/example/http/Jamfile11
-rw-r--r--src/boost/libs/beast/example/http/client/CMakeLists.txt20
-rw-r--r--src/boost/libs/beast/example/http/client/Jamfile18
-rw-r--r--src/boost/libs/beast/example/http/client/async-ssl-system-executor/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/client/async-ssl-system-executor/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/client/async-ssl-system-executor/http_client_async_ssl_system_executor.cpp246
-rw-r--r--src/boost/libs/beast/example/http/client/async-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/client/async-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/client/async-ssl/http_client_async_ssl.cpp244
-rw-r--r--src/boost/libs/beast/example/http/client/async/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/http/client/async/Jamfile15
-rw-r--r--src/boost/libs/beast/example/http/client/async/http_client_async.cpp189
-rw-r--r--src/boost/libs/beast/example/http/client/coro-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/client/coro-ssl/Jamfile23
-rw-r--r--src/boost/libs/beast/example/http/client/coro-ssl/http_client_coro_ssl.cpp180
-rw-r--r--src/boost/libs/beast/example/http/client/coro/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/http/client/coro/Jamfile16
-rw-r--r--src/boost/libs/beast/example/http/client/coro/http_client_coro.cpp144
-rw-r--r--src/boost/libs/beast/example/http/client/crawl/CMakeLists.txt26
-rw-r--r--src/boost/libs/beast/example/http/client/crawl/Jamfile16
-rw-r--r--src/boost/libs/beast/example/http/client/crawl/http_crawl.cpp409
-rw-r--r--src/boost/libs/beast/example/http/client/crawl/urls_large_data.cpp10021
-rw-r--r--src/boost/libs/beast/example/http/client/crawl/urls_large_data.hpp18
-rw-r--r--src/boost/libs/beast/example/http/client/sync-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/client/sync-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/client/sync-ssl/http_client_sync_ssl.cpp128
-rw-r--r--src/boost/libs/beast/example/http/client/sync/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/http/client/sync/Jamfile15
-rw-r--r--src/boost/libs/beast/example/http/client/sync/http_client_sync.cpp105
-rw-r--r--src/boost/libs/beast/example/http/server/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/http/server/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/server/async-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/server/async-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/server/async-ssl/http_server_async_ssl.cpp564
-rw-r--r--src/boost/libs/beast/example/http/server/async/CMakeLists.txt24
-rw-r--r--src/boost/libs/beast/example/http/server/async/Jamfile15
-rw-r--r--src/boost/libs/beast/example/http/server/async/http_server_async.cpp490
-rw-r--r--src/boost/libs/beast/example/http/server/coro-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/server/coro-ssl/Jamfile23
-rw-r--r--src/boost/libs/beast/example/http/server/coro-ssl/http_server_coro_ssl.cpp432
-rw-r--r--src/boost/libs/beast/example/http/server/coro/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/http/server/coro/Jamfile16
-rw-r--r--src/boost/libs/beast/example/http/server/coro/http_server_coro.cpp387
-rw-r--r--src/boost/libs/beast/example/http/server/fast/CMakeLists.txt26
-rw-r--r--src/boost/libs/beast/example/http/server/fast/Jamfile15
-rw-r--r--src/boost/libs/beast/example/http/server/fast/fields_alloc.hpp205
-rw-r--r--src/boost/libs/beast/example/http/server/fast/http_server_fast.cpp352
-rw-r--r--src/boost/libs/beast/example/http/server/flex/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/server/flex/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/server/flex/http_server_flex.cpp712
-rw-r--r--src/boost/libs/beast/example/http/server/small/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/http/server/small/Jamfile15
-rw-r--r--src/boost/libs/beast/example/http/server/small/http_server_small.cpp251
-rw-r--r--src/boost/libs/beast/example/http/server/stackless-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/server/stackless-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp560
-rw-r--r--src/boost/libs/beast/example/http/server/stackless/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/http/server/stackless/Jamfile15
-rw-r--r--src/boost/libs/beast/example/http/server/stackless/http_server_stackless.cpp493
-rw-r--r--src/boost/libs/beast/example/http/server/sync-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/http/server/sync-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/http/server/sync-ssl/http_server_sync_ssl.cpp356
-rw-r--r--src/boost/libs/beast/example/http/server/sync/CMakeLists.txt24
-rw-r--r--src/boost/libs/beast/example/http/server/sync/Jamfile15
-rw-r--r--src/boost/libs/beast/example/http/server/sync/http_server_sync.cpp335
-rw-r--r--src/boost/libs/beast/example/websocket/CMakeLists.txt11
-rw-r--r--src/boost/libs/beast/example/websocket/Jamfile11
-rw-r--r--src/boost/libs/beast/example/websocket/client/CMakeLists.txt19
-rw-r--r--src/boost/libs/beast/example/websocket/client/Jamfile18
-rw-r--r--src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/Jamfile22
-rw-r--r--src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/websocket_client_async_ssl_system_executor.cpp259
-rw-r--r--src/boost/libs/beast/example/websocket/client/async-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/client/async-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/websocket/client/async-ssl/websocket_client_async_ssl.cpp252
-rw-r--r--src/boost/libs/beast/example/websocket/client/async/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/client/async/Jamfile15
-rw-r--r--src/boost/libs/beast/example/websocket/client/async/websocket_client_async.cpp223
-rw-r--r--src/boost/libs/beast/example/websocket/client/coro-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/client/coro-ssl/Jamfile23
-rw-r--r--src/boost/libs/beast/example/websocket/client/coro-ssl/websocket_client_coro_ssl.cpp175
-rw-r--r--src/boost/libs/beast/example/websocket/client/coro/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/client/coro/Jamfile16
-rw-r--r--src/boost/libs/beast/example/websocket/client/coro/websocket_client_coro.cpp153
-rw-r--r--src/boost/libs/beast/example/websocket/client/sync-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/client/sync-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp116
-rw-r--r--src/boost/libs/beast/example/websocket/client/sync/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/client/sync/Jamfile15
-rw-r--r--src/boost/libs/beast/example/websocket/client/sync/websocket_client_sync.cpp105
-rw-r--r--src/boost/libs/beast/example/websocket/server/CMakeLists.txt22
-rw-r--r--src/boost/libs/beast/example/websocket/server/Jamfile21
-rw-r--r--src/boost/libs/beast/example/websocket/server/async-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/server/async-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/websocket/server/async-ssl/websocket_server_async_ssl.cpp317
-rw-r--r--src/boost/libs/beast/example/websocket/server/async/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/server/async/Jamfile15
-rw-r--r--src/boost/libs/beast/example/websocket/server/async/websocket_server_async.cpp281
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/CMakeLists.txt41
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/Jamfile19
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/beast.hpp19
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/chat_client.html60
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/http_session.cpp371
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/http_session.hpp48
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/listener.cpp101
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/listener.hpp42
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/main.cpp84
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/net.hpp18
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.cpp59
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.hpp48
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.cpp135
-rw-r--r--src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.hpp86
-rw-r--r--src/boost/libs/beast/example/websocket/server/coro-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/server/coro-ssl/Jamfile23
-rw-r--r--src/boost/libs/beast/example/websocket/server/coro-ssl/websocket_server_coro_ssl.cpp206
-rw-r--r--src/boost/libs/beast/example/websocket/server/coro/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/server/coro/Jamfile16
-rw-r--r--src/boost/libs/beast/example/websocket/server/coro/websocket_server_coro.cpp180
-rw-r--r--src/boost/libs/beast/example/websocket/server/fast/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/server/fast/Jamfile16
-rw-r--r--src/boost/libs/beast/example/websocket/server/fast/websocket_server_fast.cpp480
-rw-r--r--src/boost/libs/beast/example/websocket/server/stackless-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/server/stackless-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/websocket/server/stackless-ssl/websocket_server_stackless_ssl.cpp314
-rw-r--r--src/boost/libs/beast/example/websocket/server/stackless/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/server/stackless/Jamfile15
-rw-r--r--src/boost/libs/beast/example/websocket/server/stackless/websocket_server_stackless.cpp282
-rw-r--r--src/boost/libs/beast/example/websocket/server/sync-ssl/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/example/websocket/server/sync-ssl/Jamfile22
-rw-r--r--src/boost/libs/beast/example/websocket/server/sync-ssl/websocket_server_sync_ssl.cpp137
-rw-r--r--src/boost/libs/beast/example/websocket/server/sync/CMakeLists.txt23
-rw-r--r--src/boost/libs/beast/example/websocket/server/sync/Jamfile15
-rw-r--r--src/boost/libs/beast/example/websocket/server/sync/websocket_server_sync.cpp121
-rw-r--r--src/boost/libs/beast/index.html21
-rw-r--r--src/boost/libs/beast/meta/explicit-failures-markup.xml45
-rw-r--r--src/boost/libs/beast/meta/libraries.json15
-rw-r--r--src/boost/libs/beast/test/CMakeLists.txt60
-rw-r--r--src/boost/libs/beast/test/Jamfile76
-rw-r--r--src/boost/libs/beast/test/beast/CMakeLists.txt46
-rw-r--r--src/boost/libs/beast/test/beast/Jamfile45
-rw-r--r--src/boost/libs/beast/test/beast/_experimental/CMakeLists.txt27
-rw-r--r--src/boost/libs/beast/test/beast/_experimental/Jamfile38
-rw-r--r--src/boost/libs/beast/test/beast/_experimental/error.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/_experimental/icy_stream.cpp127
-rw-r--r--src/boost/libs/beast/test/beast/_experimental/stream.cpp156
-rw-r--r--src/boost/libs/beast/test/beast/core.cpp18
-rw-r--r--src/boost/libs/beast/test/beast/core/CMakeLists.txt76
-rw-r--r--src/boost/libs/beast/test/beast/core/Jamfile82
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_base64.cpp90
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_bind_continuation.cpp192
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_buffer.cpp83
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_clamp.cpp40
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_get_io_context.cpp56
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_is_invocable.cpp60
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_read.cpp111
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_sha1.cpp84
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_static_const.cpp44
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_tuple.cpp54
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_variant.cpp453
-rw-r--r--src/boost/libs/beast/test/beast/core/_detail_varint.cpp53
-rw-r--r--src/boost/libs/beast/test/beast/core/async_base.cpp762
-rw-r--r--src/boost/libs/beast/test/beast/core/basic_stream.cpp1316
-rw-r--r--src/boost/libs/beast/test/beast/core/bind_handler.cpp520
-rw-r--r--src/boost/libs/beast/test/beast/core/buffer_traits.cpp242
-rw-r--r--src/boost/libs/beast/test/beast/core/buffered_read_stream.cpp230
-rw-r--r--src/boost/libs/beast/test/beast/core/buffers_adapter.cpp23
-rw-r--r--src/boost/libs/beast/test/beast/core/buffers_adaptor.cpp174
-rw-r--r--src/boost/libs/beast/test/beast/core/buffers_cat.cpp333
-rw-r--r--src/boost/libs/beast/test/beast/core/buffers_prefix.cpp172
-rw-r--r--src/boost/libs/beast/test/beast/core/buffers_range.cpp95
-rw-r--r--src/boost/libs/beast/test/beast/core/buffers_suffix.cpp167
-rw-r--r--src/boost/libs/beast/test/beast/core/buffers_to_string.cpp37
-rw-r--r--src/boost/libs/beast/test/beast/core/close_socket.cpp39
-rw-r--r--src/boost/libs/beast/test/beast/core/detect_ssl.cpp181
-rw-r--r--src/boost/libs/beast/test/beast/core/error.cpp55
-rw-r--r--src/boost/libs/beast/test/beast/core/file.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/core/file_base.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/core/file_posix.cpp40
-rw-r--r--src/boost/libs/beast/test/beast/core/file_stdio.cpp40
-rw-r--r--src/boost/libs/beast/test/beast/core/file_test.hpp413
-rw-r--r--src/boost/libs/beast/test/beast/core/file_win32.cpp38
-rw-r--r--src/boost/libs/beast/test/beast/core/flat_buffer.cpp438
-rw-r--r--src/boost/libs/beast/test/beast/core/flat_static_buffer.cpp139
-rw-r--r--src/boost/libs/beast/test/beast/core/flat_stream.cpp222
-rw-r--r--src/boost/libs/beast/test/beast/core/make_printable.cpp66
-rw-r--r--src/boost/libs/beast/test/beast/core/make_strand.cpp49
-rw-r--r--src/boost/libs/beast/test/beast/core/multi_buffer.cpp830
-rw-r--r--src/boost/libs/beast/test/beast/core/ostream.cpp106
-rw-r--r--src/boost/libs/beast/test/beast/core/prepare_buffers.cpp12
-rw-r--r--src/boost/libs/beast/test/beast/core/rate_policy.cpp57
-rw-r--r--src/boost/libs/beast/test/beast/core/read_size.cpp50
-rw-r--r--src/boost/libs/beast/test/beast/core/role.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/core/saved_handler.cpp144
-rw-r--r--src/boost/libs/beast/test/beast/core/span.cpp62
-rw-r--r--src/boost/libs/beast/test/beast/core/static_buffer.cpp184
-rw-r--r--src/boost/libs/beast/test/beast/core/static_string.cpp1481
-rw-r--r--src/boost/libs/beast/test/beast/core/stream_tests.hpp107
-rw-r--r--src/boost/libs/beast/test/beast/core/stream_traits.cpp381
-rw-r--r--src/boost/libs/beast/test/beast/core/string.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/core/string_param.cpp83
-rw-r--r--src/boost/libs/beast/test/beast/core/tcp_stream.cpp45
-rw-r--r--src/boost/libs/beast/test/beast/core/test_buffer.hpp599
-rw-r--r--src/boost/libs/beast/test/beast/core/test_executor.hpp122
-rw-r--r--src/boost/libs/beast/test/beast/core/test_handler.hpp231
-rw-r--r--src/boost/libs/beast/test/beast/core/zlib.cpp235
-rw-r--r--src/boost/libs/beast/test/beast/http.cpp18
-rw-r--r--src/boost/libs/beast/test/beast/http/CMakeLists.txt52
-rw-r--r--src/boost/libs/beast/test/beast/http/Jamfile57
-rw-r--r--src/boost/libs/beast/test/beast/http/basic_dynamic_body.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/http/basic_file_body.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/http/basic_parser.cpp1414
-rw-r--r--src/boost/libs/beast/test/beast/http/buffer_body.cpp65
-rw-r--r--src/boost/libs/beast/test/beast/http/chunk_encode.cpp298
-rw-r--r--src/boost/libs/beast/test/beast/http/dynamic_body.cpp92
-rw-r--r--src/boost/libs/beast/test/beast/http/empty_body.cpp23
-rw-r--r--src/boost/libs/beast/test/beast/http/error.cpp78
-rw-r--r--src/boost/libs/beast/test/beast/http/field.cpp410
-rw-r--r--src/boost/libs/beast/test/beast/http/fields.cpp1029
-rw-r--r--src/boost/libs/beast/test/beast/http/file_body.cpp220
-rw-r--r--src/boost/libs/beast/test/beast/http/message.cpp521
-rw-r--r--src/boost/libs/beast/test/beast/http/message_fuzz.hpp614
-rw-r--r--src/boost/libs/beast/test/beast/http/parser.cpp436
-rw-r--r--src/boost/libs/beast/test/beast/http/read.cpp562
-rw-r--r--src/boost/libs/beast/test/beast/http/rfc7230.cpp361
-rw-r--r--src/boost/libs/beast/test/beast/http/serializer.cpp130
-rw-r--r--src/boost/libs/beast/test/beast/http/span_body.cpp81
-rw-r--r--src/boost/libs/beast/test/beast/http/status.cpp180
-rw-r--r--src/boost/libs/beast/test/beast/http/string_body.cpp23
-rw-r--r--src/boost/libs/beast/test/beast/http/test_parser.hpp161
-rw-r--r--src/boost/libs/beast/test/beast/http/type_traits.cpp156
-rw-r--r--src/boost/libs/beast/test/beast/http/vector_body.cpp30
-rw-r--r--src/boost/libs/beast/test/beast/http/verb.cpp131
-rw-r--r--src/boost/libs/beast/test/beast/http/write.cpp1027
-rw-r--r--src/boost/libs/beast/test/beast/ssl.cpp18
-rw-r--r--src/boost/libs/beast/test/beast/ssl/CMakeLists.txt26
-rw-r--r--src/boost/libs/beast/test/beast/ssl/Jamfile40
-rw-r--r--src/boost/libs/beast/test/beast/ssl/ssl_stream.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/version.cpp18
-rw-r--r--src/boost/libs/beast/test/beast/websocket.cpp18
-rw-r--r--src/boost/libs/beast/test/beast/websocket/CMakeLists.txt52
-rw-r--r--src/boost/libs/beast/test/beast/websocket/Jamfile62
-rw-r--r--src/boost/libs/beast/test/beast/websocket/_detail_decorator.cpp152
-rw-r--r--src/boost/libs/beast/test/beast/websocket/_detail_impl_base.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/websocket/_detail_prng.cpp76
-rw-r--r--src/boost/libs/beast/test/beast/websocket/accept.cpp830
-rw-r--r--src/boost/libs/beast/test/beast/websocket/close.cpp752
-rw-r--r--src/boost/libs/beast/test/beast/websocket/doc_snippets.cpp285
-rw-r--r--src/boost/libs/beast/test/beast/websocket/error.cpp82
-rw-r--r--src/boost/libs/beast/test/beast/websocket/frame.cpp78
-rw-r--r--src/boost/libs/beast/test/beast/websocket/handshake.cpp724
-rw-r--r--src/boost/libs/beast/test/beast/websocket/option.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/websocket/ping.cpp499
-rw-r--r--src/boost/libs/beast/test/beast/websocket/read1.cpp153
-rw-r--r--src/boost/libs/beast/test/beast/websocket/read2.cpp687
-rw-r--r--src/boost/libs/beast/test/beast/websocket/read3.cpp655
-rw-r--r--src/boost/libs/beast/test/beast/websocket/rfc6455.cpp51
-rw-r--r--src/boost/libs/beast/test/beast/websocket/ssl.cpp74
-rw-r--r--src/boost/libs/beast/test/beast/websocket/stream.cpp206
-rw-r--r--src/boost/libs/beast/test/beast/websocket/stream_base.cpp73
-rw-r--r--src/boost/libs/beast/test/beast/websocket/stream_explicit.cpp23
-rw-r--r--src/boost/libs/beast/test/beast/websocket/stream_fwd.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/websocket/teardown.cpp11
-rw-r--r--src/boost/libs/beast/test/beast/websocket/test.hpp1590
-rw-r--r--src/boost/libs/beast/test/beast/websocket/timer.cpp199
-rw-r--r--src/boost/libs/beast/test/beast/websocket/utf8_checker.cpp597
-rw-r--r--src/boost/libs/beast/test/beast/websocket/write.cpp736
-rw-r--r--src/boost/libs/beast/test/beast/zlib.cpp18
-rw-r--r--src/boost/libs/beast/test/beast/zlib/CMakeLists.txt34
-rw-r--r--src/boost/libs/beast/test/beast/zlib/Jamfile44
-rw-r--r--src/boost/libs/beast/test/beast/zlib/deflate_stream.cpp635
-rw-r--r--src/boost/libs/beast/test/beast/zlib/error.cpp68
-rw-r--r--src/boost/libs/beast/test/beast/zlib/inflate_stream.cpp660
-rw-r--r--src/boost/libs/beast/test/beast/zlib/zlib.cpp12
-rw-r--r--src/boost/libs/beast/test/bench/CMakeLists.txt14
-rw-r--r--src/boost/libs/beast/test/bench/Jamfile16
-rw-r--r--src/boost/libs/beast/test/bench/buffers/CMakeLists.txt25
-rw-r--r--src/boost/libs/beast/test/bench/buffers/Jamfile19
-rw-r--r--src/boost/libs/beast/test/bench/buffers/bench_buffers.cpp241
-rw-r--r--src/boost/libs/beast/test/bench/parser/CMakeLists.txt29
-rw-r--r--src/boost/libs/beast/test/bench/parser/Jamfile22
-rw-r--r--src/boost/libs/beast/test/bench/parser/bench_parser.cpp346
-rw-r--r--src/boost/libs/beast/test/bench/parser/nodejs-parser/AUTHORS68
-rw-r--r--src/boost/libs/beast/test/bench/parser/nodejs-parser/LICENSE-MIT23
-rw-r--r--src/boost/libs/beast/test/bench/parser/nodejs-parser/README.md246
-rw-r--r--src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.c2468
-rw-r--r--src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.h362
-rw-r--r--src/boost/libs/beast/test/bench/parser/nodejs_parser.cpp31
-rw-r--r--src/boost/libs/beast/test/bench/parser/nodejs_parser.hpp640
-rw-r--r--src/boost/libs/beast/test/bench/utf8_checker/CMakeLists.txt25
-rw-r--r--src/boost/libs/beast/test/bench/utf8_checker/Jamfile19
-rw-r--r--src/boost/libs/beast/test/bench/utf8_checker/bench_utf8_checker.cpp157
-rw-r--r--src/boost/libs/beast/test/bench/wsload/CMakeLists.txt24
-rw-r--r--src/boost/libs/beast/test/bench/wsload/Jamfile18
-rw-r--r--src/boost/libs/beast/test/bench/wsload/wsload.cpp338
-rw-r--r--src/boost/libs/beast/test/bench/zlib/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/test/bench/zlib/Jamfile15
-rw-r--r--src/boost/libs/beast/test/bench/zlib/deflate_stream.cpp199
-rw-r--r--src/boost/libs/beast/test/bench/zlib/inflate_stream.cpp244
-rw-r--r--src/boost/libs/beast/test/example/CMakeLists.txt10
-rw-r--r--src/boost/libs/beast/test/example/Jamfile20
-rw-r--r--src/boost/libs/beast/test/example/common/CMakeLists.txt31
-rw-r--r--src/boost/libs/beast/test/example/common/Jamfile27
-rw-r--r--src/boost/libs/beast/test/example/common/root_certificates.cpp11
-rw-r--r--src/boost/libs/beast/test/example/common/server_certificate.cpp11
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/CMakeLists.txt249
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/ChangeLog1515
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/FAQ368
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/INDEX68
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile5
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile.in410
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/README115
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/adler32.c186
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.pup69
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.sas68
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/compress.c86
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/configure921
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/README.contrib78
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/buffer_demo.adb106
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/mtest.adb156
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/read.adb156
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/readme.txt65
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/test.adb463
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.adb225
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.ads114
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.adb141
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.ads450
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.adb701
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.ads328
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.gpr20
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/amd64/amd64-match.S452
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/README.68651
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/match.S357
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/Makefile8
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/README4
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.c466
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.h83
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.pkbin0 -> 8 bytes
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.txt1
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLib.pas557
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLibConst.pas11
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/readme.txt76
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/zlibd32.mak99
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.build33
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.chmbin0 -> 72726 bytes
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.sln21
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/AssemblyInfo.cs58
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/ChecksumImpl.cs202
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CircularBuffer.cs83
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CodecBase.cs198
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Deflater.cs106
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.cs288
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.csproj141
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/GZipStream.cs301
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Inflater.cs105
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/UnitTests.cs274
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/LICENSE_1_0.txt23
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/readme.txt58
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/gcc_gvmat64/gvmat64.S574
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/README1
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.c615
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.h37
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inffix9.h107
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inflate9.h47
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.c324
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.h61
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffas86.c1157
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffast.S1368
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/test.cpp24
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.cpp329
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.h128
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream.h307
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream_test.cpp25
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/README35
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/TODO17
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/test.cc50
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.cc479
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.h466
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/bld_ml64.bat2
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/gvmat64.asm553
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffas8664.c186
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffasx64.asm396
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/readme.txt31
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/bld_ml32.bat2
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/inffas32.asm1080
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/match686.asm479
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/readme.txt27
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile25
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile.am45
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_Changes.txt6
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_info.txt74
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/configure.ac32
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/crypt.h131
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.c247
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.h208
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.c462
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.h28
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/make_vms.com25
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunz.c660
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunzip.163
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.146
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.c520
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.pc.in12
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.c291
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.h37
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.c2125
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.h437
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.c2007
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.h362
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/example.pas599
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/readme.txt76
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibd32.mak99
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibpas.pas276
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/Makefile42
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/README63
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.c840
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.h35
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/pufftest.c165
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/zeros.rawbin0 -> 2517 bytes
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.c275
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.txt10
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile14
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile.msc17
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/untgz.c674
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/readme.txt78
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj310
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj.filters22
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj307
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj.filters22
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj420
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj.filters58
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj310
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj.filters22
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlib.rc32
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj473
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj.filters77
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.def153
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.sln135
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj657
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj.filters118
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/miniunz.vcxproj314
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/minizip.vcxproj311
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlib.vcxproj426
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlibdll.vcxproj314
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlib.rc32
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibstat.vcxproj464
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.def153
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.sln117
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.vcxproj688
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/miniunz.vcxproj316
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/minizip.vcxproj313
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlib.vcxproj430
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlibdll.vcxproj316
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlib.rc32
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibstat.vcxproj467
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.def153
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.sln119
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.vcxproj692
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/miniunz.vcxproj316
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/minizip.vcxproj313
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlib.vcxproj430
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlibdll.vcxproj316
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlib.rc32
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibstat.vcxproj467
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.def153
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.sln119
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.vcxproj692
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/miniunz.vcproj565
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/minizip.vcproj562
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlib.vcproj852
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlibdll.vcproj565
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc32
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibstat.vcproj835
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def153
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.sln144
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.vcproj1156
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.c442
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.h441
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.c2163
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.h349
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/README.examples49
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/enough.c572
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/fitblk.c233
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gun.c702
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzappend.c504
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzjoin.c449
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.c1059
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.h91
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zlib_how.html545
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zpipe.c205
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zran.c409
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/gzclose.c25
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/gzguts.h218
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/gzlib.c637
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/gzread.c654
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/gzwrite.c665
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/infback.c640
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.c323
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.h11
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/inffixed.h94
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.c1561
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.h125
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.c304
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.h62
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/make_vms.com867
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.bor115
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.dj2104
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.emx69
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.msc112
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.tc100
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/Makefile126
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/README5
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.emx69
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.riscos151
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/old/README3
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/old/descrip.mms48
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/Makefile.os2136
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/zlib.def51
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/old/visual-basic.txt160
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/os400/README40048
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/os400/bndsrc119
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/os400/make.sh366
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/os400/zlib.inc527
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/qnx/package.qpg141
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/test/example.c602
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/test/infcover.c671
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/test/minigzip.c651
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/treebuild.xml116
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/trees.c1203
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/trees.h128
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/uncompr.c93
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_f.mak43
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_l.mak43
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h534
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.cmakein536
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.in534
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3149
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3.pdfbin0 -> 19318 bytes
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.h1912
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.map94
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.cmakein13
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.in13
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zlib2ansi152
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.c325
-rw-r--r--src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.h271
-rw-r--r--src/boost/libs/beast/test/extras/README.md3
-rw-r--r--src/boost/libs/beast/test/extras/include/boost/beast/doc_debug.hpp170
-rw-r--r--src/boost/libs/beast/test/extras/include/boost/beast/test/fuzz.hpp105
-rw-r--r--src/boost/libs/beast/test/extras/include/boost/beast/test/sig_wait.hpp38
-rw-r--r--src/boost/libs/beast/test/extras/include/boost/beast/test/test_allocator.hpp310
-rw-r--r--src/boost/libs/beast/test/extras/include/boost/beast/test/throughput.hpp57
-rw-r--r--src/boost/libs/beast/test/extras/include/boost/beast/test/websocket.hpp250
-rw-r--r--src/boost/libs/beast/test/extras/include/boost/beast/test/yield_to.hpp139
-rw-r--r--src/boost/libs/beast/test/lib_asio.cpp12
-rw-r--r--src/boost/libs/beast/test/lib_asio_ssl.cpp12
-rw-r--r--src/boost/libs/beast/test/lib_beast.cpp12
-rw-r--r--src/boost/libs/beast/test/lib_test.cpp13
-rw-r--r--src/boost/libs/beast/tools/blacklist.supp30
-rwxr-xr-xsrc/boost/libs/beast/tools/build-and-test.sh162
-rwxr-xr-xsrc/boost/libs/beast/tools/coverage.sh9
-rw-r--r--src/boost/libs/beast/tools/field.txt352
-rwxr-xr-xsrc/boost/libs/beast/tools/get-boost.sh89
-rwxr-xr-xsrc/boost/libs/beast/tools/install-dependencies.sh47
-rwxr-xr-xsrc/boost/libs/beast/tools/local-travis.sh8
-rwxr-xr-xsrc/boost/libs/beast/tools/make_field.sh22
-rwxr-xr-xsrc/boost/libs/beast/tools/retry.sh9
-rw-r--r--src/boost/libs/beast/tools/user-config.jam13
-rw-r--r--src/boost/libs/beast/tools/valgrind.supp31
590 files changed, 141947 insertions, 0 deletions
diff --git a/src/boost/libs/beast/CHANGELOG.md b/src/boost/libs/beast/CHANGELOG.md
new file mode 100644
index 000000000..63562ba97
--- /dev/null
+++ b/src/boost/libs/beast/CHANGELOG.md
@@ -0,0 +1,3535 @@
+Version 290:
+
+* Travis build host now bionic
+* Update Release Notes
+
+Version 289:
+
+* Fix Host header in websocket examples
+
+--------------------------------------------------------------------------------
+
+Version 288:
+
+* Fix Content-Length parsing
+* Update credits
+
+--------------------------------------------------------------------------------
+
+Version 287:
+
+* Remove CODE_OF_CONDUCT.md
+* Refactor websocket read
+* Correct buffer_bytes documentation
+* Fix examples to dispatch to strand
+* Ensure basic_stream::close will not throw
+
+--------------------------------------------------------------------------------
+
+Version 286:
+
+* Refactor multi_buffer
+* Refactor buffers_adapter
+* Refactor static_buffer
+* Refactor flat_buffer
+* Refactor flat_static_buffer
+* Fix missing include in sha1.hpp
+* Fix ostream warning
+* Field digest is endian-independent
+* update broken links in README
+* Fix ostream flush
+
+API Changes:
+
+* Nested const and mutable buffer types for all
+ Beast dynamic buffers are refactored. Affected types:
+ - buffers_adapter
+ - flat_buffer
+ - flat_static_buffer
+ - multi_buffer
+ - static_buffer
+
+* Nested mutable_data_type in Beast dynamic buffers is deprecated:
+
+Changes Required:
+
+* Use nested mutable_buffers_type instead of mutable_data_type,
+ or define BOOST_BEAST_ALLOW_DEPRECATED
+
+--------------------------------------------------------------------------------
+
+Version 285:
+
+* Translate some win32 errors to net error codes
+* enable circleci integration
+* flat_buffer shrink_to_fit is noexcept
+* moved-from dynamic buffers do not clear if different allocator
+* fix erase field
+
+--------------------------------------------------------------------------------
+
+Version 284:
+
+* fix compilation macro documentation
+* examples use strands correctly
+* update root certificates in examples
+* clarify end-of-file behaviour in File::read docs
+* file_body returns short_read on eof during read
+* fix bug in win32 file_body
+
+--------------------------------------------------------------------------------
+
+Version 283:
+
+* ostream_buffer satisfies preconditions of DynamicBuffer_v1::commit
+* Add accessor function to File member of basic_file_body
+
+Version 282:
+
+* Use superproject docca
+* Fix release build of docs
+* file_win32 supports UTF-8 paths
+* file_stdio supports unicode paths
+
+--------------------------------------------------------------------------------
+
+Version 281:
+
+* Travis builds docs
+* Fix echo-op test
+* file_win32 bodies respect http::serializer::split
+
+--------------------------------------------------------------------------------
+
+Version 280:
+
+* Fix non-msvc cmake
+* Use docca master branch
+
+--------------------------------------------------------------------------------
+
+Version 279:
+
+* Use regular throw in test
+* Fix pragma warning
+
+--------------------------------------------------------------------------------
+
+Version 278:
+
+* Use regular throw in test
+
+--------------------------------------------------------------------------------
+
+Version 277:
+
+* Update release notes
+
+--------------------------------------------------------------------------------
+
+Version 276:
+
+* https_get example sends the Host header
+* Fix async_close error code when async_read times out
+* Refactor zlib tests and fix enum typo
+
+--------------------------------------------------------------------------------
+
+Version 275:
+
+* Async init-fns use the executor's default token
+* Add basic_stream::rebind_executor
+* Use automatically deduced return types for all async operations
+* Support Concepts for completion token params
+
+--------------------------------------------------------------------------------
+
+Version 274:
+
+* Fix leftovers in basic_parser corner case
+
+--------------------------------------------------------------------------------
+
+Version 273:
+
+* Squelch spurious websocket timer assert
+* Use the executor type in basic_stream timer
+
+--------------------------------------------------------------------------------
+
+Version 272:
+
+* Add BEAST_THROWS
+* Add zlib tests and fixes
+
+--------------------------------------------------------------------------------
+
+Version 271:
+
+* Add HTTP async client with system_executor example
+* Add WebSocket async client with system_executor example
+* Fix data race in HTTP server examples
+* Fix data race in WebSocket examples
+
+--------------------------------------------------------------------------------
+
+Version 270:
+
+* Silence unused variables
+* Fix typo
+
+--------------------------------------------------------------------------------
+
+Version 269:
+
+* Fix /permissive- missing include
+* Add test
+
+--------------------------------------------------------------------------------
+
+Version 268:
+
+* root_certificates.hpp is not for production
+
+--------------------------------------------------------------------------------
+
+Version 267:
+
+* Add package for Travis config
+* Fix signed/unsigned mismatch in file_stdio::seek
+* basic_stream dtor cannot throw
+* cmake: check policy first
+* Add default dtors to satisfy -Wnon-virtual-dtor
+* Multiple I/O of the same type is not supported
+
+--------------------------------------------------------------------------------
+
+Version 266:
+
+* Fix some missing deduced return types in the docs
+
+--------------------------------------------------------------------------------
+
+Version 265:
+
+* Fix outgoing websocket message compression
+
+--------------------------------------------------------------------------------
+
+Version 264:
+
+* Handle overflow in max size calculation in `basic_dynamic_body`
+* Fix unused variable warnings in tests
+* Fix missing initializer warning in `basic_fields`
+* Remove unused functions in `impl/static_string.hpp`
+* Fix unused variable warning in `multi_buffer`
+* Fix header-only compilation errors in some configurations
+* Workaround for miscompilation in MSVC 14.2
+
+--------------------------------------------------------------------------------
+
+Version 263:
+
+* Update documentation
+
+--------------------------------------------------------------------------------
+
+Version 262:
+
+* Fix deallocate in multi_buffer
+
+--------------------------------------------------------------------------------
+
+Version 261:
+
+* Deduplicate `websocket::read_size_hint` definition
+* Fix UB in websocket read tests
+* Remove redundant includes in websocket
+* Simplify websocket::detail::prng
+* Don't over-allocate in http::basic_fields
+* Fix multi_buffer allocation alignment
+* Tidy up buffers_range
+
+--------------------------------------------------------------------------------
+
+Version 260:
+
+* More split compilation in rfc7230.hpp
+* Qualify calls to `beast::iequals` in basic_parser.ipp
+* More split compilation in websocket/detail/mask.hpp
+* Cleanup transitive includes in beast/core/detail/type_traits.hpp
+* Simplify generation of sec-websocket-key
+* Move detail::base64 helpers to tests
+* Remove redundant includes in core
+
+--------------------------------------------------------------------------------
+
+Version 259:
+
+* Reduce the number of instantiations of filter_token_list
+* Remove the use of `static_string` from `http::fields`
+* Add gcc-9 to AzP CI test matrix
+* Enable split compilation in http::basic_fields
+* Remove redundant instation of `static_string` in websocket
+* Remove redundant use of `asio::coroutine` in `flat_stream`
+* Remove unused includes from `test::stream`
+* Move `char_buffer` into a separate file
+* Fix coverage collection in AzP CI
+* Improve performance of `http::string_to_verb`
+* Replace uses of `net::coroutine` with `asio::coroutine`
+* Replace uses of `net::spawn` with `asio::spawn`
+* Use `beast::read_size` in `detail::read`
+
+--------------------------------------------------------------------------------
+
+Version 258:
+
+* Fix separate compilation in CI
+* Fix clang inititalization warning in websocket
+* Remove redundant use of `yield_to` in parser tests
+* Add VS 2019 AzP CI matrix item
+* Clean up typo in chat websocket javascript client
+
+--------------------------------------------------------------------------------
+
+Version 257:
+
+* Add b2 features for compile-time options used in testing
+* Remove redundant dependencies in http/server/fast example
+* Remove experimental/unit_test/thread.hpp
+* Use `if` statement in basic_stream::transfer_op
+* Fix flat_buffer copy members
+
+--------------------------------------------------------------------------------
+
+Version 256:
+
+* Remove uses of the deprecated `buffers` function
+* Remove uses of deprecated methods in websocket tests
+* Remove redundant use of `static_string`
+* Remove redundant template in service_base
+* Expand CI matrix using Azure Pipelines
+* Make chat websocket javascript client more user friendly
+* `allocator_traits::construct` is used for user-defined types
+* Add 1-element specialization for `buffers_cat`
+* Fix `buffers_cat` iterator tests
+* Don't pessimize-move
+* Use steady_timer type
+* Preserve operation_aborted on partial message
+
+--------------------------------------------------------------------------------
+
+Version 255:
+
+* Add idle ping suspend test
+* Fix moved-from executor in idle ping timeout
+
+--------------------------------------------------------------------------------
+
+Version 254:
+
+* Fix data race in test::stream::connect
+* Fix UB in websocket close tests
+* Fix uninitalized memory use in deflate_stream
+* Fix gcc-8 warning in websocket::stream
+
+--------------------------------------------------------------------------------
+
+Version 253:
+
+* Fix async_detect_ssl handler type
+* member get_executor const-correctness
+* Fix min/max on MSVC
+* Relax requirements for vector_body
+
+--------------------------------------------------------------------------------
+
+Version 252:
+
+* More std::string_view fixes
+* CI copies to libs/beast
+
+--------------------------------------------------------------------------------
+
+Version 251:
+
+* Clean up CI scripts
+* detect_ssl uses bool
+* launder pointers
+* Fix compilation on MSVC with std::string_view
+* Replace static_string in parser
+
+--------------------------------------------------------------------------------
+
+Version 250:
+
+* Use SaxonHE in reference generation
+* Cleanup endianness conversions
+* Set parser status and flags even if body_limit_ has been reached
+
+--------------------------------------------------------------------------------
+
+Version 249:
+
+* Move friend function template definition
+
+--------------------------------------------------------------------------------
+
+Version 248:
+
+* Don't use a moved-from handler
+
+--------------------------------------------------------------------------------
+
+Version 247:
+
+* Fix async_base immediate completion
+
+--------------------------------------------------------------------------------
+
+Version 246:
+
+* decorator ctor is explicit
+
+--------------------------------------------------------------------------------
+
+Version 245:
+
+* decorator constructor is constrained
+
+--------------------------------------------------------------------------------
+
+Version 244:
+
+* Tidy up declval in some traits
+* Fix websocket keep-alive ping expiration
+
+--------------------------------------------------------------------------------
+
+Version 243:
+
+* Fix some typos
+* Tidy up file_stdio for VS2015
+* Fix http::message constructor constraint
+
+--------------------------------------------------------------------------------
+
+Version 242:
+
+* test::stream has deprecated lowest_layer for ssl
+* MSVC uses ::fopen_s
+* Fix http::message constructor constraint
+* Check defined(BOOST_MSVC)
+
+--------------------------------------------------------------------------------
+
+Version 241:
+
+* Tidy up a doc code snippet
+* basic_parser::content_length is stable (API Change)
+
+--------------------------------------------------------------------------------
+
+Version 240:
+
+* Fix ssl_stream teardown
+
+--------------------------------------------------------------------------------
+
+Version 239:
+
+* More split compilation in HTTP
+
+--------------------------------------------------------------------------------
+
+Version 238:
+
+* Refactor Jamfiles to work with release layout
+
+--------------------------------------------------------------------------------
+
+Version 237:
+
+* cmake: Use static libs to speed up builds
+
+--------------------------------------------------------------------------------
+
+Version 236:
+
+* root_certificates.hpp: brought in the server certificate
+
+--------------------------------------------------------------------------------
+
+Version 235:
+
+* Fix self-assignment warning in buffer test
+* Jamfile cleanup
+
+--------------------------------------------------------------------------------
+
+Version 234:
+
+* Don't link to OpenSSL needlessly (bjam)
+* HTTPS URLs in README.md
+
+--------------------------------------------------------------------------------
+
+Version 233:
+
+* Check __ANDROID__ instead
+* Use secure TLS/SSL versions
+
+--------------------------------------------------------------------------------
+
+Version 232:
+
+* Fix close_socket for net::basic_socket changes
+* Fix file_win32_write_op async initiation
+* Fix basic_stream lowest_layer for ssl
+
+--------------------------------------------------------------------------------
+
+Version 231:
+
+* Doc section names are stable
+* Add missing include
+* Constrain to_static_string to integers
+
+--------------------------------------------------------------------------------
+
+Version 230:
+
+* Don't use dynamic_buffer_ref
+* Remove dynamic_buffer_ref
+* Fix completion handler invocation signatures
+
+--------------------------------------------------------------------------------
+
+Version 229:
+
+* Rename to buffer_bytes
+* Tidy up examples
+* detect_ssl returns a bool
+* Fix stable_async_base example
+
+API Changes:
+
+* handler_ptr is deprecated
+
+Actions Required:
+
+* Replace use of `handler_ptr` with `stable_async_base`
+ and `allocate_stable`.
+
+--------------------------------------------------------------------------------
+
+Version 228:
+
+* Fix UB in decorator:
+* Sync up convenience headers
+* The Fields concept is deprecated (API Change)
+* Fix includes.xsl for newer doxygen
+* Tidy up quick reference
+* SSL teardowns are in an associated namespace
+
+--------------------------------------------------------------------------------
+
+Version 227:
+
+* Fix decorator for certain sizes
+
+--------------------------------------------------------------------------------
+
+Version 226:
+
+* Support -fno-exceptions
+* make_strand is in net::
+* Fix HTTP parser static string calculation
+* Move parser definitions to .ipp
+* Appveyor uses msvc-14.0
+
+--------------------------------------------------------------------------------
+
+Version 225:
+
+* Tidy up an unused function
+* Fix wsload jamfile
+* Examples use flat_buffer
+* Remove session_alloc (API Change)
+
+Actions Required:
+
+* Don't use session_alloc
+
+--------------------------------------------------------------------------------
+
+Version 224:
+
+* Remove extraneous error check in advanced-server-flex
+* Advanced servers use HTTP parser interfaces for reading
+* Reusing an HTTP parser returns an error
+
+--------------------------------------------------------------------------------
+
+Version 223:
+
+* Add test::stream::service
+* Add websocket service
+* Pausation abandoning test
+* Destroy abandoned websocket ops on shutdown
+
+--------------------------------------------------------------------------------
+
+Version 222:
+
+* stream_base::timeout::suggested is a nested function
+
+--------------------------------------------------------------------------------
+
+Version 221:
+
+* Rename to async_base, stable_async_base
+* role_type is in boost/beast/core/role.hpp (API Change)
+* Cleanup in test::stream internals
+* Pass references as pointers to async_initiate
+
+Actions Required:
+
+* Include <boost/beast/core/role.hpp> or
+ define BOOST_BEAST_ALLOW_DEPRECATED=1
+
+--------------------------------------------------------------------------------
+
+Version 220:
+
+* Documentation and release notes
+
+--------------------------------------------------------------------------------
+
+Version 219:
+
+* More split definitions in test::stream
+* Visual Studio 2017 minimum requirement for Windows
+* Better treatment of SSL short reads
+* ssl_stream is a public interface
+* basic_parser is abstract, not CRTP (API Change)
+* OpenSSL is required for tests and examples
+
+--------------------------------------------------------------------------------
+
+Version 218:
+
+* detect_ssl, async_detect_ssl are public interfaces
+* Add OpenSSL installation/setup instructions
+* Enable split Beast compilation for tests
+
+--------------------------------------------------------------------------------
+
+Version 217:
+
+* websocket idle pings
+* RatePolicy documentation
+* Pass strand to async_accept
+* Fix file_body_win32
+* Use async_initiate
+* Check BOOST_NO_CXX11_THREAD_LOCAL
+* Fast prng is pcg
+
+--------------------------------------------------------------------------------
+
+Version 216:
+
+* Refactor websocket::stream operations
+* Add websocket::stream timeouts
+* Use suggested timeouts in Websocket examples
+* Add make_strand
+* Add RatePolicy to basic_stream
+* Use async_initiate in basic_stream
+* basic_stream connects are members
+* Beast supports latest Asio changes (API Change)
+* WebSocket Decorator is a socket option (API Change)
+* Overloads of the following functions which accept a Decorator
+ are deprecated:
+ - accept, accept_ex
+ - handshake, handshake_ex
+ - async_accept, async_accept_ex
+ - async_handshake, async_handshake_ex
+
+Actions Required:
+
+* Code which passes decorator to any `websocket::stream` member
+ function should call `stream::set_option` instead with a newly
+ constructed `stream_base::decorator` object containing the
+ decorator. Alternatively, the macro `BOOST_BEAST_ALLOW_DEPRECATED`
+ may be defined to 1.
+
+* Fix compilation errors required by Asio changes
+
+--------------------------------------------------------------------------------
+
+Version 215:
+
+* basic_stream uses boost::shared_ptr
+* Remove bind_back_handler
+* bind_front_handler works with member functions
+* Examples use bind_front_handler
+* Add experimental test/handler.hpp
+* Rename to async_op_base::invoke_now
+* Add async_op_base::invoke
+* Remove CppCon2018 example
+* Examples use ssl_stream
+
+--------------------------------------------------------------------------------
+
+Version 214:
+
+* Handler binders use the associated allocator
+* Add detail::bind_continuation
+* Rewrite the echo-op example
+
+--------------------------------------------------------------------------------
+
+Version 213:
+
+* Fix posix_file::close handling of EINTR
+* basic_stream subsumes stranded_stream:
+* Use timeouts in HTTP server examples
+* Use timeouts in HTTP client examples
+* Use tcp_stream in WebSocket client examples
+* Use tcp_stream in WebSocket server examples
+* Use tcp_stream, HTTP timeouts in advanced servers
+
+--------------------------------------------------------------------------------
+
+Version 212:
+
+* dynamic_buffer_ref tests and tidy
+* flat_stream tests and tidy
+* stranded_socket tests and tidy
+* buffers_front tests
+* Improved websocket stream documentation
+
+--------------------------------------------------------------------------------
+
+Version 211:
+
+* close_socket is in stream_traits.hpp
+* Improvements to test::stream
+* Add stranded_stream
+* Add flat_stream
+* flat_buffer::clear preserves capacity
+* multi_buffer::clear preserves capacity
+* Fixes to rfc7230
+
+--------------------------------------------------------------------------------
+
+Version 210:
+
+* Tidy up read implementation
+* Fix stable_async_op_base javadoc
+* Better handling of stream timeouts
+* Add stream_traits.hpp
+* Add executor_type trait
+* Fix hexadecimal string conversion table
+* is_completion_handler, type_traits.hpp are deprecated
+* Fixes to test::stream::async_read
+
+API Changes:
+
+* Stream traits are now in stream_traits.hpp
+* `is_file` is now in file_base.hpp
+* is_completion_handler is deprecated
+
+Actions Required:
+
+* Include stream_traits.hpp as needed
+* Include file_base.hpp as needed
+* Use std::is_invocable instead of is_completion_handler
+
+--------------------------------------------------------------------------------
+
+Version 209:
+
+* Faster http::string_to_field
+* async_echo supports move-only handlers
+* test::stream maintains a handler work guard
+* Qualify buffer_copy, don't qualify buffer_size
+* Add dynamic_buffer_ref
+* Refactor quickref.xml
+* Add buffer_size
+
+--------------------------------------------------------------------------------
+
+Version 208:
+
+* Add get_lowest_layer free function
+* Add lowest_layer_type metafunction
+* Add close_socket, beast_close_socket customization
+* Doc work
+
+--------------------------------------------------------------------------------
+
+Version 207
+
+* Send from the strand
+* Pass the correct handler in basic_timeout_stream
+
+API Changes:
+
+* lowest_layer is removed
+
+Actions Required:
+
+* Remove lowest_layer and lowest_layer_type from user-defined streams.
+* Use the get_lowest_layer free function and the lowest_layer_type trait
+ as needed.
+
+--------------------------------------------------------------------------------
+
+Version 206
+
+* Clear error codes idiomatically
+* websocket stream uses shared_ptr<impl_type>
+* Add websocket-chat-multi example
+
+--------------------------------------------------------------------------------
+
+Version 205
+
+* Doc work
+* Add detail/soft_mutex.hpp
+* Add detail/prng.hpp
+
+--------------------------------------------------------------------------------
+
+Version 204
+
+* Add basic_timeout_stream
+* Unit test macros use the global suite
+* Doc work
+
+--------------------------------------------------------------------------------
+
+Version 203
+
+* Update networking refresher doc
+* Include error code in call to set_option
+* saved_handler is a public interface
+* Use new saved_handler in websocket
+* session_alloc is thread-safe
+* examples use flat_buffer
+* parse_until is not static
+* Boost.System is header-only
+
+--------------------------------------------------------------------------------
+
+Version 202
+
+* Use cxxstd instead of cxxflags
+* Update coverage badge images
+* Tidy up basic_stream_socket docs
+* Refactor async_op_base
+* Use async_op_base
+* async_op_base is a public interface
+* Add tests for bind_back_handler
+* Add tests for async_op_base
+
+--------------------------------------------------------------------------------
+
+Version 201
+
+* Decay bound arguments in handler wrapper parameters
+* Add bind_back_handler
+* Tidy up default-constructed iterators
+* Add core errors and conditions
+* New basic_stream_socket
+
+--------------------------------------------------------------------------------
+
+Version 200
+
+* Don't include OpenSSL for core snippets
+* Tidy up msvc-14 workaround in multi_buffer
+* buffers_cat fixes and coverage
+* Refactor buffers_adaptor
+* Refactor buffers_range
+* Fix and refactor buffers_cat
+* Refactor buffers_prefix
+* Add const and mutable buffer sequence traits
+* Add buffers_iterator_type trait
+* Use new buffer traits, remove old unused traits
+* Optimize for size on buffers_cat preconditions
+* Refactor buffers_suffix
+* Tidy up flat_buffer tests
+* Fix ostream prepare calculation for low limits
+* Tidy up flat_static_buffer tests
+* Add more tests for dynamic buffers
+* Tidy up multi_buffer
+* Refactor ostream
+* Refactor static_buffer
+* HTTP tidying
+* Adjust static_asio lib options in Jamfile
+* Add type_traits tests
+* Add buffers_range_ref (replaces reference_wrapper parameter)
+
+API Changes:
+
+* buffers_adaptor replaces buffers_adapter (rename)
+* make_printable replaces buffers (rename)
+* Remove file_mode::append_new
+
+Actions Required:
+
+* Replace buffers_adapter.hpp with buffers_adaptor.hpp, and
+ replace buffers_adapter with buffers_adaptor. Or, define
+ BOOST_BEAST_ALLOW_DEPRECATED
+
+* Replace call sites to use make_printable instead of buffers,
+ and also include make_printable.hpp instead of ostream.hpp.
+
+* Replace file_mode::append_new with file_mode::append
+ or file_mode::append_existing instead of file_mode::append_new
+
+--------------------------------------------------------------------------------
+
+Version 199:
+
+* Workarounds for msvc-14
+* Fix Appveyor badge links
+
+--------------------------------------------------------------------------------
+
+Version 198:
+
+* flat_buffer improvements
+* multi_buffer improvements
+* static_buffer improvements
+* flat_static_buffer_improvements
+* saved_handler maintains a work_guard (websocket)
+* Add buffer_traits.hpp, buffers_type
+* Tidy up experimental files
+* Tidy up core files
+* Fix bind_handler, bind_front_handler
+* Improved handler bind wrapper tests
+
+API Changes:
+
+* Files return errc::bad_file_descriptor
+* flat_static_buffer::reset is deprecated
+
+Actions Required:
+
+* Callers checking for errc::invalid_argument from calls to
+ file APIs should check for errc::bad_file_descriptor instead.
+
+* Replace calls to flat_static_buffer::reset with
+ flat_static_buffer::clear
+
+--------------------------------------------------------------------------------
+
+Version 197:
+
+* Improvements to echo-op example
+* Crawler example clears the response before each read
+* Use a struct instead of a pair in flat_stream (experimental)
+
+API Changes:
+
+* Refactor HTTP operations
+
+Actions Required:
+
+* Callers depending on the return value of http::read or
+ http::async_read overloads should adjust the usage of
+ the returned value as needed.
+
+--------------------------------------------------------------------------------
+
+Version 196:
+
+* Tidy up calls to placement new
+* Remove unused type_traits
+* Simplify handler_ptr
+
+--------------------------------------------------------------------------------
+
+Version 195:
+
+* net is a namespace alias for boost::asio
+* Simplify multi_buffer and static_buffer sequences
+* Documentation work
+
+--------------------------------------------------------------------------------
+
+Version 194:
+
+* http::async_read returns the right byte count on error
+* Add net namespace alias
+* Don't use-after-free in test
+* Tidy up ssl_stream (experimental)
+* Dynamic buffer improvements
+* Saved handlers are dispatched
+
+--------------------------------------------------------------------------------
+
+Version 193:
+
+* Update ssl_stream signatures for networking changes
+* Fix test::stream async_result transformation
+* Tidy up test::stream
+* Enable explicit instantiation of websocket::stream
+
+--------------------------------------------------------------------------------
+
+Version 192:
+
+* Use mp11::integer_sequence
+* Tidy up warnings and deprecated usage
+* http::message is not-a boost::empty_value
+* Fix link in docs
+* Fixes to timeout services (experimental)
+
+--------------------------------------------------------------------------------
+
+Version 191:
+
+* Add bind_front_handler
+* Use bind_front_handler
+* Simplify some type traits
+* Use lean_tuple in buffers_cat
+* Use lean_tuple in bind_handler, bind_front_handler
+* Use mp11 in detail::variant
+* Fix buffers_cat uninitialized warning
+* Fix static_string uninitialized warning
+* Fix warning in is_ssl_handshake
+
+--------------------------------------------------------------------------------
+
+Version 190:
+
+* Add missing includes to convenience headers
+* Unit test framework is experimental
+* Add buffers_range
+* Rename experimental directory
+* Improve compilation of tests for continuous integration
+* Fix visibility warnings in test
+
+--------------------------------------------------------------------------------
+
+Version 189-hf1:
+
+* Fix broken doc link
+* example/cppcon2018 only requires C++11
+
+--------------------------------------------------------------------------------
+
+Version 189:
+
+* Add CppCon2018 chat server example and video
+
+--------------------------------------------------------------------------------
+
+Version 188:
+
+* Remove extraneous strand from example
+* Add missing include in http/read.ipp
+* Test for gcc warning bug
+* Fix a spurious gcc warning
+
+--------------------------------------------------------------------------------
+
+Version 187:
+
+* Add experimental timeout_socket
+* Fix warning in file tests
+* Fix uninitialized comparison in buffers iterator
+* Partial support for BOOST_NO_EXCEPTIONS
+* Fix a spurious gcc warning
+* Test for gcc warning bug
+* Add missing include
+* Remove extraneous strand from example
+
+--------------------------------------------------------------------------------
+
+Version 186:
+
+* basic_fields uses intrusive base hooks
+* Fix parsing of out-of-bounds hex values
+
+--------------------------------------------------------------------------------
+
+Version 185:
+
+* Remove extraneous function
+* Fix some typos
+* Add BOOST_BEAST_USE_STD_STRING_VIEW
+* Fix timer on websocket upgrade in examples
+
+--------------------------------------------------------------------------------
+
+Version 183:
+
+* Fix a rare case of failed UTF8 validation
+* Verify certificates in client examples
+* Use boost::empty_value
+* Workaround for http-server-fast and libstdc++
+
+--------------------------------------------------------------------------------
+
+Version 182:
+
+* Silence ubsan false positive
+
+--------------------------------------------------------------------------------
+
+Version 181:
+
+* Fix parse_dec algorithm
+* Add parse_dec tests
+
+--------------------------------------------------------------------------------
+
+Version 180:
+
+* Fix http_server_stackless_ssl.cpp example
+
+--------------------------------------------------------------------------------
+
+Version 179:
+
+* Use the exchange() idiom in move constructors
+* Most members of std::allocate are deprecated in C++17
+* Remove some unused variables
+
+--------------------------------------------------------------------------------
+
+Version 178:
+
+* Use static_cast instead
+
+--------------------------------------------------------------------------------
+
+Version 177:
+
+* Add test for issue #1188
+* Set /permissive-
+* Check error in example set_option
+
+--------------------------------------------------------------------------------
+
+Version 176:
+
+* Tidy up Quick Reference
+* Fix array end calculation in utf8 assertion
+* WebSocket masks use secure PRNG by default
+
+--------------------------------------------------------------------------------
+
+Version 175:
+
+* Fix initialization warning
+
+--------------------------------------------------------------------------------
+
+Version 174:
+
+* Fix Fields, FieldsWriter concept docs
+* Fix BodyReader constructor requirements doc
+
+--------------------------------------------------------------------------------
+
+Version 173:
+
+* Remove Autobahn testsuite doc note
+* Fix buffers_adapter iterator value type
+* Fix buffers_adapter max_size
+* Fix buffers_prefix iterator decrement
+* buffers_adapter improvements
+* Add icy_stream Shoutcast stream filter
+
+--------------------------------------------------------------------------------
+
+Version 172:
+
+* Tidy up websocket stream javadocs
+* Fix move-only arguments in bind_handler
+* Fix http::parser constructor javadoc
+* Tidy up test::stream javadocs
+* Tidy up composed operation doc
+
+--------------------------------------------------------------------------------
+
+Version 171:
+
+* Add handler_ptr::has_value
+* Remove spurious assert
+* Fix unused variable warning
+
+--------------------------------------------------------------------------------
+
+Version 170:
+
+* Add flat_stream to experimental
+* Add ssl_stream to experimental
+* Add test::error to experimental
+* Add test::fail_count to experimental
+* Add test::stream to experimental
+* Use a shared string for example HTTP server doc roots
+* Remove deprecated serializer::reader_impl()
+* Remove deprecated Body reader and writer ctor signatures
+* Add is_mutable_body_writer metafunction
+* Add const and non-const overloads for message based http writes
+* Use the root certificate which matches the fingerprint
+
+--------------------------------------------------------------------------------
+
+Version 169:
+
+* Use buffers_to_string in tests
+* Use boost::void_t
+* Refactor HTTP write_op implementation
+* Use fully qualified namespace in BOOST_BEAST_HANDLER_INIT
+* New flat_stream example class
+* Use flat_stream in ssl_stream example code
+
+--------------------------------------------------------------------------------
+
+Version 168:
+
+* Use executor_work_guard in composed operations
+* Revert verb.ipp change which caused spurious warnings
+* Fix race in advanced server examples
+
+--------------------------------------------------------------------------------
+
+Version 167:
+
+* Revert: Tidy up calls to post()
+
+--------------------------------------------------------------------------------
+
+Version 166:
+
+* Use boost::is_convertible as a workaround
+
+--------------------------------------------------------------------------------
+
+Version 165:
+
+* Fix BOOST_NO_CXX11_ALLOCATOR check
+
+--------------------------------------------------------------------------------
+
+Version 164:
+
+* Fix masking on continuation frames
+* Add Access-Control-Expose-Headers field constant
+
+--------------------------------------------------------------------------------
+
+Version 163:
+
+* Tidy up calls to post()
+* Fix narrowing warnings
+
+--------------------------------------------------------------------------------
+
+Version 162:
+
+* Add asio_handler_invoke overloads for stream algorithms
+* Improve websocket::stream::control_callback javadoc
+
+--------------------------------------------------------------------------------
+
+Version 161:
+
+* Don't copy the handler in write_some_op
+* Add move-only handler tests
+* Fix handler parameter javadocs
+
+--------------------------------------------------------------------------------
+
+Version 160:
+
+* Examples clear the HTTP message before reading
+
+--------------------------------------------------------------------------------
+
+Version 159:
+
+* Fix typo in release notes
+* Safe treatment of zero-length string arguments in basic_fields
+* Some basic_fields operations now give the strong exception guarantee
+
+--------------------------------------------------------------------------------
+
+Version 158:
+
+* Tidy up end_of_stream javadoc
+* Tidy up websocket docs
+* Examples set reuse_address(true)
+* Advanced servers support clean shutdown via SIGINT or SIGTERM
+* DynamicBuffer input areas are not mutable
+* Tidy up some documentation
+
+API Changes:
+
+* get_lowest_layer is a type alias
+
+Actions required:
+
+* Replace instances of `typename get_lowest_layer<T>::type`
+ with `get_lowest_layer<T>`.
+
+--------------------------------------------------------------------------------
+
+Version 157:
+
+* Fix teardown for TIME_WAIT
+* Fix big-endian websocket masking
+
+--------------------------------------------------------------------------------
+
+Version 156:
+
+* Don't use typeid
+* Add release notes to documentation
+* Fix stale link for void-or-deduced
+
+--------------------------------------------------------------------------------
+
+Version 155:
+
+* Fix memory leak in advanced server examples
+* Fix soft-mutex assert in websocket stream
+* Fix fallthrough warnings
+* Tidy up bind_handler doc
+
+--------------------------------------------------------------------------------
+
+Version 154:
+
+* Type check completion handlers
+* bind_handler doc update
+* bind_handler works with boost placeholders
+
+--------------------------------------------------------------------------------
+
+Version 153:
+
+* Remove BOOST_VERSION checks
+* Use make_error_code for setting an error_code from errc
+* Use boost::winapi::GetLastError() consistently
+* Update README.md for branches
+* Avoid string_view::clear
+* Fix iterator version of basic_fields::erase
+* Fix use-after-move in example request handlers
+* Add Bishop Fox interview media
+
+--------------------------------------------------------------------------------
+
+Version 152:
+
+* Refactor detect_ssl_op
+* Disable gdb on Travis for Meltdown
+
+WebSocket:
+
+* Redistribute the read tests in the translation units
+* Refactor error headers
+* Add WebSocket error conditions
+
+API Changes:
+
+* Refactor WebSocket errors (API Change):
+
+Actions Required:
+
+* Code which explicitly compares error_code values against the
+ constant `websocket::error::handshake_failed` should compare
+ against `websocket::condition::handshake_failed` instead.
+
+* Code which explicitly compares error_code values against the
+ constant `websocket::error::failed` should compare
+ against `websocket::condition::protocol_violation` instead.
+
+--------------------------------------------------------------------------------
+
+Version 151:
+
+* Sanitizer failures are errors
+* Depend on container_hash
+* Fix high-ASCII in source file
+
+WebSocket:
+
+* Control callback is invoked on the execution context
+* Add stream_fwd.hpp
+* Remove unnecessary include
+
+API Changes:
+
+* http::parser is not MoveConstructible
+* permessage-deflate is a compile-time feature
+
+--------------------------------------------------------------------------------
+
+Version 150:
+
+* handler_ptr tests
+* Documentation
+
+API Changes:
+
+* serializer::reader_impl is deprecated
+
+Actions Required:
+
+* Call serializer::writer_impl instead of reader_impl
+
+--------------------------------------------------------------------------------
+
+Version 149:
+
+* built-in r-value return values can't be assigned
+* Tidy up ssl_stream special members
+* Fix CMakeLists.txt variable
+* Protect calls from macros
+* pausation always allocates
+* Don't copy completion handlers
+* handler_ptr is move-only
+* Fix Travis memory utilization
+
+API Changes:
+
+* handler_ptr gives the strong exception guarantee
+
+Actions Required:
+
+* Change the constructor signature for state objects
+ used with handler_ptr to receive a const reference to
+ the handler.
+
+--------------------------------------------------------------------------------
+
+Version 148:
+
+* Install codecov on codecov CI targets only
+* Update reports for hybrid assessment
+* Handle invalid deflate frames
+
+--------------------------------------------------------------------------------
+
+Version 147:
+
+* Don't use boost::string_ref
+* Use iterator wrapper in detail::buffers_range
+
+HTTP:
+
+* Tidy up basic_fields exception specifiers
+
+WebSocket:
+
+* control callback is copied or moved
+* Send idle pings in advanced servers
+
+--------------------------------------------------------------------------------
+
+Version 146:
+
+* Fix some typos
+* Faster ascii_tolower
+* Documentation tidying
+* Fix typo in examples documentation
+* Add detail::aligned_union and tidy up
+* Use variant in buffers_cat_view
+
+API Changes:
+
+* Remove unintended public members of handler_ptr
+
+--------------------------------------------------------------------------------
+
+Version 145:
+
+* Rename some detail functions
+* Refactor basic_fields allocator internals
+* Refactor HTTP async read composed operations
+* null_buffers is deprecated
+* Version 124 works with Boost 1.65.1 and earlier
+* basic_fields does not support fancy pointers
+
+--------------------------------------------------------------------------------
+
+Version 144-hf1:
+
+* Update reports for hybrid assessment
+* Handle invalid deflate frames
+* Install codecov on codecov CI targets only
+
+--------------------------------------------------------------------------------
+
+Version 144:
+
+* Fix websocket permessage-deflate negotiation
+
+--------------------------------------------------------------------------------
+
+Version 143:
+
+* Fix autobahn report link
+
+--------------------------------------------------------------------------------
+
+Version 142:
+
+* Warn about upcoming API changes to certain concepts
+* Fix name typo in http write test
+
+--------------------------------------------------------------------------------
+
+Version 141:
+
+* Tidy up some documentation
+
+--------------------------------------------------------------------------------
+
+Version 140:
+
+* Fix some integer warnings in 64-bit builds
+* Fix utf8_checker test failures
+* Fix signature for async_read_some, and tests
+* Tidy up basic_parser
+* Some basic_fields special members are protected
+
+--------------------------------------------------------------------------------
+
+Version 139:
+
+* Revisit boost library min/max guidance
+
+--------------------------------------------------------------------------------
+
+Version 138:
+
+* Tidy up some documentation
+
+--------------------------------------------------------------------------------
+
+Version 137:
+
+* ConstBufferSequence mandates pointer equivalence
+* Add FieldsWriter constructor requirement
+* Tidy up some documented constructor syntax
+
+--------------------------------------------------------------------------------
+
+Version 136:
+
+* Tidy up message doc image
+
+--------------------------------------------------------------------------------
+
+Version 135:
+
+* Fix typo in example server help text
+
+--------------------------------------------------------------------------------
+
+Version 134:
+
+* Add static_buffer_base default constructor definition
+
+--------------------------------------------------------------------------------
+
+Version 133:
+
+* Remove const&& overload of message::body
+
+--------------------------------------------------------------------------------
+
+Version 132:
+
+* Tidy up project folders in CMakeLists.txt
+* Rename Cmake variables for clarity
+* Add ref-qualified overloads for message::body
+* Tidy up FieldsReader doc
+
+API Changes:
+
+* Fields::writer replaces Fields::reader
+* BodyReader and BodyWriter names are swapped
+
+Actions Required:
+
+* Rename reader to writer for user defined Fields
+* Swap the reader and writer names for user defined Body types
+* Swap use of is_body_reader and is_body_writer
+
+--------------------------------------------------------------------------------
+
+Version 131:
+
+* basic_fields returns const values
+* Set SNI hostname in example SSL clients
+
+--------------------------------------------------------------------------------
+
+Version 130:
+
+* Tidy up fallthrough warning
+* Remove cxx11_sfinae_expr build requirement from tests
+
+--------------------------------------------------------------------------------
+
+Version 129:
+
+* Add autobahn test report to doc
+* Documentation tidying
+* Fix prepare_payload: chunked is HTTP/1.1
+
+--------------------------------------------------------------------------------
+
+Version 128:
+
+* Update doc links
+* Add explicit-failures-markup.xml
+
+HTTP:
+
+* Add message::need_eof
+* Use message::need_eof in example servers
+* Use synchronous writes in chunk output example
+
+WebSocket:
+
+* Fix utf8 validation for autobahn
+* Temporarily disable utf8 validation tests
+* Tidy up fast websocket server host names
+
+API Changes:
+
+* Remove serializer::keep_alive
+* Remove serializer::chunked
+* Add has_content_length_impl to Fields
+* Add message::has_content_length
+* Rename some basic_parser observers
+
+Actions Required:
+
+* Call message::keep_alive instead of serializer::keep_alive
+* Call serializer::get::chunked instead of serializer::chunked
+* Implement has_content_length_impl for user-defined Fields
+* Remove the "is_" prefix from call sites invoking certain basic_parser members
+
+--------------------------------------------------------------------------------
+
+Version 127:
+
+* Add BOOST_BEAST_NO_POSIX_FADVISE
+* Version command line option for HTTP client examples
+* More Jamfile compiler requirements for tests
+
+--------------------------------------------------------------------------------
+
+Version 126:
+
+* Add CppCon2017 presentation link
+* Update README.md
+* Update stream write documentation for end of stream changes
+* Tidy up unused variable warnings
+* Don't return end_of_stream on win32 file body writes
+* Fix doc typo
+* Fix shadowing in session_alloc
+* Fix executor type compilation
+* Add Travis tests with the default compilers
+* Update Boost.WinAPI usage to the new location and namespace.
+* Fix buffered_read_stream async_read_some signature
+
+--------------------------------------------------------------------------------
+
+Version 125:
+
+API Changes:
+
+* Update for Net-TS Asio
+
+Actions Required:
+
+* Use BOOST_ASIO_HANDLER_TYPE instead of handler_type
+* Use BOOST_ASIO_INITFN_RESULT_TYPE instead of async_result
+* Use boost::asio::async_completion
+* Use boost::asio::is_dynamic_buffer
+* Use boost::asio::is_const_buffer_sequence
+* Use boost::asio::is_mutable_buffer_sequence
+* boost::asio::associated_allocator_t replaces handler_alloc
+
+--------------------------------------------------------------------------------
+
+Version 124:
+
+* Fix for a test matrix compiler
+* Fix basic_fields javadoc
+
+API Changes:
+
+* http write returns success on connection close
+
+Actions Required:
+
+* Add code to servers to close the connection after successfully
+ writing a message where `message::keep_alive()` would return `false`.
+
+--------------------------------------------------------------------------------
+
+Version 123:
+
+* Use unit-test subtree
+* Fix spurious race in websocket close test
+* Check compiler feature in Jamfile
+* Clear previous message fields in parser
+
+--------------------------------------------------------------------------------
+
+Version 122:
+
+* Add test for issue 807
+* assert on empty buffer in websocket read
+* Fix zlib symbol conflicts
+* CMake 3.5.1 is required
+* config.hpp is not a public header
+* Add missing case in error test
+
+--------------------------------------------------------------------------------
+
+Version 121:
+
+* Add test for issue 802
+* Fix enum and non-enum in conditional exp. warning
+
+--------------------------------------------------------------------------------
+
+Version 120:
+
+* Fix spurious strand_ in advanced_server_flex
+* OpenSSL targets are optional (CMake)
+
+--------------------------------------------------------------------------------
+
+Version 119:
+
+* Tidy up doc badge links
+
+--------------------------------------------------------------------------------
+
+Version 118:
+
+* file_win32 opens for read-only in shared mode
+* Remove unused strands in server examples
+* Update build instructions
+* Doc root is at index.html
+
+HTTP:
+
+* Fix writing header into std::ostream
+
+--------------------------------------------------------------------------------
+
+Version 117:
+
+* Add buffers_to_string
+
+API Changes:
+
+* buffers_suffix replaces consuming_buffers
+* buffers_prefix replaces buffer_prefix
+* buffers_prefix_view replaces buffer_prefix_view
+* buffers_front replaces buffer_front
+* buffers_cat replaces buffer_cat
+* buffers_cat_view replaces buffer_cat_view
+* Remove buffers_suffix::get
+
+Actions Required:
+
+* Use buffers_suffix instead of consuming_buffers
+* Use buffers_prefix instead of buffer_prefix
+* Use buffers_prefix_view instead of buffer_prefix_view
+* Use buffers_front instead of buffer_front
+* Use buffers_cat instead of buffer_cat
+* Use buffers_cat_view instead of buffer_cat_view
+* Avoid calling buffers_suffix::get
+
+--------------------------------------------------------------------------------
+
+Version 116:
+
+API Changes:
+
+* message::body is a member function
+* message::version is a member function
+
+Actions Required:
+
+* Call member function message::body instead of accessing
+ the data member at call sites.
+
+* Call member function message::version instead of accessing
+ the version member at call sites.
+
+--------------------------------------------------------------------------------
+
+Version 115:
+
+* Update README.md master doc link
+
+--------------------------------------------------------------------------------
+
+Version 114:
+
+(No changes)
+
+--------------------------------------------------------------------------------
+
+Version 113:
+
+* Fix handler signature in async_read_header
+* Remove field_range copy constructor
+
+--------------------------------------------------------------------------------
+
+Version 112:
+
+* Update websocket notes
+
+API Changes:
+
+* WebSocket writes return the bytes transferred
+
+* HTTP reads and writes return bytes transferred
+
+Actions Required:
+
+* Modify websocket write completion handlers to receive
+ the extra std::size_t bytes_transferred parameter.
+
+* Modify HTTP read and/or write completion handlers to
+ receive the extra std::size_t bytes_transferred parameter.
+
+--------------------------------------------------------------------------------
+
+Version 111:
+
+WebSocket:
+
+* Fix utf8 check split code point at buffer end
+* Refactor stream operations and tests plus coverage
+* Suspended ops special members
+
+--------------------------------------------------------------------------------
+
+Version 110:
+
+* Refactor stream open state variable
+* Refactor websocket stream members
+* Refactor websocket stream: fixes and tests
+* Add test::stream::lowest_layer
+* Fix invalid iterator in test reporter
+
+--------------------------------------------------------------------------------
+
+Version 109:
+
+* refactor test::stream
+
+WebSocket:
+
+* Fix async_read_some handler signature
+* websocket close fixes and tests
+* websocket handshake uses coroutine
+* websocket ping tests
+* Fix websocket close_op resume state
+* websocket write tests
+* split up websocket tests
+* websocket read tests
+
+API Changes:
+
+* websocket accept refactoring
+
+Actions Required:
+
+* Do not call websocket accept overloads which take
+ both a message and a buffer sequence, as it is
+ illegal per rfc6455.
+
+--------------------------------------------------------------------------------
+
+Version 108:
+
+* Fix argument parsing in HTTP examples
+* Don't use async_write_msg in examples
+
+--------------------------------------------------------------------------------
+
+Version 107:
+
+* Use test::stream
+
+WebSocket
+
+* Fix done state for WebSocket reads
+* Fix utf8 check for compressed frames
+* Rename frame and header buffer types
+
+--------------------------------------------------------------------------------
+
+Version 106:
+
+* Dynamic buffer input areas are mutable
+* Add flat_static_buffer::reset
+
+HTTP:
+
+* Fix for basic_parser::skip(true) and docs
+
+WebSocket:
+
+* websocket test improvements
+* Remove obsolete write_op
+* Refactor write_op
+* Refactor ping_op
+* Refactor fail_op
+* Refactor read_op
+* Refactor close_op
+* Refactor read_op + fail_op
+* Websocket close will automatically drain
+* Autobahn|Testsuite fixes
+* Tidy up utf8_checker and tests
+
+--------------------------------------------------------------------------------
+
+Version 105:
+
+* Fix compile error in websocket snippet
+* Tidy up Jamfile and tests
+
+--------------------------------------------------------------------------------
+
+Version 104:
+
+* Remove unused include
+* Use #error in config.hpp
+* Only set -std=c++11 on Travis
+* Only set /permissive- on Appveyor
+* Tidy up some test warnings
+* tools/ renamed from build/
+
+WebSocket:
+
+* Fix pausation::save
+
+--------------------------------------------------------------------------------
+
+Version 103:
+
+* Boost test matrix fixes
+* Tidy up allocator usage
+* Example HTTP server fixes
+
+--------------------------------------------------------------------------------
+
+Version 102:
+
+* Section headings in examples
+
+--------------------------------------------------------------------------------
+
+Version 101:
+
+* Refactor all examples
+
+--------------------------------------------------------------------------------
+
+Version 100:
+
+* Fix doc convenience includes
+* Fix doc includes
+* Remove unused test header
+* Rename test macros
+* Reorder define test macro params
+* vcxproj workaround for include symlinks
+* Add variadic min/max
+
+WebSocket:
+
+* Remove obsolete frame tests
+* Refactor fail/clode code
+* Call do_fail from read_some
+* eof on accept returns error::closed
+* Fix stream::read_size_hint calculation
+* Documentation
+
+API Changes:
+
+* Calls to stream::close and stream::async_close will
+ automatically perform the required read operations
+
+* drain_buffer is removed
+
+* role_type replaces teardown_tag
+
+Actions Required:
+
+* Remove calling code which drains the connection after
+ calling stream::close or stream::async_close
+
+* Replace code which uses drain_buffer. For websocket::stream,
+ it is no longer necessary to manually drain the connection
+ after closing.
+
+* Modify signatures of teardown and async_teardown to use
+ role_type instead of teardown_tag
+
+* Change calls to teardown and async_teardown to pass the
+ correct role_type, client or server, depending on context.
+
+--------------------------------------------------------------------------------
+
+Version 99:
+
+* Log the value of LIB_DIR for doc builds (debug)
+* Use correct handler signature in fail_op
+* Fix doc typo
+
+--------------------------------------------------------------------------------
+
+Version 98:
+
+* basic_fields::key_compare is noexcept
+* Fix bench-zlib cmake
+* Use unique names Jam projects
+* Trim utf8 checker test
+
+--------------------------------------------------------------------------------
+
+Version 97:
+
+* Update redirect
+
+--------------------------------------------------------------------------------
+
+Version 96:
+
+* Move bench/ to test/
+* Move extras/ to test/
+* Use <valgrind> property
+* Rename wsload compile target
+* Fix library.json
+* Update boostorg links
+* Add bench-zlib
+* Faster zlib tests
+* Less compression on websocket test
+
+--------------------------------------------------------------------------------
+
+Version 95:
+
+* Tidy up Travis build scripts
+* Move scripts to build/
+* Fix race in test::pipe
+* close on test::pipe teardown
+* Add test::stream
+* Tidy up static_buffer braced init
+* Fix html redirect
+* Add valgrind variant, fix false positives
+
+--------------------------------------------------------------------------------
+
+Version 94:
+
+* Use off-site Quick Start link temporarily
+
+--------------------------------------------------------------------------------
+
+Version 93:
+
+* Unset BOOST_COROUTINES_NO_DEPRECATION_WARNING
+
+--------------------------------------------------------------------------------
+
+Version 92:
+
+* Fix typo in test/CMakeLists.txt
+* basic_fields::value_type is not copyable
+* Update repository links in source comments
+* Ignore Content-Length in some cases
+* Tidy up doc snippet paths
+* Use off-site doc link
+
+--------------------------------------------------------------------------------
+
+Version 91:
+
+* Adjust redirect html
+* Don't build pre-C++11
+* source.dox is path-independent
+* Tidy up namespace qualifiers
+* Tidy up MSVC CMakeLists.txt
+* Optimize buffered_read_stream
+* constexpr in derived buffers
+* Set BOOST_ASIO_NO_DEPRECATED
+* Use Asio array optimization in static_buffer_base
+* Rename wstest source file
+* Use fopen_s on Windows
+* Fix Appveyor script
+* Update project metadata
+* Move benchmarks to bench/
+* Fix doc title
+* Build stand-alone doc
+* Update doc copyrights
+* Refactor test build scripts
+
+WebSocket:
+
+* Tidy up websocket javadocs
+* Refactor accept, handshake ops
+* Use read buffer instead of buffered stream
+
+API Changes
+
+* control frame callbacks are non-const references
+
+Actions Required:
+
+* Modify calls to set the control frame callback, to
+ pass non-const reference instances, and manage the
+ lifetime of the instance.
+
+--------------------------------------------------------------------------------
+
+Version 90:
+
+* Fix websocket read of zero length message
+* Fix typo in equal_range
+* Output to integrated documentation
+
+--------------------------------------------------------------------------------
+
+Version 89:
+
+* Fix CONTRIBUTING.md links
+
+--------------------------------------------------------------------------------
+
+Version 88:
+
+* Update doc links in README.md
+* Refactor tests Jamfile
+* Don't use program_options
+
+WebSocket:
+
+* Fix uninitialized frame done
+
+--------------------------------------------------------------------------------
+
+Version 87:
+
+* Update appveyor for Boost branch
+* Rename to BEAST_EXPECT
+* variant fixes and tests
+* Update README, add CONTRIBUTING.md and CODE_OF_CONDUCT.md
+
+--------------------------------------------------------------------------------
+
+Version 86:
+
+* Boost prep
+* Remove use of lexical_cast
+* Use custom variant
+* Update README.md
+* Add local-travis.sh
+* Use winapi
+* Update CMakeLists.txt for boost
+* Update documentation for boost
+* Update copyrights
+* Remove spurious declaration
+* Tidy up Jamfile
+* Normalize doc build scripts
+* Use configured doxygen and xsltproc
+* Fix Deferred Body Type Example Documentation
+* Add library metadata
+
+API Changes:
+
+* websocket read returns the number of bytes inserted
+
+Actions Required:
+
+* Change the signature of completion handlers used with
+ websocket::stream::async_read to void(error_code, std::size_t)
+
+--------------------------------------------------------------------------------
+
+Version 85:
+
+* Fix test failure
+* Tidy up test warning
+
+--------------------------------------------------------------------------------
+
+Version 84:
+
+* Tidy up buffer_front
+* static_buffer::consume improvement
+* multi_buffer is type-check friendly
+* bind_handler allows placeholders
+* Add consuming_buffers::get
+
+WebSocket:
+
+* WebSocket read optimization
+
+API Changes:
+
+* websocket::stream::read_buffer_size is removed
+
+Actions Required:
+
+* Remove calls websocket::stream::read_buffer_size
+* Use read_some and write_some instead of read_frame and write_frame
+
+--------------------------------------------------------------------------------
+
+Version 83:
+
+* Add flat_static_buffer::mutable_data
+* Add buffer_front
+* Add wstest compression option
+* Turn some flat_static_buffer_tests on
+* Documentation work
+* read_some, async_read_some return bytes used
+* Fix private timer::clock_type
+
+WebSocket
+
+* Add wstest compression option
+* Fix buffer lifetime in websocket write
+
+API Changes:
+
+* Add static_buffer
+
+Actions Required:
+
+* Callers who depend on static_buffer returning sequences of
+ exactly length one should switch to flat_static_buffer.
+
+--------------------------------------------------------------------------------
+
+Version 82:
+
+* Documentation tidying
+* is_invocable works with move-only types
+* Use std::function and reference wrapper
+* Add session_alloc to example/common
+* Silence spurious warning
+
+HTTP
+
+* Fix extraneous argument in async_write_header
+
+WebSocket
+
+* stream tidying
+* Add rd_close_ to websocket stream state
+* stream uses flat_buffer
+* accept requires a message
+* Add wstest benchmark tool
+
+API Changes:
+
+* Rename to flat_static_buffer and flat_static_buffer_base
+
+Actions Required:
+
+* Rename static_buffer to flat_static_buffer_base
+* Rename static_buffer_n to flat_static_buffer
+
+--------------------------------------------------------------------------------
+
+Version 81:
+
+* Pass string_view by value
+* better is_final on empty_base_optimization
+* Suppress incorrect GCC warning
+* multi_buffer ctor is explicit
+* File is not copy-constructible
+
+API Changes:
+
+* Refactor basic_parser, chunk parsing:
+
+Actions Required:
+
+* Adjust signatures for required members of user-defined
+ subclasses of basic_parser
+
+* Use the new basic_parser chunk callbacks for accessing
+ chunk extensions and chunk bodies.
+
+--------------------------------------------------------------------------------
+
+Version 80:
+
+* Javadoc tidying
+* Add basic_dynamic_body.hpp
+* Shrink buffer_prefix_view
+* Remove unused file_path
+* Add basic_file_body.hpp
+* buffers_ref is Assignable
+
+HTTP
+
+* Shrink chunk header buffer sequence size
+
+API Changes:
+
+* Refactor chunked-encoding serialization
+
+Actions Required:
+
+* Remove references to ChunkDecorators. Use the new chunk-encoding
+ buffer sequences to manually produce a chunked payload body in
+ the case where control over the chunk-extensions and/or trailers
+ is required.
+
+--------------------------------------------------------------------------------
+
+Version 79:
+
+* Remove spurious fallthrough guidance
+
+--------------------------------------------------------------------------------
+
+Version 78:
+
+* Add span
+* Documentation work
+* Use make_unique_noinit
+* Fix warning in zlib
+* Header file tidying
+* Tidy up FieldsReader doc
+* Add Boost.Locale utf8 benchmark comparison
+* Tidy up dstream for existing Boost versions
+* Tidy up file_posix unused variable
+* Fix warning in root ca declaration
+
+HTTP:
+
+* Tidy up basic_string_body
+* Add vector_body
+* span, string, vector bodies are public
+* Fix spurious uninitialized warning
+* fields temp string uses allocator
+
+API Changes:
+
+* Add message::keep_alive()
+* Add message::chunked() and message::content_length()
+* Remove string_view_body
+
+Actions Required:
+
+* Change user defined implementations of Fields and
+ FieldsReader to meet the new requirements.
+
+* Use span_body<char> instead of string_view_body
+
+--------------------------------------------------------------------------------
+
+Version 77:
+
+* file_posix works without large file support
+
+--------------------------------------------------------------------------------
+
+Version 76:
+
+* Always go through write_some
+* Use Boost.Config
+* BodyReader may construct from a non-const message
+* Add serializer::get
+* Add serializer::chunked
+* Serializer members are not const
+* serializing file_body is not const
+* Add file_body_win32
+* Fix parse illegal characters in obs-fold
+* Disable SSE4.2 optimizations
+
+API Changes:
+
+* Rename to serializer::keep_alive
+* BodyReader, BodyWriter use two-phase init
+
+Actions Required:
+
+* Use serializer::keep_alive instead of serializer::close and
+ take the logical NOT of the return value.
+
+* Modify instances of user-defined BodyReader and BodyWriter
+ types to perform two-phase initialization, as per the
+ updated documented type requirements.
+
+--------------------------------------------------------------------------------
+
+Version 75:
+
+* Use file_body for valid requests, string_body otherwise.
+* Construct buffer_prefix_view in-place
+* Shrink serializer buffers using buffers_ref
+* Tidy up BEAST_NO_BIG_VARIANTS
+* Shrink serializer buffers using buffers_ref
+* Add serializer::limit
+* file_body tests
+* Using SSE4.2 intrinsics in basic_parser if available
+
+--------------------------------------------------------------------------------
+
+Version 74:
+
+* Add file_stdio and File concept
+* Add file_win32
+* Add file_body
+* Remove common/file_body.hpp
+* Add file_posix
+* Fix Beast include directories for cmake targets
+* remove redundant flush() from example
+
+--------------------------------------------------------------------------------
+
+Version 73:
+
+* Jamroot tweak
+* Verify certificates in SSL clients
+* Adjust benchmarks
+* Initialize local variable in basic_parser
+* Fixes for gcc-4.8
+
+HTTP:
+
+* basic_parser optimizations
+* Add basic_parser tests
+
+API Changes:
+
+* Refactor header and message constructors
+* serializer::next replaces serializer::get
+
+Actions Required:
+
+* Evaluate each message constructor call site and
+ adjust the constructor argument list as needed.
+
+* Use serializer::next instead of serializer::get at call sites
+
+--------------------------------------------------------------------------------
+
+Version 72:
+
+HTTP:
+
+* Tidy up set payload in http-server-fast
+* Refine Body::size specification
+* Newly constructed responses have a 200 OK result
+* Refactor file_body for best practices
+* Add http-server-threaded example
+* Documentation tidying
+* Various improvements to http_server_fast.cpp
+
+WebSocket:
+
+* Add websocket-server-async example
+
+--------------------------------------------------------------------------------
+
+Version 71:
+
+* Fix extra ; warning
+* Documentation revision
+* Fix spurious on_chunk invocation
+* Call prepare_payload in HTTP example
+* Check trailers in test
+* Fix buffer overflow handling for string_body and mutable_body
+* Concept check in basic_dynamic_body
+* Tidy up http_sync_port error check
+* Tidy up Jamroot /permissive-
+
+WebSockets:
+
+* Fine tune websocket op asserts
+* Refactor websocket composed ops
+* Allow close, ping, and write to happen concurrently
+* Fix race in websocket read op
+* Fix websocket write op
+* Add cmake options for examples and tests
+
+API Changes:
+
+* Return `std::size_t` from `Body::writer::put`
+
+Actions Required:
+
+* Return the number of bytes actually transferred from the
+ input buffers in user defined `Body::writer::put` functions.
+
+--------------------------------------------------------------------------------
+
+Version 70:
+
+* Serialize in one step when possible
+* Add basic_parser header and body limits
+* Add parser::on_header to set a callback
+* Fix BEAST_FALLTHROUGH
+* Fix HEAD response in file_service
+
+API Changes:
+
+* Rename to message::base
+* basic_parser default limits are now 1MB/8MB
+
+Actions Required:
+
+* Change calls to message::header_part() with message::base()
+
+* Call body_limit and/or header_limit as needed to adjust the
+ limits to suitable values if the defaults are insufficient.
+
+--------------------------------------------------------------------------------
+
+Version 69:
+
+* basic_parser optimizations
+* Use BEAST_FALLTHROUGH to silence warnings
+* Add /permissive- to msvc toolchain
+
+--------------------------------------------------------------------------------
+
+Version 68:
+
+* Split common tests to a new project
+* Small speed up in fields comparisons
+* Adjust buffer size in fast server
+* Use string_ref in older Boost versions
+* Optimize field lookups
+* Add const_body, mutable_body to examples
+* Link statically on cmake MSVC
+
+API Changes:
+
+* Change BodyReader, BodyWriter requirements
+* Remove BodyReader::is_deferred
+* http::error::bad_target replaces bad_path
+
+Actions Required:
+
+* Change user defined instances of BodyReader and BodyWriter
+ to meet the new requirements.
+
+* Replace references to http::error::bad_path with http::error::bad_target
+
+--------------------------------------------------------------------------------
+
+Version 67:
+
+* Fix doc example link
+* Add http-server-small example
+* Merge stream_base to stream and tidy
+* Use boost::string_view
+* Rename to http-server-fast
+* Appveyor use Boost 1.64.0
+* Group common example headers
+
+API Changes:
+
+* control_callback replaces ping_callback
+
+Actions Required:
+
+* Change calls to websocket::stream::ping_callback to use
+ websocket::stream::control_callback
+
+* Change user defined ping callbacks to have the new
+ signature and adjust the callback definition appropriately.
+
+--------------------------------------------------------------------------------
+
+Version 66:
+
+* string_param optimizations
+* Add serializer request/response aliases
+* Make consuming_buffers smaller
+* Fix costly potential value-init in parser
+* Fix unused parameter warning
+* Handle bad_alloc in parser
+* Tidy up message piecewise ctors
+* Add header aliases
+* basic_fields optimizations
+* Add http-server example
+* Squelch spurious warning on gcc
+
+--------------------------------------------------------------------------------
+
+Version 65:
+
+* Enable narrowing warning on msvc cmake
+* Fix integer types in deflate_stream::bi_reverse
+* Fix narrowing in static_ostream
+* Fix narrowing in ostream
+* Fix narrowing in inflate_stream
+* Fix narrowing in deflate_stream
+* Fix integer warnings
+* Enable unused variable warning on msvc cmake
+
+--------------------------------------------------------------------------------
+
+Version 64:
+
+* Simplify buffered_read_stream composed op
+* Simplify ssl teardown composed op
+* Simplify websocket write_op
+* Exemplars are compiled code
+* Better User-Agent in examples
+* async_write requires a non-const message
+* Doc tidying
+* Add link_directories to cmake
+
+API Changes:
+
+* Remove make_serializer
+
+Actions Required:
+
+* Replace calls to make_serializer with variable declarations
+
+--------------------------------------------------------------------------------
+
+Version 63:
+
+* Use std::to_string instead of lexical_cast
+* Don't use cached Boost
+* Put num_jobs back up on Travis
+* Only build and run tests in variant=coverage
+* Move benchmarks to a separate project
+* Only run the tests under ubasan
+* Tidy up CMakeLists.txt
+* Tidy up Jamfiles
+* Control running with valgrind explicitly
+
+--------------------------------------------------------------------------------
+
+Version 62:
+
+* Remove libssl-dev from a Travis matrix item
+* Increase detail::static_ostream coverage
+* Add server-framework tests
+* Doc fixes and tidy
+* Tidy up namespaces in examples
+* Clear the error faster
+* Avoid explicit operator bool for error
+* Add http::is_fields trait
+* Squelch harmless not_connected errors
+* Put slow tests back for coverage builds
+
+API Changes:
+
+* parser requires basic_fields
+* Refine FieldsReader concept
+* message::prepare_payload replaces message::prepare
+
+Actions Required:
+
+* Callers using `parser` with Fields types other than basic_fields
+ will need to create their own subclass of basic_parser to work
+ with their custom fields type.
+
+* Implement chunked() and keep_alive() for user defined FieldsReader types.
+
+* Change calls to msg.prepare to msg.prepare_payload. For messages
+ with a user-defined Fields, provide the function prepare_payload_impl
+ in the fields type according to the Fields requirements.
+
+--------------------------------------------------------------------------------
+
+Version 61:
+
+* Remove Spirit dependency
+* Use generic_cateogry for errno
+* Reorganize SSL examples
+* Tidy up some integer conversion warnings
+* Add message::header_part()
+* Tidy up names in error categories
+* Flush the output stream in the example
+* Clean close in Secure WebSocket client
+* Add server-framework SSL HTTP and WebSocket ports
+* Fix shadowing warnings
+* Tidy up http-crawl example
+* Add multi_port to server-framework
+* Tidy up resolver calls
+* Use one job on CI
+* Don't run slow tests on certain targets
+
+API Changes:
+
+* header::version is unsigned
+* status-codes is unsigned
+
+--------------------------------------------------------------------------------
+
+Version 60:
+
+* String comparisons are public interfaces
+* Fix response message type in async websocket accept
+* New server-framework, full featured server example
+
+--------------------------------------------------------------------------------
+
+Version 59:
+
+* Integrated Beast INTERFACE (cmake)
+* Fix base64 alphabet
+* Remove obsolete doc/README.md
+
+API Changes:
+
+* Change Body::size signature (API Change):
+
+Actions Required:
+
+* For any user-defined models of Body, change the function signature
+ to accept `value_type const&` and modify the function definition
+ accordingly.
+
+--------------------------------------------------------------------------------
+
+Version 58:
+
+* Fix unaligned reads in utf8-checker
+* Qualify size_t in message template
+* Reorganize examples
+* Specification for http read
+* Avoid `std::string` in websocket
+* Fix basic_fields insert ordering
+* basic_fields::set optimization
+* basic_parser::put doc
+* Use static string in basic_fields::reader
+* Remove redundant code
+* Fix parsing chunk size with leading zeroes
+* Better message formal parameter names
+
+API Changes:
+
+* `basic_fields::set` renamed from `basic_fields::replace`
+
+Actions Required:
+
+* Rename calls to `basic_fields::replace` to `basic_fields::set`
+
+--------------------------------------------------------------------------------
+
+Version 57:
+
+* Fix message.hpp javadocs
+* Fix warning in basic_parser.cpp
+* Integrate docca for documentation and tidy
+
+--------------------------------------------------------------------------------
+
+Version 56:
+
+* Add provisional IANA header field names
+* Add string_view_body
+* Call on_chunk when the extension is empty
+* HTTP/1.1 is the default version
+* Try harder to find Boost (cmake)
+* Reset error codes
+* More basic_parser tests
+* Add an INTERFACE cmake target
+* Convert buffer in range loops
+
+--------------------------------------------------------------------------------
+
+Version 55:
+
+* Don't allocate memory to handle obs-fold
+* Avoid a parser allocation using non-flat buffer
+* read_size replaces read_size_helper
+
+--------------------------------------------------------------------------------
+
+Version 54:
+
+* static_buffer coverage
+* flat_buffer coverage
+* multi_buffer coverage
+* consuming_buffers members and coverage
+* basic_fields members and coverage
+* Add string_param
+* Retain ownership when reading using a message
+* Fix incorrect use of [[fallthrough]]
+
+API Changes:
+
+* basic_fields refactor
+
+--------------------------------------------------------------------------------
+
+Version 53:
+
+* Fix basic_parser::maybe_flatten
+* Fix read_size_helper usage
+
+--------------------------------------------------------------------------------
+
+Version 52:
+
+* flat_buffer is an AllocatorAwareContainer
+* Add drain_buffer class
+
+API Changes:
+
+* `auto_fragment` is a member of `stream`
+* `binary`, `text` are members of `stream`
+* read_buffer_size is a member of `stream`
+* read_message_max is a member of `stream`
+* `write_buffer_size` is a member of `stream`
+* `ping_callback` is a member of stream
+* Remove `opcode` from `read`, `async_read`
+* `read_frame` returns `bool` fin
+* `opcode` is private
+* finish(error_code&) is a BodyReader requirement
+
+Actions Required:
+
+* Change call sites which use `auto_fragment` with `set_option`
+ to call `stream::auto_fragment` instead.
+
+* Change call sites which use message_type with `set_option`
+ to call `stream::binary` or `stream::text` instead.
+
+* Change call sites which use `read_buffer_size` with `set_option` to
+ call `stream::read_buffer_size` instead.
+
+* Change call sites which use `read_message_max` with `set_option` to
+ call `stream::read_message_max` instead.
+
+* Change call sites which use `write_buffer_size` with `set_option` to
+ call `stream::write_buffer_size` instead.
+
+* Change call sites which use `ping_callback1 with `set_option` to
+ call `stream::ping_callback` instead.
+
+* Remove the `opcode` reference parameter from calls to synchronous
+ and asynchronous read functions, replace the logic with calls to
+ `stream::got_binary` and `stream::got_text` instead.
+
+* Remove the `frame_info` parameter from all read frame call sites
+
+* Check the return value 'fin' for calls to `read_frame`
+
+* Change ReadHandlers passed to `async_read_frame` to have
+ the signature `void(error_code, bool fin)`, use the `bool`
+ to indicate if the frame is the last frame.
+
+* Remove all occurrences of the `opcode` enum at call sites
+
+--------------------------------------------------------------------------------
+
+Version 51
+
+* Fix operator<< for header
+* Tidy up file_body
+* Fix file_body::get() not setting the more flag correctly
+* Use BOOST_FALLTHROUGH
+* Use BOOST_STRINGIZE
+* DynamicBuffer benchmarks
+* Add construct, destroy to handler_alloc
+* Fix infinite loop in basic_parser
+
+API Changes:
+
+* Tune up static_buffer
+* multi_buffer implementation change
+
+Actions Required:
+
+* Call sites passing a number to multi_buffer's constructor
+ will need to be adjusted, see the corresponding commit message.
+
+--------------------------------------------------------------------------------
+
+Version 50
+
+* parser is constructible from other body types
+* Add field enumeration
+* Use allocator more in basic_fields
+* Fix basic_fields allocator awareness
+* Use field in basic_fields and call sites
+* Use field in basic_parser
+* Tidy up basic_fields, header, and field concepts
+* Fields concept work
+* Body documentation work
+* Add missing handler_alloc nested types
+* Fix chunk delimiter parsing
+* Fix test::pipe read_size
+* Fix chunk header parsing
+
+API Changes:
+
+* Remove header_parser
+* Add verb to on_request for parsers
+* Refactor prepare
+* Protect basic_fields special members
+* Remove message connection settings
+* Remove message free functions
+* Remove obsolete serializer allocator
+* http read_some, async_read_some don't return bytes
+
+--------------------------------------------------------------------------------
+
+Version 49
+
+* Use <iosfwd> instead of <ostream>
+
+HTTP:
+
+* Add HEAD request example
+
+API Changes:
+
+* Refactor method and verb
+* Canonicalize string_view parameter types
+* Tidy up empty_body writer error
+* Refactor header status, reason, and target
+
+--------------------------------------------------------------------------------
+
+Version 48
+
+* Make buffer_prefix_view public
+* Remove detail::sync_ostream
+* Tidy up core type traits
+
+API Changes:
+
+* Tidy up chunk decorator
+* Rename to buffer_cat_view
+* Consolidate parsers to parser.hpp
+* Rename to parser
+
+--------------------------------------------------------------------------------
+
+Version 47
+
+* Disable operator<< for buffer_body
+* buffer_size overload for basic_multi_buffer::const_buffers_type
+* Fix undefined behavior in pausation
+* Fix leak in basic_flat_buffer
+
+API Changes:
+
+* Refactor treatment of request-method
+* Refactor treatment of status code and obsolete reason
+* Refactor HTTP serialization and parsing
+
+--------------------------------------------------------------------------------
+
+Version 46
+
+* Add test::pipe
+* Documentation work
+
+API Changes:
+
+* Remove HTTP header aliases
+* Refactor HTTP serialization
+* Refactor type traits
+
+--------------------------------------------------------------------------------
+
+Version 45
+
+* Workaround for boost::asio::basic_streambuf type check
+* Fix message doc image
+* Better test::enable_yield_to
+* Fix header::reason
+* Documentation work
+* buffer_view skips empty buffer sequences
+* Disable reverse_iterator buffer_view test
+
+--------------------------------------------------------------------------------
+
+Version 44
+
+* Use BOOST_THROW_EXCEPTION
+* Tidy up read_size_helper and dynamic buffers
+* Require Boost 1.58.0 or later
+* Tidy up and make get_lowest_layer public
+* Use BOOST_STATIC_ASSERT
+* Fix async return values in docs
+* Fix README websocket example
+* Add buffers_adapter regression test
+* Tidy up is_dynamic_buffer traits test
+* Make buffers_adapter meet requirements
+
+--------------------------------------------------------------------------------
+
+Version 43
+
+* Require Boost 1.64.0
+* Fix strict aliasing warnings in buffers_view
+* Tidy up buffer_prefix overloads and test
+* Add write limit to test::string_ostream
+* Additional constructors for consuming_buffers
+
+--------------------------------------------------------------------------------
+
+Version 42
+
+* Fix javadoc typo
+* Add formal review notes
+* Make buffers_view a public interface
+
+--------------------------------------------------------------------------------
+
+Version 41
+
+* Trim Appveyor matrix rows
+* Concept revision and documentation
+* Remove coveralls integration
+* Tidy up formal parameter names
+
+WebSocket
+
+* Tidy up websocket::close_code enum and constructors
+
+API Changes
+
+* Return http::error::end_of_stream on HTTP read eof
+* Remove placeholders
+* Rename prepare_buffer(s) to buffer_prefix
+* Remove handler helpers, tidy up hook invocations
+
+--------------------------------------------------------------------------------
+
+Version 40
+
+* Add to_static_string
+* Consolidate get_lowest_layer in type_traits.hpp
+* Fix basic_streambuf movable trait
+* Tidy up .travis.yml
+
+--------------------------------------------------------------------------------
+
+Version 39
+
+Beast versions are now identified by a single integer which
+is incremented on each merge. The macro BEAST_VERSION
+identifies the version number, currently at 39. A version
+setting commit will always be at the tip of the master
+and develop branches.
+
+* Use beast::string_view alias
+* Fixed braced-init error with older gcc
+
+HTTP
+
+* Tidy up basic_parser javadocs
+
+WebSocket:
+
+* Add websocket async echo ssl server test:
+* Fix eof error on ssl::stream shutdown
+
+API Changes:
+
+* Refactor http::header contents
+* New ostream() returns dynamic buffer output stream
+* New buffers() replaces to_string()
+* Rename to multi_buffer, basic_multi_buffer
+* Rename to flat_buffer, basic_flat_buffer
+* Rename to static_buffer, static_buffer_n
+* Rename to buffered_read_stream
+* Harmonize concepts and identifiers with net-ts
+* Tidy up HTTP reason_string
+
+--------------------------------------------------------------------------------
+
+1.0.0-b38
+
+* Refactor static_string
+* Refactor base64
+* Use static_string for WebSocket handshakes
+* Simplify get_lowest_layer test
+* Add test_allocator to extras/test
+* More flat_streambuf tests
+* WebSocket doc work
+* Prevent basic_fields operator[] assignment
+
+API Changes:
+
+* Refactor WebSocket error codes
+* Remove websocket::keep_alive option
+
+--------------------------------------------------------------------------------
+
+1.0.0-b37
+
+* CMake hide command lines in .vcxproj Output windows"
+* Rename to detail::is_invocable
+* Rename project to http-bench
+* Fix flat_streambuf
+* Add ub sanitizer blacklist
+* Add -funsigned-char to asan build target
+* Fix narrowing warning in table constants
+
+WebSocket:
+
+* Add is_upgrade() free function
+* Document websocket::stream thread safety
+* Rename to websocket::detail::pausation
+
+API Changes:
+
+* Provide websocket::stream accept() overloads
+* Refactor websocket decorators
+* Move everything in basic_fields.hpp to fields.hpp
+* Rename to http::dynamic_body, consolidate header
+
+--------------------------------------------------------------------------------
+
+1.0.0-b36
+
+* Update README.md
+
+--------------------------------------------------------------------------------
+
+1.0.0-b35
+
+* Add Appveyor build scripts and badge
+* Tidy up MSVC CMake configuration
+* Make close_code a proper enum
+* Add flat_streambuf
+* Rename to BEAST_DOXYGEN
+* Update .gitignore for VS2017
+* Fix README.md CMake instructions
+
+API Changes:
+
+* New HTTP interfaces
+* Remove http::empty_body
+
+--------------------------------------------------------------------------------
+
+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
+
+* Fix race in pings during reads
+* Fix race in close frames during reads
+* Fix race when write suspends
+* Allow concurrent websocket async ping and writes
+
+--------------------------------------------------------------------------------
+
+1.0.0-b29
+
+* Fix compilation error in non-template class
+* Document type-pun in buffer_cat
+* Correctly check ostream modifier (/extras)
+
+HTTP
+
+* Fix Body requirements doc
+* Fix illegal HTTP characters accepted as hex zero
+* Fix Writer return value documentation
+
+WebSocket
+
+* Fix race in writes during reads
+* Fix doc link typo
+
+--------------------------------------------------------------------------------
+
+1.0.0-b28
+
+* Split out and rename test stream classes
+* Restyle async result constructions
+* Fix HTTP split parse edge case
+
+--------------------------------------------------------------------------------
+
+1.0.0-b27
+
+* Tidy up tests and docs
+* Add documentation building instructions
+
+API Changes:
+
+* Invoke callback on pings and pongs
+* Move basic_streambuf to streambuf.hpp
+
+--------------------------------------------------------------------------------
+
+1.0.0-b26
+
+* Tidy up warnings and tests
+
+--------------------------------------------------------------------------------
+
+1.0.0-b25
+
+* Fixes for WebSocket echo server
+* Fix 32-bit arm7 warnings
+* Remove unnecessary include
+* WebSocket server examples and test tidying
+* Fix deflate setup bug
+
+API Changes:
+
+* Better handler_ptr
+
+--------------------------------------------------------------------------------
+
+1.0.0-b24
+
+* bjam use clang on MACOSX
+* Simplify Travis package install specification
+* Add optional yield_to arguments
+* Make decorator copyable
+* Add WebSocket permessage-deflate extension support
+
+--------------------------------------------------------------------------------
+
+1.0.0-b23
+
+* Tune websocket echo server for performance
+* Add file and line number to thrown exceptions
+* Better logging in async echo server
+* Add copy special members
+* Fix message constructor and special members
+* Travis CI improvements
+
+--------------------------------------------------------------------------------
+
+1.0.0-b22
+
+* Fix broken Intellisense
+* Implement the Asio deallocation-before-invocation guarantee
+* Add handler helpers
+* Avoid copies in handler_alloc
+* Update README.md example programs
+* Fix websocket stream read documentation
+* Disable Boost.Coroutine deprecation warning
+* Update documentation examples
+
+--------------------------------------------------------------------------------
+
+1.0.0-b21
+
+* Remove extraneous includes
+
+--------------------------------------------------------------------------------
+
+1.0.0-b20
+
+ZLib
+
+* Add ZLib module
+
+API Changes:
+
+* Rename HTTP identifiers
+
+--------------------------------------------------------------------------------
+
+1.0.0-b19
+
+* Boost library min/max guidance
+* Improvements to code coverage
+* Use boost::lexical_cast instead of std::to_string
+* Fix prepare_buffers value_type
+* Fix consuming_buffers value_type
+* Better buffer_cat
+
+HTTP
+
+* Make chunk_encode public
+* Add write, async_write, operator<< for message_headers
+* Add read, async_read for message_headers
+* Fix with_body example
+
+WebSocket
+
+* Optimize utf8 validation
+* Optimize mask operations
+
+API Changes:
+
+* Refactor message and message_headers declarations
+* prepared_buffers is private
+* consume_buffers is removed
+
+--------------------------------------------------------------------------------
+
+1.0.0-b18
+
+* Increase optimization settings for MSVC builds
+
+HTTP
+
+* Check invariants in parse_op:
+* Clean up message docs
+
+WebSocket
+
+* Write buffer option does not change capacity
+* Close connection during async_read on close frame
+* Add pong, async pong to stream
+
+Core
+
+* Meet DynamicBuffer requirements for static_streambuf
+* Fix write_frame masking and auto-fragment handling
+
+Extras
+
+* unit_test::suite fixes:
+ - New overload of fail() specifies file and line
+ - BEAST_EXPECTS only evaluates the reason string on a failure
+* Add zlib module
+
+--------------------------------------------------------------------------------
+
+1.0.0-b17
+
+* Change implicit to default value in example
+* Tidy up some declarations
+* Fix basic_streambuf::capacity
+* Add basic_streambuf::alloc_size
+* Parser callbacks may not throw
+* Fix Reader concept doc typo
+* Add is_Reader trait
+* Tidy up basic_headers for documentation
+* Tidy up documentation
+* Add basic_parser_v1::reset
+* Fix handling of body_what::pause in basic_parser_v1
+* Add headers_parser
+* Engaged invokable is destructible
+* Improve websocket example in README.md
+* Refactor read_size_helper
+
+API Changes:
+
+* 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
+* Rework HTTP concepts:
+ - 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
+* basic_parser_v1 requires all callbacks present
+* on_headers parser callback now returns void
+* on_body_what is a new required parser callback returning body_what
+
+--------------------------------------------------------------------------------
+
+1.0.0-b16
+
+* Make value optional in param-list
+* Frame processing routines are member functions
+* Fix on_headers called twice from basic_parser_v1
+* Constrain parser_v1 constructor
+* Improve first line serialization
+* Add pause option to on_headers interface
+* Refactor base_parser_v1 callback traits:
+* Refine Parser concept
+* Relax ForwardIterator requirements in FieldSequence
+* Fix websocket failure testing
+* Refine Writer concept and fix exemplar in documentation
+
+API Changes:
+
+* Rename mask_buffer_size to write_buffer_size
+* Make auto_fragment a boolean option
+
+The message class hierarchy is refactored (breaking change):
+
+* One message class now models both HTTP/1 and HTTP/2 messages
+* message_v1, request_v1, response_v1 removed
+* New classes basic_request and basic_response model
+ messages without the body.
+
+ Error resolution: Callers should use message, request,
+ and response instead of message_v1, request_v1, and
+ response_v1 respectively.
+
+--------------------------------------------------------------------------------
+
+1.0.0-b15
+
+* rfc7230 section 3.3.2 compliance
+* Add HTTPS example
+* Add Secure WebSocket example
+* Fix message_v1 constructor
+* Tidy up DynamicBuffer requirements
+* Tidy up error types and headers
+* Fix handling empty HTTP headers in parser_v1
+
+--------------------------------------------------------------------------------
+
+1.0.0-b14
+
+* Add missing rebind to handler_alloc
+* Fix error handling in http server examples
+* Fix CMake scripts for MinGW
+* Use BOOST_ASSERT
+* Better WebSocket decorator
+* Update and tidy documentation
+
+--------------------------------------------------------------------------------
+
+1.0.0-b13
+
+* dstream improvements
+* Remove bin and bin64 directories
+* Tidy up .vcxproj file groupings
+
+--------------------------------------------------------------------------------
+
+1.0.0-b12
+
+* Use -p to print suites from unit test main.
+* BEAST_EXPECTS to add a reason string to test failures
+* Fix unit test runner to output all case names
+* Update README for build requirements
+* Rename to CHANGELOG.md
+
+--------------------------------------------------------------------------------
+
+1.0.0-b11
+
+* Set URI in generated WebSocket Upgrade requests
+* Rename echo server class and file names
+* Rename to DynamicBuffer in some code and documentation
+* Fix integer warnings in Windows builds
+* Add 32 and 64 bit Windows build support
+* Update README for build instructions and more
+* Add repository and documentation banners
+
+--------------------------------------------------------------------------------
+
+1.0.0-b10
+
+* Fix compilation warnings
+* Add websocketpp comparison to HTML documentation
+
+--------------------------------------------------------------------------------
+
+1.0.0-b9
+
+* Fix CMakeLists.txt
+
+--------------------------------------------------------------------------------
+
+1.0.0-b8
+
+* Fix include in example code
+* Fix basic_headers rfc2616 Section 4.2 compliance
+
+--------------------------------------------------------------------------------
+
+1.0.0-b7
+
+* Fix prepare by calling init. prepare() can throw depending on the
+ implementation of Writer. Publicly provided beast::http writers never throw.
+* Fixes to example HTTP server
+* Fully qualify ambiguous calls to read and parse
+* Remove deprecated http::stream wrapper
+* Example HTTP server now calculates the MIME-type
+* Fixes and documentation for teardown and use with SSL:
+* Add example code to rfc7230 javadocs
+* Remove extraneous header file <beast/http/status.hpp>
+* Add skip_body parser option
+
+--------------------------------------------------------------------------------
+
+1.0.0-b6
+
+* Use SFINAE on return values
+* Use beast::error_code instead of nested types
+* Tidy up use of GENERATING_DOCS
+* Remove obsolete RFC2616 functions
+* Add message swap members and free functions
+* Add HTTP field value parser containers: ext_list, param_list, token_list
+* Fixes for some corner cases in basic_parser_v1
+* Configurable limits on headers and body sizes in basic_parser_v1
+
+API Changes:
+
+* ci_equal is moved to beast::http namespace, in rfc7230.hpp
+
+* "DynamicBuffer","dynabuf" renamed from "Streambuf", "streambuf". See:
+ http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2015/n4478.html#requirements.dynamic_buffers
+
+* basic_parser_v1 adheres to rfc7230 as strictly as possible
+
+--------------------------------------------------------------------------------
diff --git a/src/boost/libs/beast/CMakeLists.txt b/src/boost/libs/beast/CMakeLists.txt
new file mode 100644
index 000000000..92113b1fd
--- /dev/null
+++ b/src/boost/libs/beast/CMakeLists.txt
@@ -0,0 +1,251 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+cmake_minimum_required (VERSION 3.5.1)
+
+if (POLICY CMP0074)
+ cmake_policy (SET CMP0074 NEW)
+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()
+
+#-------------------------------------------------------------------------------
+#
+# Beast
+#
+#-------------------------------------------------------------------------------
+
+project (Beast VERSION 290)
+
+set_property (GLOBAL PROPERTY USE_FOLDERS ON)
+option (Beast_BUILD_EXAMPLES "Build examples" ON)
+option (Beast_BUILD_TESTS "Build tests" ON)
+
+if (MSVC)
+ set (CMAKE_VERBOSE_MAKEFILE FALSE)
+
+ add_definitions (
+ -D_WIN32_WINNT=0x0601
+ -D_SCL_SECURE_NO_WARNINGS=1
+ -D_CRT_SECURE_NO_WARNINGS=1
+ -D_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING
+ -D_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING
+ )
+
+ add_compile_options(
+ /bigobj # large object file format
+ /permissive- # strict C++
+ #/wd4503 # decorated name length exceeded, name was truncated
+ /W4 # enable all warnings
+ /MP # Multi-processor compilation
+ )
+
+ set (Boost_USE_STATIC_LIBS ON)
+ set (Boost_USE_STATIC_RUNTIME ON)
+
+ 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")
+
+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO")
+ set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG")
+
+ # 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 (THREADS_PREFER_PTHREAD_FLAG ON)
+ find_package (Threads)
+ link_libraries(Threads::Threads)
+
+
+ set( CMAKE_CXX_FLAGS
+ "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -Wpedantic -Wno-unused-parameter")
+
+ if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wrange-loop-analysis")
+ endif ()
+endif()
+
+# Must come before Boost includes, otherwise the
+# IDE sees the wrong file due to boost/ symlinks.
+include_directories (include)
+
+#-------------------------------------------------------------------------------
+#
+# OpenSSL
+#
+#-------------------------------------------------------------------------------
+
+if (APPLE AND NOT DEFINED ENV{OPENSSL_ROOT_DIR})
+ find_program(HOMEBREW brew)
+ if (NOT HOMEBREW STREQUAL "HOMEBREW-NOTFOUND")
+ execute_process(COMMAND brew --prefix openssl
+ OUTPUT_VARIABLE OPENSSL_ROOT_DIR
+ OUTPUT_STRIP_TRAILING_WHITESPACE)
+ endif()
+endif()
+
+find_package(OpenSSL)
+if (NOT MSVC)
+ link_libraries(${OPENSSL_LIBRARIES})
+endif()
+
+#-------------------------------------------------------------------------------
+#
+# Boost
+#
+#-------------------------------------------------------------------------------
+
+get_filename_component (BOOST_ROOT ../../ ABSOLUTE)
+
+# VFALCO I want static but "b2 stage" builds a minimal set which excludes static
+add_definitions (-DBOOST_ALL_STATIC_LINK=1)
+
+add_definitions (-DBOOST_ASIO_NO_DEPRECATED=1)
+add_definitions (-DBOOST_ASIO_DISABLE_BOOST_ARRAY=1)
+add_definitions (-DBOOST_ASIO_DISABLE_BOOST_BIND=1)
+add_definitions (-DBOOST_ASIO_DISABLE_BOOST_DATE_TIME=1)
+add_definitions (-DBOOST_ASIO_DISABLE_BOOST_REGEX=1)
+add_definitions (-DBOOST_COROUTINES_NO_DEPRECATION_WARNING=1)
+
+if (MSVC)
+include_directories (${BOOST_ROOT})
+else()
+ set(BOOST_INCLUDEDIR ${BOOST_ROOT})
+ set(BOOST_LIBRARYDIR ${BOOST_ROOT}/stage/lib)
+ find_package(Boost COMPONENTS coroutine filesystem system REQUIRED)
+ link_libraries(Boost::coroutine Boost::filesystem Boost::system)
+endif()
+
+link_directories(${BOOST_ROOT}/stage/lib)
+
+if (MINGW)
+ link_libraries(ws2_32 mswsock)
+endif()
+
+#-------------------------------------------------------------------------------
+
+if ("${VARIANT}" STREQUAL "coverage")
+ if (MSVC)
+ else()
+ set (CMAKE_BUILD_TYPE DEBUG)
+ set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 --coverage")
+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage")
+ endif()
+
+elseif ("${VARIANT}" STREQUAL "ubasan")
+ if (MSVC)
+ else()
+ set (CMAKE_BUILD_TYPE RELWITHDEBINFO)
+ set (CMAKE_CXX_FLAGS
+ "${CMAKE_CXX_FLAGS} -DBOOST_BEAST_NO_SLOW_TESTS=1 -msse4.2 -funsigned-char -fno-omit-frame-pointer -fsanitize=address,undefined -fno-sanitize-recover=address,undefined -fsanitize-blacklist=${PROJECT_SOURCE_DIR}/tools/blacklist.supp")
+ set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined -fno-sanitize-recover=address,undefined")
+ endif()
+
+elseif ("${VARIANT}" STREQUAL "debug")
+ set (CMAKE_BUILD_TYPE DEBUG)
+
+elseif ("${VARIANT}" STREQUAL "release")
+ set (CMAKE_BUILD_TYPE RELEASE)
+
+endif()
+
+#-------------------------------------------------------------------------------
+#
+# Static Libraries
+#
+#-------------------------------------------------------------------------------
+
+add_definitions (-DBOOST_ASIO_SEPARATE_COMPILATION=1)
+add_definitions (-DBOOST_BEAST_SEPARATE_COMPILATION=1)
+
+GroupSources (test "/")
+
+add_library (
+ lib-asio STATIC
+ test/lib_asio.cpp
+)
+
+set_property(TARGET lib-asio PROPERTY FOLDER "static-libs")
+
+add_library (
+ lib-asio-ssl STATIC
+ test/lib_asio_ssl.cpp
+)
+
+set_property(TARGET lib-asio-ssl PROPERTY FOLDER "static-libs")
+
+add_library (
+ lib-beast STATIC
+ test/lib_beast.cpp
+)
+
+set_property(TARGET lib-beast PROPERTY FOLDER "static-libs")
+
+target_link_libraries(lib-beast lib-asio)
+
+#-------------------------------------------------------------------------------
+#
+# Tests and examples
+#
+
+include_directories (.)
+
+if (OPENSSL_FOUND)
+ include_directories (${OPENSSL_INCLUDE_DIR})
+endif()
+
+file (GLOB_RECURSE BOOST_BEAST_FILES
+ ${PROJECT_SOURCE_DIR}/include/boost/beast/*.hpp
+ ${PROJECT_SOURCE_DIR}/include/boost/beast/*.ipp
+)
+
+file (GLOB_RECURSE BOOST_BEAST_EXPERIMENTAL_FILES
+ ${PROJECT_SOURCE_DIR}/include/boost/beast/_experimental/*.hpp
+ ${PROJECT_SOURCE_DIR}/include/boost/beast/_experimental/*.ipp
+)
+
+file (GLOB_RECURSE COMMON_FILES
+ ${PROJECT_SOURCE_DIR}/example/common/*.hpp
+ )
+
+if (Beast_BUILD_EXAMPLES AND
+ (NOT "${VARIANT}" STREQUAL "coverage") AND
+ (NOT "${VARIANT}" STREQUAL "ubasan"))
+ add_subdirectory (example)
+endif()
+
+if (Beast_BUILD_TESTS)
+ add_subdirectory (test)
+endif()
diff --git a/src/boost/libs/beast/CONTRIBUTING.md b/src/boost/libs/beast/CONTRIBUTING.md
new file mode 100644
index 000000000..de3f11cf1
--- /dev/null
+++ b/src/boost/libs/beast/CONTRIBUTING.md
@@ -0,0 +1,65 @@
+# Contributing to Beast
+
+Thank you for taking the time to read this document!
+
+:heart_eyes: **please star the Boost.Beast repository!** :heart_eyes:
+
+First make sure you're on the
+[official repository page](https://github.com/boostorg/beast/blob/master/CONTRIBUTING.md),
+then just press the button labeled "star" in the top right of the page
+to give Beast a star! Your stars create generate additional visibility,
+which leads to more users, more bug reports, more fixes, more testing,
+more features, and a better product!
+
+<a href="https://github.com/boostorg/beast/blob/master/CONTRIBUTING.md">
+<img width="400" height = "150" alt = "Please Star the Repository"
+ src="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/StarTheRepo.png">
+</a>
+
+Click the image above to make sure you're on the official
+Boost repository page so you can give Beast a star!
+
+# Ways to Contribute
+
+No contribution to Beast is too big or too small! We are
+always happy to see user participation in all of its forms.
+Here are some of the ways that you can contribute (this is
+by no means an exhaustive list):
+
+* Submit a
+ [bug report](https://github.com/boostorg/beast/issues).
+ We love hearing about broken things, so
+ that we can fix them. Any problem is fair game, this includes
+ the documentation examples, tests, and repository as well as the
+ library itself. Bug reports should be opened on the
+ [Issues](https://github.com/boostorg/beast/issues) page.
+
+* Provide
+ [feedback](https://github.com/boostorg/beast/issues).
+ about the library. If you have used, are using,
+ or are thinking about using the library we want to hear about it!
+ The more information you provide, the better we will be able
+ to ensure that Beast meets your needs. You can provide feedback
+ as an issue, or email the author directly.
+
+* Test Beast. When changes are made, they are submitted as a
+ [Pull Request](https://github.com/boostorg/beast/pulls).
+ Everyone is welcome to examine these upcoming changes, test them,
+ and report on the results. This form of quality assurance is very
+ helpful so we can keep delivering a great product. Consider
+ subscribing to repository notifications to get alerted to new
+ pull requests.
+
+* Code Review on
+ [Pull Requests](https://github.com/boostorg/beast/pulls).
+ This is one of the most valuable ways to contribute, because it helps
+ to improve code and features, and helps to find bugs, before the code
+ gets merged. A little bit of time investment from just a few people on
+ each pull request goes a **long** way to increasing the quality of the
+ final product. For tips on how to participate in pull requests please
+ view the
+ [README.md](https://github.com/boostorg/beast#contributing-we-need-your-help).
+
+* Use Beast in your next application! At the end of the day, it is the
+ goal of the library to provide utility to users so the best way you
+ can contribute is simply to use the library!
diff --git a/src/boost/libs/beast/Jamfile b/src/boost/libs/beast/Jamfile
new file mode 100644
index 000000000..3bf7a422b
--- /dev/null
+++ b/src/boost/libs/beast/Jamfile
@@ -0,0 +1,131 @@
+#
+# Copyright (c) 2019 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+import os ;
+import feature ;
+import boost ;
+import modules ;
+import testing ;
+import ../config/checks/config : requires ;
+
+boost.use-project ;
+
+lib socket ; # SOLARIS, QNXNTO
+lib nsl ; # SOLARIS
+lib ws2_32 ; # NT
+lib mswsock ; # NT
+lib ipv6 ; # HPUX
+lib network ; # HAIKU
+
+lib ssl ;
+lib crypto ;
+lib crypt32 ;
+
+lib ssl : : <target-os>windows <name>ssleay32 ;
+lib crypto : : <target-os>windows <name>libeay32 ;
+
+feature.feature boost.beast.allow-deprecated : on off : propagated composite ;
+feature.compose <boost.beast.allow-deprecated>on : <define>BOOST_BEAST_ALLOW_DEPRECATED ;
+
+feature.feature boost.beast.separate-compilation : on off : propagated composite ;
+feature.compose <boost.beast.separate-compilation>on : <define>BOOST_BEAST_SEPARATE_COMPILATION ;
+
+variant beast_coverage
+ : debug
+ : <cxxflags>"-msse4.2 --coverage"
+ <linkflags>"--coverage"
+ ;
+
+variant beast_valgrind
+ : release
+ : <valgrind>on # Boost.Context uses this property
+ ;
+
+variant beast_ubasan
+ : release
+ : <cxxflags>"-msse4.2 -funsigned-char -fno-omit-frame-pointer -fsanitize=address,undefined -fno-sanitize-recover=address,undefined -fsanitize-blacklist=libs/beast/tools/blacklist.supp"
+ <linkflags>"-fsanitize=address,undefined"
+ <define>BOOST_USE_ASAN=1
+ ;
+
+path-constant TEST_MAIN : include/boost/beast/_experimental/unit_test/main.cpp ;
+
+project /boost/beast ;
+
+local defines =
+ [ requires
+ cxx11_constexpr
+ cxx11_decltype
+ cxx11_hdr_tuple
+ cxx11_template_aliases
+ cxx11_variadic_templates
+ ]
+ <implicit-dependency>/boost//headers
+ <include>.
+ <define>BOOST_ALL_NO_LIB=1
+ <define>BOOST_ASIO_SEPARATE_COMPILATION
+ <define>BOOST_ASIO_NO_DEPRECATED=1
+ <define>BOOST_ASIO_DISABLE_BOOST_ARRAY=1
+ <define>BOOST_ASIO_DISABLE_BOOST_BIND=1
+ <define>BOOST_ASIO_DISABLE_BOOST_DATE_TIME=1
+ <define>BOOST_ASIO_DISABLE_BOOST_REGEX=1
+ <define>BOOST_COROUTINES_NO_DEPRECATION_WARNING=1
+ <toolset>msvc:<cxxflags>"/bigobj"
+ <toolset>msvc-14.1:<cxxflags>"/permissive-"
+ <toolset>msvc-14.2:<cxxflags>"/permissive-"
+ <toolset>msvc:<define>_SCL_SECURE_NO_WARNINGS=1
+ <toolset>msvc:<define>_CRT_SECURE_NO_WARNINGS=1
+ <toolset>msvc:<define>_SILENCE_CXX17_ALLOCATOR_VOID_DEPRECATION_WARNING
+ <toolset>msvc:<define>_SILENCE_CXX17_ADAPTOR_TYPEDEFS_DEPRECATION_WARNING
+ <toolset>msvc,<variant>release:<cxxflags>"/Ob2 /Oi /Ot"
+ <target-os>linux:<define>_XOPEN_SOURCE=600
+ <target-os>linux:<define>_GNU_SOURCE=1
+ <target-os>solaris:<define>_XOPEN_SOURCE=500
+ <target-os>solaris:<define>__EXTENSIONS__
+ <target-os>solaris:<library>socket
+ <target-os>solaris:<library>nsl
+ <target-os>windows:<define>_WIN32_WINNT=0x0601
+ <target-os>windows,<toolset>gcc:<library>ws2_32
+ <target-os>windows,<toolset>gcc:<library>mswsock
+ <target-os>windows,<toolset>gcc-cygwin:<define>__USE_W32_SOCKETS
+ <target-os>hpux,<toolset>gcc:<define>_XOPEN_SOURCE_EXTENDED
+ <target-os>hpux:<library>ipv6
+ <target-os>qnxnto:<library>socket
+ <target-os>haiku:<library>network
+ ;
+
+lib lib-asio
+ : test/lib_asio.cpp
+ : requirements
+ <link>static
+ $(defines)
+ : usage-requirements
+ $(defines)
+ ;
+
+lib lib-asio-ssl
+ : test/lib_asio_ssl.cpp
+ : requirements
+ <link>static
+ $(defines)
+ [ ac.check-library /boost/beast//ssl : <library>/boost/beast//ssl/<link>shared : <build>no ]
+ [ ac.check-library /boost/beast//crypto : <library>/boost/beast//crypto/<link>shared : <build>no ]
+ : usage-requirements
+ $(defines)
+ ;
+
+lib lib-beast
+ : test/lib_beast.cpp
+ : requirements
+ <link>static
+ $(defines)
+ : usage-requirements
+ $(defines)
+ ;
diff --git a/src/boost/libs/beast/LICENSE_1_0.txt b/src/boost/libs/beast/LICENSE_1_0.txt
new file mode 100644
index 000000000..36b7cd93c
--- /dev/null
+++ b/src/boost/libs/beast/LICENSE_1_0.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE.
diff --git a/src/boost/libs/beast/README.md b/src/boost/libs/beast/README.md
new file mode 100644
index 000000000..cf114e789
--- /dev/null
+++ b/src/boost/libs/beast/README.md
@@ -0,0 +1,277 @@
+<img width="880" height = "80" alt = "Boost.Beast Title"
+ src="https://raw.githubusercontent.com/boostorg/beast/master/doc/images/readme2.png">
+
+# HTTP and WebSocket built on Boost.Asio in C++11
+
+Branch | Linux/OSX | Windows | Coverage | Documentation | Matrix
+------------|-----------|---------|----------|---------------|--------
+[master](https://github.com/boostorg/beast/tree/master) | [![Build Status](https://travis-ci.org/boostorg/beast.svg?branch=master)](https://travis-ci.org/boostorg/beast) | [![Build status](https://ci.appveyor.com/api/projects/status/2nh66khjjhtgasvo/branch/master?svg=true)](https://ci.appveyor.com/project/vinniefalco/beast/branch/master) | [![codecov](https://img.shields.io/codecov/c/github/boostorg/beast/master.svg)](https://codecov.io/gh/boostorg/beast/branch/master) | [![Documentation](https://img.shields.io/badge/documentation-master-brightgreen.svg)](http://www.boost.org/doc/libs/master/libs/beast/doc/html/index.html) | [![Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](http://www.boost.org/development/tests/master/developer/beast.html)
+[develop](https://github.com/boostorg/beast/tree/develop) | [![Build Status](https://travis-ci.org/boostorg/beast.svg?branch=develop)](https://travis-ci.org/boostorg/beast) | [![Build status](https://ci.appveyor.com/api/projects/status/2nh66khjjhtgasvo/branch/develop?svg=true)](https://ci.appveyor.com/project/vinniefalco/beast/branch/develop) | [![codecov](https://img.shields.io/codecov/c/github/boostorg/beast/develop.svg)](https://codecov.io/gh/boostorg/beast/branch/develop) | [![Documentation](https://img.shields.io/badge/documentation-develop-brightgreen.svg)](https://www.boost.org/doc/libs/develop/libs/beast/index.html) | [![Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](https://www.boost.org/development/tests/develop/developer/beast.html)
+
+## Contents
+
+- [Introduction](#introduction)
+- [Appearances](#appearances)
+- [Description](#description)
+- [Requirements](#requirements)
+- [Git Branches](#branches)
+- [Building](#building)
+- [Usage](#usage)
+- [License](#license)
+- [Contact](#contact)
+- [Contributing](#contributing-we-need-your-help)
+
+## Introduction
+
+Beast is a C++ header-only library serving as a foundation for writing
+interoperable networking libraries by providing **low-level HTTP/1,
+WebSocket, and networking protocol** vocabulary types and algorithms
+using the consistent asynchronous model of Boost.Asio.
+
+This library is designed for:
+
+* **Symmetry:** Algorithms are role-agnostic; build clients, servers, or both.
+
+* **Ease of Use:** Boost.Asio users will immediately understand Beast.
+
+* **Flexibility:** Users make the important decisions such as buffer or
+ thread management.
+
+* **Performance:** Build applications handling thousands of connections or more.
+
+* **Basis for Further Abstraction.** Components are well-suited for building upon.
+
+## Appearances
+
+| <a href="https://github.com/vinniefalco/CppCon2018">CppCon 2018</a> | <a href="https://www.bishopfox.com/case_study/securing-beast/">Bishop Fox 2018</a> |
+| ------------ | ------------ |
+| <a href="https://www.youtube.com/watch?v=7FQwAjELMek"><img width="320" height = "180" alt="Beast" src="https://raw.githubusercontent.com/vinniefalco/CppCon2018/master/CppCon2018.png"></a> | <a href="https://youtu.be/4TtyYbGDAj0"><img width="320" height = "180" alt="Beast Security Review" src="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/BishopFox2018.png"></a> |
+
+| <a href="https://github.com/vinniefalco/CppCon2018">CppCon 2017</a> | <a href="http://cppcast.com/2017/01/vinnie-falco/">CppCast 2017</a> | <a href="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/CppCon2016.pdf">CppCon 2016</a> |
+| ------------ | ------------ | ----------- |
+| <a href="https://www.youtube.com/watch?v=WsUnnYEKPnI"><img width="320" height = "180" alt="Beast" src="https://raw.githubusercontent.com/vinniefalco/CppCon2017/master/CppCon2017.png"></a> | <a href="http://cppcast.com/2017/01/vinnie-falco/"><img width="180" height="180" alt="Vinnie Falco" src="https://avatars1.githubusercontent.com/u/1503976?v=3&u=76c56d989ef4c09625256662eca2775df78a16ad&s=180"></a> | <a href="https://www.youtube.com/watch?v=uJZgRcvPFwI"><img width="320" height = "180" alt="Beast" src="https://raw.githubusercontent.com/vinniefalco/BeastAssets/master/CppCon2016.png"></a> |
+
+## Description
+
+This software is in its first official release. Interfaces
+may change in response to user feedback. For recent changes
+see the [CHANGELOG](CHANGELOG.md).
+
+* [Official Site](https://github.com/boostorg/beast)
+* [Documentation](https://www.boost.org/doc/libs/master/libs/beast/) (master branch)
+* [Autobahn|Testsuite WebSocket Results](https://vinniefalco.github.io/boost/beast/reports/autobahn/index.html)
+
+## Requirements
+
+This library is for programmers familiar with Boost.Asio. Users
+who wish to use asynchronous interfaces should already know how to
+create concurrent network programs using callbacks or coroutines.
+
+* **C++11:** Robust support for most language features.
+* **Boost:** Boost.Asio and some other parts of Boost.
+* **OpenSSL:** Required for using TLS/Secure sockets and examples/tests
+
+When using Microsoft Visual C++, Visual Studio 2017 or later is required.
+
+One of these components is required in order to build the tests and examples:
+
+* Properly configured bjam/b2
+* CMake 3.5.1 or later (Windows only)
+
+## Building
+
+Beast is header-only. To use it just add the necessary `#include` line
+to your source files, like this:
+```C++
+#include <boost/beast.hpp>
+```
+
+If you use coroutines you'll need to link with the Boost.Coroutine
+library. Please visit the Boost documentation for instructions
+on how to do this for your particular build system.
+
+## GitHub
+
+To use the latest official release of Beast, simply obtain the latest
+Boost distribution and follow the instructions for integrating it
+into your development environment. If you wish to build the examples
+and tests, or if you wish to preview upcoming changes and features,
+it is suggested to clone the "Boost superproject" and work with Beast
+"in-tree" (meaning, the libs/beast subdirectory of the superproject).
+
+The official repository contains the following branches:
+
+* [**master**](https://github.com/boostorg/beast/tree/master) This
+ holds the most recent snapshot with code that is known to be stable.
+
+* [**develop**](https://github.com/boostorg/beast/tree/develop) This
+ holds the most recent snapshot. It may contain unstable code.
+
+Each of these branches requires a corresponding Boost branch and
+all of its subprojects. For example, if you wish to use the **master**
+branch version of Beast, you should clone the Boost superproject,
+switch to the **master** branch in the superproject and acquire
+all the Boost libraries corresponding to that branch including Beast.
+
+To clone the superproject locally, and switch into the main project's
+directory use:
+```
+git clone --recursive https://github.com/boostorg/boost.git
+cd boost
+```
+
+"bjam" is used to build Beast and the Boost libraries. On a non-Windows
+system use this command to build bjam:
+```
+./bootstrap.sh
+```
+
+From a Windows command line, build bjam using this command:
+```
+.\BOOTSTRAP.BAT
+```
+
+## Building tests and examples
+Building tests and examples requires OpenSSL installed. If OpenSSL is installed
+in a non-system location, you will need to copy the
+[user-config.jam](tools/user-config.jam) file into your home directory and set
+the `OPENSSL_ROOT` environment variable to the path that contains an installation
+of OpenSSL.
+
+### Ubuntu/Debian
+If installed into a system directory, OpenSSL will be automatically found and used.
+```bash
+sudo apt install libssl-dev
+```
+### Windows
+Replace `path` in the following code snippets with the path you installed vcpkg
+to. Examples assume a 32-bit build, if you build a 64-bit version replace
+`x32-windows` with `x64-windows` in the path.
+- Using [vcpkg](https://github.com/Microsoft/vcpkg) and CMD:
+```bat
+vcpkg install openssl --triplet x32-windows
+SET OPENSSL_ROOT=path\installed\x32-windows
+```
+
+- Using [vcpkg](https://github.com/Microsoft/vcpkg) and PowerShell:
+```powershell
+vcpkg install openssl --triplet x32-windows
+$env:OPENSSL_ROOT = "path\x32-windows"
+```
+
+- Using [vcpkg](https://github.com/Microsoft/vcpkg) and bash:
+```bash
+vcpkg.exe install openssl --triplet x32-windows
+export OPENSSL_ROOT=path/x32-windows
+```
+
+### Mac OS
+Using [brew](https://github.com/Homebrew/brew):
+```bash
+brew install openssl
+export OPENSSL_ROOT=$(brew --prefix openssl)
+# install bjam tool user specific configuration file to read OPENSSL_ROOT
+# see https://boostorg.github.io/build/manual/develop/index.html
+cp ./libs/beast/tools/user-config.jam $HOME
+```
+
+Make sure the bjam tool (also called "b2") is available in the path
+your shell uses to find executables. The Beast project is located in
+"libs/beast" relative to the directory containing the Boot superproject.
+To build the Beast tests, examples, and documentation use these commands:
+```
+export PATH=$PWD:$PATH
+b2 -j2 libs/beast/test cxxstd=11 # bjam must be in your $PATH
+b2 -j2 libs/beast/example cxxstd=11 # "-j2" means use two processors
+b2 libs/beast/doc # Doxygen and Saxon are required for this
+```
+
+
+
+Additional instructions for configuring, using, and building libraries
+in superproject may be found in the
+[Boost Wiki](https://github.com/boostorg/boost/wiki/Getting-Started).
+
+## Visual Studio
+
+CMake may be used to generate a very nice Visual Studio solution and
+a set of Visual Studio project files using these commands:
+
+```
+cd libs/beast
+mkdir bin
+cd bin
+cmake .. # for 32-bit Windows builds, or
+cmake -G"Visual Studio 15 2017 Win64" .. # for 64-bit Windows builds (VS2017)
+```
+
+The files in the repository are laid out thusly:
+
+```
+./
+ bin/ Create this to hold executables and project files
+ bin64/ Create this to hold 64-bit Windows executables and project files
+ doc/ Source code and scripts for the documentation
+ include/ Where the header files are located
+ example/ Self contained example programs
+ meta/ Metadata for Boost integration
+ test/ The unit tests for Beast
+ tools/ Scripts used for CI testing
+```
+
+## Usage
+
+These examples are complete, self-contained programs that you can build
+and run yourself (they are in the `example` directory).
+
+https://www.boost.org/doc/libs/develop/libs/beast/doc/html/beast/quick_start.html
+
+## License
+
+Distributed under the Boost Software License, Version 1.0.
+(See accompanying file [LICENSE_1_0.txt](LICENSE_1_0.txt) or copy at
+https://www.boost.org/LICENSE_1_0.txt)
+
+## Contact
+
+Please report issues or questions here:
+https://github.com/boostorg/beast/issues
+
+---
+
+## Contributing (We Need Your Help!)
+
+If you would like to contribute to Beast and help us maintain high
+quality, consider performing code reviews on active pull requests.
+Any feedback from users and stakeholders, even simple questions about
+how things work or why they were done a certain way, carries value
+and can be used to improve the library. Code review provides these
+benefits:
+
+* Identify bugs
+* Documentation proof-reading
+* Adjust interfaces to suit use-cases
+* Simplify code
+
+You can look through the Closed pull requests to get an idea of how
+reviews are performed. To give a code review just sign in with your
+GitHub account and then add comments to any open pull requests below,
+don't be shy!
+<p>https://github.com/boostorg/beast/pulls</p>
+
+Here are some resources to learn more about
+code reviews:
+
+* <a href="https://blog.scottnonnenberg.com/top-ten-pull-request-review-mistakes/">Top 10 Pull Request Review Mistakes</a>
+* <a href="https://static1.smartbear.co/smartbear/media/pdfs/best-kept-secrets-of-peer-code-review_redirected.pdf">Best Kept Secrets of Peer Code Review (pdf)</a>
+* <a href="https://static1.smartbear.co/support/media/resources/cc/11_best_practices_for_peer_code_review_redirected.pdf">11 Best Practices for Peer Code Review (pdf)</a>
+* <a href="http://www.evoketechnologies.com/blog/code-review-checklist-perform-effective-code-reviews/">Code Review Checklist – To Perform Effective Code Reviews</a>
+* <a href="https://www.codeproject.com/Articles/524235/Codeplusreviewplusguidelines">Code review guidelines</a>
+* <a href="https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md">C++ Core Guidelines</a>
+* <a href="https://www.oreilly.com/library/view/c-coding-standards/0321113586/">C++ Coding Standards (Sutter & Andrescu)</a>
+
+Beast thrives on code reviews and any sort of feedback from users and
+stakeholders about its interfaces. Even if you just have questions,
+asking them in the code review or in issues provides valuable information
+that can be used to improve the library - do not hesitate, no question
+is insignificant or unimportant!
diff --git a/src/boost/libs/beast/azure-pipelines.yml b/src/boost/libs/beast/azure-pipelines.yml
new file mode 100644
index 000000000..948158dfd
--- /dev/null
+++ b/src/boost/libs/beast/azure-pipelines.yml
@@ -0,0 +1,359 @@
+variables:
+ GIT_BRANCH: $(Build.SourceBranch)
+
+jobs:
+ - job: 'LinuxCoverage'
+ pool:
+ vmImage: 'ubuntu-16.04'
+ container:
+ image: djarek/boost-beast-ci:latest
+ options: --privileged
+ steps:
+ - bash: |
+ sudo apt update && sudo apt install -y g++ lcov
+ displayName: Get dependencies
+ - bash: |
+ set -e
+ export BUILD_DIR=$(pwd)
+ cd ..
+ $BUILD_DIR/tools/get-boost.sh $GIT_BRANCH $BUILD_DIR
+ cd boost-root
+ export CXX=g++ CC=gcc
+ ./bootstrap.sh || cat bootstrap.log
+ displayName: Get Boost
+ - bash: |
+ set -e
+ cd ../boost-root
+ ./b2 libs/beast/test//run-fat-tests toolset=gcc coverage=on link=static cxxstd=11 -j2
+ libs/beast/tools/coverage.sh
+ env:
+ CODECOV_TOKEN: $(CODECOV_TOKEN)
+ displayName: Build & Run tests
+ - job: 'Linux'
+ pool:
+ vmImage: 'ubuntu-16.04'
+ container:
+ image: djarek/boost-beast-ci:latest
+ options: --privileged
+ strategy:
+ matrix:
+ GCC 9 C++17 Release:
+ TOOLSET: gcc
+ CXX: g++-9
+ PACKAGES: g++-9
+ VARIANT: release
+ B2_FLAGS: <define>BOOST_BEAST_USE_STD_STRING_VIEW
+ CXXSTD: 17
+ B2_TARGETS: libs/beast/test//run-fat-tests libs/beast/example
+ GCC 9 C++11 HEADER_ONLY NO_DEPRECATED:
+ TOOLSET: gcc
+ CXX: g++-9
+ PACKAGES: g++-9
+ VARIANT: release
+ B2_FLAGS: <boost.beast.separate-compilation>off <boost.beast.allow-deprecated>off
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC 9 C++11 NO_DEPRECATED NO_TLS:
+ TOOLSET: gcc
+ CXX: g++-9
+ PACKAGES: g++-9
+ VARIANT: release
+ B2_FLAGS: <boost.beast.allow-deprecated>off <define>BOOST_NO_CXX11_THREAD_LOCAL
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC 9 C++11 UBASAN:
+ TOOLSET: gcc
+ CXX: g++-9
+ PACKAGES: g++-9
+ VARIANT: debug
+ B2_FLAGS: <address-sanitizer>norecover <undefined-sanitizer>norecover
+ # use GOLD to workaround UBSAN linker issue in gcc 7/8
+ # https://stackoverflow.com/questions/50024731/ld-unrecognized-option-push-state-no-as-needed
+ CXX_FLAGS: <cxxflags>"-msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-fuse-ld=gold
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC 9 C++11 TSAN:
+ TOOLSET: gcc
+ CXX: g++-9
+ PACKAGES: g++-9
+ VARIANT: release
+ B2_FLAGS: <thread-sanitizer>norecover
+ CXX_FLAGS: <cxxflags>"-msse4.2 -funsigned-char -fno-omit-frame-pointer"
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC 8 C++17 Release:
+ TOOLSET: gcc
+ CXX: g++-8
+ PACKAGES: g++-8
+ VARIANT: release
+ B2_FLAGS: <define>BOOST_BEAST_USE_STD_STRING_VIEW
+ CXXSTD: 17
+ B2_TARGETS: libs/beast/test//run-fat-tests libs/beast/example
+ GCC 8 C++11 HEADER_ONLY NO_DEPRECATED:
+ TOOLSET: gcc
+ CXX: g++-8
+ PACKAGES: g++-8
+ VARIANT: release
+ B2_FLAGS: <boost.beast.separate-compilation>off <boost.beast.allow-deprecated>off
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC 8 C++11 UBASAN:
+ TOOLSET: gcc
+ CXX: g++-8
+ PACKAGES: g++-8
+ VARIANT: debug
+ B2_FLAGS: <address-sanitizer>norecover <undefined-sanitizer>norecover
+ # use GOLD to workaround UBSAN linker issue in gcc 7/8
+ # https://stackoverflow.com/questions/50024731/ld-unrecognized-option-push-state-no-as-needed
+ CXX_FLAGS: <cxxflags>"-msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-fuse-ld=gold
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC 8 C++11 TSAN:
+ TOOLSET: gcc
+ CXX: g++-8
+ PACKAGES: g++-8
+ VARIANT: release
+ B2_FLAGS: <thread-sanitizer>norecover
+ CXX_FLAGS: <cxxflags>"-msse4.2 -funsigned-char -fno-omit-frame-pointer"
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC 7 C++14 Valgrind:
+ TOOLSET: gcc
+ CXX: g++-7
+ PACKAGES: g++-7 valgrind
+ VARIANT: release
+ B2_FLAGS: <define>BOOST_BEAST_TEST_STATIC_PRNG_SEED <valgrind>on <testing.launcher>"valgrind --track-origins=yes --error-exitcode=1 --max-stackframe=16000000 --suppressions=libs/beast/tools/valgrind.supp"
+ CXXSTD: 14
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ GCC Default C++11 Release:
+ TOOLSET: gcc
+ CXX: g++
+ PACKAGES: g++
+ VARIANT: release
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests libs/beast/example
+ Clang 6.0 C++11 Debug:
+ TOOLSET: clang
+ CXX: clang++-6.0
+ PACKAGES: clang-6.0
+ VARIANT: debug
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests libs/beast/example
+ Clang 7 libc++ C++14 Valgrind:
+ TOOLSET: clang
+ CXX: clang++-7
+ PACKAGES: clang-7 libc++-7-dev libc++abi-7-dev valgrind
+ VARIANT: release
+ B2_FLAGS: <valgrind>on <testing.launcher>"valgrind --track-origins=yes --error-exitcode=1 --max-stackframe=16000000 --suppressions=libs/beast/tools/valgrind.supp"
+ CXXSTD: 14
+ CXX_FLAGS: <cxxflags>"-stdlib=libc++" <linkflags>"-stdlib=libc++"
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ Clang 7 C++11 Debug:
+ TOOLSET: clang
+ CXX: clang++-7
+ PACKAGES: clang-7
+ VARIANT: debug
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests libs/beast/example
+ Clang 7 C++14 Release:
+ TOOLSET: clang
+ CXX: clang++-7
+ PACKAGES: clang-7
+ VARIANT: release
+ CXXSTD: 14
+ B2_TARGETS: libs/beast/test//run-fat-tests libs/beast/example
+ Clang Default C++11 Debug:
+ TOOLSET: clang
+ CXX: clang++
+ PACKAGES: clang
+ VARIANT: debug
+ CXXSTD: 11
+ B2_TARGETS: libs/beast/test//run-fat-tests libs/beast/example
+ Clang 8 libc++ C++14 UBASAN:
+ TOOLSET: clang
+ CXX: clang++-8
+ PACKAGES: clang-8 libc++-8-dev libc++abi-8-dev
+ VARIANT: release
+ B2_FLAGS: <address-sanitizer>norecover <undefined-sanitizer>norecover
+ UBSAN_OPTIONS: print_stacktrace=1
+ CXXSTD: 14
+ CXX_FLAGS: <cxxflags>"-stdlib=libc++ -msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-stdlib=libc++
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ Clang 8 libc++ C++14 TSAN:
+ TOOLSET: clang
+ CXX: clang++-8
+ PACKAGES: clang-8 libc++-8-dev libc++abi-8-dev
+ VARIANT: release
+ B2_FLAGS: <thread-sanitizer>norecover
+ CXXSTD: 14
+ CXX_FLAGS: <cxxflags>"-stdlib=libc++ -msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-stdlib=libc++
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ Clang 9 libc++ C++14 Release HEADER_ONLY NO_DEPRECATED:
+ TOOLSET: clang
+ CXX: clang++-9
+ PACKAGES: clang-9 libc++-9-dev libc++abi-9-dev
+ VARIANT: release
+ B2_FLAGS: <boost.beast.separate-compilation>off <boost.beast.allow-deprecated>off
+ CXXSTD: 14
+ CXX_FLAGS: <cxxflags>"-stdlib=libc++ -msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-stdlib=libc++
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ Clang 9 libc++ C++17 UBASAN:
+ TOOLSET: clang
+ CXX: clang++-9
+ PACKAGES: clang-9 libc++-9-dev libc++abi-9-dev
+ VARIANT: release
+ B2_FLAGS: <address-sanitizer>norecover <undefined-sanitizer>norecover
+ UBSAN_OPTIONS: print_stacktrace=1
+ CXXSTD: 17
+ CXX_FLAGS: <cxxflags>"-stdlib=libc++ -msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-stdlib=libc++
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ Clang 9 libc++ C++17 TSAN:
+ TOOLSET: clang
+ CXX: clang++-9
+ PACKAGES: clang-9 libc++-9-dev libc++abi-9-dev
+ VARIANT: release
+ B2_FLAGS: <thread-sanitizer>norecover
+ CXXSTD: 17
+ CXX_FLAGS: <cxxflags>"-stdlib=libc++ -msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-stdlib=libc++
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ Clang 9 libc++ C++11 Release HEADER_ONLY NO_DEPRECATED:
+ TOOLSET: clang
+ CXX: clang++-9
+ PACKAGES: clang-9 libc++-9-dev libc++abi-9-dev
+ VARIANT: release
+ B2_FLAGS: <boost.beast.separate-compilation>off <boost.beast.allow-deprecated>off
+ CXXSTD: 11
+ CXX_FLAGS: <cxxflags>"-stdlib=libc++ -msse4.2 -funsigned-char -fno-omit-frame-pointer" <linkflags>-stdlib=libc++
+ B2_TARGETS: libs/beast/test//run-fat-tests
+ steps:
+ - bash: |
+ sudo apt update && sudo apt install -y $PACKAGES
+ displayName: Get dependencies
+ - bash: |
+ set -e
+ export BUILD_DIR=$(pwd)
+ cd ..
+ $BUILD_DIR/tools/get-boost.sh $GIT_BRANCH $BUILD_DIR
+ cd boost-root
+ ./bootstrap.sh || cat bootstrap.log
+ cp libs/beast/tools/user-config.jam ~/user-config.jam
+ echo "using $TOOLSET : : $(which $CXX) : $CXX_FLAGS ;" >> ~/user-config.jam
+ echo "project : requirements $B2_FLAGS ;" >> ~/user-config.jam
+ displayName: Get Boost
+ - bash: |
+ set -e
+ cd ../boost-root
+ echo "B2_FLAGS: $B2_FLAGS"
+ ./b2 -j2 \
+ --debug-configuration \
+ cxxstd=$CXXSTD \
+ toolset=$TOOLSET \
+ variant=$VARIANT \
+ $B2_TARGETS
+ displayName: Build & Run tests
+
+ - job: 'macOS'
+ pool:
+ vmImage: 'macOS-10.13'
+ strategy:
+ matrix:
+ Xcode 10.1 C++17 Release:
+ TOOLSET: clang
+ VARIANT: release
+ CXXSTD: 17
+ XCODE_APP: /Applications/Xcode_10.1.app
+ Xcode 9.4.1 C++11 Release:
+ TOOLSET: clang
+ VARIANT: release
+ CXXSTD: 11
+ XCODE_APP: /Applications/Xcode_9.4.1.app
+ steps:
+ - bash: |
+ brew install openssl
+ displayName: Get OpenSSL
+ - bash: |
+ set -e
+ sudo xcode-select -switch ${XCODE_APP}
+ which clang++
+ export BUILD_DIR=$(pwd)
+ cd ..
+ $BUILD_DIR/tools/get-boost.sh $GIT_BRANCH $BUILD_DIR
+ cd boost-root
+ ./bootstrap.sh || cat bootstrap.log
+ cp libs/beast/tools/user-config.jam ~/user-config.jam
+ displayName: Get Boost
+ - bash: |
+ set -e
+ export OPENSSL_ROOT=$(brew --prefix openssl)
+ cd ../boost-root
+ ./b2 -j2 \
+ --debug-configuration \
+ define=BOOST_COROUTINES_NO_DEPRECATION_WARNING=1 \
+ cxxstd=$CXXSTD \
+ libs/beast/test//run-fat-tests \
+ libs/beast/example \
+ toolset=$TOOLSET \
+ variant=$VARIANT
+ displayName: Build & Run tests
+
+ - job: 'Windows'
+ strategy:
+ matrix:
+ # MSVC14.2: # FIXME(djarek): windows-2019 doesn't have vcpkg
+ MSVC14.2 C++17 x64:
+ VM_IMAGE: 'windows-2019'
+ TOOLSET: msvc-14.2
+ B2_FLAGS: define=BOOST_BEAST_USE_STD_STRING_VIEW
+ CXXSTD: 17
+ ADDRMODEL: 64
+ MSVC14.1 C++17 x64:
+ VM_IMAGE: 'vs2017-win2016'
+ TOOLSET: msvc-14.1
+ B2_FLAGS: define=BOOST_BEAST_USE_STD_STRING_VIEW
+ CXXSTD: 17
+ ADDRMODEL: 64
+ MSVC14.0 C++11 x64:
+ VM_IMAGE: 'vs2017-win2016'
+ TOOLSET: msvc-14.0
+ CXXSTD: 11
+ ADDRMODEL: 64
+ pool:
+ vmImage: $(VM_IMAGE)
+ steps:
+ - bash: |
+ vcpkg install openssl --triplet "x$ADDRMODEL""-windows"
+ displayName: Get OpenSSL
+
+ - bash: |
+ set -e
+ export BUILD_DIR=$(pwd)
+ cd ..
+ $BUILD_DIR/tools/get-boost.sh $GIT_BRANCH $BUILD_DIR
+ cd boost-root
+ ./bootstrap.sh
+ cp libs/beast/tools/user-config.jam ~/user-config.jam
+ displayName: Get Boost
+
+ - bash: |
+ set -e
+ echo "VCPKG_ROOT: $VCPKG_INSTALLATION_ROOT"
+ export OPENSSL_ROOT="$VCPKG_INSTALLATION_ROOT""/installed/x$ADDRMODEL""-windows"
+ cd ../boost-root
+ ./b2 -j2 \
+ --debug-configuration \
+ variant=debug \
+ cxxstd=$CXXSTD \
+ address-model=$ADDRMODEL \
+ toolset=$TOOLSET \
+ $B2_FLAGS \
+ libs/beast/example
+ ./b2 -j2 \
+ --debug-configuration \
+ variant=debug,release \
+ cxxstd=$CXXSTD \
+ address-model=$ADDRMODEL \
+ toolset=$TOOLSET \
+ $B2_FLAGS \
+ --verbose-test \
+ libs/beast/test//run-fat-tests
+ displayName: Build & Run tests
diff --git a/src/boost/libs/beast/example/CMakeLists.txt b/src/boost/libs/beast/example/CMakeLists.txt
new file mode 100644
index 000000000..950c29db9
--- /dev/null
+++ b/src/boost/libs/beast/example/CMakeLists.txt
@@ -0,0 +1,14 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (advanced)
+add_subdirectory (http)
+add_subdirectory (websocket)
+
+add_subdirectory (echo-op)
diff --git a/src/boost/libs/beast/example/Jamfile b/src/boost/libs/beast/example/Jamfile
new file mode 100644
index 000000000..8b49d5fd4
--- /dev/null
+++ b/src/boost/libs/beast/example/Jamfile
@@ -0,0 +1,32 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import testing ;
+import ../../config/checks/config : requires ;
+
+project /boost/beast/example
+ : requirements
+ [ requires
+ cxx11_constexpr
+ cxx11_decltype
+ cxx11_hdr_tuple
+ #cxx11_sfinae_expr # Every MSVC fails this
+ cxx11_template_aliases
+ cxx11_variadic_templates
+ ]
+ <library>/boost/beast//lib-asio/<link>static
+ <boost.beast.separate-compilation>on:<library>/boost/beast//lib-beast/<link>static
+ ;
+
+build-project advanced ;
+build-project http ;
+build-project websocket ;
+
+# legacy
+build-project echo-op ;
diff --git a/src/boost/libs/beast/example/advanced/CMakeLists.txt b/src/boost/libs/beast/example/advanced/CMakeLists.txt
new file mode 100644
index 000000000..af83e043b
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/CMakeLists.txt
@@ -0,0 +1,11 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (server)
+add_subdirectory (server-flex)
diff --git a/src/boost/libs/beast/example/advanced/Jamfile b/src/boost/libs/beast/example/advanced/Jamfile
new file mode 100644
index 000000000..d1053a900
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/Jamfile
@@ -0,0 +1,13 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+build-project server ;
+
+# SSL
+build-project server-flex ;
diff --git a/src/boost/libs/beast/example/advanced/server-flex/CMakeLists.txt b/src/boost/libs/beast/example/advanced/server-flex/CMakeLists.txt
new file mode 100644
index 000000000..d6075b277
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/server-flex/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/advanced/server-flex "/")
+
+ add_executable (advanced-server-flex
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ advanced_server_flex.cpp
+ )
+
+ set_property(TARGET advanced-server-flex PROPERTY FOLDER "example-advanced-server")
+
+ target_link_libraries (advanced-server-flex
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/advanced/server-flex/Jamfile b/src/boost/libs/beast/example/advanced/server-flex/Jamfile
new file mode 100644
index 000000000..e7bd844aa
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/server-flex/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe advanced-server-flex :
+ advanced_server_flex.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/advanced/server-flex/advanced_server_flex.cpp b/src/boost/libs/beast/example/advanced/server-flex/advanced_server_flex.cpp
new file mode 100644
index 000000000..b0c889bf9
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/server-flex/advanced_server_flex.cpp
@@ -0,0 +1,1030 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: Advanced server, flex (plain + SSL)
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/bind_executor.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/signal_set.hpp>
+#include <boost/asio/steady_timer.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/make_unique.hpp>
+#include <boost/optional.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ // ssl::error::stream_truncated, also known as an SSL "short read",
+ // indicates the peer closed the connection without performing the
+ // required closing handshake (for example, Google does this to
+ // improve performance). Generally this can be a security issue,
+ // but if your communication protocol is self-terminated (as
+ // it is with both HTTP and WebSocket) then you may simply
+ // ignore the lack of close_notify.
+ //
+ // https://github.com/boostorg/beast/issues/38
+ //
+ // https://security.stackexchange.com/questions/91435/how-to-handle-a-malicious-ssl-tls-shutdown
+ //
+ // When a short read would cut off the end of an HTTP message,
+ // Beast returns the error beast::http::error::partial_message.
+ // Therefore, if we see a short read here, it has occurred
+ // after the message has been completed, so it is safe to ignore it.
+
+ if(ec == net::ssl::error::stream_truncated)
+ return;
+
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+//------------------------------------------------------------------------------
+
+// Echoes back all received WebSocket messages.
+// This uses the Curiously Recurring Template Pattern so that
+// the same code works with both SSL streams and regular sockets.
+template<class Derived>
+class websocket_session
+{
+ // Access the derived class, this is part of
+ // the Curiously Recurring Template Pattern idiom.
+ Derived&
+ derived()
+ {
+ return static_cast<Derived&>(*this);
+ }
+
+ beast::flat_buffer buffer_;
+
+ // Start the asynchronous operation
+ template<class Body, class Allocator>
+ void
+ do_accept(http::request<Body, http::basic_fields<Allocator>> req)
+ {
+ // Set suggested timeout settings for the websocket
+ derived().ws().set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ derived().ws().set_option(
+ websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " advanced-server-flex");
+ }));
+
+ // Accept the websocket handshake
+ derived().ws().async_accept(
+ req,
+ beast::bind_front_handler(
+ &websocket_session::on_accept,
+ derived().shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "accept");
+
+ // Read a message
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ // Read a message into our buffer
+ derived().ws().async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &websocket_session::on_read,
+ derived().shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This indicates that the websocket_session was closed
+ if(ec == websocket::error::closed)
+ return;
+
+ if(ec)
+ fail(ec, "read");
+
+ // Echo the message
+ derived().ws().text(derived().ws().got_text());
+ derived().ws().async_write(
+ buffer_.data(),
+ beast::bind_front_handler(
+ &websocket_session::on_write,
+ derived().shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+
+ // Do another read
+ do_read();
+ }
+
+public:
+ // Start the asynchronous operation
+ template<class Body, class Allocator>
+ void
+ run(http::request<Body, http::basic_fields<Allocator>> req)
+ {
+ // Accept the WebSocket upgrade request
+ do_accept(std::move(req));
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Handles a plain WebSocket connection
+class plain_websocket_session
+ : public websocket_session<plain_websocket_session>
+ , public std::enable_shared_from_this<plain_websocket_session>
+{
+ websocket::stream<beast::tcp_stream> ws_;
+
+public:
+ // Create the session
+ explicit
+ plain_websocket_session(
+ beast::tcp_stream&& stream)
+ : ws_(std::move(stream))
+ {
+ }
+
+ // Called by the base class
+ websocket::stream<beast::tcp_stream>&
+ ws()
+ {
+ return ws_;
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Handles an SSL WebSocket connection
+class ssl_websocket_session
+ : public websocket_session<ssl_websocket_session>
+ , public std::enable_shared_from_this<ssl_websocket_session>
+{
+ websocket::stream<
+ beast::ssl_stream<beast::tcp_stream>> ws_;
+
+public:
+ // Create the ssl_websocket_session
+ explicit
+ ssl_websocket_session(
+ beast::ssl_stream<beast::tcp_stream>&& stream)
+ : ws_(std::move(stream))
+ {
+ }
+
+ // Called by the base class
+ websocket::stream<
+ beast::ssl_stream<beast::tcp_stream>>&
+ ws()
+ {
+ return ws_;
+ }
+};
+
+//------------------------------------------------------------------------------
+
+template<class Body, class Allocator>
+void
+make_websocket_session(
+ beast::tcp_stream stream,
+ http::request<Body, http::basic_fields<Allocator>> req)
+{
+ std::make_shared<plain_websocket_session>(
+ std::move(stream))->run(std::move(req));
+}
+
+template<class Body, class Allocator>
+void
+make_websocket_session(
+ beast::ssl_stream<beast::tcp_stream> stream,
+ http::request<Body, http::basic_fields<Allocator>> req)
+{
+ std::make_shared<ssl_websocket_session>(
+ std::move(stream))->run(std::move(req));
+}
+
+//------------------------------------------------------------------------------
+
+// Handles an HTTP server connection.
+// This uses the Curiously Recurring Template Pattern so that
+// the same code works with both SSL streams and regular sockets.
+template<class Derived>
+class http_session
+{
+ // Access the derived class, this is part of
+ // the Curiously Recurring Template Pattern idiom.
+ Derived&
+ derived()
+ {
+ return static_cast<Derived&>(*this);
+ }
+
+ // This queue is used for HTTP pipelining.
+ class queue
+ {
+ enum
+ {
+ // Maximum number of responses we will queue
+ limit = 8
+ };
+
+ // The type-erased, saved work item
+ struct work
+ {
+ virtual ~work() = default;
+ virtual void operator()() = 0;
+ };
+
+ http_session& self_;
+ std::vector<std::unique_ptr<work>> items_;
+
+ public:
+ explicit
+ queue(http_session& self)
+ : self_(self)
+ {
+ static_assert(limit > 0, "queue limit must be positive");
+ items_.reserve(limit);
+ }
+
+ // Returns `true` if we have reached the queue limit
+ bool
+ is_full() const
+ {
+ return items_.size() >= limit;
+ }
+
+ // Called when a message finishes sending
+ // Returns `true` if the caller should initiate a read
+ bool
+ on_write()
+ {
+ BOOST_ASSERT(! items_.empty());
+ auto const was_full = is_full();
+ items_.erase(items_.begin());
+ if(! items_.empty())
+ (*items_.front())();
+ return was_full;
+ }
+
+ // Called by the HTTP handler to send a response.
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg)
+ {
+ // This holds a work item
+ struct work_impl : work
+ {
+ http_session& self_;
+ http::message<isRequest, Body, Fields> msg_;
+
+ work_impl(
+ http_session& self,
+ http::message<isRequest, Body, Fields>&& msg)
+ : self_(self)
+ , msg_(std::move(msg))
+ {
+ }
+
+ void
+ operator()()
+ {
+ http::async_write(
+ self_.derived().stream(),
+ msg_,
+ beast::bind_front_handler(
+ &http_session::on_write,
+ self_.derived().shared_from_this(),
+ msg_.need_eof()));
+ }
+ };
+
+ // Allocate and store the work
+ items_.push_back(
+ boost::make_unique<work_impl>(self_, std::move(msg)));
+
+ // If there was no previous work, start this one
+ if(items_.size() == 1)
+ (*items_.front())();
+ }
+ };
+
+ std::shared_ptr<std::string const> doc_root_;
+ queue queue_;
+
+ // The parser is stored in an optional container so we can
+ // construct it from scratch it at the beginning of each new message.
+ boost::optional<http::request_parser<http::string_body>> parser_;
+
+protected:
+ beast::flat_buffer buffer_;
+
+public:
+ // Construct the session
+ http_session(
+ beast::flat_buffer buffer,
+ std::shared_ptr<std::string const> const& doc_root)
+ : doc_root_(doc_root)
+ , queue_(*this)
+ , buffer_(std::move(buffer))
+ {
+ }
+
+ void
+ do_read()
+ {
+ // Construct a new parser for each message
+ parser_.emplace();
+
+ // Apply a reasonable limit to the allowed size
+ // of the body in bytes to prevent abuse.
+ parser_->body_limit(10000);
+
+ // Set the timeout.
+ beast::get_lowest_layer(
+ derived().stream()).expires_after(std::chrono::seconds(30));
+
+ // Read a request using the parser-oriented interface
+ http::async_read(
+ derived().stream(),
+ buffer_,
+ *parser_,
+ beast::bind_front_handler(
+ &http_session::on_read,
+ derived().shared_from_this()));
+ }
+
+ void
+ on_read(beast::error_code ec, std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This means they closed the connection
+ if(ec == http::error::end_of_stream)
+ return derived().do_eof();
+
+ if(ec)
+ return fail(ec, "read");
+
+ // See if it is a WebSocket Upgrade
+ if(websocket::is_upgrade(parser_->get()))
+ {
+ // Disable the timeout.
+ // The websocket::stream uses its own timeout settings.
+ beast::get_lowest_layer(derived().stream()).expires_never();
+
+ // Create a websocket session, transferring ownership
+ // of both the socket and the HTTP request.
+ return make_websocket_session(
+ derived().release_stream(),
+ parser_->release());
+ }
+
+ // Send the response
+ handle_request(*doc_root_, parser_->release(), queue_);
+
+ // If we aren't at the queue limit, try to pipeline another request
+ if(! queue_.is_full())
+ do_read();
+ }
+
+ void
+ on_write(bool close, beast::error_code ec, std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ return derived().do_eof();
+ }
+
+ // Inform the queue that a write completed
+ if(queue_.on_write())
+ {
+ // Read another request
+ do_read();
+ }
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Handles a plain HTTP connection
+class plain_http_session
+ : public http_session<plain_http_session>
+ , public std::enable_shared_from_this<plain_http_session>
+{
+ beast::tcp_stream stream_;
+
+public:
+ // Create the session
+ plain_http_session(
+ beast::tcp_stream&& stream,
+ beast::flat_buffer&& buffer,
+ std::shared_ptr<std::string const> const& doc_root)
+ : http_session<plain_http_session>(
+ std::move(buffer),
+ doc_root)
+ , stream_(std::move(stream))
+ {
+ }
+
+ // Start the session
+ void
+ run()
+ {
+ this->do_read();
+ }
+
+ // Called by the base class
+ beast::tcp_stream&
+ stream()
+ {
+ return stream_;
+ }
+
+ // Called by the base class
+ beast::tcp_stream
+ release_stream()
+ {
+ return std::move(stream_);
+ }
+
+ // Called by the base class
+ void
+ do_eof()
+ {
+ // Send a TCP shutdown
+ beast::error_code ec;
+ stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
+
+ // At this point the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Handles an SSL HTTP connection
+class ssl_http_session
+ : public http_session<ssl_http_session>
+ , public std::enable_shared_from_this<ssl_http_session>
+{
+ beast::ssl_stream<beast::tcp_stream> stream_;
+
+public:
+ // Create the http_session
+ ssl_http_session(
+ beast::tcp_stream&& stream,
+ ssl::context& ctx,
+ beast::flat_buffer&& buffer,
+ std::shared_ptr<std::string const> const& doc_root)
+ : http_session<ssl_http_session>(
+ std::move(buffer),
+ doc_root)
+ , stream_(std::move(stream), ctx)
+ {
+ }
+
+ // Start the session
+ void
+ run()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ // Note, this is the buffered version of the handshake.
+ stream_.async_handshake(
+ ssl::stream_base::server,
+ buffer_.data(),
+ beast::bind_front_handler(
+ &ssl_http_session::on_handshake,
+ shared_from_this()));
+ }
+
+ // Called by the base class
+ beast::ssl_stream<beast::tcp_stream>&
+ stream()
+ {
+ return stream_;
+ }
+
+ // Called by the base class
+ beast::ssl_stream<beast::tcp_stream>
+ release_stream()
+ {
+ return std::move(stream_);
+ }
+
+ // Called by the base class
+ void
+ do_eof()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL shutdown
+ stream_.async_shutdown(
+ beast::bind_front_handler(
+ &ssl_http_session::on_shutdown,
+ shared_from_this()));
+ }
+
+private:
+ void
+ on_handshake(
+ beast::error_code ec,
+ std::size_t bytes_used)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Consume the portion of the buffer used by the handshake
+ buffer_.consume(bytes_used);
+
+ do_read();
+ }
+
+ void
+ on_shutdown(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // At this point the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Detects SSL handshakes
+class detect_session : public std::enable_shared_from_this<detect_session>
+{
+ beast::tcp_stream stream_;
+ ssl::context& ctx_;
+ std::shared_ptr<std::string const> doc_root_;
+ beast::flat_buffer buffer_;
+
+public:
+ explicit
+ detect_session(
+ tcp::socket&& socket,
+ ssl::context& ctx,
+ std::shared_ptr<std::string const> const& doc_root)
+ : stream_(std::move(socket))
+ , ctx_(ctx)
+ , doc_root_(doc_root)
+ {
+ }
+
+ // Launch the detector
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(
+ stream_.get_executor(),
+ beast::bind_front_handler(
+ &detect_session::on_run,
+ this->shared_from_this()));
+ }
+
+ void
+ on_run()
+ {
+ // Set the timeout.
+ stream_.expires_after(std::chrono::seconds(30));
+
+ beast::async_detect_ssl(
+ stream_,
+ buffer_,
+ beast::bind_front_handler(
+ &detect_session::on_detect,
+ this->shared_from_this()));
+ }
+
+ void
+ on_detect(beast::error_code ec, bool result)
+ {
+ if(ec)
+ return fail(ec, "detect");
+
+ if(result)
+ {
+ // Launch SSL session
+ std::make_shared<ssl_http_session>(
+ std::move(stream_),
+ ctx_,
+ std::move(buffer_),
+ doc_root_)->run();
+ return;
+ }
+
+ // Launch plain session
+ std::make_shared<plain_http_session>(
+ std::move(stream_),
+ std::move(buffer_),
+ doc_root_)->run();
+ }
+};
+
+// Accepts incoming connections and launches the sessions
+class listener : public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ ssl::context& ctx_;
+ tcp::acceptor acceptor_;
+ std::shared_ptr<std::string const> doc_root_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root)
+ : ioc_(ioc)
+ , ctx_(ctx)
+ , acceptor_(net::make_strand(ioc))
+ , doc_root_(doc_root)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ do_accept();
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the detector http_session and run it
+ std::make_shared<detect_session>(
+ std::move(socket),
+ ctx_,
+ doc_root_)->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: advanced-server-flex <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " advanced-server-flex 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Create and launch a listening port
+ std::make_shared<listener>(
+ ioc,
+ ctx,
+ tcp::endpoint{address, port},
+ doc_root)->run();
+
+ // Capture SIGINT and SIGTERM to perform a clean shutdown
+ net::signal_set signals(ioc, SIGINT, SIGTERM);
+ signals.async_wait(
+ [&](beast::error_code const&, int)
+ {
+ // Stop the `io_context`. This will cause `run()`
+ // to return immediately, eventually destroying the
+ // `io_context` and all of the sockets in it.
+ ioc.stop();
+ });
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ // (If we get here, it means we got a SIGINT or SIGTERM)
+
+ // Block until all the threads exit
+ for(auto& t : v)
+ t.join();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/advanced/server/CMakeLists.txt b/src/boost/libs/beast/example/advanced/server/CMakeLists.txt
new file mode 100644
index 000000000..08014afee
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/server/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/advanced/server "/")
+
+add_executable (advanced-server
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ advanced_server.cpp
+)
+
+target_link_libraries(advanced-server
+ lib-asio
+ lib-beast)
+
+set_property(TARGET advanced-server PROPERTY FOLDER "example-advanced-server")
diff --git a/src/boost/libs/beast/example/advanced/server/Jamfile b/src/boost/libs/beast/example/advanced/server/Jamfile
new file mode 100644
index 000000000..5f9ceecd8
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/server/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe advanced-server :
+ advanced_server.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/advanced/server/advanced_server.cpp b/src/boost/libs/beast/example/advanced/server/advanced_server.cpp
new file mode 100644
index 000000000..715f8b8ca
--- /dev/null
+++ b/src/boost/libs/beast/example/advanced/server/advanced_server.cpp
@@ -0,0 +1,700 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: Advanced server
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/bind_executor.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/signal_set.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/make_unique.hpp>
+#include <boost/optional.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Echoes back all received WebSocket messages
+class websocket_session : public std::enable_shared_from_this<websocket_session>
+{
+ websocket::stream<beast::tcp_stream> ws_;
+ beast::flat_buffer buffer_;
+
+public:
+ // Take ownership of the socket
+ explicit
+ websocket_session(tcp::socket&& socket)
+ : ws_(std::move(socket))
+ {
+ }
+
+ // Start the asynchronous accept operation
+ template<class Body, class Allocator>
+ void
+ do_accept(http::request<Body, http::basic_fields<Allocator>> req)
+ {
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " advanced-server");
+ }));
+
+ // Accept the websocket handshake
+ ws_.async_accept(
+ req,
+ beast::bind_front_handler(
+ &websocket_session::on_accept,
+ shared_from_this()));
+ }
+
+private:
+ void
+ on_accept(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "accept");
+
+ // Read a message
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ // Read a message into our buffer
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &websocket_session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This indicates that the websocket_session was closed
+ if(ec == websocket::error::closed)
+ return;
+
+ if(ec)
+ fail(ec, "read");
+
+ // Echo the message
+ ws_.text(ws_.got_text());
+ ws_.async_write(
+ buffer_.data(),
+ beast::bind_front_handler(
+ &websocket_session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+
+ // Do another read
+ do_read();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Handles an HTTP server connection
+class http_session : public std::enable_shared_from_this<http_session>
+{
+ // This queue is used for HTTP pipelining.
+ class queue
+ {
+ enum
+ {
+ // Maximum number of responses we will queue
+ limit = 8
+ };
+
+ // The type-erased, saved work item
+ struct work
+ {
+ virtual ~work() = default;
+ virtual void operator()() = 0;
+ };
+
+ http_session& self_;
+ std::vector<std::unique_ptr<work>> items_;
+
+ public:
+ explicit
+ queue(http_session& self)
+ : self_(self)
+ {
+ static_assert(limit > 0, "queue limit must be positive");
+ items_.reserve(limit);
+ }
+
+ // Returns `true` if we have reached the queue limit
+ bool
+ is_full() const
+ {
+ return items_.size() >= limit;
+ }
+
+ // Called when a message finishes sending
+ // Returns `true` if the caller should initiate a read
+ bool
+ on_write()
+ {
+ BOOST_ASSERT(! items_.empty());
+ auto const was_full = is_full();
+ items_.erase(items_.begin());
+ if(! items_.empty())
+ (*items_.front())();
+ return was_full;
+ }
+
+ // Called by the HTTP handler to send a response.
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg)
+ {
+ // This holds a work item
+ struct work_impl : work
+ {
+ http_session& self_;
+ http::message<isRequest, Body, Fields> msg_;
+
+ work_impl(
+ http_session& self,
+ http::message<isRequest, Body, Fields>&& msg)
+ : self_(self)
+ , msg_(std::move(msg))
+ {
+ }
+
+ void
+ operator()()
+ {
+ http::async_write(
+ self_.stream_,
+ msg_,
+ beast::bind_front_handler(
+ &http_session::on_write,
+ self_.shared_from_this(),
+ msg_.need_eof()));
+ }
+ };
+
+ // Allocate and store the work
+ items_.push_back(
+ boost::make_unique<work_impl>(self_, std::move(msg)));
+
+ // If there was no previous work, start this one
+ if(items_.size() == 1)
+ (*items_.front())();
+ }
+ };
+
+ beast::tcp_stream stream_;
+ beast::flat_buffer buffer_;
+ std::shared_ptr<std::string const> doc_root_;
+ queue queue_;
+
+ // The parser is stored in an optional container so we can
+ // construct it from scratch it at the beginning of each new message.
+ boost::optional<http::request_parser<http::string_body>> parser_;
+
+public:
+ // Take ownership of the socket
+ http_session(
+ tcp::socket&& socket,
+ std::shared_ptr<std::string const> const& doc_root)
+ : stream_(std::move(socket))
+ , doc_root_(doc_root)
+ , queue_(*this)
+ {
+ }
+
+ // Start the session
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(
+ stream_.get_executor(),
+ beast::bind_front_handler(
+ &http_session::do_read,
+ this->shared_from_this()));
+ }
+
+
+private:
+ void
+ do_read()
+ {
+ // Construct a new parser for each message
+ parser_.emplace();
+
+ // Apply a reasonable limit to the allowed size
+ // of the body in bytes to prevent abuse.
+ parser_->body_limit(10000);
+
+ // Set the timeout.
+ stream_.expires_after(std::chrono::seconds(30));
+
+ // Read a request using the parser-oriented interface
+ http::async_read(
+ stream_,
+ buffer_,
+ *parser_,
+ beast::bind_front_handler(
+ &http_session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(beast::error_code ec, std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This means they closed the connection
+ if(ec == http::error::end_of_stream)
+ return do_close();
+
+ if(ec)
+ return fail(ec, "read");
+
+ // See if it is a WebSocket Upgrade
+ if(websocket::is_upgrade(parser_->get()))
+ {
+ // Create a websocket session, transferring ownership
+ // of both the socket and the HTTP request.
+ std::make_shared<websocket_session>(
+ stream_.release_socket())->do_accept(parser_->release());
+ return;
+ }
+
+ // Send the response
+ handle_request(*doc_root_, parser_->release(), queue_);
+
+ // If we aren't at the queue limit, try to pipeline another request
+ if(! queue_.is_full())
+ do_read();
+ }
+
+ void
+ on_write(bool close, beast::error_code ec, std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ return do_close();
+ }
+
+ // Inform the queue that a write completed
+ if(queue_.on_write())
+ {
+ // Read another request
+ do_read();
+ }
+ }
+
+ void
+ do_close()
+ {
+ // Send a TCP shutdown
+ beast::error_code ec;
+ stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
+
+ // At this point the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener : public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ tcp::acceptor acceptor_;
+ std::shared_ptr<std::string const> doc_root_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root)
+ : ioc_(ioc)
+ , acceptor_(net::make_strand(ioc))
+ , doc_root_(doc_root)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(
+ acceptor_.get_executor(),
+ beast::bind_front_handler(
+ &listener::do_accept,
+ this->shared_from_this()));
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the http session and run it
+ std::make_shared<http_session>(
+ std::move(socket),
+ doc_root_)->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: advanced-server <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " advanced-server 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // Create and launch a listening port
+ std::make_shared<listener>(
+ ioc,
+ tcp::endpoint{address, port},
+ doc_root)->run();
+
+ // Capture SIGINT and SIGTERM to perform a clean shutdown
+ net::signal_set signals(ioc, SIGINT, SIGTERM);
+ signals.async_wait(
+ [&](beast::error_code const&, int)
+ {
+ // Stop the `io_context`. This will cause `run()`
+ // to return immediately, eventually destroying the
+ // `io_context` and all of the sockets in it.
+ ioc.stop();
+ });
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ // (If we get here, it means we got a SIGINT or SIGTERM)
+
+ // Block until all the threads exit
+ for(auto& t : v)
+ t.join();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/common/root_certificates.hpp b/src/boost/libs/beast/example/common/root_certificates.hpp
new file mode 100644
index 000000000..aa65bdeb8
--- /dev/null
+++ b/src/boost/libs/beast/example/common/root_certificates.hpp
@@ -0,0 +1,151 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_COMMON_ROOT_CERTIFICATES_HPP
+#define BOOST_BEAST_EXAMPLE_COMMON_ROOT_CERTIFICATES_HPP
+
+#include <boost/asio/ssl.hpp>
+#include <string>
+
+/*
+ PLEASE READ
+
+ These root certificates here are included just to make the
+ SSL client examples work. They are NOT intended to be
+ illustrative of best-practices for performing TLS certificate
+ verification.
+
+ A REAL program which needs to verify the authenticity of a
+ server IP address resolved from a given DNS name needs to
+ consult the operating system specific certificate store
+ to validate the chain of signatures, compare the domain name
+ properly against the domain name in the certificate, check
+ the certificate revocation list, and probably do some other
+ things.
+
+ ALL of these operations are entirely outside the scope of
+ both Boost.Beast and Boost.Asio.
+
+ See (work in progress):
+ https://github.com/djarek/certify
+
+ tl;dr: root_certificates.hpp should not be used in production code
+*/
+
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+
+namespace detail {
+
+inline
+void
+load_root_certificates(ssl::context& ctx, boost::system::error_code& ec)
+{
+ std::string const cert =
+ /* This is the DigiCert Global Root CA
+
+ CN = DigiCert High Assurance EV Root CA
+ OU = www.digicert.com
+ O = DigiCert Inc
+ C = US
+
+ Valid to: 10 November 2031
+
+ Serial #:
+ 08:3B:E0:56:90:42:46:B1:A1:75:6A:C9:59:91:C7:4A
+
+ SHA1 Fingerprint:
+ A8:98:5D:3A:65:E5:E5:C4:B2:D7:D6:6D:40:C6:DD:2F:B1:9C:54:36
+
+ SHA256 Fingerprint:
+ 43:48:A0:E9:44:4C:78:CB:26:5E:05:8D:5E:89:44:B4:D8:4F:96:62:BD:26:DB:25:7F:89:34:A4:43:C7:01:61
+ */
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIDrzCCApegAwIBAgIQCDvgVpBCRrGhdWrJWZHHSjANBgkqhkiG9w0BAQUFADBh\n"
+ "MQswCQYDVQQGEwJVUzEVMBMGA1UEChMMRGlnaUNlcnQgSW5jMRkwFwYDVQQLExB3\n"
+ "d3cuZGlnaWNlcnQuY29tMSAwHgYDVQQDExdEaWdpQ2VydCBHbG9iYWwgUm9vdCBD\n"
+ "QTAeFw0wNjExMTAwMDAwMDBaFw0zMTExMTAwMDAwMDBaMGExCzAJBgNVBAYTAlVT\n"
+ "MRUwEwYDVQQKEwxEaWdpQ2VydCBJbmMxGTAXBgNVBAsTEHd3dy5kaWdpY2VydC5j\n"
+ "b20xIDAeBgNVBAMTF0RpZ2lDZXJ0IEdsb2JhbCBSb290IENBMIIBIjANBgkqhkiG\n"
+ "9w0BAQEFAAOCAQ8AMIIBCgKCAQEA4jvhEXLeqKTTo1eqUKKPC3eQyaKl7hLOllsB\n"
+ "CSDMAZOnTjC3U/dDxGkAV53ijSLdhwZAAIEJzs4bg7/fzTtxRuLWZscFs3YnFo97\n"
+ "nh6Vfe63SKMI2tavegw5BmV/Sl0fvBf4q77uKNd0f3p4mVmFaG5cIzJLv07A6Fpt\n"
+ "43C/dxC//AH2hdmoRBBYMql1GNXRor5H4idq9Joz+EkIYIvUX7Q6hL+hqkpMfT7P\n"
+ "T19sdl6gSzeRntwi5m3OFBqOasv+zbMUZBfHWymeMr/y7vrTC0LUq7dBMtoM1O/4\n"
+ "gdW7jVg/tRvoSSiicNoxBN33shbyTApOB6jtSj1etX+jkMOvJwIDAQABo2MwYTAO\n"
+ "BgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQUA95QNVbR\n"
+ "TLtm8KPiGxvDl7I90VUwHwYDVR0jBBgwFoAUA95QNVbRTLtm8KPiGxvDl7I90VUw\n"
+ "DQYJKoZIhvcNAQEFBQADggEBAMucN6pIExIK+t1EnE9SsPTfrgT1eXkIoyQY/Esr\n"
+ "hMAtudXH/vTBH1jLuG2cenTnmCmrEbXjcKChzUyImZOMkXDiqw8cvpOp/2PV5Adg\n"
+ "06O/nVsJ8dWO41P0jmP6P6fbtGbfYmbW0W5BjfIttep3Sp+dWOIrWcBAI+0tKIJF\n"
+ "PnlUkiaY4IBIqDfv8NZ5YBberOgOzW6sRBc4L0na4UU+Krk2U886UAb3LujEV0ls\n"
+ "YSEY1QSteDwsOoBrp+uvFRTp2InBuThs4pFsiv9kuXclVzDAGySj4dzp30d8tbQk\n"
+ "CAUw7C29C79Fv1C5qfPrmAESrciIxpg0X40KPMbp1ZWVbd4=\n"
+ "-----END CERTIFICATE-----\n"
+
+ /* This is the GeoTrust root certificate.
+
+ CN = GeoTrust Global CA
+ O = GeoTrust Inc.
+ C = US
+ Valid to: Friday, ‎May ‎20, ‎2022 9:00:00 PM
+
+ Thumbprint(sha1):
+ ‎de 28 f4 a4 ff e5 b9 2f a3 c5 03 d1 a3 49 a7 f9 96 2a 82 12
+ */
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIDaDCCAlCgAwIBAgIJAO8vBu8i8exWMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV\n"
+ "BAYTAlVTMQswCQYDVQQIDAJDQTEtMCsGA1UEBwwkTG9zIEFuZ2VsZXNPPUJlYXN0\n"
+ "Q049d3d3LmV4YW1wbGUuY29tMB4XDTE3MDUwMzE4MzkxMloXDTQ0MDkxODE4Mzkx\n"
+ "MlowSTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMS0wKwYDVQQHDCRMb3MgQW5n\n"
+ "ZWxlc089QmVhc3RDTj13d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUA\n"
+ "A4IBDwAwggEKAoIBAQDJ7BRKFO8fqmsEXw8v9YOVXyrQVsVbjSSGEs4Vzs4cJgcF\n"
+ "xqGitbnLIrOgiJpRAPLy5MNcAXE1strVGfdEf7xMYSZ/4wOrxUyVw/Ltgsft8m7b\n"
+ "Fu8TsCzO6XrxpnVtWk506YZ7ToTa5UjHfBi2+pWTxbpN12UhiZNUcrRsqTFW+6fO\n"
+ "9d7xm5wlaZG8cMdg0cO1bhkz45JSl3wWKIES7t3EfKePZbNlQ5hPy7Pd5JTmdGBp\n"
+ "yY8anC8u4LPbmgW0/U31PH0rRVfGcBbZsAoQw5Tc5dnb6N2GEIbq3ehSfdDHGnrv\n"
+ "enu2tOK9Qx6GEzXh3sekZkxcgh+NlIxCNxu//Dk9AgMBAAGjUzBRMB0GA1UdDgQW\n"
+ "BBTZh0N9Ne1OD7GBGJYz4PNESHuXezAfBgNVHSMEGDAWgBTZh0N9Ne1OD7GBGJYz\n"
+ "4PNESHuXezAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCmTJVT\n"
+ "LH5Cru1vXtzb3N9dyolcVH82xFVwPewArchgq+CEkajOU9bnzCqvhM4CryBb4cUs\n"
+ "gqXWp85hAh55uBOqXb2yyESEleMCJEiVTwm/m26FdONvEGptsiCmF5Gxi0YRtn8N\n"
+ "V+KhrQaAyLrLdPYI7TrwAOisq2I1cD0mt+xgwuv/654Rl3IhOMx+fKWKJ9qLAiaE\n"
+ "fQyshjlPP9mYVxWOxqctUdQ8UnsUKKGEUcVrA08i1OAnVKlPFjKBvk+r7jpsTPcr\n"
+ "9pWXTO9JrYMML7d+XRSZA1n3856OqZDX4403+9FnXCvfcLZLLKTBvwwFgEFGpzjK\n"
+ "UEVbkhd5qstF6qWK\n"
+ "-----END CERTIFICATE-----\n";
+ ;
+
+ ctx.add_certificate_authority(
+ boost::asio::buffer(cert.data(), cert.size()), ec);
+ if(ec)
+ return;
+}
+
+} // detail
+
+// Load the root certificates into an ssl::context
+
+inline
+void
+load_root_certificates(ssl::context& ctx, boost::system::error_code& ec)
+{
+ detail::load_root_certificates(ctx, ec);
+}
+
+inline
+void
+load_root_certificates(ssl::context& ctx)
+{
+ boost::system::error_code ec;
+ detail::load_root_certificates(ctx, ec);
+ if(ec)
+ throw boost::system::system_error{ec};
+}
+
+#endif
diff --git a/src/boost/libs/beast/example/common/server_certificate.hpp b/src/boost/libs/beast/example/common/server_certificate.hpp
new file mode 100644
index 000000000..a20110e40
--- /dev/null
+++ b/src/boost/libs/beast/example/common/server_certificate.hpp
@@ -0,0 +1,124 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_COMMON_SERVER_CERTIFICATE_HPP
+#define BOOST_BEAST_EXAMPLE_COMMON_SERVER_CERTIFICATE_HPP
+
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/ssl/context.hpp>
+#include <cstddef>
+#include <memory>
+
+/* Load a signed certificate into the ssl context, and configure
+ the context for use with a server.
+
+ For this to work with the browser or operating system, it is
+ necessary to import the "Beast Test CA" certificate into
+ the local certificate store, browser, or operating system
+ depending on your environment Please see the documentation
+ accompanying the Beast certificate for more details.
+*/
+inline
+void
+load_server_certificate(boost::asio::ssl::context& ctx)
+{
+ /*
+ The certificate was generated from CMD.EXE on Windows 10 using:
+
+ winpty openssl dhparam -out dh.pem 2048
+ winpty openssl req -newkey rsa:2048 -nodes -keyout key.pem -x509 -days 10000 -out cert.pem -subj "//C=US\ST=CA\L=Los Angeles\O=Beast\CN=www.example.com"
+ */
+
+ std::string const cert =
+ "-----BEGIN CERTIFICATE-----\n"
+ "MIIDaDCCAlCgAwIBAgIJAO8vBu8i8exWMA0GCSqGSIb3DQEBCwUAMEkxCzAJBgNV\n"
+ "BAYTAlVTMQswCQYDVQQIDAJDQTEtMCsGA1UEBwwkTG9zIEFuZ2VsZXNPPUJlYXN0\n"
+ "Q049d3d3LmV4YW1wbGUuY29tMB4XDTE3MDUwMzE4MzkxMloXDTQ0MDkxODE4Mzkx\n"
+ "MlowSTELMAkGA1UEBhMCVVMxCzAJBgNVBAgMAkNBMS0wKwYDVQQHDCRMb3MgQW5n\n"
+ "ZWxlc089QmVhc3RDTj13d3cuZXhhbXBsZS5jb20wggEiMA0GCSqGSIb3DQEBAQUA\n"
+ "A4IBDwAwggEKAoIBAQDJ7BRKFO8fqmsEXw8v9YOVXyrQVsVbjSSGEs4Vzs4cJgcF\n"
+ "xqGitbnLIrOgiJpRAPLy5MNcAXE1strVGfdEf7xMYSZ/4wOrxUyVw/Ltgsft8m7b\n"
+ "Fu8TsCzO6XrxpnVtWk506YZ7ToTa5UjHfBi2+pWTxbpN12UhiZNUcrRsqTFW+6fO\n"
+ "9d7xm5wlaZG8cMdg0cO1bhkz45JSl3wWKIES7t3EfKePZbNlQ5hPy7Pd5JTmdGBp\n"
+ "yY8anC8u4LPbmgW0/U31PH0rRVfGcBbZsAoQw5Tc5dnb6N2GEIbq3ehSfdDHGnrv\n"
+ "enu2tOK9Qx6GEzXh3sekZkxcgh+NlIxCNxu//Dk9AgMBAAGjUzBRMB0GA1UdDgQW\n"
+ "BBTZh0N9Ne1OD7GBGJYz4PNESHuXezAfBgNVHSMEGDAWgBTZh0N9Ne1OD7GBGJYz\n"
+ "4PNESHuXezAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQCmTJVT\n"
+ "LH5Cru1vXtzb3N9dyolcVH82xFVwPewArchgq+CEkajOU9bnzCqvhM4CryBb4cUs\n"
+ "gqXWp85hAh55uBOqXb2yyESEleMCJEiVTwm/m26FdONvEGptsiCmF5Gxi0YRtn8N\n"
+ "V+KhrQaAyLrLdPYI7TrwAOisq2I1cD0mt+xgwuv/654Rl3IhOMx+fKWKJ9qLAiaE\n"
+ "fQyshjlPP9mYVxWOxqctUdQ8UnsUKKGEUcVrA08i1OAnVKlPFjKBvk+r7jpsTPcr\n"
+ "9pWXTO9JrYMML7d+XRSZA1n3856OqZDX4403+9FnXCvfcLZLLKTBvwwFgEFGpzjK\n"
+ "UEVbkhd5qstF6qWK\n"
+ "-----END CERTIFICATE-----\n";
+
+ std::string const key =
+ "-----BEGIN PRIVATE KEY-----\n"
+ "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDJ7BRKFO8fqmsE\n"
+ "Xw8v9YOVXyrQVsVbjSSGEs4Vzs4cJgcFxqGitbnLIrOgiJpRAPLy5MNcAXE1strV\n"
+ "GfdEf7xMYSZ/4wOrxUyVw/Ltgsft8m7bFu8TsCzO6XrxpnVtWk506YZ7ToTa5UjH\n"
+ "fBi2+pWTxbpN12UhiZNUcrRsqTFW+6fO9d7xm5wlaZG8cMdg0cO1bhkz45JSl3wW\n"
+ "KIES7t3EfKePZbNlQ5hPy7Pd5JTmdGBpyY8anC8u4LPbmgW0/U31PH0rRVfGcBbZ\n"
+ "sAoQw5Tc5dnb6N2GEIbq3ehSfdDHGnrvenu2tOK9Qx6GEzXh3sekZkxcgh+NlIxC\n"
+ "Nxu//Dk9AgMBAAECggEBAK1gV8uETg4SdfE67f9v/5uyK0DYQH1ro4C7hNiUycTB\n"
+ "oiYDd6YOA4m4MiQVJuuGtRR5+IR3eI1zFRMFSJs4UqYChNwqQGys7CVsKpplQOW+\n"
+ "1BCqkH2HN/Ix5662Dv3mHJemLCKUON77IJKoq0/xuZ04mc9csykox6grFWB3pjXY\n"
+ "OEn9U8pt5KNldWfpfAZ7xu9WfyvthGXlhfwKEetOuHfAQv7FF6s25UIEU6Hmnwp9\n"
+ "VmYp2twfMGdztz/gfFjKOGxf92RG+FMSkyAPq/vhyB7oQWxa+vdBn6BSdsfn27Qs\n"
+ "bTvXrGe4FYcbuw4WkAKTljZX7TUegkXiwFoSps0jegECgYEA7o5AcRTZVUmmSs8W\n"
+ "PUHn89UEuDAMFVk7grG1bg8exLQSpugCykcqXt1WNrqB7x6nB+dbVANWNhSmhgCg\n"
+ "VrV941vbx8ketqZ9YInSbGPWIU/tss3r8Yx2Ct3mQpvpGC6iGHzEc/NHJP8Efvh/\n"
+ "CcUWmLjLGJYYeP5oNu5cncC3fXUCgYEA2LANATm0A6sFVGe3sSLO9un1brA4zlZE\n"
+ "Hjd3KOZnMPt73B426qUOcw5B2wIS8GJsUES0P94pKg83oyzmoUV9vJpJLjHA4qmL\n"
+ "CDAd6CjAmE5ea4dFdZwDDS8F9FntJMdPQJA9vq+JaeS+k7ds3+7oiNe+RUIHR1Sz\n"
+ "VEAKh3Xw66kCgYB7KO/2Mchesu5qku2tZJhHF4QfP5cNcos511uO3bmJ3ln+16uR\n"
+ "GRqz7Vu0V6f7dvzPJM/O2QYqV5D9f9dHzN2YgvU9+QSlUeFK9PyxPv3vJt/WP1//\n"
+ "zf+nbpaRbwLxnCnNsKSQJFpnrE166/pSZfFbmZQpNlyeIuJU8czZGQTifQKBgHXe\n"
+ "/pQGEZhVNab+bHwdFTxXdDzr+1qyrodJYLaM7uFES9InVXQ6qSuJO+WosSi2QXlA\n"
+ "hlSfwwCwGnHXAPYFWSp5Owm34tbpp0mi8wHQ+UNgjhgsE2qwnTBUvgZ3zHpPORtD\n"
+ "23KZBkTmO40bIEyIJ1IZGdWO32q79nkEBTY+v/lRAoGBAI1rbouFYPBrTYQ9kcjt\n"
+ "1yfu4JF5MvO9JrHQ9tOwkqDmNCWx9xWXbgydsn/eFtuUMULWsG3lNjfst/Esb8ch\n"
+ "k5cZd6pdJZa4/vhEwrYYSuEjMCnRb0lUsm7TsHxQrUd6Fi/mUuFU/haC0o0chLq7\n"
+ "pVOUFq5mW8p0zbtfHbjkgxyF\n"
+ "-----END PRIVATE KEY-----\n";
+
+ std::string const dh =
+ "-----BEGIN DH PARAMETERS-----\n"
+ "MIIBCAKCAQEArzQc5mpm0Fs8yahDeySj31JZlwEphUdZ9StM2D8+Fo7TMduGtSi+\n"
+ "/HRWVwHcTFAgrxVdm+dl474mOUqqaz4MpzIb6+6OVfWHbQJmXPepZKyu4LgUPvY/\n"
+ "4q3/iDMjIS0fLOu/bLuObwU5ccZmDgfhmz1GanRlTQOiYRty3FiOATWZBRh6uv4u\n"
+ "tff4A9Bm3V9tLx9S6djq31w31Gl7OQhryodW28kc16t9TvO1BzcV3HjRPwpe701X\n"
+ "oEEZdnZWANkkpR/m/pfgdmGPU66S2sXMHgsliViQWpDCYeehrvFRHEdR9NV+XJfC\n"
+ "QMUk26jPTIVTLfXmmwU0u8vUkpR7LQKkwwIBAg==\n"
+ "-----END DH PARAMETERS-----\n";
+
+ ctx.set_password_callback(
+ [](std::size_t,
+ boost::asio::ssl::context_base::password_purpose)
+ {
+ return "test";
+ });
+
+ ctx.set_options(
+ boost::asio::ssl::context::default_workarounds |
+ boost::asio::ssl::context::no_sslv2 |
+ boost::asio::ssl::context::single_dh_use);
+
+ ctx.use_certificate_chain(
+ boost::asio::buffer(cert.data(), cert.size()));
+
+ ctx.use_private_key(
+ boost::asio::buffer(key.data(), key.size()),
+ boost::asio::ssl::context::file_format::pem);
+
+ ctx.use_tmp_dh(
+ boost::asio::buffer(dh.data(), dh.size()));
+}
+
+#endif
diff --git a/src/boost/libs/beast/example/echo-op/CMakeLists.txt b/src/boost/libs/beast/example/echo-op/CMakeLists.txt
new file mode 100644
index 000000000..d0e086b6e
--- /dev/null
+++ b/src/boost/libs/beast/example/echo-op/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/echo-op "/")
+
+add_executable (echo-op
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ echo_op.cpp
+)
+
+target_link_libraries(echo-op
+ lib-asio
+ lib-beast)
+
+set_property(TARGET echo-op PROPERTY FOLDER "example")
diff --git a/src/boost/libs/beast/example/echo-op/Jamfile b/src/boost/libs/beast/example/echo-op/Jamfile
new file mode 100644
index 000000000..caeb767e2
--- /dev/null
+++ b/src/boost/libs/beast/example/echo-op/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe echo-op :
+ echo_op.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/echo-op/echo_op.cpp b/src/boost/libs/beast/example/echo-op/echo_op.cpp
new file mode 100644
index 000000000..475940beb
--- /dev/null
+++ b/src/boost/libs/beast/example/echo-op/echo_op.cpp
@@ -0,0 +1,377 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core.hpp>
+#include <boost/asio.hpp>
+#include <cstddef>
+#include <iostream>
+#include <memory>
+#include <utility>
+
+namespace net = boost::asio;
+namespace beast = boost::beast;
+
+//[example_core_echo_op_1
+
+template<
+ class AsyncStream,
+ class DynamicBuffer,
+ class CompletionToken>
+auto
+async_echo (AsyncStream& stream, DynamicBuffer& buffer, CompletionToken&& token)
+
+//]
+ ->
+ typename net::async_result<
+ typename std::decay<CompletionToken>::type,
+ void(beast::error_code)>::return_type;
+
+//------------------------------------------------------------------------------
+
+//[example_core_echo_op_2
+
+/** Asynchronously read a line and echo it back.
+
+ This function is used to asynchronously read a line ending
+ in a newline (`"\n"`) from the stream, and then write
+ it back.
+
+ This call always returns immediately. The asynchronous operation
+ will continue until one of the following conditions is true:
+
+ @li A line was read in and written back on the stream
+
+ @li An error occurs.
+
+ The algorithm, known as a <em>composed asynchronous operation</em>,
+ is implemented in terms of calls to the stream's `async_read_some`
+ and `async_write_some` function. The program must ensure that no
+ other reads or writes are performed until this operation completes.
+
+ Since the length of the line is not known ahead of time, the
+ implementation may read additional characters that lie past the
+ first line. These characters are stored in the dynamic buffer_.
+ The same dynamic buffer must be presented again in each call,
+ to provide the implementation with any leftover bytes.
+
+ @param stream The stream to operate on. The type must meet the
+ requirements of <em>AsyncReadStream</em> and @AsyncWriteStream
+
+ @param buffer A dynamic buffer to hold implementation-defined
+ temporary data. Ownership is not transferred; the caller is
+ responsible for ensuring that the lifetime of this object is
+ extended least until the completion handler is invoked.
+
+ @param token The handler to be called when the operation completes.
+ The implementation takes ownership of the handler by performing a decay-copy.
+ The handler must be invocable with this signature:
+ @code
+ void handler(
+ beast::error_code error // Result of operation.
+ );
+ @endcode
+
+ Regardless of whether the asynchronous operation completes immediately or
+ not, the handler will not be invoked from within this function. Invocation
+ of the handler will be performed in a manner equivalent to using
+ `net::post`.
+*/
+template<
+ class AsyncStream,
+ class DynamicBuffer,
+ class CompletionToken>
+auto
+async_echo (
+ AsyncStream& stream,
+ DynamicBuffer& buffer, /*< Unlike Asio, we pass by non-const reference instead of rvalue-ref >*/
+ CompletionToken&& token) ->
+ typename net::async_result< /*< `async_result` deduces the return type from the completion handler >*/
+ typename std::decay<CompletionToken>::type,
+ void(beast::error_code) /*< The completion handler signature goes here >*/
+ >::return_type;
+//]
+
+//[example_core_echo_op_3
+
+template<class AsyncStream, class Handler>
+class echo_op;
+
+// This example uses the Asio's stackless "fauxroutines", implemented
+// using a macro-based solution. It makes the code easier to write and
+// easier to read. This include file defines the necessary macros and types.
+#include <boost/asio/yield.hpp>
+
+// Read a line and echo it back
+//
+template<
+ class AsyncStream,
+ class DynamicBuffer,
+ class CompletionToken>
+auto
+async_echo(
+ AsyncStream& stream,
+ DynamicBuffer& buffer,
+ CompletionToken&& token) ->
+ typename net::async_result<
+ typename std::decay<CompletionToken>::type,
+ void(beast::error_code)>::return_type /*< The completion handler signature goes here >*/
+{
+ // Perform some type checks using static assert, this helps
+ // with more friendly error messages when passing the wrong types.
+ static_assert(
+ beast::is_async_stream<AsyncStream>::value,
+ "AsyncStream type requirements not met");
+ static_assert(
+ net::is_dynamic_buffer<DynamicBuffer>::value,
+ "DynamicBuffer type requirements not met");
+
+ // This class template deduces the actual handler type from a
+ // CompletionToken, captures a local reference to the handler,
+ // and creates the `async_result` object which becomes the
+ // return value of this initiating function.
+
+ net::async_completion<CompletionToken, void(beast::error_code)> init(token);
+
+ // The helper macro BOOST_ASIO_HANDLER_TYPE converts the completion
+ // token type into a concrete handler type of the correct signature.
+
+ using handler_type = BOOST_ASIO_HANDLER_TYPE(CompletionToken, void(beast::error_code));
+
+ // The class template `async_base` holds the caller's completion
+ // handler for us, and provides all of the boilerplate for forwarding
+ // the associated allocator and associated executor from the caller's
+ // handler to our operation. It also maintains a `net::executor_work_guard`
+ // for the executor associated with the stream. This work guard is
+ // inexpensive, and prevents the execution context from running out
+ // of work. It is usually necessary although rarely it can be skipped
+ // depending on the operation (this echo example needs it because it
+ // performs more than one asynchronous operation in a row).
+ // We declare this type alias to make the code easier to read.
+
+ using base_type = beast::async_base<
+ handler_type, /*< The type of the completion handler obtained from the token >*/
+ beast::executor_type<AsyncStream> /*< The type of executor used by the stream to dispatch asynchronous operations >*/
+ >;
+
+ // This nested class implements the echo composed operation as a
+ // stateful completion handler. We derive from `async_base` to
+ // take care of boilerplate and we derived from asio::coroutine to
+ // allow the reenter and yield keywords to work.
+
+ struct echo_op : base_type, boost::asio::coroutine
+ {
+ AsyncStream& stream_;
+ DynamicBuffer& buffer_;
+
+ echo_op(
+ AsyncStream& stream,
+ DynamicBuffer& buffer,
+ handler_type&& handler)
+ : base_type(
+ std::move(handler), /*< The `async_base` helper takes ownership of the handler, >*/
+ stream.get_executor()) /*< and also needs to know which executor to use. >*/
+ , stream_(stream)
+ , buffer_(buffer)
+ {
+ // Launch the operation directly from the constructor. We
+ // pass `false` for `cont` to indicate that the calling
+ // thread does not represent a continuation of our
+ // asynchronous control flow.
+ (*this)({}, 0, false);
+ }
+
+ // If a newline is present in the buffer sequence, this function returns
+ // the number of characters from the beginning of the buffer up to the
+ // newline, including the newline character. Otherwise it returns zero.
+
+ std::size_t
+ find_newline(typename DynamicBuffer::const_buffers_type const& buffers)
+ {
+ // The `buffers_iterator` class template provides random-access
+ // iterators into a buffer sequence. Use the standard algorithm
+ // to look for the new line if it exists.
+
+ auto begin = net::buffers_iterator<
+ typename DynamicBuffer::const_buffers_type>::begin(buffers);
+ auto end = net::buffers_iterator<
+ typename DynamicBuffer::const_buffers_type>::end(buffers);
+ auto result = std::find(begin, end, '\n');
+
+ if(result == end)
+ return 0; // not found
+
+ return result + 1 - begin;
+ }
+
+ // This is the entry point of our completion handler. Every time an
+ // asynchronous operation completes, this function will be invoked.
+
+ void
+ operator()(
+ beast::error_code ec,
+ std::size_t bytes_transferred = 0,
+ bool cont = true) /*< Second and subsequent invocations will seee `cont=true`. */
+ {
+ // The `reenter` keyword transfers control to the last
+ // yield point, or to the beginning of the scope if
+ // this is the first time.
+
+ reenter(*this)
+ {
+ for(;;)
+ {
+ std::size_t pos;
+
+ // Search for a newline in the readable bytes of the buffer
+ pos = find_newline(buffer_.data());
+
+ // If we don't have the newline, then read more
+ if(pos == 0)
+ {
+ std::size_t bytes_to_read;
+
+ // Determine the number of bytes to read,
+ // using available capacity in the buffer first.
+
+ bytes_to_read = std::min<std::size_t>(
+ std::max<std::size_t>(512, // under 512 is too little,
+ buffer_.capacity() - buffer_.size()),
+ std::min<std::size_t>(65536, // and over 65536 is too much.
+ buffer_.max_size() - buffer_.size()));
+
+ // Read some data into our dynamic buffer_. We transfer
+ // ownership of the composed operation by using the
+ // `std::move(*this)` idiom. The `yield` keyword causes
+ // the function to return immediately after the initiating
+ // function returns.
+
+ yield stream_.async_read_some(
+ buffer_.prepare(bytes_to_read), std::move(*this));
+
+ // After the `async_read_some` completes, control is
+ // transferred to this line by the `reenter` keyword.
+
+ // Move the bytes read from the writable area to the
+ // readable area.
+
+ buffer_.commit(bytes_transferred);
+
+ // If an error occurs, deliver it to the caller's completion handler.
+ if(ec)
+ break;
+
+ // Keep looping until we get the newline
+ continue;
+ }
+
+ // We have our newline, so send the first `pos` bytes of the
+ // buffers. The function `buffers_prefix` returns the front part
+ // of the buffers we want.
+
+ yield net::async_write(stream_,
+ beast::buffers_prefix(pos, buffer_.data()), std::move(*this));
+
+ // After the `async_write` completes, our completion handler will
+ // be invoked with the error and the number of bytes transferred,
+ // and the `reenter` statement above will cause control to jump
+ // to the following line. The variable `pos` is no longer valid
+ // (remember that we returned from the function using `yield` above)
+ // but we can use `bytes_transferred` to know how much of the buffer
+ // to consume. With "real" coroutines this will be easier and more
+ // natural.
+
+ buffer_.consume(bytes_transferred);
+
+ // The loop terminates here, and we will either deliver a
+ // successful result or an error to the caller's completion handler.
+
+ break;
+ }
+
+ // When a composed operation completes immediately, it must not
+ // directly invoke the completion handler otherwise it could
+ // lead to unfairness, starvation, or stack overflow. Therefore,
+ // if cont == false (meaning, that the call stack still includes
+ // the frame of the initiating function) then we need to use
+ // `net::post` to cause us to be called again after the initiating
+ // function. The function `async_base::invoke` takes care of
+ // calling the final completion handler, using post if the
+ // first argument is false, otherwise invoking it directly.
+
+ this->complete(cont, ec);
+ }
+ }
+ };
+
+ // Create the composed operation and launch it. This is a constructor
+ // call followed by invocation of operator(). We use BOOST_ASIO_HANDLER_TYPE
+ // to convert the completion token into the correct handler type,
+ // allowing user-defined specializations of the async_result template
+ // to be used.
+
+ echo_op(stream, buffer, std::move(init.completion_handler));
+
+ // This hook lets the caller see a return value when appropriate.
+ // For example this might return std::future<error_code> if
+ // CompletionToken is net::use_future, or this might
+ // return an error code if CompletionToken specifies a coroutine.
+
+ return init.result.get();
+}
+
+// Including this file undefines the macros used by the stackless fauxroutines.
+#include <boost/asio/unyield.hpp>
+
+//]
+
+struct move_only_handler
+{
+ move_only_handler() = default;
+ move_only_handler(move_only_handler&&) = default;
+ move_only_handler(move_only_handler const&) = delete;
+
+ void operator()(beast::error_code ec)
+ {
+ if(ec)
+ std::cerr << ": " << ec.message() << std::endl;
+ }
+};
+
+int main(int argc, char** argv)
+{
+ if(argc != 3)
+ {
+ std::cerr
+ << "Usage: echo-op <address> <port>\n"
+ << "Example:\n"
+ << " echo-op 0.0.0.0 8080\n";
+ return EXIT_FAILURE;
+ }
+
+ namespace net = boost::asio;
+ auto const address{net::ip::make_address(argv[1])};
+ auto const port{static_cast<unsigned short>(std::atoi(argv[2]))};
+
+ using endpoint_type = net::ip::tcp::endpoint;
+
+ // Create a listening socket, accept a connection, perform
+ // the echo, and then shut everything down and exit.
+ net::io_context ioc;
+ net::ip::tcp::acceptor acceptor{ioc};
+ endpoint_type ep{address, port};
+ acceptor.open(ep.protocol());
+ acceptor.set_option(net::socket_base::reuse_address(true));
+ acceptor.bind(ep);
+ acceptor.listen();
+ auto sock = acceptor.accept();
+ beast::flat_buffer buffer;
+ async_echo(sock, buffer, move_only_handler{});
+ ioc.run();
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/CMakeLists.txt b/src/boost/libs/beast/example/http/CMakeLists.txt
new file mode 100644
index 000000000..d38604dd0
--- /dev/null
+++ b/src/boost/libs/beast/example/http/CMakeLists.txt
@@ -0,0 +1,11 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (client)
+add_subdirectory (server)
diff --git a/src/boost/libs/beast/example/http/Jamfile b/src/boost/libs/beast/example/http/Jamfile
new file mode 100644
index 000000000..32f2c5144
--- /dev/null
+++ b/src/boost/libs/beast/example/http/Jamfile
@@ -0,0 +1,11 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+build-project client ;
+build-project server ;
diff --git a/src/boost/libs/beast/example/http/client/CMakeLists.txt b/src/boost/libs/beast/example/http/client/CMakeLists.txt
new file mode 100644
index 000000000..0c9d18156
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/CMakeLists.txt
@@ -0,0 +1,20 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (async)
+add_subdirectory (coro)
+add_subdirectory (crawl)
+add_subdirectory (sync)
+
+if (OPENSSL_FOUND)
+ add_subdirectory (async-ssl)
+ add_subdirectory (async-ssl-system-executor)
+ add_subdirectory (coro-ssl)
+ add_subdirectory (sync-ssl)
+endif()
diff --git a/src/boost/libs/beast/example/http/client/Jamfile b/src/boost/libs/beast/example/http/client/Jamfile
new file mode 100644
index 000000000..11dd77ee5
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/Jamfile
@@ -0,0 +1,18 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+build-project async ;
+build-project coro ;
+build-project crawl ;
+build-project sync ;
+
+# SSL
+build-project async-ssl ;
+build-project coro-ssl ;
+build-project sync-ssl ;
diff --git a/src/boost/libs/beast/example/http/client/async-ssl-system-executor/CMakeLists.txt b/src/boost/libs/beast/example/http/client/async-ssl-system-executor/CMakeLists.txt
new file mode 100644
index 000000000..049a2fea9
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async-ssl-system-executor/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/client/async-ssl-system-executor "/")
+
+ add_executable (http-client-async-ssl-system-executor
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ http_client_async_ssl_system_executor.cpp
+ )
+
+ set_property(TARGET http-client-async-ssl-system-executor PROPERTY FOLDER "example-http-client")
+
+ target_link_libraries (http-client-async-ssl-system-executor
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/client/async-ssl-system-executor/Jamfile b/src/boost/libs/beast/example/http/client/async-ssl-system-executor/Jamfile
new file mode 100644
index 000000000..732da8631
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async-ssl-system-executor/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-client-async-ssl-system-executor :
+ http_client_async_ssl_system_executor.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/client/async-ssl-system-executor/http_client_async_ssl_system_executor.cpp b/src/boost/libs/beast/example/http/client/async-ssl-system-executor/http_client_async_ssl_system_executor.cpp
new file mode 100644
index 000000000..19ca0be69
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async-ssl-system-executor/http_client_async_ssl_system_executor.cpp
@@ -0,0 +1,246 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL client, asynchronous, using system_executor
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/system_executor.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Performs an HTTP GET and prints the response
+class session : public std::enable_shared_from_this<session>
+{
+ tcp::resolver resolver_;
+ beast::ssl_stream<beast::tcp_stream> stream_;
+ beast::flat_buffer buffer_; // (Must persist between reads)
+ http::request<http::empty_body> req_;
+ http::response<http::string_body> res_;
+
+ // Objects are constructed with a strand to
+ // ensure that handlers do not execute concurrently.
+ session(net::strand<net::system_executor> strand, ssl::context& ctx)
+ : resolver_(strand)
+ , stream_(strand, ctx)
+ {
+ }
+
+public:
+ // Delegate construction to a prive constructor to be able to use
+ // the same strand for both I/O object.
+ explicit
+ session(ssl::context& ctx)
+ : session(net::make_strand(net::system_executor()), ctx)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run(
+ char const* host,
+ char const* port,
+ char const* target,
+ int version)
+ {
+ // Set SNI Hostname (many hosts need this to handshake successfully)
+ if(! SSL_set_tlsext_host_name(stream_.native_handle(), host))
+ {
+ beast::error_code ec{static_cast<int>(::ERR_get_error()), net::error::get_ssl_category()};
+ std::cerr << ec.message() << "\n";
+ return;
+ }
+
+ // Set up an HTTP GET request message
+ req_.version(version);
+ req_.method(http::verb::get);
+ req_.target(target);
+ req_.set(http::field::host, host);
+ req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+
+ // Look up the domain name
+ resolver_.async_resolve(
+ host,
+ port,
+ beast::bind_front_handler(
+ &session::on_resolve,
+ shared_from_this()));
+ }
+
+ void
+ on_resolve(
+ beast::error_code ec,
+ tcp::resolver::results_type results)
+ {
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ beast::get_lowest_layer(stream_).async_connect(
+ results,
+ beast::bind_front_handler(
+ &session::on_connect,
+ shared_from_this()));
+ }
+
+ void
+ on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type)
+ {
+ if(ec)
+ return fail(ec, "connect");
+
+ // Perform the SSL handshake
+ stream_.async_handshake(
+ ssl::stream_base::client,
+ beast::bind_front_handler(
+ &session::on_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Send the HTTP request to the remote host
+ http::async_write(stream_, req_,
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Receive the HTTP response
+ http::async_read(stream_, buffer_, res_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Write the message to standard out
+ std::cout << res_ << std::endl;
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Gracefully close the stream
+ stream_.async_shutdown(
+ beast::bind_front_handler(
+ &session::on_shutdown,
+ shared_from_this()));
+ }
+
+ void
+ on_shutdown(beast::error_code ec)
+ {
+ if(ec == net::error::eof)
+ {
+ // Rationale:
+ // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
+ ec = {};
+ }
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // If we get here then the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4 && argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-client-async-ssl-system-executor <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
+ "Example:\n" <<
+ " http-client-async-ssl-system-executor www.example.com 443 /\n" <<
+ " http-client-async-ssl-system-executor www.example.com 443 / 1.0\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const target = argv[3];
+ int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12_client};
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // Verify the remote server's certificate
+ ctx.set_verify_mode(ssl::verify_peer);
+
+ // Launch the asynchronous operation
+ std::make_shared<session>(ctx)->run(host, port, target, version);
+
+
+ // The async operations will run on the system_executor.
+ // Because the main thread has nothing to do in this example, we just wait
+ // for the system_executor to run out of work.
+ net::system_executor().context().join();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/client/async-ssl/CMakeLists.txt b/src/boost/libs/beast/example/http/client/async-ssl/CMakeLists.txt
new file mode 100644
index 000000000..a64fbf618
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/client/async-ssl "/")
+
+ add_executable (http-client-async-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ http_client_async_ssl.cpp
+ )
+
+ set_property(TARGET http-client-async-ssl PROPERTY FOLDER "example-http-client")
+
+ target_link_libraries (http-client-async-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/client/async-ssl/Jamfile b/src/boost/libs/beast/example/http/client/async-ssl/Jamfile
new file mode 100644
index 000000000..c11bcb072
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-client-async-ssl :
+ http_client_async_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/client/async-ssl/http_client_async_ssl.cpp b/src/boost/libs/beast/example/http/client/async-ssl/http_client_async_ssl.cpp
new file mode 100644
index 000000000..2a5f95bd9
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async-ssl/http_client_async_ssl.cpp
@@ -0,0 +1,244 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL client, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/strand.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Performs an HTTP GET and prints the response
+class session : public std::enable_shared_from_this<session>
+{
+ tcp::resolver resolver_;
+ beast::ssl_stream<beast::tcp_stream> stream_;
+ beast::flat_buffer buffer_; // (Must persist between reads)
+ http::request<http::empty_body> req_;
+ http::response<http::string_body> res_;
+
+public:
+ explicit
+ session(
+ net::executor ex,
+ ssl::context& ctx)
+ : resolver_(ex)
+ , stream_(ex, ctx)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run(
+ char const* host,
+ char const* port,
+ char const* target,
+ int version)
+ {
+ // Set SNI Hostname (many hosts need this to handshake successfully)
+ if(! SSL_set_tlsext_host_name(stream_.native_handle(), host))
+ {
+ beast::error_code ec{static_cast<int>(::ERR_get_error()), net::error::get_ssl_category()};
+ std::cerr << ec.message() << "\n";
+ return;
+ }
+
+ // Set up an HTTP GET request message
+ req_.version(version);
+ req_.method(http::verb::get);
+ req_.target(target);
+ req_.set(http::field::host, host);
+ req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+
+ // Look up the domain name
+ resolver_.async_resolve(
+ host,
+ port,
+ beast::bind_front_handler(
+ &session::on_resolve,
+ shared_from_this()));
+ }
+
+ void
+ on_resolve(
+ beast::error_code ec,
+ tcp::resolver::results_type results)
+ {
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ beast::get_lowest_layer(stream_).async_connect(
+ results,
+ beast::bind_front_handler(
+ &session::on_connect,
+ shared_from_this()));
+ }
+
+ void
+ on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type)
+ {
+ if(ec)
+ return fail(ec, "connect");
+
+ // Perform the SSL handshake
+ stream_.async_handshake(
+ ssl::stream_base::client,
+ beast::bind_front_handler(
+ &session::on_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Send the HTTP request to the remote host
+ http::async_write(stream_, req_,
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Receive the HTTP response
+ http::async_read(stream_, buffer_, res_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Write the message to standard out
+ std::cout << res_ << std::endl;
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Gracefully close the stream
+ stream_.async_shutdown(
+ beast::bind_front_handler(
+ &session::on_shutdown,
+ shared_from_this()));
+ }
+
+ void
+ on_shutdown(beast::error_code ec)
+ {
+ if(ec == net::error::eof)
+ {
+ // Rationale:
+ // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
+ ec = {};
+ }
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // If we get here then the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4 && argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-client-async-ssl <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
+ "Example:\n" <<
+ " http-client-async-ssl www.example.com 443 /\n" <<
+ " http-client-async-ssl www.example.com 443 / 1.0\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const target = argv[3];
+ int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12_client};
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // Verify the remote server's certificate
+ ctx.set_verify_mode(ssl::verify_peer);
+
+ // Launch the asynchronous operation
+ // The session is constructed with a strand to
+ // ensure that handlers do not execute concurrently.
+ std::make_shared<session>(
+ net::make_strand(ioc),
+ ctx
+ )->run(host, port, target, version);
+
+ // Run the I/O service. The call will return when
+ // the get operation is complete.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/client/async/CMakeLists.txt b/src/boost/libs/beast/example/http/client/async/CMakeLists.txt
new file mode 100644
index 000000000..3847ce610
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/client/async "/")
+
+add_executable (http-client-async
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_client_async.cpp
+)
+
+target_link_libraries(http-client-async
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-client-async PROPERTY FOLDER "example-http-client")
diff --git a/src/boost/libs/beast/example/http/client/async/Jamfile b/src/boost/libs/beast/example/http/client/async/Jamfile
new file mode 100644
index 000000000..abc9d4d61
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-client-async :
+ http_client_async.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/client/async/http_client_async.cpp b/src/boost/libs/beast/example/http/client/async/http_client_async.cpp
new file mode 100644
index 000000000..f451df51c
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/async/http_client_async.cpp
@@ -0,0 +1,189 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP client, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/strand.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Performs an HTTP GET and prints the response
+class session : public std::enable_shared_from_this<session>
+{
+ tcp::resolver resolver_;
+ beast::tcp_stream stream_;
+ beast::flat_buffer buffer_; // (Must persist between reads)
+ http::request<http::empty_body> req_;
+ http::response<http::string_body> res_;
+
+public:
+ // Objects are constructed with a strand to
+ // ensure that handlers do not execute concurrently.
+ explicit
+ session(net::io_context& ioc)
+ : resolver_(net::make_strand(ioc))
+ , stream_(net::make_strand(ioc))
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run(
+ char const* host,
+ char const* port,
+ char const* target,
+ int version)
+ {
+ // Set up an HTTP GET request message
+ req_.version(version);
+ req_.method(http::verb::get);
+ req_.target(target);
+ req_.set(http::field::host, host);
+ req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+
+ // Look up the domain name
+ resolver_.async_resolve(
+ host,
+ port,
+ beast::bind_front_handler(
+ &session::on_resolve,
+ shared_from_this()));
+ }
+
+ void
+ on_resolve(
+ beast::error_code ec,
+ tcp::resolver::results_type results)
+ {
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set a timeout on the operation
+ stream_.expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ stream_.async_connect(
+ results,
+ beast::bind_front_handler(
+ &session::on_connect,
+ shared_from_this()));
+ }
+
+ void
+ on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type)
+ {
+ if(ec)
+ return fail(ec, "connect");
+
+ // Set a timeout on the operation
+ stream_.expires_after(std::chrono::seconds(30));
+
+ // Send the HTTP request to the remote host
+ http::async_write(stream_, req_,
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Receive the HTTP response
+ http::async_read(stream_, buffer_, res_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Write the message to standard out
+ std::cout << res_ << std::endl;
+
+ // Gracefully close the socket
+ stream_.socket().shutdown(tcp::socket::shutdown_both, ec);
+
+ // not_connected happens sometimes so don't bother reporting it.
+ if(ec && ec != beast::errc::not_connected)
+ return fail(ec, "shutdown");
+
+ // If we get here then the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4 && argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-client-async <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
+ "Example:\n" <<
+ " http-client-async www.example.com 80 /\n" <<
+ " http-client-async www.example.com 80 / 1.0\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const target = argv[3];
+ int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // Launch the asynchronous operation
+ std::make_shared<session>(ioc)->run(host, port, target, version);
+
+ // Run the I/O service. The call will return when
+ // the get operation is complete.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/client/coro-ssl/CMakeLists.txt b/src/boost/libs/beast/example/http/client/coro-ssl/CMakeLists.txt
new file mode 100644
index 000000000..54fe3ae25
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/coro-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/client/coro-ssl "/")
+
+ add_executable (http-client-coro-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ http_client_coro_ssl.cpp
+ )
+
+ set_property(TARGET http-client-coro-ssl PROPERTY FOLDER "example-http-client")
+
+ target_link_libraries (http-client-coro-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/client/coro-ssl/Jamfile b/src/boost/libs/beast/example/http/client/coro-ssl/Jamfile
new file mode 100644
index 000000000..f2c126c59
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/coro-ssl/Jamfile
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-client-coro-ssl :
+ http_client_coro_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/http/client/coro-ssl/http_client_coro_ssl.cpp b/src/boost/libs/beast/example/http/client/coro-ssl/http_client_coro_ssl.cpp
new file mode 100644
index 000000000..8454db908
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/coro-ssl/http_client_coro_ssl.cpp
@@ -0,0 +1,180 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL client, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/spawn.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Performs an HTTP GET and prints the response
+void
+do_session(
+ std::string const& host,
+ std::string const& port,
+ std::string const& target,
+ int version,
+ net::io_context& ioc,
+ ssl::context& ctx,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // These objects perform our I/O
+ tcp::resolver resolver(ioc);
+ beast::ssl_stream<beast::tcp_stream> stream(ioc, ctx);
+
+ // Set SNI Hostname (many hosts need this to handshake successfully)
+ if(! SSL_set_tlsext_host_name(stream.native_handle(), host.c_str()))
+ {
+ ec.assign(static_cast<int>(::ERR_get_error()), net::error::get_ssl_category());
+ std::cerr << ec.message() << "\n";
+ return;
+ }
+
+ // Look up the domain name
+ auto const results = resolver.async_resolve(host, port, yield[ec]);
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ get_lowest_layer(stream).async_connect(results, yield[ec]);
+ if(ec)
+ return fail(ec, "connect");
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ stream.async_handshake(ssl::stream_base::client, yield[ec]);
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Set up an HTTP GET request message
+ http::request<http::string_body> req{http::verb::get, target, version};
+ req.set(http::field::host, host);
+ req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
+
+ // Send the HTTP request to the remote host
+ http::async_write(stream, req, yield[ec]);
+ if(ec)
+ return fail(ec, "write");
+
+ // This buffer is used for reading and must be persisted
+ beast::flat_buffer b;
+
+ // Declare a container to hold the response
+ http::response<http::dynamic_body> res;
+
+ // Receive the HTTP response
+ http::async_read(stream, b, res, yield[ec]);
+ if(ec)
+ return fail(ec, "read");
+
+ // Write the message to standard out
+ std::cout << res << std::endl;
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
+
+ // Gracefully close the stream
+ stream.async_shutdown(yield[ec]);
+ if(ec == net::error::eof)
+ {
+ // Rationale:
+ // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
+ ec = {};
+ }
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // If we get here then the connection is closed gracefully
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4 && argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-client-coro-ssl <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
+ "Example:\n" <<
+ " http-client-coro-ssl www.example.com 443 /\n" <<
+ " http-client-coro-ssl www.example.com 443 / 1.0\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const target = argv[3];
+ int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12_client};
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // Verify the remote server's certificate
+ ctx.set_verify_mode(ssl::verify_peer);
+
+ // Launch the asynchronous operation
+ boost::asio::spawn(ioc, std::bind(
+ &do_session,
+ std::string(host),
+ std::string(port),
+ std::string(target),
+ version,
+ std::ref(ioc),
+ std::ref(ctx),
+ std::placeholders::_1));
+
+ // Run the I/O service. The call will return when
+ // the get operation is complete.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/client/coro/CMakeLists.txt b/src/boost/libs/beast/example/http/client/coro/CMakeLists.txt
new file mode 100644
index 000000000..1a791ab1b
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/coro/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/client/coro "/")
+
+add_executable (http-client-coro
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_client_coro.cpp
+ )
+
+target_link_libraries(http-client-coro
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-client-coro PROPERTY FOLDER "example-http-client")
diff --git a/src/boost/libs/beast/example/http/client/coro/Jamfile b/src/boost/libs/beast/example/http/client/coro/Jamfile
new file mode 100644
index 000000000..25ebe2fda
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/coro/Jamfile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-client-coro :
+ http_client_coro.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/http/client/coro/http_client_coro.cpp b/src/boost/libs/beast/example/http/client/coro/http_client_coro.cpp
new file mode 100644
index 000000000..274ec05e0
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/coro/http_client_coro.cpp
@@ -0,0 +1,144 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP client, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/spawn.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Performs an HTTP GET and prints the response
+void
+do_session(
+ std::string const& host,
+ std::string const& port,
+ std::string const& target,
+ int version,
+ net::io_context& ioc,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // These objects perform our I/O
+ tcp::resolver resolver(ioc);
+ beast::tcp_stream stream(ioc);
+
+ // Look up the domain name
+ auto const results = resolver.async_resolve(host, port, yield[ec]);
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set the timeout.
+ stream.expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ stream.async_connect(results, yield[ec]);
+ if(ec)
+ return fail(ec, "connect");
+
+ // Set up an HTTP GET request message
+ http::request<http::string_body> req{http::verb::get, target, version};
+ req.set(http::field::host, host);
+ req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+
+ // Set the timeout.
+ stream.expires_after(std::chrono::seconds(30));
+
+ // Send the HTTP request to the remote host
+ http::async_write(stream, req, yield[ec]);
+ if(ec)
+ return fail(ec, "write");
+
+ // This buffer is used for reading and must be persisted
+ beast::flat_buffer b;
+
+ // Declare a container to hold the response
+ http::response<http::dynamic_body> res;
+
+ // Receive the HTTP response
+ http::async_read(stream, b, res, yield[ec]);
+ if(ec)
+ return fail(ec, "read");
+
+ // Write the message to standard out
+ std::cout << res << std::endl;
+
+ // Gracefully close the socket
+ stream.socket().shutdown(tcp::socket::shutdown_both, ec);
+
+ // not_connected happens sometimes
+ // so don't bother reporting it.
+ //
+ if(ec && ec != beast::errc::not_connected)
+ return fail(ec, "shutdown");
+
+ // If we get here then the connection is closed gracefully
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4 && argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-client-coro <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
+ "Example:\n" <<
+ " http-client-coro www.example.com 80 /\n" <<
+ " http-client-coro www.example.com 80 / 1.0\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const target = argv[3];
+ int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // Launch the asynchronous operation
+ boost::asio::spawn(ioc, std::bind(
+ &do_session,
+ std::string(host),
+ std::string(port),
+ std::string(target),
+ version,
+ std::ref(ioc),
+ std::placeholders::_1));
+
+ // Run the I/O service. The call will return when
+ // the get operation is complete.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/client/crawl/CMakeLists.txt b/src/boost/libs/beast/example/http/client/crawl/CMakeLists.txt
new file mode 100644
index 000000000..b502c7d70
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/crawl/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/client/crawl "/")
+
+add_executable (http-crawl
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ urls_large_data.hpp
+ urls_large_data.cpp
+ http_crawl.cpp
+)
+
+target_link_libraries(http-crawl
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-crawl PROPERTY FOLDER "example-http-client")
+
diff --git a/src/boost/libs/beast/example/http/client/crawl/Jamfile b/src/boost/libs/beast/example/http/client/crawl/Jamfile
new file mode 100644
index 000000000..8f94c9675
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/crawl/Jamfile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-crawl :
+ http_crawl.cpp
+ urls_large_data.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/client/crawl/http_crawl.cpp b/src/boost/libs/beast/example/http/client/crawl/http_crawl.cpp
new file mode 100644
index 000000000..c303518d0
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/crawl/http_crawl.cpp
@@ -0,0 +1,409 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP crawl (asynchronous)
+//
+//------------------------------------------------------------------------------
+
+#include "urls_large_data.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/bind_executor.hpp>
+#include <boost/asio/connect.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/post.hpp>
+#include <boost/asio/strand.hpp>
+#include <atomic>
+#include <chrono>
+#include <cstdlib>
+#include <functional>
+#include <iomanip>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+#include <map>
+
+namespace chrono = std::chrono; // from <chrono>
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = net::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// This structure aggregates statistics on all the sites
+class crawl_report
+{
+ net::io_context& ioc_;
+ net::strand<
+ net::io_context::executor_type> strand_;
+ std::atomic<std::size_t> index_;
+ std::vector<char const*> const& hosts_;
+ std::size_t count_ = 0;
+
+public:
+ crawl_report(net::io_context& ioc)
+ : ioc_(ioc)
+ , strand_(ioc_.get_executor())
+ , index_(0)
+ , hosts_(urls_large_data())
+ {
+ }
+
+ // Run an aggregation function on the strand.
+ // This allows synchronization without a mutex.
+ template<class F>
+ void
+ aggregate(F const& f)
+ {
+ net::post(
+ strand_,
+ [&, f]
+ {
+ f(*this);
+ if(count_ % 100 == 0)
+ {
+ std::cerr <<
+ "Progress: " << count_ << " of " << hosts_.size() << "\n";
+ //std::cerr << *this;
+ }
+ ++count_;
+ });
+ }
+
+ // Returns the next host to check
+ char const*
+ get_host()
+ {
+ auto const n = index_++;
+ if(n >= hosts_.size())
+ return nullptr;
+ return hosts_[n];
+ }
+
+ // Counts the number of timer failures
+ std::size_t timer_failures = 0;
+
+ // Counts the number of name resolution failures
+ std::size_t resolve_failures = 0;
+
+ // Counts the number of connection failures
+ std::size_t connect_failures = 0;
+
+ // Counts the number of write failures
+ std::size_t write_failures = 0;
+
+ // Counts the number of read failures
+ std::size_t read_failures = 0;
+
+ // Counts the number of success reads
+ std::size_t success = 0;
+
+ // Counts the number received of each status code
+ std::map<unsigned, std::size_t> status_codes;
+};
+
+std::ostream&
+operator<<(std::ostream& os, crawl_report const& report)
+{
+ // Print the report
+ os <<
+ "Crawl report\n" <<
+ " Failure counts\n" <<
+ " Timer : " << report.timer_failures << "\n" <<
+ " Resolve : " << report.resolve_failures << "\n" <<
+ " Connect : " << report.connect_failures << "\n" <<
+ " Write : " << report.write_failures << "\n" <<
+ " Read : " << report.read_failures << "\n" <<
+ " Success : " << report.success << "\n" <<
+ " Status codes\n"
+ ;
+ for(auto const& result : report.status_codes)
+ os <<
+ " " << std::setw(3) << result.first << ": " << result.second <<
+ " (" << http::obsolete_reason(static_cast<http::status>(result.first)) << ")\n";
+ os.flush();
+ return os;
+}
+
+//------------------------------------------------------------------------------
+
+// Performs HTTP GET requests and aggregates the results into a report
+class worker : public std::enable_shared_from_this<worker>
+{
+ enum
+ {
+ // Use a small timeout to keep things lively
+ timeout = 5
+ };
+
+ crawl_report& report_;
+ tcp::resolver resolver_;
+ beast::tcp_stream stream_;
+ beast::flat_buffer buffer_; // (Must persist between reads)
+ http::request<http::empty_body> req_;
+ http::response<http::string_body> res_;
+
+public:
+ worker(worker&&) = default;
+
+ // Resolver and socket require an io_context
+ worker(
+ crawl_report& report,
+ net::io_context& ioc)
+ : report_(report)
+ , resolver_(net::make_strand(ioc))
+ , stream_(net::make_strand(ioc))
+ {
+ // Set up the common fields of the request
+ req_.version(11);
+ req_.method(http::verb::get);
+ req_.target("/");
+ req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ do_get_host();
+ }
+
+ void
+ do_get_host()
+ {
+ // Grab another host
+ auto const host = report_.get_host();
+
+ // nullptr means no more work
+ if(! host)
+ return;
+
+ // The Host HTTP field is required
+ req_.set(http::field::host, host);
+
+ // Set up an HTTP GET request message
+ // Look up the domain name
+ resolver_.async_resolve(
+ host,
+ "http",
+ beast::bind_front_handler(
+ &worker::on_resolve,
+ shared_from_this()));
+ }
+
+ void
+ on_resolve(
+ beast::error_code ec,
+ tcp::resolver::results_type results)
+ {
+ if(ec)
+ {
+ report_.aggregate(
+ [](crawl_report& rep)
+ {
+ ++rep.resolve_failures;
+ });
+ return do_get_host();
+ }
+
+ // Set a timeout on the operation
+ stream_.expires_after(std::chrono::seconds(10));
+
+ // Make the connection on the IP address we get from a lookup
+ stream_.async_connect(
+ results,
+ beast::bind_front_handler(
+ &worker::on_connect,
+ shared_from_this()));
+ }
+
+ void
+ on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type)
+ {
+ if(ec)
+ {
+ report_.aggregate(
+ [](crawl_report& rep)
+ {
+ ++rep.connect_failures;
+ });
+ return do_get_host();
+ }
+
+ // Set a timeout on the operation
+ stream_.expires_after(std::chrono::seconds(10));
+
+ // Send the HTTP request to the remote host
+ http::async_write(
+ stream_,
+ req_,
+ beast::bind_front_handler(
+ &worker::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ {
+ report_.aggregate(
+ [](crawl_report& rep)
+ {
+ ++rep.write_failures;
+ });
+ return do_get_host();
+ }
+
+ // Receive the HTTP response
+ res_ = {};
+ http::async_read(
+ stream_,
+ buffer_,
+ res_,
+ beast::bind_front_handler(
+ &worker::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ {
+ report_.aggregate(
+ [](crawl_report& rep)
+ {
+ ++rep.read_failures;
+ });
+ return do_get_host();
+ }
+
+ auto const code = res_.result_int();
+ report_.aggregate(
+ [code](crawl_report& rep)
+ {
+ ++rep.success;
+ ++rep.status_codes[code];
+ });
+
+ // Gracefully close the socket
+ stream_.socket().shutdown(tcp::socket::shutdown_both, ec);
+ stream_.close();
+
+ // If we get here then the connection is closed gracefully
+
+ do_get_host();
+ }
+};
+
+class timer
+{
+ using clock_type = chrono::system_clock;
+
+ clock_type::time_point when_;
+
+public:
+ using duration = clock_type::duration;
+
+ timer()
+ : when_(clock_type::now())
+ {
+ }
+
+ duration
+ elapsed() const
+ {
+ return clock_type::now() - when_;
+ }
+};
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 2)
+ {
+ std::cerr <<
+ "Usage: http-crawl <threads>\n" <<
+ "Example:\n" <<
+ " http-crawl 100 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const threads = std::max<int>(1, std::atoi(argv[1]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // The work keeps io_context::run from returning
+ auto work = net::make_work_guard(ioc);
+
+ // The report holds the aggregated statistics
+ crawl_report report{ioc};
+
+ timer t;
+
+ // Create and launch the worker threads.
+ std::vector<std::thread> workers;
+ workers.reserve(threads + 1);
+ for(int i = 0; i < threads; ++i)
+ workers.emplace_back(
+ [&report]
+ {
+ // We use a separate io_context for each worker because
+ // the asio resolver simulates asynchronous operation using
+ // a dedicated worker thread per io_context, and we want to
+ // do a lot of name resolutions in parallel.
+ net::io_context ioc{1};
+ std::make_shared<worker>(report, ioc)->run();
+ ioc.run();
+ });
+
+ // Add another thread to run the main io_context which
+ // is used to aggregate the statistics
+ workers.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+
+ // Now block until all threads exit
+ for(std::size_t i = 0; i < workers.size(); ++i)
+ {
+ auto& thread = workers[i];
+
+ // If this is the last thread, reset the
+ // work object so that it can return from run.
+ if(i == workers.size() - 1)
+ work.reset();
+
+ // Wait for the thread to exit
+ thread.join();
+ }
+
+ std::cout <<
+ "Elapsed time: " << chrono::duration_cast<chrono::seconds>(t.elapsed()).count() << " seconds\n";
+ std::cout << report;
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/client/crawl/urls_large_data.cpp b/src/boost/libs/beast/example/http/client/crawl/urls_large_data.cpp
new file mode 100644
index 000000000..cee46ee26
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/crawl/urls_large_data.cpp
@@ -0,0 +1,10021 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include "urls_large_data.hpp"
+
+// Data from Alexa top 1 million sites
+// http://s3.amazonaws.com/alexa-static/top-1m.csv.zip
+//
+std::vector<char const*> const&
+urls_large_data()
+{
+ static std::vector <char const*> const urls ({
+ "google.com",
+ "facebook.com",
+ "youtube.com",
+ "yahoo.com",
+ "baidu.com",
+ "wikipedia.org",
+ "qq.com",
+ "linkedin.com",
+ "taobao.com",
+ "twitter.com",
+ "live.com",
+ "amazon.com",
+ "sina.com.cn",
+ "google.co.in",
+ "hao123.com",
+ "blogspot.com",
+ "weibo.com",
+ "wordpress.com",
+ "yandex.ru",
+ "yahoo.co.jp",
+ "tmall.com",
+ "bing.com",
+ "vk.com",
+ "ebay.com",
+ "360.cn",
+ "google.de",
+ "sohu.com",
+ "pinterest.com",
+ "google.co.uk",
+ "ask.com",
+ "google.fr",
+ "msn.com",
+ "163.com",
+ "soso.com",
+ "tumblr.com",
+ "google.co.jp",
+ "instagram.com",
+ "mail.ru",
+ "google.com.br",
+ "microsoft.com",
+ "paypal.com",
+ "google.ru",
+ "xvideos.com",
+ "google.es",
+ "imdb.com",
+ "apple.com",
+ "google.it",
+ "adcash.com",
+ "craigslist.org",
+ "stackoverflow.com",
+ "amazon.co.jp",
+ "neobux.com",
+ "google.com.hk",
+ "imgur.com",
+ "ifeng.com",
+ "cnn.com",
+ "google.com.mx",
+ "xhamster.com",
+ "xinhuanet.com",
+ "gmw.cn",
+ "reddit.com",
+ "bbc.co.uk",
+ "blogger.com",
+ "google.ca",
+ "fc2.com",
+ "vube.com",
+ "go.com",
+ "akamaihd.net",
+ "alipay.com",
+ "about.com",
+ "people.com.cn",
+ "t.co",
+ "googleusercontent.com",
+ "wordpress.org",
+ "odnoklassniki.ru",
+ "alibaba.com",
+ "google.com.tr",
+ "aliexpress.com",
+ "youku.com",
+ "conduit.com",
+ "huffingtonpost.com",
+ "godaddy.com",
+ "flickr.com",
+ "pornhub.com",
+ "google.com.au",
+ "amazon.de",
+ "blogspot.in",
+ "kickass.to",
+ "ebay.de",
+ "netflix.com",
+ "google.pl",
+ "thepiratebay.se",
+ "bp.blogspot.com",
+ "adobe.com",
+ "dailymotion.com",
+ "china.com",
+ "vimeo.com",
+ "dailymail.co.uk",
+ "cnet.com",
+ "rakuten.co.jp",
+ "espn.go.com",
+ "ku6.com",
+ "ebay.co.uk",
+ "themeforest.net",
+ "xnxx.com",
+ "livejasmin.com",
+ "indiatimes.com",
+ "aol.com",
+ "redtube.com",
+ "dropbox.com",
+ "amazonaws.com",
+ "uol.com.br",
+ "weather.com",
+ "m2newmedia.com",
+ "amazon.co.uk",
+ "google.com.ar",
+ "google.com.sa",
+ "pixnet.net",
+ "nytimes.com",
+ "slideshare.net",
+ "youporn.com",
+ "google.com.eg",
+ "buzzfeed.com",
+ "wikimedia.org",
+ "booking.com",
+ "livejournal.com",
+ "globo.com",
+ "fiverr.com",
+ "adf.ly",
+ "secureserver.net",
+ "mozilla.org",
+ "google.com.pk",
+ "google.com.tw",
+ "google.nl",
+ "yelp.com",
+ "sogou.com",
+ "ameblo.jp",
+ "directrev.com",
+ "clkmon.com",
+ "hootsuite.com",
+ "deviantart.com",
+ "blogfa.com",
+ "wikia.com",
+ "outbrain.com",
+ "flipkart.com",
+ "wikihow.com",
+ "etsy.com",
+ "google.co.th",
+ "soundcloud.com",
+ "google.co.za",
+ "avg.com",
+ "w3schools.com",
+ "theguardian.com",
+ "stumbleupon.com",
+ "espncricinfo.com",
+ "livedoor.com",
+ "forbes.com",
+ "archive.org",
+ "4shared.com",
+ "foxnews.com",
+ "files.wordpress.com",
+ "answers.com",
+ "bankofamerica.com",
+ "chase.com",
+ "google.co.ve",
+ "mediafire.com",
+ "torrentz.eu",
+ "badoo.com",
+ "salesforce.com",
+ "aweber.com",
+ "sourceforge.net",
+ "bbc.com",
+ "addthis.com",
+ "liveinternet.ru",
+ "china.com.cn",
+ "indeed.com",
+ "reference.com",
+ "github.com",
+ "skype.com",
+ "hostgator.com",
+ "google.gr",
+ "bet365.com",
+ "spiegel.de",
+ "ask.fm",
+ "so.com",
+ "statcounter.com",
+ "gameforge.com",
+ "onet.pl",
+ "naver.com",
+ "google.com.co",
+ "developunit.info",
+ "google.com.vn",
+ "google.co.id",
+ "nicovideo.jp",
+ "shutterstock.com",
+ "walmart.com",
+ "google.be",
+ "mailchimp.com",
+ "softonic.com",
+ "stackexchange.com",
+ "google.com.ng",
+ "google.com.ua",
+ "popads.net",
+ "allegro.pl",
+ "gamer.com.tw",
+ "wordreference.com",
+ "wellsfargo.com",
+ "loading-delivery1.com",
+ "zillow.com",
+ "tripadvisor.com",
+ "quikr.com",
+ "pandora.com",
+ "wsj.com",
+ "goo.ne.jp",
+ "bild.de",
+ "tube8.com",
+ "wix.com",
+ "google.se",
+ "coccoc.com",
+ "google.ro",
+ "suning.com",
+ "photobucket.com",
+ "weebly.com",
+ "tianya.cn",
+ "warriorforum.com",
+ "telegraph.co.uk",
+ "google.dz",
+ "naver.jp",
+ "php.net",
+ "ups.com",
+ "rambler.ru",
+ "zedo.com",
+ "reuters.com",
+ "google.at",
+ "media.tumblr.com",
+ "taringa.net",
+ "google.com.ph",
+ "chinaz.com",
+ "mashable.com",
+ "blogspot.com.es",
+ "hurriyet.com.tr",
+ "google.com.pe",
+ "bleacherreport.com",
+ "gmx.net",
+ "wp.pl",
+ "goodreads.com",
+ "leboncoin.fr",
+ "rutracker.org",
+ "lenta.ru",
+ "babylon.com",
+ "domaintools.com",
+ "sharelive.net",
+ "rediff.com",
+ "google.ch",
+ "comcast.net",
+ "twitch.tv",
+ "avito.ru",
+ "kaskus.co.id",
+ "nbcnews.com",
+ "onclickads.net",
+ "businessinsider.com",
+ "ikea.com",
+ "codecanyon.net",
+ "ndtv.com",
+ "usps.com",
+ "google.cl",
+ "doublepimp.com",
+ "moz.com",
+ "google.com.sg",
+ "usatoday.com",
+ "dmm.co.jp",
+ "amazon.fr",
+ "google.pt",
+ "ucoz.ru",
+ "rt.com",
+ "milliyet.com.tr",
+ "xuite.net",
+ "samsung.com",
+ "fedex.com",
+ "uploaded.net",
+ "pcpop.com",
+ "google.com.bd",
+ "bitly.com",
+ "goodgamestudios.com",
+ "ettoday.net",
+ "baomihua.com",
+ "39.net",
+ "web.de",
+ "rbc.ru",
+ "9gag.com",
+ "disqus.com",
+ "snapdeal.com",
+ "xcar.com.cn",
+ "washingtonpost.com",
+ "bloomberg.com",
+ "scribd.com",
+ "hp.com",
+ "constantcontact.com",
+ "4dsply.com",
+ "gsmarena.com",
+ "intuit.com",
+ "meetup.com",
+ "nih.gov",
+ "americanexpress.com",
+ "ehow.com",
+ "infusionsoft.com",
+ "google.cz",
+ "mercadolivre.com.br",
+ "myntra.com",
+ "varzesh3.com",
+ "mobile01.com",
+ "hardsextube.com",
+ "goal.com",
+ "thefreecamsecret.com",
+ "thefreedictionary.com",
+ "douban.com",
+ "iqiyi.com",
+ "it168.com",
+ "mama.cn",
+ "tmz.com",
+ "time.com",
+ "olx.in",
+ "microsoftonline.com",
+ "hulu.com",
+ "enet.com.cn",
+ "speedtest.net",
+ "orange.fr",
+ "free.fr",
+ "detik.com",
+ "bluehost.com",
+ "libero.it",
+ "histats.com",
+ "webmd.com",
+ "eazel.com",
+ "hudong.com",
+ "extratorrent.cc",
+ "google.co.kr",
+ "chaturbate.com",
+ "huanqiu.com",
+ "cnzz.com",
+ "daum.net",
+ "xing.com",
+ "force.com",
+ "jrj.com.cn",
+ "pchome.net",
+ "cj.com",
+ "youjizz.com",
+ "delta-search.com",
+ "techcrunch.com",
+ "motherless.com",
+ "tinyurl.com",
+ "beeg.com",
+ "kooora.com",
+ "google.cn",
+ "clickbank.com",
+ "yandex.ua",
+ "ad6media.fr",
+ "google.no",
+ "amazon.cn",
+ "zippyshare.com",
+ "acesse.com",
+ "google.co.hu",
+ "google.ae",
+ "hdfcbank.com",
+ "nba.com",
+ "zendesk.com",
+ "blogspot.co.uk",
+ "bestbuy.com",
+ "accuweather.com",
+ "getresponse.com",
+ "repubblica.it",
+ "xywy.com",
+ "ci123.com",
+ "ebay.in",
+ "in.com",
+ "ign.com",
+ "groupon.com",
+ "yesky.com",
+ "elpais.com",
+ "marca.com",
+ "kwejk.pl",
+ "caijing.com.cn",
+ "google.ie",
+ "cloudfront.net",
+ "intoday.in",
+ "wideinfo.org",
+ "pof.com",
+ "kakaku.com",
+ "bitauto.com",
+ "life.com.tw",
+ "xe.com",
+ "goo.gl",
+ "google.az",
+ "feedly.com",
+ "tagged.com",
+ "amazon.in",
+ "list-manage.com",
+ "w3.org",
+ "quora.com",
+ "ixxx.com",
+ "mysearchdial.com",
+ "dell.com",
+ "seznam.cz",
+ "t-online.de",
+ "plugrush.com",
+ "nydailynews.com",
+ "okcupid.com",
+ "istockphoto.com",
+ "snapdo.com",
+ "abcnews.go.com",
+ "target.com",
+ "latimes.com",
+ "mywebsearch.com",
+ "joomla.org",
+ "odesk.com",
+ "surveymonkey.com",
+ "elmundo.es",
+ "siteadvisor.com",
+ "aili.com",
+ "uimserv.net",
+ "ebay.com.au",
+ "doubleclick.com",
+ "zeobit.com",
+ "google.co.il",
+ "fbcdn.net",
+ "ero-advertising.com",
+ "issuu.com",
+ "naukri.com",
+ "gazeta.pl",
+ "ck101.com",
+ "udn.com",
+ "google.dk",
+ "ce.cn",
+ "capitalone.com",
+ "att.com",
+ "drudgereport.com",
+ "blackhatworld.com",
+ "adrotator.se",
+ "retailmenot.com",
+ "justdial.com",
+ "icicibank.com",
+ "likes.com",
+ "elance.com",
+ "cntv.cn",
+ "ameba.jp",
+ "java.com",
+ "lifehacker.com",
+ "jabong.com",
+ "gizmodo.com",
+ "ebay.it",
+ "lenovo.com",
+ "hypergames.net",
+ "google.fi",
+ "doorblog.jp",
+ "blogspot.de",
+ "jimdo.com",
+ "probux.com",
+ "blogspot.it",
+ "habrahabr.ru",
+ "webmoney.ru",
+ "irctc.co.in",
+ "sahibinden.com",
+ "github.io",
+ "informer.com",
+ "mysearchresults.com",
+ "upworthy.com",
+ "pch.com",
+ "eyny.com",
+ "canadaalltax.com",
+ "b5m.com",
+ "freelancer.com",
+ "match.com",
+ "searchfun.in",
+ "adnxs.com",
+ "sberbank.ru",
+ "ig.com.br",
+ "trulia.com",
+ "subscene.com",
+ "corriere.it",
+ "livescore.com",
+ "irs.gov",
+ "twoo.com",
+ "clixsense.com",
+ "4399.com",
+ "xda-developers.com",
+ "iminent.com",
+ "google.com.my",
+ "onlinesbi.com",
+ "empowernetwork.com",
+ "zing.vn",
+ "youdao.com",
+ "systweak.com",
+ "flipora.com",
+ "ning.com",
+ "engadget.com",
+ "abril.com.br",
+ "exoclick.com",
+ "semrush.com",
+ "commentcamarche.net",
+ "shareasale.com",
+ "vnexpress.net",
+ "battle.net",
+ "youm7.com",
+ "digg.com",
+ "rapidgator.net",
+ "expedia.com",
+ "twimg.com",
+ "newegg.com",
+ "lady8844.com",
+ "xgo.com.cn",
+ "pcgames.com.cn",
+ "fotolia.com",
+ "rednet.cn",
+ "inspsearch.com",
+ "lemonde.fr",
+ "adultfriendfinder.com",
+ "typepad.com",
+ "mercadolibre.com.ar",
+ "homedepot.com",
+ "chip.de",
+ "lefigaro.fr",
+ "swagbucks.com",
+ "taleo.net",
+ "kinopoisk.ru",
+ "oracle.com",
+ "who.is",
+ "2ch.net",
+ "qtrax.com",
+ "eonline.com",
+ "sochi2014.com",
+ "myfreecams.com",
+ "pcbaby.com.cn",
+ "gome.com.cn",
+ "amazon.it",
+ "timeanddate.com",
+ "bestusefuldownloads.com",
+ "foursquare.com",
+ "telexfree.com",
+ "gc.ca",
+ "58.com",
+ "hubspot.com",
+ "backpage.com",
+ "examiner.com",
+ "ria.ru",
+ "google.sk",
+ "opensiteexplorer.org",
+ "awesomehp.com",
+ "sexlog.com",
+ "gutefrage.net",
+ "steampowered.com",
+ "slate.com",
+ "marketwatch.com",
+ "beva.com",
+ "shaadi.com",
+ "v1.cn",
+ "teensdigest.com",
+ "blogspot.ru",
+ "taboola.com",
+ "citrixonline.com",
+ "hatena.ne.jp",
+ "seesaa.net",
+ "houzz.com",
+ "bodybuilding.com",
+ "webs.com",
+ "chexun.com",
+ "ya.ru",
+ "citibank.com",
+ "viralnova.com",
+ "2345.com",
+ "ashleyrnadison.com",
+ "verizonwireless.com",
+ "55bbs.com",
+ "theblaze.com",
+ "123rf.com",
+ "gotomeeting.com",
+ "kijiji.ca",
+ "linkbucks.com",
+ "haber7.com",
+ "pravda.com.ua",
+ "altervista.org",
+ "mihanblog.com",
+ "terra.com.br",
+ "soku.com",
+ "urbandictionary.com",
+ "mercadolibre.com.mx",
+ "pixiv.net",
+ "oneindia.in",
+ "yellowpages.com",
+ "hotels.com",
+ "drtuber.com",
+ "scoop.it",
+ "blogspot.jp",
+ "cbslocal.com",
+ "movie4k.to",
+ "cpmterra.com",
+ "hubpages.com",
+ "mobile.de",
+ "yaolan.com",
+ "etao.com",
+ "hidemyass.com",
+ "ca.gov",
+ "dreamstime.com",
+ "firedrive.com",
+ "searchengines.ru",
+ "m-w.com",
+ "ebay.fr",
+ "templatemonster.com",
+ "evernote.com",
+ "fastdailyfind.com",
+ "amazon.es",
+ "gateable.com",
+ "hupu.com",
+ "y8.com",
+ "blogspot.com.tr",
+ "tokobagus.com",
+ "azlyrics.com",
+ "website-unavailable.com",
+ "r10.net",
+ "wiktionary.org",
+ "bongacams.com",
+ "focus.de",
+ "linksynergy.com",
+ "steamcommunity.com",
+ "vk.me",
+ "sakura.ne.jp",
+ "foxsports.com",
+ "optmd.com",
+ "tabelog.com",
+ "narod.ru",
+ "glassdoor.com",
+ "outlook.com",
+ "europa.eu",
+ "viadeo.com",
+ "leadpages.net",
+ "ouedkniss.com",
+ "facenama.com",
+ "lpcloudsvr302.com",
+ "agoda.com",
+ "qvo6.com",
+ "majesticseo.com",
+ "mirror.co.uk",
+ "google.com.kw",
+ "filehippo.com",
+ "moneycontrol.com",
+ "duckduckgo.com",
+ "npr.org",
+ "coupons.com",
+ "mynet.com",
+ "allrecipes.com",
+ "priceline.com",
+ "liveleak.com",
+ "jqw.com",
+ "slickdeals.net",
+ "webcrawler.com",
+ "babytree.com",
+ "amung.us",
+ "tomshardware.com",
+ "openadserving.com",
+ "independent.co.uk",
+ "kompas.com",
+ "turbobit.net",
+ "google.kz",
+ "leo.org",
+ "yandex.com.tr",
+ "mp3skull.com",
+ "nordstrom.com",
+ "news.com.au",
+ "traidnt.net",
+ "wunderground.com",
+ "cnbc.com",
+ "jquery.com",
+ "dict.cc",
+ "persianblog.ir",
+ "clarin.com",
+ "all-free-download.com",
+ "fhserve.com",
+ "sape.ru",
+ "asos.com",
+ "addmefast.com",
+ "lequipe.fr",
+ "lapatilla.com",
+ "ancestry.com",
+ "stockstar.com",
+ "monster.com",
+ "people.com",
+ "gawker.com",
+ "howstuffworks.com",
+ "tradedoubler.com",
+ "over-blog.com",
+ "cbc.ca",
+ "fishcod.com",
+ "yoka.com",
+ "macys.com",
+ "gazeta.ru",
+ "free-tv-video-online.me",
+ "google.bg",
+ "google.lk",
+ "southwest.com",
+ "realtor.com",
+ "custhelp.com",
+ "bhaskar.com",
+ "softpedia.com",
+ "farsnews.com",
+ "cy-pr.com",
+ "theverge.com",
+ "tudou.com",
+ "youboy.com",
+ "porn.com",
+ "wetransfer.com",
+ "virgilio.it",
+ "mega.co.nz",
+ "sfgate.com",
+ "delta-homes.com",
+ "squarespace.com",
+ "watchseries.lt",
+ "overstock.com",
+ "nifty.com",
+ "jvzoo.com",
+ "lanacion.com.ar",
+ "prntscr.com",
+ "vesti.ru",
+ "zimbio.com",
+ "adscale.de",
+ "google.co.nz",
+ "yac.mx",
+ "tickld.com",
+ "kayak.com",
+ "youth.cn",
+ "jd.com",
+ "shopclues.com",
+ "allocine.fr",
+ "cracked.com",
+ "eventbrite.com",
+ "behance.net",
+ "youtube-mp3.org",
+ "bankmellat.ir",
+ "echo.msk.ru",
+ "autohome.com.cn",
+ "yandex.kz",
+ "sex.com",
+ "smh.com.au",
+ "digikala.com",
+ "mackolik.com",
+ "rottentomatoes.com",
+ "renren.com",
+ "wired.com",
+ "imageshack.us",
+ "interia.pl",
+ "zanox.com",
+ "eastday.com",
+ "fool.com",
+ "chinabyte.com",
+ "haberturk.com",
+ "hespress.com",
+ "wow.com",
+ "jobrapido.com",
+ "idnes.cz",
+ "qinbei.com",
+ "pr-cy.ru",
+ "klikbca.com",
+ "17ok.com",
+ "gamefaqs.com",
+ "immobilienscout24.de",
+ "biblegateway.com",
+ "espnfc.com",
+ "ehowenespanol.com",
+ "tabnak.ir",
+ "avazutracking.net",
+ "sapo.pt",
+ "welt.de",
+ "google.com.ec",
+ "sears.com",
+ "pcmag.com",
+ "nownews.com",
+ "kickstarter.com",
+ "pixlr.com",
+ "hongkiat.com",
+ "chinatimes.com",
+ "zoho.com",
+ "reverso.net",
+ "indianrail.gov.in",
+ "privatehomeclips.com",
+ "cbssports.com",
+ "entrepreneur.com",
+ "sporx.com",
+ "bhphotovideo.com",
+ "fatakat.com",
+ "xunlei.com",
+ "nikkei.com",
+ "chron.com",
+ "24h.com.vn",
+ "basecamp.com",
+ "airtel.in",
+ "dealshark.com",
+ "shopify.com",
+ "babycenter.com",
+ "letitbit.net",
+ "nuvid.com",
+ "yts.re",
+ "aparat.com",
+ "r2games.com",
+ "prestashop.com",
+ "alarabiya.net",
+ "india.com",
+ "magentocommerce.com",
+ "heise.de",
+ "sulekha.com",
+ "mpnrs.com",
+ "ibm.com",
+ "cbsnews.com",
+ "searchengineland.com",
+ "mapquest.com",
+ "ccb.com",
+ "zappos.com",
+ "rightmove.co.uk",
+ "sahadan.com",
+ "milanuncios.com",
+ "wenku.baidu.com/user/reg",
+ "ovh.net",
+ "screencast.com",
+ "ahrefs.com",
+ "6.cn",
+ "businessweek.com",
+ "linternaute.com",
+ "dafont.com",
+ "bestblackhatforum.com",
+ "streamcloud.eu",
+ "as.com",
+ "gtmetrix.com",
+ "wmmail.ru",
+ "spankwire.com",
+ "google.com.do",
+ "jeuxvideo.com",
+ "digitalpoint.com",
+ "amazon.ca",
+ "mlb.com",
+ "weheartit.com",
+ "list.ru",
+ "leagueoflegends.com",
+ "56.com",
+ "bloglovin.com",
+ "payoneer.com",
+ "nokia.com",
+ "aizhan.com",
+ "novinky.cz",
+ "ustream.tv",
+ "getbootstrap.com",
+ "seekingalpha.com",
+ "codwide.com",
+ "vice.com",
+ "usmagazine.com",
+ "primewire.ag",
+ "cam4.com",
+ "thehindu.com",
+ "deezer.com",
+ "graphicriver.net",
+ "dmm.com",
+ "biglobe.ne.jp",
+ "google.rs",
+ "z5x.net",
+ "tutsplus.com",
+ "icicibank.co.in",
+ "indiamart.com",
+ "gap.com",
+ "ensonhaber.com",
+ "sitepoint.com",
+ "rutor.org",
+ "chinanews.com",
+ "brainyquote.com",
+ "keepvid.com",
+ "censor.net.ua",
+ "subito.it",
+ "tablica.pl",
+ "onlylady.com",
+ "zulily.com",
+ "squidoo.com",
+ "change.org",
+ "sh.st",
+ "webhostingtalk.com",
+ "9gag.tv",
+ "nairaland.com",
+ "gulfup.com",
+ "staples.com",
+ "gamespot.com",
+ "woorank.com",
+ "box.com",
+ "infobae.com",
+ "elegantthemes.com",
+ "104.com.tw",
+ "aftonbladet.se",
+ "google.hr",
+ "myegy.com",
+ "noticias24.com",
+ "eastmoney.com",
+ "lowes.com",
+ "xtube.com",
+ "worldstarhiphop.com",
+ "glispa.com",
+ "verizon.com",
+ "united.com",
+ "linkwithin.com",
+ "google.com.ly",
+ "whitepages.com",
+ "games.la",
+ "dmoz.org",
+ "imagebam.com",
+ "careerbuilder.com",
+ "sky.com",
+ "instructables.com",
+ "mercadolibre.com.ve",
+ "makemytrip.com",
+ "pinimg.com",
+ "pingdom.com",
+ "foodnetwork.com",
+ "orf.at",
+ "android.com",
+ "wiocha.pl",
+ "csdn.net",
+ "appledaily.com.tw",
+ "nike.com",
+ "eluniversal.com.mx",
+ "delta.com",
+ "ezinearticles.com",
+ "sueddeutsche.de",
+ "woothemes.com",
+ "comcast.com",
+ "gismeteo.ru",
+ "lotour.com",
+ "nfl.com",
+ "xbox.com",
+ "almanar.com.lb",
+ "disney.go.com",
+ "ctrip.com",
+ "forexfactory.com",
+ "clicksvenue.com",
+ "nhl.com",
+ "ted.com",
+ "gstatic.com",
+ "forobeta.com",
+ "ovh.com",
+ "mystart.com",
+ "maktoob.com",
+ "nouvelobs.com",
+ "hindustantimes.com",
+ "billdesk.com",
+ "1und1.de",
+ "zhaopin.com",
+ "weather.gov",
+ "kioskea.net",
+ "myspace.com",
+ "firstpost.com",
+ "picmonkey.com",
+ "grooveshark.com",
+ "exblog.jp",
+ "pantip.com",
+ "earthlink.net",
+ "styletv.com.cn",
+ "icloud.com",
+ "manta.com",
+ "google.by",
+ "mediaset.it",
+ "searchenginewatch.com",
+ "japanpost.jp",
+ "postimg.org",
+ "mbc.net",
+ "cheezburger.com",
+ "workercn.cn",
+ "directadvert.ru",
+ "nationzoom.com",
+ "caixa.gov.br",
+ "gumtree.com",
+ "51job.com",
+ "viooz.co",
+ "usbank.com",
+ "wmtransfer.com",
+ "fidelity.com",
+ "gogetlinks.net",
+ "office365.com",
+ "pchome.com.tw",
+ "feedburner.com",
+ "mp3truck.net",
+ "sfr.fr",
+ "junglee.com",
+ "keezmovies.com",
+ "binarysystem4u.com",
+ "way2sms.com",
+ "oyunskor.com",
+ "peyvandha.ir",
+ "ticketmaster.com",
+ "lacaixa.es",
+ "video-one.com",
+ "yomiuri.co.jp",
+ "popcash.net",
+ "nypost.com",
+ "dubizzle.com",
+ "wpmudev.org",
+ "mgid.com",
+ "google.lt",
+ "zazzle.com",
+ "nbcolympics.com",
+ "battlefield.com",
+ "avast.com",
+ "jsfiddle.net",
+ "namecheap.com",
+ "css-tricks.com",
+ "friv.com",
+ "6park.com",
+ "xhamstercams.com",
+ "mysql.com",
+ "dx.com",
+ "thechive.com",
+ "vsuch.com",
+ "souq.com",
+ "anyoption.com",
+ "dantri.com.vn",
+ "ebay.es",
+ "abc.es",
+ "whatsapp.com",
+ "bitshare.com",
+ "savefrom.net",
+ "beytoote.com",
+ "xiaomi.com",
+ "prweb.com",
+ "prothom-alo.com",
+ "pagesjaunes.fr",
+ "bbb.org",
+ "eenadu.net",
+ "tinypic.com",
+ "whois.com",
+ "sourtimes.org",
+ "adk2.com",
+ "criteo.com",
+ "tistory.com",
+ "ilyke.net",
+ "ruten.com.tw",
+ "skysports.com",
+ "makeuseof.com",
+ "p5w.net",
+ "hh.ru",
+ "nationalgeographic.com",
+ "pornmd.com",
+ "rakuten.ne.jp",
+ "idealo.de",
+ "telegraaf.nl",
+ "barnesandnoble.com",
+ "mynavi.jp",
+ "4chan.org",
+ "media-fire.org",
+ "crunchbase.com",
+ "bravotube.net",
+ "myfitnesspal.com",
+ "today.com",
+ "mit.edu",
+ "cnmo.com",
+ "nu.nl",
+ "tripadvisor.co.uk",
+ "spotify.com",
+ "homeway.com.cn",
+ "dianping.com",
+ "costco.com",
+ "pastebin.com",
+ "dhgate.com",
+ "windowsphone.com",
+ "stagram.com",
+ "investopedia.com",
+ "ninemsn.com.au",
+ "excite.co.jp",
+ "22find.com",
+ "google.iq",
+ "hi5.com",
+ "ad4game.com",
+ "kohls.com",
+ "online.sh.cn",
+ "geocities.jp",
+ "investing.com",
+ "haberler.com",
+ "ft.com",
+ "weblio.jp",
+ "google.tn",
+ "list-manage1.com",
+ "hsbc.co.uk",
+ "ppstream.com",
+ "cloob.com",
+ "korrespondent.net",
+ "ucoz.com",
+ "1and1.com",
+ "mail.com",
+ "fotostrana.ru",
+ "accountonline.com",
+ "forgeofempires.com",
+ "dribbble.com",
+ "city-data.com",
+ "drupal.org",
+ "tunein.com",
+ "51fanli.com",
+ "ibtimes.com",
+ "intel.com",
+ "polyvore.com",
+ "cbs.com",
+ "bab.la",
+ "imobile.com.cn",
+ "bestadbid.com",
+ "eztv.it",
+ "smashingmagazine.com",
+ "skyrock.com",
+ "copyscape.com",
+ "cookpad.com",
+ "smallseotools.com",
+ "asus.com",
+ "anysex.com",
+ "nbcsports.com",
+ "kinox.to",
+ "mbank.com.pl",
+ "500px.com",
+ "sofanti.com",
+ "marktplaats.nl",
+ "cpanel.net",
+ "hm.com",
+ "chicagotribune.com",
+ "ultimate-guitar.com",
+ "infolinks.com",
+ "merdeka.com",
+ "yandex.by",
+ "tribalfusion.com",
+ "livedoor.biz",
+ "prezi.com",
+ "last.fm",
+ "sznews.com",
+ "junbi-tracker.com",
+ "so-net.ne.jp",
+ "cocolog-nifty.com",
+ "ocn.ne.jp",
+ "perezhilton.com",
+ "yaplakal.com",
+ "championat.com",
+ "ebay.ca",
+ "mangareader.net",
+ "donanimhaber.com",
+ "miniclip.com",
+ "vcommission.com",
+ "noaa.gov",
+ "imagefap.com",
+ "gumtree.com.au",
+ "liveperson.net",
+ "gfycat.com",
+ "hollywoodreporter.com",
+ "dropboxusercontent.com",
+ "akhbarak.net",
+ "sou300.com",
+ "kicker.de",
+ "livestream.com",
+ "tribunnews.com",
+ "kp.ru",
+ "techradar.com",
+ "315che.com",
+ "dw.de",
+ "codeproject.com",
+ "newsru.com",
+ "pconline.com.cn",
+ "aa.com",
+ "usaa.com",
+ "asahi.com",
+ "themetapicture.com",
+ "quicksprout.com",
+ "piriform.com",
+ "888poker.com",
+ "gittigidiyor.com",
+ "nhk.or.jp",
+ "statigr.am",
+ "ipage.com",
+ "gazzetta.it",
+ "letv.com",
+ "yourlust.com",
+ "freepik.com",
+ "trello.com",
+ "mixi.jp",
+ "livememe.com",
+ "ew.com",
+ "seosprint.net",
+ "doisongphapluat.com",
+ "autotrader.com",
+ "docstoc.com",
+ "viva.co.id",
+ "livestrong.com",
+ "inc.com",
+ "hunantv.com",
+ "bahn.de",
+ "depositphotos.com",
+ "rackspace.com",
+ "flippa.com",
+ "norton.com",
+ "lynda.com",
+ "teamviewer.com",
+ "vip.com",
+ "ksl.com",
+ "solarmovie.so",
+ "klout.com",
+ "pikabu.ru",
+ "vporn.com",
+ "apache.org",
+ "sportbox.ru",
+ "correios.com.br",
+ "toptenreviews.com",
+ "ea.com",
+ "thenextweb.com",
+ "superuser.com",
+ "delicious.com",
+ "zoosk.com",
+ "inbox.com",
+ "kongregate.com",
+ "starbaby.cn",
+ "888casino.com",
+ "brazzers.com",
+ "sockshare.com",
+ "megashare.info",
+ "vistaprint.com",
+ "porntube.com",
+ "seriesyonkis.com",
+ "20minutos.es",
+ "jagran.com",
+ "programme-tv.net",
+ "elcomercio.pe",
+ "blogspot.kr",
+ "t411.me",
+ "googleapis.com",
+ "blog.com",
+ "qingdaonews.com",
+ "sedo.com",
+ "itmedia.co.jp",
+ "mtv.com",
+ "ynet.co.il",
+ "playstation.com",
+ "pornhublive.com",
+ "thedailybeast.com",
+ "r7.com",
+ "sabah.com.tr",
+ "126.com",
+ "topix.com",
+ "liga.net",
+ "marriott.com",
+ "tvn24.pl",
+ "sitesell.com",
+ "netdna-cdn.com",
+ "startimes.com",
+ "hstpnetwork.com",
+ "blogspot.com.au",
+ "17u.cn",
+ "subscribe.ru",
+ "woot.com",
+ "rozblog.com",
+ "wimp.com",
+ "vg.no",
+ "t-mobile.com",
+ "bmi.ir",
+ "kankan.com",
+ "tsn.ua",
+ "gumtree.co.za",
+ "googleadservices.com",
+ "pnc.com",
+ "cars.com",
+ "soccerway.com",
+ "o2.pl",
+ "zeit.de",
+ "zopim.com",
+ "cloudflare.com",
+ "givemesport.com",
+ "statscrop.com",
+ "gravatar.com",
+ "flightradar24.com",
+ "ubuntu.com",
+ "salon.com",
+ "ytimg.com",
+ "trovigo.com",
+ "sunporno.com",
+ "libertagia.com",
+ "mihanwebads.com",
+ "shopathome.com",
+ "cdiscount.com",
+ "commbank.com.au",
+ "elwatannews.com",
+ "discovercard.com",
+ "infowars.com",
+ "blogimg.jp",
+ "portaldosites.com",
+ "fixya.com",
+ "drom.ru",
+ "fastpic.ru",
+ "pbs.org",
+ "kandao.com",
+ "okwave.jp",
+ "faz.net",
+ "sbnation.com",
+ "hilton.com",
+ "duba.com",
+ "homeshop18.com",
+ "ultimasnoticias.com.ve",
+ "bankrate.com",
+ "megasesso.com",
+ "studiopress.com",
+ "sports.ru",
+ "asriran.com",
+ "etoro.com",
+ "cafemom.com",
+ "dhl.de",
+ "indiegogo.com",
+ "tdcanadatrust.com",
+ "1tv.ru",
+ "gogvo.com",
+ "bt.com",
+ "blogspot.tw",
+ "zergnet.com",
+ "garanti.com.tr",
+ "privatbank.ua",
+ "sanook.com",
+ "travelocity.com",
+ "networksolutions.com",
+ "thqafawe3lom.com",
+ "trklnks.com",
+ "torchbrowser.com",
+ "logmein.com",
+ "williamhill.com",
+ "zhihu.com",
+ "auto.ru",
+ "craigslist.ca",
+ "olx.com.pk",
+ "smi2.ru",
+ "ukr.net",
+ "dpreview.com",
+ "boston.com",
+ "folha.uol.com.br",
+ "name.com",
+ "ashemaletube.com",
+ "slimspots.com",
+ "envato.com",
+ "6pm.com",
+ "fandango.com",
+ "sozcu.com.tr",
+ "nikkeibp.co.jp",
+ "aufeminin.com",
+ "baiducontent.com",
+ "buscape.com.br",
+ "funnyordie.com",
+ "337.com",
+ "sakshi.com",
+ "airasia.com",
+ "samanyoluhaber.com",
+ "picofile.com",
+ "blackberry.com",
+ "google.com.gt",
+ "io9.com",
+ "easyhits4u.com",
+ "qianyan001.com",
+ "flashx.tv",
+ "zap2it.com",
+ "dnsrsearch.com",
+ "patch.com",
+ "staticflickr.com",
+ "clicksor.com",
+ "mcafee.com",
+ "zerohedge.com",
+ "zara.com",
+ "freelotto.com",
+ "tutorialspoint.com",
+ "qone8.com",
+ "olx.com.br",
+ "axisbank.com",
+ "marketgid.com",
+ "your-server.de",
+ "game321.com",
+ "harvard.edu",
+ "indianexpress.com",
+ "fatwallet.com",
+ "nudevista.com",
+ "paper.li",
+ "opera.com",
+ "serving-sys.com",
+ "nowvideo.sx",
+ "theatlantic.com",
+ "cisco.com",
+ "bookmyshow.com",
+ "webmasterworld.com",
+ "metro.co.uk",
+ "leparisien.fr",
+ "orbitz.com",
+ "h2porn.com",
+ "4cdn.org",
+ "itar-tass.com",
+ "nasa.gov",
+ "macrumors.com",
+ "google.si",
+ "usnews.com",
+ "premierleague.com",
+ "largeporntube.com",
+ "blogsky.com",
+ "bufferapp.com",
+ "zeroredirect1.com",
+ "sendspace.com",
+ "stanford.edu",
+ "state.gov",
+ "yjc.ir",
+ "abc.net.au",
+ "pornsharing.com",
+ "4pda.ru",
+ "52pk.net",
+ "meituan.com",
+ "mmgp.ru",
+ "sponichi.co.jp",
+ "masrawy.com",
+ "whatismyipaddress.com",
+ "onlinewebfind.com",
+ "news24.com",
+ "zdnet.com",
+ "imagevenue.com",
+ "gameaholic.com",
+ "mediaplex.com",
+ "clip.vn",
+ "2mdn.net",
+ "nmisr.com",
+ "musica.com",
+ "networkedblogs.com",
+ "metrolyrics.com",
+ "chacha.com",
+ "internetdownloadmanager.com",
+ "legacy.com",
+ "wwe.com",
+ "icbc.com.cn",
+ "ny.gov",
+ "chomikuj.pl",
+ "alexa.com",
+ "pcworld.com",
+ "overthumbs.com",
+ "adp.com",
+ "ad2games.com",
+ "adme.ru",
+ "bidvertiser.com",
+ "rtl.de",
+ "sweetim.com",
+ "gaana.com",
+ "7k7k.com",
+ "livingsocial.com",
+ "netteller.com",
+ "rakuten.com",
+ "chess.com",
+ "blackboard.com",
+ "thekitchn.com",
+ "ilfattoquotidiano.it",
+ "20minutes.fr",
+ "soufun.com",
+ "nerdbux.com",
+ "breitbart.com",
+ "webtretho.com",
+ "tvguide.com",
+ "miralinks.ru",
+ "weather.com.cn",
+ "zalando.de",
+ "dangdang.com",
+ "bubblews.com",
+ "thoughtcatalog.com",
+ "114la.com",
+ "msn.ca",
+ "blogmura.com",
+ "americanas.com.br",
+ "elitedaily.com",
+ "lightinthebox.com",
+ "bizjournals.com",
+ "yixun.com",
+ "itau.com.br",
+ "51.la",
+ "doodle.com",
+ "arabyonline.com",
+ "opencart.com",
+ "bomnegocio.com",
+ "lego.com",
+ "pclady.com.cn",
+ "metacafe.com",
+ "kimiss.com",
+ "journaldunet.com",
+ "gnavi.co.jp",
+ "51auto.com",
+ "clickey.com",
+ "chekb.com",
+ "searchnu.com",
+ "diply.com",
+ "walgreens.com",
+ "descargar.es",
+ "mirrorcreator.com",
+ "pornerbros.com",
+ "askmen.com",
+ "shop.com",
+ "inmotionhosting.com",
+ "filmweb.pl",
+ "kbb.com",
+ "appround.biz",
+ "aljazeera.com",
+ "lumosity.com",
+ "sweet-page.com",
+ "pole-emploi.fr",
+ "fishki.net",
+ "rollingstone.com",
+ "kapanlagi.com",
+ "yandex.com",
+ "cnblogs.com",
+ "plaintube.com",
+ "intentmedia.net",
+ "about.me",
+ "torrentz.in",
+ "01net.com",
+ "gyazo.com",
+ "nic.ru",
+ "juicyads.com",
+ "trend.az",
+ "askubuntu.com",
+ "unam.mx",
+ "tradus.com",
+ "tigerdirect.com",
+ "letras.mus.br",
+ "imagetwist.com",
+ "perfectmoney.is",
+ "wpbeginner.com",
+ "thepiratetrader.com",
+ "victoriassecret.com",
+ "images-amazon.com",
+ "tusfiles.net",
+ "chefkoch.de",
+ "ojooo.com",
+ "alphaporno.com",
+ "betfair.com",
+ "tympanus.net",
+ "td.com",
+ "4tube.com",
+ "phonearena.com",
+ "bankmandiri.co.id",
+ "cox.net",
+ "ozon.ru",
+ "perfectgirls.net",
+ "asana.com",
+ "sprint.com",
+ "berniaga.com",
+ "vente-privee.com",
+ "ing.nl",
+ "finn.no",
+ "atwiki.jp",
+ "toysrus.com",
+ "petflow.com",
+ "reverbnation.com",
+ "freeones.com",
+ "abc.go.com",
+ "bradesco.com.br",
+ "yenisafak.com.tr",
+ "profit-partner.ru",
+ "redfin.com",
+ "mangafox.me",
+ "appnexus.com",
+ "sxc.hu",
+ "speedanalysis.net",
+ "n-tv.de",
+ "qidian.com",
+ "teespring.com",
+ "break.com",
+ "nailedhard.com",
+ "jalan.net",
+ "authorize.net",
+ "adultadworld.com",
+ "sootoo.com",
+ "roboform.com",
+ "kotaku.com",
+ "multitran.ru",
+ "food.com",
+ "twitpic.com",
+ "pogo.com",
+ "sabq.org",
+ "priceminister.com",
+ "lexpress.fr",
+ "livetv.sx",
+ "nikkansports.com",
+ "securepaynet.net",
+ "vodoumedia.com",
+ "airbnb.com",
+ "trafficholder.com",
+ "rr.com",
+ "expireddomains.net",
+ "bandcamp.com",
+ "wayfair.com",
+ "tut.by",
+ "maybank2u.com.my",
+ "similarweb.com",
+ "zol.com.cn",
+ "247realmedia.com",
+ "asp.net",
+ "lonelyplanet.com",
+ "seopult.ru",
+ "whois.net",
+ "academia.edu",
+ "univision.com",
+ "interfax.ru",
+ "amarillasinternet.com",
+ "miercn.com",
+ "barclays.co.uk",
+ "societe.com",
+ "khabaronline.ir",
+ "unity3d.com",
+ "nyaa.se",
+ "euronews.com",
+ "verizon.net",
+ "rutube.ru",
+ "wetter.com",
+ "imlive.com",
+ "ggpht.com",
+ "docin.com",
+ "yify-torrents.com",
+ "yhd.com",
+ "citibank.co.in",
+ "xdating.com",
+ "roblox.com",
+ "voyages-sncf.com",
+ "189.cn",
+ "identi.li",
+ "bayt.com",
+ "medicinenet.com",
+ "wmaraci.com",
+ "stern.de",
+ "eluniversal.com",
+ "zoopla.co.uk",
+ "easyjet.com",
+ "dhl.com",
+ "freakshare.com",
+ "rojadirecta.me",
+ "sp.gov.br",
+ "friendfeed.com",
+ "beamtele.com",
+ "searchenginejournal.com",
+ "nocookie.net",
+ "reliancenetconnect.co.in",
+ "google.co.ma",
+ "fanpop.com",
+ "adk2.co",
+ "tagesschau.de",
+ "nate.com",
+ "ole.com.ar",
+ "index.hu",
+ "aruba.it",
+ "eltiempo.com",
+ "resellerclub.com",
+ "qip.ru",
+ "xossip.com",
+ "siteground.com",
+ "royalbank.com",
+ "advfn.com",
+ "tebyan.net",
+ "iciba.com",
+ "bigcartel.com",
+ "sciencedirect.com",
+ "hepsiburada.com",
+ "cpasbien.me",
+ "alfabank.ru",
+ "microsoftstore.com",
+ "discogs.com",
+ "onliner.by",
+ "socialmediaexaminer.com",
+ "seasonvar.ru",
+ "tripadvisor.in",
+ "360doc.com",
+ "chinabroadcast.cn",
+ "realestate.com.au",
+ "avira.com",
+ "herokuapp.com",
+ "downloadsetup.net",
+ "torcache.net",
+ "uefa.com",
+ "rg.ru",
+ "qianlong.com",
+ "hugedomains.com",
+ "arstechnica.com",
+ "fifa.com",
+ "ryanair.com",
+ "i.ua",
+ "axisbank.co.in",
+ "alimama.com",
+ "wanggou.com",
+ "radikal.com.tr",
+ "echoroukonline.com",
+ "unian.net",
+ "slashdot.org",
+ "dmv.org",
+ "mayoclinic.org",
+ "newsmax.com",
+ "google.com.et",
+ "icontact.com",
+ "vanguardngr.com",
+ "infojobs.net",
+ "say-move.org",
+ "ileehoo.com",
+ "mirtesen.ru",
+ "yam.com",
+ "e-hentai.org",
+ "wikimapia.org",
+ "shop-pro.jp",
+ "bukalapak.com",
+ "jcpenney.com",
+ "ilmeteo.it",
+ "iltasanomat.fi",
+ "telecomitalia.it",
+ "kariyer.net",
+ "shutterfly.com",
+ "santabanta.com",
+ "softlayer.com",
+ "complex.com",
+ "mamba.ru",
+ "netshoes.com.br",
+ "theweathernetwork.com",
+ "politico.com",
+ "advego.ru",
+ "eroprofile.com",
+ "mainichi.jp",
+ "nta.go.jp",
+ "sfimg.com",
+ "ap.org",
+ "webex.com",
+ "hinet.net",
+ "skyscrapercity.com",
+ "affili.net",
+ "adplxmd.com",
+ "iltalehti.fi",
+ "impress.co.jp",
+ "jezebel.com",
+ "extremetube.com",
+ "digitaltrends.com",
+ "one.com",
+ "ranker.com",
+ "qiwi.com",
+ "collegehumor.com",
+ "nbc.com",
+ "boursorama.com",
+ "watch32.com",
+ "meetcheap.com",
+ "forums.wordpress.com",
+ "cvs.com",
+ "kenh14.vn",
+ "yallakora.com",
+ "plurk.com",
+ "xtool.ru",
+ "airtel.com",
+ "wp.com",
+ "sftimes.co",
+ "economist.com",
+ "rapidshare.com",
+ "redbox.com",
+ "audible.com",
+ "kissmetrics.com",
+ "atpanel.com",
+ "wargaming.net",
+ "1337x.org",
+ "shahrekhabar.com",
+ "bdnews24.com",
+ "tvrain.ru",
+ "wykop.pl",
+ "mts.ru",
+ "nnm-club.me",
+ "schwab.com",
+ "elconfidencial.com",
+ "modelmayhem.com",
+ "zhidao.baidu.com/user/admin",
+ "aastocks.com",
+ "tiscali.it",
+ "qadabra.com",
+ "autoscout24.de",
+ "vatanim.com.tr",
+ "gotowebinar.com",
+ "edmunds.com",
+ "ebaumsworld.com",
+ "megafilmeshd.net",
+ "poste.it",
+ "mcssl.com",
+ "aljazeera.net",
+ "netvibes.com",
+ "sme.sk",
+ "tesco.com",
+ "525j.com.cn",
+ "tf1.fr",
+ "ccidnet.com",
+ "ldblog.jp",
+ "blockchain.info",
+ "played.to",
+ "nthwall.com",
+ "justanswer.com",
+ "clickbank.net",
+ "fnac.com",
+ "gmarket.co.kr",
+ "clipconverter.cc",
+ "nextmedia.com",
+ "bb.com.br",
+ "learntotradethemarket.com",
+ "pornoid.com",
+ "downloadha.com",
+ "hellporno.com",
+ "ooo-sex.com",
+ "blocket.se",
+ "tubeplus.me",
+ "seek.com.au",
+ "filestube.to",
+ "ceneo.pl",
+ "walmart.com.br",
+ "sonymobile.com",
+ "dyndns.org",
+ "ulmart.ru",
+ "vrbo.com",
+ "sport.pl",
+ "ashleymadison.com",
+ "el-wlid.com",
+ "boredpanda.com",
+ "udemy.com",
+ "mobogenie.com",
+ "tubegalore.com",
+ "theglobeandmail.com",
+ "bancobrasil.com.br",
+ "888.com",
+ "adreactor.com",
+ "zomato.com",
+ "depositfiles.com",
+ "moneysavingexpert.com",
+ "dofus.com",
+ "oanda.com",
+ "sport1.de",
+ "justhost.com",
+ "longhoo.net",
+ "otomoto.pl",
+ "techrepublic.com",
+ "westpac.com.au",
+ "dreamhost.com",
+ "ilsole24ore.com",
+ "clubic.com",
+ "gamme.com.tw",
+ "doctissimo.fr",
+ "isna.ir",
+ "s2d6.com",
+ "tdbank.com",
+ "zwaar.net",
+ "slando.ua",
+ "segodnya.ua",
+ "appannie.com",
+ "bartarinha.ir",
+ "egotastic.com",
+ "ed.gov",
+ "lg.com",
+ "120ask.com",
+ "hostmonster.com",
+ "super.cz",
+ "mercola.com",
+ "bayproxy.me",
+ "day.az",
+ "dummies.com",
+ "azet.sk",
+ "huffingtonpost.co.uk",
+ "okezone.com",
+ "medu.ir",
+ "lavanguardia.com",
+ "espreso.tv",
+ "nymag.com",
+ "autotrader.co.uk",
+ "socialmediatoday.com",
+ "wn.com",
+ "rtbpop.com",
+ "99designs.com",
+ "sanspo.com",
+ "proboards.com",
+ "virginmedia.com",
+ "99acres.com",
+ "blic.rs",
+ "pingomatic.com",
+ "prnewswire.com",
+ "sony.com",
+ "seobuilding.ru",
+ "www.gov.uk",
+ "jugem.jp",
+ "watchtower.com",
+ "seoprofiler.com",
+ "centrum.cz",
+ "techbrowsing.com",
+ "almasryalyoum.com",
+ "lolking.net",
+ "nipic.com",
+ "fanfiction.net",
+ "bwin.com",
+ "anyporn.com",
+ "sulit.com.ph",
+ "quickmeme.com",
+ "carview.co.jp",
+ "haizhangs.com",
+ "airtelforum.com",
+ "flirt4free.com",
+ "billboard.com",
+ "trademe.co.nz",
+ "rapgenius.com",
+ "pchouse.com.cn",
+ "beforeitsnews.com",
+ "peopleperhour.com",
+ "basecamphq.com",
+ "onlinedown.net",
+ "bet365.es",
+ "fucked-tube.com",
+ "santander.co.uk",
+ "speedbit.com",
+ "gi-akademie.com",
+ "google.com.pr",
+ "winupdatevideos.com",
+ "bizrate.com",
+ "xxxbunker.com",
+ "coursera.org",
+ "zoominfo.com",
+ "rarbg.com",
+ "ahram.org.eg",
+ "howtogeek.com",
+ "focus.cn",
+ "duden.de",
+ "mufg.jp",
+ "ex.ua",
+ "titan24.com",
+ "greatandhra.com",
+ "qqbaobao.com",
+ "rtve.es",
+ "yandex.net",
+ "yle.fi",
+ "panoramio.com",
+ "google.com.af",
+ "scol.com.cn",
+ "gamestop.com",
+ "xiami.com",
+ "webpagetest.org",
+ "creativecommons.org",
+ "archive.is",
+ "timesjobs.com",
+ "centurylink.com",
+ "wowhead.com",
+ "wordstream.com",
+ "lloydsbank.co.uk",
+ "incredibar.com",
+ "vagalume.com.br",
+ "installerapplicationusa.com",
+ "shinobi.jp",
+ "ruvr.ru",
+ "natwest.com",
+ "roulettebotplus.com",
+ "wildberries.ru",
+ "huaban.com",
+ "buenosearch.com",
+ "reg.ru",
+ "tempo.co",
+ "qvc.com",
+ "mangahere.com",
+ "tv.com",
+ "boc.cn",
+ "fnb.co.za",
+ "made-in-china.com",
+ "eleconomista.es",
+ "ubuntuforums.org",
+ "derstandard.at",
+ "xml-sitemaps.com",
+ "jang.com.pk",
+ "jiayuan.com",
+ "credit-agricole.fr",
+ "androidcentral.com",
+ "urbanspoon.com",
+ "pornoxo.com",
+ "regnum.ru",
+ "bedbathandbeyond.com",
+ "skladchik.com",
+ "daily.co.jp",
+ "n-mobile.net",
+ "suntrust.com",
+ "justjared.com",
+ "vid2c.com",
+ "gettyimages.com",
+ "tubecup.com",
+ "kinogo.net",
+ "similarsites.com",
+ "fling.com",
+ "vine.co",
+ "banglanews24.com",
+ "pudelek.pl",
+ "support.wordpress.com",
+ "cox.com",
+ "xkcd.com",
+ "adbooth.com",
+ "anz.com",
+ "adxcore.com",
+ "google.com.sv",
+ "indeed.co.in",
+ "scottrade.com",
+ "v9.com",
+ "isohunt.to",
+ "srclick.ru",
+ "gharreh.com",
+ "zaman.com.tr",
+ "monsterindia.com",
+ "delfi.lt",
+ "chewen.com",
+ "empowernetwork.com/QUbsgqDwpjjbkpOgwgOeaw==",
+ "state.tx.us",
+ "segundamano.es",
+ "utro.ru",
+ "sitescout.com",
+ "justclick.ru",
+ "wnd.com",
+ "cosmopolitan.com",
+ "local.com",
+ "anitube.se",
+ "sport.es",
+ "google.com.qa",
+ "ads-id.com",
+ "google.lv",
+ "capitalone360.com",
+ "hattrick.org",
+ "qualtrics.com",
+ "inagist.com",
+ "filgoal.com",
+ "incredibar-search.com",
+ "adslgate.com",
+ "directv.com",
+ "ilivid.com",
+ "warthunder.ru",
+ "jasmin.com",
+ "cyberciti.biz",
+ "msn.co.jp",
+ "canalblog.com",
+ "boerse.bz",
+ "tnaflix.com",
+ "apa.az",
+ "prchecker.info",
+ "reclameaqui.com.br",
+ "onlyworldnews.com",
+ "submarino.com.br",
+ "kuronekoyamato.co.jp",
+ "paipai.com",
+ "realitykings.com",
+ "deadspin.com",
+ "islamweb.net",
+ "no-ip.com",
+ "lostfilm.tv",
+ "wattpad.com",
+ "wav.tv",
+ "citi.com",
+ "buysellads.com",
+ "prezentacya.ru",
+ "forocoches.com",
+ "donga.com",
+ "drive2.ru",
+ "netsuite.com",
+ "privalia.com",
+ "bidorbuy.co.za",
+ "cmbchina.com",
+ "searchresultsguide.com",
+ "odatv.com",
+ "skrill.com",
+ "en.wordpress.com",
+ "dojki.com",
+ "unibet.com",
+ "hotpepper.jp",
+ "simplyhired.com",
+ "vesti.ua",
+ "ibtimes.co.uk",
+ "creativebloq.com",
+ "filmesonlinegratis.net",
+ "videohive.net",
+ "kmart.com",
+ "metacritic.com",
+ "rikunabi.com",
+ "zozo.jp",
+ "venturebeat.com",
+ "1and1.es",
+ "banesconline.com",
+ "internethaber.com",
+ "rae.es",
+ "planetsuzy.org",
+ "wpengine.com",
+ "kizi.com",
+ "armorgames.com",
+ "argos.co.uk",
+ "dtiblog.com",
+ "diigo.com",
+ "forever21.com",
+ "flashscore.com",
+ "vedomosti.ru",
+ "ccavenue.com",
+ "att.net",
+ "esporte.uol.com.br",
+ "empowernetwork.com/PXQ7Uz1Kyg+LR1APrG7pKQ==",
+ "to8to.com",
+ "hotwire.com",
+ "all.biz",
+ "info.com",
+ "xhamster.com/user/video",
+ "000webhost.com",
+ "worldoftanks.ru",
+ "dagbladet.no",
+ "computerbild.de",
+ "nasdaq.com",
+ "chitika.com",
+ "ipeen.com.tw",
+ "abola.pt",
+ "wiley.com",
+ "lpcloudsvr303.com",
+ "tinsao.net",
+ "mehrnews.com",
+ "hugesex.tv",
+ "christian-dogma.com",
+ "search.us.com",
+ "garmin.com",
+ "tgbus.com",
+ "iherb.com",
+ "torntv-tvv.org",
+ "chosun.com",
+ "kinozal.tv",
+ "berkeley.edu",
+ "techtarget.com",
+ "labanquepostale.fr",
+ "fitbit.com",
+ "folkd.com",
+ "theonion.com",
+ "idealista.com",
+ "oscar.go.com",
+ "jiji.com",
+ "anonym.to",
+ "allabout.co.jp",
+ "wufoo.com",
+ "rantlifestyle.com",
+ "google.com.bo",
+ "28.com",
+ "rocketnews24.com",
+ "hotspotshield.com",
+ "opentable.com",
+ "admngronline.com",
+ "naturalnews.com",
+ "zeroredirect2.com",
+ "ero-video.net",
+ "dinamalar.com",
+ "fl.ru",
+ "mtsindia.in",
+ "kapook.com",
+ "theage.com.au",
+ "allmyvideos.net",
+ "dinodirect.com",
+ "videodownloadconverter.com",
+ "tripleclicks.com",
+ "brassring.com",
+ "fapdu.com",
+ "cafepress.com",
+ "infospace.com",
+ "express.com.pk",
+ "fumu.com",
+ "infibeam.com",
+ "etrade.com",
+ "meneame.net",
+ "seroundtable.com",
+ "bigpoint.com",
+ "chinadaily.com.cn",
+ "myfonts.com",
+ "ezdownloadpro.info",
+ "codeplex.com",
+ "xl.pt",
+ "kaspersky.com",
+ "khabarfarsi.com",
+ "admitad.com",
+ "flirchi.com",
+ "dpstream.net",
+ "miniinthebox.com",
+ "samsclub.com",
+ "charter.net",
+ "techbang.com",
+ "tiu.ru",
+ "fanpage.it",
+ "spokeo.com",
+ "imageshack.com",
+ "ijreview.com",
+ "bc.vc",
+ "lazada.co.id",
+ "gofirstrow.eu",
+ "uptobox.com",
+ "newsnow.co.uk",
+ "symantec.com",
+ "editor.wix.com",
+ "avaxhome.cc",
+ "canalplus.fr",
+ "copyblogger.com",
+ "vetogate.com",
+ "yahoo-mbga.jp",
+ "manoramaonline.com",
+ "ah-me.com",
+ "elheddaf.com",
+ "bitcointalk.org",
+ "haqaik.com",
+ "bbandt.com",
+ "linguee.de",
+ "blogspot.nl",
+ "minus.com",
+ "amarujala.com",
+ "openclassrooms.com",
+ "bigmir.net",
+ "koramgame.com",
+ "commonfloor.com",
+ "gayromeo.com",
+ "cleartrip.com",
+ "kompasiana.com",
+ "tankionline.com",
+ "google.co.tz",
+ "springer.com",
+ "lifenews.ru",
+ "sify.com",
+ "tvoyauda4a.ru",
+ "dfiles.ru",
+ "technorati.com",
+ "myorderbox.com",
+ "fanatik.com.tr",
+ "activesearchresults.com",
+ "laposte.net",
+ "whirlpool.net.au",
+ "stockcharts.com",
+ "leadimpact.com",
+ "cardekho.com",
+ "ryushare.com",
+ "blog.jp",
+ "fastcompany.com",
+ "eurosport.fr",
+ "emirates.com",
+ "lb.ua",
+ "serverfault.com",
+ "forbes.ru",
+ "bfmtv.com",
+ "google.jo",
+ "17173.com",
+ "wikispaces.com",
+ "tokopedia.com",
+ "liberation.fr",
+ "a10.com",
+ "kdnet.net",
+ "variety.com",
+ "blog.me",
+ "homeaway.com",
+ "ameritrade.com",
+ "adult-empire.com",
+ "national.com.au",
+ "haraj.com.sa",
+ "timewarnercable.com",
+ "casino.com",
+ "sheknows.com",
+ "google.com.uy",
+ "abv.bg",
+ "liputan6.com",
+ "etxt.ru",
+ "bigstockphoto.com",
+ "strato.de",
+ "cashtasks.com",
+ "columbia.edu",
+ "zdf.de",
+ "pptv.com",
+ "cricbuzz.com",
+ "sharesuper.info",
+ "radaronline.com",
+ "pornolab.net",
+ "google.ba",
+ "opensubtitles.org",
+ "abclocal.go.com",
+ "ansa.it",
+ "pbskids.org",
+ "vz.ru",
+ "iconfinder.com",
+ "vitaminl.tv",
+ "ntv.ru",
+ "peliculasyonkis.com",
+ "foto-hd.com",
+ "paytm.com",
+ "rantsports.com",
+ "optimum.net",
+ "postbank.de",
+ "index.hr",
+ "smugmug.com",
+ "haivl.com",
+ "arbeitsagentur.de",
+ "dailycaller.com",
+ "freshbooks.com",
+ "genieo.com",
+ "alnaddy.com",
+ "britishairways.com",
+ "20min.ch",
+ "findthebest.com",
+ "autoblog.com",
+ "warez-bb.org",
+ "iza.ne.jp",
+ "filmaffinity.com",
+ "megogo.net",
+ "soccermanager.com",
+ "dawanda.com",
+ "parallels.com",
+ "clickjogos.uol.com.br",
+ "12306.cn",
+ "jstv.com",
+ "cliphunter.com",
+ "pixabay.com",
+ "milenio.com",
+ "keybinary.com",
+ "suumo.jp",
+ "mediatakeout.com",
+ "vodafone.in",
+ "cheapoair.com",
+ "seobook.com",
+ "videoyoum7.com",
+ "yr.no",
+ "gofundme.com",
+ "ixbt.com",
+ "starbucks.com",
+ "conferenceplus.com",
+ "media1first.com",
+ "sergey-mavrodi.com",
+ "rafflecopter.com",
+ "591.com.tw",
+ "mangapanda.com",
+ "huffingtonpost.fr",
+ "tiboo.cn",
+ "bancomer.com.mx",
+ "handelsblatt.com",
+ "hpylgr.com",
+ "psu.edu",
+ "bancomercantil.com",
+ "sport-express.ru",
+ "codepen.io",
+ "foundationapi.com",
+ "ow.ly",
+ "vatgia.com",
+ "kommersant.ru",
+ "srvsinf.com",
+ "telderi.ru",
+ "mercadolibre.com.co",
+ "hsbc.com.hk",
+ "t3n.de",
+ "magicbricks.com",
+ "shopstyle.com",
+ "mudah.my",
+ "punchng.com",
+ "therichest.com",
+ "fansshare.com",
+ "lepoint.fr",
+ "vipzona.info",
+ "globaltestmarket.com",
+ "jqueryui.com",
+ "bcsh.com",
+ "mundodeportivo.com",
+ "newyorker.com",
+ "funnyjunk.com",
+ "gongchang.com",
+ "a8.net",
+ "ecollege.com",
+ "newhdplugin.net",
+ "befuck.com",
+ "elespectador.com",
+ "drugs.com",
+ "abplive.in",
+ "feelcars.com",
+ "psychologytoday.com",
+ "instaforex.com",
+ "strtsrv.com",
+ "atpworldtour.com",
+ "incruit.com",
+ "starwoodhotels.com",
+ "zone-telechargement.com",
+ "songspk.name",
+ "hatenablog.com",
+ "enfemenino.com",
+ "msnbc.com",
+ "freebitco.in",
+ "akairan.com",
+ "discovery.com",
+ "angieslist.com",
+ "lesechos.fr",
+ "transfermarkt.de",
+ "sephora.com",
+ "come.in",
+ "dailykos.com",
+ "deutsche-bank.de",
+ "warriorplus.com",
+ "awwwards.com",
+ "lomadee.com",
+ "365jia.cn",
+ "lotterypost.com",
+ "egrana.com.br",
+ "rivals.com",
+ "literotica.com",
+ "myfreshnet.com",
+ "ihg.com",
+ "fazenda.gov.br",
+ "tomnod.com",
+ "filesharefanatic.com",
+ "hotukdeals.com",
+ "bitsnoop.com",
+ "tenpay.com",
+ "putlocker.bz",
+ "ziddu.com",
+ "ntvmsnbc.com",
+ "surveyzrewardcenter.com",
+ "aliyun.com",
+ "media.net",
+ "comdirect.de",
+ "yoox.com",
+ "hotelscombined.com",
+ "vgsgaming-ads.com",
+ "robokassa.ru",
+ "webdesignerdepot.com",
+ "rotoworld.com",
+ "jmw.com.cn",
+ "seloger.com",
+ "dsdomination.com",
+ "affiliatewindow.com",
+ "abs-cbnnews.com",
+ "bmo.com",
+ "iconarchive.com",
+ "funshion.com",
+ "admin5.com",
+ "playhe.com",
+ "bigcommerce.com",
+ "yodobashi.com",
+ "bigfishgames.com",
+ "onlinecreditcenter6.com",
+ "homes.co.jp",
+ "gameninja.com",
+ "ebates.com",
+ "banamex.com.mx",
+ "google.com.lb",
+ "2chblog.jp",
+ "entertainment-factory.com",
+ "asg.to",
+ "walla.co.il",
+ "mktmobi.com",
+ "opensooq.com",
+ "adam4adam.com",
+ "expressen.se",
+ "elephanttube.com",
+ "ingdirect.es",
+ "clicrbs.com.br",
+ "seriespepito.com",
+ "skyscanner.net",
+ "shine.com",
+ "appround.us",
+ "washingtontimes.com",
+ "nrk.no",
+ "1stwebdesigner.com",
+ "gucheng.com",
+ "ghanaweb.com",
+ "jzip.com",
+ "rozetka.com.ua",
+ "wiziwig.tv",
+ "jobsdb.com",
+ "kitco.com",
+ "rpp.com.pe",
+ "aljaras.com",
+ "telecinco.es",
+ "storify.com",
+ "netease.com",
+ "business-standard.com",
+ "babble.com",
+ "noticias.uol.com.br",
+ "alice.it",
+ "bizdec.ru",
+ "voanews.com",
+ "freejobalert.com",
+ "origo.hu",
+ "list-manage2.com",
+ "gavick.com",
+ "national-lottery.co.uk",
+ "gazzetta.gr",
+ "freevideodownloadforpc.com",
+ "xmarks.com",
+ "wikibooks.org",
+ "sexad.net",
+ "alc.co.jp",
+ "emol.com",
+ "careesma.in",
+ "cdc.gov",
+ "toshiba.com",
+ "imgchili.net",
+ "rbcroyalbank.com",
+ "indowebster.com",
+ "zynga.com",
+ "telekom.com",
+ "jiameng.com",
+ "adsmarket.com",
+ "utorrent.com",
+ "aarp.org",
+ "cityadspix.com",
+ "ekstrabladet.dk",
+ "doc88.com",
+ "fetlife.com",
+ "fh21.com.cn",
+ "cambridge.org",
+ "tune.pk",
+ "auction.co.kr",
+ "patheos.com",
+ "search-results.com",
+ "lds.org",
+ "webrankinfo.com",
+ "newsit.gr",
+ "techtudo.com.br",
+ "moviepilot.com",
+ "mercador.ro",
+ "nguoiduatin.vn",
+ "tripadvisor.it",
+ "lurkmore.to",
+ "europapress.es",
+ "uspto.gov",
+ "excelsior.com.mx",
+ "myvideo.de",
+ "jetblue.com",
+ "camfrog.com",
+ "blick.ch",
+ "batepapo.uol.com.br",
+ "manager.co.th",
+ "goibibo.com",
+ "cornell.edu",
+ "apetube.com",
+ "nation.com",
+ "allmusic.com",
+ "naughtyamerica.com",
+ "obozrevatel.com",
+ "telegrafi.com",
+ "neimanmarcus.com",
+ "yabancidiziizle1.com",
+ "globalewallet.com",
+ "beeline.ru",
+ "hinkhoj.com",
+ "sitemeter.com",
+ "almesryoon.com",
+ "localmoxie.com",
+ "grotal.com",
+ "knowyourmeme.com",
+ "qiwi.ru",
+ "yieldmanager.com",
+ "yimg.com",
+ "horoscopedays.com",
+ "gfy.com",
+ "mxtoolbox.com",
+ "searchgol.com",
+ "inquirer.net",
+ "hollywoodlife.com",
+ "ebrun.com",
+ "shopbop.com",
+ "mysmartprice.com",
+ "kijiji.it",
+ "visual.ly",
+ "mop.com",
+ "1fichier.com",
+ "prlog.org",
+ "xjtour.com",
+ "shorouknews.com",
+ "thegioinet.net",
+ "hln.be",
+ "enom.com",
+ "thaqafnafsak.com",
+ "wahuu.com",
+ "ganji.com",
+ "russianpost.ru",
+ "myplaycity.com",
+ "dzone.com",
+ "dns-shop.ru",
+ "aif.ru",
+ "ssisurveys.com",
+ "uploadboy.com",
+ "madpandatv.net",
+ "pcauto.com.cn",
+ "meinestadt.de",
+ "tasnimnews.com",
+ "rockettheme.com",
+ "imesh.com",
+ "home.pl",
+ "lindaikeji.blogspot.com",
+ "zamunda.net",
+ "with2.net",
+ "calameo.com",
+ "myonlinearcade.com",
+ "xcams.com",
+ "unicredit.it",
+ "clip2net.com",
+ "mediatemple.net",
+ "nosub.tv",
+ "click.in",
+ "alluc.to",
+ "thestar.com.my",
+ "niksalehi.com",
+ "lastampa.it",
+ "itv.com",
+ "hihi2.com",
+ "digitalocean.com",
+ "tripadvisor.fr",
+ "willhaben.at",
+ "laodong.com.vn",
+ "591hx.com",
+ "tineye.com",
+ "ptt.cc",
+ "beatport.com",
+ "infoseek.co.jp",
+ "avangate.com",
+ "indiaproperty.com",
+ "books.com.tw",
+ "nj.com",
+ "avaaz.org",
+ "wikitravel.org",
+ "direct.gov.uk",
+ "wangtu.com",
+ "discover.com",
+ "slon.ru",
+ "startpage.com",
+ "thestar.com",
+ "meishichina.com",
+ "finanzen.net",
+ "estadao.com.br",
+ "indeed.co.uk",
+ "expansion.com",
+ "irpopup.ir",
+ "arvixe.com",
+ "secureinternetbank.com",
+ "csmonitor.com",
+ "carwale.com",
+ "mtime.com",
+ "ceconline.com",
+ "abchina.com",
+ "cgbchina.com.cn",
+ "mediotiempo.com",
+ "vic.gov.au",
+ "cnbeta.com",
+ "alarab.net",
+ "vietnamnet.vn",
+ "gay.com",
+ "watchmygf.net",
+ "myanimelist.net",
+ "bannersbroker.com",
+ "asklaila.com",
+ "heureka.cz",
+ "grepolis.com",
+ "meteofrance.com",
+ "bol.com",
+ "hasoffers.com",
+ "bigrock.in",
+ "ibanking-services.com",
+ "nos.nl",
+ "google.com.gh",
+ "beppegrillo.it",
+ "nhaccuatui.com",
+ "hamariweb.com",
+ "wikiquote.org",
+ "evite.com",
+ "jobdiagnosis.com",
+ "17track.net",
+ "baixing.com",
+ "awempire.com",
+ "healthgrades.com",
+ "unifiedlayer.com",
+ "thisav.com",
+ "himado.in",
+ "zcool.com.cn",
+ "tsn.ca",
+ "atlassian.net",
+ "binary500.com",
+ "alotporn.com",
+ "dnaindia.com",
+ "sherdog.com",
+ "www.nhs.uk",
+ "gruposantander.es",
+ "quantcast.com",
+ "usearchmedia.com",
+ "merchantcircle.com",
+ "blog.hu",
+ "wallstcheatsheet.com",
+ "iptorrents.com",
+ "apsense.com",
+ "redirsvc.com",
+ "indiarailinfo.com",
+ "mobile.ir",
+ "xvideo-jp.com",
+ "boxofficemojo.com",
+ "scamadviser.com",
+ "rotapost.ru",
+ "someecards.com",
+ "mydealz.de",
+ "lvye.cn",
+ "videoweed.es",
+ "xlovecam.com",
+ "pepperjamnetwork.com",
+ "khabarpu.com",
+ "mathrubhumi.com",
+ "online-convert.com",
+ "b92.net",
+ "tiptopsoft.org",
+ "el-balad.com",
+ "qihoo.com",
+ "iheart.com",
+ "campaign-archive1.com",
+ "photodune.net",
+ "labnol.org",
+ "kotobank.jp",
+ "medium.com",
+ "google.lu",
+ "tm1111.com",
+ "gigazine.net",
+ "mypcbackup.com",
+ "instantcheckmate.com",
+ "seemorgh.com",
+ "topky.sk",
+ "puu.sh",
+ "aeriagames.com",
+ "whatismyip.com",
+ "rising.cn",
+ "scotiabank.com",
+ "wo.com.cn",
+ "yootheme.com",
+ "channel4.com",
+ "heavy-r.com",
+ "omgpm.com",
+ "milli.az",
+ "bnpparibas.net",
+ "vmware.com",
+ "diretta.it",
+ "skycn.com",
+ "sap.com",
+ "zyalt.livejournal.com",
+ "bookryanair.com",
+ "kkbox.com",
+ "subtitleseeker.com",
+ "abckj123.com",
+ "mashreghnews.ir",
+ "websitewelcome.com",
+ "2ch-c.net",
+ "health.com",
+ "uproxx.com",
+ "uast.ac.ir",
+ "bol.uol.com.br",
+ "feedsportal.com",
+ "ip-adress.com",
+ "sedty.com",
+ "ilsistemabinario.com",
+ "nabble.com",
+ "hightail.com",
+ "superjob.ru",
+ "tokyo.jp",
+ "hrblock.com",
+ "china.cn",
+ "tsetmc.com",
+ "unfranchise.com.tw",
+ "bhg.com",
+ "htmlbook.ru",
+ "stardoll.com",
+ "crictime.com",
+ "hsn.com",
+ "royalmail.com",
+ "globallshare.com",
+ "wikiwiki.jp",
+ "petardas.com",
+ "usembassy.gov",
+ "rakuten-bank.co.jp",
+ "golem.de",
+ "stepstone.de",
+ "aucfan.com",
+ "stubhub.com",
+ "rbcdaily.ru",
+ "ro2.biz",
+ "huffingtonpost.ca",
+ "timeout.com",
+ "digitalspy.co.uk",
+ "foreningssparbanken.se",
+ "autodesk.com",
+ "98ia.com",
+ "gtbank.com",
+ "runetki.com",
+ "freshdesk.com",
+ "ieee.org",
+ "getpocket.com",
+ "jutarnji.hr",
+ "caisse-epargne.fr",
+ "profitcentr.com",
+ "51.com",
+ "oi.com.br",
+ "sina.com.tw",
+ "fontspace.com",
+ "dynamicdrive.com",
+ "maduradas.com",
+ "ligtv.com.tr",
+ "sport24.gr",
+ "stargazete.com",
+ "bola.net",
+ "template-help.com",
+ "codecademy.com",
+ "officedepot.com",
+ "researchgate.net",
+ "17u.com",
+ "gfxtra.com",
+ "weiphone.com",
+ "shoutmeloud.com",
+ "hc360.com",
+ "lintas.me",
+ "mk.ru",
+ "wplocker.com",
+ "thumbtack.com",
+ "szn.cz",
+ "yatra.com",
+ "societegenerale.fr",
+ "wyborcza.pl",
+ "demotywatory.pl",
+ "thomann.de",
+ "imperiaonline.org",
+ "magento.com",
+ "skillpages.com",
+ "cam4ads.com",
+ "spiceworks.com",
+ "homestead.com",
+ "locanto.in",
+ "hotelurbano.com",
+ "sinaimg.cn",
+ "chetxia.com",
+ "menshealth.com",
+ "ideacellular.com",
+ "snopes.com",
+ "newgrounds.com",
+ "autosottocosto.com",
+ "admob.com",
+ "linguee.fr",
+ "net-a-porter.com",
+ "text.ru",
+ "sharebeast.com",
+ "televisionfanatic.com",
+ "netlog.com",
+ "lufthansa.com",
+ "ngoisao.net",
+ "3911.net",
+ "worldssl.net",
+ "rabobank.nl",
+ "lvmama.com",
+ "sharethis.com",
+ "sambaporno.com",
+ "mci.ir",
+ "inosmi.ru",
+ "joyreactor.cc",
+ "cartfill.in",
+ "cooltext.com",
+ "qz.com",
+ "onthe.io",
+ "citilink.ru",
+ "apartmenttherapy.com",
+ "lloydsbank.com",
+ "metroer.com",
+ "koyotesoft.com",
+ "subdivx.com",
+ "alriyadh.com",
+ "backlinkwatch.com",
+ "coindesk.com",
+ "porntube1.xxx",
+ "zovi.com",
+ "thestreet.com",
+ "rtbstream.com",
+ "etnet.com.hk",
+ "creditkarma.com",
+ "lifebuzz.com",
+ "opodo.co.uk",
+ "developpez.net",
+ "tinydeal.com",
+ "nature.com",
+ "oxforddictionaries.com",
+ "anchorfree.net",
+ "tn.com.ar",
+ "findicons.com",
+ "joomlart.com",
+ "hmrc.gov.uk",
+ "btc-e.com",
+ "extra.com.br",
+ "ad.nl",
+ "megafon.ru",
+ "qafqazinfo.az",
+ "shahvani.com",
+ "googlecode.com",
+ "milliyet.tv",
+ "deadline.com",
+ "grindtv.com",
+ "logitech.com",
+ "nzherald.co.nz",
+ "ninisite.com",
+ "webgains.com",
+ "oschina.net",
+ "webmasters.ru",
+ "filmix.net",
+ "seowhy.com",
+ "met-art.com",
+ "discart.ru",
+ "keywordblocks.com",
+ "vodly.to",
+ "redvak.com",
+ "tomshardware.co.uk",
+ "2shared.com",
+ "zoznam.sk",
+ "icims.com",
+ "virtapay.com",
+ "blomaga.jp",
+ "wasu.cn",
+ "carsensor.net",
+ "sportsdirect.com",
+ "uservoice.com",
+ "livescience.com",
+ "gamebase.com.tw",
+ "persiangig.com",
+ "livesmi.com",
+ "eharmony.com",
+ "banorte.com",
+ "radiojavan.com",
+ "startv.com.tr",
+ "coolmath-games.com",
+ "downloadquick.net",
+ "worldoftanks.eu",
+ "filelist.ro",
+ "fontsquirrel.com",
+ "superpages.com",
+ "yolasite.com",
+ "funnie.st",
+ "51cto.com",
+ "goo-net.com",
+ "builtwith.com",
+ "shaparak.ir",
+ "nuomi.com",
+ "omegle.com",
+ "poringa.net",
+ "lan.com",
+ "desi-tashan.com",
+ "shabdkosh.com",
+ "freedigitalphotos.net",
+ "betradar.com",
+ "womenshealthmag.com",
+ "realsimple.com",
+ "maxbounty.com",
+ "bbva.es",
+ "sweetpacks.com",
+ "pinoy-ako.info",
+ "jobstreet.com",
+ "cafe24.com",
+ "goldenbirds.biz",
+ "anandtech.com",
+ "mapion.co.jp",
+ "rawstory.com",
+ "streamate.com",
+ "celebuzz.com",
+ "freepornvs.com",
+ "divyabhaskar.co.in",
+ "lifehack.org",
+ "holidaycheck.de",
+ "quizlet.com",
+ "zhibo8.cc",
+ "askmefast.com",
+ "manageflitter.com",
+ "campaign-archive2.com",
+ "cityheaven.net",
+ "uniqlo.com",
+ "seoclerks.com",
+ "tecmundo.com.br",
+ "the-binary-options-guide.com",
+ "gigaom.com",
+ "mywot.com",
+ "playcast.ru",
+ "tatadocomo.com",
+ "csfd.cz",
+ "ganool.com",
+ "kaschpo.ru",
+ "webdunia.com",
+ "philly.com",
+ "doctoroz.com",
+ "jumei.com",
+ "poponclick.com",
+ "rueducommerce.fr",
+ "fararu.com",
+ "po.st",
+ "nextag.com",
+ "manhunt.net",
+ "sistrix.com",
+ "woman.ru",
+ "appbank.net",
+ "iobit.com",
+ "joins.com",
+ "vidtomp3.com",
+ "un.org",
+ "volusion.com",
+ "lipsum.com",
+ "afkarnews.ir",
+ "goldenline.pl",
+ "clickansave.net",
+ "softgozar.com",
+ "thefind.com",
+ "mozzi.com",
+ "wenxuecity.com",
+ "up2c.com",
+ "searchfunmoods.com",
+ "cabelas.com",
+ "coffetube.com",
+ "otto.de",
+ "webalta.ru",
+ "tataindicom.com",
+ "ctvnews.ca",
+ "inlinkz.com",
+ "kajabi.com",
+ "greatergood.com",
+ "whmcs.com",
+ "telekom.de",
+ "christianpost.com",
+ "fiducia.de",
+ "bancsabadell.com",
+ "pirateproxy.net",
+ "woobox.com",
+ "google.cm",
+ "noulinx.com",
+ "nick.com",
+ "moviehuts.com",
+ "mvideo.ru",
+ "couchtuner.eu",
+ "wyborcza.biz",
+ "tradeindia.com",
+ "girlsgogames.com",
+ "healthcare.gov",
+ "videolan.org",
+ "sky.it",
+ "tuniu.com",
+ "ime.nu",
+ "n4g.com",
+ "cyberforum.ru",
+ "justin.tv",
+ "createspace.com",
+ "joemonster.org",
+ "registro.br",
+ "elkhabar.com",
+ "open24news.tv",
+ "irr.ru",
+ "sanjesh.org",
+ "standardbank.co.za",
+ "neogaf.com",
+ "doyo.cn",
+ "am15.net",
+ "ana.co.jp",
+ "amd.com",
+ "gidonlinekino.com",
+ "sitetalk.com",
+ "nesn.com",
+ "arabseed.com",
+ "ingbank.pl",
+ "webpronews.com",
+ "saavn.com",
+ "yourdictionary.com",
+ "mobile9.com",
+ "jagranjosh.com",
+ "www.net.cn",
+ "computerbase.de",
+ "3djuegos.com",
+ "htc.com",
+ "the-binary-theorem.com",
+ "google.com.np",
+ "n11.com",
+ "vivastreet.com",
+ "mthai.com",
+ "seomastering.com",
+ "mercadolibre.cl",
+ "searchmetrics.com",
+ "mentalfloss.com",
+ "russia.tv",
+ "ubi.com",
+ "dwnews.com",
+ "ecplaza.net",
+ "trafficfactory.biz",
+ "loopnet.com",
+ "refinery29.com",
+ "minecraftforum.net",
+ "moviefone.com",
+ "bom.gov.au",
+ "google.com.bh",
+ "eltiempo.es",
+ "cuantarazon.com",
+ "2258.com",
+ "google.ee",
+ "nwolb.com",
+ "bezaat.com",
+ "eelly.com",
+ "icmwebserv.com",
+ "techsmith.com",
+ "timeweb.ru",
+ "johnlewis.com",
+ "independent.ie",
+ "bankia.es",
+ "dkb.de",
+ "gilt.com",
+ "duolingo.com",
+ "3file.info",
+ "cam4.de.com",
+ "pcanalysis.net",
+ "br.de",
+ "vodlocker.com",
+ "adfoc.us",
+ "ymlp.com",
+ "dailyfx.com",
+ "business2community.com",
+ "banki.ru",
+ "yell.com",
+ "smartresponder.ru",
+ "yaske.to",
+ "bokra.net",
+ "mercadolibre.com",
+ "viewster.com",
+ "recipesfinder.com",
+ "rei.com",
+ "dogpile.com",
+ "caf.fr",
+ "sbrf.ru",
+ "soha.vn",
+ "voila.fr",
+ "rp-online.de",
+ "members.webs.com",
+ "duvamis.com",
+ "nazwa.pl",
+ "google.com.ni",
+ "ilovemobi.com",
+ "retrogamer.com",
+ "blogtalkradio.com",
+ "utexas.edu",
+ "sonyentertainmentnetwork.com",
+ "dr.dk",
+ "jjwxc.net",
+ "service-public.fr",
+ "care2.com",
+ "musavat.com",
+ "h12-media.com",
+ "smartfren.com",
+ "immowelt.de",
+ "discuz.net",
+ "m1905.com",
+ "cas.sk",
+ "bitcoinwisdom.com",
+ "monografias.com",
+ "mindbodygreen.com",
+ "getfirebug.com",
+ "godlikeproductions.com",
+ "mydrivers.com",
+ "voc.com.cn",
+ "truecaller.com",
+ "livemook.com",
+ "i8ti.com",
+ "agame.com",
+ "kurir-info.rs",
+ "urbanoutfitters.com",
+ "shopping.uol.com.br",
+ "2ip.ru",
+ "91.com",
+ "banquepopulaire.fr",
+ "rappler.com",
+ "mint.com",
+ "jz123.cn",
+ "zurb.com",
+ "sport.cz",
+ "justunfollow.com",
+ "billionuploads.com",
+ "thaivisa.com",
+ "seitwert.de",
+ "ciudad.com.ar",
+ "archdaily.com",
+ "jalopnik.com",
+ "1news.az",
+ "dailyfinance.com",
+ "okitspace.com",
+ "dn.se",
+ "el-nacional.com",
+ "larousse.fr",
+ "mojo-themes.com",
+ "draugiem.lv",
+ "teamtreehouse.com",
+ "xiu.com",
+ "ennaharonline.com",
+ "oricon.co.jp",
+ "openoffice.org",
+ "tny.cz",
+ "forumfree.it",
+ "youthwant.com.tw",
+ "khamsat.com",
+ "vitacost.com",
+ "alrakoba.net",
+ "marmiton.org",
+ "yebhi.com",
+ "the-binary-trader.biz",
+ "dominos.com",
+ "dice.com",
+ "like4like.org",
+ "tvmuse.com",
+ "standardchartered.com",
+ "bitbucket.org",
+ "driveropti.net",
+ "google.hn",
+ "indiblogger.in",
+ "torrenthound.com",
+ "wolframalpha.com",
+ "experienceproject.com",
+ "nsw.gov.au",
+ "olx.pt",
+ "sciencedaily.com",
+ "viglink.com",
+ "plala.or.jp",
+ "sxsw.com",
+ "mileroticos.com",
+ "namejet.com",
+ "1hai.cn",
+ "skroutz.gr",
+ "bilibili.tv",
+ "travelzoo.com",
+ "saksfifthavenue.com",
+ "get-a-fuck-tonight.com",
+ "barclaycardus.com",
+ "withgoogle.com",
+ "whitehouse.gov",
+ "oprah.com",
+ "fishwrapper.com",
+ "softbank.jp",
+ "slutload.com",
+ "latercera.cl",
+ "100bestbuy.com",
+ "nur.kz",
+ "topit.me",
+ "computerhope.com",
+ "snob.ru",
+ "rackcdn.com",
+ "3158.cn",
+ "artlebedev.ru",
+ "yobt.com",
+ "rai.it",
+ "hs.fi",
+ "tinhte.vn",
+ "fotocasa.es",
+ "nyu.edu",
+ "dawn.com",
+ "series.ly",
+ "movshare.net",
+ "fineartamerica.com",
+ "westernunion.com",
+ "leaseweb.com",
+ "wayn.com",
+ "ivi.ru",
+ "bloomingdales.com",
+ "pons.com",
+ "rapidtrk.com",
+ "bama.ir",
+ "hackforums.net",
+ "dfiles.eu",
+ "intercambiosvirtuales.org",
+ "sdo.com",
+ "homes.com",
+ "colissimo.fr",
+ "discuss.com.hk",
+ "afreeca.com",
+ "rbc.ua",
+ "novamov.com",
+ "jungle.gr",
+ "iol.co.za",
+ "btcclicks.com",
+ "mapsofindia.com",
+ "propellerads.com",
+ "fab.com",
+ "princeton.edu",
+ "reliancebroadband.co.in",
+ "xdf.cn",
+ "mako.co.il",
+ "protothema.gr",
+ "booloo.com",
+ "livrariasaraiva.com.br",
+ "efukt.com",
+ "acrobat.com",
+ "globovision.com",
+ "xero.com",
+ "sevenforums.com",
+ "semalt.com",
+ "audiojungle.net",
+ "e1.ru",
+ "quoka.de",
+ "chinaiiss.com",
+ "gonzoxxxmovies.com",
+ "wallpaperswide.com",
+ "fapvid.com",
+ "trk4.com",
+ "forosdelweb.com",
+ "fark.com",
+ "my.tv.sohu.com/user/video",
+ "kaixin001.com",
+ "ntvspor.net",
+ "mobafire.com",
+ "zigwheels.com",
+ "filmifullizle.com",
+ "8tracks.com",
+ "readmanga.eu",
+ "lelong.com.my",
+ "planetromeo.com",
+ "192.com",
+ "republika.co.id",
+ "in.gr",
+ "televisao.uol.com.br",
+ "kalerkantho.com",
+ "usairways.com",
+ "malaysiakini.com",
+ "anonymouse.org",
+ "xxxhost.me",
+ "stuff.co.nz",
+ "dek-d.com",
+ "bbvanet.com.mx",
+ "watchseries-online.eu",
+ "malaysiaairlines.com",
+ "policymic.com",
+ "serviporno.com",
+ "aprod.hu",
+ "gelocal.it",
+ "tradetracker.com",
+ "cibc.com",
+ "umich.edu",
+ "smartshe.com",
+ "sony.jp",
+ "taobaocdn.com",
+ "bestgfx.biz",
+ "irib.ir",
+ "aliimg.com",
+ "esuteru.com",
+ "healthline.com",
+ "cnnamador.com",
+ "sat.gob.mx",
+ "childsafedownloadx.asia",
+ "playmillion.com",
+ "strawberrynet.com",
+ "alnilin.com",
+ "trustedreviews.com",
+ "21cn.com",
+ "persianv.com",
+ "baomoi.com",
+ "firestorage.jp",
+ "google.co.ke",
+ "admaimai.com",
+ "sbnlife.com",
+ "surveyrouter.com",
+ "megaindex.ru",
+ "intodns.com",
+ "yiqifa.com",
+ "mixcloud.com",
+ "softonic.fr",
+ "bakecaincontrii.com",
+ "payu.in",
+ "rakuten-card.co.jp",
+ "almaany.com",
+ "grantland.com",
+ "ricardo.ch",
+ "heavy.com",
+ "niusnews.com",
+ "canstockphoto.com",
+ "acunn.com",
+ "diythemes.com",
+ "canalrcnmsn.com",
+ "ngs.ru",
+ "rassd.com",
+ "groupon.co.in",
+ "depositfiles.org",
+ "mango.com",
+ "theregister.co.uk",
+ "worldfree4u.com",
+ "f-lite.ru",
+ "boingboing.net",
+ "bangbros.com",
+ "neteller.com",
+ "tonicmovies.com",
+ "p2up.ir",
+ "cartoonnetwork.com",
+ "lun.com",
+ "nk.pl",
+ "webry.info",
+ "burningcamel.com",
+ "mplife.com",
+ "nationalreview.com",
+ "williamhill.es",
+ "sssc.cn",
+ "col3negoriginal.lk",
+ "yoast.com",
+ "svyaznoy.ru",
+ "chengdu.cn",
+ "listverse.com",
+ "lastminute.com",
+ "guardianlv.com",
+ "39yst.com",
+ "bahseazad.ir",
+ "debian.org",
+ "tokyo-porn-tube.com",
+ "ilbe.com",
+ "upsocl.com",
+ "balatarin.com",
+ "charter97.org",
+ "wpexplorer.com",
+ "immi.gov.au",
+ "yokamen.cn",
+ "esmas.com",
+ "hbr.org",
+ "livechatinc.com",
+ "crazyegg.com",
+ "palcomp3.com",
+ "calottery.com",
+ "wistia.com",
+ "locaweb.com.br",
+ "techspot.com",
+ "bit.ly",
+ "yammer.com",
+ "uscis.gov",
+ "bramjnet.com",
+ "linio.com.mx",
+ "tharunaya.co.uk",
+ "desirulez.net",
+ "madmimi.com",
+ "everydayhealth.com",
+ "secondlife.com",
+ "ceskatelevize.cz",
+ "enter.ru",
+ "glopart.ru",
+ "woso.cn",
+ "pitlap.info",
+ "worldoftanks.com",
+ "videarn.com",
+ "dafiti.com.br",
+ "segundamano.mx",
+ "eamroomsnacks.com",
+ "vulture.com",
+ "humblebundle.com",
+ "rockstargames.com",
+ "wsodownloads.info",
+ "yazete.com",
+ "pcadvisor.co.uk",
+ "07073.com",
+ "modcloth.com",
+ "attracta.com",
+ "iol.pt",
+ "travideos.com",
+ "sparkpeople.com",
+ "rankingsandreviews.com",
+ "entekhab.ir",
+ "goarticles.com",
+ "wonderhowto.com",
+ "kankanews.com",
+ "rzb.ir",
+ "p30download.com",
+ "infojobs.it",
+ "socialspark.com",
+ "picstopin.com",
+ "celebritynetworth.com",
+ "tweakers.net",
+ "gi-backoffice.com",
+ "isbank.com.tr",
+ "qiyou.com",
+ "templatic.com",
+ "cyberpresse.ca",
+ "consumerreports.org",
+ "focalprice.com",
+ "linkpad.ru",
+ "svd.se",
+ "desitvforum.net",
+ "bulbagarden.net",
+ "showup.tv",
+ "webgozar.com",
+ "3dnews.ru",
+ "spyfu.com",
+ "bikhir.ma",
+ "trovaprezzi.it",
+ "autov.com.cn",
+ "podnapisi.net",
+ "tocmai.ro",
+ "realitatea.net",
+ "geico.com",
+ "joydownload.com",
+ "kddi.com",
+ "unbounce.com",
+ "meb.gov.tr",
+ "anchorfree.us",
+ "gumtree.pl",
+ "dbs.com",
+ "ebayimg.com",
+ "ptcsolution.com",
+ "clip.dj",
+ "samplicio.us",
+ "47news.jp",
+ "todo1.com",
+ "anspress.com",
+ "24sata.hr",
+ "cineblog01.tv",
+ "sport-fm.gr",
+ "unetenet.com",
+ "tenki.jp",
+ "jia.com",
+ "filefactory.com",
+ "onedio.com",
+ "gendai.net",
+ "nickjr.com",
+ "finviz.com",
+ "bytes.com",
+ "inkthemes.com",
+ "oriflame.com",
+ "aporrea.org",
+ "mazika2day.com",
+ "baimao.com",
+ "logme.in",
+ "downloadactivate.com",
+ "vista.ir",
+ "duowan.com",
+ "sinaapp.com",
+ "proceso.com.mx",
+ "xxxconnect.com",
+ "dvdvideosoft.com",
+ "nomorerack.com",
+ "almubasher.com.sa",
+ "afisha.ru",
+ "clicksure.com",
+ "11st.co.kr",
+ "turkishairlines.com",
+ "freekaamaal.com",
+ "findwide.com",
+ "sbisec.co.jp",
+ "mythemeshop.com",
+ "webnode.com",
+ "cumhuriyet.com.tr",
+ "morningstar.com",
+ "trafficshop.com",
+ "gopro.com",
+ "jeevansathi.com",
+ "dasoertliche.de",
+ "markets.com",
+ "absa.co.za",
+ "ikman.lk",
+ "fmworld.net",
+ "hyatt.com",
+ "virgin-atlantic.com",
+ "tfl.gov.uk",
+ "immonet.de",
+ "haodf.com",
+ "thewrap.com",
+ "appgame.com",
+ "hdwallpapers.in",
+ "canon.com",
+ "newsle.com",
+ "jorudan.co.jp",
+ "pcwelt.de",
+ "coinbase.com",
+ "yourgirlfriends.com",
+ "djmaza.info",
+ "findagrave.com",
+ "lainformacion.com",
+ "teacup.com",
+ "ezilon.com",
+ "redbubble.com",
+ "guru.com",
+ "brothersoft.com",
+ "coinmarketcap.com",
+ "mediabistro.com",
+ "elfagr.org",
+ "glavcom.ua",
+ "jino.ru",
+ "1e100.net",
+ "g9g.com",
+ "join.me",
+ "ynet.com",
+ "news247.gr",
+ "rcom.co.in",
+ "baby.ru",
+ "argentglobalnetwork.com",
+ "hsselite.com",
+ "foxbusiness.com",
+ "cookmates.com",
+ "lidl.de",
+ "timesofindia.com",
+ "fakt.pl",
+ "bgr.com",
+ "ghatreh.com",
+ "woxikon.de",
+ "pontofrio.com.br",
+ "gizmag.com",
+ "signup.wordpress.com",
+ "tre.it",
+ "gardenweb.com",
+ "alfalfalfa.com",
+ "prcm.jp",
+ "freemail.hu",
+ "iteye.com",
+ "katproxy.com",
+ "kickassunblock.info",
+ "wisegeek.com",
+ "zaobao.com",
+ "vpsdomain4.eu",
+ "naij.com",
+ "olx.co.za",
+ "mihanstore.org",
+ "gezinti.com",
+ "vistaprint.in",
+ "dastelefonbuch.de",
+ "blackhatteam.com",
+ "yummly.com",
+ "minecraft.net",
+ "justcloud.com",
+ "biblehub.com",
+ "argentinawarez.com",
+ "gandul.info",
+ "trialpay.com",
+ "paruvendu.fr",
+ "khanacademy.org",
+ "topsy.com",
+ "angelfire.com",
+ "nseindia.com",
+ "seositecheckup.com",
+ "hostelworld.com",
+ "zalukaj.tv",
+ "animeflv.net",
+ "laptopmag.com",
+ "tripadvisor.de",
+ "sec.gov",
+ "tripadvisor.es",
+ "oreilly.com",
+ "kanald.com.tr",
+ "halifax-online.co.uk",
+ "extremetracking.com",
+ "reimageplus.com",
+ "jal.co.jp",
+ "vuiviet.net",
+ "yeslibertin.com",
+ "pichunter.com",
+ "empowernetwork.com/aI3zkH7s3g6tZH8TDmh8LA==",
+ "reforma.com",
+ "singlessalad.com",
+ "upenn.edu",
+ "1ting.com",
+ "hsbc.com.mx",
+ "sulia.com",
+ "yepporn.com",
+ "scrubtheweb.com",
+ "e-autopay.com",
+ "rechargeitnow.com",
+ "ppomppu.co.kr",
+ "zemtv.com",
+ "gofeminin.de",
+ "peoplestylewatch.com",
+ "france24.com",
+ "comodo.com",
+ "openmace.net",
+ "maultalk.com",
+ "fancy.com",
+ "vodafone.it",
+ "pokerstrategy.com",
+ "crunchyroll.com",
+ "aipai.com",
+ "3dcartstores.com",
+ "leancy.com",
+ "myblogguest.com",
+ "papajohns.com",
+ "tuolar.com",
+ "junkmail.co.za",
+ "nyc.gov",
+ "rentalcars.com",
+ "sovsport.ru",
+ "marketo.com",
+ "smbc.co.jp",
+ "yale.edu",
+ "pitchfork.com",
+ "thetoptens.com",
+ "joyme.com",
+ "linuxquestions.org",
+ "htmlgoodies.com",
+ "laredoute.fr",
+ "0427d7.se",
+ "journaldesfemmes.com",
+ "xici.net",
+ "alwafd.org",
+ "daniweb.com",
+ "mtgox.com",
+ "jetstar.com",
+ "plotek.pl",
+ "jobvite.com",
+ "adage.com",
+ "aukro.cz",
+ "ford.com",
+ "problogger.net",
+ "518.com.tw",
+ "blogbigtime.com",
+ "nieuwsblad.be",
+ "register.com",
+ "24tv.ua",
+ "aftenposten.no",
+ "weightwatchers.com",
+ "smartpassiveincome.com",
+ "radiosvoboda.org",
+ "web.com",
+ "caixin.com",
+ "digitalmarketer.com",
+ "soup.io",
+ "soft98.ir",
+ "muzofon.com",
+ "gao7.com",
+ "freefilmshd.com",
+ "hsbc.com",
+ "xhamsterhq.com",
+ "my.tv.sohu.com/user/reg",
+ "trade65.com",
+ "chow.com",
+ "google.com.kh",
+ "inps.it",
+ "seesaa.jp",
+ "hoovers.com",
+ "peru21.pe",
+ "sdpnoticias.com",
+ "schema.org",
+ "linode.com",
+ "theknot.com",
+ "blesk.cz",
+ "google.ci",
+ "loltrk.com",
+ "vod.pl",
+ "geenstijl.nl",
+ "moneymakergroup.com",
+ "tupaki.com",
+ "huvrtech.com",
+ "metafilter.com",
+ "jumia.com.ng",
+ "newsvine.com",
+ "mylant.com",
+ "accenture.com",
+ "feedjit.com",
+ "twipple.jp",
+ "getgoodlinks.ru",
+ "radiofarda.com",
+ "informador.com.mx",
+ "wisc.edu",
+ "windows.net",
+ "zamzar.com",
+ "nationalpost.com",
+ "epnet.com",
+ "naaptol.com",
+ "x-art.com",
+ "ebookbrowsee.net",
+ "marketingland.com",
+ "thedailyshow.com",
+ "s-oman.net",
+ "theme-fusion.com",
+ "immobiliare.it",
+ "allvoices.com",
+ "adroll.com",
+ "francetvinfo.fr",
+ "callandput.com",
+ "entireweb.com",
+ "instructure.com",
+ "megacinema.fr",
+ "djelfa.info",
+ "flightaware.com",
+ "magazineluiza.com.br",
+ "ighome.com",
+ "mature-beauty.com",
+ "yuku.com",
+ "peerfly.com",
+ "hardware.fr",
+ "dcinside.com",
+ "telerik.com",
+ "pengpeng.com",
+ "gazetaexpress.com",
+ "publico.es",
+ "nwsource.com",
+ "oneandone.co.uk",
+ "qoo10.sg",
+ "aboutus.org",
+ "adsupplyads.com",
+ "wa.gov",
+ "google.co.cr",
+ "benchmarkemail.com",
+ "valuedealshopper.com",
+ "hola.com",
+ "mizuhobank.co.jp",
+ "zzstream.li",
+ "kriesi.at",
+ "exist.ru",
+ "nvidia.com",
+ "giallozafferano.it",
+ "jusbrasil.com.br",
+ "konga.com",
+ "avclub.com",
+ "reed.co.uk",
+ "advertig.com",
+ "ripoffreport.com",
+ "gooddrama.net",
+ "pornyaz.com",
+ "budsgunshop.com",
+ "78.cn",
+ "livesurf.ru",
+ "99114.com",
+ "pornorama.com",
+ "marksandspencer.com",
+ "vmall.com",
+ "fatcow.com",
+ "mylife.com",
+ "irishtimes.com",
+ "medicalnewstoday.com",
+ "uiuc.edu",
+ "groupon.it",
+ "washington.edu",
+ "addictinggames.com",
+ "anonymz.com",
+ "kindgirls.com",
+ "jne.co.id",
+ "guiamais.com.br",
+ "lyricsfreak.com",
+ "uloz.to",
+ "tagesanzeiger.ch",
+ "fashionandyou.com",
+ "bollywoodhungama.com",
+ "nationwide.co.uk",
+ "kboing.com.br",
+ "python.org",
+ "theladbible.com",
+ "eurosport.com",
+ "webinarjam.com",
+ "theme.wordpress.com",
+ "myfxbook.com",
+ "allwomenstalk.com",
+ "ucla.edu",
+ "opendns.com",
+ "pornbb.org",
+ "money.pl",
+ "domain.com.au",
+ "standaard.be",
+ "wanelo.com",
+ "express.co.uk",
+ "exam8.com",
+ "zum.com",
+ "amtrak.com",
+ "boots.com",
+ "800notes.com",
+ "fabfurnish.com",
+ "amoureux.com",
+ "ebizmba.com",
+ "ujian.cc",
+ "stargames.at",
+ "panasonic.com",
+ "ge.tt",
+ "scout.com",
+ "tiexue.net",
+ "nanapi.jp",
+ "eclipse.org",
+ "searchquotes.com",
+ "wetplace.com",
+ "lpcloudbox300.com",
+ "hollyscoop.com",
+ "bdjobs.com",
+ "larepublica.pe",
+ "hizliresim.com",
+ "yepme.com",
+ "bitcoincharts.com",
+ "bsnl.co.in",
+ "ucwan87.net",
+ "tianji.com",
+ "hgtv.com",
+ "cleanfiles.net",
+ "moonsy.com",
+ "tomsguide.com",
+ "datpiff.com",
+ "net.hr",
+ "orange.pl",
+ "bankrate.com.cn",
+ "mafiashare.net",
+ "giaoduc.net.vn",
+ "sucuri.net",
+ "ringcentral.com",
+ "gamingwonderland.com",
+ "freenet.de",
+ "cian.ru",
+ "gayboystube.com",
+ "gog.com",
+ "gruenderszene.de",
+ "econsultancy.com",
+ "aktuality.sk",
+ "webrankstats.com",
+ "j-cast.com",
+ "popsugar.com",
+ "mr-guangdong.com",
+ "on.cc",
+ "jb51.net",
+ "lamoda.ru",
+ "sprashivai.ru",
+ "animoto.com",
+ "winzip.com",
+ "vanityfair.com",
+ "svt.se",
+ "noyapps.com",
+ "mnn.com",
+ "lancenet.com.br",
+ "e-monsite.com",
+ "gazeta.ua",
+ "cari.com.my",
+ "coub.com",
+ "veoh.com",
+ "kienthuc.net.vn",
+ "eldorado.ru",
+ "overclock.net",
+ "meetic.fr",
+ "tam.com.br",
+ "alfemminile.com",
+ "telmex.com",
+ "newsbomb.gr",
+ "funda.nl",
+ "netcoc.com",
+ "bhinneka.com",
+ "layalina.com",
+ "clubpenguin.com",
+ "talktalk.co.uk",
+ "dumpert.nl",
+ "almastba.com",
+ "clker.com",
+ "adweek.com",
+ "gigya.com",
+ "disponivel.uol.com.br",
+ "tomoson.com",
+ "w.org",
+ "rfi.fr",
+ "imgbox.com",
+ "omniture.com",
+ "n24.de",
+ "webdesignrazzi.com",
+ "medscape.com",
+ "playboy.com",
+ "usda.gov",
+ "cuevana.tv",
+ "trenitalia.com",
+ "explosm.net",
+ "mail.uol.com.br",
+ "delfi.lv",
+ "elektroda.pl",
+ "hulkshare.com",
+ "kotak.com",
+ "gi-akademie.ning.com",
+ "yelp.de",
+ "lrytas.lt",
+ "couchsurfing.org",
+ "drugstore.com",
+ "ssa.gov",
+ "seriescoco.com",
+ "iran-tejarat.com",
+ "hafiz.gov.sa",
+ "intellicast.com",
+ "sub.jp",
+ "paginasamarillas.es",
+ "anime44.com",
+ "babyschool.com.cn",
+ "advertisernets.com",
+ "vpsdomain2.eu",
+ "arcor.de",
+ "video2mp3.net",
+ "marthastewart.com",
+ "hawahome.com",
+ "articlesbase.com",
+ "spanishdict.com",
+ "meilishuo.com",
+ "grammarly.com",
+ "sportlemon.tv",
+ "zend.com",
+ "bigideamastermind.com",
+ "hawaaworld.com",
+ "pagseguro.uol.com.br",
+ "keywordspy.com",
+ "7search.com",
+ "cnki.net",
+ "aamaadmiparty.org",
+ "javaplayer.info",
+ "sidereel.com",
+ "azcentral.com",
+ "passportindia.gov.in",
+ "memurlar.net",
+ "bouyguestelecom.fr",
+ "buenastareas.com",
+ "ernmoneynow.com",
+ "eurosport.ru",
+ "blog.163.com",
+ "pizzahut.com",
+ "bossip.com",
+ "webdeveloper.com",
+ "add-anime.net",
+ "pimptubed.com",
+ "movistar.es",
+ "megashare.sh",
+ "empireavenue.com",
+ "btemplates.com",
+ "amkspor.com",
+ "payza.com",
+ "farfesh.com",
+ "mcgraw-hill.com",
+ "motor-talk.de",
+ "purepeople.com",
+ "i-gamer.net",
+ "sotmarket.ru",
+ "anthropologie.com",
+ "google.org",
+ "rai.tv",
+ "wikidot.com",
+ "canoe.ca",
+ "orange.es",
+ "umn.edu",
+ "emag.ro",
+ "webutations.org",
+ "ykb.com",
+ "canadapost.ca",
+ "zhubajie.com",
+ "nextcar.cn",
+ "next.co.uk",
+ "freemovie-hd.com",
+ "telegraf.com.ua",
+ "ajc.com",
+ "xsrv.jp",
+ "vanguard.com",
+ "mybroadband.co.za",
+ "999120.net",
+ "panet.co.il",
+ "bellemaison.jp",
+ "fonearena.com",
+ "playvid.com",
+ "purdue.edu",
+ "thesuperficial.com",
+ "114so.cn",
+ "irna.ir",
+ "websitetonight.com",
+ "edublogs.org",
+ "provincial.com",
+ "jahaniha.com",
+ "heroturko.me",
+ "dynadot.com",
+ "txtsrving.info",
+ "adclickxpress.com",
+ "sammobile.com",
+ "ebay.at",
+ "yaplog.jp",
+ "imtranslator.net",
+ "fotor.com",
+ "myvidster.com",
+ "williamhill.it",
+ "argaam.com",
+ "zoomby.ru",
+ "tcsbank.ru",
+ "origin.com",
+ "vov.vn",
+ "wrapbootstrap.com",
+ "imvu.com",
+ "fbsbx.com",
+ "elcorteingles.es",
+ "cerdas.com",
+ "google.com.om",
+ "dramasonline.com",
+ "businesswire.com",
+ "serpbook.com",
+ "santanderrio.com.ar",
+ "meta.ua",
+ "kenhgioitre.com",
+ "watchcartoononline.com",
+ "athome.co.jp",
+ "2checkout.com",
+ "moheet.com",
+ "jeu.info",
+ "ankieta-online.pl",
+ "triberr.com",
+ "wordtracker.com",
+ "blogher.com",
+ "colourlovers.com",
+ "maalaimalar.com",
+ "bakeca.it",
+ "thepostgame.com",
+ "beget.ru",
+ "abebooks.com",
+ "certified-toolbar.com",
+ "publico.pt",
+ "footmercato.net",
+ "indiabix.com",
+ "zakzak.co.jp",
+ "hotfile.com",
+ "virustotal.com",
+ "usgs.gov",
+ "tukif.com",
+ "banglamail24.com",
+ "graphicstock.com",
+ "svpressa.ru",
+ "sanalpazar.com",
+ "logsoku.com",
+ "loteriasyapuestas.es",
+ "youjizzlive.com",
+ "all-inkl.com",
+ "arcot.com",
+ "blogspot.fi",
+ "inbox.lv",
+ "anno-online.com",
+ "tikona.in",
+ "newsru.ua",
+ "centerblog.net",
+ "jahannews.com",
+ "joxi.ru",
+ "proxybay.eu",
+ "2gis.ru",
+ "indeed.fr",
+ "novayagazeta.ru",
+ "intelius.com",
+ "hosteurope.de",
+ "autoscout24.it",
+ "postjoint.com",
+ "pulsk.com",
+ "biobiochile.cl",
+ "homevv.com",
+ "zapbux.com",
+ "gsp.ro",
+ "priyo.com",
+ "jamnews.ir",
+ "addtoany.com",
+ "lookbook.nu",
+ "e-travel.com",
+ "themelock.com",
+ "bestsocialfeed.com",
+ "eqla3.com",
+ "klm.com",
+ "realtor.ca",
+ "tv2.no",
+ "jqueryrain.com",
+ "seo-fast.ru",
+ "academic.ru",
+ "clicksia.com",
+ "lpcloudbox30.com",
+ "worldpay.com",
+ "gogoanime.com",
+ "photoshelter.com",
+ "mlive.com",
+ "wetteronline.de",
+ "jkforum.net",
+ "secure.ipage.com",
+ "antena3.com",
+ "elsevier.com",
+ "thaiseoboard.com",
+ "addic7ed.com",
+ "rookee.ru",
+ "jstor.org",
+ "rajanews.com",
+ "uline.com",
+ "o2online.de",
+ "fbdownloader.com",
+ "wetpaint.com",
+ "nnm.me",
+ "50onred.com",
+ "tvtropes.org",
+ "philips.com",
+ "watchseries.to",
+ "perfectinter.net",
+ "progressive.com",
+ "stcn.com",
+ "golsearch.com",
+ "sarayanews.com",
+ "screenrant.com",
+ "macworld.com",
+ "classifiedads.com",
+ "ip138.com",
+ "izlesene.com",
+ "ovguide.com",
+ "gametop.com",
+ "urlm.co",
+ "isitdownrightnow.com",
+ "redhat.com",
+ "stafaband.info",
+ "biglion.ru",
+ "twitterfeed.com",
+ "ttnet.com.tr",
+ "panasonic.jp",
+ "loc.gov",
+ "telstra.com.au",
+ "jiathis.com",
+ "perfil.com.ar",
+ "inquisitr.com",
+ "ratp.fr",
+ "libertaddigital.com",
+ "bni.co.id",
+ "ycombinator.com",
+ "paginegialle.it",
+ "momoshop.com.tw",
+ "theweek.com",
+ "tuoitre.vn",
+ "scriptmafia.org",
+ "megavod.fr",
+ "indiavisiontv.com",
+ "history.com",
+ "flyeralarm.com",
+ "salespider.com",
+ "ard.de",
+ "dslreports.com",
+ "tokyo-tube.com",
+ "brazzersnetwork.com",
+ "bonanza.com",
+ "storenvy.com",
+ "37signals.com",
+ "jxnews.com.cn",
+ "1sale.com",
+ "allanalpass.com",
+ "yiiframework.com",
+ "kimsufi.com",
+ "nastygal.com",
+ "immoral.jp",
+ "icq.com",
+ "loxblog.com",
+ "jcrew.com",
+ "diamond.jp",
+ "nissen.co.jp",
+ "fxstreet.com",
+ "15min.lt",
+ "lifo.gr",
+ "alef.ir",
+ "iis.net",
+ "giphy.com",
+ "mypopup.ir",
+ "bsnl.in",
+ "distractify.com",
+ "foro20.com",
+ "chachaba.com",
+ "fx-trend.com",
+ "imanhua.com",
+ "playxn.com",
+ "gocomics.com",
+ "lcl.fr",
+ "hsw.cn",
+ "ellislab.com",
+ "persiantools.com",
+ "coupondunia.in",
+ "fengniao.com",
+ "coinmill.com",
+ "freelancer.in",
+ "blogdetik.com",
+ "data.com",
+ "trafficjunky.net",
+ "neverblue.com",
+ "flvto.com",
+ "lijit.com",
+ "zaycev.net",
+ "salamnews.org",
+ "siliconrus.com",
+ "dv37.com",
+ "conrad.de",
+ "ascii.jp",
+ "yesfreeporn.com",
+ "globalpost.com",
+ "d4000.com",
+ "dobreprogramy.pl",
+ "hammihan.com",
+ "wjunction.com",
+ "liverpoolfc.tv",
+ "nordea.fi",
+ "mail2web.com",
+ "songkick.com",
+ "comicbookresources.com",
+ "jwplayer.com",
+ "moi.gov.sa",
+ "iranecar.com",
+ "kayako.com",
+ "listal.com",
+ "technet.com",
+ "infonews.com",
+ "fun698.com",
+ "frys.com",
+ "vectorstock.com",
+ "vbox7.com",
+ "leroymerlin.fr",
+ "gpotato.eu",
+ "gulfnews.com",
+ "hot-sex-tube.com",
+ "buzzle.com",
+ "uludagsozluk.com",
+ "onlinefastpaydayloan.com",
+ "forumcommunity.net",
+ "potins.net",
+ "bwin.es",
+ "lobstertube.com",
+ "katestube.com",
+ "endomondo.com",
+ "navalny.livejournal.com",
+ "wayport.net",
+ "dealspl.us",
+ "pixhost.org",
+ "webopedia.com",
+ "flagcounter.com",
+ "hotnewhiphop.com",
+ "matomy.com",
+ "privat24.ua",
+ "fuq.com",
+ "readserver.net",
+ "haiwainet.cn",
+ "light-dark.net",
+ "decolar.com",
+ "tlbb8.com",
+ "tomtom.com",
+ "fontanka.ru",
+ "tchibo.de",
+ "slutfinder.com",
+ "rbc.cn",
+ "pepperfry.com",
+ "freshersworld.com",
+ "mob.org",
+ "brobible.com",
+ "phim3s.net",
+ "parsiblog.com",
+ "link-assistant.com",
+ "smotri.com",
+ "flyertalk.com",
+ "iefimerida.gr",
+ "pornyeah.com",
+ "trustpilot.com",
+ "wowslider.com",
+ "sekindo.com",
+ "shape.com",
+ "pizap.com",
+ "bluedart.com",
+ "cmu.edu",
+ "shueisha.co.jp",
+ "royal-search.com",
+ "123greetings.com",
+ "albawabhnews.com",
+ "holiday-weather.com",
+ "4travel.jp",
+ "lpcloudsvr203.com",
+ "panorama.com.ve",
+ "htcmania.com",
+ "skorer.tv",
+ "mymovies.it",
+ "fileice.net",
+ "1and1.fr",
+ "legiaodosherois.com.br",
+ "tomsguide.fr",
+ "baymirror.com",
+ "thesun.co.uk",
+ "huffingtonpost.es",
+ "61baobao.com",
+ "juegos.com",
+ "joyclub.de",
+ "qatarairways.com",
+ "ayosdito.ph",
+ "translate.ru",
+ "yithemes.com",
+ "buyvip.com",
+ "pearltrees.com",
+ "thinkprogress.org",
+ "twitcasting.tv",
+ "lusongsong.com",
+ "irecommend.ru",
+ "aukro.ua",
+ "eldiario.es",
+ "pop-music.ir",
+ "libertytimes.com.tw",
+ "themalaysianinsider.com",
+ "paddypower.it",
+ "delfi.ee",
+ "appthemes.com",
+ "tdameritrade.com",
+ "flashback.org",
+ "tubelib.com",
+ "claro.com.br",
+ "jotform.com",
+ "bigresource.com",
+ "libsyn.com",
+ "sendgrid.com",
+ "silikonvadisi.tv",
+ "geo.tv",
+ "pricegrabber.com",
+ "futhead.com",
+ "testberichte.de",
+ "skybet.com",
+ "wpcentral.com",
+ "lesnumeriques.com",
+ "clientoo.com",
+ "mathsisfun.com",
+ "expert.ru",
+ "maxptp.com",
+ "mediaite.com",
+ "regions.com",
+ "fast-torrent.ru",
+ "enlacespepito.com",
+ "redtram.com",
+ "benesse.ne.jp",
+ "jappy.de",
+ "wizzair.com",
+ "adevarul.ro",
+ "mhlw.go.jp",
+ "dev-point.com",
+ "ibtimes.co.in",
+ "coinwarz.com",
+ "slidesharecdn.com",
+ "classmates.com",
+ "tsite.jp",
+ "niazerooz.com",
+ "jma.go.jp",
+ "motherjones.com",
+ "easports.com",
+ "elbotola.com",
+ "tripadvisor.com.au",
+ "rozee.pk",
+ "vivanuncios.com.mx",
+ "lashou.com",
+ "theaustralian.com.au",
+ "superstarmagazine.com",
+ "zedge.net",
+ "hardwarezone.com.sg",
+ "yyets.com",
+ "nowgamez.com",
+ "blogspot.ch",
+ "gq.com",
+ "adidas.com",
+ "uyan.cc",
+ "dailydot.com",
+ "xenforo.com",
+ "ilmessaggero.it",
+ "state.nj.us",
+ "16888.com",
+ "searchengines.guru",
+ "nascar.com",
+ "dnb.no",
+ "smosh.com",
+ "shinyinnovation.com",
+ "who.int",
+ "mybet.com",
+ "yoo7.com",
+ "xrea.com",
+ "fotolog.net",
+ "smartprix.com",
+ "esquire.com",
+ "google.com.cy",
+ "santander.com.br",
+ "realclearpolitics.com",
+ "financereports24.com",
+ "onlinesoccermanager.com",
+ "noticiaaldia.com",
+ "kelkoo.com",
+ "drakulastream.eu",
+ "vodafone.de",
+ "bt.dk",
+ "greenwichmeantime.com",
+ "ufc.com",
+ "webstatsdomain.org",
+ "taoche.com",
+ "thinkgeek.com",
+ "caranddriver.com",
+ "123-reg.co.uk",
+ "translit.ru",
+ "w3school.com.cn",
+ "zwinky.com",
+ "inboxdollars.com",
+ "gratka.pl",
+ "vecernji.hr",
+ "taikang.com",
+ "bolshoyvopros.ru",
+ "urbita.com",
+ "api.ning.com",
+ "alltop.com",
+ "readwrite.com",
+ "medhelp.org",
+ "totaljobs.com",
+ "accorhotels.com",
+ "prom.ua",
+ "cuny.edu",
+ "livemint.com",
+ "berlin.de",
+ "blogspot.hk",
+ "orkut.com.br",
+ "lzjl.com",
+ "metric-conversions.org",
+ "nationalrail.co.uk",
+ "oxu.az",
+ "mql5.com",
+ "chinaluxus.com",
+ "linguee.es",
+ "saudiairlines.com",
+ "standardmedia.co.ke",
+ "alkislarlayasiyorum.com",
+ "apk.tw",
+ "lesoir.be",
+ "whatculture.com",
+ "indiewire.com",
+ "pccomponentes.com",
+ "paytm.in",
+ "ebaypartnernetwork.com",
+ "haivl.tv",
+ "e-junkie.com",
+ "tvp.pl",
+ "ifilez.org",
+ "aristeguinoticias.com",
+ "bangkokpost.com",
+ "whatmobile.com.pk",
+ "prodavalnik.com",
+ "arsenal.com",
+ "buyma.com",
+ "torrentday.com",
+ "sammydress.com",
+ "blogcu.com",
+ "imore.com",
+ "shitaraba.com",
+ "pasadrexam2014.in",
+ "songspk.at",
+ "eforosh.com",
+ "nocoty.pl",
+ "koreus.com",
+ "verticalresponse.com",
+ "arte.tv",
+ "ocnk.net",
+ "cryptsy.com",
+ "haaretz.com",
+ "straitstimes.com",
+ "2domains.ru",
+ "usnetads.com",
+ "pracuj.pl",
+ "edreams.it",
+ "sba.gov",
+ "instabang.com",
+ "domainnamesales.com",
+ "teensnow.com",
+ "visualwebsiteoptimizer.com",
+ "blogos.com",
+ "santander.com.mx",
+ "solidfiles.com",
+ "authorstream.com",
+ "teslamotors.com",
+ "tema.livejournal.com",
+ "kolesa.kz",
+ "startribune.com",
+ "vevo.com",
+ "clien.net",
+ "3asq.com",
+ "tvnet.lv",
+ "mouthshut.com",
+ "binary-machine.com",
+ "adultwork.com",
+ "hypebeast.com",
+ "itrack.it",
+ "network-tools.com",
+ "brandsoftheworld.com",
+ "comedycentral.com",
+ "hotscripts.com",
+ "meristation.com",
+ "rlsbb.com",
+ "uzai.com",
+ "volkskrant.nl",
+ "terra.com.mx",
+ "howtoforge.com",
+ "178.com",
+ "wickedfire.com",
+ "dilandau.eu",
+ "seriales.us",
+ "xataka.com",
+ "hktdc.com",
+ "express.pk",
+ "surfcanyon.com",
+ "buildhr.com",
+ "ouest-france.fr",
+ "stltoday.com",
+ "alternet.org",
+ "site5.com",
+ "payserve.com",
+ "society6.com",
+ "douguo.com",
+ "prosieben.de",
+ "verywed.com",
+ "enikos.gr",
+ "tubewolf.com",
+ "openrice.com",
+ "blankrefer.com",
+ "gouv.qc.ca",
+ "torrentfreak.com",
+ "craveonline.com",
+ "unfollowers.com",
+ "deser.pl",
+ "quanjing.com",
+ "runetki.tv",
+ "yepi.com",
+ "socialbakers.com",
+ "webmotors.com.br",
+ "mmo-champion.com",
+ "globososo.com",
+ "whois.sc",
+ "sportskeeda.com",
+ "socialblade.com",
+ "jin115.com",
+ "avjavjav.com",
+ "thenewstribe.com",
+ "pinkrod.com",
+ "blox.pl",
+ "mediamarkt.de",
+ "vivo.com.br",
+ "facilisimo.com",
+ "sinarharian.com.my",
+ "leguide.com",
+ "voegol.com.br",
+ "j.gs",
+ "okgj.com",
+ "revolveclothing.com",
+ "lolinez.com",
+ "go2cloud.org",
+ "vmoptions.com",
+ "myip.ms",
+ "ay.gy",
+ "liquidweb.com",
+ "sbi.co.in",
+ "alamaula.com",
+ "reshareable.tv",
+ "stirileprotv.ro",
+ "siriusxm.com",
+ "banvenez.com",
+ "sergey-mavrodi-mmm.net",
+ "ocj.com.cn",
+ "elderscrollsonline.com",
+ "webaslan.com",
+ "dereferer.org",
+ "newsbeast.gr",
+ "778669.com",
+ "yeucahat.com",
+ "guitarcenter.com",
+ "mercurynews.com",
+ "channeladvisor.com",
+ "go2000.com",
+ "google.ge",
+ "pandora.tv",
+ "haqqin.az",
+ "google.tt",
+ "32d1d3b9c.se",
+ "sexdatenow.net",
+ "befunky.com",
+ "micromaxinfo.com",
+ "jquerymobile.com",
+ "radikal.ru",
+ "wigetmedia.com",
+ "girlsplay.com",
+ "pureleverage.com",
+ "mathxl.com",
+ "themefuse.com",
+ "giga.de",
+ "freevideo.cz",
+ "stylebistro.com",
+ "iwriter.com",
+ "winporn.com",
+ "tripadvisor.ca",
+ "atresplayer.com",
+ "igma.tv",
+ "ravelry.com",
+ "semana.com",
+ "verycd.com",
+ "sblo.jp",
+ "fansided.com",
+ "goalunited.org",
+ "petfinder.com",
+ "worthofweb.com",
+ "memuruz.net",
+ "njuskalo.hr",
+ "yellowpages.ca",
+ "91jm.com",
+ "webconfs.com",
+ "interpals.net",
+ "erepublik.com",
+ "akismet.com",
+ "gaadi.com",
+ "casasbahia.com.br",
+ "techsupportalert.com",
+ "bostonglobe.com",
+ "uploadable.ch",
+ "smartprofitsystem.com",
+ "cimbclicks.com.my",
+ "uwants.com",
+ "gamestar.de",
+ "neowin.net",
+ "inilah.com",
+ "toster.ru",
+ "gosuslugi.ru",
+ "windguru.cz",
+ "3366.com",
+ "beinsports.net",
+ "vector.co.jp",
+ "memecenter.com",
+ "hotnews.ro",
+ "webgame.web.id",
+ "llnw.com",
+ "jobstreet.co.id",
+ "congratulations-you-won.com",
+ "libertatea.ro",
+ "app111.com",
+ "scientificamerican.com",
+ "strava.com",
+ "iranjib.ir",
+ "coneco.net",
+ "fdrmx.com",
+ "nps.gov",
+ "businessinsider.in",
+ "uniblue.com",
+ "proporn.com",
+ "dm5.com",
+ "qld.gov.au",
+ "nexusmods.com",
+ "mandatory.com",
+ "moskva.fm",
+ "prosperityteam.com",
+ "lent.az",
+ "appbrain.com",
+ "24smi.org",
+ "avaxsearch.com",
+ "gorillavid.in",
+ "realgm.com",
+ "favicon.cc",
+ "astro.com",
+ "joomlaforum.ru",
+ "joystiq.com",
+ "computerworld.com",
+ "tvspielfilm.de",
+ "centos.org",
+ "bugun.com.tr",
+ "amctv.com",
+ "relianceada.com",
+ "papystreaming.com",
+ "clickindia.com",
+ "sayyac.com",
+ "q.gs",
+ "bravoerotica.com",
+ "bibsonomy.org",
+ "netload.in",
+ "shopatron.com",
+ "iautos.cn",
+ "banggood.com",
+ "commerzbanking.de",
+ "legacyclix.com",
+ "intesasanpaolo.com",
+ "awesomescreenshot.com",
+ "desidime.com",
+ "eporner.com",
+ "alwatanvoice.com",
+ "ok.ru",
+ "europe1.fr",
+ "karnaval.com",
+ "tornn-tv.com",
+ "frmtr.com",
+ "pulscen.ru",
+ "groupon.co.uk",
+ "tradera.com",
+ "comingsoon.net",
+ "speckyboy.com",
+ "cargurus.com",
+ "citysearch.com",
+ "brother.com",
+ "acfun.tv",
+ "jamejamonline.ir",
+ "enterprise.com",
+ "elotrolado.net",
+ "userscripts.org",
+ "confirmit.com",
+ "compete.com",
+ "auctiva.com",
+ "potterybarn.com",
+ "ivoox.com",
+ "multiupload.nl",
+ "glavnoe.ua",
+ "p30world.com",
+ "snapnames.com",
+ "filmon.com",
+ "flipkey.com",
+ "rhhbschool.com",
+ "worldbank.org",
+ "proz.com",
+ "docusign.net",
+ "akakce.com",
+ "empflix.com",
+ "androidforums.com",
+ "mos.ru",
+ "contenko.com",
+ "malwarebytes.org",
+ "voyeurhit.com",
+ "filmvz.com",
+ "windowsazure.com",
+ "rlslog.net",
+ "zulagames.com",
+ "onlinefinder.net",
+ "blekko.com",
+ "tvb.com",
+ "mojomarketplace.com",
+ "warnerbros.com",
+ "rogers.com",
+ "sparkasse.at",
+ "bigcinema.tv",
+ "mattcutts.com",
+ "vemale.com",
+ "pgatour.com",
+ "bakusai.com",
+ "lavozdegalicia.es",
+ "style.com",
+ "torrentino.com",
+ "activeden.net",
+ "sweetpacks-search.com",
+ "pcstore.com.tw",
+ "starmedia.com",
+ "lycos.com",
+ "uncomo.com",
+ "caribbeancom.com",
+ "googleping.com",
+ "sondakika.com",
+ "premiumwp.com",
+ "tribune.com.pk",
+ "sc.com",
+ "91mobiles.com",
+ "elle.com",
+ "motortrend.com",
+ "starsports.com",
+ "otlan.com",
+ "planetminecraft.com",
+ "oregonlive.com",
+ "publichd.se",
+ "financialexpress.com",
+ "huxiu.com",
+ "hotwords.com",
+ "asda.com",
+ "impiego24.it",
+ "tunisia-sat.com",
+ "xojane.com",
+ "shiftdelete.net",
+ "hamshahrionline.ir",
+ "mp3.es",
+ "minutebuzz.com",
+ "footlocker.com",
+ "rusnovosti.ru",
+ "defencenet.gr",
+ "ndr.de",
+ "blogosfera.uol.com.br",
+ "quibids.com",
+ "soft32.com",
+ "davidwalsh.name",
+ "blogun.ru",
+ "webbirga.net",
+ "dict.cn",
+ "groupon.jp",
+ "abovetopsecret.com",
+ "contra.gr",
+ "zn.ua",
+ "jetbrains.com",
+ "myus.com",
+ "redbus.in",
+ "creativemarket.com",
+ "uainfo.org",
+ "rtbf.be",
+ "forexpf.ru",
+ "mainlink.ru",
+ "fantasti.cc",
+ "usagc.org",
+ "narutoget.com",
+ "trendyol.com",
+ "carsales.com.au",
+ "fujitv.co.jp",
+ "dardarkom.com",
+ "corrieredellosport.it",
+ "mcanime.net",
+ "nolo.com",
+ "beareyes.com.cn",
+ "familysearch.org",
+ "eprice.com.tw",
+ "indonetwork.co.id",
+ "geizhals.at",
+ "watchfreemovies.ch",
+ "siweiw.com",
+ "elnuevoherald.com",
+ "codecupdaters.com",
+ "p1.com",
+ "imhonet.ru",
+ "spox.com",
+ "spreadshirt.com",
+ "bittorrent.com",
+ "airberlin.com",
+ "epicurious.com",
+ "adverstitial.com",
+ "researchnow.com",
+ "lolnexus.com",
+ "xbabe.com",
+ "designmodo.com",
+ "hamusoku.com",
+ "radioshack.com",
+ "teamliquid.net",
+ "helpster.de",
+ "globalsources.com",
+ "fasttech.com",
+ "dickssportinggoods.com",
+ "j-sen.jp",
+ "smashwords.com",
+ "adversal.com",
+ "musiciansfriend.com",
+ "whoishostingthis.com",
+ "ads8.com",
+ "trend4pay.com",
+ "tribune.com",
+ "xsrving.com",
+ "youngleafs.com",
+ "gamersky.com",
+ "podio.com",
+ "state.pa.us",
+ "iphoneogram.com",
+ "datehookup.com",
+ "hbs.edu",
+ "ally.com",
+ "mitbbs.com",
+ "siasat.pk",
+ "miratuserie.tv",
+ "active.com",
+ "ricardoeletro.com.br",
+ "html.it",
+ "minnano-av.com",
+ "meetly.in",
+ "denverpost.com",
+ "supersport.com",
+ "grupobancolombia.com",
+ "freemake.com",
+ "bankier.pl",
+ "instapaper.com",
+ "derwesten.de",
+ "blogspot.hu",
+ "tamindir.com",
+ "play.pl",
+ "warthunder.com",
+ "team-bhp.com",
+ "freepeople.com",
+ "laposte.fr",
+ "cnews.ru",
+ "fayerwayer.com",
+ "hitta.se",
+ "hao123.com.eg",
+ "it-ebooks.info",
+ "freep.com",
+ "newser.com",
+ "lexilogos.com",
+ "polldaddy.com",
+ "auspost.com.au",
+ "aib.ie",
+ "cs.com.cn",
+ "providesupport.com",
+ "unblocksit.es",
+ "twittercounter.com",
+ "luisaviaroma.com",
+ "imgbabes.com",
+ "tharunee.lk",
+ "nexon.com",
+ "airliners.net",
+ "srf.ch",
+ "angel.co",
+ "tokyo-sports.co.jp",
+ "mt5.com",
+ "down1oads.com",
+ "vodonet.net",
+ "axar.az",
+ "taknaz.ir",
+ "google.com.py",
+ "ss.lv",
+ "stuffgate.com",
+ "giveawayoftheday.com",
+ "climatempo.com.br",
+ "xnxxmovies.com",
+ "heartinternet.co.uk",
+ "digikey.com",
+ "zimbra.free.fr",
+ "line.me",
+ "talkingpointsmemo.com",
+ "dyn.com",
+ "exacttarget.com",
+ "yourtango.com",
+ "shopping.com",
+ "king.com",
+ "crackberry.com",
+ "sm3na.com",
+ "matchesfashion.com",
+ "rk.com",
+ "ems.com.cn",
+ "xiaomi.cn",
+ "hillnews.com",
+ "geforce.com",
+ "internetslang.com",
+ "theoldreader.com",
+ "digitaljournal.com",
+ "aol.co.uk",
+ "straightdope.com",
+ "farfetch.com",
+ "lupoporno.com",
+ "ilgiornale.it",
+ "binzhi.com",
+ "loveplanet.ru",
+ "sogi.com.tw",
+ "googlevideo.com",
+ "nintendo.com",
+ "jreast.co.jp",
+ "coinad.com",
+ "keek.com",
+ "chegg.com",
+ "sparknotes.com",
+ "mywapblog.com",
+ "idlebrain.com",
+ "boardgamegeek.com",
+ "daserste.de",
+ "nicozon.net",
+ "ampnetzwerk.de",
+ "agenziaentrate.gov.it",
+ "apec.fr",
+ "redbull.com",
+ "listentoyoutube.com",
+ "diepresse.com",
+ "gohappy.com.tw",
+ "morguefile.com",
+ "dallasnews.com",
+ "adxpansion.com",
+ "almos3a.com",
+ "updatetube.com",
+ "lowyat.net",
+ "lolipop.jp",
+ "terafile.co",
+ "eversave.com",
+ "sportingnews.com",
+ "517dv.com",
+ "milfmovs.com",
+ "myflorida.com",
+ "brooonzyah.net",
+ "cdn-cachefront.net",
+ "ig.com",
+ "indiapost.gov.in",
+ "hangame.co.jp",
+ "ithemes.com",
+ "monova.org",
+ "udmserve.net",
+ "impactradius.com",
+ "teasernet.com",
+ "gmx.at",
+ "mmotraffic.com",
+ "citehr.com",
+ "viator.com",
+ "rt.ru",
+ "japannetbank.co.jp",
+ "zonealarm.com",
+ "ebayclassifieds.com",
+ "safecart.com",
+ "proptp.net",
+ "51hejia.com",
+ "telkomsel.com",
+ "deutschepost.de",
+ "startpagina.nl",
+ "alexaboostup.com",
+ "istgah.com",
+ "aufreeads.com",
+ "thinkstockphotos.com",
+ "similarsitesearch.com",
+ "gossiplankanews.com",
+ "venere.com",
+ "javascriptkit.com",
+ "square-enix.com",
+ "tvtoday.de",
+ "netaffiliation.com",
+ "computrabajo.com.mx",
+ "arioo.com",
+ "fromdoctopdf.com",
+ "lookany.com",
+ "bleepingcomputer.com",
+ "perfectmoney.com",
+ "dorkly.com",
+ "macmillandictionary.com",
+ "fotka.pl",
+ "porntubevidz.com",
+ "rj.gov.br",
+ "1.1.1.1",
+ "ebay.be",
+ "divxplanet.com",
+ "cyworld.com",
+ "biography.com",
+ "p1.cn",
+ "bazos.sk",
+ "55.la",
+ "lockerdome.com",
+ "yola.com",
+ "ccbill.com",
+ "groupon.de",
+ "okazii.ro",
+ "izismile.com",
+ "velvet.hu",
+ "news-postseven.com",
+ "ardmediathek.de",
+ "sagawa-exp.co.jp",
+ "sarzamindownload.com",
+ "pdfonline.com",
+ "gaaks.com",
+ "azhibo.com",
+ "pensador.uol.com.br",
+ "surveygizmo.com",
+ "familydoctor.com.cn",
+ "lazada.vn",
+ "guokr.com",
+ "enjoydressup.com",
+ "sky.de",
+ "afp.com",
+ "imujer.com",
+ "livescore.net",
+ "xinnet.com",
+ "mypageresults.com",
+ "safaribooksonline.com",
+ "extremetech.com",
+ "ecnavi.jp",
+ "babyblog.ru",
+ "practicalecommerce.com",
+ "vidspot.net",
+ "studymode.com",
+ "nation.co.ke",
+ "cpmrocket.com",
+ "es.wix.com",
+ "google.com.cu",
+ "pravda.ru",
+ "cda.pl",
+ "appszoom.com",
+ "selfhtml.org",
+ "zmovie.tw",
+ "dba.dk",
+ "domain.com",
+ "brightcove.com",
+ "lol55.com",
+ "textsale.ru",
+ "casualclub.com",
+ "gudvin.tv",
+ "torrentreactor.net",
+ "downloadcamp.com",
+ "eset.com",
+ "softonic.it",
+ "internations.org",
+ "retre.org",
+ "3quan.com",
+ "companieshouse.gov.uk",
+ "hautelook.com",
+ "edx.org",
+ "ono.es",
+ "jango.com",
+ "7sur7.be",
+ "spinrewriter.com",
+ "hqxnxx.com",
+ "elperiodico.com",
+ "arabiaweather.com",
+ "liansuo.com",
+ "pcgamer.com",
+ "offervault.com",
+ "mytheresa.com",
+ "memegenerator.net",
+ "gsm.ir",
+ "britannica.com",
+ "mensfitness.com",
+ "flaticon.com",
+ "newrelic.com",
+ "greatmmos.com",
+ "ifixit.com",
+ "aiyellow.com",
+ "my.tv.sohu.com/user/card",
+ "ce4arab.com",
+ "news-us.jp",
+ "slando.kz",
+ "redflagdeals.com",
+ "gsmhosting.com",
+ "raiffeisen.at",
+ "tagesspiegel.de",
+ "epravda.com.ua",
+ "bell.ca",
+ "sleazyneasy.com",
+ "dhnet.be",
+ "webcars.com.cn",
+ "freepik.es",
+ "androidpolice.com",
+ "cbr.ru",
+ "thanhnien.com.vn",
+ "shoptime.com.br",
+ "dailytelegraph.com.au",
+ "fastcodesign.com",
+ "full-stream.net",
+ "google.al",
+ "creativecow.net",
+ "centrum24.pl",
+ "openstat.ru",
+ "unfollowed.me",
+ "brb.to",
+ "babal.net",
+ "ibotoolbox.com",
+ "torrentdownloads.me",
+ "miami.com",
+ "mubasher.info",
+ "patient.co.uk",
+ "ayudawordpress.com",
+ "makepolo.com",
+ "exactseek.com",
+ "echosign.com",
+ "epson.com",
+ "somo.vn",
+ "tripadvisor.jp",
+ "bikroy.com",
+ "postimees.ee",
+ "band.uol.com.br",
+ "adopteunmec.com",
+ "imgserve.net",
+ "toofab.com",
+ "neeu.com",
+ "mailjet.com",
+ "kinja.com",
+ "qwertypay.com",
+ "cosme.net",
+ "dreammovies.com",
+ "avvo.com",
+ "wenyard.com",
+ "dir.bg",
+ "digital-photography-school.com",
+ "peru.com",
+ "thomsonreuters.com",
+ "grazia.com.cn",
+ "vivastreet.co.in",
+ "officemax.com",
+ "creditmutuel.fr",
+ "themify.me",
+ "ait-themes.com",
+ "share-links.biz",
+ "graphixshare.com",
+ "theoutnet.com",
+ "revolvermaps.com",
+ "careers360.com",
+ "tyroodr.com",
+ "escapistmagazine.com",
+ "ofreegames.com",
+ "surveryewadcentrez.eu",
+ "notebookcheck.net",
+ "k2s.cc",
+ "barstoolsports.com",
+ "townhall.com",
+ "mk.co.kr",
+ "epochtimes.com",
+ "arduino.cc",
+ "blogcms.jp",
+ "udacity.com",
+ "habervaktim.com",
+ "funweek.it",
+ "techtunes.com.bd",
+ "shopzilla.com",
+ "sun-sentinel.com",
+ "tfile.me",
+ "novafile.com",
+ "eurogamer.net",
+ "thenewporn.com",
+ "tuttosport.com",
+ "sverve.com",
+ "simplemachines.org",
+ "nginx.org",
+ "kepu.com.cn",
+ "jxedt.com",
+ "southparkstudios.com",
+ "gusuwang.com",
+ "utrace.de",
+ "peperonity.de",
+ "hvg.hu",
+ "cairodar.com",
+ "mappy.com",
+ "kouclo.com",
+ "my.tv.sohu.com/user/lucky",
+ "lushstories.com",
+ "stocktwits.com",
+ "atlantico.fr",
+ "baihe.com",
+ "wowkeren.com",
+ "v7n.com",
+ "mozilla.com",
+ "centurylink.net",
+ "1001freefonts.com",
+ "pubdirecte.com",
+ "mercadolibre.com.pe",
+ "vandelaydesign.com",
+ "cpaelites.com",
+ "wanyh.com",
+ "propertyguru.com.sg",
+ "esy.es",
+ "torrentbutler.eu",
+ "final.ir",
+ "53.com",
+ "clips4sale.com",
+ "freerepublic.com",
+ "huffingtonpost.de",
+ "boards.ie",
+ "fluege.de",
+ "parents.com",
+ "gimp.org",
+ "adorocinema.com",
+ "yelp.ca",
+ "twicsy.com",
+ "kuaibo.com",
+ "gnu.org",
+ "parsine.com",
+ "jpc.com",
+ "cloudapp.net",
+ "expatriates.com",
+ "sproutsocial.com",
+ "natemat.pl",
+ "livingrichwithcoupons.com",
+ "x-ho.com",
+ "adv-adserver.com",
+ "downloadchop.com",
+ "sagepub.com",
+ "eleconomista.com.mx",
+ "formula1.com",
+ "quackit.com",
+ "dlsite.com",
+ "powned.tv",
+ "stream-tv.me",
+ "mindbodyonline.com",
+ "mindmeister.com",
+ "twitlonger.com",
+ "ebay.ie",
+ "deccanchronicle.com",
+ "domaintuno.com",
+ "thethirdmedia.com",
+ "laiguana.tv",
+ "flurry.com",
+ "eloqua.com",
+ "createsend.com",
+ "hrloo.com",
+ "interfax.com.ua",
+ "admin.ch",
+ "zgzcw.com",
+ "bancoestado.cl",
+ "fda.gov",
+ "chinayes.com",
+ "beslist.nl",
+ "crossfit.com",
+ "skai.gr",
+ "covers.com",
+ "antpoker.com",
+ "perfectworld.com",
+ "momdot.com",
+ "1c-bitrix.ru",
+ "feiren.com",
+ "navitime.co.jp",
+ "siliconindia.com",
+ "warning.or.kr",
+ "qatarliving.com",
+ "uber.com",
+ "ing-diba.de",
+ "boldsky.com",
+ "animeid.tv",
+ "tom.com",
+ "whatsmyserp.com",
+ "ftbpro.com",
+ "yobt.tv",
+ "toluna.com",
+ "burrp.com",
+ "viber.com",
+ "df.eu",
+ "vatera.hu",
+ "songmeanings.com",
+ "smbc-card.com",
+ "hip2save.com",
+ "wmzona.com",
+ "banamex.com",
+ "chinaacc.com",
+ "t-online.hu",
+ "indianpornvideos.com",
+ "runescape.com",
+ "wapka.mobi",
+ "115.com",
+ "blogspot.no",
+ "aksam.com.tr",
+ "bankcomm.com",
+ "giantbomb.com",
+ "maxcdn.com",
+ "topshop.com",
+ "livescores.com",
+ "rosbalt.ru",
+ "gandi.net",
+ "ioffer.com",
+ "mihandownload.com",
+ "eweb4.com",
+ "britishcouncil.org",
+ "cheetahmail.com",
+ "vbulletin.com",
+ "bradsdeals.com",
+ "empowernetwork.com/commissionloophole",
+ "vueling.com",
+ "raventools.com",
+ "yext.com",
+ "everychina.com",
+ "reduxmediia.com",
+ "openstreetmap.org",
+ "wed114.cn",
+ "dzwww.com",
+ "miibeian.gov.cn",
+ "ufl.edu",
+ "deseretnews.com",
+ "presstv.ir",
+ "copy.com",
+ "fourhourworkweek.com",
+ "buzztheme.net",
+ "bollywoodlife.com",
+ "redtubelive.com",
+ "pengyou.com",
+ "antaranews.com",
+ "selectornews.com",
+ "lavoz.com.ar",
+ "avm.de",
+ "flalottery.com",
+ "jmp9.com",
+ "baltimoresun.com",
+ "mozillazine.org",
+ "dnevnik.hr",
+ "aebn.net",
+ "mightydeals.com",
+ "livescore.eu",
+ "publipt.com",
+ "xbmc.org",
+ "scmp.com",
+ "sbobet.com",
+ "alpari.ru",
+ "harborfreight.com",
+ "linio.com.pe",
+ "2500sz.com",
+ "rdio.com",
+ "bearshare.com",
+ "thetrainline.com",
+ "888poker.es",
+ "filecrop.com",
+ "twiends.com",
+ "elnuevodia.com",
+ "rasekhoon.net",
+ "36.cn",
+ "axeso5.com",
+ "mzamin.com",
+ "webmastersitesi.com",
+ "thinkdigit.com",
+ "lifescript.com",
+ "experian.com",
+ "adorama.com",
+ "d1net.com",
+ "torrentz.pro",
+ "fullhdfilmizle.org",
+ "space.com",
+ "collider.com",
+ "zalando.it",
+ "slate.fr",
+ "carmax.com",
+ "recode.net",
+ "gfan.com",
+ "fonts.com",
+ "honda.com",
+ "ecwid.com",
+ "debate.com.mx",
+ "bmail.uol.com.br",
+ "santandernet.com.br",
+ "coderanch.com",
+ "lyricsmode.com",
+ "gametrailers.com",
+ "3600.com",
+ "designboom.com",
+ "131.com",
+ "finam.ru",
+ "df.gob.mx",
+ "85dcf732d593.se",
+ "coches.net",
+ "dhs.gov",
+ "neurs.com",
+ "poppen.de",
+ "public-api.wordpress.com",
+ "magnovideo.com",
+ "squareup.com",
+ "balagana.net",
+ "goodsearch.com",
+ "blog.ir",
+ "ne10.uol.com.br",
+ "di.se",
+ "sinembargo.mx",
+ "k618.cn",
+ "eventim.de",
+ "mysavings.com",
+ "futureshop.ca",
+ "spinding.com",
+ "landsend.com",
+ "oqenadserving.com",
+ "here.com",
+ "upi.com",
+ "picresize.com",
+ "abnamro.nl",
+ "filenuke.com",
+ "yxku.com",
+ "mypearson.com",
+ "dinakaran.com",
+ "correos.es",
+ "hotchatdirect.com",
+ "markafoni.com",
+ "gofuckbiz.com",
+ "webfindpage.com",
+ "cancan.ro",
+ "hostgator.in",
+ "latribune.fr",
+ "adxite.com",
+ "mofos.com",
+ "bluewin.ch",
+ "24ur.com",
+ "dion.ne.jp",
+ "vpsdomain3.eu",
+ "newsweek.com",
+ "oasgames.com",
+ "mtv3.fi",
+ "internetworld.de",
+ "yatedo.com",
+ "globaltimes.cn",
+ "paddypower.com",
+ "berlin1.de",
+ "norwegian.com",
+ "opteck.com",
+ "zenfolio.com",
+ "kakprosto.ru",
+ "ecosia.org",
+ "check24.de",
+ "idbibank.co.in",
+ "zoomit.ir",
+ "notebooksbilliger.de",
+ "torontosun.com",
+ "egopay.com",
+ "cnnexpansion.com",
+ "emoneyspace.com",
+ "rsport.ru",
+ "fok.nl",
+ "mql4.com",
+ "inhabitat.com",
+ "tqn.com",
+ "noticierodigital.com",
+ "wrike.com",
+ "bazos.cz",
+ "phonegap.com",
+ "microlancer.com",
+ "anipo.jp",
+ "fotocommunity.de",
+ "kuwo.cn",
+ "chinacaipu.com",
+ "terra.cl",
+ "500px.org",
+ "qantas.com.au",
+ "advertising.com",
+ "push2check.net",
+ "livefyre.com",
+ "philstar.com",
+ "erail.in",
+ "mywebgrocer.com",
+ "der-postillon.com",
+ "ru-board.com",
+ "saramin.co.kr",
+ "yjbys.com",
+ "aaa.com",
+ "flavorwire.com",
+ "fcbarcelona.com",
+ "lacentrale.fr",
+ "googlegroups.com",
+ "luck4.me",
+ "catho.com.br",
+ "centauro.com.br",
+ "sia.az",
+ "forumactif.com",
+ "paltalk.com",
+ "beyond.com",
+ "occ.com.mx",
+ "stamps.com",
+ "getoffmyinternets.net",
+ "mbok.jp",
+ "cleveland.com",
+ "ucdavis.edu",
+ "tielabs.com",
+ "hkgolden.com",
+ "vandal.net",
+ "lyst.com",
+ "mrskin.com",
+ "bunshun.jp",
+ "netcarshow.com",
+ "b1.org",
+ "hromadske.tv",
+ "sf-express.com",
+ "pirateproxy.ca",
+ "getcashforsurveys.com",
+ "clikz4freakz.com",
+ "adsupply.com",
+ "truste.org",
+ "boxuu.com",
+ "webartex.ru",
+ "usc.edu",
+ "moo.com",
+ "winkal.com",
+ "deloitte.com",
+ "xvideos-field5.com",
+ "suomi24.fi",
+ "flexmls.com",
+ "weeklystandard.com",
+ "debenhams.com",
+ "mejortorrent.com",
+ "vconnect.com",
+ "ligatus.com",
+ "skynewsarabia.com",
+ "herschina.com",
+ "92lux.cn",
+ "care.com",
+ "chip.com.tr",
+ "tangdou.com",
+ "vatanbilgisayar.com",
+ "uppit.com",
+ "metronews.fr",
+ "parenting.com.tw",
+ "meteo.gr",
+ "meetgee.com",
+ "ldlc.com",
+ "ubs.com",
+ "elcolombiano.com",
+ "mafengwo.cn",
+ "moodle.org",
+ "asiaone.com",
+ "huffingtonpost.it",
+ "ipas2free.com",
+ "casa.it",
+ "kaiserpermanente.org",
+ "listindiario.com",
+ "treehugger.com",
+ "payeer.com",
+ "mypoints.com",
+ "pjmedia.com",
+ "foreca.com",
+ "luxup.ru",
+ "halifax.co.uk",
+ "webinarjam.net",
+ "webmeup.com",
+ "webdesignledger.com",
+ "rte.ie",
+ "18andabused.com",
+ "vbulletin.org",
+ "apne.tv",
+ "immoweb.be",
+ "colonelcassad.livejournal.com",
+ "atlassian.com",
+ "investors.com",
+ "globalbux.net",
+ "wechat.com",
+ "kanoon.ir",
+ "mawaly.com",
+ "self.com",
+ "drive.ru",
+ "autozone.com",
+ "creditonebank.com",
+ "fdj.fr",
+ "hsbc.com.br",
+ "desk.com",
+ "dlvr.it",
+ "wpml.org",
+ "newmobilelife.com",
+ "crosswalk.com",
+ "thehun.com",
+ "hobbyking.com",
+ "tiantian.com",
+ "hichina.com",
+ "cyanogenmod.org",
+ "horoscope.com",
+ "bizsugar.com",
+ "popularmechanics.com",
+ "egaliteetreconciliation.fr",
+ "eol.cn",
+ "rzd.ru",
+ "escalatenetwork.net",
+ "yad2.co.il",
+ "cna.com.tw",
+ "zi-m.com",
+ "leonardo.it",
+ "ap.gov.in",
+ "rakuten.de",
+ "wallsave.com",
+ "netzwelt.de",
+ "bitrix24.ru",
+ "techinasia.com",
+ "bitstamp.net",
+ "hostelbookers.com",
+ "shoplocal.com",
+ "200please.com",
+ "tune-up.com",
+ "mapy.cz",
+ "dealnews.com",
+ "livescore.co.uk",
+ "seocentro.com",
+ "rstyle.me",
+ "neoseeker.com",
+ "kaban.tv",
+ "visualstudio.com",
+ "cinetux.org",
+ "groupon.com.br",
+ "lastpass.com",
+ "rincondelvago.com",
+ "popsci.com",
+ "2144.cn",
+ "clickfair.com",
+ "dsebd.org",
+ "banesco.com",
+ "spi0n.com",
+ "blogspot.cz",
+ "tnews.ir",
+ "nme.com",
+ "paperblog.com",
+ "firstcry.com",
+ "tophotels.ru",
+ "liepin.com",
+ "korabia.com",
+ "ifttt.com",
+ "aemet.es",
+ "alot.com",
+ "manutd.com",
+ "edreams.es",
+ "turkcell.com.tr",
+ "eva.vn",
+ "techpowerup.com",
+ "vkrugudruzei.ru",
+ "feed2all.eu",
+ "thehindubusinessline.com",
+ "express.de",
+ "ixquick.com",
+ "thrillist.com",
+ "iqilu.com",
+ "seriouseats.com",
+ "edgesuite.net",
+ "telexads.com",
+ "alza.cz",
+ "en-japan.com",
+ "al.com",
+ "dota2lounge.com",
+ "totalping.com",
+ "seocheki.net",
+ "iceporn.com",
+ "col3negoriginel.lk",
+ "porsyar.com",
+ "property24.com",
+ "madamenoire.com",
+ "markethealth.com",
+ "alphacoders.com",
+ "webempresa.com",
+ "empireonline.com",
+ "downforeveryoneorjustme.com",
+ "lankadeepa.lk",
+ "darty.com",
+ "census.gov",
+ "wapka.me",
+ "kdslife.com",
+ "jpost.com",
+ "cricfree.tv",
+ "7xxxtube.com",
+ "businesscatalyst.com",
+ "dilbert.com",
+ "gaymaletube.com",
+ "bellanaija.com",
+ "renfe.es",
+ "equifax.com",
+ "pornmaki.com",
+ "lolesports.com",
+ "yunfan.com",
+ "everybitcity.com",
+ "9yao.com",
+ "avantlink.com",
+ "paginebianche.it",
+ "xrosview.com",
+ "newsday.com",
+ "usportnews.com",
+ "petapixel.com",
+ "pistonheads.com",
+ "lidovky.cz",
+ "cvent.com",
+ "adlandpro.com",
+ "wikisource.org",
+ "ename.com",
+ "prosport.ro",
+ "sharebuilder.com",
+ "prisjakt.nu",
+ "cw.com.tw",
+ "datafilehost.com",
+ "aircanada.com",
+ "osu.edu",
+ "linuxmint.com",
+ "toyota.com",
+ "google.am",
+ "adobeconnect.com",
+ "h33t.to",
+ "companycheck.co.uk",
+ "juno.com",
+ "beitaichufang.com",
+ "alaskaair.com",
+ "tipsandtricks-hq.com",
+ "yourstory.com",
+ "wow-impulse.ru",
+ "wishpond.com",
+ "promosite.ru",
+ "weddingwire.com",
+ "icicidirect.com",
+ "mouser.com",
+ "shopstyle.co.uk",
+ "sinemalar.com",
+ "addurl.nu",
+ "seccionamarilla.com.mx",
+ "yllix.com",
+ "motorola.com",
+ "huawei.com",
+ "mp3juices.com",
+ "fitday.com",
+ "pakwheels.com",
+ "uploading.com",
+ "snapwidget.com",
+ "rsb.ru",
+ "mturk.com",
+ "libreoffice.org",
+ "acer.com",
+ "rd.com",
+ "aa.com.tr",
+ "glamour.com",
+ "docnhat.net",
+ "cnbb.com.cn",
+ "piwik.org",
+ "mycompanyadmin.com",
+ "ohozaa.com",
+ "fox.com",
+ "mastercard.com.au",
+ "microsofttranslator.com",
+ "myhabit.com",
+ "acesso.uol.com.br",
+ "cqnews.net",
+ "default-search.net",
+ "juntadeandalucia.es",
+ "carigold.com",
+ "tweepi.com",
+ "gamedog.cn",
+ "videomega.tv",
+ "softarchive.net",
+ "akamai.com",
+ "adorika.net",
+ "zorpia.com",
+ "bitdefender.com",
+ "formstack.com",
+ "al3abbarq.com",
+ "ruelala.com",
+ "andhrajyothy.com",
+ "siteheart.com",
+ "spankbang.com",
+ "buxp.org",
+ "subtlepatterns.com",
+ "cucirca.eu",
+ "apontador.com.br",
+ "sbs.co.kr",
+ "rong360.com",
+ "billmelater.com",
+ "nowdownload.ch",
+ "pingmyurl.com",
+ "main.jp",
+ "allabolag.se",
+ "fastspring.com",
+ "20d625b48e.se",
+ "wpzoom.com",
+ "dl-protect.com",
+ "onvista.de",
+ "iberia.com",
+ "learni.st",
+ "minijuegos.com",
+ "ae.com",
+ "india-forums.com",
+ "port.hu",
+ "truelocal.com.au",
+ "ziprecruiter.com",
+ "toyokeizai.net",
+ "24timezones.com",
+ "tzetze.it",
+ "the-village.ru",
+ "ptcapusa.com",
+ "indiaresults.com",
+ "desjardins.com",
+ "nchsoftware.com",
+ "yasdl.com",
+ "delo.ua",
+ "baskino.com",
+ "salary.com",
+ "freecontact.com",
+ "wumii.com",
+ "ssc.nic.in",
+ "synology.com",
+ "nttdocomo.co.jp",
+ "racing-games.com",
+ "freeonlinegames.com",
+ "aftabnews.ir",
+ "zumi.pl",
+ "efshop.com.tw",
+ "hawamer.com",
+ "eastbay.com",
+ "izvestia.ru",
+ "mosaiquefm.net",
+ "twitchy.com",
+ "slaati.com",
+ "bookingbuddy.com",
+ "networksolutionsemail.com",
+ "etsystatic.com",
+ "sina.com",
+ "asiandatingbeauties.com",
+ "blogs.com",
+ "france3.fr",
+ "healthcentral.com",
+ "downloadatoz.com",
+ "matthewwoodward.co.uk",
+ "legalzoom.com",
+ "phun.org",
+ "campaignmonitor.com",
+ "cifraclub.com.br",
+ "hir24.hu",
+ "twoplustwo.com",
+ "hotshame.com",
+ "arvixededicated.com",
+ "designcrowd.com",
+ "mrexcel.com",
+ "blu-ray.com",
+ "bundesliga.de",
+ "comments.ua",
+ "filmstarts.de",
+ "3sk.tv",
+ "donedeal.ie",
+ "natunbarta.com",
+ "forex-mmcis.com",
+ "lifehacker.ru",
+ "sitepronews.com",
+ "tudogostoso.com.br",
+ "titanfall.com",
+ "brainpickings.org",
+ "saharareporters.com",
+ "vidto.me",
+ "mlit.go.jp",
+ "terapeak.com",
+ "techweb.com.cn",
+ "premiere.fr",
+ "kanui.com.br",
+ "asianetnews.tv",
+ "cric.lk",
+ "exxxtrasmall.com",
+ "hiphopdx.com",
+ "5617.com",
+ "namepros.com",
+ "humanmetrics.com",
+ "allin1convert.com",
+ "ox.ac.uk",
+ "msecnd.net",
+ "cathaypacific.com",
+ "bet365affiliates.com",
+ "tcs.com",
+ "trafficestimate.com",
+ "lmgtfy.com",
+ "finance.ua",
+ "find404.com",
+ "pagesperso-orange.fr",
+ "curbed.com",
+ "tasteofhome.com",
+ "ar15.com",
+ "mydigitallife.info",
+ "promiflash.de",
+ "technobuffalo.com",
+ "gamestorrents.com",
+ "labirint.ru",
+ "pclab.pl",
+ "indiatvnews.com",
+ "finya.de",
+ "redmondpie.com",
+ "rabota.ru",
+ "share-online.biz",
+ "packtpub.com",
+ "techgig.com",
+ "shaw.ca",
+ "apkmania.co",
+ "bet-at-home.com",
+ "barclaycard.co.uk",
+ "onefloorserve.com",
+ "raiffeisen.ru",
+ "t-nation.com",
+ "mbalib.com",
+ "staseraintv.com",
+ "uswitch.com",
+ "smartadserver.com",
+ "bbcgoodfood.com",
+ "elitetorrent.net",
+ "backlinko.com",
+ "naszemiasto.pl",
+ "submitexpress.com",
+ "savings.com",
+ "gem.pl",
+ "ahlamontada.com",
+ "fotomac.com.tr",
+ "gougou.com",
+ "payamsara.com",
+ "klix.ba",
+ "doostiha.ir",
+ "bibliocommons.com",
+ "wealthyaffiliate.com",
+ "emgn.com",
+ "sifyitest.com",
+ "washingtonexaminer.com",
+ "rakuten-sec.co.jp",
+ "mysurvey.com",
+ "uuu9.com",
+ "uscourts.gov",
+ "showroomprive.com",
+ "cargocollective.com",
+ "hsoub.com",
+ "afterbuy.de",
+ "marunadanmalayali.com",
+ "jumponhottie.com",
+ "avon.com",
+ "lazada.com.my",
+ "51netu.com.cn",
+ "ria.com",
+ "sankakucomplex.com",
+ "tvline.com",
+ "devshed.com",
+ "superherohype.com",
+ "tv-series.me",
+ "stylecraze.com",
+ "wizards.com",
+ "linkcollider.com",
+ "xinjunshi.com",
+ "bestchange.ru",
+ "1111.com.tw",
+ "fakenamegenerator.com",
+ "newsmth.net",
+ "noupe.com",
+ "marketingprofs.com",
+ "bluestacks.com",
+ "jemtube.com",
+ "bestbuy.ca",
+ "backcountry.com",
+ "designshack.net",
+ "pond5.com",
+ "highsnobiety.com",
+ "rtl.fr",
+ "pearsoncmg.com",
+ "hellowork.go.jp",
+ "koimoi.com",
+ "soali.ir",
+ "incentria.com",
+ "vagas.com.br",
+ "huaxi100.com",
+ "cheaa.com",
+ "lohaco.jp",
+ "gov.on.ca",
+ "fabthemes.com",
+ "pipl.com",
+ "comscore.com",
+ "pcfinancial.ca",
+ "craigslist.co.in",
+ "michaels.com",
+ "jibjab.com",
+ "sankeibiz.jp",
+ "dominos.co.in",
+ "supermoney.eu",
+ "itusozluk.com",
+ "sdchina.com",
+ "allkpop.com",
+ "cam4.com.br",
+ "stayfriends.de",
+ "futbol24.com",
+ "searchina.net",
+ "sgcpanel.com",
+ "informe21.com",
+ "alsacreations.com",
+ "crateandbarrel.com",
+ "alliancewarfare.com",
+ "filerio.in",
+ "emailsrvr.com",
+ "reventmedia.com",
+ "vietcombank.com.vn",
+ "rxlist.com",
+ "acidcow.com",
+ "orange.co.uk",
+ "hellocoton.fr",
+ "boldchat.com",
+ "psychcentral.com",
+ "surfline.com",
+ "xxxkinky.com",
+ "es.wordpress.com",
+ "publika.az",
+ "shufoo.net",
+ "hertz.com",
+ "businessweekly.com.tw",
+ "virgula.uol.com.br",
+ "linkis.com",
+ "ixwebhosting.com",
+ "usa.gov",
+ "linguee.com",
+ "yengo.com",
+ "huffingtonpost.jp",
+ "1x3x.com",
+ "mediametrics.ru",
+ "ec21.com",
+ "80018.cn",
+ "get-tune.net",
+ "yupoo.com",
+ "moviepilot.de",
+ "ihned.cz",
+ "fio.cz",
+ "pubted.com",
+ "cinemablend.com",
+ "stooorage.com",
+ "thevault.bz",
+ "journaldugeek.com",
+ "sommer-sommer.com",
+ "travelchannel.com",
+ "softonic.de",
+ "petsmart.com",
+ "ufxmarkets.com",
+ "e24.no",
+ "spirit.com",
+ "dabi.ir",
+ "admin5.net",
+ "serialu.net",
+ "vancouversun.com",
+ "submanga.com",
+ "sbicard.com",
+ "affaritaliani.it",
+ "idownloadblog.com",
+ "castorama.fr",
+ "sudouest.fr",
+ "payscale.com",
+ "serebii.net",
+ "storypick.com",
+ "jobkorea.co.kr",
+ "gowildcasino.com",
+ "hmetro.com.my",
+ "parimatch.com",
+ "51pinwei.com",
+ "globalnews.ca",
+ "mercadopago.com",
+ "sixrevisions.com",
+ "saisoncard.co.jp",
+ "gov.kz",
+ "gossip-tv.gr",
+ "zbozi.cz",
+ "aliorbank.pl",
+ "huanqiuauto.com",
+ "okaz.com.sa",
+ "cplusplus.com",
+ "mochimedia.com",
+ "google.sn",
+ "jquery-plugins.net",
+ "peoplesmart.com",
+ "mmafighting.com",
+ "ponpare.jp",
+ "porsche.com",
+ "charter.com",
+ "scrabblefinder.com",
+ "unpcn.com",
+ "loveaholics.com",
+ "geocities.co.jp",
+ "ladbrokes.com",
+ "52che.com",
+ "swansonvitamins.com",
+ "sweetwater.com",
+ "ali213.net",
+ "savenkeep.com",
+ "hotair.com",
+ "orgasmatrix.com",
+ "runrun.es",
+ "filezilla-project.org",
+ "looti.net",
+ "pagesix.com",
+ "twentytwowords.com",
+ "gingersoftware.com",
+ "youxiduo.com",
+ "isimtescil.net",
+ "rui.jp",
+ "d1g.com",
+ "2dbook.com",
+ "zigzig.ir",
+ "123telugu.com",
+ "wdr.de",
+ "hankyung.com",
+ "pr.com",
+ "search.ch",
+ "iranproud.com",
+ "raaga.com",
+ "alt1040.com",
+ "okpay.com",
+ "recordchina.co.jp",
+ "dreamincode.net",
+ "bendibao.com",
+ "creativelive.com",
+ "socialoomph.com",
+ "cssdeck.com",
+ "taxactonline.com",
+ "pb.com",
+ "fnac.es",
+ "ucsd.edu",
+ "tmart.com",
+ "whorush.com",
+ "spicejet.com",
+ "socialadr.com",
+ "tutorialzine.com",
+ "christianmingle.com",
+ "torrentleech.org",
+ "statefarm.com",
+ "orkut.com",
+ "whoscored.com",
+ "truthaboutonlinesluts.com",
+ "32red.com",
+ "wp-themes.com",
+ "adpost.com",
+ "cnr.cn",
+ "180upload.com",
+ "snagajob.com",
+ "textbroker.com",
+ "freshome.com",
+ "talkgold.com",
+ "dudamobile.com",
+ "weblancer.net",
+ "newone.org",
+ "nacion.com",
+ "takepart.com",
+ "voici.fr",
+ "gizmodo.jp",
+ "viki.com",
+ "symbaloo.com",
+ "topface.com",
+ "businessdictionary.com",
+ "adtech.info",
+ "elandroidelibre.com",
+ "fux.com",
+ "21-sun.com",
+ "cpmfx.com",
+ "siemens.com",
+ "edmodo.com",
+ "notitarde.com",
+ "babypips.com",
+ "silkroad.com",
+ "onextrapixel.com",
+ "notdoppler.com",
+ "walmart.ca",
+ "marvel.com",
+ "groupon.fr",
+ "us1.com",
+ "bunte.de",
+ "findlaw.com",
+ "topito.com",
+ "carrefour.fr",
+ "aawsat.com",
+ "super.ae",
+ "kicktipp.de",
+ "simplyrecipes.com",
+ "i-mobile.co.jp",
+ "podrobnosti.ua",
+ "snn.ir",
+ "successfactors.com",
+ "paixie.net",
+ "wiwo.de",
+ "glowgaze.com",
+ "mapsofworld.com",
+ "limetorrents.com",
+ "plarium.com",
+ "tvi.ua",
+ "corel.com",
+ "adhitprofits.com",
+ "findthecompany.com",
+ "noticiasaldiayalahora.co",
+ "160by2.com",
+ "jobberman.com",
+ "rus.ec",
+ "fujitsu.com",
+ "ladepeche.fr",
+ "pravda.sk",
+ "wwtdd.com",
+ "b9dm.com",
+ "marathonbet.com",
+ "sexlunch.com",
+ "komputronik.pl",
+ "gutenberg.org",
+ "dizo.com.cn",
+ "comunio.de",
+ "naked.com",
+ "gamesradar.com",
+ "moneysupermarket.com",
+ "cheaptickets.com",
+ "assembla.com",
+ "timesonline.co.uk",
+ "mckinsey.com",
+ "ebook3000.com",
+ "videoblocks.com",
+ "ruseller.com",
+ "pideo.net",
+ "joomlacode.org",
+ "pciconcursos.com.br",
+ "channelnewsasia.com",
+ "cnnturk.com",
+ "consultant.ru",
+ "michigan.gov",
+ "manoto1.com",
+ "10010.com",
+ "wholefoodsmarket.com",
+ "globalgrind.com",
+ "pichak.net",
+ "morpakampus.com",
+ "crazydomains.com.au",
+ "uptodown.com",
+ "polygon.com",
+ "raspberrypi.org",
+ "atmarkit.co.jp",
+ "heftig.co",
+ "informationweek.com",
+ "trendhunter.com",
+ "state.ny.us",
+ "pornpros.com",
+ "tnt.com",
+ "sportal.bg",
+ "spritzinc.com",
+ "theladders.com",
+ "lulu.com",
+ "applesfera.com",
+ "qoo10.jp",
+ "notebookreview.com",
+ "startertv.fr",
+ "healthkart.com",
+ "imgsin.com",
+ "mp3olimp.net",
+ "readms.com",
+ "casadellibro.com",
+ "nalog.ru",
+ "4gamer.net",
+ "jquery4u.com",
+ "betfred.com",
+ "3dwwwgame.com",
+ "appleinsider.com",
+ "dailystar.co.uk",
+ "swalif.com",
+ "hushmail.com",
+ "worldtimebuddy.com",
+ "sportschau.de",
+ "mediatraffic.com",
+ "gismeteo.ua",
+ "record.com.mx",
+ "putnik1.livejournal.com",
+ "nextbigwhat.com",
+ "vinescope.com",
+ "jarchi.ir",
+ "yidio.com",
+ "dunyanews.tv",
+ "hangseng.com",
+ "interpark.com",
+ "scholastic.com",
+ "penny-arcade.com",
+ "geilundlive.com",
+ "budbi.com",
+ "stop55.com",
+ "jaidefinichon.com",
+ "smartsheet.com",
+ "vector.me",
+ "farecompare.com",
+ "vodafone.com.eg",
+ "craftsy.com",
+ "theresumator.com",
+ "downloadab.com",
+ "abendzeitung-muenchen.de",
+ "dicio.com.br",
+ "fobshanghai.com",
+ "2dehands.be",
+ "thethao247.vn",
+ "cams.com",
+ "gothamist.com",
+ "moneynews.com",
+ "zocdoc.com",
+ "rol.ro",
+ "nic.ar",
+ "avenues.info",
+ "cleverbridge.com",
+ "usajobs.gov",
+ "divxstage.eu",
+ "jsticket.net",
+ "himasoku.com",
+ "thrivethemes.com",
+ "orientaltrading.com",
+ "premiumpress.com",
+ "house365.com",
+ "drugoi.livejournal.com",
+ "monster.co.uk",
+ "quickanddirtytips.com",
+ "virtuemart.net",
+ "huffpost.com",
+ "real.com",
+ "teacherspayteachers.com",
+ "t24.com.tr",
+ "zakon.kz",
+ "shoppinglifestyle.com",
+ "trendmicro.com",
+ "surfingbird.ru",
+ "cam.ac.uk",
+ "navyfederal.org",
+ "rateyourmusic.com",
+ "bravenet.com",
+ "polo.com",
+ "cl.ly",
+ "nanacast.com",
+ "cnfol.com",
+ "24option.com",
+ "myscienceacademy.org",
+ "getsoftfree.com",
+ "cba.pl",
+ "templateism.com",
+ "actudesfinances.org",
+ "1.254.254.254",
+ "jobtalk.jp",
+ "barbie.com",
+ "rahnama.com",
+ "gigporno.com",
+ "buddypress.org",
+ "corporationwiki.com",
+ "enorth.com.cn",
+ "thepioneerwoman.com",
+ "cam4ultimate.com",
+ "phpclasses.org",
+ "uplus.metroer.com/~content",
+ "komando.com",
+ "iha.com.tr",
+ "televisa.com",
+ "tmtpost.com",
+ "classifiedsgiant.com",
+ "sportinglife.com",
+ "askul.co.jp",
+ "travelagency.travel",
+ "jqueryscript.net",
+ "rusfolder.com",
+ "netcq.net",
+ "irangrand.ir",
+ "interaztv.com",
+ "downvids.net",
+ "mongodb.org",
+ "nasgo.net",
+ "thesitewizard.com",
+ "songspk.cc",
+ "travelandleisure.com",
+ "d-h.st",
+ "wasanga.com",
+ "cgg.gov.in",
+ "silverclix.com",
+ "almogaz.com",
+ "sexmob.es",
+ "mistreci.com",
+ "nukistream.com",
+ "postaffiliatepro.com",
+ "dish.com",
+ "ulta.com",
+ "worldcat.org",
+ "crackle.com",
+ "cineblog01.net",
+ "parispornmovies.com",
+ "avito.ma",
+ "nethouse.ru",
+ "elfinanciero.com.mx",
+ "ab-in-den-urlaub.de",
+ "pixeden.com",
+ "thetimenow.com",
+ "divar.ir",
+ "coolrom.com",
+ "akbank.com",
+ "saturn.de",
+ "dstv.com",
+ "mttbsystem.com",
+ "hujiang.com",
+ "bash.im",
+ "sextgem.com",
+ "subaonet.com",
+ "cnsnews.com",
+ "informationng.com",
+ "utoronto.ca",
+ "hetzner.de",
+ "vend-o.com",
+ "cybozu.com",
+ "autotimes.com.cn",
+ "5giay.vn",
+ "theepochtimes.com",
+ "penesalud.com",
+ "livenation.com",
+ "qoinpro.com",
+ "myway.com",
+ "safe-swaps.com",
+ "elephantjournal.com",
+ "curse.com",
+ "17zwd.com",
+ "hitleap.com",
+ "mec.gov.br",
+ "freewebcams.com",
+ "westelm.com",
+ "imagegals.com",
+ "streeteasy.com",
+ "ekitan.com",
+ "git-scm.com",
+ "p30day.com",
+ "kapaza.be",
+ "svoboda.org",
+ "google.mg",
+ "timesofisrael.com",
+ "roodo.com",
+ "malwaretips.com",
+ "dumpaday.com",
+ "dha.com.tr",
+ "diary.ru",
+ "epa.gov",
+ "jonloomer.com",
+ "holidaylettings.co.uk",
+ "oem.com.mx",
+ "oxfordjournals.org",
+ "3bmeteo.com",
+ "iwebtool.com",
+ "yinyuetai.com",
+ "ixl.com",
+ "rezultati.com",
+ "51sole.com",
+ "moudamepo.com",
+ "macromill.com",
+ "nzz.ch",
+ "buzznet.com",
+ "roku.com",
+ "posta.com.tr",
+ "letsbonus.com",
+ "theoatmeal.com",
+ "artofmanliness.com",
+ "tubepornkiss.com",
+ "aviny.com",
+ "sabresonicweb.com",
+ "tech-wd.com",
+ "qbank.ru",
+ "getsatisfaction.com",
+ "prokerala.com",
+ "ebc.com.br",
+ "typiol.com",
+ "photo.net",
+ "rockpapershotgun.com",
+ "netgear.com",
+ "mg.co.za",
+ "impressrd.jp",
+ "jkbk.cn",
+ "bakufu.jp",
+ "lgmi.com",
+ "tnt-online.ru",
+ "frequency.com",
+ "zip-codes.com",
+ "sport.ro",
+ "wolfram.com",
+ "pgmediaserve.com",
+ "icann.org",
+ "twistedsifter.com",
+ "mopo.de",
+ "vogue.co.uk",
+ "chatrandom.com",
+ "checkpagerank.net",
+ "colorzilla.com",
+ "autobip.com",
+ "laban.vn",
+ "pricecheck.co.za",
+ "notimex.com.mx",
+ "pik.ba",
+ "monster.de",
+ "google.cd",
+ "economia.uol.com.br",
+ "vsnl.net.in",
+ "futura-sciences.com",
+ "appstorm.net",
+ "icefilms.info",
+ "dicelacancion.com",
+ "hypovereinsbank.de",
+ "piratestreaming.tv",
+ "101domain.com",
+ "google.mn",
+ "rutgers.edu",
+ "behindwoods.com",
+ "downloadmaster.ru",
+ "smartinsights.com",
+ "wiziq.com",
+ "ftc.gov",
+ "animenewsnetwork.com",
+ "tandfonline.com",
+ "seagate.com",
+ "famitsu.com",
+ "onekingslane.com",
+ "zalando.fr",
+ "convio.com",
+ "seochat.com",
+ "qq163.com",
+ "capital.gr",
+ "tamin.ir",
+ "phpfreaks.com",
+ "cricketcountry.com",
+ "ubersuggest.org",
+ "ntv.co.jp",
+ "olark.com",
+ "1001fonts.com",
+ "appsgeyser.com",
+ "elsiglodetorreon.com.mx",
+ "lyricsmint.com",
+ "tovima.gr",
+ "petco.com",
+ "campograndenews.com.br",
+ "amadeus.com",
+ "tinychat.com",
+ "astrology.com",
+ "idg.se",
+ "nordea.se",
+ "gelbeseiten.de",
+ "nrc.nl",
+ "houseoffraser.co.uk",
+ "hepsibahis3.com",
+ "empowernetwork.com/almostasecret",
+ "phpnuke.org",
+ "xfwed.com",
+ "gulte.com",
+ "msi.com",
+ "netfirms.com",
+ "ovcanada.com",
+ "smzdm.com",
+ "wwwhatsnew.com",
+ "mydomainadvisor.com",
+ "newindianexpress.com",
+ "luxtarget.com",
+ "evz.ro",
+ "otodom.pl",
+ "linkin.net",
+ "moneysavingmom.com",
+ "uploadbaz.com",
+ "egyup.com",
+ "three.co.uk",
+ "co-operativebank.co.uk",
+ "redad.ru",
+ "ipsosinteractive.com",
+ "all-union.com",
+ "trustlink.ru",
+ "softango.com",
+ "toucharcade.com",
+ "tv2.dk",
+ "thisissouthwales.co.uk",
+ "jra.go.jp",
+ "alfavita.gr",
+ "ibigdan.livejournal.com",
+ "gtarcade.com",
+ "jc001.cn",
+ "microcenter.com",
+ "optimizepress.com",
+ "beyebe.com",
+ "muyzorras.com",
+ "expedia.co.uk",
+ "volvocars.com",
+ "lyd.com.cn",
+ "korben.info",
+ "disput.az",
+ "aeroflot.ru",
+ "betanews.com",
+ "avangard.ru",
+ "wrzko.eu",
+ "cakephp.org",
+ "majorgeeks.com",
+ "dreamteammoney.com",
+ "foroactivo.com",
+ "ut.ac.ir",
+ "eonet.jp",
+ "vn-zoom.com",
+ "footytube.com",
+ "expedia.de",
+ "barneys.com",
+ "lieyunwang.com",
+ "gartner.com",
+ "lazada.com.ph",
+ "ourtime.com",
+ "ohnotheydidnt.livejournal.com",
+ "e-rewards.com",
+ "updatestar.com",
+ "cafef.vn",
+ "cookinglight.com",
+ "expressdownload.net",
+ "shockmansion.com",
+ "adserverpub.com",
+ "ipko.pl",
+ "gsa-online.de",
+ "car.gr",
+ "cqcounter.com",
+ "thenews.com.pk",
+ "gnc.com",
+ "teambeachbody.com",
+ "kobobooks.com",
+ "cwan.com",
+ "ca.com",
+ "list.ly",
+ "baijob.com",
+ "gunbroker.com",
+ "rtl.be",
+ "myadvertisingpays.com",
+ "mediapost.com",
+ "groupalia.com",
+ "anquan.org",
+ "mixshowblast.com",
+ "myscore.ru",
+ "bancochile.cl",
+ "a2hosting.com",
+ "hayneedle.com",
+ "myfc.ir",
+ "aktifhaber.com",
+ "eater.com",
+ "anymeeting.com",
+ "cylex.de",
+ "sayidaty.net",
+ "synonym.com",
+ "comprendrechoisir.com",
+ "prlog.ru",
+ "solidtrustpay.com",
+ "cinejosh.com",
+ "yelp.co.uk",
+ "olx.com.ar",
+ "dihitt.com",
+ "donkeymails.com",
+ "chainreactioncycles.com",
+ "wearehairy.com",
+ "ebuyer.com",
+ "bplans.com",
+ "ponparemall.com",
+ "readthedocs.org",
+ "tehparadox.com",
+ "source-wave.com",
+ "tbs.co.jp",
+ "redcoon.de",
+ "francetv.fr",
+ "freelogoservices.com",
+ "ogone.com",
+ "jeanmarcmorandini.com",
+ "lasexta.com",
+ "sponsoredreviews.com",
+ "govome.com",
+ "vecteezy.com",
+ "alhayat.com",
+ "cnhubei.com",
+ "mumayi.com",
+ "webfail.com",
+ "eluniverso.com",
+ "moddb.com",
+ "gaiaonline.com",
+ "gordonua.com",
+ "liveadexchanger.com",
+ "zhe800.com",
+ "softonic.com.br",
+ "cnyes.com",
+ "cumlouder.com",
+ "krakow.pl",
+ "nullrefer.com",
+ "zaluu.com",
+ "diretube.com",
+ "seattlepi.com",
+ "eanswers.com",
+ "gostorego.com",
+ "play.com",
+ "lenskart.com",
+ "unblog.fr",
+ "chatwork.com",
+ "bronto.com",
+ "jobisjob.co.in",
+ "mercadolibre.com.uy",
+ "overdrive.com",
+ "runkeeper.com",
+ "smartshopping.com",
+ "getrichradio.com",
+ "grader.com",
+ "101greatgoals.com",
+ "elbilad.net",
+ "kopp-verlag.de",
+ "ranksignals.com",
+ "trome.pe",
+ "jobstreet.com.my",
+ "farnell.com",
+ "fastmail.fm",
+ "faithit.com",
+ "blogdohotelurbano.com",
+ "sencha.com",
+ "daisycon.com",
+ "random.org",
+ "tportal.hr",
+ "rkanr.com",
+ "fc2-erodouga.com",
+ "youngpornvideos.com",
+ "bravoteens.com",
+ "mobile.free.fr",
+ "mitele.es",
+ "edis.at",
+ "questionablecontent.net",
+ "indiangilma.com",
+ "comunio.es",
+ "bitnami.com",
+ "sliptalk.com",
+ "sourceforge.jp",
+ "lyoness.net",
+ "nespresso.com",
+ "ultrafarma.com.br",
+ "lik.cl",
+ "jsoftj.com",
+ "metoffice.gov.uk",
+ "androidauthority.com",
+ "360safe.com",
+ "wikimart.ru",
+ "tutu.ru",
+ "truetwit.com",
+ "xinruijunshi.com",
+ "online-sweepstakes.com",
+ "singaporeair.com",
+ "cwtv.com",
+ "politiken.dk",
+ "alaan.tv",
+ "tuttomercatoweb.com",
+ "imagehost123.com",
+ "drakensang.com",
+ "frenchweb.fr",
+ "syosetu.com",
+ "zhifang.com",
+ "viptube.com",
+ "theme123.net",
+ "statista.com",
+ "51bi.com",
+ "clickz.com",
+ "kingworldnews.com",
+ "qunar.com",
+ "pimpandhost.com",
+ "pagina12.com.ar",
+ "xinmin.cn",
+ "kidshealth.org",
+ "pics.livejournal.com",
+ "kabum.com.br",
+ "anandabazar.com",
+ "pnu.ac.ir",
+ "scene7.com",
+ "paperpkads.com",
+ "mylikes.com",
+ "longtailvideo.com",
+ "firmy.cz",
+ "bitcoinity.org",
+ "inopressa.ru",
+ "expat-blog.com",
+ "governmentjobs.com",
+ "airdroid.com",
+ "mid-day.com",
+ "frandroid.com",
+ "webceo.com",
+ "cadenaser.com",
+ "minutouno.com",
+ "onamae.com",
+ "onlinekhabar.com",
+ "williams-sonoma.com",
+ "freewebsubmission.com",
+ "vozforums.com",
+ "bigpicture.ru",
+ "mymodernmet.com",
+ "presseportal.de",
+ "licindia.in",
+ "ismedia.jp",
+ "depor.pe",
+ "sing365.com",
+ "v2cigs.com",
+ "postimage.org",
+ "gencat.cat",
+ "west263.com",
+ "alohatube.com",
+ "eenadupratibha.net",
+ "terra.com",
+ "bri.co.id",
+ "silktide.com",
+ "anyang.gov.cn",
+ "speedanalysis.com",
+ "bitcoin.org",
+ "toodledo.com",
+ "topgear.com",
+ "rtvslo.si",
+ "hotpads.com",
+ "nedsecure.co.za",
+ "expedia.ca",
+ "thairath.co.th",
+ "gizbot.com",
+ "naukrigulf.com",
+ "guffins.com",
+ "twilio.com",
+ "avsforum.com",
+ "sharpnews.ru",
+ "inoreader.com",
+ "stgeorge.com.au",
+ "shoebuy.com",
+ "sbwire.com",
+ "bfm.ru",
+ "dongtaiwang.com",
+ "mandrillapp.com",
+ "176.com",
+ "olx.com",
+ "trustpilot.co.uk",
+ "tgju.org",
+ "pap.fr",
+ "iphonehacks.com",
+ "gry-online.pl",
+ "mp3xd.com",
+ "viabcp.com",
+ "bizcommunity.com",
+ "chillingeffects.org",
+ "thomasnet.com",
+ "performersoft.com",
+ "paymaster.ru",
+ "comdotgame.com",
+ "bseindia.com",
+ "foodgawker.com",
+ "clicktale.com",
+ "dot.tk",
+ "smbc-comics.com",
+ "vvmembers.co",
+ "c-sharpcorner.com",
+ "acdcads.com",
+ "goldporntube.com",
+ "abakus-internet-marketing.de",
+ "babbel.com",
+ "fzg360.com",
+ "99inf.com",
+ "cduniverse.com",
+ "autobild.de",
+ "tvrage.com",
+ "phoenix.edu",
+ "hurriyetemlak.com",
+ "va.gov",
+ "maxmind.com",
+ "lifehacker.jp",
+ "nola.com",
+ "niroensani.ir",
+ "ihotelier.com",
+ "mianbao.com",
+ "powerball.com",
+ "express.com",
+ "freshdesignweb.com",
+ "o2.co.uk",
+ "utusan.com.my",
+ "overclockers.ru",
+ "fsiblog.com",
+ "launchpad.net",
+ "prizee.com",
+ "alalam.ir",
+ "imtalk.org",
+ "vavel.com",
+ "nyc.ny.us",
+ "youmob.com",
+ "dailythanthi.com",
+ "ksu.edu.sa",
+ "nlayer.net",
+ "kurier.at",
+ "expert-offers.com",
+ "marry52.com",
+ "cityads.ru",
+ "darkorbit.com",
+ "cio.com",
+ "a9.com",
+ "symfony.com",
+ "crobo.com",
+ "shatel.ir",
+ "opposingviews.com",
+ "myvoffice.com",
+ "vkmag.com",
+ "starpulse.com",
+ "bls.gov",
+ "lifebettering.com",
+ "fanhuan.com",
+ "upload7.ir",
+ "infoplease.com",
+ "suruga-ya.jp",
+ "deredactie.be",
+ "shangdu.com",
+ "portail.free.fr",
+ "smartaddons.com",
+ "w3layouts.com",
+ "wallstreet-online.de",
+ "yapo.cl",
+ "standard.co.uk",
+ "atlas.sk",
+ "seowizard.ru",
+ "currys.co.uk",
+ "nova.cz",
+ "mygully.com",
+ "favstar.fm",
+ "themuse.com",
+ "yudu.com",
+ "urlopener.com",
+ "ellentv.com",
+ "imgsrc.ru",
+ "km.ru",
+ "guildwars2.com",
+ "google.mu",
+ "androidpit.de",
+ "mrporter.com",
+ "ttt4.com",
+ "cbox.ws",
+ "hf365.com",
+ "1mobile.com",
+ "punjabkesari.in",
+ "msu.edu",
+ "grasscity.com",
+ "abduzeedo.com",
+ "sublimetext.com",
+ "jtb.co.jp",
+ "mensxp.com",
+ "myheritage.com",
+ "onvasortir.com",
+ "safeway.com",
+ "comicvine.com",
+ "cpubenchmark.net",
+ "nn.ru",
+ "animefreak.tv",
+ "angularjs.org",
+ "managewp.com",
+ "ameli.fr",
+ "merrjep.com",
+ "christianbook.com",
+ "nubiles.net",
+ "klmty.net",
+ "247sports.com",
+ "aramex.com",
+ "tubent.com",
+ "cognitiveseo.com",
+ "bankpasargad.com",
+ "pingler.com",
+ "compareja.com.br",
+ "surveyzrewardcenter.eu",
+ "allyes.com",
+ "graaam.com",
+ "poriborton.com",
+ "seslisozluk.net",
+ "shopyourway.com",
+ "awd.ru",
+ "wa.gov.au",
+ "slrclub.com",
+ "apollo.lv",
+ "girls-ly.com",
+ "totalfilm.com",
+ "cam4.it",
+ "gogecapital.com",
+ "sketchup.com",
+ "muscleandfitness.com",
+ "m24.ru",
+ "blinklist.com",
+ "artisteer.com",
+ "nettavisen.no",
+ "enjin.com",
+ "pc6.com",
+ "citrix.com",
+ "indgovtjobs.in",
+ "phpbb.com",
+ "laughingsquid.com",
+ "fblife.com",
+ "stansberryresearch.com",
+ "hugefiles.net",
+ "mp3monkey.net",
+ "mcdonalds.com",
+ "vodafone.co.uk",
+ "t-mobile.de",
+ "tp-link.com.cn",
+ "iflscience.com",
+ "nst.com.my",
+ "zoom.com.br",
+ "dsw.com",
+ "tigerair.com",
+ "doityourself.com",
+ "bongdainfo.com",
+ "imacros.net",
+ "paperlesspost.com",
+ "sprinthost.ru",
+ "lovoo.net",
+ "kadinlarkulubu.com",
+ "championselect.net",
+ "jcb.co.jp",
+ "miui.com",
+ "impots.gouv.fr",
+ "linkshop.com.cn",
+ "pando.com",
+ "ckeditor.com",
+ "arabylife.com",
+ "ml.com",
+ "sheldonsfans.com",
+ "freecharge.in",
+ "magicmovies.com",
+ "laweekly.com",
+ "highrisehq.com",
+ "tr.gg",
+ "vidbull.com",
+ "diy.com",
+ "yieldtraffic.com",
+ "cima4u.com",
+ "gendama.jp",
+ "netpnb.com",
+ "kannaway.com",
+ "soft112.com",
+ "die-boersenformel.com",
+ "movie25.so",
+ "footyroom.com",
+ "dostor.org",
+ "aol.de",
+ "desimartini.com",
+ "themeko.org",
+ "danarimedia.com",
+ "toroporno.com",
+ "stylemepretty.com",
+ "urlm.de",
+ "demotivation.me",
+ "gentside.com",
+ "carfax.com",
+ "huzhou.gov.cn",
+ "hotline.ua",
+ "fullmoneysystem.com",
+ "pornomovies.com",
+ "fsymbols.com",
+ "blog.de",
+ "clickpoint.com",
+ "tv-asahi.co.jp",
+ "flightstats.com",
+ "sonico.com",
+ "afamily.vn",
+ "anadolu.edu.tr",
+ "rs-online.com",
+ "androidpit.com",
+ "a-telecharger.com",
+ "wikifeet.com",
+ "nix.ru",
+ "tvmao.com",
+ "groupon.es",
+ "hitfix.com",
+ "weathernews.jp",
+ "dig.do",
+ "googledrive.com",
+ "fodors.com",
+ "melon.com",
+ "testflightapp.com",
+ "markt.de",
+ "mahua.com",
+ "sedo.co.uk",
+ "tuenti.com",
+ "comm100.com",
+ "olx.co.id",
+ "lefrecce.it",
+ "gov.cl",
+ "wplift.com",
+ "unn.com.ua",
+ "arizona.edu",
+ "msn.com.cn",
+ "k7x.com",
+ "techz.vn",
+ "jobomas.com",
+ "extranetinvestment.com",
+ "tengrinews.kz",
+ "comicbookmovie.com",
+ "4porn.com",
+ "rubiconproject.com",
+ "gametracker.com",
+ "otcmarkets.com",
+ "mismarcadores.com",
+ "trojmiasto.pl",
+ "cleverreach.com",
+ "contactform7.com",
+ "weloveshopping.com",
+ "runnersworld.com",
+ "falabella.com",
+ "airtelbroadband.in",
+ "twistys.com",
+ "ebesucher.de",
+ "belastingdienst.nl",
+ "orlandosentinel.com",
+ "th3professional.com",
+ "duke.edu",
+ "opensubtitles.us",
+ "clickme.net",
+ "infor.pl",
+ "unesco.org",
+ "socialfabric.us",
+ "ename.net",
+ "alternativeto.net",
+ "rotahaber.com",
+ "johnchow.com",
+ "pervclips.com",
+ "linkfeed.ru",
+ "dtvideo.com",
+ "kinoman.tv",
+ "siteprice.org",
+ "lacuerda.net",
+ "amulyam.in",
+ "mandghomebusiness.com",
+ "infojobs.com.br",
+ "hirufm.lk",
+ "mybloggertricks.com",
+ "athemes.com",
+ "moikrug.ru",
+ "fybersearch.com",
+ "wine-searcher.com",
+ "davidicke.com",
+ "dotabuff.com",
+ "sainsburys.co.uk",
+ "ovaustralia.com",
+ "updatesoftnow.com",
+ "desarrolloweb.com",
+ "elaph.com",
+ "icc-cricket.com",
+ "gaytube.com",
+ "di.fm",
+ "99wed.com",
+ "c-and-a.com",
+ "mlxchange.com",
+ "realgfporn.com",
+ "synxis.com",
+ "optymalizacja.com",
+ "ibtesama.com",
+ "hankooki.com",
+ "shiksha.com",
+ "anoox.com",
+ "seamless.com",
+ "stripe.com",
+ "ets.org",
+ "fresherslive.com",
+ "webcoinpay.net",
+ "oscommerce.com",
+ "gratisprogramas.org",
+ "football365.com",
+ "mkyong.com",
+ "antichat.ru",
+ "spamarrest.com",
+ "ubc.ca",
+ "36kr.com",
+ "startv.in",
+ "shoutcast.com",
+ "heureka.sk",
+ "entheosweb.com",
+ "51wan.com",
+ "madadsmedia.com",
+ "parse.com",
+ "ngacn.cc",
+ "techbargains.com",
+ "tvmovie.de",
+ "cpmstar.com",
+ "torproject.org",
+ "residentadvisor.net",
+ "genbeta.com",
+ "hulu.jp",
+ "pluralsight.com",
+ "postini.com",
+ "zombie.jp",
+ "skimlinks.com",
+ "liverail.com",
+ "phys.org",
+ "slashfilm.com",
+ "livemaster.ru",
+ "idwebgame.com",
+ "pho.to",
+ "dealfish.co.th",
+ "s1979.com",
+ "designfloat.com",
+ "live365.com",
+ "pbase.com",
+ "eniro.se",
+ "irannaz.com",
+ "socialmonkee.com",
+ "uidai.gov.in",
+ "joomlashine.com",
+ "allhyipmon.ru",
+ "upbulk.com",
+ "diapers.com",
+ "flypgs.com",
+ "hotmart.com.br",
+ "globus-inter.com",
+ "airfrance.fr",
+ "t3.com",
+ "unetepubli.com",
+ "yahoo-help.jp",
+ "iphones.ru",
+ "95559.com.cn",
+ "glamsham.com",
+ "gophoto.it",
+ "statmyweb.com",
+ "aftermarket.pl",
+ "forumotion.com",
+ "iafd.com",
+ "hotlog.ru",
+ "drclix.com",
+ "wawa-mania.ec",
+ "nichepursuits.com",
+ "imp.free.fr",
+ "baofeng.com",
+ "binsearch.info",
+ "neswangy.net",
+ "parperfeito.com.br",
+ "theeroticreview.com",
+ "sabayacafe.com",
+ "maplestage.com",
+ "icook.tw",
+ "customerhub.net",
+ "uid.me",
+ "viperchill.com",
+ "askfrank.net",
+ "juegosjuegos.com",
+ "debonairblog.com",
+ "coingeneration.com",
+ "onetravel.com",
+ "slutroulette.com",
+ "jetpack.me",
+ "embedupload.com",
+ "bancodevenezuela.com",
+ "mysavingsmedia.net",
+ "smallbiztrends.com",
+ "emirates247.com",
+ "bu.edu",
+ "fineco.it",
+ "netbarg.com",
+ "gatech.edu",
+ "zik.ua",
+ "peliculascoco.com",
+ "hkjc.com",
+ "turkiyegazetesi.com.tr",
+ "cooperativa.cl",
+ "challenges.fr",
+ "usingenglish.com",
+ "vouchercodes.co.uk",
+ "bonprix.de",
+ "disneylatino.com",
+ "townwork.net",
+ "rentanything.com",
+ "krypt.com",
+ "wral.com",
+ "globes.co.il",
+ "designtaxi.com",
+ "mp-success.com",
+ "invisionpower.com",
+ "liontravel.com",
+ "classicrummy.com",
+ "mt.co.kr",
+ "inccel.com",
+ "santander.cl",
+ "afip.gov.ar",
+ "yellowpages.com.au",
+ "osclass.org",
+ "couriermail.com.au",
+ "stream.cz",
+ "wizaz.pl",
+ "linkresearchtools.com",
+ "cam4.co.uk",
+ "allafrica.com",
+ "gezginler.net",
+ "free-ebooks.net",
+ "hopesandfears.com",
+ "ticketmaster.com.mx",
+ "ohio.gov",
+ "liberoquotidiano.it",
+ "neurs.net",
+ "forumophilia.com",
+ "odnako.org",
+ "gamekult.com",
+ "vh1.com",
+ "zxart.cn",
+ "mass.gov",
+ "tv-tokyo.co.jp",
+ "mundopromocion.com",
+ "theme-junkie.com",
+ "asu.edu",
+ "lalibre.be",
+ "pornokopilka.info",
+ "fx678.com",
+ "netbeans.org",
+ "chinabidding.com.cn",
+ "lunapic.com",
+ "dramafever.com",
+ "hbogo.com",
+ "torrents.net",
+ "woopra.com",
+ "justfab.com",
+ "fitnessmagazine.com",
+ "tripadvisor.com.mx",
+ "183.com.cn",
+ "adscendmedia.com",
+ "geek.com",
+ "thepetitionsite.com",
+ "skyscanner.ru",
+ "morningpost.com.cn",
+ "concursolutions.com",
+ "camplace.com",
+ "smarturl.it",
+ "browsershots.org",
+ "piktochart.com",
+ "elcorreo.com",
+ "collegeboard.org",
+ "kasikornbank.com",
+ "adsoftheworld.com",
+ "fakku.net",
+ "jpn.org",
+ "sahafah.net",
+ "rubias19.com",
+ "fc2web.com",
+ "redsurf.ru",
+ "iproperty.com.my",
+ "browsersafeguard.com",
+ "mmajunkie.com",
+ "bangkokbank.com",
+ "ovi.com",
+ "fap.to",
+ "filmygyan.in",
+ "edaily.vn",
+ "affilorama.com",
+ "valuecommerce.ne.jp",
+ "softaculous.com",
+ "exchanger.ru",
+ "html-color-codes.info",
+ "hd-xvideos.com",
+ "realself.com",
+ "geocaching.com",
+ "mom.me",
+ "stc.com.sa",
+ "video-i365.com",
+ "umd.edu",
+ "jeffbullas.com",
+ "kora.com",
+ "cyberchimps.com",
+ "popupads.ir",
+ "chatango.com",
+ "gearslutz.com",
+ "fout.jp",
+ "contactmusic.com",
+ "linkcrypt.ws",
+ "sophos.com",
+ "forum-auto.com",
+ "svtplay.se",
+ "newsbusters.org",
+ "fileswap.com",
+ "phpfox.com",
+ "denic.de",
+ "riverisland.com",
+ "encuentra24.com",
+ "foxnewsinsider.com",
+ "dtdc.com",
+ "tayyar.org",
+ "thepushbuttonmillionaire.com",
+ "brokenlinkcheck.com",
+ "ju51.com",
+ "stihi.ru",
+ "psdgraphics.com",
+ "mommyfucktube.com",
+ "mangocity.com",
+ "routard.com",
+ "whicdn.com",
+ "socialtriggers.com",
+ "e-bookspdf.org",
+ "songspk3.in",
+ "paginasamarillas.com",
+ "webgame.in.th",
+ "xxxdessert.com",
+ "materiel.net",
+ "skillshare.com",
+ "tubepleasure.com",
+ "paypal.de",
+ "yeahmobi.com",
+ "torrentz-proxy.com",
+ "aircel.com",
+ "openask.com",
+ "trafficg.com",
+ "anthem.com",
+ "aleseriale.pl",
+ "f-page.ru",
+ "hrsmart.com",
+ "cbengine.com",
+ "startlap.com",
+ "spamhaus.org",
+ "trovit.com",
+ "sporcle.com",
+ "xs8.cn",
+ "romwe.com",
+ "powtoon.com",
+ "cybozulive.com",
+ "zbiornik.com",
+ "cebit.de",
+ "flipboard.com",
+ "news.am",
+ "wm-panel.com",
+ "topnews.ru",
+ "usp.br",
+ "realmadrid.com",
+ "fastdist.net",
+ "unian.ua",
+ "youtube.com/user/PewDiePie",
+ "unc.edu",
+ "tamu.edu",
+ "ip2location.com",
+ "americanapparel.net",
+ "virtualedge.com",
+ "vikatan.com",
+ "goodlayers.com",
+ "feedblitz.com",
+ "dateinasia.com",
+ "freepdfconvert.com",
+ "iweb.com",
+ "lachainemeteo.com",
+ "aetna.com",
+ "ti.com",
+ "gratisjuegos.org",
+ "webhostinghub.com",
+ "preev.com",
+ "holidayiq.com",
+ "elpais.com.uy",
+ "uchicago.edu",
+ "telcel.com",
+ "feebbo.com",
+ "webhallen.com",
+ "dmir.ru",
+ "emailmg.ipage.com",
+ "hrs.de",
+ "propakistani.pk",
+ "theme.co",
+ "bigpara.com",
+ "finishline.com",
+ "fardanews.com",
+ "nat.gov.tw",
+ "stoloto.ru",
+ "sermepa.es",
+ "radaris.com",
+ "softportal.com",
+ "turkiye.gov.tr",
+ "nnn.ru",
+ "e-familynet.com",
+ "wenkang.cn",
+ "teamworkpm.net",
+ "videohelp.com",
+ "pixmania.com",
+ "games.com",
+ "guns.ru",
+ "plus28.com",
+ "pf.pl",
+ "pbworks.com",
+ "sedo.de",
+ "freedownloadscenter.com",
+ "backpackers.com.tw",
+ "mycokerewards.com",
+ "chinaunix.net",
+ "invisionapp.com",
+ "wordhippo.com",
+ "unitezz.com",
+ "yan.vn",
+ "sonhoo.com",
+ "spielaffe.de",
+ "d.pr",
+ "technologyreview.com",
+ "democraticunderground.com",
+ "molotok.ru",
+ "watchever.de",
+ "wdc.com",
+ "torg.com",
+ "ivillage.com",
+ "portableapps.com",
+ "ovh.es",
+ "vse.kz",
+ "alrajhibank.com.sa",
+ "dhl-usa.com",
+ "pingan.com",
+ "excite.com",
+ "cincodias.com",
+ "marksdailyapple.com",
+ "bter.com",
+ "nationaljournal.com",
+ "fao.org",
+ "oddee.com",
+ "digitalriver.com",
+ "livescore.in",
+ "siilu.com",
+ "gofirstrowus.eu",
+ "alquds.co.uk",
+ "autoevolution.com",
+ "zerx.ru",
+ "trovit.it",
+ "hvylya.org",
+ "carters.com",
+ "shejis.com",
+ "radio-canada.ca",
+ "vodafone.es",
+ "sky.fm",
+ "maturetube.com",
+ "virtualtourist.com",
+ "line25.com",
+ "rzeczpospolita.pl",
+ "megacurioso.com.br",
+ "beliefnet.com",
+ "eklablog.com",
+ "hbo.com",
+ "bsi.ir",
+ "fastweb.it",
+ "webrazzi.com",
+ "telam.com.ar",
+ "downloadming.me",
+ "bluefly.com",
+ "thewire.com",
+ "erotube.org",
+ "vt.edu",
+ "jsbin.com",
+ "ibosocial.com",
+ "brides.com.cn",
+ "jn.pt",
+ "togetter.com",
+ "olhardigital.uol.com.br",
+ "ebookee.org",
+ "socialgamenet.com",
+ "romaniatv.net",
+ "epweike.com",
+ "pronto.com",
+ "blog.pl",
+ "top81.cn",
+ "flagfox.wordpress.com",
+ "unionbank.com",
+ "visitkorea.or.kr",
+ "blogspot.dk",
+ "fermasosedi.ru",
+ "inmobi.com",
+ "abc.com.py",
+ "iqoo.me",
+ "17k.com",
+ "onlineapplicationsdownloads.com",
+ "komli.com",
+ "tala.ir",
+ "videopremium.me",
+ "job.ru",
+ "sunbiz.org",
+ "tw116.com",
+ "browserstack.com",
+ "youtu.be",
+ "yardbarker.com",
+ "flvmplayer.com",
+ "kulichki.net",
+ "gravity.com",
+ "levelclix.com",
+ "kissanime.com",
+ "insightexpressai.com",
+ "colorhexa.com",
+ "citizensbankonline.com",
+ "hjenglish.com",
+ "voeazul.com.br",
+ "paraskhnio.gr",
+ "es.tl",
+ "busuu.com",
+ "appsumo.com",
+ "metacrawler.com",
+ "ciku5.com",
+ "android-hilfe.de",
+ "laterooms.com",
+ "google.com.bn",
+ "gamefront.com",
+ "rev2pub.com",
+ "bharatiyamobile.com",
+ "publicidees.com",
+ "jossandmain.com",
+ "babycentre.co.uk",
+ "zetabux.com",
+ "movieweb.com",
+ "timescity.com",
+ "dnevnik.ru",
+ "nlcafe.hu",
+ "magazine3k.com",
+ "irancell.ir",
+ "kalaydo.de",
+ "e5.ru",
+ "lecai.com",
+ "sbs.com.au",
+ "sierratradingpost.com",
+ "girlfriendvideos.com",
+ "ink361.com",
+ "corporate-ir.net",
+ "allgameshome.com",
+ "povarenok.ru",
+ "typo3.org",
+ "turbosquid.com",
+ "miniurls.co",
+ "thinkwithgoogle.com",
+ "haber3.com",
+ "newsmeback.com",
+ "sipse.com",
+ "osxdaily.com",
+ "9lessons.info",
+ "cyclopaedia.net",
+ "reallifecam.com",
+ "gameblog.fr",
+ "colourbox.com",
+ "mixedmartialarts.com",
+ "prostoporno.net",
+ "chanel.com",
+ "maxim.com",
+ "cam4.es",
+ "olx.com.mx",
+ "newscientist.com",
+ "netcombo.com.br",
+ "serienjunkies.org",
+ "shablol.com",
+ "bnpparibasfortis.be",
+ "canada.com",
+ "timeslive.co.za",
+ "cinematoday.jp",
+ "21cineplex.com",
+ "bodisparking.com",
+ "cruisecritic.com",
+ "vertoz.com",
+ "glosbe.com",
+ "nstarikov.ru",
+ "epinions.com",
+ "colbertnation.com",
+ "marketglory.com",
+ "emailmeform.com",
+ "angloinfo.com",
+ "filfan.com",
+ "yougetsignal.com",
+ "broker.to",
+ "quickbux.net",
+ "gottabemobile.com",
+ "beyondtherack.com",
+ "tripadvisor.ru",
+ "jschina.com.cn",
+ "registraduria.gov.co",
+ "thisoldhouse.com",
+ "appcelerator.com",
+ "noticias24carabobo.com",
+ "skelbiu.lt",
+ "ru.wix.com",
+ "iransong.com",
+ "i-sux.com",
+ "telerama.fr",
+ "mydala.com",
+ "pia.jp",
+ "fusebux.com",
+ "biquge.com",
+ "microworkers.com",
+ "onlywire.com",
+ "fanbox.com",
+ "ambitoweb.com",
+ "tripadvisor.com.br",
+ "postgresql.org",
+ "telenet.be",
+ "thegeekstuff.com",
+ "primelocation.com",
+ "ee.co.uk",
+ "phoenixads.co.in",
+ "brigitte.de",
+ "360kad.com",
+ "kathimerini.gr",
+ "batoto.net",
+ "babebuns.com",
+ "webimpresion.com",
+ "olx.com.ng",
+ "which.co.uk",
+ "f5haber.com",
+ "cic.fr",
+ "talkfusion.com",
+ "ctrlq.org",
+ "caracol.com.co",
+ "wer-weiss-was.de",
+ "invisionzone.com",
+ "head-fi.org",
+ "thingiverse.com",
+ "manager-magazin.de",
+ "bzwbk.pl",
+ "f1news.ru",
+ "tweetreach.com",
+ "sj998.com",
+ "streetdirectory.com",
+ "asos.fr",
+ "kalahari.com",
+ "classiccars.com",
+ "bitacoras.com",
+ "bravotv.com",
+ "beanfun.com",
+ "bonappetit.com",
+ "fashionara.com",
+ "techdirt.com",
+ "newlook.com",
+ "iyinet.com",
+ "mogujie.com",
+ "carros.com.br",
+ "starfall.com",
+ "rp5.ru",
+ "pocket-lint.com",
+ "homeadvisor.com",
+ "webhostbox.net",
+ "cameraboys.com",
+ "pricerunner.com",
+ "worldcarfans.com",
+ "meganovosti.net",
+ "taxheaven.gr",
+ "freewebsitetemplates.com",
+ "mr90.ir",
+ "cheapflights.co.uk",
+ "bankinter.com",
+ "euroresidentes.com",
+ "bettycrocker.com",
+ "filmey.com",
+ "sheinside.com",
+ "2ememain.be",
+ "tu.tv",
+ "kugou.com",
+ "destructoid.com",
+ "todoist.com",
+ "karmaloop.com",
+ "appadvice.com",
+ "html5rocks.com",
+ "osdir.com",
+ "webisgreat.info",
+ "dailyblogtips.com",
+ "mca.gov.in",
+ "e-estekhdam.com",
+ "hlntv.com",
+ "proprofs.com",
+ "his-j.com",
+ "im286.com",
+ "mmorpg.com",
+ "shooshtime.com",
+ "terra.es",
+ "lpcloudbox301.com",
+ "tubepornstars.com",
+ "tableausoftware.com",
+ "soccersuck.com",
+ "websurf.ru",
+ "indiafreestuff.in",
+ "pimei.com",
+ "colatour.com.tw",
+ "fssnet.co.in",
+ "maxpark.com",
+ "foodandwine.com",
+ "apachefriends.org",
+ "standardchartered.co.in",
+ "waveapps.com",
+ "gosong.net",
+ "spring.me",
+ "weatherbug.com",
+ "iw33.com",
+ "apserver.net",
+ "thenationonlineng.net",
+ "tjournal.ru",
+ "greatschools.net",
+ "3movs.com",
+ "61.com",
+ "directpaybiz.com",
+ "w3snoop.com",
+ "jsonline.com",
+ "grainger.com",
+ "prevention.com",
+ "blizzard.com",
+ "baseball-reference.com",
+ "cjn.cn",
+ "fasthosts.co.uk",
+ "kym-cdn.com",
+ "cuponation.in",
+ "cam4.fr",
+ "lalawan67.net",
+ "videovantage.co",
+ "elimparcial.com",
+ "edlen24.com",
+ "donya-e-eqtesad.com",
+ "englishforums.com",
+ "dom2.ru",
+ "cinepolis.com",
+ "healthtap.com",
+ "astroawani.com",
+ "autosport.com",
+ "finalfantasyxiv.com",
+ "valueclickmedia.com",
+ "vitaminshoppe.com",
+ "apartmentguide.com",
+ "notjustok.com",
+ "gratispeliculas.org",
+ "intporn.com",
+ "eroticbeauties.net",
+ "egloos.com",
+ "nujij.nl",
+ "godvine.com",
+ "punishtube.com",
+ "wisegeek.org",
+ "somuch.com",
+ "taz.de",
+ "zetaboards.com",
+ "gravityforms.com",
+ "telegraf.rs",
+ "odn.ne.jp",
+ "topeleven.com",
+ "peekyou.com",
+ "razerzone.com",
+ "furaffinity.net",
+ "mobikwik.com",
+ "eventful.com",
+ "sextube.fm",
+ "treccani.it",
+ "phatograph.com",
+ "feedthebot.com",
+ "netdoctor.co.uk",
+ "collarme.com",
+ "reformal.ru",
+ "hemnet.se",
+ "jacquieetmicheltv.net",
+ "9ku.com",
+ "kraloyun.com",
+ "directadmin.com",
+ "bongda.com.vn",
+ "ddizi.org",
+ "tedata.net",
+ "fb.org",
+ "pagemodo.com",
+ "satu.kz",
+ "nodejs.org",
+ "tiberiumalliances.com",
+ "wallst.com",
+ "dezeen.com",
+ "rense.com",
+ "hawkhost.com",
+ "vonage.com",
+ "zjol.com.cn",
+ "housefun.com.tw",
+ "ad1.ru",
+ "myredbook.com",
+ "rarlab.com",
+ "audiopoisk.com",
+ "pbebank.com",
+ "whocallsme.com",
+ "playground.ru",
+ "tnr.com",
+ "firstdirect.com",
+ "xinhua.jp",
+ "gmane.org",
+ "verseriesynovelas.com",
+ "broadwayworld.com",
+ "thefrisky.com",
+ "rapmls.com",
+ "skapiec.pl",
+ "wholesale-dress.net",
+ "alison.com",
+ "n4hr.com",
+ "prefiles.com",
+ "vtc.vn",
+ "coral.co.uk",
+ "azyya.com",
+ "smithsonianmag.com",
+ "ticksy.com",
+ "theync.com",
+ "pcinpact.com",
+ "eventbrite.co.uk",
+ "buenosaires.gob.ar",
+ "a5cee7.se",
+ "bazingamob.com",
+ "pp.cc",
+ "shortnews.de",
+ "responsinator.com",
+ "filepost.com",
+ "securefreedom.com",
+ "notepad-plus-plus.org",
+ "thekrazycouponlady.com",
+ "apktops.ir",
+ "nr2.ru",
+ "timinternet.it",
+ "man.lv",
+ "forexpeacearmy.com",
+ "plius.lt",
+ "vcp.ir",
+ "mysitecost.ru",
+ "yourfiledownloader.com",
+ "dealguardian.com",
+ "sql.ru",
+ "laravel.com",
+ "shape5.com",
+ "visa.com",
+ "vocus.com",
+ "stackthatmoney.com",
+ "pornicom.com",
+ "my.tv.sohu.com/user/cc128",
+ "urban-rivals.com",
+ "robotstxt.org",
+ "colorlabsproject.com",
+ "mg.gov.br",
+ "local.ch",
+ "adbooth.net",
+ "se.pl",
+ "al-akhbar.com",
+ "he.net",
+ "covoiturage.fr",
+ "sakshieducation.com",
+ "thisdaylive.com",
+ "thestudentroom.co.uk",
+ "pzy.be",
+ "designyoutrust.com",
+ "forbes.ua",
+ "fandongxi.com",
+ "expertreviews.co.uk",
+ "dream-demo.com",
+ "barchart.com",
+ "ht.ly",
+ "burbuja.info",
+ "edgecastcdn.net",
+ "amazinglytimedphotos.com",
+ "value-domain.com",
+ "shareaholic.com",
+ "promptfile.com",
+ "voetbalzone.nl",
+ "ziare.com",
+ "trafficbroker.com",
+ "coolsport.tv",
+ "vanguardia.com.mx",
+ "makeshop.jp",
+ "mobilism.org",
+ "rebelmouse.com",
+ "brisbanetimes.com.au",
+ "publimetro.com.mx",
+ "coolkora.com",
+ "realsparrow.com",
+ "honda.co.jp",
+ "dealcatcher.com",
+ "sinoptik.ua",
+ "lefeng.com",
+ "mamaclub.com",
+ "bezuzyteczna.pl",
+ "smn.gov.ar",
+ "manhub.com",
+ "pcgameshardware.de",
+ "shipstation.com",
+ "zive.cz",
+ "disneystore.com",
+ "despegar.com.mx",
+ "addictivetips.com",
+ "path.com",
+ "pathofexile.com",
+ "seitenreport.de",
+ "pardot.com",
+ "decathlon.fr",
+ "flvrunner.com",
+ "xat.com",
+ "matchendirect.fr",
+ "roem.ru",
+ "wat.tv",
+ "edline.net",
+ "znds.com",
+ "northwestern.edu",
+ "friendscout24.de",
+ "movoto.com",
+ "dengiprosto.info",
+ "dlisted.com",
+ "sports.fr",
+ "maxifoot.fr",
+ "hubspot.net",
+ "natalie.mu",
+ "tabloidpulsa.co.id",
+ "polki.pl",
+ "gamasutra.com",
+ "matomeantena.com",
+ "adwords-community.com",
+ "gallup.com",
+ "redtubenacional.com",
+ "mangastream.com",
+ "zulutrade.com",
+ "wunderlist.com",
+ "taste.com.au",
+ "myhosting.com",
+ "totalbeauty.com",
+ "8pic.ir",
+ "sltrib.com",
+ "88db.com",
+ "minikoyuncu.com",
+ "net4.in",
+ "nuevoloquo.com",
+ "cago365.com",
+ "afip.gob.ar",
+ "keep2share.cc",
+ "kw.com",
+ "terra.com.pe",
+ "profi-forex.org",
+ "filecloud.io",
+ "peliculas4.com",
+ "mysitemyway.com",
+ "ilmattino.it",
+ "geizhals.de",
+ "sheershanews.com",
+ "whatwpthemeisthat.com",
+ "teknosa.com",
+ "myshopping.com.au",
+ "teamskeet.com",
+ "gandalfporn.com",
+ "2670.com",
+ "peoplefinders.com",
+ "elo7.com.br",
+ "sofoot.com",
+ "uhaul.com",
+ "sagepay.com",
+ "unb.br",
+ "jhu.edu",
+ "barrons.com",
+ "hasznaltauto.hu",
+ "winfxstrategy.com",
+ "spamcop.net",
+ "az.pl",
+ "op.fi",
+ "istruzione.it",
+ "eveonline.com",
+ "imgnip.com",
+ "jjoobb.cn",
+ "itesm.mx",
+ "wptavern.com",
+ "kproxy.com",
+ "pulptastic.com",
+ "quidco.com",
+ "ekantipur.com",
+ "joann.com",
+ "whattoexpect.com",
+ "tomshw.it",
+ "internetbookshop.it",
+ "followerwonk.com",
+ "cisionpoint.com",
+ "cint.com",
+ "quondos.com",
+ "suntimes.com",
+ "saveinter.net",
+ "eiga.com",
+ "jdzj.com",
+ "goldprice.org",
+ "websitemagazine.com",
+ "051jk.com",
+ "inweb24.com",
+ "gamgos.ae",
+ "elog-ch.com",
+ "trovit.com.mx",
+ "webnode.cz",
+ "ethnos.gr",
+ "oodle.com",
+ "subtitulos.es",
+ "gameinformer.com",
+ "9to5mac.com",
+ "youwatch.org",
+ "ibps.in",
+ "biggerpockets.com",
+ "sport24.co.za",
+ "my.tv.sohu.com/user/cc133",
+ "capsulecrm.com",
+ "fuett.mx",
+ "poznan.pl",
+ "melateiran.com",
+ "divxtotal.com",
+ "aftabir.com",
+ "cyberlink.com",
+ "ulozto.cz",
+ "jetswap.com",
+ "premium.wix.com",
+ "eprize.com",
+ "huntington.com",
+ "careerlink.vn",
+ "allhyipmonitors.com",
+ "autorambler.ru",
+ "jamieoliver.com",
+ "minube.com",
+ "credomatic.com",
+ "oddschecker.com",
+ "listia.com",
+ "mrrebates.com",
+ "8684.cn",
+ "kabam.com",
+ "tripit.com",
+ "gry.pl",
+ "ecvv.com",
+ "utanbaby.com",
+ "lavoixdunord.fr",
+ "just-eat.co.uk",
+ "go-for-files.com",
+ "afpbb.com",
+ "mybb.com",
+ "madmoizelle.com",
+ "sensacine.com",
+ "jtl-software.de",
+ "worldtimeserver.com",
+ "sunmaker.com",
+ "marieforleo.com",
+ "123sdfsdfsdfsd.ru",
+ "duga.jp",
+ "avery.com",
+ "tvguide.co.uk",
+ "salliemae.com",
+ "zap.com.br",
+ "my.tv.sohu.com/user/cc112",
+ "bookmark4you.com",
+ "twodollarclick.com",
+ "encontreinarede.com",
+ "joomshaper.com",
+ "marinetraffic.com",
+ "feedermatrix.com",
+ "nowvideo.at",
+ "millenium.org",
+ "newalbumreleases.net",
+ "frankkern.com",
+ "onlineconversion.com",
+ "ahlalhdeeth.com",
+ "mediawiki.org",
+ "xseo.in",
+ "generation-nt.com",
+ "naftemporiki.gr",
+ "hardforum.com",
+ "hornbunny.com",
+ "my.tv.sohu.com/user/cc124",
+ "housing.com",
+ "vogue.es",
+ "safemls.net",
+ "cuisineaz.com",
+ "estekhtam.com",
+ "coqnu.com",
+ "despegar.com.ar",
+ "fedoraproject.org",
+ "france2.fr",
+ "autovit.ro",
+ "tradetang.com",
+ "levelupgames.uol.com.br",
+ "dnforum.com",
+ "homebank.kz",
+ "carnival.com",
+ "hzycsj.com",
+ "army.mil",
+ "bootsnipp.com",
+ "istockimg.com",
+ "po-kaki-to.com",
+ "qiushibaike.com",
+ "tsb.co.uk",
+ "gzmama.com",
+ "aitnews.com",
+ "tripwiremagazine.com",
+ "torrenty.org",
+ "djangoproject.com",
+ "chelseafc.com",
+ "gamesgames.com",
+ "herold.at",
+ "baur.de",
+ "kauppalehti.fi",
+ "nrelate.com",
+ "clickwebinar.com",
+ "entropay.com",
+ "gridserver.com",
+ "virginia.gov",
+ "tuan800.com",
+ "trueactivist.com",
+ "caras.uol.com.br",
+ "fontawesome.io",
+ "haodou.com",
+ "reshareworthy.com",
+ "royalcaribbean.com",
+ "crakrevenue.com",
+ "motika.com.mk",
+ "xovi.de",
+ "deutsche-startups.de",
+ "inven.co.kr",
+ "atrapalo.com",
+ "ictv.ua",
+ "muji.net",
+ "kingplayer.com",
+ "adworkmedia.com",
+ "xjtu.edu.cn",
+ "thenounproject.com",
+ "professionali.ru",
+ "xizhi.com",
+ "boo-box.com",
+ "customink.com",
+ "groupon.my",
+ "spartoo.com",
+ "bannersdontwork.com",
+ "ncore.cc",
+ "reklama5.mk",
+ "macrojuegos.com",
+ "zenhabits.net",
+ "te3p.com",
+ "utah.gov",
+ "telesurtv.net",
+ "101.ru",
+ "5yi.com",
+ "lide.cz",
+ "ancestry.co.uk",
+ "sana.sy",
+ "siteslike.com",
+ "vg247.com",
+ "tyzhden.ua",
+ "ncsu.edu",
+ "apherald.com",
+ "taaza.com",
+ "traffic-delivery.com",
+ "uuyoyo.com",
+ "hwupgrade.it",
+ "game-debate.com",
+ "jetpack.wordpress.com",
+ "anycodes.com",
+ "femina.hu",
+ "zattoo.com",
+ "acm.org",
+ "comenity.net",
+ "tarot.com",
+ "azadliq.org",
+ "advertiserdigital.com",
+ "osym.gov.tr",
+ "empornium.me",
+ "netzero.net",
+ "myfico.com",
+ "nolix.ru",
+ "cnwnews.com",
+ "springpad.com",
+ "ahangestan.in",
+ "localbitcoins.com",
+ "nikkei.co.jp",
+ "youlikehits.com",
+ "boyfriendtv.com",
+ "wampserver.com",
+ "elnorte.com",
+ "codeschool.com",
+ "si.edu",
+ "nosis.com",
+ "downloadhelper.net",
+ "global-free-classified-ads.com",
+ "flagmantube.com",
+ "elnuevodiario.com.ni",
+ "handelsbanken.se",
+ "sverigesradio.se",
+ "femjoy.com",
+ "444.hu",
+ "calcalist.co.il",
+ "asiatech.ir",
+ "tv.nu",
+ "installmac.com",
+ "programmableweb.com",
+ "fotki.com",
+ "vidivodo.com",
+ "websquash.com",
+ "selfgrowth.com",
+ "wehkamp.nl",
+ "amawebs.com",
+ "3dlat.com",
+ "comunidades.net",
+ "streamin.to",
+ "idbi.com",
+ "cshtracker.com",
+ "cdbaby.com",
+ "mycommerce.com",
+ "united-domains.de",
+ "tradingview.com",
+ "niniweblog.com",
+ "avn.info.ve",
+ "apa.tv",
+ "pinnaclesports.com",
+ "adafruit.com",
+ "ipower.com",
+ "lebuteur.com",
+ "utah.edu",
+ "mobeoffice.com",
+ "lingualeo.com",
+ "fuub.net",
+ "tvmongol.com",
+ "namasthetelangaana.com",
+ "secretsearchenginelabs.com",
+ "whowhatwear.com",
+ "hiapk.com",
+ "torrentz.sx",
+ "php.su",
+ "sodahead.com",
+ "sbb.ch",
+ "k12.ca.us",
+ "jecontacte.com",
+ "thehollywoodgossip.com",
+ "pekao24.pl",
+ "yourtest-india.com",
+ "screwfix.com",
+ "humoron.com",
+ "yiwugou.com",
+ "mulher.uol.com.br",
+ "thehackernews.com",
+ "shopmania.ro",
+ "dlink.com",
+ "despegar.com",
+ "archlinux.org",
+ "nielsen.com",
+ "rosnet.ru",
+ "appsapk.com",
+ "funfarsi.ir",
+ "4over.com",
+ "subscribe.wordpress.com",
+ "lewrockwell.com",
+ "portalnet.cl",
+ "antenam.info",
+ "letribunaldunet.fr",
+ "see-tube.com",
+ "tureng.com",
+ "topcashback.co.uk",
+ "contactcars.com",
+ "jeux.fr",
+ "khan.co.kr",
+ "ffffound.com",
+ "gmail.com",
+ "laprensa.com.ni",
+ "jizzhut.com",
+ "liilas.com",
+ "muare.vn",
+ "kting.cn",
+ "heteml.jp",
+ "genericsteps.com",
+ "searchcompletion.com",
+ "dwayir.com",
+ "dicionarioinformal.com.br",
+ "vcita.com",
+ "fitsugar.com",
+ "kleiderkreisel.de",
+ "collective-evolution.com",
+ "ethz.ch",
+ "sendreach.com",
+ "abidjan.net",
+ "islamicfinder.org",
+ "elong.com",
+ "yonhapnews.co.kr",
+ "seratnews.ir",
+ "stream2watch.me",
+ "content-watch.ru",
+ "seotechnocrat.com",
+ "todaoferta.uol.com.br",
+ "toyota.jp",
+ "purevid.com",
+ "incredimail.com",
+ "kia.com",
+ "intensedebate.com",
+ "kaufmich.com",
+ "servis24.cz",
+ "brusheezy.com",
+ "rtbtraf.com",
+ "tejiawang.com",
+ "expedia.co.in",
+ "food52.com",
+ "top-channel.tv",
+ "jpnn.com",
+ "desitorrents.com",
+ "faxingw.cn",
+ "crutchfield.com",
+ "seneweb.com",
+ "usenet.nl",
+ "aviasales.ru",
+ "nesine.com",
+ "appshopper.com",
+ "dressupgamesite.com",
+ "lowendtalk.com",
+ "muslima.com",
+ "v-webs.com",
+ "linkomanija.net",
+ "geniuzz.com",
+ "caringbridge.org",
+ "gooya.com",
+ "dospy.com",
+ "siol.net",
+ "games.co.id",
+ "archiveofourown.org",
+ "rocketlawyer.com",
+ "free-downloadz.net",
+ "pastemagazine.com",
+ "invest-system.net",
+ "el-ahly.com",
+ "todayhumor.co.kr",
+ "racingpost.com",
+ "stereogum.com",
+ "soompi.com",
+ "pof.com.br",
+ "brainabundance.com",
+ "fontpalace.com",
+ "canon.jp",
+ "eldeforma.com",
+ "sacbee.com",
+ "jobscore.com",
+ "fashionista.com",
+ "mywork.vn",
+ "thisis50.com",
+ "cubadebate.cu",
+ "healthguru.com",
+ "instatheme.com",
+ "apotheken-umschau.de",
+ "blizko.ru",
+ "tinymce.com",
+ "virtualbox.org",
+ "tehran.ir",
+ "pr.gov.br",
+ "mlmleadsystempro.com",
+ "resbux.com",
+ "komonews.com",
+ "childrensplace.com",
+ "yoyopress.com",
+ "cloudify.cc",
+ "24livenewspaper.com",
+ "w4.com",
+ "islamway.net",
+ "fantagazzetta.com",
+ "imgspice.com",
+ "bovada.lv",
+ "payback.de",
+ "peb.pl",
+ "hotnigerianjobs.com",
+ "dev7studios.com",
+ "tejaratbank.net",
+ "takuhai.jp",
+ "travelmath.com",
+ "cultofmac.com",
+ "wakeupnow.com",
+ "insidefacebook.com",
+ "mediamarkt.es",
+ "500wan.com",
+ "rumah123.com",
+ "contentmarketinginstitute.com",
+ "ed.ac.uk",
+ "phimvang.com",
+ "womansday.com",
+ "lookatme.ru",
+ "citizensbank.com",
+ "esam.ir",
+ "phandroid.com",
+ "canadiantire.ca",
+ "serienjunkies.de",
+ "bbspink.com",
+ "yaranehkala.ir",
+ "vesti.bg",
+ "el-carabobeno.com",
+ "smarty.net",
+ "6tie.com",
+ "antpedia.com",
+ "p-world.co.jp",
+ "camelcamelcamel.com",
+ "sudu.cn",
+ "priberam.pt",
+ "infoworld.com",
+ "myrecipes.com",
+ "metrodeal.com",
+ "widgetbox.com",
+ "krone.at",
+ "outfox.tv",
+ "mymp4.in",
+ "685wo.com",
+ "sadanduseless.com",
+ "cgd.pt",
+ "mrmlsmatrix.com",
+ "parenting.com",
+ "tradepub.com",
+ "linkvehicle.com",
+ "mobiledia.com",
+ "rghost.ru",
+ "xxsy.net",
+ "goanimate.com",
+ "pikacn.com",
+ "metropcs.com",
+ "byu.edu",
+ "bitelia.com",
+ "designscrazed.com",
+ "wpde.org",
+ "paheal.net",
+ "nulled.cc",
+ "hmv.co.jp",
+ "openx.com",
+ "hyundai.com",
+ "vvvdj.com",
+ "reason.com",
+ "livesports.pl",
+ "polskieradio.pl",
+ "oszone.net",
+ "chinhphu.vn",
+ "performancehorizon.com",
+ "internetretailer.com",
+ "skoob.com.br",
+ "mediaworld.it",
+ "imgrind.com",
+ "bancopopular.es",
+ "seogadget.ru",
+ "m6.fr",
+ "rongbay.com",
+ "niazpardaz.com",
+ "rewity.com",
+ "ssense.com",
+ "sky-fire.com",
+ "flibusta.net",
+ "eat24hours.com",
+ "lotto.pl",
+ "cnw.com.cn",
+ "takvim.com.tr",
+ "englishtown.com",
+ "letudiant.fr",
+ "peliculasmas.com",
+ "askme.com",
+ "linksmanagement.com",
+ "webseoanalytics.com",
+ "presse-citron.net",
+ "eldiariodeamerica.com",
+ "instantshift.com",
+ "ampxchange.com",
+ "xe.gr",
+ "experts-exchange.com",
+ "sportcategory.com",
+ "sharecash.org",
+ "linksys.com",
+ "yninfo.com",
+ "onlinelic.in",
+ "aflamneek.com",
+ "22.cn",
+ "ubuntu-fr.org",
+ "cjs.com.cn",
+ "mp3clan.com",
+ "grani.ru",
+ "zen-cart.com",
+ "shippingchina.com",
+ "jsfor.net",
+ "wanadoo.es",
+ "zurker.com",
+ "chotot.vn",
+ "masaladesi.com",
+ "insight.ly",
+ "trivago.de",
+ "neue-sexpartner.com",
+ "boe.es",
+ "military.com",
+ "moonbasa.com",
+ "langlaoda.com",
+ "tnooz.com",
+ "zacks.com",
+ "liverpool.com.mx",
+ "internic.net",
+ "ecuavisa.com",
+ "autonews.ru",
+ "mcafeesecure.com",
+ "peopleclick.com",
+ "madthumbs.com",
+ "hot-live-chat.com",
+ "sugarcrm.com",
+ "notonthehighstreet.com",
+ "linio.com.co",
+ "smartbrief.com",
+ "auto-motor-und-sport.de",
+ "kyivpost.com",
+ "instantteleseminar.com",
+ "dillards.com",
+ "5i5j.com",
+ "runtastic.com",
+ "danawa.com",
+ "ladunliadi.blogspot.com",
+ "getnews.jp",
+ "romedic.ro",
+ "rodfile.com",
+ "instyle.com",
+ "swoodoo.com",
+ "bannersnack.com",
+ "evolife.cn",
+ "ktonanovenkogo.ru",
+ "office.com",
+ "zamalekfans.com",
+ "magiran.com",
+ "ithome.com",
+ "ktrmr.com",
+ "spoonful.com",
+ "olleh.com",
+ "bgr.in",
+ "industrialthemes.com",
+ "adbkm.com",
+ "tsa-algerie.com",
+ "bloggang.com",
+ "mojang.com",
+ "geoiptool.com",
+ "autocarindia.com",
+ "ajansspor.com",
+ "onmeda.de",
+ "midwayusa.com",
+ "alicdn.com",
+ "sportdog.gr",
+ "ideeli.com",
+ "haspa.de",
+ "gladbux.com",
+ "porn-star.com",
+ "experiandirect.com",
+ "yicheshi.com",
+ "acervoamador.com",
+ "designwall.com",
+ "balkanweb.com",
+ "response.jp",
+ "nettoos.com",
+ "beruby.com",
+ "manageyourloans.com",
+ "kidstaff.com.ua",
+ "indeed.co.za",
+ "monoprice.com",
+ "chsi.com.cn",
+ "boorsekala.com",
+ "mstaml.com",
+ "trafficvance.com",
+ "tatatele.in",
+ "startbootstrap.com",
+ "graphicburger.com",
+ "ad-vid-webs.com",
+ "jp.dk",
+ "one.co.il",
+ "athensvoice.gr",
+ "payu2blog.com",
+ "epidemz.net",
+ "dondominio.com",
+ "doviz.com",
+ "disquscdn.com",
+ "work.ua",
+ "vsemayki.ru",
+ "ikyu.com",
+ "songlyrics.com",
+ "onlinebank.com",
+ "thebump.com",
+ "travian.com.tr",
+ "java2s.com",
+ "twittmate.com",
+ "ignou.ac.in",
+ "relink.us",
+ "4738.com",
+ "printvenue.com",
+ "tekstowo.pl",
+ "natro.com",
+ "dengi-tut.info",
+ "freeservers.com",
+ "inbound.org",
+ "free-press-release.com",
+ "mydirtyhobby.com",
+ "gamefly.com",
+ "overclockers.co.uk",
+ "eci.nic.in",
+ "196.1.211.6",
+ "versus.com",
+ "batdongsan.com.vn",
+ "vrisko.gr",
+ "albayan.ae",
+ "trendcounter.com",
+ "500.com",
+ "pagomiscuentas.com",
+ "wankoz.com",
+ "duote.com",
+ "javascript.ru",
+ "chevrolet.com",
+ "coach.com",
+ "decidatriunfar.net",
+ "rememberthemilk.com",
+ "virginmobileusa.com",
+ "google.com.jm",
+ "ucm.es",
+ "ninja.co.jp",
+ "rqzao.com",
+ "periodistadigital.com",
+ "heritage.org",
+ "momtubesex.xxx",
+ "vocabulary.com",
+ "kupujemprodajem.com",
+ "e-cigarette-forum.com",
+ "paxum.com",
+ "ilpost.it",
+ "abercrombie.com",
+ "pearsonmylabandmastering.com",
+ "echoecho.com",
+ "expedia.co.jp",
+ "ticketfly.com",
+ "colostate.edu",
+ "sjtu.edu.cn",
+ "seobudget.ru",
+ "gigabyte.com",
+ "gsmspain.com",
+ "misr5.com",
+ "enterfactory.com",
+ "ciao.de",
+ "wuv.de",
+ "dagospia.com",
+ "slashgear.com",
+ "urdupoint.com",
+ "themepunch.com",
+ "travian.com",
+ "discuz.com",
+ "pixroute.com",
+ "otzovik.com",
+ "ubergizmo.com",
+ "edreams.fr",
+ "internet-positif.org",
+ "asmcentral.com",
+ "copadomundo.uol.com.br",
+ "adjal.com",
+ "gotomypc.com",
+ "partycity.com",
+ "leggo.it",
+ "blogosfere.it",
+ "teamcoco.com",
+ "pricedealsindia.com",
+ "glennbeck.com",
+ "allyou.com",
+ "china.org.cn",
+ "xitek.com",
+ "photoshopessentials.com",
+ "infopraca.pl",
+ "boardingarea.com",
+ "geni.com",
+ "rotaban.ru",
+ "foxtab.com",
+ "sadistic.pl",
+ "socialbro.com",
+ "tradesparq.com",
+ "itp.ne.jp",
+ "swefilmer.com",
+ "jobsite.co.uk",
+ "topwar.ru",
+ "yemeksepeti.com",
+ "tokfm.pl",
+ "businessinsider.com.au",
+ "moe.gov.eg",
+ "swedbank.lt",
+ "jxgdw.com",
+ "bayern.de",
+ "alistapart.com",
+ "bebinin.com",
+ "annunci69.it",
+ "plimus.com",
+ "cuevana2.tv",
+ "viamichelin.fr",
+ "whatsmydns.net",
+ "tarad.com",
+ "hostgator.com.br",
+ "hasbro.com",
+ "hi-chic.com",
+ "driverscollection.com",
+ "onetad.com",
+ "game2.com.cn",
+ "elitepvpers.com",
+ "tvuol.uol.com.br",
+ "caclubindia.com",
+ "diariocorreo.pe",
+ "c-rewards.com",
+ "business.gov.au",
+ "chooseauto.com.cn",
+ "timetrade.com",
+ "alternate.de",
+ "syracuse.com",
+ "advanceautoparts.com",
+ "shopware.de",
+ "newpct.com",
+ "proranktracker.com",
+ "cex.io",
+ "thebot.net",
+ "tradekorea.com",
+ "legifrance.gouv.fr",
+ "cpan.org",
+ "rightel.ir",
+ "247wallst.com",
+ "goldentowns.com",
+ "bankifsccode.com",
+ "color-hex.com",
+ "consumerist.com",
+ "juegosdiarios.com",
+ "on24.com",
+ "stockfreeimages.com",
+ "m4.cn",
+ "sponsoredtweets.com",
+ "open.ac.uk",
+ "bilyoner.com",
+ "lexisnexis.com",
+ "gsu.edu",
+ "popscreen.com",
+ "stiftung-warentest.de",
+ "education.com",
+ "leckerficken.de",
+ "hostinger.ru",
+ "staples.ca",
+ "greenpeace.org",
+ "mes-meilleurs-films.fr",
+ "delish.com",
+ "register.it",
+ "idiva.com",
+ "static.squarespace.com",
+ "ololo.fm",
+ "basketball-reference.com",
+ "tro-ma-ktiko.blogspot.gr",
+ "arabianbusiness.com",
+ "avianca.com",
+ "watchuseek.com",
+ "6play.fr",
+ "kora-online.tv",
+ "armagedomfilmes.biz",
+ "531314.com",
+ "craigslist.co.uk",
+ "inchallah.com",
+ "bongdaso.com",
+ "toprankblog.com",
+ "k12.com",
+ "itimes.com",
+ "html.net",
+ "utsandiego.com",
+ "gyakorikerdesek.hu",
+ "viddyhddownload.com",
+ "wannonce.com",
+ "qudong.com",
+ "ibicn.com",
+ "w3resource.com",
+ "socialsecurity.gov",
+ "tvn.pl",
+ "momsexclipz.com",
+ "fstoppers.com",
+ "kafeteria.pl",
+ "boulanger.fr",
+ "guj.nic.in",
+ "divaina.com",
+ "desktopnexus.com",
+ "topseda.ir",
+ "payumoney.com",
+ "klicktel.de",
+ "foxtv.es",
+ "cuatro.com",
+ "publix.com",
+ "astrosage.com",
+ "kompass.com",
+ "web-hosting.com",
+ "nus.edu.sg",
+ "jamiiforums.com",
+ "lancers.jp",
+ "peixeurbano.com.br",
+ "buysub.com",
+ "yp.com",
+ "enstage.com",
+ "6eat.com",
+ "1ent.com.cn",
+ "unionpaysecure.com",
+ "pcgames.de",
+ "ccidcom.com",
+ "lavenir.net",
+ "novaposhta.ua",
+ "hotpornshow.com",
+ "telebank.ru",
+ "avaz.ba",
+ "doit.com.cn",
+ "setlinks.ru",
+ "zagat.com",
+ "sportmaster.ru",
+ "utarget.ru",
+ "lingualeo.ru",
+ "compucalitv.com",
+ "anastasiadate.com",
+ "webmaster-rank.info",
+ "fastcoexist.com",
+ "lavasoft.com",
+ "ppvguru.com",
+ "greatist.com",
+ "knack.be",
+ "wowwiki.com",
+ "ilcorsaronero.info",
+ "jword.jp",
+ "750g.com",
+ "pantipmarket.com",
+ "top.de",
+ "photofunia.com",
+ "dryicons.com",
+ "alweeam.com.sa",
+ "dnfight.com",
+ "wpolityce.pl",
+ "vimeocdn.com",
+ "visit-x.net",
+ "takungpao.com",
+ "perfectworld.eu",
+ "kat.ph",
+ "hefei.cc",
+ "cmse.ru",
+ "virginia.edu",
+ "fudan.edu.cn",
+ "sethgodin.typepad.com",
+ "caracaschronicles.com",
+ "18qt.com",
+ "be2.com.br",
+ "rakuten.tw",
+ "bukkit.org",
+ "miss-no1.com",
+ "nts.org.pk",
+ "ulozto.net",
+ "mixpanel.com",
+ "glavred.info",
+ "vui.vn",
+ "mindspark.com",
+ "worldmarket.com",
+ "walmart.com.mx",
+ "deperu.com",
+ "taxact.com",
+ "m5zn.com",
+ "navy.mil",
+ "hibapress.com",
+ "cpasbien.com",
+ "interjet.com.mx",
+ "llbean.com",
+ "kenrockwell.com",
+ "japan-guide.com",
+ "financialpost.com",
+ "rankingsinstitute.com",
+ "master-x.com",
+ "pandawill.com",
+ "marketingweek.co.uk",
+ "freeforums.org",
+ "ysear.ch",
+ "pokerstars.com",
+ "wired.co.uk",
+ "amino.dk",
+ "rapidcrush.com",
+ "vivanuncios.com",
+ "blogsvertise.com",
+ "cwb.gov.tw",
+ "piter.tv",
+ "gistmania.com",
+ "topdocumentaryfilms.com",
+ "shoghlanty.com",
+ "bankmillennium.pl",
+ "burberry.com",
+ "youporngay.com",
+ "webresourcesdepot.com",
+ "beachbody.com",
+ "asstr.org",
+ "pwc.com",
+ "competitor.com",
+ "rss2search.com",
+ "vocuspr.com",
+ "behindthename.com",
+ "moniker.com",
+ "jayde.com",
+ "opensuse.org",
+ "poemhunter.com",
+ "toranoana.jp",
+ "interaksyon.com",
+ "aeon.co.jp",
+ "gungho.jp",
+ "fgov.be",
+ "xpg.uol.com.br",
+ "logic-immo.com",
+ "worldsex.com",
+ "watchonlineseries.eu",
+ "google.co.mz",
+ "discas.net",
+ "chmail.ir",
+ "consumercomplaints.in",
+ "allstate.com",
+ "twelveskip.com",
+ "ibibo.com",
+ "noelshack.com",
+ "bonprix.ru",
+ "directupload.net",
+ "equipobimlatino.com",
+ "weather2umbrella.com",
+ "aibang.com",
+ "blog.wordpress.com",
+ "turner.com",
+ "mediapart.fr",
+ "bloog.pl",
+ "monotaro.com",
+ "online.net",
+ "bodmillenium.com",
+ "distancesfrom.com",
+ "naosalvo.com.br",
+ "ap7am.com",
+ "focus.ua",
+ "cokeandpopcorn.ch",
+ "qwant.com",
+ "megaplan.ru",
+ "sinhvienit.net",
+ "dream-marriage.com",
+ "voicefive.com",
+ "forex.com.cn",
+ "xabbs.com",
+ "netmums.com",
+ "tuxboard.com",
+ "cs-cart.com",
+ "bitcoin.it",
+ "boblil.com",
+ "nirsoft.net",
+ "neopets.com",
+ "spin.com",
+ "costco.ca",
+ "mirraw.com",
+ "ara.cat",
+ "klamm.de",
+ "glam.com",
+ "guenstiger.de",
+ "citruspay.com",
+ "dnslink.com",
+ "guyism.com",
+ "shopotam.ru",
+ "tim.it",
+ "3suisses.fr",
+ "gooroops.com",
+ "kau.edu.sa",
+ "ukbusinessforums.co.uk",
+ "gree.jp",
+ "komikid.com",
+ "redakcja.pl",
+ "qpic.cn",
+ "voyeurweb.com",
+ "mathworks.com",
+ "monster.fr",
+ "seniat.gob.ve",
+ "computrabajo.com.co",
+ "xilu.com",
+ "madrid.org",
+ "ostraining.com",
+ "bharian.com.my",
+ "telegram.org",
+ "sumofus.org",
+ "whosdatedwho.com",
+ "moreofit.com",
+ "meetic.it",
+ "femina.mk",
+ "itworld.com",
+ "indiaglitz.com",
+ "cheatcc.com",
+ "filmfanatic.com",
+ "the-bux.net",
+ "very.co.uk",
+ "fetishshrine.com",
+ "speakingtree.in",
+ "iu.edu",
+ "modern.az",
+ "tak.ru",
+ "internetmarketingninjas.com",
+ "example.com",
+ "sportgeza.hu",
+ "wrestlezone.com",
+ "jameda.de",
+ "caikuu.com",
+ "gioco.it",
+ "yourtv.com.au",
+ "euro.com.pl",
+ "anz.co.nz",
+ "daft.ie",
+ "tirerack.com",
+ "vivareal.com.br",
+ "definebabe.com",
+ "ittefaq.com.bd",
+ "lastfm.es",
+ "zocalo.com.mx",
+ "dpd.de",
+ "somethingawful.com",
+ "virgin.com",
+ "shtyle.fm",
+ "viralforest.com",
+ "dntrck.com",
+ "its-mo.com",
+ "q.cc",
+ "kinghost.net",
+ "elpais.com.co",
+ "joomlaspanish.org",
+ "sopitas.com",
+ "wallbase.cc",
+ "cpalead.com",
+ "torrentfunk.com",
+ "bizcom.com.ru",
+ "quizony.com",
+ "rcgroups.com",
+ "spring.io",
+ "kuaidi100.com",
+ "xatakandroid.com",
+ "mlstatic.com",
+ "borsaat.com",
+ "jagobd.com",
+ "cosmiq.de",
+ "crucial.com",
+ "cdstm.cn",
+ "betclic.fr",
+ "telewebion.com",
+ "exhentai.org",
+ "gnezdo.ru",
+ "cebupacificair.com",
+ "fusionmls.com",
+ "shafaf.ir",
+ "ticketmaster.co.uk",
+ "adslzone.net",
+ "k8.cn",
+ "recipdonor.com",
+ "in.gov",
+ "mforos.com",
+ "asscj.com",
+ "linkconnector.com",
+ "ohfreesex.com",
+ "cntraveler.com",
+ "scambioetico.org",
+ "ladenzeile.de",
+ "ntn24.com",
+ "beyazperde.com",
+ "motherearthnews.com",
+ "yupptv.com",
+ "220tube.com",
+ "fizzle.co",
+ "lakii.com",
+ "deutsche-wirtschafts-nachrichten.de",
+ "saaid.net",
+ "bimlatino.com",
+ "verisign.com",
+ "funpatogh.com",
+ "matadornetwork.com",
+ "seatguru.com",
+ "lululemon.com",
+ "uzise.com",
+ "networkworld.com",
+ "hottube.me",
+ "jobsdb.com.hk",
+ "life.hu",
+ "bonusvid.com",
+ "incometaxindiaefiling.gov.in",
+ "ey.com",
+ "alraimedia.com",
+ "allposters.com",
+ "authorityroi.com",
+ "bmwusa.com",
+ "ebaystatic.com",
+ "entertainmentcrave.com",
+ "ehow.com.br",
+ "prisonplanet.com",
+ "elnashra.com",
+ "email.cz",
+ "yes123.com.tw",
+ "uitzendinggemist.nl",
+ "mindtools.com",
+ "atv.com.tr",
+ "shoes.net.cn",
+ "joomlaportal.de",
+ "themoneyconverter.com",
+ "meteomedia.com",
+ "bankaustria.at",
+ "advertise.com",
+ "trafficswarm.com",
+ "aztecaporno.com",
+ "fourseasons.com",
+ "movie-blog.org",
+ "govdelivery.com",
+ "didigames.com",
+ "invideo.biz",
+ "linux.org.ru",
+ "omelete.uol.com.br",
+ "babybus.cn",
+ "oursogo.com",
+ "ero-an.com",
+ "mediafax.ro",
+ "football.ua",
+ "sii.cl",
+ "dreamamateurs.com",
+ "cheaperthandirt.com",
+ "iplocation.net",
+ "insideview.com",
+ "hihe.vn",
+ "stop-sex.com",
+ "fubiz.net",
+ "url.org",
+ "greenmangaming.com",
+ "pornup.me",
+ "indofeed.com",
+ "forumhouse.ru",
+ "restaurant.com",
+ "key.com",
+ "windstream.net",
+ "brightedge.com",
+ "foreignpolicy.com",
+ "noticiasdatv.uol.com.br",
+ "logopond.com",
+ "datemule.com",
+ "webrootanywhere.com",
+ "stomp.com.sg",
+ "trthaber.com",
+ "bitterstrawberry.com",
+ "turbo.az",
+ "kbs.co.kr",
+ "joblo.com",
+ "seatimes.com.vn",
+ "kuwait.tt",
+ "258.com",
+ "kp.ua",
+ "moviesmobile.net",
+ "flamingtext.com",
+ "youngt.com",
+ "etradenow.cn",
+ "copart.com",
+ "tuanweihui.com",
+ "zinkwaphd.com",
+ "adsl.free.fr",
+ "infomaniak.ch",
+ "re-direcciona.me",
+ "mejorenvo.com",
+ "instantservice.com",
+ "harpersbazaar.com",
+ "colorado.edu",
+ "belboon.com",
+ "telelistas.net",
+ "photofans.cn",
+ "51seer.com",
+ "danjur.com",
+ "wunderweib.de",
+ "extratorrentlive.com",
+ "serpfox.com",
+ "androidkade.com",
+ "raja.ir",
+ "tampabay.com",
+ "ser-mujer.org",
+ "imasters.com.br",
+ "coachfactory.com",
+ "mojopages.com",
+ "makezine.com",
+ "forexschoolonline.com",
+ "bochk.com",
+ "siamsport.co.th",
+ "mdpr.jp",
+ "serialssolutions.com",
+ "videosexarchive.com",
+ "enlnks.com",
+ "cision.com",
+ "scratchinginfo.com",
+ "skidrowgames.net",
+ "optimizely.com",
+ "video2brain.com",
+ "ariva.de",
+ "audiomack.com",
+ "pimproll.com",
+ "house.gov",
+ "acs.org",
+ "pijamasurf.com",
+ "autoc-one.jp",
+ "southcn.com",
+ "vesti.az",
+ "300mbfilms.com",
+ "speedmystream.com",
+ "wooservers.com",
+ "siteliner.com",
+ "tinmoi.vn",
+ "extremepornvideos.com",
+ "cqsq.com",
+ "hello-today.com",
+ "turkcealtyazi.org",
+ "tvyo.com",
+ "dealmoon.com",
+ "openenglish.com",
+ "golfchannel.com",
+ "irancloob.com",
+ "ebs.in",
+ "portalcorreio.uol.com.br",
+ "beemp3s.org",
+ "condenast.com",
+ "mtwebcenters.com.tw",
+ "hatelabo.jp",
+ "pathci.net",
+ "mamsy.ru",
+ "noticiasdelmundo.org",
+ "guru3d.com",
+ "logomaker.com",
+ "adhitz.com",
+ "swiki.jp",
+ "turnitin.com",
+ "patoghu.com",
+ "carnaval.uol.com.br",
+ "cancer.org",
+ "clickprime8.com",
+ "fahrinfo-berlin.de",
+ "unisender.com",
+ "flashkhor.com",
+ "goodfon.ru",
+ "ethiotube.net",
+ "cunbang.com",
+ "ti-da.net",
+ "1phads.com",
+ "bien.hu",
+ "home77.com",
+ "mbabycare.com",
+ "vudu.com",
+ "fantasy8.com",
+ "landrover.com",
+ "opencartforum.ru",
+ "antena3.ro",
+ "getapp.com",
+ "torlock.com",
+ "wind.it",
+ "expatads.com",
+ "bloglines.com",
+ "sexytube.me",
+ "frontier.com",
+ "asandownload.com",
+ "groupon.pl",
+ "storesonlinepro.com",
+ "brands4friends.de",
+ "infogr.am",
+ "webeffector.ru",
+ "google.com.mm",
+ "ppchero.com",
+ "privacystar.com",
+ "ocregister.com",
+ "liex.ru",
+ "kopatheme.com",
+ "toggl.com",
+ "raywenderlich.com",
+ "hecha.cn",
+ "vpls.net",
+ "manpianyi.com",
+ "1881.no",
+ "scbeasy.com",
+ "plex.tv",
+ "selfridges.com",
+ "anumex.com",
+ "postplanner.com",
+ "thisiscolossal.com",
+ "you-will-date.com",
+ "idealist.org",
+ "emarketer.com",
+ "anibis.ch",
+ "dansmovies.com",
+ "footballitarin.com",
+ "fragrantica.com",
+ "10minutemail.com",
+ "ntu.edu.tw",
+ "clasicooo.com",
+ "onsugar.com",
+ "vr-zone.com",
+ "walkerplus.com",
+ "easymobilerecharge.com",
+ "cz001.com.cn",
+ "sportsseoul.com",
+ "inazumanews2.com",
+ "marketingdirecto.com",
+ "chartboost.com",
+ "unblocked.co",
+ "rhymezone.com",
+ "portalinmobiliario.com",
+ "afrointroductions.com",
+ "transunion.com",
+ "panorama.it",
+ "powershow.com",
+ "avval.ir",
+ "onlinemeetingnow.com",
+ "xoom.com",
+ "wnbc.com",
+ "tlen.pl",
+ "jetairways.com",
+ "vtb24.ru",
+ "offcn.com",
+ "crx7601.com",
+ "adverts.ie",
+ "kasserver.com",
+ "minhavida.com.br",
+ "jkpj.com",
+ "123contactform.com",
+ "imgtiger.com",
+ "folha.com.br",
+ "npcgo.com",
+ "semprot.com",
+ "moonfruit.com",
+ "jizzbell.com",
+ "online-stopwatch.com",
+ "allhiphop.com",
+ "hackaday.com",
+ "digitalplayground.com",
+ "careers24.com",
+ "cwq.com",
+ "wondershare.com",
+ "filesend.to",
+ "puromarketing.com",
+ "workopolis.com",
+ "mudainodocument.com",
+ "home.ne.jp",
+ "shorte.st",
+ "tanea.gr",
+ "sporza.be",
+ "vgorode.ua",
+ "google.co.zm",
+ "argumentua.com",
+ "3m.com",
+ "komputerswiat.pl",
+ "bongdaplus.vn",
+ "supersonicads.com",
+ "soundclick.com",
+ "lollipop-network.com",
+ "lpcloudsvr304.com",
+ "313.cn",
+ "rtl2.de",
+ "ts.cn",
+ "mglradio.com",
+ "diynetwork.com",
+ "komikcaps.net",
+ "all-that-is-interesting.com",
+ "ultipro.com",
+ "frombar.com",
+ "sitedeals.nl",
+ "codingforums.com",
+ "kansascity.com",
+ "twtrland.com",
+ "cengage.com",
+ "lolspotsarticles.com",
+ "jackthreads.com",
+ "jobstreet.com.sg",
+ "diffen.com",
+ "eme2000.com",
+ "superbru.com",
+ "droid-life.com",
+ "itb-berlin.de",
+ "estibot.com",
+ "yourepeat.com",
+ "112.ua",
+ "70e.com",
+ "grid.mk",
+ "cromaretail.com",
+ "jobstreet.com.ph",
+ "gloadmarket.com",
+ "gemius.com",
+ "huuto.net",
+ "vogue.it",
+ "divxonline.info",
+ "mytoys.de",
+ "cashnhits.com",
+ "minkchan.com",
+ "talabat.com",
+ "helpareporter.com",
+ "grandascent.com",
+ "catalunyacaixa.com",
+ "sparwelt.de",
+ "tvboxnow.com",
+ "imagecurl.org",
+ "coocan.jp",
+ "eatingwell.com",
+ "truelife.com",
+ "binaryoptionsbrands.com",
+ "foxsportsla.com",
+ "jjshouse.com",
+ "makaan.com",
+ "yamaha.com",
+ "activerain.com",
+ "excelforum.com",
+ "mobinnet.ir",
+ "kasikornbankgroup.com",
+ "googleplex.com",
+ "medianama.com",
+ "fullsail.edu",
+ "makeupandbeauty.com",
+ "marketwired.com",
+ "beachbodycoach.com",
+ "taloussanomat.fi",
+ "youngliving.us",
+ "dana.ir",
+ "adsgostar.com",
+ "esquire.com.cn",
+ "meyerweb.com",
+ "positivemed.com",
+ "harvestapp.com",
+ "tim.com.br",
+ "sumorobo.net",
+ "zbigz.com",
+ "schulferien.org",
+ "quzhao.com",
+ "tsinghua.edu.cn",
+ "vogue.com",
+ "ecrater.com",
+ "internetbs.net",
+ "oper.ru",
+ "kingstone.com.tw",
+ "olympic.org",
+ "code.org",
+ "wp.tv",
+ "adchakra.net",
+ "passarela.com.br",
+ "damn.com",
+ "spn.com.cn",
+ "sacitaslan.com",
+ "uplod.ir",
+ "kununu.com",
+ "englishclub.com",
+ "ibood.com",
+ "buzzfed.com",
+ "peopledaily.com.cn",
+ "vivastreet.it",
+ "adshostnet.com",
+ "npmjs.org",
+ "lovethatsex.com",
+ "garena.tw",
+ "hq-sex-tube.com",
+ "tvsubtitles.net",
+ "trademarkia.com",
+ "96down.com",
+ "morhipo.com",
+ "chuguoqu.com",
+ "free-css.com",
+ "getsecuredfiles.com",
+ "justia.com",
+ "paypal-community.com",
+ "wezoner.com",
+ "google-analytics.com",
+ "outsideonline.com",
+ "simplymeasured.com",
+ "wattsupwiththat.com",
+ "vancl.com",
+ "leadership.ng",
+ "plaisio.gr",
+ "fastcocreate.com",
+ "fewo-direkt.de",
+ "dedecms.com",
+ "bostonherald.com",
+ "elmundo.com.ve",
+ "idhostinger.com",
+ "animaljam.com",
+ "infoq.com",
+ "exler.ru",
+ "leprosorium.ru",
+ "avis.com",
+ "ulusalpost.com",
+ "namnak.com",
+ "goindigo.in",
+ "activeboard.com",
+ "fatsecret.com",
+ "4umf.com",
+ "porn-w.org",
+ "sarkariexam.co.in",
+ "patagonia.com",
+ "3u5.net",
+ "roshd.ir",
+ "netechangisme.com",
+ "ojogo.pt",
+ "ujipin.com",
+ "topuniversities.com",
+ "consequenceofsound.net",
+ "no-ip.biz",
+ "webdesignerwall.com",
+ "fin24.com",
+ "openculture.com",
+ "pbh2.com",
+ "dota2.com",
+ "secureupload.eu",
+ "alfajertv.com",
+ "canlidizihdtv.com",
+ "muffingroup.com",
+ "imageforum.com",
+ "paris.fr",
+ "kaufda.de",
+ "pelis24.com",
+ "ixian.cn",
+ "ebenpagan.com",
+ "sportsauthority.com",
+ "wish.com",
+ "ganeshaspeaks.com",
+ "meritnation.com",
+ "ijie.com",
+ "vodafone.com.tr",
+ "trovit.es",
+ "farsisubtitle.com",
+ "musawvir.com",
+ "resellerratings.com",
+ "soyentrepreneur.com",
+ "samakal.net",
+ "dietnavi.com",
+ "55tuan.com",
+ "elcomercio.com",
+ "hereisthecity.com",
+ "buienradar.nl",
+ "arenabg.com",
+ "indiansexstories.net",
+ "slideboom.com",
+ "findsection.net",
+ "rankrecon.com",
+ "e-radio.gr",
+ "cnn.co.jp",
+ "gucci.com",
+ "natura.net",
+ "googlesyndication.com",
+ "advancedwebranking.com",
+ "lib.ru",
+ "sfora.pl",
+ "uci.edu",
+ "haaretz.co.il",
+ "ing.be",
+ "yokboylebirsey.com.tr",
+ "myfact.tv",
+ "yenibiris.com",
+ "stuff.tv",
+ "dn.pt",
+ "whydontyoutrythis.com",
+ "nediyor.com",
+ "worldoftanks.asia",
+ "megamillions.com",
+ "elemanonline.net",
+ "computrabajo.com.pe",
+ "arxiv.org",
+ "livescore.tv",
+ "aintitcool.com",
+ "girlschannel.net",
+ "madbid.com",
+ "tadawul.com.sa",
+ "liqpay.com",
+ "softonic.jp",
+ "alhilal.com",
+ "bizpowa.com",
+ "thatguywiththeglasses.com",
+ "yemeneconomist.com",
+ "pazar3.mk",
+ "repai.com",
+ "1jux.net",
+ "solvusoft.com",
+ "yotpo.com",
+ "cuantocabron.com",
+ "ba.gov.br",
+ "arin.net",
+ "loginza.ru",
+ "homebank.ro",
+ "0755car.com",
+ "carscoops.com",
+ "antarvasna.com",
+ "tizag.com",
+ "offerpop.com",
+ "techmeme.com",
+ "ipress.ua",
+ "emuparadise.me",
+ "sexvidx.com",
+ "whatseek.com",
+ "become.co.jp",
+ "snapfish.com",
+ "gsis.gr",
+ "speedyshare.com",
+ "uncrate.com",
+ "doda.jp",
+ "straighttalk.com",
+ "rsjoomla.com",
+ "vozpopuli.com",
+ "gotprint.net",
+ "finansbank.com.tr",
+ "chinatrust.com.tw",
+ "stratoserver.net",
+ "icnetwork.co.uk",
+ "getpopcornti.me",
+ "pornper.com",
+ "3dmgame.com",
+ "squirt.org",
+ "mbusa.com",
+ "katespade.com",
+ "skat.dk",
+ "radiko.jp",
+ "dexonline.ro",
+ "bicaps.net",
+ "bitsoma.com",
+ "brasil247.com",
+ "alittlemarket.com",
+ "bd-pratidin.com",
+ "amorincontro.com",
+ "bigxvideos.com",
+ "nissan.co.jp",
+ "incomediary.com",
+ "theranking.com",
+ "el7l.co",
+ "webcamtoy.com",
+ "steamgifts.com",
+ "miles-and-more.com",
+ "szonline.net",
+ "blocked-website.com",
+ "kaztorka.org",
+ "avforums.com",
+ "indulgy.com",
+ "extendcp.co.uk",
+ "yonkis.com",
+ "ad1111.com",
+ "unionbankph.com",
+ "job.com",
+ "samanepay.com",
+ "aceona.com",
+ "kar.nic.in",
+ "tipico.com",
+ "sa.ae",
+ "froma.com",
+ "songza.com",
+ "calciomercato.com",
+ "besaba.com",
+ "x-rates.com",
+ "arsys.es",
+ "sisal.it",
+ "amateur.tv",
+ "designyourway.net",
+ "alpha.gr",
+ "nimble.com",
+ "livefreefun.com",
+ "wipo.int",
+ "webssearches.com",
+ "vodjk.com",
+ "91tiger.com",
+ "swisscom.com",
+ "tuvaro.com",
+ "parsonline.net",
+ "uolhost.com.br",
+ "cnwest.com",
+ "roksa.pl",
+ "socialmention.com",
+ "unibytes.com",
+ "screamingfrog.co.uk",
+ "owncloud.org",
+ "jacquielawson.com",
+ "openclipart.org",
+ "zimbra.com",
+ "poczta-polska.pl",
+ "hayah.cc",
+ "ringtonematcher.com",
+ "emai.com",
+ "wealink.com",
+ "celebzen.com",
+ "pichost.me",
+ "rediffmail.com",
+ "dinos.co.jp",
+ "netvasco.com.br",
+ "meilele.com",
+ "career.ru",
+ "signupgenius.com",
+ "screencast-o-matic.com",
+ "nav.no",
+ "reactiongifs.com",
+ "italki.com",
+ "mo.gov",
+ "bandsintown.com",
+ "elwatan.com",
+ "jdate.com",
+ "quiente.net",
+ "skynet.be",
+ "googlekeywordtool.com",
+ "nubilefilms.com",
+ "memedeportes.com",
+ "rewardingzonez.com",
+ "litmus.com",
+ "iyaxin.com",
+ "collegeconfidential.com",
+ "semperplugins.com",
+ "sofort.com",
+ "ineedhits.com",
+ "live24.gr",
+ "acronymfinder.com",
+ "jobui.com",
+ "9show.com",
+ "thedirty.com",
+ "tsutaya.co.jp",
+ "9787.com",
+ "brighthouse.com",
+ "boxingscene.com",
+ "indeed.com.br",
+ "morazzia.com",
+ "privatejobshub.blogspot.in",
+ "searchenginepeople.com",
+ "pozdravok.ru",
+ "watchstore.com.cn",
+ "rts.ch",
+ "pluska.sk",
+ "villagevoice.com",
+ "sprintrade.com",
+ "conversionxl.com",
+ "evsuite.com",
+ "bci.cl",
+ "lampsplus.com",
+ "gossipcop.com",
+ "valuecommerce.com",
+ "zalora.co.id",
+ "fastshop.com.br",
+ "hockeysfuture.com",
+ "bootply.com",
+ "chinavasion.com",
+ "menards.com",
+ "kinobar.net",
+ "tokyodisneyresort.jp",
+ "knownhost.com",
+ "ozbargain.com.au",
+ "olx.com.ve",
+ "sgk.gov.tr",
+ "berliner-sparkasse.de",
+ "bancogalicia.com.ar",
+ "joomla-master.org",
+ "augsburger-allgemeine.de",
+ "kroger.com",
+ "pulse.ng",
+ "putlocker.com",
+ "jrtj.com",
+ "tapuz.co.il",
+ "madhyamam.com",
+ "donews.com",
+ "showhaber.com",
+ "allxnxx.com",
+ "uned.es",
+ "adsharebux.com",
+ "d-addicts.com",
+ "banki.ir",
+ "levi.com",
+ "e97527f0.se",
+ "entertainmentwise.com",
+ "xvideos-field.com",
+ "naver.net",
+ "urbia.de",
+ "fashionsfriend.com",
+ "emuch.net",
+ "yelp.fr",
+ "metatube.com",
+ "sina.com.hk",
+ "omb100.com",
+ "grameenphone.com",
+ "stylebook.de",
+ "funny-games.biz",
+ "googlewebmastercentral.blogspot.com",
+ "vogella.com",
+ "surveymonkey.net",
+ "forex4you.org",
+ "mex.tl",
+ "online-fish-games.com",
+ "millenniumbcp.pt",
+ "fileom.com",
+ "friendorfollow.com",
+ "downloads.nl",
+ "typekit.com",
+ "gongkong.com",
+ "iqoption.com",
+ "tori.fi",
+ "smartsource.com",
+ "1616.net",
+ "1shoppingcart.com",
+ "novosti.rs",
+ "yofond.com",
+ "idokep.hu",
+ "motor.ru",
+ "xbiao.com",
+ "colorcombos.com",
+ "pway.cn",
+ "egynews.net",
+ "elshaab.org",
+ "telus.com",
+ "olx.com.co",
+ "cctvcj.com",
+ "kpopstarz.com",
+ "razorsocial.com",
+ "ncrypt.in",
+ "zonetheme.com",
+ "gumroad.com",
+ "e-shop.gr",
+ "kugli.com",
+ "levif.be",
+ "bookfi.org",
+ "globalresearch.ca",
+ "sas.com",
+ "cloudaccess.net",
+ "uplooder.net",
+ "exposedwebcams.com",
+ "1prime.ru",
+ "webappers.com",
+ "crocko.com",
+ "remax.com",
+ "ikco.com",
+ "dinside.no",
+ "winbank.gr",
+ "mijnwoordenboek.nl",
+ "weatherzone.com.au",
+ "allday2.com",
+ "sunat.gob.pe",
+ "getit.in",
+ "entrance-exam.net",
+ "i2ya.com",
+ "tlife.gr",
+ "qyer.com",
+ "calibre-ebook.com",
+ "internetcorkboard.com",
+ "unitedhyipleague.com",
+ "spyrestudios.com",
+ "metal-archives.com",
+ "aeromexico.com",
+ "cv-library.co.uk",
+ "bdr1.net",
+ "aremo.com.br",
+ "blip.tv",
+ "afilio.com.br",
+ "renewalcoupons.com",
+ "proxfree.com",
+ "magix.com",
+ "jobs.net",
+ "souism.com",
+ "adtcstrk.com",
+ "goodhousekeeping.com",
+ "lastfm.ru",
+ "sharecare.com",
+ "porn.xxx",
+ "deathandtaxesmag.com",
+ "unocero.com",
+ "wer-kennt-wen.de",
+ "hotfrog.com",
+ "intraship.de",
+ "press24.mk",
+ "yournewscorner.com",
+ "rbc.com",
+ "eventure.com",
+ "minglebox.com",
+ "legendas.tv",
+ "drp.su",
+ "voicefrom.me",
+ "venezuelaaldia.com",
+ "cooks.com",
+ "numbeo.com",
+ "chilehardware.cl",
+ "cryptocointalk.com",
+ "venusfactor.com",
+ "recruitmentcareer.in",
+ "larazon.es",
+ "sptechs.com",
+ "asx.com.au",
+ "ahlife.com",
+ "st001.com",
+ "actudesfinances.info",
+ "talkarcades.com",
+ "nitori-net.jp",
+ "chinahr.com",
+ "websitetestlink.com",
+ "hypem.com",
+ "demorgen.be",
+ "sharefile.com",
+ "prensalibre.com",
+ "eldia.com.ar",
+ "billiger.de",
+ "3docean.net",
+ "streamsend.com",
+ "tuaw.com",
+ "portafolio.co",
+ "trivago.com",
+ "olxpix.com",
+ "geotrust.com",
+ "torrentgun.net",
+ "enha.kr",
+ "pcastuces.com",
+ "t.cn",
+ "dimsemenov.com",
+ "cam4.nl",
+ "basspro.com",
+ "macupdate.com",
+ "strawpoll.me",
+ "elintransigente.com",
+ "homeaway.co.uk",
+ "my.ecwid.com",
+ "graphpaperpress.com",
+ "architonic.com",
+ "flowplayer.org",
+ "syshl.com",
+ "18schoolgirlz.com"
+ });
+
+ return urls;
+}
diff --git a/src/boost/libs/beast/example/http/client/crawl/urls_large_data.hpp b/src/boost/libs/beast/example/http/client/crawl/urls_large_data.hpp
new file mode 100644
index 000000000..06be4acd9
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/crawl/urls_large_data.hpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_HTTP_CLIENT_CRAWL_URLS_LARGE_DATA_HPP
+#define BOOST_BEAST_EXAMPLE_HTTP_CLIENT_CRAWL_URLS_LARGE_DATA_HPP
+
+#include <vector>
+
+std::vector<char const*> const&
+urls_large_data();
+
+#endif
diff --git a/src/boost/libs/beast/example/http/client/sync-ssl/CMakeLists.txt b/src/boost/libs/beast/example/http/client/sync-ssl/CMakeLists.txt
new file mode 100644
index 000000000..0e0fbea07
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/sync-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/client/sync-ssl "/")
+
+ add_executable (http-client-sync-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ http_client_sync_ssl.cpp
+ )
+
+ set_property(TARGET http-client-sync-ssl PROPERTY FOLDER "example-http-client")
+
+ target_link_libraries (http-client-sync-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/client/sync-ssl/Jamfile b/src/boost/libs/beast/example/http/client/sync-ssl/Jamfile
new file mode 100644
index 000000000..c1fabf479
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/sync-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-client-sync-ssl :
+ http_client_sync_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/client/sync-ssl/http_client_sync_ssl.cpp b/src/boost/libs/beast/example/http/client/sync-ssl/http_client_sync_ssl.cpp
new file mode 100644
index 000000000..726c84204
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/sync-ssl/http_client_sync_ssl.cpp
@@ -0,0 +1,128 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL client, synchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/connect.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/ssl/error.hpp>
+#include <boost/asio/ssl/stream.hpp>
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = net::ssl; // from <boost/asio/ssl.hpp>
+using tcp = net::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Performs an HTTP GET and prints the response
+int main(int argc, char** argv)
+{
+ try
+ {
+ // Check command line arguments.
+ if(argc != 4 && argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-client-sync-ssl <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
+ "Example:\n" <<
+ " http-client-sync-ssl www.example.com 443 /\n" <<
+ " http-client-sync-ssl www.example.com 443 / 1.0\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const target = argv[3];
+ int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx(ssl::context::tlsv12_client);
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // Verify the remote server's certificate
+ ctx.set_verify_mode(ssl::verify_peer);
+
+ // These objects perform our I/O
+ tcp::resolver resolver(ioc);
+ beast::ssl_stream<beast::tcp_stream> stream(ioc, ctx);
+
+ // Set SNI Hostname (many hosts need this to handshake successfully)
+ if(! SSL_set_tlsext_host_name(stream.native_handle(), host))
+ {
+ beast::error_code ec{static_cast<int>(::ERR_get_error()), net::error::get_ssl_category()};
+ throw beast::system_error{ec};
+ }
+
+ // Look up the domain name
+ auto const results = resolver.resolve(host, port);
+
+ // Make the connection on the IP address we get from a lookup
+ beast::get_lowest_layer(stream).connect(results);
+
+ // Perform the SSL handshake
+ stream.handshake(ssl::stream_base::client);
+
+ // Set up an HTTP GET request message
+ http::request<http::string_body> req{http::verb::get, target, version};
+ req.set(http::field::host, host);
+ req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+
+ // Send the HTTP request to the remote host
+ http::write(stream, req);
+
+ // This buffer is used for reading and must be persisted
+ beast::flat_buffer buffer;
+
+ // Declare a container to hold the response
+ http::response<http::dynamic_body> res;
+
+ // Receive the HTTP response
+ http::read(stream, buffer, res);
+
+ // Write the message to standard out
+ std::cout << res << std::endl;
+
+ // Gracefully close the stream
+ beast::error_code ec;
+ stream.shutdown(ec);
+ if(ec == net::error::eof)
+ {
+ // Rationale:
+ // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
+ ec = {};
+ }
+ if(ec)
+ throw beast::system_error{ec};
+
+ // If we get here then the connection is closed gracefully
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/client/sync/CMakeLists.txt b/src/boost/libs/beast/example/http/client/sync/CMakeLists.txt
new file mode 100644
index 000000000..ea877ec4f
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/sync/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/client/sync "/")
+
+add_executable (http-client-sync
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_client_sync.cpp
+)
+
+target_link_libraries(http-client-sync
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-client-sync PROPERTY FOLDER "example-http-client")
diff --git a/src/boost/libs/beast/example/http/client/sync/Jamfile b/src/boost/libs/beast/example/http/client/sync/Jamfile
new file mode 100644
index 000000000..969246f65
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/sync/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-client-sync :
+ http_client_sync.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/client/sync/http_client_sync.cpp b/src/boost/libs/beast/example/http/client/sync/http_client_sync.cpp
new file mode 100644
index 000000000..795618161
--- /dev/null
+++ b/src/boost/libs/beast/example/http/client/sync/http_client_sync.cpp
@@ -0,0 +1,105 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP client, synchronous
+//
+//------------------------------------------------------------------------------
+
+//[example_http_client
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/connect.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = net::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Performs an HTTP GET and prints the response
+int main(int argc, char** argv)
+{
+ try
+ {
+ // Check command line arguments.
+ if(argc != 4 && argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-client-sync <host> <port> <target> [<HTTP version: 1.0 or 1.1(default)>]\n" <<
+ "Example:\n" <<
+ " http-client-sync www.example.com 80 /\n" <<
+ " http-client-sync www.example.com 80 / 1.0\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const target = argv[3];
+ int version = argc == 5 && !std::strcmp("1.0", argv[4]) ? 10 : 11;
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // These objects perform our I/O
+ tcp::resolver resolver(ioc);
+ beast::tcp_stream stream(ioc);
+
+ // Look up the domain name
+ auto const results = resolver.resolve(host, port);
+
+ // Make the connection on the IP address we get from a lookup
+ stream.connect(results);
+
+ // Set up an HTTP GET request message
+ http::request<http::string_body> req{http::verb::get, target, version};
+ req.set(http::field::host, host);
+ req.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
+
+ // Send the HTTP request to the remote host
+ http::write(stream, req);
+
+ // This buffer is used for reading and must be persisted
+ beast::flat_buffer buffer;
+
+ // Declare a container to hold the response
+ http::response<http::dynamic_body> res;
+
+ // Receive the HTTP response
+ http::read(stream, buffer, res);
+
+ // Write the message to standard out
+ std::cout << res << std::endl;
+
+ // Gracefully close the socket
+ beast::error_code ec;
+ stream.socket().shutdown(tcp::socket::shutdown_both, ec);
+
+ // not_connected happens sometimes
+ // so don't bother reporting it.
+ //
+ if(ec && ec != beast::errc::not_connected)
+ throw beast::system_error{ec};
+
+ // If we get here then the connection is closed gracefully
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+}
+
+//]
diff --git a/src/boost/libs/beast/example/http/server/CMakeLists.txt b/src/boost/libs/beast/example/http/server/CMakeLists.txt
new file mode 100644
index 000000000..350b465a7
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (async)
+add_subdirectory (coro)
+add_subdirectory (fast)
+add_subdirectory (small)
+add_subdirectory (stackless)
+add_subdirectory (sync)
+
+if (OPENSSL_FOUND)
+ add_subdirectory (async-ssl)
+ add_subdirectory (coro-ssl)
+ add_subdirectory (flex)
+ add_subdirectory (stackless-ssl)
+ add_subdirectory (sync-ssl)
+endif()
diff --git a/src/boost/libs/beast/example/http/server/Jamfile b/src/boost/libs/beast/example/http/server/Jamfile
new file mode 100644
index 000000000..cb8ab104f
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/Jamfile
@@ -0,0 +1,22 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+build-project async ;
+build-project coro ;
+build-project fast ;
+build-project small ;
+build-project stackless ;
+build-project sync ;
+
+# SSL
+build-project async-ssl ;
+build-project coro-ssl ;
+build-project flex ;
+build-project stackless-ssl ;
+build-project sync-ssl ;
diff --git a/src/boost/libs/beast/example/http/server/async-ssl/CMakeLists.txt b/src/boost/libs/beast/example/http/server/async-ssl/CMakeLists.txt
new file mode 100644
index 000000000..4c1e2cd02
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/async-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/server/async-ssl "/")
+
+ add_executable (http-server-async-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ http_server_async_ssl.cpp
+ )
+
+ set_property(TARGET http-server-async-ssl PROPERTY FOLDER "example-http-server")
+
+ target_link_libraries (http-server-async-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/server/async-ssl/Jamfile b/src/boost/libs/beast/example/http/server/async-ssl/Jamfile
new file mode 100644
index 000000000..f4cf0204e
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/async-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-server-async-ssl :
+ http_server_async_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/async-ssl/http_server_async_ssl.cpp b/src/boost/libs/beast/example/http/server/async-ssl/http_server_async_ssl.cpp
new file mode 100644
index 000000000..f6c66c90f
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/async-ssl/http_server_async_ssl.cpp
@@ -0,0 +1,564 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL server, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ // ssl::error::stream_truncated, also known as an SSL "short read",
+ // indicates the peer closed the connection without performing the
+ // required closing handshake (for example, Google does this to
+ // improve performance). Generally this can be a security issue,
+ // but if your communication protocol is self-terminated (as
+ // it is with both HTTP and WebSocket) then you may simply
+ // ignore the lack of close_notify.
+ //
+ // https://github.com/boostorg/beast/issues/38
+ //
+ // https://security.stackexchange.com/questions/91435/how-to-handle-a-malicious-ssl-tls-shutdown
+ //
+ // When a short read would cut off the end of an HTTP message,
+ // Beast returns the error beast::http::error::partial_message.
+ // Therefore, if we see a short read here, it has occurred
+ // after the message has been completed, so it is safe to ignore it.
+
+ if(ec == net::ssl::error::stream_truncated)
+ return;
+
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Handles an HTTP server connection
+class session : public std::enable_shared_from_this<session>
+{
+ // This is the C++11 equivalent of a generic lambda.
+ // The function object is used to send an HTTP message.
+ struct send_lambda
+ {
+ session& self_;
+
+ explicit
+ send_lambda(session& self)
+ : self_(self)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // The lifetime of the message has to extend
+ // for the duration of the async operation so
+ // we use a shared_ptr to manage it.
+ auto sp = std::make_shared<
+ http::message<isRequest, Body, Fields>>(std::move(msg));
+
+ // Store a type-erased version of the shared
+ // pointer in the class to keep it alive.
+ self_.res_ = sp;
+
+ // Write the response
+ http::async_write(
+ self_.stream_,
+ *sp,
+ beast::bind_front_handler(
+ &session::on_write,
+ self_.shared_from_this(),
+ sp->need_eof()));
+ }
+ };
+
+ beast::ssl_stream<beast::tcp_stream> stream_;
+ beast::flat_buffer buffer_;
+ std::shared_ptr<std::string const> doc_root_;
+ http::request<http::string_body> req_;
+ std::shared_ptr<void> res_;
+ send_lambda lambda_;
+
+public:
+ // Take ownership of the socket
+ explicit
+ session(
+ tcp::socket&& socket,
+ ssl::context& ctx,
+ std::shared_ptr<std::string const> const& doc_root)
+ : stream_(std::move(socket), ctx)
+ , doc_root_(doc_root)
+ , lambda_(*this)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(
+ stream_.get_executor(),
+ beast::bind_front_handler(
+ &session::on_run,
+ shared_from_this()));
+ }
+
+ void
+ on_run()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(
+ std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ stream_.async_handshake(
+ ssl::stream_base::server,
+ beast::bind_front_handler(
+ &session::on_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ // Make the request empty before reading,
+ // otherwise the operation behavior is undefined.
+ req_ = {};
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Read a request
+ http::async_read(stream_, buffer_, req_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This means they closed the connection
+ if(ec == http::error::end_of_stream)
+ return do_close();
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ handle_request(*doc_root_, std::move(req_), lambda_);
+ }
+
+ void
+ on_write(
+ bool close,
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ return do_close();
+ }
+
+ // We're done with the response so delete it
+ res_ = nullptr;
+
+ // Read another request
+ do_read();
+ }
+
+ void
+ do_close()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL shutdown
+ stream_.async_shutdown(
+ beast::bind_front_handler(
+ &session::on_shutdown,
+ shared_from_this()));
+ }
+
+ void
+ on_shutdown(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // At this point the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener : public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ ssl::context& ctx_;
+ tcp::acceptor acceptor_;
+ std::shared_ptr<std::string const> doc_root_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root)
+ : ioc_(ioc)
+ , ctx_(ctx)
+ , acceptor_(ioc)
+ , doc_root_(doc_root)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ do_accept();
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(
+ std::move(socket),
+ ctx_,
+ doc_root_)->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-server-async-ssl <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " http-server-async-ssl 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Create and launch a listening port
+ std::make_shared<listener>(
+ ioc,
+ ctx,
+ tcp::endpoint{address, port},
+ doc_root)->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/server/async/CMakeLists.txt b/src/boost/libs/beast/example/http/server/async/CMakeLists.txt
new file mode 100644
index 000000000..b94c0521f
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/async/CMakeLists.txt
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/server/async "/")
+
+add_executable (http-server-async
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_server_async.cpp
+)
+
+target_link_libraries(http-server-async
+ lib-asio
+ lib-asio-ssl
+ lib-beast)
+
+set_property(TARGET http-server-async PROPERTY FOLDER "example-http-server")
diff --git a/src/boost/libs/beast/example/http/server/async/Jamfile b/src/boost/libs/beast/example/http/server/async/Jamfile
new file mode 100644
index 000000000..f36d1ad47
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/async/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-server-async :
+ http_server_async.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/async/http_server_async.cpp b/src/boost/libs/beast/example/http/server/async/http_server_async.cpp
new file mode 100644
index 000000000..55fd234bb
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/async/http_server_async.cpp
@@ -0,0 +1,490 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP server, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Handles an HTTP server connection
+class session : public std::enable_shared_from_this<session>
+{
+ // This is the C++11 equivalent of a generic lambda.
+ // The function object is used to send an HTTP message.
+ struct send_lambda
+ {
+ session& self_;
+
+ explicit
+ send_lambda(session& self)
+ : self_(self)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // The lifetime of the message has to extend
+ // for the duration of the async operation so
+ // we use a shared_ptr to manage it.
+ auto sp = std::make_shared<
+ http::message<isRequest, Body, Fields>>(std::move(msg));
+
+ // Store a type-erased version of the shared
+ // pointer in the class to keep it alive.
+ self_.res_ = sp;
+
+ // Write the response
+ http::async_write(
+ self_.stream_,
+ *sp,
+ beast::bind_front_handler(
+ &session::on_write,
+ self_.shared_from_this(),
+ sp->need_eof()));
+ }
+ };
+
+ beast::tcp_stream stream_;
+ beast::flat_buffer buffer_;
+ std::shared_ptr<std::string const> doc_root_;
+ http::request<http::string_body> req_;
+ std::shared_ptr<void> res_;
+ send_lambda lambda_;
+
+public:
+ // Take ownership of the stream
+ session(
+ tcp::socket&& socket,
+ std::shared_ptr<std::string const> const& doc_root)
+ : stream_(std::move(socket))
+ , doc_root_(doc_root)
+ , lambda_(*this)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(stream_.get_executor(),
+ beast::bind_front_handler(
+ &session::do_read,
+ shared_from_this()));
+ }
+
+ void
+ do_read()
+ {
+ // Make the request empty before reading,
+ // otherwise the operation behavior is undefined.
+ req_ = {};
+
+ // Set the timeout.
+ stream_.expires_after(std::chrono::seconds(30));
+
+ // Read a request
+ http::async_read(stream_, buffer_, req_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This means they closed the connection
+ if(ec == http::error::end_of_stream)
+ return do_close();
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ handle_request(*doc_root_, std::move(req_), lambda_);
+ }
+
+ void
+ on_write(
+ bool close,
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ return do_close();
+ }
+
+ // We're done with the response so delete it
+ res_ = nullptr;
+
+ // Read another request
+ do_read();
+ }
+
+ void
+ do_close()
+ {
+ // Send a TCP shutdown
+ beast::error_code ec;
+ stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
+
+ // At this point the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener : public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ tcp::acceptor acceptor_;
+ std::shared_ptr<std::string const> doc_root_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root)
+ : ioc_(ioc)
+ , acceptor_(net::make_strand(ioc))
+ , doc_root_(doc_root)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ do_accept();
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(
+ std::move(socket),
+ doc_root_)->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-server-async <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " http-server-async 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // Create and launch a listening port
+ std::make_shared<listener>(
+ ioc,
+ tcp::endpoint{address, port},
+ doc_root)->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/server/coro-ssl/CMakeLists.txt b/src/boost/libs/beast/example/http/server/coro-ssl/CMakeLists.txt
new file mode 100644
index 000000000..9bbf294cf
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/coro-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/server/coro-ssl "/")
+
+ add_executable (http-server-coro-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ http_server_coro_ssl.cpp
+ )
+
+ set_property(TARGET http-server-coro-ssl PROPERTY FOLDER "example-http-server")
+
+ target_link_libraries (http-server-coro-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/server/coro-ssl/Jamfile b/src/boost/libs/beast/example/http/server/coro-ssl/Jamfile
new file mode 100644
index 000000000..8870f65d2
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/coro-ssl/Jamfile
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-server-coro-ssl :
+ http_server_coro_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/http/server/coro-ssl/http_server_coro_ssl.cpp b/src/boost/libs/beast/example/http/server/coro-ssl/http_server_coro_ssl.cpp
new file mode 100644
index 000000000..a733c6244
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/coro-ssl/http_server_coro_ssl.cpp
@@ -0,0 +1,432 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL server, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/spawn.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ // ssl::error::stream_truncated, also known as an SSL "short read",
+ // indicates the peer closed the connection without performing the
+ // required closing handshake (for example, Google does this to
+ // improve performance). Generally this can be a security issue,
+ // but if your communication protocol is self-terminated (as
+ // it is with both HTTP and WebSocket) then you may simply
+ // ignore the lack of close_notify.
+ //
+ // https://github.com/boostorg/beast/issues/38
+ //
+ // https://security.stackexchange.com/questions/91435/how-to-handle-a-malicious-ssl-tls-shutdown
+ //
+ // When a short read would cut off the end of an HTTP message,
+ // Beast returns the error beast::http::error::partial_message.
+ // Therefore, if we see a short read here, it has occurred
+ // after the message has been completed, so it is safe to ignore it.
+
+ if(ec == net::ssl::error::stream_truncated)
+ return;
+
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// This is the C++11 equivalent of a generic lambda.
+// The function object is used to send an HTTP message.
+struct send_lambda
+{
+ beast::ssl_stream<beast::tcp_stream>& stream_;
+ bool& close_;
+ beast::error_code& ec_;
+ net::yield_context yield_;
+
+ send_lambda(
+ beast::ssl_stream<beast::tcp_stream>& stream,
+ bool& close,
+ beast::error_code& ec,
+ net::yield_context yield)
+ : stream_(stream)
+ , close_(close)
+ , ec_(ec)
+ , yield_(yield)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // Determine if we should close the connection after
+ close_ = msg.need_eof();
+
+ // We need the serializer here because the serializer requires
+ // a non-const file_body, and the message oriented version of
+ // http::write only works with const messages.
+ http::serializer<isRequest, Body, Fields> sr{msg};
+ http::async_write(stream_, sr, yield_[ec_]);
+ }
+};
+
+// Handles an HTTP server connection
+void
+do_session(
+ beast::ssl_stream<beast::tcp_stream>& stream,
+ std::shared_ptr<std::string const> const& doc_root,
+ net::yield_context yield)
+{
+ bool close = false;
+ beast::error_code ec;
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ stream.async_handshake(ssl::stream_base::server, yield[ec]);
+ if(ec)
+ return fail(ec, "handshake");
+
+ // This buffer is required to persist across reads
+ beast::flat_buffer buffer;
+
+ // This lambda is used to send messages
+ send_lambda lambda{stream, close, ec, yield};
+
+ for(;;)
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
+
+ // Read a request
+ http::request<http::string_body> req;
+ http::async_read(stream, buffer, req, yield[ec]);
+ if(ec == http::error::end_of_stream)
+ break;
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ handle_request(*doc_root, std::move(req), lambda);
+ if(ec)
+ return fail(ec, "write");
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ break;
+ }
+ }
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL shutdown
+ stream.async_shutdown(yield[ec]);
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // At this point the connection is closed gracefully
+}
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+void
+do_listen(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // Open the acceptor
+ tcp::acceptor acceptor(ioc);
+ acceptor.open(endpoint.protocol(), ec);
+ if(ec)
+ return fail(ec, "open");
+
+ // Allow address reuse
+ acceptor.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ return fail(ec, "set_option");
+
+ // Bind to the server address
+ acceptor.bind(endpoint, ec);
+ if(ec)
+ return fail(ec, "bind");
+
+ // Start listening for connections
+ acceptor.listen(net::socket_base::max_listen_connections, ec);
+ if(ec)
+ return fail(ec, "listen");
+
+ for(;;)
+ {
+ tcp::socket socket(ioc);
+ acceptor.async_accept(socket, yield[ec]);
+ if(ec)
+ fail(ec, "accept");
+ else
+ boost::asio::spawn(
+ acceptor.get_executor(),
+ std::bind(
+ &do_session,
+ beast::ssl_stream<beast::tcp_stream>(
+ std::move(socket), ctx),
+ doc_root,
+ std::placeholders::_1));
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-server-coro-ssl <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " http-server-coro-ssl 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Spawn a listening port
+ boost::asio::spawn(ioc,
+ std::bind(
+ &do_listen,
+ std::ref(ioc),
+ std::ref(ctx),
+ tcp::endpoint{address, port},
+ doc_root,
+ std::placeholders::_1));
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/server/coro/CMakeLists.txt b/src/boost/libs/beast/example/http/server/coro/CMakeLists.txt
new file mode 100644
index 000000000..6cc8244a8
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/coro/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/server/coro "/")
+
+add_executable (http-server-coro
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_server_coro.cpp
+)
+
+target_link_libraries(http-server-coro
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-server-coro PROPERTY FOLDER "example-http-server")
diff --git a/src/boost/libs/beast/example/http/server/coro/Jamfile b/src/boost/libs/beast/example/http/server/coro/Jamfile
new file mode 100644
index 000000000..600b0fa09
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/coro/Jamfile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-server-coro :
+ http_server_coro.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/http/server/coro/http_server_coro.cpp b/src/boost/libs/beast/example/http/server/coro/http_server_coro.cpp
new file mode 100644
index 000000000..a8baae640
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/coro/http_server_coro.cpp
@@ -0,0 +1,387 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP server, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/spawn.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// This is the C++11 equivalent of a generic lambda.
+// The function object is used to send an HTTP message.
+struct send_lambda
+{
+ beast::tcp_stream& stream_;
+ bool& close_;
+ beast::error_code& ec_;
+ net::yield_context yield_;
+
+ send_lambda(
+ beast::tcp_stream& stream,
+ bool& close,
+ beast::error_code& ec,
+ net::yield_context yield)
+ : stream_(stream)
+ , close_(close)
+ , ec_(ec)
+ , yield_(yield)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // Determine if we should close the connection after
+ close_ = msg.need_eof();
+
+ // We need the serializer here because the serializer requires
+ // a non-const file_body, and the message oriented version of
+ // http::write only works with const messages.
+ http::serializer<isRequest, Body, Fields> sr{msg};
+ http::async_write(stream_, sr, yield_[ec_]);
+ }
+};
+
+// Handles an HTTP server connection
+void
+do_session(
+ beast::tcp_stream& stream,
+ std::shared_ptr<std::string const> const& doc_root,
+ net::yield_context yield)
+{
+ bool close = false;
+ beast::error_code ec;
+
+ // This buffer is required to persist across reads
+ beast::flat_buffer buffer;
+
+ // This lambda is used to send messages
+ send_lambda lambda{stream, close, ec, yield};
+
+ for(;;)
+ {
+ // Set the timeout.
+ stream.expires_after(std::chrono::seconds(30));
+
+ // Read a request
+ http::request<http::string_body> req;
+ http::async_read(stream, buffer, req, yield[ec]);
+ if(ec == http::error::end_of_stream)
+ break;
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ handle_request(*doc_root, std::move(req), lambda);
+ if(ec)
+ return fail(ec, "write");
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ break;
+ }
+ }
+
+ // Send a TCP shutdown
+ stream.socket().shutdown(tcp::socket::shutdown_send, ec);
+
+ // At this point the connection is closed gracefully
+}
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+void
+do_listen(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // Open the acceptor
+ tcp::acceptor acceptor(ioc);
+ acceptor.open(endpoint.protocol(), ec);
+ if(ec)
+ return fail(ec, "open");
+
+ // Allow address reuse
+ acceptor.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ return fail(ec, "set_option");
+
+ // Bind to the server address
+ acceptor.bind(endpoint, ec);
+ if(ec)
+ return fail(ec, "bind");
+
+ // Start listening for connections
+ acceptor.listen(net::socket_base::max_listen_connections, ec);
+ if(ec)
+ return fail(ec, "listen");
+
+ for(;;)
+ {
+ tcp::socket socket(ioc);
+ acceptor.async_accept(socket, yield[ec]);
+ if(ec)
+ fail(ec, "accept");
+ else
+ boost::asio::spawn(
+ acceptor.get_executor(),
+ std::bind(
+ &do_session,
+ beast::tcp_stream(std::move(socket)),
+ doc_root,
+ std::placeholders::_1));
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-server-coro <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " http-server-coro 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // Spawn a listening port
+ boost::asio::spawn(ioc,
+ std::bind(
+ &do_listen,
+ std::ref(ioc),
+ tcp::endpoint{address, port},
+ doc_root,
+ std::placeholders::_1));
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/server/fast/CMakeLists.txt b/src/boost/libs/beast/example/http/server/fast/CMakeLists.txt
new file mode 100644
index 000000000..ecc8f7bdc
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/fast/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/common common)
+GroupSources(example/http/server/fast "/")
+
+add_executable (http-server-fast
+ ${BOOST_BEAST_FILES}
+ ${COMMON_FILES}
+ Jamfile
+ fields_alloc.hpp
+ http_server_fast.cpp
+)
+
+target_link_libraries(http-server-fast
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-server-fast PROPERTY FOLDER "example-http-server")
diff --git a/src/boost/libs/beast/example/http/server/fast/Jamfile b/src/boost/libs/beast/example/http/server/fast/Jamfile
new file mode 100644
index 000000000..8a9dd44d6
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/fast/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-server-fast :
+ http_server_fast.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/fast/fields_alloc.hpp b/src/boost/libs/beast/example/http/server/fast/fields_alloc.hpp
new file mode 100644
index 000000000..d60c1c499
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/fast/fields_alloc.hpp
@@ -0,0 +1,205 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_FIELDS_ALLOC_HPP
+#define BOOST_BEAST_EXAMPLE_FIELDS_ALLOC_HPP
+
+#include <boost/throw_exception.hpp>
+#include <cstdlib>
+#include <memory>
+#include <stdexcept>
+
+namespace detail {
+
+struct static_pool
+{
+ std::size_t size_;
+ std::size_t refs_ = 1;
+ std::size_t count_ = 0;
+ char* p_;
+
+ char*
+ end()
+ {
+ return reinterpret_cast<char*>(this + 1) + size_;
+ }
+
+ explicit
+ static_pool(std::size_t size)
+ : size_(size)
+ , p_(reinterpret_cast<char*>(this + 1))
+ {
+ }
+
+public:
+ static
+ static_pool&
+ construct(std::size_t size)
+ {
+ auto p = new char[sizeof(static_pool) + size];
+ return *(::new(p) static_pool{size});
+ }
+
+ static_pool&
+ share()
+ {
+ ++refs_;
+ return *this;
+ }
+
+ void
+ destroy()
+ {
+ if(refs_--)
+ return;
+ this->~static_pool();
+ delete[] reinterpret_cast<char*>(this);
+ }
+
+ void*
+ alloc(std::size_t n)
+ {
+ auto last = p_ + n;
+ if(last >= end())
+ BOOST_THROW_EXCEPTION(std::bad_alloc{});
+ ++count_;
+ auto p = p_;
+ p_ = last;
+ return p;
+ }
+
+ void
+ dealloc()
+ {
+ if(--count_)
+ return;
+ p_ = reinterpret_cast<char*>(this + 1);
+ }
+};
+
+} // detail
+
+/** A non-thread-safe allocator optimized for @ref basic_fields.
+
+ This allocator obtains memory from a pre-allocated memory block
+ of a given size. It does nothing in deallocate until all
+ previously allocated blocks are deallocated, upon which it
+ resets the internal memory block for re-use.
+
+ To use this allocator declare an instance persistent to the
+ connection or session, and construct with the block size.
+ A good rule of thumb is 20% more than the maximum allowed
+ header size. For example if the application only allows up
+ to an 8,000 byte header, the block size could be 9,600.
+
+ Then, for every instance of `message` construct the header
+ with a copy of the previously declared allocator instance.
+*/
+template<class T>
+struct fields_alloc
+{
+ detail::static_pool* pool_;
+
+public:
+ using value_type = T;
+ using is_always_equal = std::false_type;
+ using pointer = T*;
+ using reference = T&;
+ using const_pointer = T const*;
+ using const_reference = T const&;
+ using size_type = std::size_t;
+ using difference_type = std::ptrdiff_t;
+
+ template<class U>
+ struct rebind
+ {
+ using other = fields_alloc<U>;
+ };
+
+#if defined(_GLIBCXX_USE_CXX11_ABI) && (_GLIBCXX_USE_CXX11_ABI == 0)
+ // Workaround for g++
+ // basic_string assumes that allocators are default-constructible
+ // See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=56437
+ fields_alloc() = default;
+#endif
+
+ explicit
+ fields_alloc(std::size_t size)
+ : pool_(&detail::static_pool::construct(size))
+ {
+ }
+
+ fields_alloc(fields_alloc const& other)
+ : pool_(&other.pool_->share())
+ {
+ }
+
+ template<class U>
+ fields_alloc(fields_alloc<U> const& other)
+ : pool_(&other.pool_->share())
+ {
+ }
+
+ ~fields_alloc()
+ {
+ pool_->destroy();
+ }
+
+ value_type*
+ allocate(size_type n)
+ {
+ return static_cast<value_type*>(
+ pool_->alloc(n * sizeof(T)));
+ }
+
+ void
+ deallocate(value_type*, size_type)
+ {
+ pool_->dealloc();
+ }
+
+#if defined(BOOST_LIBSTDCXX_VERSION) && BOOST_LIBSTDCXX_VERSION < 60000
+ template<class U, class... Args>
+ void
+ construct(U* ptr, Args&&... args)
+ {
+ ::new(static_cast<void*>(ptr)) U(
+ std::forward<Args>(args)...);
+ }
+
+ template<class U>
+ void
+ destroy(U* ptr)
+ {
+ ptr->~U();
+ }
+#endif
+
+ template<class U>
+ friend
+ bool
+ operator==(
+ fields_alloc const& lhs,
+ fields_alloc<U> const& rhs)
+ {
+ return &lhs.pool_ == &rhs.pool_;
+ }
+
+ template<class U>
+ friend
+ bool
+ operator!=(
+ fields_alloc const& lhs,
+ fields_alloc<U> const& rhs)
+ {
+ return ! (lhs == rhs);
+ }
+};
+
+#endif
diff --git a/src/boost/libs/beast/example/http/server/fast/http_server_fast.cpp b/src/boost/libs/beast/example/http/server/fast/http_server_fast.cpp
new file mode 100644
index 000000000..66c27cade
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/fast/http_server_fast.cpp
@@ -0,0 +1,352 @@
+//
+// Copyright (c) 2017 Christopher M. Kohlhoff (chris at kohlhoff 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP server, fast
+//
+//------------------------------------------------------------------------------
+
+#include "fields_alloc.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio.hpp>
+#include <chrono>
+#include <cstdlib>
+#include <cstring>
+#include <iostream>
+#include <list>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+class http_worker
+{
+public:
+ http_worker(http_worker const&) = delete;
+ http_worker& operator=(http_worker const&) = delete;
+
+ http_worker(tcp::acceptor& acceptor, const std::string& doc_root) :
+ acceptor_(acceptor),
+ doc_root_(doc_root)
+ {
+ }
+
+ void start()
+ {
+ accept();
+ check_deadline();
+ }
+
+private:
+ using alloc_t = fields_alloc<char>;
+ //using request_body_t = http::basic_dynamic_body<beast::flat_static_buffer<1024 * 1024>>;
+ using request_body_t = http::string_body;
+
+ // The acceptor used to listen for incoming connections.
+ tcp::acceptor& acceptor_;
+
+ // The path to the root of the document directory.
+ std::string doc_root_;
+
+ // The socket for the currently connected client.
+ tcp::socket socket_{acceptor_.get_executor()};
+
+ // The buffer for performing reads
+ beast::flat_static_buffer<8192> buffer_;
+
+ // The allocator used for the fields in the request and reply.
+ alloc_t alloc_{8192};
+
+ // The parser for reading the requests
+ boost::optional<http::request_parser<request_body_t, alloc_t>> parser_;
+
+ // The timer putting a time limit on requests.
+ net::steady_timer request_deadline_{
+ acceptor_.get_executor(), (std::chrono::steady_clock::time_point::max)()};
+
+ // The string-based response message.
+ boost::optional<http::response<http::string_body, http::basic_fields<alloc_t>>> string_response_;
+
+ // The string-based response serializer.
+ boost::optional<http::response_serializer<http::string_body, http::basic_fields<alloc_t>>> string_serializer_;
+
+ // The file-based response message.
+ boost::optional<http::response<http::file_body, http::basic_fields<alloc_t>>> file_response_;
+
+ // The file-based response serializer.
+ boost::optional<http::response_serializer<http::file_body, http::basic_fields<alloc_t>>> file_serializer_;
+
+ void accept()
+ {
+ // Clean up any previous connection.
+ beast::error_code ec;
+ socket_.close(ec);
+ buffer_.consume(buffer_.size());
+
+ acceptor_.async_accept(
+ socket_,
+ [this](beast::error_code ec)
+ {
+ if (ec)
+ {
+ accept();
+ }
+ else
+ {
+ // Request must be fully processed within 60 seconds.
+ request_deadline_.expires_after(
+ std::chrono::seconds(60));
+
+ read_request();
+ }
+ });
+ }
+
+ void read_request()
+ {
+ // On each read the parser needs to be destroyed and
+ // recreated. We store it in a boost::optional to
+ // achieve that.
+ //
+ // Arguments passed to the parser constructor are
+ // forwarded to the message object. A single argument
+ // is forwarded to the body constructor.
+ //
+ // We construct the dynamic body with a 1MB limit
+ // to prevent vulnerability to buffer attacks.
+ //
+ parser_.emplace(
+ std::piecewise_construct,
+ std::make_tuple(),
+ std::make_tuple(alloc_));
+
+ http::async_read(
+ socket_,
+ buffer_,
+ *parser_,
+ [this](beast::error_code ec, std::size_t)
+ {
+ if (ec)
+ accept();
+ else
+ process_request(parser_->get());
+ });
+ }
+
+ void process_request(http::request<request_body_t, http::basic_fields<alloc_t>> const& req)
+ {
+ switch (req.method())
+ {
+ case http::verb::get:
+ send_file(req.target());
+ break;
+
+ default:
+ // We return responses indicating an error if
+ // we do not recognize the request method.
+ send_bad_response(
+ http::status::bad_request,
+ "Invalid request-method '" + std::string(req.method_string()) + "'\r\n");
+ break;
+ }
+ }
+
+ void send_bad_response(
+ http::status status,
+ std::string const& error)
+ {
+ string_response_.emplace(
+ std::piecewise_construct,
+ std::make_tuple(),
+ std::make_tuple(alloc_));
+
+ string_response_->result(status);
+ string_response_->keep_alive(false);
+ string_response_->set(http::field::server, "Beast");
+ string_response_->set(http::field::content_type, "text/plain");
+ string_response_->body() = error;
+ string_response_->prepare_payload();
+
+ string_serializer_.emplace(*string_response_);
+
+ http::async_write(
+ socket_,
+ *string_serializer_,
+ [this](beast::error_code ec, std::size_t)
+ {
+ socket_.shutdown(tcp::socket::shutdown_send, ec);
+ string_serializer_.reset();
+ string_response_.reset();
+ accept();
+ });
+ }
+
+ void send_file(beast::string_view target)
+ {
+ // Request path must be absolute and not contain "..".
+ if (target.empty() || target[0] != '/' || target.find("..") != std::string::npos)
+ {
+ send_bad_response(
+ http::status::not_found,
+ "File not found\r\n");
+ return;
+ }
+
+ std::string full_path = doc_root_;
+ full_path.append(
+ target.data(),
+ target.size());
+
+ http::file_body::value_type file;
+ beast::error_code ec;
+ file.open(
+ full_path.c_str(),
+ beast::file_mode::read,
+ ec);
+ if(ec)
+ {
+ send_bad_response(
+ http::status::not_found,
+ "File not found\r\n");
+ return;
+ }
+
+ file_response_.emplace(
+ std::piecewise_construct,
+ std::make_tuple(),
+ std::make_tuple(alloc_));
+
+ file_response_->result(http::status::ok);
+ file_response_->keep_alive(false);
+ file_response_->set(http::field::server, "Beast");
+ file_response_->set(http::field::content_type, mime_type(std::string(target)));
+ file_response_->body() = std::move(file);
+ file_response_->prepare_payload();
+
+ file_serializer_.emplace(*file_response_);
+
+ http::async_write(
+ socket_,
+ *file_serializer_,
+ [this](beast::error_code ec, std::size_t)
+ {
+ socket_.shutdown(tcp::socket::shutdown_send, ec);
+ file_serializer_.reset();
+ file_response_.reset();
+ accept();
+ });
+ }
+
+ void check_deadline()
+ {
+ // The deadline may have moved, so check it has really passed.
+ if (request_deadline_.expiry() <= std::chrono::steady_clock::now())
+ {
+ // Close socket to cancel any outstanding operation.
+ beast::error_code ec;
+ socket_.close();
+
+ // Sleep indefinitely until we're given a new deadline.
+ request_deadline_.expires_at(
+ std::chrono::steady_clock::time_point::max());
+ }
+
+ request_deadline_.async_wait(
+ [this](beast::error_code)
+ {
+ check_deadline();
+ });
+ }
+};
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 6)
+ {
+ std::cerr << "Usage: http_server_fast <address> <port> <doc_root> <num_workers> {spin|block}\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " http_server_fast 0.0.0.0 80 . 100 block\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " http_server_fast 0::0 80 . 100 block\n";
+ return EXIT_FAILURE;
+ }
+
+ auto const address = net::ip::make_address(argv[1]);
+ unsigned short port = static_cast<unsigned short>(std::atoi(argv[2]));
+ std::string doc_root = argv[3];
+ int num_workers = std::atoi(argv[4]);
+ bool spin = (std::strcmp(argv[5], "spin") == 0);
+
+ net::io_context ioc{1};
+ tcp::acceptor acceptor{ioc, {address, port}};
+
+ std::list<http_worker> workers;
+ for (int i = 0; i < num_workers; ++i)
+ {
+ workers.emplace_back(acceptor, doc_root);
+ workers.back().start();
+ }
+
+ if (spin)
+ for (;;) ioc.poll();
+ else
+ ioc.run();
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/beast/example/http/server/flex/CMakeLists.txt b/src/boost/libs/beast/example/http/server/flex/CMakeLists.txt
new file mode 100644
index 000000000..0920953b3
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/flex/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/server/flex "/")
+
+ add_executable (http-server-flex
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ http_server_flex.cpp
+ )
+
+ set_property(TARGET http-server-flex PROPERTY FOLDER "example-http-server")
+
+ target_link_libraries (http-server-flex
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/server/flex/Jamfile b/src/boost/libs/beast/example/http/server/flex/Jamfile
new file mode 100644
index 000000000..f094caa27
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/flex/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-server-flex :
+ http_server_flex.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/flex/http_server_flex.cpp b/src/boost/libs/beast/example/http/server/flex/http_server_flex.cpp
new file mode 100644
index 000000000..dd4b4ccd0
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/flex/http_server_flex.cpp
@@ -0,0 +1,712 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP flex server (plain and SSL), asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ // ssl::error::stream_truncated, also known as an SSL "short read",
+ // indicates the peer closed the connection without performing the
+ // required closing handshake (for example, Google does this to
+ // improve performance). Generally this can be a security issue,
+ // but if your communication protocol is self-terminated (as
+ // it is with both HTTP and WebSocket) then you may simply
+ // ignore the lack of close_notify.
+ //
+ // https://github.com/boostorg/beast/issues/38
+ //
+ // https://security.stackexchange.com/questions/91435/how-to-handle-a-malicious-ssl-tls-shutdown
+ //
+ // When a short read would cut off the end of an HTTP message,
+ // Beast returns the error beast::http::error::partial_message.
+ // Therefore, if we see a short read here, it has occurred
+ // after the message has been completed, so it is safe to ignore it.
+
+ if(ec == net::ssl::error::stream_truncated)
+ return;
+
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Handles an HTTP server connection.
+// This uses the Curiously Recurring Template Pattern so that
+// the same code works with both SSL streams and regular sockets.
+template<class Derived>
+class session
+{
+ // Access the derived class, this is part of
+ // the Curiously Recurring Template Pattern idiom.
+ Derived&
+ derived()
+ {
+ return static_cast<Derived&>(*this);
+ }
+
+ // This is the C++11 equivalent of a generic lambda.
+ // The function object is used to send an HTTP message.
+ struct send_lambda
+ {
+ session& self_;
+
+ explicit
+ send_lambda(session& self)
+ : self_(self)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // The lifetime of the message has to extend
+ // for the duration of the async operation so
+ // we use a shared_ptr to manage it.
+ auto sp = std::make_shared<
+ http::message<isRequest, Body, Fields>>(std::move(msg));
+
+ // Store a type-erased version of the shared
+ // pointer in the class to keep it alive.
+ self_.res_ = sp;
+
+ // Write the response
+ http::async_write(
+ self_.derived().stream(),
+ *sp,
+ beast::bind_front_handler(
+ &session::on_write,
+ self_.derived().shared_from_this(),
+ sp->need_eof()));
+ }
+ };
+
+ std::shared_ptr<std::string const> doc_root_;
+ http::request<http::string_body> req_;
+ std::shared_ptr<void> res_;
+ send_lambda lambda_;
+
+protected:
+ beast::flat_buffer buffer_;
+
+public:
+ // Take ownership of the buffer
+ session(
+ beast::flat_buffer buffer,
+ std::shared_ptr<std::string const> const& doc_root)
+ : doc_root_(doc_root)
+ , lambda_(*this)
+ , buffer_(std::move(buffer))
+ {
+ }
+
+ void
+ do_read()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(
+ derived().stream()).expires_after(std::chrono::seconds(30));
+
+ // Read a request
+ http::async_read(
+ derived().stream(),
+ buffer_,
+ req_,
+ beast::bind_front_handler(
+ &session::on_read,
+ derived().shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This means they closed the connection
+ if(ec == http::error::end_of_stream)
+ return derived().do_eof();
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ handle_request(*doc_root_, std::move(req_), lambda_);
+ }
+
+ void
+ on_write(
+ bool close,
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ return derived().do_eof();
+ }
+
+ // We're done with the response so delete it
+ res_ = nullptr;
+
+ // Read another request
+ do_read();
+ }
+};
+
+// Handles a plain HTTP connection
+class plain_session
+ : public session<plain_session>
+ , public std::enable_shared_from_this<plain_session>
+{
+ beast::tcp_stream stream_;
+
+public:
+ // Create the session
+ plain_session(
+ tcp::socket&& socket,
+ beast::flat_buffer buffer,
+ std::shared_ptr<std::string const> const& doc_root)
+ : session<plain_session>(
+ std::move(buffer),
+ doc_root)
+ , stream_(std::move(socket))
+ {
+ }
+
+ // Called by the base class
+ beast::tcp_stream&
+ stream()
+ {
+ return stream_;
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(stream_.get_executor(),
+ beast::bind_front_handler(
+ &session::do_read,
+ shared_from_this()));
+ }
+
+ void
+ do_eof()
+ {
+ // Send a TCP shutdown
+ beast::error_code ec;
+ stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
+
+ // At this point the connection is closed gracefully
+ }
+};
+
+// Handles an SSL HTTP connection
+class ssl_session
+ : public session<ssl_session>
+ , public std::enable_shared_from_this<ssl_session>
+{
+ beast::ssl_stream<beast::tcp_stream> stream_;
+
+public:
+ // Create the session
+ ssl_session(
+ tcp::socket&& socket,
+ ssl::context& ctx,
+ beast::flat_buffer buffer,
+ std::shared_ptr<std::string const> const& doc_root)
+ : session<ssl_session>(
+ std::move(buffer),
+ doc_root)
+ , stream_(std::move(socket), ctx)
+ {
+ }
+
+ // Called by the base class
+ beast::ssl_stream<beast::tcp_stream>&
+ stream()
+ {
+ return stream_;
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ auto self = shared_from_this();
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session.
+ net::dispatch(stream_.get_executor(), [self]() {
+ // Set the timeout.
+ beast::get_lowest_layer(self->stream_).expires_after(
+ std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ // Note, this is the buffered version of the handshake.
+ self->stream_.async_handshake(
+ ssl::stream_base::server,
+ self->buffer_.data(),
+ beast::bind_front_handler(
+ &ssl_session::on_handshake,
+ self));
+ });
+ }
+
+ void
+ on_handshake(
+ beast::error_code ec,
+ std::size_t bytes_used)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Consume the portion of the buffer used by the handshake
+ buffer_.consume(bytes_used);
+
+ do_read();
+ }
+
+ void
+ do_eof()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL shutdown
+ stream_.async_shutdown(
+ beast::bind_front_handler(
+ &ssl_session::on_shutdown,
+ shared_from_this()));
+ }
+
+ void
+ on_shutdown(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // At this point the connection is closed gracefully
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Detects SSL handshakes
+class detect_session : public std::enable_shared_from_this<detect_session>
+{
+ beast::tcp_stream stream_;
+ ssl::context& ctx_;
+ std::shared_ptr<std::string const> doc_root_;
+ beast::flat_buffer buffer_;
+
+public:
+ detect_session(
+ tcp::socket&& socket,
+ ssl::context& ctx,
+ std::shared_ptr<std::string const> const& doc_root)
+ : stream_(std::move(socket))
+ , ctx_(ctx)
+ , doc_root_(doc_root)
+ {
+ }
+
+ // Launch the detector
+ void
+ run()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Detect a TLS handshake
+ async_detect_ssl(
+ stream_,
+ buffer_,
+ beast::bind_front_handler(
+ &detect_session::on_detect,
+ shared_from_this()));
+ }
+
+ void
+ on_detect(beast::error_code ec, bool result)
+ {
+ if(ec)
+ return fail(ec, "detect");
+
+ if(result)
+ {
+ // Launch SSL session
+ std::make_shared<ssl_session>(
+ stream_.release_socket(),
+ ctx_,
+ std::move(buffer_),
+ doc_root_)->run();
+ return;
+ }
+
+ // Launch plain session
+ std::make_shared<plain_session>(
+ stream_.release_socket(),
+ std::move(buffer_),
+ doc_root_)->run();
+ }
+};
+
+// Accepts incoming connections and launches the sessions
+class listener : public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ ssl::context& ctx_;
+ tcp::acceptor acceptor_;
+ std::shared_ptr<std::string const> doc_root_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root)
+ : ioc_(ioc)
+ , ctx_(ctx)
+ , acceptor_(net::make_strand(ioc))
+ , doc_root_(doc_root)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ do_accept();
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the detector session and run it
+ std::make_shared<detect_session>(
+ std::move(socket),
+ ctx_,
+ doc_root_)->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-server-flex <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " http-server-flex 0.0.0.0 8080 .\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Create and launch a listening port
+ std::make_shared<listener>(
+ ioc,
+ ctx,
+ tcp::endpoint{address, port},
+ doc_root)->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/server/small/CMakeLists.txt b/src/boost/libs/beast/example/http/server/small/CMakeLists.txt
new file mode 100644
index 000000000..c443dec5c
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/small/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/server/small "/")
+
+add_executable (http-server-small
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_server_small.cpp
+)
+
+target_link_libraries(http-server-small
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-server-small PROPERTY FOLDER "example-http-server")
diff --git a/src/boost/libs/beast/example/http/server/small/Jamfile b/src/boost/libs/beast/example/http/server/small/Jamfile
new file mode 100644
index 000000000..48e9fd138
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/small/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-server-small :
+ http_server_small.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/small/http_server_small.cpp b/src/boost/libs/beast/example/http/server/small/http_server_small.cpp
new file mode 100644
index 000000000..53b6a2b3e
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/small/http_server_small.cpp
@@ -0,0 +1,251 @@
+//
+// Copyright (c) 2017 Christopher M. Kohlhoff (chris at kohlhoff 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP server, small
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio.hpp>
+#include <chrono>
+#include <cstdlib>
+#include <ctime>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+namespace my_program_state
+{
+ std::size_t
+ request_count()
+ {
+ static std::size_t count = 0;
+ return ++count;
+ }
+
+ std::time_t
+ now()
+ {
+ return std::time(0);
+ }
+}
+
+class http_connection : public std::enable_shared_from_this<http_connection>
+{
+public:
+ http_connection(tcp::socket socket)
+ : socket_(std::move(socket))
+ {
+ }
+
+ // Initiate the asynchronous operations associated with the connection.
+ void
+ start()
+ {
+ read_request();
+ check_deadline();
+ }
+
+private:
+ // The socket for the currently connected client.
+ tcp::socket socket_;
+
+ // The buffer for performing reads.
+ beast::flat_buffer buffer_{8192};
+
+ // The request message.
+ http::request<http::dynamic_body> request_;
+
+ // The response message.
+ http::response<http::dynamic_body> response_;
+
+ // The timer for putting a deadline on connection processing.
+ net::steady_timer deadline_{
+ socket_.get_executor(), std::chrono::seconds(60)};
+
+ // Asynchronously receive a complete request message.
+ void
+ read_request()
+ {
+ auto self = shared_from_this();
+
+ http::async_read(
+ socket_,
+ buffer_,
+ request_,
+ [self](beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+ if(!ec)
+ self->process_request();
+ });
+ }
+
+ // Determine what needs to be done with the request message.
+ void
+ process_request()
+ {
+ response_.version(request_.version());
+ response_.keep_alive(false);
+
+ switch(request_.method())
+ {
+ case http::verb::get:
+ response_.result(http::status::ok);
+ response_.set(http::field::server, "Beast");
+ create_response();
+ break;
+
+ default:
+ // We return responses indicating an error if
+ // we do not recognize the request method.
+ response_.result(http::status::bad_request);
+ response_.set(http::field::content_type, "text/plain");
+ beast::ostream(response_.body())
+ << "Invalid request-method '"
+ << std::string(request_.method_string())
+ << "'";
+ break;
+ }
+
+ write_response();
+ }
+
+ // Construct a response message based on the program state.
+ void
+ create_response()
+ {
+ if(request_.target() == "/count")
+ {
+ response_.set(http::field::content_type, "text/html");
+ beast::ostream(response_.body())
+ << "<html>\n"
+ << "<head><title>Request count</title></head>\n"
+ << "<body>\n"
+ << "<h1>Request count</h1>\n"
+ << "<p>There have been "
+ << my_program_state::request_count()
+ << " requests so far.</p>\n"
+ << "</body>\n"
+ << "</html>\n";
+ }
+ else if(request_.target() == "/time")
+ {
+ response_.set(http::field::content_type, "text/html");
+ beast::ostream(response_.body())
+ << "<html>\n"
+ << "<head><title>Current time</title></head>\n"
+ << "<body>\n"
+ << "<h1>Current time</h1>\n"
+ << "<p>The current time is "
+ << my_program_state::now()
+ << " seconds since the epoch.</p>\n"
+ << "</body>\n"
+ << "</html>\n";
+ }
+ else
+ {
+ response_.result(http::status::not_found);
+ response_.set(http::field::content_type, "text/plain");
+ beast::ostream(response_.body()) << "File not found\r\n";
+ }
+ }
+
+ // Asynchronously transmit the response message.
+ void
+ write_response()
+ {
+ auto self = shared_from_this();
+
+ response_.set(http::field::content_length, response_.body().size());
+
+ http::async_write(
+ socket_,
+ response_,
+ [self](beast::error_code ec, std::size_t)
+ {
+ self->socket_.shutdown(tcp::socket::shutdown_send, ec);
+ self->deadline_.cancel();
+ });
+ }
+
+ // Check whether we have spent enough time on this connection.
+ void
+ check_deadline()
+ {
+ auto self = shared_from_this();
+
+ deadline_.async_wait(
+ [self](beast::error_code ec)
+ {
+ if(!ec)
+ {
+ // Close socket to cancel any outstanding operation.
+ self->socket_.close(ec);
+ }
+ });
+ }
+};
+
+// "Loop" forever accepting new connections.
+void
+http_server(tcp::acceptor& acceptor, tcp::socket& socket)
+{
+ acceptor.async_accept(socket,
+ [&](beast::error_code ec)
+ {
+ if(!ec)
+ std::make_shared<http_connection>(std::move(socket))->start();
+ http_server(acceptor, socket);
+ });
+}
+
+int
+main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if(argc != 3)
+ {
+ std::cerr << "Usage: " << argv[0] << " <address> <port>\n";
+ std::cerr << " For IPv4, try:\n";
+ std::cerr << " receiver 0.0.0.0 80\n";
+ std::cerr << " For IPv6, try:\n";
+ std::cerr << " receiver 0::0 80\n";
+ return EXIT_FAILURE;
+ }
+
+ auto const address = net::ip::make_address(argv[1]);
+ unsigned short port = static_cast<unsigned short>(std::atoi(argv[2]));
+
+ net::io_context ioc{1};
+
+ tcp::acceptor acceptor{ioc, {address, port}};
+ tcp::socket socket{ioc};
+ http_server(acceptor, socket);
+
+ ioc.run();
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/beast/example/http/server/stackless-ssl/CMakeLists.txt b/src/boost/libs/beast/example/http/server/stackless-ssl/CMakeLists.txt
new file mode 100644
index 000000000..f25b9b3d6
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/stackless-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/server/stackless-ssl "/")
+
+ add_executable (http-server-stackless-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ http_server_stackless_ssl.cpp
+ )
+
+ set_property(TARGET http-server-stackless-ssl PROPERTY FOLDER "example-http-server")
+
+ target_link_libraries (http-server-stackless-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/server/stackless-ssl/Jamfile b/src/boost/libs/beast/example/http/server/stackless-ssl/Jamfile
new file mode 100644
index 000000000..b47524646
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/stackless-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-server-stackless-ssl :
+ http_server_stackless_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp b/src/boost/libs/beast/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp
new file mode 100644
index 000000000..7786cbb42
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/stackless-ssl/http_server_stackless_ssl.cpp
@@ -0,0 +1,560 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL server, stackless coroutine
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/coroutine.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ // ssl::error::stream_truncated, also known as an SSL "short read",
+ // indicates the peer closed the connection without performing the
+ // required closing handshake (for example, Google does this to
+ // improve performance). Generally this can be a security issue,
+ // but if your communication protocol is self-terminated (as
+ // it is with both HTTP and WebSocket) then you may simply
+ // ignore the lack of close_notify.
+ //
+ // https://github.com/boostorg/beast/issues/38
+ //
+ // https://security.stackexchange.com/questions/91435/how-to-handle-a-malicious-ssl-tls-shutdown
+ //
+ // When a short read would cut off the end of an HTTP message,
+ // Beast returns the error beast::http::error::partial_message.
+ // Therefore, if we see a short read here, it has occurred
+ // after the message has been completed, so it is safe to ignore it.
+
+ if(ec == net::ssl::error::stream_truncated)
+ return;
+
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Handles an HTTP server connection
+class session
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<session>
+{
+ // This is the C++11 equivalent of a generic lambda.
+ // The function object is used to send an HTTP message.
+ struct send_lambda
+ {
+ session& self_;
+
+ explicit
+ send_lambda(session& self)
+ : self_(self)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // The lifetime of the message has to extend
+ // for the duration of the async operation so
+ // we use a shared_ptr to manage it.
+ auto sp = std::make_shared<
+ http::message<isRequest, Body, Fields>>(std::move(msg));
+
+ // Store a type-erased version of the shared
+ // pointer in the class to keep it alive.
+ self_.res_ = sp;
+
+ // Write the response
+ http::async_write(
+ self_.stream_,
+ *sp,
+ std::bind(
+ &session::loop,
+ self_.shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2,
+ sp->need_eof()));
+ }
+ };
+
+ beast::ssl_stream<beast::tcp_stream> stream_;
+ beast::flat_buffer buffer_;
+ std::shared_ptr<std::string const> doc_root_;
+ http::request<http::string_body> req_;
+ std::shared_ptr<void> res_;
+ send_lambda lambda_;
+
+public:
+ // Take ownership of the socket
+ explicit
+ session(
+ tcp::socket&& socket,
+ ssl::context& ctx,
+ std::shared_ptr<std::string const> const& doc_root)
+ : stream_(std::move(socket), ctx)
+ , doc_root_(doc_root)
+ , lambda_(*this)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session.Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(stream_.get_executor(),
+ beast::bind_front_handler(&session::loop,
+ shared_from_this(),
+ beast::error_code{},
+ 0,
+ false));
+ }
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(
+ beast::error_code ec,
+ std::size_t bytes_transferred,
+ bool close)
+ {
+ boost::ignore_unused(bytes_transferred);
+ reenter(*this)
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ yield stream_.async_handshake(
+ ssl::stream_base::server,
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ 0,
+ false));
+ if(ec)
+ return fail(ec, "handshake");
+
+ for(;;)
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Make the request empty before reading,
+ // otherwise the operation behavior is undefined.
+ req_ = {};
+
+ // Read a request
+ yield http::async_read(stream_, buffer_, req_,
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2,
+ false));
+ if(ec == http::error::end_of_stream)
+ {
+ // The remote host closed the connection
+ break;
+ }
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ yield handle_request(*doc_root_, std::move(req_), lambda_);
+ if(ec)
+ return fail(ec, "write");
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ break;
+ }
+
+ // We're done with the response so delete it
+ res_ = nullptr;
+ }
+
+ // Set the timeout.
+ beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL shutdown
+ yield stream_.async_shutdown(
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ 0,
+ false));
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // At this point the connection is closed gracefully
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ ssl::context& ctx_;
+ tcp::acceptor acceptor_;
+ tcp::socket socket_;
+ std::shared_ptr<std::string const> doc_root_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root)
+ : ioc_(ioc)
+ , ctx_(ctx)
+ , acceptor_(net::make_strand(ioc))
+ , socket_(net::make_strand(ioc))
+ , doc_root_(doc_root)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ loop();
+ }
+
+private:
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(beast::error_code ec = {})
+ {
+ reenter(*this)
+ {
+ for(;;)
+ {
+ yield acceptor_.async_accept(
+ socket_,
+ std::bind(
+ &listener::loop,
+ shared_from_this(),
+ std::placeholders::_1));
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(
+ std::move(socket_),
+ ctx_,
+ doc_root_)->run();
+ }
+
+ // Make sure each session gets its own strand
+ socket_ = tcp::socket(net::make_strand(ioc_));
+ }
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-server-stackless-ssl <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " http-server-stackless-ssl 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Create and launch a listening port
+ std::make_shared<listener>(
+ ioc,
+ ctx,
+ tcp::endpoint{address, port},
+ doc_root)->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/server/stackless/CMakeLists.txt b/src/boost/libs/beast/example/http/server/stackless/CMakeLists.txt
new file mode 100644
index 000000000..1f82d391f
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/stackless/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/server/stackless "/")
+
+add_executable (http-server-stackless
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_server_stackless.cpp
+)
+
+target_link_libraries(http-server-stackless
+ lib-asio
+ lib-beast)
+
+set_property(TARGET http-server-stackless PROPERTY FOLDER "example-http-server")
diff --git a/src/boost/libs/beast/example/http/server/stackless/Jamfile b/src/boost/libs/beast/example/http/server/stackless/Jamfile
new file mode 100644
index 000000000..f82934ff8
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/stackless/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-server-stackless :
+ http_server_stackless.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/stackless/http_server_stackless.cpp b/src/boost/libs/beast/example/http/server/stackless/http_server_stackless.cpp
new file mode 100644
index 000000000..2439c6894
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/stackless/http_server_stackless.cpp
@@ -0,0 +1,493 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP server, stackless coroutine
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/coroutine.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/config.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Handles an HTTP server connection
+class session
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<session>
+{
+ // This is the C++11 equivalent of a generic lambda.
+ // The function object is used to send an HTTP message.
+ struct send_lambda
+ {
+ session& self_;
+ std::shared_ptr<void> res_;
+
+ explicit
+ send_lambda(session& self)
+ : self_(self)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // The lifetime of the message has to extend
+ // for the duration of the async operation so
+ // we use a shared_ptr to manage it.
+ auto sp = std::make_shared<
+ http::message<isRequest, Body, Fields>>(std::move(msg));
+
+ // Store a type-erased version of the shared
+ // pointer in the class to keep it alive.
+ self_.res_ = sp;
+
+ // Write the response
+ http::async_write(
+ self_.stream_,
+ *sp,
+ beast::bind_front_handler(
+ &session::loop,
+ self_.shared_from_this(),
+ sp->need_eof()));
+ }
+ };
+
+ beast::tcp_stream stream_;
+ beast::flat_buffer buffer_;
+ std::shared_ptr<std::string const> doc_root_;
+ http::request<http::string_body> req_;
+ std::shared_ptr<void> res_;
+ send_lambda lambda_;
+
+public:
+ // Take ownership of the socket
+ explicit
+ session(
+ tcp::socket&& socket,
+ std::shared_ptr<std::string const> const& doc_root)
+ : stream_(std::move(socket))
+ , doc_root_(doc_root)
+ , lambda_(*this)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(stream_.get_executor(),
+ beast::bind_front_handler(&session::loop,
+ shared_from_this(),
+ false,
+ beast::error_code{},
+ 0));
+ }
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(
+ bool close,
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+ reenter(*this)
+ {
+ for(;;)
+ {
+ // Make the request empty before reading,
+ // otherwise the operation behavior is undefined.
+ req_ = {};
+
+ // Set the timeout.
+ stream_.expires_after(std::chrono::seconds(30));
+
+ // Read a request
+ yield http::async_read(stream_, buffer_, req_,
+ beast::bind_front_handler(
+ &session::loop,
+ shared_from_this(),
+ false));
+ if(ec == http::error::end_of_stream)
+ {
+ // The remote host closed the connection
+ break;
+ }
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ yield handle_request(*doc_root_, std::move(req_), lambda_);
+ if(ec)
+ return fail(ec, "write");
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ break;
+ }
+
+ // We're done with the response so delete it
+ res_ = nullptr;
+ }
+
+ // Send a TCP shutdown
+ stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
+
+ // At this point the connection is closed gracefully
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ tcp::acceptor acceptor_;
+ tcp::socket socket_;
+ std::shared_ptr<std::string const> doc_root_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ std::shared_ptr<std::string const> const& doc_root)
+ : ioc_(ioc)
+ , acceptor_(net::make_strand(ioc))
+ , socket_(net::make_strand(ioc))
+ , doc_root_(doc_root)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ loop();
+ }
+
+private:
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(beast::error_code ec = {})
+ {
+ reenter(*this)
+ {
+ for(;;)
+ {
+ yield acceptor_.async_accept(
+ socket_,
+ beast::bind_front_handler(
+ &listener::loop,
+ shared_from_this()));
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(
+ std::move(socket_),
+ doc_root_)->run();
+ }
+
+ // Make sure each session gets its own strand
+ socket_ = tcp::socket(net::make_strand(ioc_));
+ }
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: http-server-stackless <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " http-server-stackless 0.0.0.0 8080 . 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // Create and launch a listening port
+ std::make_shared<listener>(
+ ioc,
+ tcp::endpoint{address, port},
+ doc_root)->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/http/server/sync-ssl/CMakeLists.txt b/src/boost/libs/beast/example/http/server/sync-ssl/CMakeLists.txt
new file mode 100644
index 000000000..4142e2c95
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/sync-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/http/server/sync-ssl "/")
+
+ add_executable (http-server-sync-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ http_server_sync_ssl.cpp
+ )
+
+ set_property(TARGET http-server-sync-ssl PROPERTY FOLDER "example-http-server")
+
+ target_link_libraries (http-server-sync-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/http/server/sync-ssl/Jamfile b/src/boost/libs/beast/example/http/server/sync-ssl/Jamfile
new file mode 100644
index 000000000..0ad5e57f5
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/sync-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe http-server-sync-ssl :
+ http_server_sync_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/sync-ssl/http_server_sync_ssl.cpp b/src/boost/libs/beast/example/http/server/sync-ssl/http_server_sync_ssl.cpp
new file mode 100644
index 000000000..34b277530
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/sync-ssl/http_server_sync_ssl.cpp
@@ -0,0 +1,356 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP SSL server, synchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/ssl/stream.hpp>
+#include <boost/config.hpp>
+#include <cstdlib>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// This is the C++11 equivalent of a generic lambda.
+// The function object is used to send an HTTP message.
+template<class Stream>
+struct send_lambda
+{
+ Stream& stream_;
+ bool& close_;
+ beast::error_code& ec_;
+
+ explicit
+ send_lambda(
+ Stream& stream,
+ bool& close,
+ beast::error_code& ec)
+ : stream_(stream)
+ , close_(close)
+ , ec_(ec)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // Determine if we should close the connection after
+ close_ = msg.need_eof();
+
+ // We need the serializer here because the serializer requires
+ // a non-const file_body, and the message oriented version of
+ // http::write only works with const messages.
+ http::serializer<isRequest, Body, Fields> sr{msg};
+ http::write(stream_, sr, ec_);
+ }
+};
+
+// Handles an HTTP server connection
+void
+do_session(
+ tcp::socket& socket,
+ ssl::context& ctx,
+ std::shared_ptr<std::string const> const& doc_root)
+{
+ bool close = false;
+ beast::error_code ec;
+
+ // Construct the stream around the socket
+ beast::ssl_stream<tcp::socket&> stream{socket, ctx};
+
+ // Perform the SSL handshake
+ stream.handshake(ssl::stream_base::server, ec);
+ if(ec)
+ return fail(ec, "handshake");
+
+ // This buffer is required to persist across reads
+ beast::flat_buffer buffer;
+
+ // This lambda is used to send messages
+ send_lambda<beast::ssl_stream<tcp::socket&>> lambda{stream, close, ec};
+
+ for(;;)
+ {
+ // Read a request
+ http::request<http::string_body> req;
+ http::read(stream, buffer, req, ec);
+ if(ec == http::error::end_of_stream)
+ break;
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ handle_request(*doc_root, std::move(req), lambda);
+ if(ec)
+ return fail(ec, "write");
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ break;
+ }
+ }
+
+ // Perform the SSL shutdown
+ stream.shutdown(ec);
+ if(ec)
+ return fail(ec, "shutdown");
+
+ // At this point the connection is closed gracefully
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: http-server-sync-ssl <address> <port> <doc_root>\n" <<
+ "Example:\n" <<
+ " http-server-sync-ssl 0.0.0.0 8080 .\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+
+ // The io_context is required for all I/O
+ net::io_context ioc{1};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // The acceptor receives incoming connections
+ tcp::acceptor acceptor{ioc, {address, port}};
+ for(;;)
+ {
+ // This will receive the new connection
+ tcp::socket socket{ioc};
+
+ // Block until we get a connection
+ acceptor.accept(socket);
+
+ // Launch the session, transferring ownership of the socket
+ std::thread{std::bind(
+ &do_session,
+ std::move(socket),
+ std::ref(ctx),
+ doc_root)}.detach();
+ }
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/beast/example/http/server/sync/CMakeLists.txt b/src/boost/libs/beast/example/http/server/sync/CMakeLists.txt
new file mode 100644
index 000000000..250add773
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/sync/CMakeLists.txt
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/http/server/sync "/")
+
+add_executable (http-server-sync
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ http_server_sync.cpp
+)
+
+target_link_libraries(http-server-sync
+ lib-asio
+ lib-asio-ssl
+ lib-beast)
+
+set_property(TARGET http-server-sync PROPERTY FOLDER "example-http-server")
diff --git a/src/boost/libs/beast/example/http/server/sync/Jamfile b/src/boost/libs/beast/example/http/server/sync/Jamfile
new file mode 100644
index 000000000..30e4f026b
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/sync/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe http-server-sync :
+ http_server_sync.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/http/server/sync/http_server_sync.cpp b/src/boost/libs/beast/example/http/server/sync/http_server_sync.cpp
new file mode 100644
index 000000000..2c5ca60fb
--- /dev/null
+++ b/src/boost/libs/beast/example/http/server/sync/http_server_sync.cpp
@@ -0,0 +1,335 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: HTTP server, synchronous
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/config.hpp>
+#include <cstdlib>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if (base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == beast::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// This is the C++11 equivalent of a generic lambda.
+// The function object is used to send an HTTP message.
+template<class Stream>
+struct send_lambda
+{
+ Stream& stream_;
+ bool& close_;
+ beast::error_code& ec_;
+
+ explicit
+ send_lambda(
+ Stream& stream,
+ bool& close,
+ beast::error_code& ec)
+ : stream_(stream)
+ , close_(close)
+ , ec_(ec)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // Determine if we should close the connection after
+ close_ = msg.need_eof();
+
+ // We need the serializer here because the serializer requires
+ // a non-const file_body, and the message oriented version of
+ // http::write only works with const messages.
+ http::serializer<isRequest, Body, Fields> sr{msg};
+ http::write(stream_, sr, ec_);
+ }
+};
+
+// Handles an HTTP server connection
+void
+do_session(
+ tcp::socket& socket,
+ std::shared_ptr<std::string const> const& doc_root)
+{
+ bool close = false;
+ beast::error_code ec;
+
+ // This buffer is required to persist across reads
+ beast::flat_buffer buffer;
+
+ // This lambda is used to send messages
+ send_lambda<tcp::socket> lambda{socket, close, ec};
+
+ for(;;)
+ {
+ // Read a request
+ http::request<http::string_body> req;
+ http::read(socket, buffer, req, ec);
+ if(ec == http::error::end_of_stream)
+ break;
+ if(ec)
+ return fail(ec, "read");
+
+ // Send the response
+ handle_request(*doc_root, std::move(req), lambda);
+ if(ec)
+ return fail(ec, "write");
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ break;
+ }
+ }
+
+ // Send a TCP shutdown
+ socket.shutdown(tcp::socket::shutdown_send, ec);
+
+ // At this point the connection is closed gracefully
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: http-server-sync <address> <port> <doc_root>\n" <<
+ "Example:\n" <<
+ " http-server-sync 0.0.0.0 8080 .\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const doc_root = std::make_shared<std::string>(argv[3]);
+
+ // The io_context is required for all I/O
+ net::io_context ioc{1};
+
+ // The acceptor receives incoming connections
+ tcp::acceptor acceptor{ioc, {address, port}};
+ for(;;)
+ {
+ // This will receive the new connection
+ tcp::socket socket{ioc};
+
+ // Block until we get a connection
+ acceptor.accept(socket);
+
+ // Launch the session, transferring ownership of the socket
+ std::thread{std::bind(
+ &do_session,
+ std::move(socket),
+ doc_root)}.detach();
+ }
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/beast/example/websocket/CMakeLists.txt b/src/boost/libs/beast/example/websocket/CMakeLists.txt
new file mode 100644
index 000000000..d38604dd0
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/CMakeLists.txt
@@ -0,0 +1,11 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (client)
+add_subdirectory (server)
diff --git a/src/boost/libs/beast/example/websocket/Jamfile b/src/boost/libs/beast/example/websocket/Jamfile
new file mode 100644
index 000000000..32f2c5144
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/Jamfile
@@ -0,0 +1,11 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+build-project client ;
+build-project server ;
diff --git a/src/boost/libs/beast/example/websocket/client/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/CMakeLists.txt
new file mode 100644
index 000000000..5d1300e2a
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/CMakeLists.txt
@@ -0,0 +1,19 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (async)
+add_subdirectory (coro)
+add_subdirectory (sync)
+
+if (OPENSSL_FOUND)
+ add_subdirectory (async-ssl)
+ add_subdirectory (async-ssl-system-executor)
+ add_subdirectory (coro-ssl)
+ add_subdirectory (sync-ssl)
+endif()
diff --git a/src/boost/libs/beast/example/websocket/client/Jamfile b/src/boost/libs/beast/example/websocket/client/Jamfile
new file mode 100644
index 000000000..94a458110
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/Jamfile
@@ -0,0 +1,18 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+build-project async ;
+build-project coro ;
+build-project sync ;
+
+# SSL
+build-project async-ssl ;
+build-project async-ssl-system-executor ;
+build-project coro-ssl ;
+build-project sync-ssl ;
diff --git a/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/CMakeLists.txt
new file mode 100644
index 000000000..3a22aade8
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/client/async-ssl-system-executor "/")
+
+ add_executable (websocket-client-async-ssl-system-executor
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ websocket_client_async_ssl_system_executor.cpp
+ )
+
+ set_property(TARGET websocket-client-async-ssl-system-executor PROPERTY FOLDER "example-websocket-client")
+
+ target_link_libraries (websocket-client-async-ssl-system-executor
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/Jamfile b/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/Jamfile
new file mode 100644
index 000000000..770a93c7d
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-client-async-ssl-system-executor :
+ websocket_client_async_ssl_system_executor.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/websocket_client_async_ssl_system_executor.cpp b/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/websocket_client_async_ssl_system_executor.cpp
new file mode 100644
index 000000000..40d19fd00
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async-ssl-system-executor/websocket_client_async_ssl_system_executor.cpp
@@ -0,0 +1,259 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL client, asynchronous, using system_executor
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/system_executor.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Sends a WebSocket message and prints the response
+class session : public std::enable_shared_from_this<session>
+{
+ tcp::resolver resolver_;
+ websocket::stream<
+ beast::ssl_stream<beast::tcp_stream>> ws_;
+ beast::flat_buffer buffer_;
+ std::string host_;
+ std::string text_;
+
+ // Objects are constructed with a strand to
+ // ensure that handlers do not execute concurrently.
+ session(net::strand<net::system_executor> ex, ssl::context& ctx)
+ : resolver_(ex)
+ , ws_(ex, ctx)
+ {
+ }
+public:
+ // Delegate construction to a prive constructor to be able to use
+ // the same strand for both I/O objects.
+ explicit
+ session(ssl::context& ctx)
+ : session(net::make_strand(net::system_executor{}), ctx)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run(
+ char const* host,
+ char const* port,
+ char const* text)
+ {
+ // Save these for later
+ host_ = host;
+ text_ = text;
+
+ // Look up the domain name
+ resolver_.async_resolve(
+ host,
+ port,
+ beast::bind_front_handler(
+ &session::on_resolve,
+ shared_from_this()));
+ }
+
+ void
+ on_resolve(
+ beast::error_code ec,
+ tcp::resolver::results_type results)
+ {
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ beast::get_lowest_layer(ws_).async_connect(
+ results,
+ beast::bind_front_handler(
+ &session::on_connect,
+ shared_from_this()));
+ }
+
+ void
+ on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type ep)
+ {
+ if(ec)
+ return fail(ec, "connect");
+
+ // Update the host_ string. This will provide the value of the
+ // Host HTTP header during the WebSocket handshake.
+ // See https://tools.ietf.org/html/rfc7230#section-5.4
+ host_ += ':' + std::to_string(ep.port());
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ ws_.next_layer().async_handshake(
+ ssl::stream_base::client,
+ beast::bind_front_handler(
+ &session::on_ssl_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_ssl_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "ssl_handshake");
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws_).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::client));
+
+ // Set a decorator to change the User-Agent of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::request_type& req)
+ {
+ req.set(http::field::user_agent,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-client-async-ssl");
+ }));
+
+ // Perform the websocket handshake
+ ws_.async_handshake(host_, "/",
+ beast::bind_front_handler(
+ &session::on_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Send the message
+ ws_.async_write(
+ net::buffer(text_),
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Read a message into our buffer
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Close the WebSocket connection
+ ws_.async_close(websocket::close_code::normal,
+ beast::bind_front_handler(
+ &session::on_close,
+ shared_from_this()));
+ }
+
+ void
+ on_close(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "close");
+
+ // If we get here then the connection is closed gracefully
+
+ // The make_printable() function helps print a ConstBufferSequence
+ std::cout << beast::make_printable(buffer_.data()) << std::endl;
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-client-async-ssl <host> <port> <text>\n" <<
+ "Example:\n" <<
+ " websocket-client-async-ssl echo.websocket.org 443 \"Hello, world!\"\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const text = argv[3];
+
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12_client};
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // Launch the asynchronous operation
+ std::make_shared<session>(ctx)->run(host, port, text);
+
+ // The async operations will run on the system_executor.
+ // Because the main thread has nothing to do in this example, we just wait
+ // for the system_executor to run out of work.
+ net::system_executor().context().join();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/client/async-ssl/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/async-ssl/CMakeLists.txt
new file mode 100644
index 000000000..a21982806
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/client/async-ssl "/")
+
+ add_executable (websocket-client-async-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ websocket_client_async_ssl.cpp
+ )
+
+ set_property(TARGET websocket-client-async-ssl PROPERTY FOLDER "example-websocket-client")
+
+ target_link_libraries (websocket-client-async-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/client/async-ssl/Jamfile b/src/boost/libs/beast/example/websocket/client/async-ssl/Jamfile
new file mode 100644
index 000000000..1f46a94d9
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-client-async-ssl :
+ websocket_client_async_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/client/async-ssl/websocket_client_async_ssl.cpp b/src/boost/libs/beast/example/websocket/client/async-ssl/websocket_client_async_ssl.cpp
new file mode 100644
index 000000000..4d413aa78
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async-ssl/websocket_client_async_ssl.cpp
@@ -0,0 +1,252 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL client, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/strand.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Sends a WebSocket message and prints the response
+class session : public std::enable_shared_from_this<session>
+{
+ tcp::resolver resolver_;
+ websocket::stream<
+ beast::ssl_stream<beast::tcp_stream>> ws_;
+ beast::flat_buffer buffer_;
+ std::string host_;
+ std::string text_;
+
+public:
+ // Resolver and socket require an io_context
+ explicit
+ session(net::io_context& ioc, ssl::context& ctx)
+ : resolver_(net::make_strand(ioc))
+ , ws_(net::make_strand(ioc), ctx)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run(
+ char const* host,
+ char const* port,
+ char const* text)
+ {
+ // Save these for later
+ host_ = host;
+ text_ = text;
+
+ // Look up the domain name
+ resolver_.async_resolve(
+ host,
+ port,
+ beast::bind_front_handler(
+ &session::on_resolve,
+ shared_from_this()));
+ }
+
+ void
+ on_resolve(
+ beast::error_code ec,
+ tcp::resolver::results_type results)
+ {
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ beast::get_lowest_layer(ws_).async_connect(
+ results,
+ beast::bind_front_handler(
+ &session::on_connect,
+ shared_from_this()));
+ }
+
+ void
+ on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type ep)
+ {
+ if(ec)
+ return fail(ec, "connect");
+
+ // Update the host_ string. This will provide the value of the
+ // Host HTTP header during the WebSocket handshake.
+ // See https://tools.ietf.org/html/rfc7230#section-5.4
+ host_ += ':' + std::to_string(ep.port());
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ ws_.next_layer().async_handshake(
+ ssl::stream_base::client,
+ beast::bind_front_handler(
+ &session::on_ssl_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_ssl_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "ssl_handshake");
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws_).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::client));
+
+ // Set a decorator to change the User-Agent of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::request_type& req)
+ {
+ req.set(http::field::user_agent,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-client-async-ssl");
+ }));
+
+ // Perform the websocket handshake
+ ws_.async_handshake(host_, "/",
+ beast::bind_front_handler(
+ &session::on_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Send the message
+ ws_.async_write(
+ net::buffer(text_),
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Read a message into our buffer
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Close the WebSocket connection
+ ws_.async_close(websocket::close_code::normal,
+ beast::bind_front_handler(
+ &session::on_close,
+ shared_from_this()));
+ }
+
+ void
+ on_close(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "close");
+
+ // If we get here then the connection is closed gracefully
+
+ // The make_printable() function helps print a ConstBufferSequence
+ std::cout << beast::make_printable(buffer_.data()) << std::endl;
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-client-async-ssl <host> <port> <text>\n" <<
+ "Example:\n" <<
+ " websocket-client-async-ssl echo.websocket.org 443 \"Hello, world!\"\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const text = argv[3];
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12_client};
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // Launch the asynchronous operation
+ std::make_shared<session>(ioc, ctx)->run(host, port, text);
+
+ // Run the I/O service. The call will return when
+ // the socket is closed.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/client/async/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/async/CMakeLists.txt
new file mode 100644
index 000000000..cc6434071
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/client/async "/")
+
+add_executable (websocket-client-async
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_client_async.cpp
+)
+
+target_link_libraries(websocket-client-async
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-client-async PROPERTY FOLDER "example-websocket-client")
diff --git a/src/boost/libs/beast/example/websocket/client/async/Jamfile b/src/boost/libs/beast/example/websocket/client/async/Jamfile
new file mode 100644
index 000000000..e5359db3b
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-client-async :
+ websocket_client_async.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/client/async/websocket_client_async.cpp b/src/boost/libs/beast/example/websocket/client/async/websocket_client_async.cpp
new file mode 100644
index 000000000..5fcf721b8
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/async/websocket_client_async.cpp
@@ -0,0 +1,223 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket client, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/strand.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Sends a WebSocket message and prints the response
+class session : public std::enable_shared_from_this<session>
+{
+ tcp::resolver resolver_;
+ websocket::stream<beast::tcp_stream> ws_;
+ beast::flat_buffer buffer_;
+ std::string host_;
+ std::string text_;
+
+public:
+ // Resolver and socket require an io_context
+ explicit
+ session(net::io_context& ioc)
+ : resolver_(net::make_strand(ioc))
+ , ws_(net::make_strand(ioc))
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run(
+ char const* host,
+ char const* port,
+ char const* text)
+ {
+ // Save these for later
+ host_ = host;
+ text_ = text;
+
+ // Look up the domain name
+ resolver_.async_resolve(
+ host,
+ port,
+ beast::bind_front_handler(
+ &session::on_resolve,
+ shared_from_this()));
+ }
+
+ void
+ on_resolve(
+ beast::error_code ec,
+ tcp::resolver::results_type results)
+ {
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set the timeout for the operation
+ beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ beast::get_lowest_layer(ws_).async_connect(
+ results,
+ beast::bind_front_handler(
+ &session::on_connect,
+ shared_from_this()));
+ }
+
+ void
+ on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type ep)
+ {
+ if(ec)
+ return fail(ec, "connect");
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws_).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::client));
+
+ // Set a decorator to change the User-Agent of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::request_type& req)
+ {
+ req.set(http::field::user_agent,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-client-async");
+ }));
+
+ // Update the host_ string. This will provide the value of the
+ // Host HTTP header during the WebSocket handshake.
+ // See https://tools.ietf.org/html/rfc7230#section-5.4
+ host_ += ':' + std::to_string(ep.port());
+
+ // Perform the websocket handshake
+ ws_.async_handshake(host_, "/",
+ beast::bind_front_handler(
+ &session::on_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Send the message
+ ws_.async_write(
+ net::buffer(text_),
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Read a message into our buffer
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Close the WebSocket connection
+ ws_.async_close(websocket::close_code::normal,
+ beast::bind_front_handler(
+ &session::on_close,
+ shared_from_this()));
+ }
+
+ void
+ on_close(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "close");
+
+ // If we get here then the connection is closed gracefully
+
+ // The make_printable() function helps print a ConstBufferSequence
+ std::cout << beast::make_printable(buffer_.data()) << std::endl;
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-client-async <host> <port> <text>\n" <<
+ "Example:\n" <<
+ " websocket-client-async echo.websocket.org 80 \"Hello, world!\"\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const text = argv[3];
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // Launch the asynchronous operation
+ std::make_shared<session>(ioc)->run(host, port, text);
+
+ // Run the I/O service. The call will return when
+ // the socket is closed.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/client/coro-ssl/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/coro-ssl/CMakeLists.txt
new file mode 100644
index 000000000..fe9db75c4
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/coro-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/client/coro-ssl "/")
+
+ add_executable (websocket-client-coro-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ websocket_client_coro_ssl.cpp
+ )
+
+ set_property(TARGET websocket-client-coro-ssl PROPERTY FOLDER "example-websocket-client")
+
+ target_link_libraries (websocket-client-coro-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/client/coro-ssl/Jamfile b/src/boost/libs/beast/example/websocket/client/coro-ssl/Jamfile
new file mode 100644
index 000000000..f6f1bb922
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/coro-ssl/Jamfile
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-client-coro-ssl :
+ websocket_client_coro_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/websocket/client/coro-ssl/websocket_client_coro_ssl.cpp b/src/boost/libs/beast/example/websocket/client/coro-ssl/websocket_client_coro_ssl.cpp
new file mode 100644
index 000000000..5b4d9e9b4
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/coro-ssl/websocket_client_coro_ssl.cpp
@@ -0,0 +1,175 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL client, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/spawn.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Sends a WebSocket message and prints the response
+void
+do_session(
+ std::string host,
+ std::string const& port,
+ std::string const& text,
+ net::io_context& ioc,
+ ssl::context& ctx,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // These objects perform our I/O
+ tcp::resolver resolver(ioc);
+ websocket::stream<
+ beast::ssl_stream<beast::tcp_stream>> ws(ioc, ctx);
+
+ // Look up the domain name
+ auto const results = resolver.async_resolve(host, port, yield[ec]);
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(ws).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ auto ep = beast::get_lowest_layer(ws).async_connect(results, yield[ec]);
+ if(ec)
+ return fail(ec, "connect");
+
+ // Update the host_ string. This will provide the value of the
+ // Host HTTP header during the WebSocket handshake.
+ // See https://tools.ietf.org/html/rfc7230#section-5.4
+ host += ':' + std::to_string(ep.port());
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(ws).expires_after(std::chrono::seconds(30));
+
+ // Set a decorator to change the User-Agent of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::request_type& req)
+ {
+ req.set(http::field::user_agent,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-client-coro");
+ }));
+
+ // Perform the SSL handshake
+ ws.next_layer().async_handshake(ssl::stream_base::client, yield[ec]);
+ if(ec)
+ return fail(ec, "ssl_handshake");
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::client));
+
+ // Perform the websocket handshake
+ ws.async_handshake(host, "/", yield[ec]);
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Send the message
+ ws.async_write(net::buffer(std::string(text)), yield[ec]);
+ if(ec)
+ return fail(ec, "write");
+
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message into our buffer
+ ws.async_read(buffer, yield[ec]);
+ if(ec)
+ return fail(ec, "read");
+
+ // Close the WebSocket connection
+ ws.async_close(websocket::close_code::normal, yield[ec]);
+ if(ec)
+ return fail(ec, "close");
+
+ // If we get here then the connection is closed gracefully
+
+ // The make_printable() function helps print a ConstBufferSequence
+ std::cout << beast::make_printable(buffer.data()) << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-client-coro-ssl <host> <port> <text>\n" <<
+ "Example:\n" <<
+ " websocket-client-coro-ssl echo.websocket.org 443 \"Hello, world!\"\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const text = argv[3];
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12_client};
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // Launch the asynchronous operation
+ boost::asio::spawn(ioc, std::bind(
+ &do_session,
+ std::string(host),
+ std::string(port),
+ std::string(text),
+ std::ref(ioc),
+ std::ref(ctx),
+ std::placeholders::_1));
+
+ // Run the I/O service. The call will return when
+ // the socket is closed.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/client/coro/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/coro/CMakeLists.txt
new file mode 100644
index 000000000..2bfeef282
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/coro/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/client/coro "/")
+
+add_executable (websocket-client-coro
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_client_coro.cpp
+)
+
+target_link_libraries(websocket-client-coro
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-client-coro PROPERTY FOLDER "example-websocket-client")
diff --git a/src/boost/libs/beast/example/websocket/client/coro/Jamfile b/src/boost/libs/beast/example/websocket/client/coro/Jamfile
new file mode 100644
index 000000000..761dfe8ff
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/coro/Jamfile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-client-coro :
+ websocket_client_coro.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/websocket/client/coro/websocket_client_coro.cpp b/src/boost/libs/beast/example/websocket/client/coro/websocket_client_coro.cpp
new file mode 100644
index 000000000..7a4b0616d
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/coro/websocket_client_coro.cpp
@@ -0,0 +1,153 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket client, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/spawn.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Sends a WebSocket message and prints the response
+void
+do_session(
+ std::string host,
+ std::string const& port,
+ std::string const& text,
+ net::io_context& ioc,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // These objects perform our I/O
+ tcp::resolver resolver(ioc);
+ websocket::stream<beast::tcp_stream> ws(ioc);
+
+ // Look up the domain name
+ auto const results = resolver.async_resolve(host, port, yield[ec]);
+ if(ec)
+ return fail(ec, "resolve");
+
+ // Set a timeout on the operation
+ beast::get_lowest_layer(ws).expires_after(std::chrono::seconds(30));
+
+ // Make the connection on the IP address we get from a lookup
+ auto ep = beast::get_lowest_layer(ws).async_connect(results, yield[ec]);
+ if(ec)
+ return fail(ec, "connect");
+
+ // Update the host_ string. This will provide the value of the
+ // Host HTTP header during the WebSocket handshake.
+ // See https://tools.ietf.org/html/rfc7230#section-5.4
+ host += ':' + std::to_string(ep.port());
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::client));
+
+ // Set a decorator to change the User-Agent of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::request_type& req)
+ {
+ req.set(http::field::user_agent,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-client-coro");
+ }));
+
+ // Perform the websocket handshake
+ ws.async_handshake(host, "/", yield[ec]);
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Send the message
+ ws.async_write(net::buffer(std::string(text)), yield[ec]);
+ if(ec)
+ return fail(ec, "write");
+
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message into our buffer
+ ws.async_read(buffer, yield[ec]);
+ if(ec)
+ return fail(ec, "read");
+
+ // Close the WebSocket connection
+ ws.async_close(websocket::close_code::normal, yield[ec]);
+ if(ec)
+ return fail(ec, "close");
+
+ // If we get here then the connection is closed gracefully
+
+ // The make_printable() function helps print a ConstBufferSequence
+ std::cout << beast::make_printable(buffer.data()) << std::endl;
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char** argv)
+{
+ // Check command line arguments.
+ if(argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-client-coro <host> <port> <text>\n" <<
+ "Example:\n" <<
+ " websocket-client-coro echo.websocket.org 80 \"Hello, world!\"\n";
+ return EXIT_FAILURE;
+ }
+ auto const host = argv[1];
+ auto const port = argv[2];
+ auto const text = argv[3];
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // Launch the asynchronous operation
+ boost::asio::spawn(ioc, std::bind(
+ &do_session,
+ std::string(host),
+ std::string(port),
+ std::string(text),
+ std::ref(ioc),
+ std::placeholders::_1));
+
+ // Run the I/O service. The call will return when
+ // the socket is closed.
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/client/sync-ssl/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/sync-ssl/CMakeLists.txt
new file mode 100644
index 000000000..b84495702
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/sync-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/client/sync-ssl "/")
+
+ add_executable (websocket-client-sync-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/root_certificates.hpp
+ Jamfile
+ websocket_client_sync_ssl.cpp
+ )
+
+ set_property(TARGET websocket-client-sync-ssl PROPERTY FOLDER "example-websocket-client")
+
+ target_link_libraries (websocket-client-sync-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/client/sync-ssl/Jamfile b/src/boost/libs/beast/example/websocket/client/sync-ssl/Jamfile
new file mode 100644
index 000000000..0cfec0f68
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/sync-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-client-sync-ssl :
+ websocket_client_sync_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp b/src/boost/libs/beast/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp
new file mode 100644
index 000000000..1a51f6b6b
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/sync-ssl/websocket_client_sync_ssl.cpp
@@ -0,0 +1,116 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL client, synchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/root_certificates.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/connect.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/ssl/stream.hpp>
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Sends a WebSocket message and prints the response
+int main(int argc, char** argv)
+{
+ try
+ {
+ // Check command line arguments.
+ if(argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-client-sync-ssl <host> <port> <text>\n" <<
+ "Example:\n" <<
+ " websocket-client-sync-ssl echo.websocket.org 443 \"Hello, world!\"\n";
+ return EXIT_FAILURE;
+ }
+ std::string host = argv[1];
+ auto const port = argv[2];
+ auto const text = argv[3];
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12_client};
+
+ // This holds the root certificate used for verification
+ load_root_certificates(ctx);
+
+ // These objects perform our I/O
+ tcp::resolver resolver{ioc};
+ websocket::stream<beast::ssl_stream<tcp::socket>> ws{ioc, ctx};
+
+ // Look up the domain name
+ auto const results = resolver.resolve(host, port);
+
+ // Make the connection on the IP address we get from a lookup
+ auto ep = net::connect(get_lowest_layer(ws), results);
+
+ // Update the host_ string. This will provide the value of the
+ // Host HTTP header during the WebSocket handshake.
+ // See https://tools.ietf.org/html/rfc7230#section-5.4
+ host += ':' + std::to_string(ep.port());
+
+ // Perform the SSL handshake
+ ws.next_layer().handshake(ssl::stream_base::client);
+
+ // Set a decorator to change the User-Agent of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::request_type& req)
+ {
+ req.set(http::field::user_agent,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-client-coro");
+ }));
+
+ // Perform the websocket handshake
+ ws.handshake(host, "/");
+
+ // Send the message
+ ws.write(net::buffer(std::string(text)));
+
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message into our buffer
+ ws.read(buffer);
+
+ // Close the WebSocket connection
+ ws.close(websocket::close_code::normal);
+
+ // If we get here then the connection is closed gracefully
+
+ // The make_printable() function helps print a ConstBufferSequence
+ std::cout << beast::make_printable(buffer.data()) << std::endl;
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/client/sync/CMakeLists.txt b/src/boost/libs/beast/example/websocket/client/sync/CMakeLists.txt
new file mode 100644
index 000000000..d8606ab55
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/sync/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/client/sync "/")
+
+add_executable (websocket-client-sync
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_client_sync.cpp
+)
+
+target_link_libraries(websocket-client-sync
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-client-sync PROPERTY FOLDER "example-websocket-client")
diff --git a/src/boost/libs/beast/example/websocket/client/sync/Jamfile b/src/boost/libs/beast/example/websocket/client/sync/Jamfile
new file mode 100644
index 000000000..ea71a0ce6
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/sync/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-client-sync :
+ websocket_client_sync.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/client/sync/websocket_client_sync.cpp b/src/boost/libs/beast/example/websocket/client/sync/websocket_client_sync.cpp
new file mode 100644
index 000000000..07409b70e
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/client/sync/websocket_client_sync.cpp
@@ -0,0 +1,105 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket client, synchronous
+//
+//------------------------------------------------------------------------------
+
+//[example_websocket_client
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/connect.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <cstdlib>
+#include <iostream>
+#include <string>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+// Sends a WebSocket message and prints the response
+int main(int argc, char** argv)
+{
+ try
+ {
+ // Check command line arguments.
+ if(argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-client-sync <host> <port> <text>\n" <<
+ "Example:\n" <<
+ " websocket-client-sync echo.websocket.org 80 \"Hello, world!\"\n";
+ return EXIT_FAILURE;
+ }
+ std::string host = argv[1];
+ auto const port = argv[2];
+ auto const text = argv[3];
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // These objects perform our I/O
+ tcp::resolver resolver{ioc};
+ websocket::stream<tcp::socket> ws{ioc};
+
+ // Look up the domain name
+ auto const results = resolver.resolve(host, port);
+
+ // Make the connection on the IP address we get from a lookup
+ auto ep = net::connect(ws.next_layer(), results);
+
+ // Update the host_ string. This will provide the value of the
+ // Host HTTP header during the WebSocket handshake.
+ // See https://tools.ietf.org/html/rfc7230#section-5.4
+ host += ':' + std::to_string(ep.port());
+
+ // Set a decorator to change the User-Agent of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::request_type& req)
+ {
+ req.set(http::field::user_agent,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-client-coro");
+ }));
+
+ // Perform the websocket handshake
+ ws.handshake(host, "/");
+
+ // Send the message
+ ws.write(net::buffer(std::string(text)));
+
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message into our buffer
+ ws.read(buffer);
+
+ // Close the WebSocket connection
+ ws.close(websocket::close_code::normal);
+
+ // If we get here then the connection is closed gracefully
+
+ // The make_printable() function helps print a ConstBufferSequence
+ std::cout << beast::make_printable(buffer.data()) << std::endl;
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+ return EXIT_SUCCESS;
+}
+
+//]
diff --git a/src/boost/libs/beast/example/websocket/server/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/CMakeLists.txt
new file mode 100644
index 000000000..c5b8da5d6
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/CMakeLists.txt
@@ -0,0 +1,22 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (async)
+add_subdirectory (chat-multi)
+add_subdirectory (coro)
+add_subdirectory (fast)
+add_subdirectory (stackless)
+add_subdirectory (sync)
+
+if (OPENSSL_FOUND)
+ add_subdirectory (async-ssl)
+ add_subdirectory (coro-ssl)
+ add_subdirectory (stackless-ssl)
+ add_subdirectory (sync-ssl)
+endif()
diff --git a/src/boost/libs/beast/example/websocket/server/Jamfile b/src/boost/libs/beast/example/websocket/server/Jamfile
new file mode 100644
index 000000000..ccfd63fa4
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/Jamfile
@@ -0,0 +1,21 @@
+#
+# 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+build-project async ;
+build-project chat-multi ;
+build-project coro ;
+build-project fast ;
+build-project stackless ;
+build-project sync ;
+
+# SSL
+build-project async-ssl ;
+build-project coro-ssl ;
+build-project stackless-ssl ;
+build-project sync-ssl ;
diff --git a/src/boost/libs/beast/example/websocket/server/async-ssl/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/async-ssl/CMakeLists.txt
new file mode 100644
index 000000000..8f1055d2f
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/async-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/server/async-ssl "/")
+
+ add_executable (websocket-server-async-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ websocket_server_async_ssl.cpp
+ )
+
+ set_property(TARGET websocket-server-async-ssl PROPERTY FOLDER "example-websocket-server")
+
+ target_link_libraries (websocket-server-async-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/server/async-ssl/Jamfile b/src/boost/libs/beast/example/websocket/server/async-ssl/Jamfile
new file mode 100644
index 000000000..f9b253a0c
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/async-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-server-async-ssl :
+ websocket_server_async_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/async-ssl/websocket_server_async_ssl.cpp b/src/boost/libs/beast/example/websocket/server/async-ssl/websocket_server_async_ssl.cpp
new file mode 100644
index 000000000..b79abbbfb
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/async-ssl/websocket_server_async_ssl.cpp
@@ -0,0 +1,317 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL server, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Echoes back all received WebSocket messages
+class session : public std::enable_shared_from_this<session>
+{
+ websocket::stream<
+ beast::ssl_stream<beast::tcp_stream>> ws_;
+ beast::flat_buffer buffer_;
+
+public:
+ // Take ownership of the socket
+ session(tcp::socket&& socket, ssl::context& ctx)
+ : ws_(std::move(socket), ctx)
+ {
+ }
+
+ // Get on the correct executor
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(ws_.get_executor(),
+ beast::bind_front_handler(
+ &session::on_run,
+ shared_from_this()));
+ }
+
+ // Start the asynchronous operation
+ void
+ on_run()
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ ws_.next_layer().async_handshake(
+ ssl::stream_base::server,
+ beast::bind_front_handler(
+ &session::on_handshake,
+ shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws_).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-async-ssl");
+ }));
+
+ // Accept the websocket handshake
+ ws_.async_accept(
+ beast::bind_front_handler(
+ &session::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "accept");
+
+ // Read a message
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ // Read a message into our buffer
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This indicates that the session was closed
+ if(ec == websocket::error::closed)
+ return;
+
+ if(ec)
+ fail(ec, "read");
+
+ // Echo the message
+ ws_.text(ws_.got_text());
+ ws_.async_write(
+ buffer_.data(),
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+
+ // Do another read
+ do_read();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener : public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ ssl::context& ctx_;
+ tcp::acceptor acceptor_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint)
+ : ioc_(ioc)
+ , ctx_(ctx)
+ , acceptor_(net::make_strand(ioc))
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ do_accept();
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(std::move(socket), ctx_)->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-server-async-ssl <address> <port> <threads>\n" <<
+ "Example:\n" <<
+ " websocket-server-async-ssl 0.0.0.0 8080 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const threads = std::max<int>(1, std::atoi(argv[3]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Create and launch a listening port
+ std::make_shared<listener>(ioc, ctx, tcp::endpoint{address, port})->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/async/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/async/CMakeLists.txt
new file mode 100644
index 000000000..0e1ceb8b6
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/async/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/server/async "/")
+
+add_executable (websocket-server-async
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_server_async.cpp
+)
+
+target_link_libraries(websocket-server-async
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-server-async PROPERTY FOLDER "example-websocket-server")
diff --git a/src/boost/libs/beast/example/websocket/server/async/Jamfile b/src/boost/libs/beast/example/websocket/server/async/Jamfile
new file mode 100644
index 000000000..e1e63e14d
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/async/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-server-async :
+ websocket_server_async.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/async/websocket_server_async.cpp b/src/boost/libs/beast/example/websocket/server/async/websocket_server_async.cpp
new file mode 100644
index 000000000..4b9570868
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/async/websocket_server_async.cpp
@@ -0,0 +1,281 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket server, asynchronous
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/strand.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Echoes back all received WebSocket messages
+class session : public std::enable_shared_from_this<session>
+{
+ websocket::stream<beast::tcp_stream> ws_;
+ beast::flat_buffer buffer_;
+
+public:
+ // Take ownership of the socket
+ explicit
+ session(tcp::socket&& socket)
+ : ws_(std::move(socket))
+ {
+ }
+
+ // Get on the correct executor
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(ws_.get_executor(),
+ beast::bind_front_handler(
+ &session::on_run,
+ shared_from_this()));
+ }
+
+ // Start the asynchronous operation
+ void
+ on_run()
+ {
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-async");
+ }));
+ // Accept the websocket handshake
+ ws_.async_accept(
+ beast::bind_front_handler(
+ &session::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "accept");
+
+ // Read a message
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ // Read a message into our buffer
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This indicates that the session was closed
+ if(ec == websocket::error::closed)
+ return;
+
+ if(ec)
+ fail(ec, "read");
+
+ // Echo the message
+ ws_.text(ws_.got_text());
+ ws_.async_write(
+ buffer_.data(),
+ beast::bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+
+ // Do another read
+ do_read();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener : public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ tcp::acceptor acceptor_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint)
+ : ioc_(ioc)
+ , acceptor_(ioc)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ do_accept();
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(std::move(socket))->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-server-async <address> <port> <threads>\n" <<
+ "Example:\n" <<
+ " websocket-server-async 0.0.0.0 8080 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const threads = std::max<int>(1, std::atoi(argv[3]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // Create and launch a listening port
+ std::make_shared<listener>(ioc, tcp::endpoint{address, port})->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/chat-multi/CMakeLists.txt
new file mode 100644
index 000000000..a256b000f
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/CMakeLists.txt
@@ -0,0 +1,41 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/server/chat-multi "/")
+
+file (GLOB APP_FILES
+ beast.hpp
+ http_session.cpp
+ http_session.hpp
+ Jamfile
+ listener.cpp
+ listener.hpp
+ main.cpp
+ net.hpp
+ shared_state.cpp
+ shared_state.hpp
+ websocket_session.cpp
+ websocket_session.hpp
+ chat_client.html
+ README.md
+)
+
+source_group ("" FILES ${APP_FILES})
+
+add_executable (websocket-chat-multi
+ ${APP_FILES}
+ ${BOOST_BEAST_FILES}
+)
+
+target_link_libraries(websocket-chat-multi
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-chat-multi PROPERTY FOLDER "example-websocket-server")
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/Jamfile b/src/boost/libs/beast/example/websocket/server/chat-multi/Jamfile
new file mode 100644
index 000000000..a8d49bfdd
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/Jamfile
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-chat-multi :
+ http_session.cpp
+ listener.cpp
+ main.cpp
+ shared_state.cpp
+ websocket_session.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/beast.hpp b/src/boost/libs/beast/example/websocket/server/chat-multi/beast.hpp
new file mode 100644
index 000000000..0b7a9c61a
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/beast.hpp
@@ -0,0 +1,19 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_BEAST_HPP
+#define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_BEAST_HPP
+
+#include <boost/beast.hpp>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+
+#endif
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/chat_client.html b/src/boost/libs/beast/example/websocket/server/chat-multi/chat_client.html
new file mode 100644
index 000000000..2be69cdf0
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/chat_client.html
@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+ <meta charset="utf-8" />
+ <title>Boost.Beast WebSocket Chat Client</title>
+</head>
+<body>
+ <h1>Boost.Beast WebSocket Chat Client</h1>
+ <p>
+ <a href="http://www.boost.org/libs/beast">Boost.Beast</a>
+ <a href="http://www.boost.org/libs/beast/example/websocket/server/chat-multi">Source Code</a>
+ </p>
+ Server URI: <input class="draw-border" id="uri" size="47" value="ws://localhost:8080" style="margin-bottom: 5px;">
+ <button class="echo-button" id="connect">Connect</button>
+ <button class="echo-button" id="disconnect">Disconnect</button><br>
+ Your Name: <input class="draw-border" id="userName" size=47 style="margin-bottom: 5px;"><br>
+ <pre id="messages" style="width: 600px; height: 400px; white-space: normal; overflow: auto; border: solid 1px #cccccc; margin-bottom: 5px;"></pre>
+ <div style="margin-bottom: 5px;">
+ Message<br>
+ <input class="draw-border" id="sendMessage" size="74" value="">
+ <button class="echo-button" id="send">Send</button>
+ </div>
+ <script>
+ var ws = null;
+ function showMessage(msg) {
+ messages.innerText += msg + "\n";
+ messages.scrollTop = messages.scrollHeight - messages.clientHeight;
+ };
+ connect.onclick = function() {
+ ws = new WebSocket(uri.value);
+ ws.onopen = function(ev) {
+ showMessage("[connection opened]");
+ };
+ ws.onclose = function(ev) {
+ showMessage("[connection closed]");
+ };
+ ws.onmessage = function(ev) {
+ showMessage(ev.data);
+ };
+ ws.onerror = function(ev) {
+ showMessage("[error]");
+ console.log(ev);
+ };
+ };
+ disconnect.onclick = function() {
+ ws.close();
+ };
+ send.onclick = function() {
+ ws.send(userName.value + ": " + sendMessage.value);
+ sendMessage.value = "";
+ };
+ sendMessage.onkeyup = function(ev) {
+ ev.preventDefault();
+ if (ev.keyCode === 13) {
+ send.click();
+ }
+ }
+ </script>
+</body>
+</html>
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/http_session.cpp b/src/boost/libs/beast/example/websocket/server/chat-multi/http_session.cpp
new file mode 100644
index 000000000..9d4dee871
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/http_session.cpp
@@ -0,0 +1,371 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#include "http_session.hpp"
+#include "websocket_session.hpp"
+#include <boost/config.hpp>
+#include <iostream>
+
+#define BOOST_NO_CXX14_GENERIC_LAMBDAS
+
+//------------------------------------------------------------------------------
+
+// Return a reasonable mime type based on the extension of a file.
+beast::string_view
+mime_type(beast::string_view path)
+{
+ using beast::iequals;
+ auto const ext = [&path]
+ {
+ auto const pos = path.rfind(".");
+ if(pos == beast::string_view::npos)
+ return beast::string_view{};
+ return path.substr(pos);
+ }();
+ if(iequals(ext, ".htm")) return "text/html";
+ if(iequals(ext, ".html")) return "text/html";
+ if(iequals(ext, ".php")) return "text/html";
+ if(iequals(ext, ".css")) return "text/css";
+ if(iequals(ext, ".txt")) return "text/plain";
+ if(iequals(ext, ".js")) return "application/javascript";
+ if(iequals(ext, ".json")) return "application/json";
+ if(iequals(ext, ".xml")) return "application/xml";
+ if(iequals(ext, ".swf")) return "application/x-shockwave-flash";
+ if(iequals(ext, ".flv")) return "video/x-flv";
+ if(iequals(ext, ".png")) return "image/png";
+ if(iequals(ext, ".jpe")) return "image/jpeg";
+ if(iequals(ext, ".jpeg")) return "image/jpeg";
+ if(iequals(ext, ".jpg")) return "image/jpeg";
+ if(iequals(ext, ".gif")) return "image/gif";
+ if(iequals(ext, ".bmp")) return "image/bmp";
+ if(iequals(ext, ".ico")) return "image/vnd.microsoft.icon";
+ if(iequals(ext, ".tiff")) return "image/tiff";
+ if(iequals(ext, ".tif")) return "image/tiff";
+ if(iequals(ext, ".svg")) return "image/svg+xml";
+ if(iequals(ext, ".svgz")) return "image/svg+xml";
+ return "application/text";
+}
+
+// Append an HTTP rel-path to a local filesystem path.
+// The returned path is normalized for the platform.
+std::string
+path_cat(
+ beast::string_view base,
+ beast::string_view path)
+{
+ if(base.empty())
+ return std::string(path);
+ std::string result(base);
+#ifdef BOOST_MSVC
+ char constexpr path_separator = '\\';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+ for(auto& c : result)
+ if(c == '/')
+ c = path_separator;
+#else
+ char constexpr path_separator = '/';
+ if(result.back() == path_separator)
+ result.resize(result.size() - 1);
+ result.append(path.data(), path.size());
+#endif
+ return result;
+}
+
+// This function produces an HTTP response for the given
+// request. The type of the response object depends on the
+// contents of the request, so the interface requires the
+// caller to pass a generic lambda for receiving the response.
+template<
+ class Body, class Allocator,
+ class Send>
+void
+handle_request(
+ beast::string_view doc_root,
+ http::request<Body, http::basic_fields<Allocator>>&& req,
+ Send&& send)
+{
+ // Returns a bad request response
+ auto const bad_request =
+ [&req](beast::string_view why)
+ {
+ http::response<http::string_body> res{http::status::bad_request, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = std::string(why);
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a not found response
+ auto const not_found =
+ [&req](beast::string_view target)
+ {
+ http::response<http::string_body> res{http::status::not_found, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "The resource '" + std::string(target) + "' was not found.";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Returns a server error response
+ auto const server_error =
+ [&req](beast::string_view what)
+ {
+ http::response<http::string_body> res{http::status::internal_server_error, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, "text/html");
+ res.keep_alive(req.keep_alive());
+ res.body() = "An error occurred: '" + std::string(what) + "'";
+ res.prepare_payload();
+ return res;
+ };
+
+ // Make sure we can handle the method
+ if( req.method() != http::verb::get &&
+ req.method() != http::verb::head)
+ return send(bad_request("Unknown HTTP-method"));
+
+ // Request path must be absolute and not contain "..".
+ if( req.target().empty() ||
+ req.target()[0] != '/' ||
+ req.target().find("..") != beast::string_view::npos)
+ return send(bad_request("Illegal request-target"));
+
+ // Build the path to the requested file
+ std::string path = path_cat(doc_root, req.target());
+ if(req.target().back() == '/')
+ path.append("index.html");
+
+ // Attempt to open the file
+ beast::error_code ec;
+ http::file_body::value_type body;
+ body.open(path.c_str(), beast::file_mode::scan, ec);
+
+ // Handle the case where the file doesn't exist
+ if(ec == boost::system::errc::no_such_file_or_directory)
+ return send(not_found(req.target()));
+
+ // Handle an unknown error
+ if(ec)
+ return send(server_error(ec.message()));
+
+ // Cache the size since we need it after the move
+ auto const size = body.size();
+
+ // Respond to HEAD request
+ if(req.method() == http::verb::head)
+ {
+ http::response<http::empty_body> res{http::status::ok, req.version()};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+ }
+
+ // Respond to GET request
+ http::response<http::file_body> res{
+ std::piecewise_construct,
+ std::make_tuple(std::move(body)),
+ std::make_tuple(http::status::ok, req.version())};
+ res.set(http::field::server, BOOST_BEAST_VERSION_STRING);
+ res.set(http::field::content_type, mime_type(path));
+ res.content_length(size);
+ res.keep_alive(req.keep_alive());
+ return send(std::move(res));
+}
+
+//------------------------------------------------------------------------------
+
+struct http_session::send_lambda
+{
+ http_session& self_;
+
+ explicit
+ send_lambda(http_session& self)
+ : self_(self)
+ {
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ void
+ operator()(http::message<isRequest, Body, Fields>&& msg) const
+ {
+ // The lifetime of the message has to extend
+ // for the duration of the async operation so
+ // we use a shared_ptr to manage it.
+ auto sp = boost::make_shared<
+ http::message<isRequest, Body, Fields>>(std::move(msg));
+
+ // Write the response
+ auto self = self_.shared_from_this();
+ http::async_write(
+ self_.stream_,
+ *sp,
+ [self, sp](beast::error_code ec, std::size_t bytes)
+ {
+ self->on_write(ec, bytes, sp->need_eof());
+ });
+ }
+};
+
+//------------------------------------------------------------------------------
+
+http_session::
+http_session(
+ tcp::socket&& socket,
+ boost::shared_ptr<shared_state> const& state)
+ : stream_(std::move(socket))
+ , state_(state)
+{
+}
+
+void
+http_session::
+run()
+{
+ do_read();
+}
+
+// Report a failure
+void
+http_session::
+fail(beast::error_code ec, char const* what)
+{
+ // Don't report on canceled operations
+ if(ec == net::error::operation_aborted)
+ return;
+
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+void
+http_session::
+do_read()
+{
+ // Construct a new parser for each message
+ parser_.emplace();
+
+ // Apply a reasonable limit to the allowed size
+ // of the body in bytes to prevent abuse.
+ parser_->body_limit(10000);
+
+ // Set the timeout.
+ stream_.expires_after(std::chrono::seconds(30));
+
+ // Read a request
+ http::async_read(
+ stream_,
+ buffer_,
+ parser_->get(),
+ beast::bind_front_handler(
+ &http_session::on_read,
+ shared_from_this()));
+}
+
+void
+http_session::
+on_read(beast::error_code ec, std::size_t)
+{
+ // This means they closed the connection
+ if(ec == http::error::end_of_stream)
+ {
+ stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
+ return;
+ }
+
+ // Handle the error, if any
+ if(ec)
+ return fail(ec, "read");
+
+ // See if it is a WebSocket Upgrade
+ if(websocket::is_upgrade(parser_->get()))
+ {
+ // Create a websocket session, transferring ownership
+ // of both the socket and the HTTP request.
+ boost::make_shared<websocket_session>(
+ stream_.release_socket(),
+ state_)->run(parser_->release());
+ return;
+ }
+
+ // Send the response
+#ifndef BOOST_NO_CXX14_GENERIC_LAMBDAS
+ //
+ // The following code requires generic
+ // lambdas, available in C++14 and later.
+ //
+ handle_request(
+ state_->doc_root(),
+ std::move(req_),
+ [this](auto&& response)
+ {
+ // The lifetime of the message has to extend
+ // for the duration of the async operation so
+ // we use a shared_ptr to manage it.
+ using response_type = typename std::decay<decltype(response)>::type;
+ auto sp = boost::make_shared<response_type>(std::forward<decltype(response)>(response));
+
+ #if 0
+ // NOTE This causes an ICE in gcc 7.3
+ // Write the response
+ http::async_write(this->stream_, *sp,
+ [self = shared_from_this(), sp](
+ beast::error_code ec, std::size_t bytes)
+ {
+ self->on_write(ec, bytes, sp->need_eof());
+ });
+ #else
+ // Write the response
+ auto self = shared_from_this();
+ http::async_write(stream_, *sp,
+ [self, sp](
+ beast::error_code ec, std::size_t bytes)
+ {
+ self->on_write(ec, bytes, sp->need_eof());
+ });
+ #endif
+ });
+#else
+ //
+ // This code uses the function object type send_lambda in
+ // place of a generic lambda which is not available in C++11
+ //
+ handle_request(
+ state_->doc_root(),
+ parser_->release(),
+ send_lambda(*this));
+
+#endif
+}
+
+void
+http_session::
+on_write(beast::error_code ec, std::size_t, bool close)
+{
+ // Handle the error, if any
+ if(ec)
+ return fail(ec, "write");
+
+ if(close)
+ {
+ // This means we should close the connection, usually because
+ // the response indicated the "Connection: close" semantic.
+ stream_.socket().shutdown(tcp::socket::shutdown_send, ec);
+ return;
+ }
+
+ // Read another request
+ do_read();
+}
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/http_session.hpp b/src/boost/libs/beast/example/websocket/server/chat-multi/http_session.hpp
new file mode 100644
index 000000000..637a5d898
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/http_session.hpp
@@ -0,0 +1,48 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_HTTP_SESSION_HPP
+#define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_HTTP_SESSION_HPP
+
+#include "net.hpp"
+#include "beast.hpp"
+#include "shared_state.hpp"
+#include <boost/optional.hpp>
+#include <boost/smart_ptr.hpp>
+#include <cstdlib>
+#include <memory>
+
+/** Represents an established HTTP connection
+*/
+class http_session : public boost::enable_shared_from_this<http_session>
+{
+ beast::tcp_stream stream_;
+ beast::flat_buffer buffer_;
+ boost::shared_ptr<shared_state> state_;
+
+ // The parser is stored in an optional container so we can
+ // construct it from scratch it at the beginning of each new message.
+ boost::optional<http::request_parser<http::string_body>> parser_;
+
+ struct send_lambda;
+
+ void fail(beast::error_code ec, char const* what);
+ void do_read();
+ void on_read(beast::error_code ec, std::size_t);
+ void on_write(beast::error_code ec, std::size_t, bool close);
+
+public:
+ http_session(
+ tcp::socket&& socket,
+ boost::shared_ptr<shared_state> const& state);
+
+ void run();
+};
+
+#endif
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/listener.cpp b/src/boost/libs/beast/example/websocket/server/chat-multi/listener.cpp
new file mode 100644
index 000000000..8bbecb49b
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/listener.cpp
@@ -0,0 +1,101 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#include "listener.hpp"
+#include "http_session.hpp"
+#include <iostream>
+
+listener::
+listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ boost::shared_ptr<shared_state> const& state)
+ : ioc_(ioc)
+ , acceptor_(ioc)
+ , state_(state)
+{
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+}
+
+void
+listener::
+run()
+{
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+}
+
+// Report a failure
+void
+listener::
+fail(beast::error_code ec, char const* what)
+{
+ // Don't report on canceled operations
+ if(ec == net::error::operation_aborted)
+ return;
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Handle a connection
+void
+listener::
+on_accept(beast::error_code ec, tcp::socket socket)
+{
+ if(ec)
+ return fail(ec, "accept");
+ else
+ // Launch a new session for this connection
+ boost::make_shared<http_session>(
+ std::move(socket),
+ state_)->run();
+
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &listener::on_accept,
+ shared_from_this()));
+}
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/listener.hpp b/src/boost/libs/beast/example/websocket/server/chat-multi/listener.hpp
new file mode 100644
index 000000000..a0c536e2e
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/listener.hpp
@@ -0,0 +1,42 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_LISTENER_HPP
+#define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_LISTENER_HPP
+
+#include "beast.hpp"
+#include "net.hpp"
+#include <boost/smart_ptr.hpp>
+#include <memory>
+#include <string>
+
+// Forward declaration
+class shared_state;
+
+// Accepts incoming connections and launches the sessions
+class listener : public boost::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ tcp::acceptor acceptor_;
+ boost::shared_ptr<shared_state> state_;
+
+ void fail(beast::error_code ec, char const* what);
+ void on_accept(beast::error_code ec, tcp::socket socket);
+
+public:
+ listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ boost::shared_ptr<shared_state> const& state);
+
+ // Start accepting incoming connections
+ void run();
+};
+
+#endif
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/main.cpp b/src/boost/libs/beast/example/websocket/server/chat-multi/main.cpp
new file mode 100644
index 000000000..8645f1ded
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/main.cpp
@@ -0,0 +1,84 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+//------------------------------------------------------------------------------
+/*
+ WebSocket chat server, multi-threaded
+
+ This implements a multi-user chat room using WebSocket. The
+ `io_context` runs on any number of threads, specified at
+ the command line.
+
+*/
+//------------------------------------------------------------------------------
+
+#include "listener.hpp"
+#include "shared_state.hpp"
+
+#include <boost/asio/signal_set.hpp>
+#include <boost/smart_ptr.hpp>
+#include <iostream>
+#include <vector>
+
+int
+main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 5)
+ {
+ std::cerr <<
+ "Usage: websocket-chat-multi <address> <port> <doc_root> <threads>\n" <<
+ "Example:\n" <<
+ " websocket-chat-server 0.0.0.0 8080 . 5\n";
+ return EXIT_FAILURE;
+ }
+ auto address = net::ip::make_address(argv[1]);
+ auto port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto doc_root = argv[3];
+ auto const threads = std::max<int>(1, std::atoi(argv[4]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc;
+
+ // Create and launch a listening port
+ boost::make_shared<listener>(
+ ioc,
+ tcp::endpoint{address, port},
+ boost::make_shared<shared_state>(doc_root))->run();
+
+ // Capture SIGINT and SIGTERM to perform a clean shutdown
+ net::signal_set signals(ioc, SIGINT, SIGTERM);
+ signals.async_wait(
+ [&ioc](boost::system::error_code const&, int)
+ {
+ // Stop the io_context. This will cause run()
+ // to return immediately, eventually destroying the
+ // io_context and any remaining handlers in it.
+ ioc.stop();
+ });
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ // (If we get here, it means we got a SIGINT or SIGTERM)
+
+ // Block until all the threads exit
+ for(auto& t : v)
+ t.join();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/net.hpp b/src/boost/libs/beast/example/websocket/server/chat-multi/net.hpp
new file mode 100644
index 000000000..48a215355
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/net.hpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_NET_HPP
+#define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_NET_HPP
+
+#include <boost/asio.hpp>
+
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+#endif
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.cpp b/src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.cpp
new file mode 100644
index 000000000..9fceecc5d
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.cpp
@@ -0,0 +1,59 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#include "shared_state.hpp"
+#include "websocket_session.hpp"
+
+shared_state::
+shared_state(std::string doc_root)
+ : doc_root_(std::move(doc_root))
+{
+}
+
+void
+shared_state::
+join(websocket_session* session)
+{
+ std::lock_guard<std::mutex> lock(mutex_);
+ sessions_.insert(session);
+}
+
+void
+shared_state::
+leave(websocket_session* session)
+{
+ std::lock_guard<std::mutex> lock(mutex_);
+ sessions_.erase(session);
+}
+
+// Broadcast a message to all websocket client sessions
+void
+shared_state::
+send(std::string message)
+{
+ // Put the message in a shared pointer so we can re-use it for each client
+ auto const ss = boost::make_shared<std::string const>(std::move(message));
+
+ // Make a local list of all the weak pointers representing
+ // the sessions, so we can do the actual sending without
+ // holding the mutex:
+ std::vector<boost::weak_ptr<websocket_session>> v;
+ {
+ std::lock_guard<std::mutex> lock(mutex_);
+ v.reserve(sessions_.size());
+ for(auto p : sessions_)
+ v.emplace_back(p->weak_from_this());
+ }
+
+ // For each session in our local list, try to acquire a strong
+ // pointer. If successful, then send the message on that session.
+ for(auto const& wp : v)
+ if(auto sp = wp.lock())
+ sp->send(ss);
+}
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.hpp b/src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.hpp
new file mode 100644
index 000000000..08f4b2d34
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/shared_state.hpp
@@ -0,0 +1,48 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_SHARED_STATE_HPP
+#define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_SHARED_STATE_HPP
+
+#include <boost/smart_ptr.hpp>
+#include <memory>
+#include <mutex>
+#include <string>
+#include <unordered_set>
+
+// Forward declaration
+class websocket_session;
+
+// Represents the shared server state
+class shared_state
+{
+ std::string const doc_root_;
+
+ // This mutex synchronizes all access to sessions_
+ std::mutex mutex_;
+
+ // Keep a list of all the connected clients
+ std::unordered_set<websocket_session*> sessions_;
+
+public:
+ explicit
+ shared_state(std::string doc_root);
+
+ std::string const&
+ doc_root() const noexcept
+ {
+ return doc_root_;
+ }
+
+ void join (websocket_session* session);
+ void leave (websocket_session* session);
+ void send (std::string message);
+};
+
+#endif
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.cpp b/src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.cpp
new file mode 100644
index 000000000..4807a5f1e
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.cpp
@@ -0,0 +1,135 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#include "websocket_session.hpp"
+#include <iostream>
+
+websocket_session::
+websocket_session(
+ tcp::socket&& socket,
+ boost::shared_ptr<shared_state> const& state)
+ : ws_(std::move(socket))
+ , state_(state)
+{
+}
+
+websocket_session::
+~websocket_session()
+{
+ // Remove this session from the list of active sessions
+ state_->leave(this);
+}
+
+void
+websocket_session::
+fail(beast::error_code ec, char const* what)
+{
+ // Don't report these
+ if( ec == net::error::operation_aborted ||
+ ec == websocket::error::closed)
+ return;
+
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+void
+websocket_session::
+on_accept(beast::error_code ec)
+{
+ // Handle the error, if any
+ if(ec)
+ return fail(ec, "accept");
+
+ // Add this session to the list of active sessions
+ state_->join(this);
+
+ // Read a message
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &websocket_session::on_read,
+ shared_from_this()));
+}
+
+void
+websocket_session::
+on_read(beast::error_code ec, std::size_t)
+{
+ // Handle the error, if any
+ if(ec)
+ return fail(ec, "read");
+
+ // Send to all connections
+ state_->send(beast::buffers_to_string(buffer_.data()));
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+
+ // Read another message
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &websocket_session::on_read,
+ shared_from_this()));
+}
+
+void
+websocket_session::
+send(boost::shared_ptr<std::string const> const& ss)
+{
+ // Post our work to the strand, this ensures
+ // that the members of `this` will not be
+ // accessed concurrently.
+
+ net::post(
+ ws_.get_executor(),
+ beast::bind_front_handler(
+ &websocket_session::on_send,
+ shared_from_this(),
+ ss));
+}
+
+void
+websocket_session::
+on_send(boost::shared_ptr<std::string const> const& ss)
+{
+ // Always add to queue
+ queue_.push_back(ss);
+
+ // Are we already writing?
+ if(queue_.size() > 1)
+ return;
+
+ // We are not currently writing, so send this immediately
+ ws_.async_write(
+ net::buffer(*queue_.front()),
+ beast::bind_front_handler(
+ &websocket_session::on_write,
+ shared_from_this()));
+}
+
+void
+websocket_session::
+on_write(beast::error_code ec, std::size_t)
+{
+ // Handle the error, if any
+ if(ec)
+ return fail(ec, "write");
+
+ // Remove the string from the queue
+ queue_.erase(queue_.begin());
+
+ // Send the next message if any
+ if(! queue_.empty())
+ ws_.async_write(
+ net::buffer(*queue_.front()),
+ beast::bind_front_handler(
+ &websocket_session::on_write,
+ shared_from_this()));
+}
diff --git a/src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.hpp b/src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.hpp
new file mode 100644
index 000000000..c47d48ac9
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/chat-multi/websocket_session.hpp
@@ -0,0 +1,86 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/vinniefalco/CppCon2018
+//
+
+#ifndef BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_WEBSOCKET_SESSION_HPP
+#define BOOST_BEAST_EXAMPLE_WEBSOCKET_CHAT_MULTI_WEBSOCKET_SESSION_HPP
+
+#include "net.hpp"
+#include "beast.hpp"
+#include "shared_state.hpp"
+
+#include <cstdlib>
+#include <memory>
+#include <string>
+#include <vector>
+
+// Forward declaration
+class shared_state;
+
+/** Represents an active WebSocket connection to the server
+*/
+class websocket_session : public boost::enable_shared_from_this<websocket_session>
+{
+ beast::flat_buffer buffer_;
+ websocket::stream<beast::tcp_stream> ws_;
+ boost::shared_ptr<shared_state> state_;
+ std::vector<boost::shared_ptr<std::string const>> queue_;
+
+ void fail(beast::error_code ec, char const* what);
+ void on_accept(beast::error_code ec);
+ void on_read(beast::error_code ec, std::size_t bytes_transferred);
+ void on_write(beast::error_code ec, std::size_t bytes_transferred);
+
+public:
+ websocket_session(
+ tcp::socket&& socket,
+ boost::shared_ptr<shared_state> const& state);
+
+ ~websocket_session();
+
+ template<class Body, class Allocator>
+ void
+ run(http::request<Body, http::basic_fields<Allocator>> req);
+
+ // Send a message
+ void
+ send(boost::shared_ptr<std::string const> const& ss);
+
+private:
+ void
+ on_send(boost::shared_ptr<std::string const> const& ss);
+};
+
+template<class Body, class Allocator>
+void
+websocket_session::
+run(http::request<Body, http::basic_fields<Allocator>> req)
+{
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-chat-multi");
+ }));
+
+ // Accept the websocket handshake
+ ws_.async_accept(
+ req,
+ beast::bind_front_handler(
+ &websocket_session::on_accept,
+ shared_from_this()));
+}
+
+#endif
diff --git a/src/boost/libs/beast/example/websocket/server/coro-ssl/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/coro-ssl/CMakeLists.txt
new file mode 100644
index 000000000..a302a2f56
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/coro-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/server/coro-ssl "/")
+
+ add_executable (websocket-server-coro-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ websocket_server_coro_ssl.cpp
+ )
+
+ set_property(TARGET websocket-server-coro-ssl PROPERTY FOLDER "example-websocket-server")
+
+ target_link_libraries (websocket-server-coro-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/server/coro-ssl/Jamfile b/src/boost/libs/beast/example/websocket/server/coro-ssl/Jamfile
new file mode 100644
index 000000000..621b0ce58
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/coro-ssl/Jamfile
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-server-coro-ssl :
+ websocket_server_coro_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/coro-ssl/websocket_server_coro_ssl.cpp b/src/boost/libs/beast/example/websocket/server/coro-ssl/websocket_server_coro_ssl.cpp
new file mode 100644
index 000000000..3e1785f00
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/coro-ssl/websocket_server_coro_ssl.cpp
@@ -0,0 +1,206 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL server, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/spawn.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Echoes back all received WebSocket messages
+void
+do_session(
+ websocket::stream<
+ beast::ssl_stream<beast::tcp_stream>>& ws,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // Set the timeout.
+ beast::get_lowest_layer(ws).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ ws.next_layer().async_handshake(ssl::stream_base::server, yield[ec]);
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-coro-ssl");
+ }));
+
+ // Accept the websocket handshake
+ ws.async_accept(yield[ec]);
+ if(ec)
+ return fail(ec, "accept");
+
+ for(;;)
+ {
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message
+ ws.async_read(buffer, yield[ec]);
+
+ // This indicates that the session was closed
+ if(ec == websocket::error::closed)
+ break;
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Echo the message back
+ ws.text(ws.got_text());
+ ws.async_write(buffer.data(), yield[ec]);
+ if(ec)
+ return fail(ec, "write");
+ }
+}
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+void
+do_listen(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // Open the acceptor
+ tcp::acceptor acceptor(ioc);
+ acceptor.open(endpoint.protocol(), ec);
+ if(ec)
+ return fail(ec, "open");
+
+ // Allow address reuse
+ acceptor.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ return fail(ec, "set_option");
+
+ // Bind to the server address
+ acceptor.bind(endpoint, ec);
+ if(ec)
+ return fail(ec, "bind");
+
+ // Start listening for connections
+ acceptor.listen(net::socket_base::max_listen_connections, ec);
+ if(ec)
+ return fail(ec, "listen");
+
+ for(;;)
+ {
+ tcp::socket socket(ioc);
+ acceptor.async_accept(socket, yield[ec]);
+ if(ec)
+ fail(ec, "accept");
+ else
+ boost::asio::spawn(
+ acceptor.get_executor(),
+ std::bind(
+ &do_session,
+ websocket::stream<beast::ssl_stream<
+ beast::tcp_stream>>(std::move(socket), ctx),
+ std::placeholders::_1));
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-server-coro-ssl <address> <port> <threads>\n" <<
+ "Example:\n" <<
+ " websocket-server-coro-ssl 0.0.0.0 8080 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const threads = std::max<int>(1, std::atoi(argv[3]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Spawn a listening port
+ boost::asio::spawn(ioc,
+ std::bind(
+ &do_listen,
+ std::ref(ioc),
+ std::ref(ctx),
+ tcp::endpoint{address, port},
+ std::placeholders::_1));
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/coro/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/coro/CMakeLists.txt
new file mode 100644
index 000000000..c8e408d1c
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/coro/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/server/coro "/")
+
+add_executable (websocket-server-coro
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_server_coro.cpp
+)
+
+target_link_libraries(websocket-server-coro
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-server-coro PROPERTY FOLDER "example-websocket-server")
diff --git a/src/boost/libs/beast/example/websocket/server/coro/Jamfile b/src/boost/libs/beast/example/websocket/server/coro/Jamfile
new file mode 100644
index 000000000..5e8cbf948
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/coro/Jamfile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-server-coro :
+ websocket_server_coro.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/coro/websocket_server_coro.cpp b/src/boost/libs/beast/example/websocket/server/coro/websocket_server_coro.cpp
new file mode 100644
index 000000000..e15b01079
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/coro/websocket_server_coro.cpp
@@ -0,0 +1,180 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket server, coroutine
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/spawn.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Echoes back all received WebSocket messages
+void
+do_session(
+ websocket::stream<beast::tcp_stream>& ws,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // Set suggested timeout settings for the websocket
+ ws.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-coro");
+ }));
+
+ // Accept the websocket handshake
+ ws.async_accept(yield[ec]);
+ if(ec)
+ return fail(ec, "accept");
+
+ for(;;)
+ {
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message
+ ws.async_read(buffer, yield[ec]);
+
+ // This indicates that the session was closed
+ if(ec == websocket::error::closed)
+ break;
+
+ if(ec)
+ return fail(ec, "read");
+
+ // Echo the message back
+ ws.text(ws.got_text());
+ ws.async_write(buffer.data(), yield[ec]);
+ if(ec)
+ return fail(ec, "write");
+ }
+}
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+void
+do_listen(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ // Open the acceptor
+ tcp::acceptor acceptor(ioc);
+ acceptor.open(endpoint.protocol(), ec);
+ if(ec)
+ return fail(ec, "open");
+
+ // Allow address reuse
+ acceptor.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ return fail(ec, "set_option");
+
+ // Bind to the server address
+ acceptor.bind(endpoint, ec);
+ if(ec)
+ return fail(ec, "bind");
+
+ // Start listening for connections
+ acceptor.listen(net::socket_base::max_listen_connections, ec);
+ if(ec)
+ return fail(ec, "listen");
+
+ for(;;)
+ {
+ tcp::socket socket(ioc);
+ acceptor.async_accept(socket, yield[ec]);
+ if(ec)
+ fail(ec, "accept");
+ else
+ boost::asio::spawn(
+ acceptor.get_executor(),
+ std::bind(
+ &do_session,
+ websocket::stream<
+ beast::tcp_stream>(std::move(socket)),
+ std::placeholders::_1));
+ }
+}
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-server-coro <address> <port> <threads>\n" <<
+ "Example:\n" <<
+ " websocket-server-coro 0.0.0.0 8080 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const threads = std::max<int>(1, std::atoi(argv[3]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc(threads);
+
+ // Spawn a listening port
+ boost::asio::spawn(ioc,
+ std::bind(
+ &do_listen,
+ std::ref(ioc),
+ tcp::endpoint{address, port},
+ std::placeholders::_1));
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/fast/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/fast/CMakeLists.txt
new file mode 100644
index 000000000..93d469e91
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/fast/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/server/fast "/")
+
+add_executable (websocket-server-fast
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_server_fast.cpp
+)
+
+target_link_libraries(websocket-server-fast
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-server-fast PROPERTY FOLDER "example-websocket-server")
diff --git a/src/boost/libs/beast/example/websocket/server/fast/Jamfile b/src/boost/libs/beast/example/websocket/server/fast/Jamfile
new file mode 100644
index 000000000..3e6cbf5b0
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/fast/Jamfile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-server-fast :
+ websocket_server_fast.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ <library>/boost/coroutine//boost_coroutine
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/fast/websocket_server_fast.cpp b/src/boost/libs/beast/example/websocket/server/fast/websocket_server_fast.cpp
new file mode 100644
index 000000000..7f2a5e3cb
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/fast/websocket_server_fast.cpp
@@ -0,0 +1,480 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket server, fast
+//
+//------------------------------------------------------------------------------
+
+/* This server contains the following ports:
+
+ Synchronous <base port + 0>
+ Asynchronous <base port + 1>
+ Coroutine <base port + 2>
+
+ This program is optimized for the Autobahn|Testsuite
+ benchmarking and WebSocket compliants testing program.
+
+ See:
+ https://github.com/crossbario/autobahn-testsuite
+*/
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/http.hpp>
+#include <boost/beast/version.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/spawn.hpp>
+#include <boost/asio/strand.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << (std::string(what) + ": " + ec.message() + "\n");
+}
+
+// Adjust settings on the stream
+template<class NextLayer>
+void
+setup_stream(websocket::stream<NextLayer>& ws)
+{
+ // These values are tuned for Autobahn|Testsuite, and
+ // should also be generally helpful for increased performance.
+
+ websocket::permessage_deflate pmd;
+ pmd.client_enable = true;
+ pmd.server_enable = true;
+ pmd.compLevel = 3;
+ ws.set_option(pmd);
+
+ ws.auto_fragment(false);
+
+ // Autobahn|Testsuite needs this
+ ws.read_message_max(64 * 1024 * 1024);
+}
+
+//------------------------------------------------------------------------------
+
+void
+do_sync_session(websocket::stream<beast::tcp_stream>& ws)
+{
+ beast::error_code ec;
+
+ setup_stream(ws);
+
+ // Set a decorator to change the Server of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server, std::string(
+ BOOST_BEAST_VERSION_STRING) + "-Sync");
+ }));
+
+ ws.accept(ec);
+ if(ec)
+ return fail(ec, "accept");
+
+ for(;;)
+ {
+ beast::flat_buffer buffer;
+
+ ws.read(buffer, ec);
+ if(ec == websocket::error::closed)
+ break;
+ if(ec)
+ return fail(ec, "read");
+ ws.text(ws.got_text());
+ ws.write(buffer.data(), ec);
+ if(ec)
+ return fail(ec, "write");
+ }
+}
+
+void
+do_sync_listen(
+ net::io_context& ioc,
+ tcp::endpoint endpoint)
+{
+ beast::error_code ec;
+ tcp::acceptor acceptor{ioc, endpoint};
+ for(;;)
+ {
+ tcp::socket socket{ioc};
+
+ acceptor.accept(socket, ec);
+ if(ec)
+ return fail(ec, "accept");
+
+ std::thread(std::bind(
+ &do_sync_session,
+ websocket::stream<beast::tcp_stream>(
+ std::move(socket)))).detach();
+ }
+}
+
+//------------------------------------------------------------------------------
+
+// Echoes back all received WebSocket messages
+class async_session : public std::enable_shared_from_this<async_session>
+{
+ websocket::stream<beast::tcp_stream> ws_;
+ beast::flat_buffer buffer_;
+
+public:
+ // Take ownership of the socket
+ explicit
+ async_session(tcp::socket&& socket)
+ : ws_(std::move(socket))
+ {
+ setup_stream(ws_);
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server, std::string(
+ BOOST_BEAST_VERSION_STRING) + "-Async");
+ }));
+
+ // Accept the websocket handshake
+ ws_.async_accept(
+ beast::bind_front_handler(
+ &async_session::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "accept");
+
+ // Read a message
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ // Read a message into our buffer
+ ws_.async_read(
+ buffer_,
+ beast::bind_front_handler(
+ &async_session::on_read,
+ shared_from_this()));
+ }
+
+ void
+ on_read(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ // This indicates that the async_session was closed
+ if(ec == websocket::error::closed)
+ return;
+
+ if(ec)
+ fail(ec, "read");
+
+ // Echo the message
+ ws_.text(ws_.got_text());
+ ws_.async_write(
+ buffer_.data(),
+ beast::bind_front_handler(
+ &async_session::on_write,
+ shared_from_this()));
+ }
+
+ void
+ on_write(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ if(ec)
+ return fail(ec, "write");
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+
+ // Do another read
+ do_read();
+ }
+};
+
+// Accepts incoming connections and launches the sessions
+class async_listener : public std::enable_shared_from_this<async_listener>
+{
+ net::io_context& ioc_;
+ tcp::acceptor acceptor_;
+
+public:
+ async_listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint)
+ : ioc_(ioc)
+ , acceptor_(net::make_strand(ioc))
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ do_accept();
+ }
+
+private:
+ void
+ do_accept()
+ {
+ // The new connection gets its own strand
+ acceptor_.async_accept(
+ net::make_strand(ioc_),
+ beast::bind_front_handler(
+ &async_listener::on_accept,
+ shared_from_this()));
+ }
+
+ void
+ on_accept(beast::error_code ec, tcp::socket socket)
+ {
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the async_session and run it
+ std::make_shared<async_session>(std::move(socket))->run();
+ }
+
+ // Accept another connection
+ do_accept();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+void
+do_coro_session(
+ websocket::stream<beast::tcp_stream>& ws,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ setup_stream(ws);
+
+ // Set suggested timeout settings for the websocket
+ ws.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server, std::string(
+ BOOST_BEAST_VERSION_STRING) + "-Fiber");
+ }));
+
+ ws.async_accept(yield[ec]);
+ if(ec)
+ return fail(ec, "accept");
+
+ for(;;)
+ {
+ beast::flat_buffer buffer;
+
+ ws.async_read(buffer, yield[ec]);
+ if(ec == websocket::error::closed)
+ break;
+ if(ec)
+ return fail(ec, "read");
+
+ ws.text(ws.got_text());
+ ws.async_write(buffer.data(), yield[ec]);
+ if(ec)
+ return fail(ec, "write");
+ }
+}
+
+void
+do_coro_listen(
+ net::io_context& ioc,
+ tcp::endpoint endpoint,
+ net::yield_context yield)
+{
+ beast::error_code ec;
+
+ tcp::acceptor acceptor(ioc);
+ acceptor.open(endpoint.protocol(), ec);
+ if(ec)
+ return fail(ec, "open");
+
+ acceptor.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ return fail(ec, "set_option");
+
+ acceptor.bind(endpoint, ec);
+ if(ec)
+ return fail(ec, "bind");
+
+ acceptor.listen(net::socket_base::max_listen_connections, ec);
+ if(ec)
+ return fail(ec, "listen");
+
+ for(;;)
+ {
+ tcp::socket socket(ioc);
+
+ acceptor.async_accept(socket, yield[ec]);
+ if(ec)
+ {
+ fail(ec, "accept");
+ continue;
+ }
+
+ boost::asio::spawn(
+ acceptor.get_executor(),
+ std::bind(
+ &do_coro_session,
+ websocket::stream<
+ beast::tcp_stream>(std::move(socket)),
+ std::placeholders::_1));
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-server-fast <address> <starting-port> <threads>\n" <<
+ "Example:\n"
+ " websocket-server-fast 0.0.0.0 8080 1\n"
+ " Connect to:\n"
+ " starting-port+0 for synchronous,\n"
+ " starting-port+1 for asynchronous,\n"
+ " starting-port+2 for coroutine.\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const threads = std::max<int>(1, std::atoi(argv[3]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // Create sync port
+ std::thread(beast::bind_front_handler(
+ &do_sync_listen,
+ std::ref(ioc),
+ tcp::endpoint{
+ address,
+ static_cast<unsigned short>(port + 0u)}
+ )).detach();
+
+ // Create async port
+ std::make_shared<async_listener>(
+ ioc,
+ tcp::endpoint{
+ address,
+ static_cast<unsigned short>(port + 1u)})->run();
+
+ // Create coro port
+ boost::asio::spawn(ioc,
+ std::bind(
+ &do_coro_listen,
+ std::ref(ioc),
+ tcp::endpoint{
+ address,
+ static_cast<unsigned short>(port + 2u)},
+ std::placeholders::_1));
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/stackless-ssl/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/stackless-ssl/CMakeLists.txt
new file mode 100644
index 000000000..7ae66a07b
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/stackless-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/server/stackless-ssl "/")
+
+ add_executable (websocket-server-stackless-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ websocket_server_stackless_ssl.cpp
+ )
+
+ set_property(TARGET websocket-server-stackless-ssl PROPERTY FOLDER "example-websocket-server")
+
+ target_link_libraries (websocket-server-stackless-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/server/stackless-ssl/Jamfile b/src/boost/libs/beast/example/websocket/server/stackless-ssl/Jamfile
new file mode 100644
index 000000000..b0eaa4aa2
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/stackless-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-server-stackless-ssl :
+ websocket_server_stackless_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/stackless-ssl/websocket_server_stackless_ssl.cpp b/src/boost/libs/beast/example/websocket/server/stackless-ssl/websocket_server_stackless_ssl.cpp
new file mode 100644
index 000000000..c6eaec60c
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/stackless-ssl/websocket_server_stackless_ssl.cpp
@@ -0,0 +1,314 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL server, stackless coroutine
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/coroutine.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Echoes back all received WebSocket messages
+class session
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<session>
+{
+ websocket::stream<beast::ssl_stream<beast::tcp_stream>> ws_;
+ beast::flat_buffer buffer_;
+
+public:
+ // Take ownership of the socket
+ session(tcp::socket&& socket, ssl::context& ctx)
+ : ws_(std::move(socket), ctx)
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(ws_.get_executor(),
+ beast::bind_front_handler(&session::loop,
+ shared_from_this(),
+ beast::error_code{},
+ 0));
+ }
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+
+ reenter(*this)
+ {
+ // Set the timeout.
+ beast::get_lowest_layer(ws_).expires_after(std::chrono::seconds(30));
+
+ // Perform the SSL handshake
+ yield ws_.next_layer().async_handshake(
+ ssl::stream_base::server,
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ 0));
+ if(ec)
+ return fail(ec, "handshake");
+
+ // Turn off the timeout on the tcp_stream, because
+ // the websocket stream has its own timeout system.
+ beast::get_lowest_layer(ws_).expires_never();
+
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-stackless-ssl");
+ }));
+
+ // Accept the websocket handshake
+ yield ws_.async_accept(
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ 0));
+ if(ec)
+ return fail(ec, "accept");
+
+ for(;;)
+ {
+ // Read a message into our buffer
+ yield ws_.async_read(
+ buffer_,
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2));
+ if(ec == websocket::error::closed)
+ {
+ // This indicates that the session was closed
+ return;
+ }
+ if(ec)
+ fail(ec, "read");
+
+ // Echo the message
+ ws_.text(ws_.got_text());
+ yield ws_.async_write(
+ buffer_.data(),
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2));
+ if(ec)
+ return fail(ec, "write");
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+ }
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ ssl::context& ctx_;
+ tcp::acceptor acceptor_;
+ tcp::socket socket_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ ssl::context& ctx,
+ tcp::endpoint endpoint)
+ : ioc_(ioc)
+ , ctx_(ctx)
+ , acceptor_(ioc)
+ , socket_(ioc)
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ loop();
+ }
+
+private:
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(beast::error_code ec = {})
+ {
+ reenter(*this)
+ {
+ for(;;)
+ {
+ yield acceptor_.async_accept(
+ socket_,
+ std::bind(
+ &listener::loop,
+ shared_from_this(),
+ std::placeholders::_1));
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(std::move(socket_), ctx_)->run();
+ }
+
+ // Make sure each session gets its own strand
+ socket_ = tcp::socket(net::make_strand(ioc_));
+ }
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-server-async-ssl <address> <port> <threads>\n" <<
+ "Example:\n" <<
+ " websocket-server-async-ssl 0.0.0.0 8080 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const threads = std::max<int>(1, std::atoi(argv[3]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // Create and launch a listening port
+ std::make_shared<listener>(ioc, ctx, tcp::endpoint{address, port})->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/stackless/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/stackless/CMakeLists.txt
new file mode 100644
index 000000000..b260ca48b
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/stackless/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/server/stackless "/")
+
+add_executable (websocket-server-stackless
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_server_stackless.cpp
+)
+
+target_link_libraries(websocket-server-stackless
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-server-stackless PROPERTY FOLDER "example-websocket-server")
diff --git a/src/boost/libs/beast/example/websocket/server/stackless/Jamfile b/src/boost/libs/beast/example/websocket/server/stackless/Jamfile
new file mode 100644
index 000000000..ce9ab8987
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/stackless/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-server-stackless :
+ websocket_server_stackless.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/stackless/websocket_server_stackless.cpp b/src/boost/libs/beast/example/websocket/server/stackless/websocket_server_stackless.cpp
new file mode 100644
index 000000000..c57fe2899
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/stackless/websocket_server_stackless.cpp
@@ -0,0 +1,282 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket server, stackless coroutine
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/coroutine.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <algorithm>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <string>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Report a failure
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+// Echoes back all received WebSocket messages
+class session
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<session>
+{
+ websocket::stream<beast::tcp_stream> ws_;
+ beast::flat_buffer buffer_;
+
+public:
+ // Take ownership of the socket
+ explicit
+ session(tcp::socket socket)
+ : ws_(std::move(socket))
+ {
+ }
+
+ // Start the asynchronous operation
+ void
+ run()
+ {
+ // We need to be executing within a strand to perform async operations
+ // on the I/O objects in this session. Although not strictly necessary
+ // for single-threaded contexts, this example code is written to be
+ // thread-safe by default.
+ net::dispatch(ws_.get_executor(),
+ beast::bind_front_handler(&session::loop,
+ shared_from_this(),
+ beast::error_code{},
+ 0));
+ }
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(
+ beast::error_code ec,
+ std::size_t bytes_transferred)
+ {
+ boost::ignore_unused(bytes_transferred);
+ reenter(*this)
+ {
+ // Set suggested timeout settings for the websocket
+ ws_.set_option(
+ websocket::stream_base::timeout::suggested(
+ beast::role_type::server));
+
+ // Set a decorator to change the Server of the handshake
+ ws_.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-stackless");
+ }));
+
+ // Accept the websocket handshake
+ yield ws_.async_accept(
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ 0));
+ if(ec)
+ return fail(ec, "accept");
+
+ for(;;)
+ {
+ // Read a message into our buffer
+ yield ws_.async_read(
+ buffer_,
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2));
+ if(ec == websocket::error::closed)
+ {
+ // This indicates that the session was closed
+ return;
+ }
+ if(ec)
+ fail(ec, "read");
+
+ // Echo the message
+ ws_.text(ws_.got_text());
+ yield ws_.async_write(
+ buffer_.data(),
+ std::bind(
+ &session::loop,
+ shared_from_this(),
+ std::placeholders::_1,
+ std::placeholders::_2));
+ if(ec)
+ return fail(ec, "write");
+
+ // Clear the buffer
+ buffer_.consume(buffer_.size());
+ }
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+// Accepts incoming connections and launches the sessions
+class listener
+ : public boost::asio::coroutine
+ , public std::enable_shared_from_this<listener>
+{
+ net::io_context& ioc_;
+ tcp::acceptor acceptor_;
+ tcp::socket socket_;
+
+public:
+ listener(
+ net::io_context& ioc,
+ tcp::endpoint endpoint)
+ : ioc_(ioc)
+ , acceptor_(net::make_strand(ioc))
+ , socket_(net::make_strand(ioc))
+ {
+ beast::error_code ec;
+
+ // Open the acceptor
+ acceptor_.open(endpoint.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ // Allow address reuse
+ acceptor_.set_option(net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ // Bind to the server address
+ acceptor_.bind(endpoint, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ // Start listening for connections
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+ }
+
+ // Start accepting incoming connections
+ void
+ run()
+ {
+ loop();
+ }
+
+private:
+
+ #include <boost/asio/yield.hpp>
+
+ void
+ loop(beast::error_code ec = {})
+ {
+ reenter(*this)
+ {
+ for(;;)
+ {
+ yield acceptor_.async_accept(
+ socket_,
+ std::bind(
+ &listener::loop,
+ shared_from_this(),
+ std::placeholders::_1));
+ if(ec)
+ {
+ fail(ec, "accept");
+ }
+ else
+ {
+ // Create the session and run it
+ std::make_shared<session>(std::move(socket_))->run();
+ }
+
+ // Make sure each session gets its own strand
+ socket_ = tcp::socket(net::make_strand(ioc_));
+ }
+ }
+ }
+
+ #include <boost/asio/unyield.hpp>
+};
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ // Check command line arguments.
+ if (argc != 4)
+ {
+ std::cerr <<
+ "Usage: websocket-server-stackless <address> <port> <threads>\n" <<
+ "Example:\n" <<
+ " websocket-server-stackless 0.0.0.0 8080 1\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const threads = std::max<int>(1, std::atoi(argv[3]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{threads};
+
+ // Create and launch a listening port
+ std::make_shared<listener>(ioc, tcp::endpoint{address, port})->run();
+
+ // Run the I/O service on the requested number of threads
+ std::vector<std::thread> v;
+ v.reserve(threads - 1);
+ for(auto i = threads - 1; i > 0; --i)
+ v.emplace_back(
+ [&ioc]
+ {
+ ioc.run();
+ });
+ ioc.run();
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/example/websocket/server/sync-ssl/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/sync-ssl/CMakeLists.txt
new file mode 100644
index 000000000..0ad254ce5
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/sync-ssl/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+if (OPENSSL_FOUND)
+ GroupSources(include/boost/beast beast)
+ GroupSources(example/common common)
+ GroupSources(example/websocket/server/sync-ssl "/")
+
+ add_executable (websocket-server-sync-ssl
+ ${BOOST_BEAST_FILES}
+ ${PROJECT_SOURCE_DIR}/example/common/server_certificate.hpp
+ Jamfile
+ websocket_server_sync_ssl.cpp
+ )
+
+ set_property(TARGET websocket-server-sync-ssl PROPERTY FOLDER "example-websocket-server")
+
+ target_link_libraries (websocket-server-sync-ssl
+ OpenSSL::SSL OpenSSL::Crypto
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ )
+
+endif()
diff --git a/src/boost/libs/beast/example/websocket/server/sync-ssl/Jamfile b/src/boost/libs/beast/example/websocket/server/sync-ssl/Jamfile
new file mode 100644
index 000000000..55ac35b84
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/sync-ssl/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import ac ;
+
+project
+ : requirements
+ [ ac.check-library /boost/beast//lib-asio-ssl : <library>/boost/beast//lib-asio-ssl/<link>static : <build>no ]
+ ;
+
+exe websocket-server-sync-ssl :
+ websocket_server_sync_ssl.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/sync-ssl/websocket_server_sync_ssl.cpp b/src/boost/libs/beast/example/websocket/server/sync-ssl/websocket_server_sync_ssl.cpp
new file mode 100644
index 000000000..5a7b4dc06
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/sync-ssl/websocket_server_sync_ssl.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket SSL server, synchronous
+//
+//------------------------------------------------------------------------------
+
+#include "example/common/server_certificate.hpp"
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/ssl.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/ssl/stream.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <thread>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+namespace ssl = boost::asio::ssl; // from <boost/asio/ssl.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Echoes back all received WebSocket messages
+void
+do_session(tcp::socket& socket, ssl::context& ctx)
+{
+ try
+ {
+ // Construct the websocket stream around the socket
+ websocket::stream<beast::ssl_stream<tcp::socket&>> ws{socket, ctx};
+
+ // Perform the SSL handshake
+ ws.next_layer().handshake(ssl::stream_base::server);
+
+ // Set a decorator to change the Server of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-sync-ssl");
+ }));
+
+ // Accept the websocket handshake
+ ws.accept();
+
+ for(;;)
+ {
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message
+ ws.read(buffer);
+
+ // Echo the message back
+ ws.text(ws.got_text());
+ ws.write(buffer.data());
+ }
+ }
+ catch(beast::system_error const& se)
+ {
+ // This indicates that the session was closed
+ if(se.code() != websocket::error::closed)
+ std::cerr << "Error: " << se.code().message() << std::endl;
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 3)
+ {
+ std::cerr <<
+ "Usage: websocket-server-sync-ssl <address> <port>\n" <<
+ "Example:\n" <<
+ " websocket-server-sync-ssl 0.0.0.0 8080\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{1};
+
+ // The SSL context is required, and holds certificates
+ ssl::context ctx{ssl::context::tlsv12};
+
+ // This holds the self-signed certificate used by the server
+ load_server_certificate(ctx);
+
+ // The acceptor receives incoming connections
+ tcp::acceptor acceptor{ioc, {address, port}};
+ for(;;)
+ {
+ // This will receive the new connection
+ tcp::socket socket{ioc};
+
+ // Block until we get a connection
+ acceptor.accept(socket);
+
+ // Launch the session, transferring ownership of the socket
+ std::thread{std::bind(
+ &do_session,
+ std::move(socket),
+ std::ref(ctx))}.detach();
+ }
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/beast/example/websocket/server/sync/CMakeLists.txt b/src/boost/libs/beast/example/websocket/server/sync/CMakeLists.txt
new file mode 100644
index 000000000..486998615
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/sync/CMakeLists.txt
@@ -0,0 +1,23 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources(include/boost/beast beast)
+GroupSources(example/websocket/server/sync "/")
+
+add_executable (websocket-server-sync
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ websocket_server_sync.cpp
+)
+
+target_link_libraries(websocket-server-sync
+ lib-asio
+ lib-beast)
+
+set_property(TARGET websocket-server-sync PROPERTY FOLDER "example-websocket-server")
diff --git a/src/boost/libs/beast/example/websocket/server/sync/Jamfile b/src/boost/libs/beast/example/websocket/server/sync/Jamfile
new file mode 100644
index 000000000..7fd14ce4a
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/sync/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe websocket-server-sync :
+ websocket_server_sync.cpp
+ :
+ <variant>coverage:<build>no
+ <variant>ubasan:<build>no
+ ;
diff --git a/src/boost/libs/beast/example/websocket/server/sync/websocket_server_sync.cpp b/src/boost/libs/beast/example/websocket/server/sync/websocket_server_sync.cpp
new file mode 100644
index 000000000..2f75c468e
--- /dev/null
+++ b/src/boost/libs/beast/example/websocket/server/sync/websocket_server_sync.cpp
@@ -0,0 +1,121 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// Example: WebSocket server, synchronous
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <string>
+#include <thread>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+//------------------------------------------------------------------------------
+
+// Echoes back all received WebSocket messages
+void
+do_session(tcp::socket& socket)
+{
+ try
+ {
+ // Construct the stream by moving in the socket
+ websocket::stream<tcp::socket> ws{std::move(socket)};
+
+ // Set a decorator to change the Server of the handshake
+ ws.set_option(websocket::stream_base::decorator(
+ [](websocket::response_type& res)
+ {
+ res.set(http::field::server,
+ std::string(BOOST_BEAST_VERSION_STRING) +
+ " websocket-server-sync");
+ }));
+
+ // Accept the websocket handshake
+ ws.accept();
+
+ for(;;)
+ {
+ // This buffer will hold the incoming message
+ beast::flat_buffer buffer;
+
+ // Read a message
+ ws.read(buffer);
+
+ // Echo the message back
+ ws.text(ws.got_text());
+ ws.write(buffer.data());
+ }
+ }
+ catch(beast::system_error const& se)
+ {
+ // This indicates that the session was closed
+ if(se.code() != websocket::error::closed)
+ std::cerr << "Error: " << se.code().message() << std::endl;
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ }
+}
+
+//------------------------------------------------------------------------------
+
+int main(int argc, char* argv[])
+{
+ try
+ {
+ // Check command line arguments.
+ if (argc != 3)
+ {
+ std::cerr <<
+ "Usage: websocket-server-sync <address> <port>\n" <<
+ "Example:\n" <<
+ " websocket-server-sync 0.0.0.0 8080\n";
+ return EXIT_FAILURE;
+ }
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+
+ // The io_context is required for all I/O
+ net::io_context ioc{1};
+
+ // The acceptor receives incoming connections
+ tcp::acceptor acceptor{ioc, {address, port}};
+ for(;;)
+ {
+ // This will receive the new connection
+ tcp::socket socket{ioc};
+
+ // Block until we get a connection
+ acceptor.accept(socket);
+
+ // Launch the session, transferring ownership of the socket
+ std::thread{std::bind(
+ &do_session,
+ std::move(socket))}.detach();
+ }
+ }
+ catch (const std::exception& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+}
diff --git a/src/boost/libs/beast/index.html b/src/boost/libs/beast/index.html
new file mode 100644
index 000000000..f6ad9d2ab
--- /dev/null
+++ b/src/boost/libs/beast/index.html
@@ -0,0 +1,21 @@
+<html>
+ <head>
+ <title>Boost.Beast</title>
+ <meta http-equiv="refresh" content="0; URL=./doc/html/index.html">
+ </head>
+ <body>
+ Automatic redirection failed, please go to
+ <a href="./doc/html/index.html">./doc/html/index.html</a>
+ <hr>
+ <tt>
+ Boost.Beast<br>
+ <br>
+ Copyright&nbsp;(C)&nbsp;2016-2017&nbsp;Vinnie&nbsp;Falco<br>
+ <br>
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENSE_1_0.txt or copy at
+ <a href=http://www.boost.org/LICENSE_1_0.txt>http://www.boost.org/LICENSE_1_0.txt</a>) <br>
+ <br>
+ </tt>
+ </body>
+</html>
diff --git a/src/boost/libs/beast/meta/explicit-failures-markup.xml b/src/boost/libs/beast/meta/explicit-failures-markup.xml
new file mode 100644
index 000000000..40d61a665
--- /dev/null
+++ b/src/boost/libs/beast/meta/explicit-failures-markup.xml
@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="utf-8"?>
+<explicit-failures-markup>
+ <!-- beast -->
+ <library name="beast">
+ <mark-unusable>
+ <toolset name="clang-linux-3.0*"/>
+ <toolset name="clang-linux-3.1*"/>
+ <toolset name="clang-linux-3.2*"/>
+ <toolset name="gcc-3.*"/>
+ <toolset name="gcc-4.0*"/>
+ <toolset name="gcc-4.1*"/>
+ <toolset name="gcc-4.2*"/>
+ <toolset name="gcc-4.3*"/>
+ <toolset name="gcc-4.4*"/>
+ <toolset name="gcc-4.5*"/>
+ <toolset name="gcc-4.6*"/>
+ <toolset name="gcc-4.7*"/>
+ <toolset name="gcc-mngw-3.*"/>
+ <toolset name="gcc-mngw-4.0*"/>
+ <toolset name="gcc-mngw-4.1*"/>
+ <toolset name="gcc-mngw-4.2*"/>
+ <toolset name="gcc-mngw-4.3*"/>
+ <toolset name="gcc-mngw-4.4*"/>
+ <toolset name="gcc-mngw-4.5*"/>
+ <toolset name="gcc-mngw-4.6*"/>
+ <toolset name="gcc-mngw-4.7*"/>
+ <toolset name="qcc-3.*"/>
+ <toolset name="qcc-4.0*"/>
+ <toolset name="qcc-4.1*"/>
+ <toolset name="qcc-4.2*"/>
+ <toolset name="qcc-4.3*"/>
+ <toolset name="qcc-4.4*"/>
+ <toolset name="qcc-4.5*"/>
+ <toolset name="qcc-4.6*"/>
+ <toolset name="qcc-4.7*"/>
+ <toolset name="msvc-7.1"/>
+ <toolset name="msvc-8.*"/>
+ <toolset name="msvc-9.*"/>
+ <toolset name="msvc-10.*"/>
+ <toolset name="msvc-11.*"/>
+ <toolset name="msvc-12.*"/>
+ <note author="Vinnie Falco">C++11 is the minimum requirement.</note>
+ </mark-unusable>
+ </library>
+</explicit-failures-markup>
diff --git a/src/boost/libs/beast/meta/libraries.json b/src/boost/libs/beast/meta/libraries.json
new file mode 100644
index 000000000..b37a97203
--- /dev/null
+++ b/src/boost/libs/beast/meta/libraries.json
@@ -0,0 +1,15 @@
+{
+ "key": "beast",
+ "name": "Beast",
+ "authors": [
+ "Vinnie Falco"
+ ],
+ "description": "Portable HTTP, WebSocket, and network operations using only C++11 and Boost.Asio",
+ "category": [
+ "Concurrent",
+ "IO"
+ ],
+ "maintainers": [
+ "Vinnie Falco <vinnie.falco@gmail.com>"
+ ]
+}
diff --git a/src/boost/libs/beast/test/CMakeLists.txt b/src/boost/libs/beast/test/CMakeLists.txt
new file mode 100644
index 000000000..9e474bc14
--- /dev/null
+++ b/src/boost/libs/beast/test/CMakeLists.txt
@@ -0,0 +1,60 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+include_directories (./extern)
+include_directories (./extras/include)
+
+file (GLOB_RECURSE EXTRAS_FILES
+ ${PROJECT_SOURCE_DIR}/test/extras/include/*.hpp
+ ${PROJECT_SOURCE_DIR}/test/extras/include/*.ipp
+ ${PROJECT_SOURCE_DIR}/test/lib_ssl.cpp
+ )
+
+if (OPENSSL_FOUND)
+ link_libraries (${OPENSSL_LIBRARIES})
+endif()
+
+set (ZLIB_SOURCES
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/crc32.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/deflate.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inffast.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inffixed.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inflate.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inftrees.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/trees.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/zlib.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/zutil.h
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/adler32.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/compress.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/crc32.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/deflate.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/infback.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inffast.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inflate.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/inftrees.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/trees.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/uncompr.c
+ ${CMAKE_CURRENT_LIST_DIR}/extern/zlib-1.2.11/zutil.c
+)
+
+set (TEST_MAIN ${PROJECT_SOURCE_DIR}/test/lib_beast.cpp)
+
+GroupSources (. "/")
+
+add_library (
+ lib-test STATIC
+ ${CMAKE_CURRENT_LIST_DIR}/lib_test.cpp
+)
+
+set_property(TARGET lib-test PROPERTY FOLDER "static-libs")
+
+add_subdirectory (beast)
+add_subdirectory (bench)
+add_subdirectory (doc)
+add_subdirectory (example)
diff --git a/src/boost/libs/beast/test/Jamfile b/src/boost/libs/beast/test/Jamfile
new file mode 100644
index 000000000..02c8a7d04
--- /dev/null
+++ b/src/boost/libs/beast/test/Jamfile
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+import testing ;
+import ../../config/checks/config : requires ;
+
+lib lib-test
+ : lib_test.cpp
+ : requirements
+ <link>static
+ $(defines)
+ : usage-requirements
+ <include>./extras/include
+ $(defines)
+ ;
+
+project /boost/beast/test
+ : requirements
+ [ requires
+ cxx11_constexpr
+ cxx11_decltype
+ cxx11_hdr_tuple
+ #cxx11_sfinae_expr # Every MSVC fails this
+ cxx11_template_aliases
+ cxx11_variadic_templates
+ ]
+ <include>./extern
+ <define>BOOST_BEAST_TESTS
+ <library>/boost/beast//lib-asio/<link>static
+ <boost.beast.separate-compilation>on:<library>/boost/beast//lib-beast/<link>static
+ <library>/boost/filesystem//boost_filesystem
+ <library>/boost/coroutine//boost_coroutine
+ ;
+
+path-constant ZLIB_SOURCES :
+ extern/zlib-1.2.11/adler32.c
+ extern/zlib-1.2.11/compress.c
+ extern/zlib-1.2.11/crc32.c
+ extern/zlib-1.2.11/deflate.c
+ extern/zlib-1.2.11/infback.c
+ extern/zlib-1.2.11/inffast.c
+ extern/zlib-1.2.11/inflate.c
+ extern/zlib-1.2.11/inftrees.c
+ extern/zlib-1.2.11/trees.c
+ extern/zlib-1.2.11/uncompr.c
+ extern/zlib-1.2.11/zutil.c
+ ;
+
+alias run-tests :
+ beast//run-tests
+ bench//run-tests
+ doc//run-tests
+ example//run-tests
+ ;
+
+alias fat-tests :
+ beast//fat-tests
+ doc//fat-tests
+ example//fat-tests
+ ;
+
+explicit fat-tests ;
+
+alias run-fat-tests :
+ beast//run-fat-tests
+ doc//run-fat-tests
+ example//run-fat-tests
+ ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/CMakeLists.txt b/src/boost/libs/beast/test/beast/CMakeLists.txt
new file mode 100644
index 000000000..4d486fe64
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/CMakeLists.txt
@@ -0,0 +1,46 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_definitions (-DBOOST_BEAST_ALLOW_DEPRECATED)
+
+# For buffers_cat
+add_definitions (-DBOOST_BEAST_TESTS)
+
+add_subdirectory (_experimental)
+add_subdirectory (core)
+add_subdirectory (http)
+add_subdirectory (ssl)
+add_subdirectory (websocket)
+add_subdirectory (zlib)
+
+#-------------------------------------------------------------------------------
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/extras/include/boost /)
+GroupSources (test/beast /)
+
+add_executable (tests-beast
+ ${BOOST_BEAST_FILES}
+ ${EXTRAS_FILES}
+ Jamfile
+ core.cpp
+ http.cpp
+ ssl.cpp
+ version.cpp
+ websocket.cpp
+ zlib.cpp
+)
+
+target_link_libraries(tests-beast
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ lib-test)
+
+set_property(TARGET tests-beast PROPERTY FOLDER "tests")
diff --git a/src/boost/libs/beast/test/beast/Jamfile b/src/boost/libs/beast/test/beast/Jamfile
new file mode 100644
index 000000000..6cb681b7c
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/Jamfile
@@ -0,0 +1,45 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+alias run-tests :
+ [ compile core.cpp ]
+ [ compile http.cpp ]
+ [ compile ssl.cpp ]
+ [ compile version.cpp ]
+ [ compile websocket.cpp ]
+ [ compile zlib.cpp ]
+ _experimental//run-tests
+ core//run-tests
+ http//run-tests
+ ssl//run-tests
+ websocket//run-tests
+ zlib//run-tests
+ ;
+
+alias fat-tests :
+ _experimental//fat-tests
+ core//fat-tests
+ http//fat-tests
+ ssl//fat-tests
+ websocket//fat-tests
+ zlib//fat-tests
+ ;
+
+explicit fat-tests ;
+
+alias run-fat-tests :
+ _experimental//run-fat-tests
+ core//run-fat-tests
+ http//run-fat-tests
+ ssl//run-fat-tests
+ websocket//run-fat-tests
+ zlib//run-fat-tests
+ ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/_experimental/CMakeLists.txt b/src/boost/libs/beast/test/beast/_experimental/CMakeLists.txt
new file mode 100644
index 000000000..b588874ae
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/_experimental/CMakeLists.txt
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/beast/_experimental "/")
+
+add_executable (tests-beast-_experimental
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ error.cpp
+ icy_stream.cpp
+ stream.cpp
+)
+
+target_link_libraries(tests-beast-_experimental
+ lib-asio
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET tests-beast-_experimental PROPERTY FOLDER "tests")
diff --git a/src/boost/libs/beast/test/beast/_experimental/Jamfile b/src/boost/libs/beast/test/beast/_experimental/Jamfile
new file mode 100644
index 000000000..2070f0970
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/_experimental/Jamfile
@@ -0,0 +1,38 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+local SOURCES =
+ error.cpp
+ icy_stream.cpp
+ stream.cpp
+ ;
+
+local RUN_TESTS ;
+
+for local f in $(SOURCES)
+{
+ RUN_TESTS += [ run $(f)
+ /boost/beast/test//lib-test
+ ] ;
+}
+
+alias run-tests : $(RUN_TESTS) ;
+
+exe fat-tests :
+ $(SOURCES)
+ /boost/beast/test//lib-test
+ ;
+
+explicit fat-tests ;
+
+run $(SOURCES)
+ /boost/beast/test//lib-test
+ : : : : run-fat-tests ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/_experimental/error.cpp b/src/boost/libs/beast/test/beast/_experimental/error.cpp
new file mode 100644
index 000000000..da182ad60
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/_experimental/error.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/_experimental/test/error.hpp>
diff --git a/src/boost/libs/beast/test/beast/_experimental/icy_stream.cpp b/src/boost/libs/beast/test/beast/_experimental/icy_stream.cpp
new file mode 100644
index 000000000..b60a162e2
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/_experimental/icy_stream.cpp
@@ -0,0 +1,127 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/_experimental/http/icy_stream.hpp>
+
+#include <boost/beast/core/buffers_adaptor.hpp>
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/read_size.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <array>
+#include <memory>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class icy_stream_test
+ : public unit_test::suite
+{
+public:
+ void
+ doMatrix(string_view in, string_view out)
+ {
+ using net::mutable_buffer;
+ net::io_context ioc;
+ auto len = out.size() + 8;
+ std::unique_ptr<char[]> p(new char[len]);
+ for(std::size_t i = 1; i < len; ++i)
+ {
+ std::array<mutable_buffer, 2> mbs{{
+ mutable_buffer(p.get(), i),
+ mutable_buffer(p.get() + i, len - i)}};
+ for(std::size_t j = 1; j < in.size(); ++j)
+ {
+ for(std::size_t k = 1; k < len; ++k)
+ {
+ // sync
+ {
+ buffers_adaptor<decltype(mbs)> ba(mbs);
+ std::memset(p.get(), 0, len);
+
+ icy_stream<test::stream> is{ioc};
+ is.next_layer().read_size(j);
+ is.next_layer().append(in);
+ connect(is.next_layer()).close();
+
+ error_code ec;
+ for(;;)
+ {
+ ba.commit(is.read_some(
+ ba.prepare(read_size(ba, k)), ec));
+ if(ec)
+ break;
+ }
+ if(! BEAST_EXPECTS(
+ ec == net::error::eof, ec.message()))
+ continue;
+ auto const s = buffers_to_string(ba.data());
+ BEAST_EXPECTS(s == out, s);
+ }
+ // async
+ {
+ buffers_adaptor<decltype(mbs)> ba(mbs);
+ std::memset(p.get(), 0, len);
+
+ icy_stream<test::stream> is{ioc};
+ is.next_layer().read_size(j);
+ is.next_layer().append(in);
+ connect(is.next_layer()).close();
+
+ error_code ec;
+ for(;;)
+ {
+ is.async_read_some(
+ ba.prepare(read_size(ba, k)),
+ [&ec, &ba](error_code ec_, std::size_t n)
+ {
+ ec = ec_;
+ ba.commit(n);
+ });
+ ioc.run();
+ ioc.restart();
+ if(ec)
+ break;
+ }
+ if(! BEAST_EXPECTS(
+ ec == net::error::eof, ec.message()))
+ continue;
+ auto const s = buffers_to_string(ba.data());
+ if(! BEAST_EXPECTS(s == out, s))
+ {
+ s.size();
+ }
+ }
+ }
+ }
+ }
+ }
+
+ void
+ testStream()
+ {
+ doMatrix("HTTP/1.1 200 OK\r\n", "HTTP/1.1 200 OK\r\n");
+ doMatrix("ICY 200 OK\r\n", "HTTP/1.1 200 OK\r\n");
+ }
+
+ void
+ run() override
+ {
+ testStream();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,icy_stream);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/_experimental/stream.cpp b/src/boost/libs/beast/test/beast/_experimental/stream.cpp
new file mode 100644
index 000000000..d4089b200
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/_experimental/stream.cpp
@@ -0,0 +1,156 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/_experimental/test/stream.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/_experimental/test/handler.hpp>
+
+namespace boost {
+namespace beast {
+
+class stream_test
+ : public unit_test::suite
+{
+public:
+ void
+ testTestStream()
+ {
+ char buf[1] = {};
+ net::mutable_buffer m0;
+ net::mutable_buffer m1(buf, sizeof(buf));
+
+ {
+ net::io_context ioc;
+
+ {
+ test::stream ts(ioc);
+ }
+ {
+ test::stream ts(ioc);
+ ts.close();
+ }
+ {
+ test::stream t1(ioc);
+ auto t2 = connect(t1);
+ }
+ {
+ test::stream t1(ioc);
+ auto t2 = connect(t1);
+ t2.close();
+ }
+ }
+ {
+ // abandon
+ net::io_context ioc;
+ test::stream ts(ioc);
+ ts.async_read_some(m1,
+ [](error_code, std::size_t)
+ {
+ BEAST_FAIL();
+ });
+ }
+ //---
+ {
+ net::io_context ioc;
+ {
+ test::stream ts(ioc);
+ ts.async_read_some(m1,
+ test::fail_handler(
+ net::error::operation_aborted));
+ }
+ test::run(ioc);
+ }
+ {
+ net::io_context ioc;
+ test::stream ts(ioc);
+ ts.async_read_some(m1,
+ test::fail_handler(
+ net::error::operation_aborted));
+ ts.close();
+ test::run(ioc);
+ }
+ {
+ net::io_context ioc;
+ test::stream t1(ioc);
+ auto t2 = connect(t1);
+ t1.async_read_some(m1,
+ test::fail_handler(
+ net::error::eof));
+ t2.close();
+ test::run(ioc);
+ }
+ {
+ net::io_context ioc;
+ test::stream t1(ioc);
+ auto t2 = connect(t1);
+ t1.async_read_some(m1,
+ test::fail_handler(
+ net::error::operation_aborted));
+ t1.close();
+ test::run(ioc);
+ }
+ }
+
+ void
+ testSharedAbandon()
+ {
+ struct handler
+ {
+ std::shared_ptr<test::stream> ts_;
+
+ void
+ operator()(error_code, std::size_t)
+ {
+ }
+ };
+
+ char buf[1] = {};
+ net::mutable_buffer m1(buf, sizeof(buf));
+
+ std::weak_ptr<test::stream> wp;
+
+ {
+ net::io_context ioc;
+ {
+ auto sp = std::make_shared<test::stream>(ioc);
+
+ sp->async_read_some(m1, handler{sp});
+ wp = sp;
+ }
+ }
+ BEAST_EXPECT(! wp.lock());
+ }
+
+ void
+ testLifetimeViolation()
+ {
+ // This should assert
+ std::shared_ptr<test::stream> sp;
+ {
+ net::io_context ioc;
+ sp = std::make_shared<test::stream>(ioc);
+ }
+ sp.reset();
+ }
+
+ void
+ run() override
+ {
+ testTestStream();
+ testSharedAbandon();
+ //testLifetimeViolation();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,test,stream);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core.cpp b/src/boost/libs/beast/test/beast/core.cpp
new file mode 100644
index 000000000..25b0b1c20
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core.cpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// If including Windows.h generates errors, it
+// means that min/max macros are being substituted.
+#ifdef _MSC_VER
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#endif
+
+// Test that header file is self-contained.
+#include <boost/beast/core.hpp>
diff --git a/src/boost/libs/beast/test/beast/core/CMakeLists.txt b/src/boost/libs/beast/test/beast/core/CMakeLists.txt
new file mode 100644
index 000000000..8c0844c42
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/CMakeLists.txt
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/beast/core "/")
+
+add_executable (tests-beast-core
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ test_buffer.hpp
+ file_test.hpp
+ stream_tests.hpp
+ test_handler.hpp
+ _detail_base64.cpp
+ _detail_bind_continuation.cpp
+ _detail_buffer.cpp
+ _detail_clamp.cpp
+ _detail_get_io_context.cpp
+ _detail_is_invocable.cpp
+ _detail_read.cpp
+ _detail_sha1.cpp
+ _detail_tuple.cpp
+ _detail_variant.cpp
+ _detail_varint.cpp
+ async_base.cpp
+ basic_stream.cpp
+ bind_handler.cpp
+ buffer_traits.cpp
+ buffered_read_stream.cpp
+ buffers_adapter.cpp
+ buffers_adaptor.cpp
+ buffers_cat.cpp
+ buffers_prefix.cpp
+ buffers_range.cpp
+ buffers_suffix.cpp
+ buffers_to_string.cpp
+ detect_ssl.cpp
+ error.cpp
+ file.cpp
+ file_base.cpp
+ file_posix.cpp
+ file_stdio.cpp
+ file_win32.cpp
+ flat_buffer.cpp
+ flat_static_buffer.cpp
+ flat_stream.cpp
+ make_printable.cpp
+ multi_buffer.cpp
+ ostream.cpp
+ rate_policy.cpp
+ read_size.cpp
+ role.cpp
+ saved_handler.cpp
+ span.cpp
+ static_buffer.cpp
+ static_string.cpp
+ stream_traits.cpp
+ string.cpp
+ string_param.cpp
+ tcp_stream.cpp
+)
+
+target_link_libraries(tests-beast-core
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET tests-beast-core PROPERTY FOLDER "tests")
diff --git a/src/boost/libs/beast/test/beast/core/Jamfile b/src/boost/libs/beast/test/beast/core/Jamfile
new file mode 100644
index 000000000..9d8db7f47
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/Jamfile
@@ -0,0 +1,82 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+local SOURCES =
+ _detail_base64.cpp
+ _detail_bind_continuation.cpp
+ _detail_buffer.cpp
+ _detail_clamp.cpp
+ _detail_get_io_context.cpp
+ _detail_is_invocable.cpp
+ _detail_read.cpp
+ _detail_sha1.cpp
+ _detail_tuple.cpp
+ _detail_variant.cpp
+ _detail_varint.cpp
+ async_base.cpp
+ basic_stream.cpp
+ bind_handler.cpp
+ buffer_traits.cpp
+ buffered_read_stream.cpp
+ buffers_adapter.cpp
+ buffers_adaptor.cpp
+ buffers_cat.cpp
+ buffers_prefix.cpp
+ buffers_range.cpp
+ buffers_suffix.cpp
+ buffers_to_string.cpp
+ detect_ssl.cpp
+ error.cpp
+ file.cpp
+ file_base.cpp
+ file_posix.cpp
+ file_stdio.cpp
+ file_win32.cpp
+ flat_buffer.cpp
+ flat_static_buffer.cpp
+ flat_stream.cpp
+ make_printable.cpp
+ multi_buffer.cpp
+ ostream.cpp
+ rate_policy.cpp
+ read_size.cpp
+ role.cpp
+ saved_handler.cpp
+ span.cpp
+ static_buffer.cpp
+ static_string.cpp
+ stream_traits.cpp
+ string.cpp
+ string_param.cpp
+ tcp_stream.cpp
+ ;
+
+local RUN_TESTS ;
+
+for local f in $(SOURCES)
+{
+ RUN_TESTS += [ run $(f)
+ /boost/beast/test//lib-test
+ ] ;
+}
+
+alias run-tests : $(RUN_TESTS) ;
+
+exe fat-tests :
+ $(SOURCES)
+ /boost/beast/test//lib-test
+ ;
+
+explicit fat-tests ;
+
+run $(SOURCES)
+ /boost/beast/test//lib-test
+ : : : : run-fat-tests ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/core/_detail_base64.cpp b/src/boost/libs/beast/test/beast/core/_detail_base64.cpp
new file mode 100644
index 000000000..c4c06f240
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_base64.cpp
@@ -0,0 +1,90 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/base64.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class base64_test : public beast::unit_test::suite
+{
+public:
+ std::string
+ base64_encode(
+ std::uint8_t const* data,
+ std::size_t len)
+ {
+ std::string dest;
+ dest.resize(base64::encoded_size(len));
+ dest.resize(base64::encode(&dest[0], data, len));
+ return dest;
+ }
+
+ std::string
+ base64_encode(string_view s)
+ {
+ return base64_encode (reinterpret_cast <
+ std::uint8_t const*> (s.data()), s.size());
+ }
+
+ std::string
+ base64_decode(string_view data)
+ {
+ std::string dest;
+ dest.resize(base64::decoded_size(data.size()));
+ auto const result = base64::decode(
+ &dest[0], data.data(), data.size());
+ dest.resize(result.first);
+ return dest;
+ }
+
+ void
+ check (std::string const& in, std::string const& out)
+ {
+ auto const encoded = base64_encode (in);
+ BEAST_EXPECT(encoded == out);
+ BEAST_EXPECT(base64_decode (encoded) == in);
+ }
+
+ void
+ run()
+ {
+ check ("", "");
+ check ("f", "Zg==");
+ check ("fo", "Zm8=");
+ check ("foo", "Zm9v");
+ check ("foob", "Zm9vYg==");
+ check ("fooba", "Zm9vYmE=");
+ check ("foobar", "Zm9vYmFy");
+
+ check(
+ "Man is distinguished, not only by his reason, but by this singular passion from "
+ "other animals, which is a lust of the mind, that by a perseverance of delight "
+ "in the continued and indefatigable generation of knowledge, exceeds the short "
+ "vehemence of any carnal pleasure."
+ ,
+ "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlz"
+ "IHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2Yg"
+ "dGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGlu"
+ "dWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRo"
+ "ZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4="
+ );
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,base64);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_bind_continuation.cpp b/src/boost/libs/beast/test/beast/core/_detail_bind_continuation.cpp
new file mode 100644
index 000000000..bcc283b43
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_bind_continuation.cpp
@@ -0,0 +1,192 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/bind_continuation.hpp>
+
+#if 0
+
+#include "test_executor.hpp"
+#include "test_handler.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/error.hpp>
+#include <boost/beast/core/stream_traits.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/post.hpp>
+#include <boost/asio/defer.hpp>
+#include <boost/core/exchange.hpp>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class bind_continuation_test
+ : public beast::unit_test::suite
+{
+public:
+ class handler
+ {
+ bool pass_ = false;
+
+ public:
+ handler() = default;
+
+ ~handler()
+ {
+ BEAST_EXPECT(pass_);
+ }
+
+ handler(handler&& other)
+ : pass_(boost::exchange(other.pass_, true))
+ {
+ }
+
+ void operator()()
+ {
+ pass_ = true;
+ }
+ };
+
+ void
+ testBinder()
+ {
+ net::io_context ioc;
+
+ // free functions
+
+ {
+ test_executor<> ex(ioc.get_executor());
+ BEAST_EXPECT(ex->total == 0);
+ net::dispatch(
+ bind_continuation(ex, handler{}));
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(ex->dispatch == 1);
+ }
+
+ {
+ test_executor<> ex(ioc.get_executor());
+ BEAST_EXPECT(ex->total == 0);
+ net::post(
+ bind_continuation(ex, handler{}));
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(ex->defer == 1);
+ }
+
+ {
+ test_executor<> ex(ioc.get_executor());
+ BEAST_EXPECT(ex->total == 0);
+ net::defer(
+ bind_continuation(ex, handler{}));
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(ex->defer == 1);
+ }
+
+ // members
+
+ {
+ test_executor<> ex(ioc.get_executor());
+ BEAST_EXPECT(ex->total == 0);
+ ex.dispatch(
+ bind_continuation(ex, handler{}),
+ std::allocator<void>{});
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(ex->dispatch == 1);
+ }
+
+ {
+ test_executor<> ex(ioc.get_executor());
+ BEAST_EXPECT(ex->total == 0);
+ ex.post(
+ bind_continuation(ex, handler{}),
+ std::allocator<void>{});
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(ex->post == 1);
+ }
+
+ {
+ test_executor<> ex(ioc.get_executor());
+ BEAST_EXPECT(ex->total == 0);
+ ex.defer(
+ bind_continuation(ex, handler{}),
+ std::allocator<void>{});
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(ex->defer == 1);
+ }
+
+ // relational
+
+ {
+ auto h1 = bind_continuation(
+ ioc.get_executor(), handler{});
+ auto h2 = bind_continuation(
+ ioc.get_executor(), handler{});
+ BEAST_EXPECT(
+ net::get_associated_executor(h1) ==
+ net::get_associated_executor(h2));
+ BEAST_EXPECT(
+ std::addressof(
+ net::get_associated_executor(h1).context()) ==
+ std::addressof(
+ net::get_associated_executor(h2).context()));
+ h1();
+ h2();
+ }
+
+ {
+ net::io_context ioc1;
+ net::io_context ioc2;
+ auto h1 = bind_continuation(
+ ioc1.get_executor(), handler{});
+ auto h2 = bind_continuation(
+ ioc2.get_executor(), handler{});
+ BEAST_EXPECT(
+ net::get_associated_executor(h1) !=
+ net::get_associated_executor(h2));
+ BEAST_EXPECT(
+ std::addressof(
+ net::get_associated_executor(h1).context()) !=
+ std::addressof(
+ net::get_associated_executor(h2).context()));
+ h1();
+ h2();
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ testJavadoc()
+ {
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ run() override
+ {
+ testBinder();
+ testJavadoc();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,bind_continuation);
+
+} // detail
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/_detail_buffer.cpp b/src/boost/libs/beast/test/beast/core/_detail_buffer.cpp
new file mode 100644
index 000000000..e64464915
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_buffer.cpp
@@ -0,0 +1,83 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+//#include <boost/beast/core/buffer.hpp>
+
+#include <boost/beast/core/detail/buffer.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <string>
+
+#include <boost/asio/error.hpp>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+// VFALCO No idea why boost::system::errc::message_size fails
+// to compile, so we use net::error::eof instead.
+//
+class buffer_test : public beast::unit_test::suite
+{
+public:
+ template<class DynamicBuffer>
+ void
+ testPrepare()
+ {
+ #ifndef BOOST_NO_EXCEPTIONS
+ error_code ec;
+ DynamicBuffer b(32);
+ dynamic_buffer_prepare(b, 20, ec,
+ net::error::eof);
+ BEAST_EXPECTS(! ec, ec.message());
+ b.commit(20);
+ auto const result =
+ dynamic_buffer_prepare(b, 20, ec,
+ net::error::eof);
+ BEAST_EXPECT(result == boost::none);
+ BEAST_EXPECTS(
+ ec == net::error::eof, ec.message());
+ #else
+ fail("exceptions disabled", __FILE__, __LINE__);
+ #endif
+ }
+
+ template<class DynamicBuffer>
+ void
+ testPrepareNoexcept()
+ {
+ error_code ec;
+ DynamicBuffer b(32);
+ dynamic_buffer_prepare_noexcept(b, 20, ec,
+ net::error::eof);
+ BEAST_EXPECTS(! ec, ec.message());
+ b.commit(20);
+ auto const result =
+ detail::dynamic_buffer_prepare_noexcept(b, 20, ec,
+ net::error::eof);
+ BEAST_EXPECT(result == boost::none);
+ BEAST_EXPECTS(
+ ec == net::error::eof, ec.message());
+ }
+
+ void
+ run() override
+ {
+ testPrepare<flat_buffer>();
+ testPrepareNoexcept<flat_buffer>();
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffer);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_clamp.cpp b/src/boost/libs/beast/test/beast/core/_detail_clamp.cpp
new file mode 100644
index 000000000..89e5d57c6
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_clamp.cpp
@@ -0,0 +1,40 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/clamp.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <climits>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class clamp_test : public beast::unit_test::suite
+{
+public:
+ void testClamp()
+ {
+ BEAST_EXPECT(clamp(
+ (std::numeric_limits<std::uint64_t>::max)()) ==
+ (std::numeric_limits<std::size_t>::max)());
+ }
+
+ void run() override
+ {
+ testClamp();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,clamp);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_get_io_context.cpp b/src/boost/libs/beast/test/beast/core/_detail_get_io_context.cpp
new file mode 100644
index 000000000..1ee977fec
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_get_io_context.cpp
@@ -0,0 +1,56 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/beast/core/detail/get_io_context.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/strand.hpp>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class get_io_context_test : public beast::unit_test::suite
+{
+public:
+ void
+ testFunction()
+ {
+ struct none
+ {
+ };
+
+ net::io_context ioc;
+ BEAST_EXPECT(get_io_context(5) == nullptr);
+ BEAST_EXPECT(get_io_context(none{}) == nullptr);
+ BEAST_EXPECT(get_io_context(ioc) == &ioc);
+ BEAST_EXPECT(get_io_context(ioc.get_executor()) == &ioc);
+ BEAST_EXPECT(get_io_context(net::make_strand(ioc)) == &ioc);
+ BEAST_EXPECT(get_io_context(net::executor(ioc.get_executor())) == &ioc);
+#if 0
+ // VFALCO FIXME
+ BEAST_EXPECT(
+ get_io_context(
+ net::strand<net::executor>(
+ net::executor(ioc.get_executor()))) == &ioc);
+#endif
+ }
+
+ void
+ run() override
+ {
+ testFunction();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,get_io_context);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_is_invocable.cpp b/src/boost/libs/beast/test/beast/core/_detail_is_invocable.cpp
new file mode 100644
index 000000000..e412ef189
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_is_invocable.cpp
@@ -0,0 +1,60 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/beast/core/detail/is_invocable.hpp>
+#include <memory>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+namespace {
+
+//
+// is_invocable
+//
+
+struct is_invocable_udt1
+{
+ void operator()(int) const;
+};
+
+struct is_invocable_udt2
+{
+ int operator()(int) const;
+};
+
+struct is_invocable_udt3
+{
+ int operator()(int);
+};
+
+struct is_invocable_udt4
+{
+ void operator()(std::unique_ptr<int>);
+};
+
+#ifndef __INTELLISENSE__
+// VFALCO Fails to compile with Intellisense
+BOOST_STATIC_ASSERT(is_invocable<is_invocable_udt1, void(int)>::value);
+BOOST_STATIC_ASSERT(is_invocable<is_invocable_udt2, int(int)>::value);
+BOOST_STATIC_ASSERT(is_invocable<is_invocable_udt3, int(int)>::value);
+BOOST_STATIC_ASSERT(! is_invocable<is_invocable_udt1, void(void)>::value);
+BOOST_STATIC_ASSERT(! is_invocable<is_invocable_udt2, int(void)>::value);
+BOOST_STATIC_ASSERT(! is_invocable<is_invocable_udt2, void(void)>::value);
+BOOST_STATIC_ASSERT(! is_invocable<is_invocable_udt3 const, int(int)>::value);
+BOOST_STATIC_ASSERT(is_invocable<is_invocable_udt4, void(std::unique_ptr<int>)>::value);
+#endif
+
+} // (anonymous)
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_read.cpp b/src/boost/libs/beast/test/beast/core/_detail_read.cpp
new file mode 100644
index 000000000..dcd8524b5
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_read.cpp
@@ -0,0 +1,111 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/read.hpp>
+
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/completion_condition.hpp>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class read_test : public unit_test::suite
+{
+public:
+#if 0
+ void
+ testRead()
+ {
+ {
+ net::io_context ioc;
+ test::stream ts(ioc);
+ ostream(ts.buffer()) << "test";
+ error_code ec;
+ flat_buffer b;
+ read(ts, b, boost::asio::transfer_at_least(4), ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(buffers_to_string(b.data()) == "test");
+ }
+ {
+ net::io_context ioc;
+ test::stream ts(ioc);
+ auto tc = connect(ts);
+ ostream(ts.buffer()) << "test";
+ tc.close();
+ error_code ec;
+ flat_buffer b;
+ read(ts, b, boost::asio::transfer_all(), ec);
+ BEAST_EXPECTS(ec == boost::asio::error::eof, ec.message());
+ BEAST_EXPECT(buffers_to_string(b.data()) == "test");
+ }
+ }
+
+ void
+ testAsyncRead()
+ {
+ {
+ net::io_context ioc;
+ test::stream ts(ioc);
+ ostream(ts.buffer()) << "test";
+ flat_buffer b;
+ error_code ec;
+ bool invoked = false;
+ async_read(ts, b, boost::asio::transfer_at_least(4),
+ [&invoked, &ec](error_code ec_, std::size_t)
+ {
+ ec = ec_;
+ invoked = true;
+ });
+ ioc.run();
+ BEAST_EXPECT(invoked);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(buffers_to_string(b.data()) == "test");
+ }
+ {
+ net::io_context ioc;
+ test::stream ts(ioc);
+ auto tc = connect(ts);
+ ostream(ts.buffer()) << "test";
+ tc.close();
+ flat_buffer b;
+ error_code ec;
+ bool invoked = false;
+ async_read(ts, b, boost::asio::transfer_all(),
+ [&invoked, &ec](error_code ec_, std::size_t)
+ {
+ ec = ec_;
+ invoked = true;
+ });
+ ioc.run();
+ BEAST_EXPECT(invoked);
+ BEAST_EXPECTS(ec == boost::asio::error::eof, ec.message());
+ BEAST_EXPECT(buffers_to_string(b.data()) == "test");
+ }
+ }
+#endif
+ void
+ run() override
+ {
+ pass();
+ //testRead();
+ //testAsyncRead();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,read);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_sha1.cpp b/src/boost/libs/beast/test/beast/core/_detail_sha1.cpp
new file mode 100644
index 000000000..165ddf714
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_sha1.cpp
@@ -0,0 +1,84 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/beast/core/detail/sha1.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <array>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class sha1_test : public beast::unit_test::suite
+{
+public:
+ static
+ inline
+ std::uint8_t
+ unhex(char c)
+ {
+ if(c >= '0' && c <= '9')
+ return c - '0';
+ if(c >= 'a' && c <= 'f')
+ return c - 'a' + 10;
+ if(c >= 'A' && c <= 'F')
+ return c - 'A' + 10;
+ throw std::invalid_argument("not a hex digit");
+ }
+
+ static
+ std::string
+ unhex(std::string const& in)
+ {
+ std::string out;
+ out.reserve(in.size() / 2);
+ if(in.size() % 2)
+ throw std::domain_error("invalid hex string");
+ for(std::size_t i = 0; i < in.size(); i += 2)
+ out.push_back(
+ (unhex(in[i])<<4) + unhex(in[i+1]));
+ return out;
+ }
+
+ void
+ check(std::string const& message, std::string const& answer)
+ {
+ std::string digest;
+ digest = unhex(answer);
+ sha1_context ctx;
+ std::string result;
+ result.resize(sha1_context::digest_size);
+ init(ctx);
+ update(ctx, message.data(), message.size());
+ finish(ctx, &result[0]);
+ BEAST_EXPECT(result == digest);
+ }
+
+ void
+ run()
+ {
+ // http://www.di-mgt.com.au/sha_testvectors.html
+ //
+ check("abc",
+ "a9993e36" "4706816a" "ba3e2571" "7850c26c" "9cd0d89d");
+ check("",
+ "da39a3ee" "5e6b4b0d" "3255bfef" "95601890" "afd80709");
+ check("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
+ "84983e44" "1c3bd26e" "baae4aa1" "f95129e5" "e54670f1");
+ check("abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu",
+ "a49b2446" "a02c645b" "f419f995" "b6709125" "3a04a259");
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,sha1);
+
+} // test
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_static_const.cpp b/src/boost/libs/beast/test/beast/core/_detail_static_const.cpp
new file mode 100644
index 000000000..9c15f42f0
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_static_const.cpp
@@ -0,0 +1,44 @@
+//
+// Copyright (c) 2016-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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/static_const.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+#include <boost/beast/core/close_socket.hpp>
+
+namespace boost {
+namespace beast {
+
+struct foo_impl
+{
+ void operator()() const noexcept
+ {
+ BEAST_PASS();
+ }
+};
+
+constexpr auto& bar =
+ boost::beast::detail::static_const<detail::close_socket_impl>::value;
+
+class static_const_test : public beast::unit_test::suite
+{
+public:
+ void
+ run() override
+ {
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,static_const);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_tuple.cpp b/src/boost/libs/beast/test/beast/core/_detail_tuple.cpp
new file mode 100644
index 000000000..5620e3434
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_tuple.cpp
@@ -0,0 +1,54 @@
+//
+// Copyright (c) 2016-2019Damian Jarek (damian dot jarek93 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/tuple.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class tuple_test : public beast::unit_test::suite
+{
+public:
+ void
+ run()
+ {
+ struct explicit_constructible
+ {
+ explicit_constructible(std::nullptr_t)
+ : i_(0)
+ {
+ }
+
+ explicit explicit_constructible(int i)
+ : i_(i)
+ {
+ }
+
+ int i_;
+ };
+
+ tuple<explicit_constructible, int> t{nullptr, 42};
+ BEAST_EXPECT(detail::get<1>(t) == 42);
+ BEAST_EXPECT(detail::get<0>(t).i_ == 0);
+
+ t = tuple<explicit_constructible, int>{explicit_constructible(42), 43};
+ BEAST_EXPECT(detail::get<1>(t) == 43);
+ BEAST_EXPECT(detail::get<0>(t).i_ == 42);
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,tuple);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_variant.cpp b/src/boost/libs/beast/test/beast/core/_detail_variant.cpp
new file mode 100644
index 000000000..253f5e32b
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_variant.cpp
@@ -0,0 +1,453 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/variant.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <exception>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class variant_test : public beast::unit_test::suite
+{
+public:
+ template<unsigned char I>
+ struct Q
+ {
+ static
+ unsigned char&
+ count()
+ {
+ static unsigned char n = 0;
+ return n;
+ }
+
+ int value = 0;
+ bool move = false;
+ bool copy = false;
+
+ Q& operator=(Q&& q) = delete;
+ Q& operator=(Q const& q) = delete;
+
+ ~Q()
+ {
+ --count();
+ }
+
+ Q()
+ {
+ ++count();
+ }
+
+ Q(Q&& q)
+ {
+ if(q.value < 0)
+ throw std::exception{};
+ ++count();
+ move = true;
+ }
+
+ Q(Q const& q)
+ {
+ if(q.value < 0)
+ throw std::exception{};
+ ++count();
+ copy = true;
+ }
+
+ explicit Q(int value_)
+ : value(value_)
+ {
+ ++count();
+ }
+ };
+
+ void
+ testVariant()
+ {
+ // Default Constructor
+ // Destructor
+ {
+ variant<int> v;
+ BEAST_EXPECT(v.index() == 0);
+ }
+ // emplace
+ {
+ variant<int> v;
+ BEAST_EXPECT(v.index() == 0);
+ v.emplace<1>(10);
+ BEAST_EXPECT(v.index() == 1);
+ BEAST_EXPECT(v.get<1>() == 10);
+ v.emplace<1>(20);
+ BEAST_EXPECT(v.index() == 1);
+ BEAST_EXPECT(v.get<1>() == 20);
+ }
+ {
+ variant<std::string> v;
+ v.emplace<1>("Hello, world!");
+ BEAST_EXPECT(v.index() == 1);
+ BEAST_EXPECT(v.get<1>() == "Hello, world!");
+ }
+ {
+ variant<Q<1>> v;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ v.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ BEAST_EXPECT(v.get<1>().value == 0);
+ v.emplace<1>(42);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ BEAST_EXPECT(v.get<1>().value == 42);
+ v.reset();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ {
+ variant<Q<1>, Q<2>, Q<3>> v;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v.emplace<3>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 1);
+ v.reset();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ // move
+ {
+ variant<std::string> v1;
+ BEAST_EXPECT(v1.index() == 0);
+ variant<std::string> v2{std::move(v1)};
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(v2.index() == 0);
+ v2.emplace<1>("Hello");
+ BEAST_EXPECT(v2.get<1>() == "Hello");
+ variant<std::string> v3{std::move(v2)};
+ BEAST_EXPECT(v2.index() == 0);
+ BEAST_EXPECT(v3.get<1>() == "Hello");
+ }
+ {
+ variant<Q<1>> v1;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ v1.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ BEAST_EXPECT(! v1.get<1>().move);
+ variant<Q<1>> v2{std::move(v1)};
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ BEAST_EXPECT(v2.get<1>().move);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ {
+ variant<Q<1>, Q<2>, Q<3>> v1;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v1.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ variant<Q<1>, Q<2>, Q<3>> v2{std::move(v1)};
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ BEAST_EXPECT(v2.get<2>().move);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ // copy
+ {
+ variant<std::string> v1;
+ BEAST_EXPECT(v1.index() == 0);
+ variant<std::string> v2{v1};
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(v2.index() == 0);
+ v2.emplace<1>("Hello");
+ BEAST_EXPECT(v2.get<1>() == "Hello");
+ variant<std::string> v3{v2};
+ BEAST_EXPECT(v2.get<1>() == "Hello");
+ BEAST_EXPECT(v3.get<1>() == "Hello");
+ }
+ {
+ variant<Q<1>> v1;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ v1.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ BEAST_EXPECT(! v1.get<1>().copy);
+ variant<Q<1>> v2{v1};
+ BEAST_EXPECT(v1.index() == 1);
+ BEAST_EXPECT(Q<1>::count() == 2);
+ BEAST_EXPECT(v2.get<1>().copy);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ {
+ variant<Q<1>, Q<2>, Q<3>> v1;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v1.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ variant<Q<1>, Q<2>, Q<3>> v2{v1};
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 2);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ BEAST_EXPECT(v2.get<2>().copy);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ // move assign
+ {
+ variant<std::string> v1;
+ BEAST_EXPECT(v1.index() == 0);
+ variant<std::string> v2;
+ v2 = std::move(v1);
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(v2.index() == 0);
+ v2.emplace<1>("Hello");
+ BEAST_EXPECT(v2.get<1>() == "Hello");
+ variant<std::string> v3;
+ v3 = std::move(v2);
+ BEAST_EXPECT(v2.index() == 0);
+ BEAST_EXPECT(v3.get<1>() == "Hello");
+ }
+ {
+ variant<Q<1>, Q<2>> v1;
+ variant<Q<1>, Q<2>> v2;
+ v1.emplace<1>();
+ BEAST_EXPECT(v1.index() == 1);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ v2.emplace<2>();
+ BEAST_EXPECT(v2.index() == 2);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ v2 = std::move(v1);
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(v2.index() == 1);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ {
+ variant<Q<1>> v1;
+ v1.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ variant<Q<1>> v2;
+ v2.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 2);
+ v2 = std::move(v1);
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(v2.index() == 1);
+ BEAST_EXPECT(v2.get<1>().move);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ {
+ variant<Q<1>, Q<2>, Q<3>> v1;
+ v1.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ variant<Q<1>, Q<2>, Q<3>> v2;
+ v2.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 2);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v2 = std::move(v1);
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(v2.index() == 2);
+ BEAST_EXPECT(v2.get<2>().move);
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ // copy assign
+ {
+ variant<std::string> v1;
+ BEAST_EXPECT(v1.index() == 0);
+ variant<std::string> v2;
+ v2 = v1;
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(v2.index() == 0);
+ v2.emplace<1>("Hello");
+ BEAST_EXPECT(v2.get<1>() == "Hello");
+ variant<std::string> v3;
+ v3 = v2;
+ BEAST_EXPECT(v2.get<1>() == "Hello");
+ BEAST_EXPECT(v3.get<1>() == "Hello");
+ }
+ {
+ variant<Q<1>, Q<2>> v1;
+ variant<Q<1>, Q<2>> v2;
+ v1.emplace<1>();
+ BEAST_EXPECT(v1.index() == 1);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ v2.emplace<2>();
+ BEAST_EXPECT(v2.index() == 2);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ v2 = v1;
+ BEAST_EXPECT(v1.index() == 1);
+ BEAST_EXPECT(v2.index() == 1);
+ BEAST_EXPECT(Q<1>::count() == 2);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ }
+ {
+ variant<Q<1>> v1;
+ v1.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ variant<Q<1>> v2;
+ v2.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 2);
+ v2 = v1;
+ BEAST_EXPECT(v1.index() == 1);
+ BEAST_EXPECT(v2.index() == 1);
+ BEAST_EXPECT(v2.get<1>().copy);
+ BEAST_EXPECT(Q<1>::count() == 2);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ {
+ variant<Q<1>, Q<2>, Q<3>> v1;
+ v1.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ variant<Q<1>, Q<2>, Q<3>> v2;
+ v2.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 2);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v2 = v1;
+ BEAST_EXPECT(v1.index() == 2);
+ BEAST_EXPECT(v2.index() == 2);
+ BEAST_EXPECT(v2.get<2>().copy);
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 2);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ // get
+ {
+ variant<std::string> v;
+ v.emplace<1>("Hello");
+ v.get<1>() = "World!";
+ BEAST_EXPECT(v.get<1>() == "World!");
+ }
+ // reset
+ {
+ variant<std::string> v;
+ v.emplace<1>("Hello");
+ v.reset();
+ BEAST_EXPECT(v.index() == 0);
+ }
+ {
+ variant<Q<1>> v;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ v.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ v.reset();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(v.index() == 0);
+ }
+ {
+ variant<Q<1>, Q<2>, Q<3>> v;
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v.emplace<2>();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 1);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ v.reset();
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+ BEAST_EXPECT(v.index() == 0);
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ BEAST_EXPECT(Q<2>::count() == 0);
+ BEAST_EXPECT(Q<3>::count() == 0);
+
+ // basic guarantee
+ {
+ // move
+ variant<Q<1>> v1;
+ v1.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ variant<Q<1>> v2;
+ v2.emplace<1>(-1);
+ BEAST_EXPECT(Q<1>::count() == 2);
+ try
+ {
+ v1 = std::move(v2);
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ }
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ {
+ // copy
+ variant<Q<1>> v1;
+ v1.emplace<1>();
+ BEAST_EXPECT(Q<1>::count() == 1);
+ variant<Q<1>> v2;
+ v2.emplace<1>(-1);
+ BEAST_EXPECT(Q<1>::count() == 2);
+ try
+ {
+ v1 = v2;
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ BEAST_EXPECT(v1.index() == 0);
+ BEAST_EXPECT(Q<1>::count() == 1);
+ }
+ }
+ BEAST_EXPECT(Q<1>::count() == 0);
+ }
+
+ void
+ run()
+ {
+ testVariant();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,variant);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/_detail_varint.cpp b/src/boost/libs/beast/test/beast/core/_detail_varint.cpp
new file mode 100644
index 000000000..a760aea1e
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/_detail_varint.cpp
@@ -0,0 +1,53 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detail/varint.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace detail {
+
+class varint_test : public beast::unit_test::suite
+{
+public:
+ void
+ testVarint()
+ {
+ std::size_t n0 = 0;
+ std::size_t n1 = 1;
+ for(;;)
+ {
+ char buf[16];
+ BOOST_ASSERT(sizeof(buf) >= varint_size(n0));
+ auto it = &buf[0];
+ varint_write(it, n0);
+ it = &buf[0];
+ auto n = varint_read(it);
+ BEAST_EXPECT(n == n0);
+ n = n0 + n1;
+ if(n < n1)
+ break;
+ n0 = n1;
+ n1 = n;
+ }
+ }
+
+ void
+ run()
+ {
+ testVarint();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,varint);
+
+} // detail
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/async_base.cpp b/src/boost/libs/beast/test/beast/core/async_base.cpp
new file mode 100644
index 000000000..303cbc754
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/async_base.cpp
@@ -0,0 +1,762 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/async_base.hpp>
+
+#include "test_handler.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/_experimental/test/handler.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/core/error.hpp>
+#include <boost/asio/async_result.hpp>
+#include <boost/asio/coroutine.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/steady_timer.hpp>
+#include <boost/asio/system_executor.hpp>
+#include <boost/asio/write.hpp>
+#include <boost/core/ignore_unused.hpp>
+#include <stdexcept>
+
+//------------------------------------------------------------------------------
+
+namespace boost {
+namespace beast {
+
+namespace {
+
+struct ex1_type
+{
+ void* context() { return nullptr; }
+ void on_work_started() {}
+ void on_work_finished() {}
+ template<class F> void dispatch(F&&) {}
+ template<class F> void post(F&&) {}
+ template<class F> void defer(F&&) {}
+};
+
+struct no_alloc
+{
+};
+
+struct nested_alloc
+{
+ struct allocator_type
+ {
+ };
+};
+
+struct intrusive_alloc
+{
+ struct allocator_type
+ {
+ };
+};
+
+struct no_ex
+{
+ using executor_type = net::system_executor;
+};
+
+struct nested_ex
+{
+ struct executor_type
+ {
+ };
+};
+
+struct intrusive_ex
+{
+ struct executor_type
+ {
+ };
+};
+
+template<class E, class A>
+struct handler;
+
+template<>
+struct handler<no_ex, no_alloc>
+{
+};
+
+template<>
+struct handler<no_ex, nested_alloc>
+ : nested_alloc
+{
+};
+
+template<>
+struct handler<no_ex, intrusive_alloc>
+{
+};
+
+template<>
+struct handler<nested_ex, no_alloc>
+ : nested_ex
+{
+};
+
+template<>
+struct handler<intrusive_ex, no_alloc>
+{
+};
+
+} // (anon)
+
+} // beast
+} // boost
+
+namespace boost {
+namespace asio {
+
+template<class Allocator>
+struct associated_allocator<
+ boost::beast::handler<
+ boost::beast::no_ex,
+ boost::beast::intrusive_alloc>,
+ Allocator>
+{
+ using type =
+ boost::beast::intrusive_alloc::allocator_type;
+
+ static type get(
+ boost::beast::handler<
+ boost::beast::no_ex,
+ boost::beast::intrusive_alloc> const&,
+ Allocator const& = Allocator()) noexcept
+ {
+ return type{};
+ }
+};
+
+template<class Executor>
+struct associated_executor<
+ boost::beast::handler<
+ boost::beast::intrusive_ex,
+ boost::beast::no_alloc>,
+ Executor>
+{
+ using type =
+ boost::beast::intrusive_ex::executor_type;
+
+ static type get(
+ boost::beast::handler<
+ boost::beast::intrusive_ex,
+ boost::beast::no_alloc> const&,
+ Executor const& = Executor()) noexcept
+ {
+ return type{};
+ }
+};
+
+} // asio
+} // boost
+
+//------------------------------------------------------------------------------
+
+namespace boost {
+namespace beast {
+
+class async_base_test : public beast::unit_test::suite
+{
+public:
+ // no associated allocator
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ std::allocator<void>,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, no_alloc>,
+ net::io_context::executor_type>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ std::allocator<int>,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, no_alloc>,
+ net::io_context::executor_type,
+ std::allocator<int>>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ std::allocator<void>,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, no_alloc>,
+ net::io_context::executor_type>,
+ std::allocator<int> // ignored
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ std::allocator<int>,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, no_alloc>,
+ net::io_context::executor_type,
+ std::allocator<int>>,
+ std::allocator<double> // ignored
+ >>::value);
+
+ // nested associated allocator
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ nested_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, nested_alloc>,
+ net::io_context::executor_type>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ nested_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, nested_alloc>,
+ net::io_context::executor_type,
+ std::allocator<int>> // ignored
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ nested_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, nested_alloc>,
+ net::io_context::executor_type>,
+ std::allocator<int> // ignored
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ nested_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, nested_alloc>,
+ net::io_context::executor_type,
+ std::allocator<int>>, // ignored
+ std::allocator<int> // ignored
+ >>::value);
+
+ // intrusive associated allocator
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ intrusive_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, intrusive_alloc>,
+ net::io_context::executor_type>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ intrusive_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, intrusive_alloc>,
+ net::io_context::executor_type,
+ std::allocator<int>> // ignored
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ intrusive_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, intrusive_alloc>,
+ net::io_context::executor_type>,
+ std::allocator<int> // ignored
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ intrusive_alloc::allocator_type,
+ net::associated_allocator_t<
+ async_base<
+ handler<no_ex, intrusive_alloc>,
+ net::io_context::executor_type,
+ std::allocator<int>>, // ignored
+ std::allocator<int> // ignored
+ >>::value);
+
+ // no associated executor
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ ex1_type,
+ net::associated_executor_t<
+ async_base<
+ handler<no_ex, no_alloc>,
+ ex1_type>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ ex1_type,
+ net::associated_executor_t<
+ async_base<
+ handler<no_ex, no_alloc>,
+ ex1_type>,
+ net::system_executor // ignored
+ >>::value);
+
+ // nested associated executor
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ nested_ex::executor_type,
+ net::associated_executor_t<
+ async_base<
+ handler<nested_ex, no_alloc>,
+ ex1_type>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ nested_ex::executor_type,
+ net::associated_executor_t<
+ async_base<
+ handler<nested_ex, no_alloc>,
+ ex1_type>,
+ net::system_executor // ignored
+ >>::value);
+
+ // intrusive associated executor
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ intrusive_ex::executor_type,
+ net::associated_executor_t<
+ async_base<
+ handler<intrusive_ex, no_alloc>,
+ ex1_type>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<
+ intrusive_ex::executor_type,
+ net::associated_executor_t<
+ async_base<
+ handler<intrusive_ex, no_alloc>,
+ ex1_type>,
+ net::system_executor // ignored
+ >>::value);
+
+ struct final_handler
+ {
+ bool& invoked;
+
+ void
+ operator()()
+ {
+ invoked = true;
+ }
+ };
+
+ void
+ testBase()
+ {
+ // get_allocator
+ {
+ simple_allocator alloc;
+ simple_allocator alloc2;
+ async_base<
+ move_only_handler,
+ simple_executor,
+ simple_allocator> op(
+ move_only_handler{}, {}, alloc);
+ BEAST_EXPECT(op.get_allocator() == alloc);
+ BEAST_EXPECT(op.get_allocator() != alloc2);
+ }
+
+ // get_executor
+ {
+ simple_executor ex;
+ simple_executor ex2;
+ async_base<
+ move_only_handler,
+ simple_executor> op(
+ move_only_handler{}, ex);
+ BEAST_EXPECT(op.get_executor() == ex);
+ BEAST_EXPECT(op.get_executor() != ex2);
+ }
+
+ // move construction
+ {
+ async_base<
+ move_only_handler,
+ simple_executor> op(
+ move_only_handler{}, {});
+ auto op2 = std::move(op);
+ }
+
+ // observers
+ {
+ bool b = false;
+ async_base<
+ legacy_handler,
+ simple_executor> op(
+ legacy_handler{b}, {});
+ BEAST_EXPECT(! op.handler().hook_invoked);
+ b = true;
+ BEAST_EXPECT(op.handler().hook_invoked);
+ b = false;
+ BEAST_EXPECT(! op.release_handler().hook_invoked);
+ }
+
+ // invocation
+ {
+ net::io_context ioc;
+ async_base<
+ test::handler,
+ net::io_context::executor_type> op(
+ test::any_handler(), ioc.get_executor());
+ op.complete(true);
+ }
+ {
+ net::io_context ioc;
+ async_base<
+ test::handler,
+ net::io_context::executor_type> op(
+ test::any_handler(), ioc.get_executor());
+ op.complete(false);
+ ioc.run();
+ }
+ {
+ async_base<
+ test::handler,
+ simple_executor> op(
+ test::any_handler(), {});
+ op.complete_now();
+ }
+
+ // legacy hooks
+ legacy_handler::test(
+ [](legacy_handler h)
+ {
+ return async_base<
+ legacy_handler,
+ simple_executor>(
+ std::move(h), {});
+ });
+ }
+
+ void
+ testStableBase()
+ {
+ // get_allocator
+ {
+ simple_allocator alloc;
+ simple_allocator alloc2;
+ stable_async_base<
+ move_only_handler,
+ simple_executor,
+ simple_allocator> op(
+ move_only_handler{}, {}, alloc);
+ BEAST_EXPECT(op.get_allocator() == alloc);
+ BEAST_EXPECT(op.get_allocator() != alloc2);
+ }
+
+ // get_executor
+ {
+ simple_executor ex;
+ simple_executor ex2;
+ stable_async_base<
+ move_only_handler,
+ simple_executor> op(
+ move_only_handler{}, ex);
+ BEAST_EXPECT(op.get_executor() == ex);
+ BEAST_EXPECT(op.get_executor() != ex2);
+ }
+
+ // move construction
+ {
+ stable_async_base<
+ move_only_handler,
+ simple_executor> op(
+ move_only_handler{}, {});
+ auto op2 = std::move(op);
+ }
+
+ // invocation
+ {
+ net::io_context ioc;
+ stable_async_base<
+ test::handler,
+ net::io_context::executor_type> op(
+ test::any_handler(), ioc.get_executor());
+ op.complete(true);
+ }
+ {
+ net::io_context ioc1;
+ net::io_context ioc2;
+ auto h = net::bind_executor(ioc2, test::any_handler());
+ stable_async_base<
+ decltype(h),
+ net::io_context::executor_type> op(
+ std::move(h),
+ ioc1.get_executor());
+ op.complete(false);
+ BEAST_EXPECT(ioc1.run() == 0);
+ BEAST_EXPECT(ioc2.run() == 1);
+ }
+ {
+ stable_async_base<
+ test::handler,
+ simple_executor> op(
+ test::any_handler(), {});
+ op.complete_now();
+ }
+
+ // legacy hooks
+ legacy_handler::test(
+ [](legacy_handler h)
+ {
+ return stable_async_base<
+ legacy_handler,
+ simple_executor>(
+ std::move(h), {});
+ });
+
+ // allocate_stable
+
+ {
+ bool destroyed = false;
+ {
+ struct data
+ {
+ bool& destroyed;
+
+ ~data()
+ {
+ destroyed = true;
+ }
+ };
+ stable_async_base<
+ move_only_handler,
+ simple_executor> op(
+ move_only_handler{}, {});
+ BEAST_EXPECT(! destroyed);
+ auto& d = allocate_stable<data>(op, destroyed);
+ BEAST_EXPECT(! d.destroyed);
+ }
+ BEAST_EXPECT(destroyed);
+ }
+ {
+ struct throwing_data
+ {
+ throwing_data()
+ {
+ BOOST_THROW_EXCEPTION(
+ std::exception{});
+ }
+ };
+ stable_async_base<
+ move_only_handler,
+ simple_executor> op(
+ move_only_handler{}, {});
+ try
+ {
+ allocate_stable<throwing_data>(op);
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ // Asynchronously read into a buffer until the buffer is full, or an error occurs
+ template<class AsyncReadStream, class ReadHandler>
+ typename net::async_result<ReadHandler, void(error_code, std::size_t)>::return_type
+ async_read(AsyncReadStream& stream, net::mutable_buffer buffer, ReadHandler&& handler)
+ {
+ using handler_type = BOOST_ASIO_HANDLER_TYPE(ReadHandler, void(error_code, std::size_t));
+ using base_type = async_base<handler_type, typename AsyncReadStream::executor_type>;
+
+ struct op : base_type
+ {
+ AsyncReadStream& stream_;
+ net::mutable_buffer buffer_;
+ std::size_t total_bytes_transferred_;
+
+ op(
+ AsyncReadStream& stream,
+ net::mutable_buffer buffer,
+ handler_type& handler)
+ : base_type(std::move(handler), stream.get_executor())
+ , stream_(stream)
+ , buffer_(buffer)
+ , total_bytes_transferred_(0)
+ {
+ (*this)({}, 0, false); // start the operation
+ }
+
+ void operator()(error_code ec, std::size_t bytes_transferred, bool is_continuation = true)
+ {
+ // Adjust the count of bytes and advance our buffer
+ total_bytes_transferred_ += bytes_transferred;
+ buffer_ = buffer_ + bytes_transferred;
+
+ // Keep reading until buffer is full or an error occurs
+ if(! ec && buffer_.size() > 0)
+ return stream_.async_read_some(buffer_, std::move(*this));
+
+ // Call the completion handler with the result. If `is_continuation` is
+ // false, which happens on the first time through this function, then
+ // `net::post` will be used to call the completion handler, otherwise
+ // the completion handler will be invoked directly.
+
+ this->complete(is_continuation, ec, total_bytes_transferred_);
+ }
+ };
+
+ net::async_completion<ReadHandler, void(error_code, std::size_t)> init{handler};
+ op(stream, buffer, init.completion_handler);
+ return init.result.get();
+ }
+
+ // Asynchronously send a message multiple times, once per second
+ template <class AsyncWriteStream, class T, class WriteHandler>
+ auto async_write_messages(
+ AsyncWriteStream& stream,
+ T const& message,
+ std::size_t repeat_count,
+ WriteHandler&& handler) ->
+ typename net::async_result<
+ typename std::decay<WriteHandler>::type,
+ void(error_code)>::return_type
+ {
+ using handler_type = typename net::async_completion<WriteHandler, void(error_code)>::completion_handler_type;
+ using base_type = stable_async_base<handler_type, typename AsyncWriteStream::executor_type>;
+
+ struct op : base_type, boost::asio::coroutine
+ {
+ // This object must have a stable address
+ struct temporary_data
+ {
+ // Although std::string is in theory movable, most implementations
+ // use a "small buffer optimization" which means that we might
+ // be submitting a buffer to the write operation and then
+ // moving the string, invalidating the buffer. To prevent
+ // undefined behavior we store the string object itself at
+ // a stable location.
+ std::string const message;
+
+ net::steady_timer timer;
+
+ temporary_data(std::string message_, net::io_context& ctx)
+ : message(std::move(message_))
+ , timer(ctx)
+ {
+ }
+ };
+
+ AsyncWriteStream& stream_;
+ std::size_t repeats_;
+ temporary_data& data_;
+
+ op(AsyncWriteStream& stream, std::size_t repeats, std::string message, handler_type& handler)
+ : base_type(std::move(handler), stream.get_executor())
+ , stream_(stream)
+ , repeats_(repeats)
+ , data_(allocate_stable<temporary_data>(*this, std::move(message), stream.get_executor().context()))
+ {
+ (*this)(); // start the operation
+ }
+
+ // Including this file provides the keywords for macro-based coroutines
+ #include <boost/asio/yield.hpp>
+
+ void operator()(error_code ec = {}, std::size_t = 0)
+ {
+ reenter(*this)
+ {
+ // If repeats starts at 0 then we must complete immediately. But
+ // we can't call the final handler from inside the initiating
+ // function, so we post our intermediate handler first. We use
+ // net::async_write with an empty buffer instead of calling
+ // net::post to avoid an extra function template instantiation, to
+ // keep compile times lower and make the resulting executable smaller.
+ yield net::async_write(stream_, net::const_buffer{}, std::move(*this));
+ while(! ec && repeats_-- > 0)
+ {
+ // Send the string. We construct a `const_buffer` here to guarantee
+ // that we do not create an additional function template instantation
+ // of net::async_write, since we already instantiated it above for
+ // net::const_buffer.
+
+ yield net::async_write(stream_,
+ net::const_buffer(net::buffer(data_.message)), std::move(*this));
+ if(ec)
+ break;
+
+ // Set the timer and wait
+ data_.timer.expires_after(std::chrono::seconds(1));
+ yield data_.timer.async_wait(std::move(*this));
+ }
+ }
+
+ // The base class destroys the temporary data automatically,
+ // before invoking the final completion handler
+ this->complete_now(ec);
+ }
+
+ // Including this file undefines the macros for the coroutines
+ #include <boost/asio/unyield.hpp>
+ };
+
+ net::async_completion<WriteHandler, void(error_code)> completion(handler);
+ std::ostringstream os;
+ os << message;
+ op(stream, repeat_count, os.str(), completion.completion_handler);
+ return completion.result.get();
+ }
+
+ void
+ testJavadocs()
+ {
+ struct handler
+ {
+ void operator()(error_code = {}, std::size_t = 0)
+ {
+ }
+ };
+
+ BEAST_EXPECT((&async_base_test::async_read<test::stream, handler>));
+ BEAST_EXPECT((&async_base_test::async_write_messages<test::stream, std::string, handler>));
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ run() override
+ {
+ testBase();
+ testStableBase();
+ testJavadocs();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,async_base);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/basic_stream.cpp b/src/boost/libs/beast/test/beast/core/basic_stream.cpp
new file mode 100644
index 000000000..4b64c79ba
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/basic_stream.cpp
@@ -0,0 +1,1316 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/basic_stream.hpp>
+
+#include "stream_tests.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/stream_traits.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/core/tcp_stream.hpp>
+#include <boost/beast/http/message.hpp>
+#include <boost/beast/http/empty_body.hpp>
+#include <boost/beast/http/read.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/http/write.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/spawn.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/write.hpp>
+#include <boost/optional.hpp>
+#include <array>
+#include <thread>
+
+namespace boost {
+namespace beast {
+
+#if 0
+template class basic_stream<
+ net::ip::tcp,
+ net::executor,
+ unlimited_rate_policy>;
+
+template class basic_stream<
+ net::ip::tcp,
+ net::executor,
+ simple_rate_policy>;
+#endif
+
+namespace {
+
+template<class Executor = net::io_context::executor_type>
+class test_executor
+{
+public:
+ // VFALCO These need to be atomic or something
+ struct info
+ {
+ int dispatch = 0;
+ int post = 0;
+ int defer = 0;
+ int work = 0;
+ int total = 0;
+ };
+
+private:
+ struct state
+ {
+ Executor ex;
+ info info_;
+
+ state(Executor const& ex_)
+ : ex(ex_)
+ {
+ }
+ };
+
+ std::shared_ptr<state> sp_;
+
+public:
+ test_executor(test_executor const&) = default;
+ test_executor& operator=(test_executor const&) = default;
+
+ explicit
+ test_executor(Executor const& ex)
+ : sp_(std::make_shared<state>(ex))
+ {
+ }
+
+ decltype(sp_->ex.context())
+ context() const noexcept
+ {
+ return sp_->ex.context();
+ }
+
+ info&
+ operator*() noexcept
+ {
+ return sp_->info_;
+ }
+
+ info*
+ operator->() noexcept
+ {
+ return &sp_->info_;
+ }
+
+ void
+ on_work_started() const noexcept
+ {
+ ++sp_->info_.work;
+ }
+
+ void
+ on_work_finished() const noexcept
+ {
+ }
+
+ template<class F, class A>
+ void
+ dispatch(F&& f, A const& a)
+ {
+ ++sp_->info_.dispatch;
+ ++sp_->info_.total;
+ sp_->ex.dispatch(
+ std::forward<F>(f), a);
+ }
+
+ template<class F, class A>
+ void
+ post(F&& f, A const& a)
+ {
+ ++sp_->info_.post;
+ ++sp_->info_.total;
+ sp_->ex.post(
+ std::forward<F>(f), a);
+ }
+
+ template<class F, class A>
+ void
+ defer(F&& f, A const& a)
+ {
+ ++sp_->info_.defer;
+ ++sp_->info_.total;
+ sp_->ex.defer(
+ std::forward<F>(f), a);
+ }
+};
+
+struct test_acceptor
+{
+ net::io_context ioc;
+ net::ip::tcp::acceptor a;
+ net::ip::tcp::endpoint ep;
+
+ test_acceptor()
+ : a(ioc)
+ , ep(net::ip::make_address_v4("127.0.0.1"), 0)
+ {
+ a.open(ep.protocol());
+ a.set_option(
+ net::socket_base::reuse_address(true));
+ a.bind(ep);
+ a.listen(net::socket_base::max_listen_connections);
+ ep = a.local_endpoint();
+ a.async_accept(
+ [](error_code, net::ip::tcp::socket)
+ {
+ });
+ }
+};
+
+class test_server
+{
+ string_view s_;
+ std::ostream& log_;
+ net::io_context ioc_;
+ net::ip::tcp::acceptor acceptor_;
+ net::ip::tcp::socket socket_;
+ std::thread t_;
+
+ void
+ fail(error_code const& ec, string_view what)
+ {
+ if(ec != net::error::operation_aborted)
+ log_ << what << ": " << ec.message() << "\n";
+ }
+
+public:
+ test_server(
+ string_view s,
+ net::ip::tcp::endpoint ep,
+ std::ostream& log)
+ : s_(s)
+ , log_(log)
+ , ioc_(1)
+ , acceptor_(ioc_)
+ , socket_(ioc_)
+ {
+ boost::system::error_code ec;
+
+ acceptor_.open(ep.protocol(), ec);
+ if(ec)
+ {
+ fail(ec, "open");
+ return;
+ }
+
+ acceptor_.set_option(
+ net::socket_base::reuse_address(true), ec);
+ if(ec)
+ {
+ fail(ec, "set_option");
+ return;
+ }
+
+ acceptor_.bind(ep, ec);
+ if(ec)
+ {
+ fail(ec, "bind");
+ return;
+ }
+
+ acceptor_.listen(
+ net::socket_base::max_listen_connections, ec);
+ if(ec)
+ {
+ fail(ec, "listen");
+ return;
+ }
+
+ acceptor_.async_accept(socket_,
+ [this](error_code ec)
+ {
+ this->on_accept(ec);
+ });
+
+ t_ = std::thread(
+ [this]
+ {
+ ioc_.run();
+ });
+ }
+
+ ~test_server()
+ {
+ ioc_.stop();
+ t_.join();
+ }
+
+ net::ip::tcp::endpoint
+ local_endpoint() const noexcept
+ {
+ return acceptor_.local_endpoint();
+ }
+
+private:
+ class session
+ : public std::enable_shared_from_this<session>
+ {
+ string_view s_;
+ net::ip::tcp::socket socket_;
+
+ public:
+ session(
+ string_view s,
+ net::ip::tcp::socket sock,
+ std::ostream&)
+ : s_(s)
+ , socket_(std::move(sock))
+ {
+ }
+
+ void
+ run()
+ {
+ if(s_.empty())
+ socket_.async_wait(
+ net::socket_base::wait_read,
+ bind_front_handler(
+ &session::on_read,
+ shared_from_this()));
+ else
+ net::async_write(
+ socket_,
+ net::const_buffer(s_.data(), s_.size()),
+ bind_front_handler(
+ &session::on_write,
+ shared_from_this()));
+ }
+
+ protected:
+ void
+ on_read(error_code const&)
+ {
+ }
+
+ void
+ on_write(error_code const&, std::size_t)
+ {
+ }
+ };
+
+ void
+ on_accept(error_code const& ec)
+ {
+ if(! acceptor_.is_open())
+ return;
+ if(ec)
+ fail(ec, "accept");
+ else
+ std::make_shared<session>(
+ s_, std::move(socket_), log_)->run();
+ acceptor_.async_accept(socket_,
+ [this](error_code ec)
+ {
+ this->on_accept(ec);
+ });
+ }
+};
+
+} // (anon)
+
+class basic_stream_test
+ : public beast::unit_test::suite
+{
+public:
+ using tcp = net::ip::tcp;
+ using strand = net::io_context::strand;
+ using executor = net::io_context::executor_type;
+
+ //--------------------------------------------------------------------------
+
+ void
+ testSpecialMembers()
+ {
+ net::io_context ioc;
+
+ // net::io_context::executor_type
+
+ {
+ auto ex = ioc.get_executor();
+ basic_stream<tcp, executor> s1(ioc);
+ basic_stream<tcp, executor> s2(ex);
+ basic_stream<tcp, executor> s3(ioc, tcp::v4());
+ basic_stream<tcp, executor> s4(std::move(s1));
+ s2.socket() =
+ net::basic_stream_socket<tcp, executor>(ioc);
+ BEAST_EXPECT(s1.get_executor() == ex);
+ BEAST_EXPECT(s2.get_executor() == ex);
+ BEAST_EXPECT(s3.get_executor() == ex);
+ BEAST_EXPECT(s4.get_executor() == ex);
+
+ BEAST_EXPECT((! static_cast<
+ basic_stream<tcp, executor> const&>(
+ s2).socket().is_open()));
+
+ test_sync_stream<
+ basic_stream<
+ tcp, net::io_context::executor_type>>();
+
+ test_async_stream<
+ basic_stream<
+ tcp, net::io_context::executor_type>>();
+ }
+
+ // net::io_context::strand
+
+ {
+ auto ex = strand{ioc};
+ basic_stream<tcp, strand> s1(ex);
+ basic_stream<tcp, strand> s2(ex, tcp::v4());
+ basic_stream<tcp, strand> s3(std::move(s1));
+ #if 0
+ s2.socket() = net::basic_stream_socket<
+ tcp, strand>(ioc);
+ #endif
+ BEAST_EXPECT(s1.get_executor() == ex);
+ BEAST_EXPECT(s2.get_executor() == ex);
+ BEAST_EXPECT(s3.get_executor() == ex);
+
+#if 0
+ BEAST_EXPECT((! static_cast<
+ basic_stream<tcp, strand> const&>(
+ s2).socket().is_open()));
+#endif
+
+ test_sync_stream<
+ basic_stream<
+ tcp, net::io_context::strand>>();
+
+ test_async_stream<
+ basic_stream<
+ tcp, net::io_context::strand>>();
+ }
+
+ // construction from existing socket
+
+#if 0
+ {
+ tcp::socket sock(ioc);
+ basic_stream<tcp, executor> stream(std::move(sock));
+ }
+
+ {
+ tcp::socket sock(ioc);
+ basic_stream<tcp, strand> stream(std::move(sock));
+ }
+#endif
+
+ // layers
+
+ {
+ net::socket_base::keep_alive opt;
+ tcp_stream s(ioc);
+ s.socket().open(tcp::v4());
+ s.socket().get_option(opt);
+ BEAST_EXPECT(! opt.value());
+ opt = true;
+ s.socket().set_option(opt);
+ opt = false;
+ BEAST_EXPECT(! opt.value());
+ }
+
+ // rate policies
+
+ {
+ basic_stream<tcp,
+ net::io_context::executor_type,
+ simple_rate_policy> s(ioc);
+ }
+
+ {
+ basic_stream<tcp,
+ net::io_context::executor_type,
+ simple_rate_policy> s(
+ simple_rate_policy{}, ioc);
+ }
+
+ {
+ basic_stream<tcp,
+ net::io_context::executor_type,
+ unlimited_rate_policy> s(ioc);
+ }
+
+ {
+ basic_stream<tcp,
+ net::io_context::executor_type,
+ unlimited_rate_policy> s(
+ unlimited_rate_policy{}, ioc);
+ }
+ }
+
+ class handler
+ {
+ boost::optional<error_code> ec_;
+ std::size_t n_;
+
+ public:
+ handler(error_code ec, std::size_t n)
+ : ec_(ec)
+ , n_(n)
+ {
+ }
+
+ handler(handler&& other)
+ : ec_(other.ec_)
+ , n_(boost::exchange(other.n_,
+ (std::numeric_limits<std::size_t>::max)()))
+ {
+ }
+
+ ~handler()
+ {
+ BEAST_EXPECT(
+ n_ == (std::numeric_limits<std::size_t>::max)());
+ }
+
+ void
+ operator()(error_code const& ec, std::size_t n)
+ {
+ BEAST_EXPECTS(ec == ec_, ec.message());
+ BEAST_EXPECT(n == n_);
+ n_ = (std::numeric_limits<std::size_t>::max)();
+ }
+ };
+
+ void
+ testRead()
+ {
+ using stream_type = basic_stream<tcp,
+ net::io_context::executor_type>;
+
+ char buf[4];
+ net::io_context ioc;
+ std::memset(buf, 0, sizeof(buf));
+ net::mutable_buffer mb(buf, sizeof(buf));
+ auto const ep = net::ip::tcp::endpoint(
+ net::ip::make_address("127.0.0.1"), 0);
+
+ // read_some
+
+ {
+ error_code ec;
+ stream_type s(ioc, tcp::v4());
+ BEAST_EXPECT(s.read_some(net::mutable_buffer{}) == 0);
+ BEAST_EXPECT(s.read_some(net::mutable_buffer{}, ec) == 0);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ // async_read_some
+
+ {
+ // success
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_never();
+ s.async_read_some(mb, handler({}, 1));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // success, with timeout
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_after(std::chrono::seconds(30));
+ s.async_read_some(mb, handler({}, 1));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // empty buffer
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_never();
+ s.async_read_some(
+ net::mutable_buffer{}, handler({}, 0));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // empty buffer, timeout
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_after(std::chrono::seconds(0));
+ s.async_read_some(net::mutable_buffer{},
+ handler(error::timeout, 0));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // expires_after
+ test_server srv("", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_after(std::chrono::seconds(0));
+ s.async_read_some(mb, handler(error::timeout, 0));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // expires_at
+ test_server srv("", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_at(std::chrono::steady_clock::now());
+ s.async_read_some(mb, handler(error::timeout, 0));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // stream destroyed
+ test_server srv("", ep, log);
+ {
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_after(std::chrono::seconds(0));
+ s.async_read_some(mb,
+ [](error_code, std::size_t)
+ {
+ });
+ }
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // stale timer
+ test_acceptor a;
+ stream_type s(ioc);
+ s.expires_after(std::chrono::milliseconds(50));
+ s.async_read_some(mb,
+ [](error_code, std::size_t)
+ {
+ });
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(100));
+ ioc.run();
+ ioc.restart();
+ }
+
+ // abandoned operation
+ {
+ stream_type s(ioc);
+ s.async_read_some(net::mutable_buffer{},
+ [](error_code, std::size_t)
+ {
+ BEAST_FAIL();
+ });
+ }
+ }
+
+ void
+ testWrite()
+ {
+ using stream_type = basic_stream<tcp,
+ net::io_context::executor_type>;
+
+ char buf[4];
+ net::io_context ioc;
+ std::memset(buf, 0, sizeof(buf));
+ net::const_buffer cb(buf, sizeof(buf));
+ auto const ep = net::ip::tcp::endpoint(
+ net::ip::make_address("127.0.0.1"), 0);
+
+ // write_some
+
+ {
+ error_code ec;
+ stream_type s(ioc, tcp::v4());
+ BEAST_EXPECT(s.write_some(net::const_buffer{}) == 0);
+ BEAST_EXPECT(s.write_some(net::const_buffer{}, ec) == 0);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ // async_write_some
+
+ {
+ // success
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_never();
+ s.async_write_some(cb, handler({}, 4));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // success, with timeout
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_after(std::chrono::seconds(30));
+ s.async_write_some(cb, handler({}, 4));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // empty buffer
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_never();
+ s.async_write_some(
+ net::const_buffer{}, handler({}, 0));
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // empty buffer, timeout
+ test_server srv("*", ep, log);
+ stream_type s(ioc);
+ s.socket().connect(srv.local_endpoint());
+ s.expires_after(std::chrono::seconds(0));
+ s.async_write_some(net::const_buffer{},
+ handler(error::timeout, 0));
+ ioc.run();
+ ioc.restart();
+ }
+
+ // abandoned operation
+ {
+ stream_type s(ioc);
+ s.async_write_some(cb,
+ [](error_code, std::size_t)
+ {
+ BEAST_FAIL();
+ });
+ }
+ }
+
+ void
+ testConnect()
+ {
+ using stream_type = basic_stream<tcp,
+ net::io_context::executor_type>;
+
+ struct range
+ {
+ tcp::endpoint ep;
+
+ using iterator =
+ tcp::endpoint const*;
+
+ // VFALCO This is here because asio mistakenly requires it
+ using const_iterator =
+ tcp::endpoint const*;
+
+ iterator begin() const noexcept
+ {
+ return &ep;
+ }
+
+ // VFALCO need to use const_iterator to silence
+ // warning about unused types
+ const_iterator end() const noexcept
+ {
+ return begin() + 1;
+ }
+ };
+
+ class connect_handler
+ {
+ bool pass_ = false;
+ boost::optional<error_code> expected_ = {};
+
+ public:
+ ~connect_handler()
+ {
+ BEAST_EXPECT(pass_);
+ }
+
+ connect_handler()
+ : expected_(error_code{})
+ {
+ }
+
+ explicit
+ connect_handler(error_code expected)
+ : expected_(expected)
+ {
+ }
+
+ explicit
+ connect_handler(boost::none_t)
+ {
+ }
+
+ connect_handler(connect_handler&& other)
+ : pass_(boost::exchange(other.pass_, true))
+ , expected_(other.expected_)
+ {
+ }
+
+ void operator()(error_code ec)
+ {
+ pass_ = true;
+ if(expected_)
+ BEAST_EXPECTS(
+ ec == expected_, ec.message());
+ }
+ };
+
+ struct range_handler
+ {
+ bool pass = false;
+
+ range_handler() = default;
+
+ range_handler(range_handler&& other)
+ : pass(boost::exchange(other.pass, true))
+ {
+ }
+
+ ~range_handler()
+ {
+ BEAST_EXPECT(pass);
+ }
+
+ void operator()(error_code ec, tcp::endpoint)
+ {
+ pass = true;
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+ };
+
+ struct iterator_handler
+ {
+ bool pass = false;
+
+ iterator_handler() = default;
+
+ iterator_handler(iterator_handler&& other)
+ : pass(boost::exchange(other.pass, true))
+ {
+ }
+
+ ~iterator_handler()
+ {
+ BEAST_EXPECT(pass);
+ }
+
+ void operator()(error_code ec, tcp::endpoint const*)
+ {
+ pass = true;
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+ };
+
+ struct connect_condition
+ {
+ bool operator()(error_code, tcp::endpoint) const
+ {
+ return true;
+ };
+ };
+
+ range r;
+ net::io_context ioc;
+ connect_condition cond;
+
+ // connect (member)
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ error_code ec;
+ s.connect(a.ep);
+ s.socket().close();
+ s.connect(a.ep, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ // connect
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ error_code ec;
+ r.ep = a.ep;
+ s.connect(r);
+ s.socket().close();
+ s.connect(r, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ error_code ec;
+ r.ep = a.ep;
+ s.connect(r, cond);
+ s.socket().close();
+ s.connect(r, cond, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ error_code ec;
+ r.ep = a.ep;
+ s.connect(r.begin(), r.end());
+ s.socket().close();
+ s.connect(r.begin(), r.end(), ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ error_code ec;
+ r.ep = a.ep;
+ s.connect(r.begin(), r.end(), cond);
+ s.socket().close();
+ s.connect(r.begin(), r.end(), cond, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ // async_connect (member)
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ s.expires_never();
+ s.async_connect(a.ep, connect_handler{});
+ ioc.run();
+ ioc.restart();
+ s.socket().close();
+ s.expires_after(std::chrono::seconds(30));
+ s.async_connect(a.ep, connect_handler{});
+ ioc.run();
+ ioc.restart();
+ }
+
+ // async_connect
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ r.ep = a.ep;
+ s.expires_never();
+ s.async_connect(r, range_handler{});
+ ioc.run();
+ ioc.restart();
+ s.socket().close();
+ s.expires_after(std::chrono::seconds(30));
+ s.async_connect(r, range_handler{});
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ r.ep = a.ep;
+ s.expires_never();
+ s.async_connect(r, cond, range_handler{});
+ ioc.run();
+ ioc.restart();
+ s.socket().close();
+ s.expires_after(std::chrono::seconds(30));
+ s.async_connect(r, cond, range_handler{});
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ r.ep = a.ep;
+ s.expires_never();
+ s.async_connect(r.begin(), r.end(),
+ iterator_handler{});
+ ioc.run();
+ ioc.restart();
+ s.socket().close();
+ s.expires_after(std::chrono::seconds(30));
+ s.async_connect(r.begin(), r.end(),
+ iterator_handler{});
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ test_acceptor a;
+ stream_type s(ioc);
+ r.ep = a.ep;
+ s.expires_never();
+ s.async_connect(r.begin(), r.end(), cond,
+ iterator_handler{});
+ ioc.run();
+ ioc.restart();
+ s.socket().close();
+ s.expires_after(std::chrono::seconds(30));
+ s.async_connect(r.begin(), r.end(), cond,
+ iterator_handler{});
+ ioc.run();
+ ioc.restart();
+ }
+#if 0
+ // use_future
+
+ BEAST_EXPECT(static_cast<std::future<
+ tcp::endpoint>(*)(stream_type&,
+ std::array<tcp::endpoint, 2> const&,
+ net::use_future_t<>&&)>(
+ &beast::async_connect));
+
+ BEAST_EXPECT(static_cast<std::future<
+ tcp::endpoint>(*)(stream_type&,
+ std::array<tcp::endpoint, 2> const&,
+ connect_condition const&,
+ net::use_future_t<>&&)>(
+ &beast::async_connect));
+
+ BEAST_EXPECT(static_cast<std::future<
+ tcp::endpoint const*>(*)(stream_type&,
+ tcp::endpoint const*,
+ tcp::endpoint const*,
+ net::use_future_t<>&&)>(
+ &beast::async_connect));
+
+ BEAST_EXPECT(static_cast<std::future<
+ tcp::endpoint const*>(*)(stream_type&,
+ tcp::endpoint const*,
+ tcp::endpoint const*,
+ connect_condition const&,
+ net::use_future_t<>&&)>(
+ &beast::async_connect));
+
+ // yield_context
+
+ BEAST_EXPECT(static_cast<
+ tcp::endpoint(*)(stream_type&,
+ std::array<tcp::endpoint, 2> const&,
+ net::yield_context&&)>(
+ &beast::async_connect));
+
+ BEAST_EXPECT(static_cast<
+ tcp::endpoint(*)(stream_type&,
+ std::array<tcp::endpoint, 2> const&,
+ connect_condition const&,
+ net::yield_context&&)>(
+ &beast::async_connect));
+
+ BEAST_EXPECT(static_cast<
+ tcp::endpoint const*(*)(stream_type&,
+ tcp::endpoint const*,
+ tcp::endpoint const*,
+ net::yield_context&&)>(
+ &beast::async_connect));
+
+ BEAST_EXPECT(static_cast<
+ tcp::endpoint const*(*)(stream_type&,
+ tcp::endpoint const*,
+ tcp::endpoint const*,
+ connect_condition const&,
+ net::yield_context&&)>(
+ &beast::async_connect));
+#endif
+
+ //
+ // async_connect timeout
+ //
+
+ {
+ // normal timeout
+ // Requires timeout happen before ECONNREFUSED
+ stream_type s(ioc);
+ auto const ep = net::ip::tcp::endpoint(
+ #if 1
+ // This address _should_ be unconnectible
+ net::ip::make_address("72.5.65.111"), 1);
+ #else
+ // On Travis ECONNREFUSED happens before the timeout
+ net::ip::make_address("127.0.0.1"), 1);
+ #endif
+ s.expires_after(std::chrono::seconds(0));
+ s.async_connect(ep, connect_handler{error::timeout});
+ ioc.run_for(std::chrono::seconds(1));
+ ioc.restart();
+ }
+
+ {
+ // stream destroyed
+ {
+ stream_type s(ioc);
+ auto const ep = net::ip::tcp::endpoint(
+ net::ip::make_address("127.0.0.1"), 1);
+ s.expires_after(std::chrono::seconds(0));
+ s.async_connect(ep, connect_handler{boost::none});
+ }
+ ioc.run();
+ ioc.restart();
+ }
+
+ {
+ // stale timer
+ test_acceptor a;
+ stream_type s(ioc);
+ s.expires_after(std::chrono::milliseconds(50));
+ s.async_connect(a.ep, connect_handler{});
+ std::this_thread::sleep_for(
+ std::chrono::milliseconds(100));
+ ioc.run();
+ ioc.restart();
+ }
+
+ // abandoned operation
+ {
+ stream_type s(ioc);
+ net::ip::tcp::endpoint ep(
+ net::ip::make_address_v4("127.0.0.1"), 1);
+ s.async_connect(ep,
+ [](error_code)
+ {
+ BEAST_FAIL();
+ });
+ }
+ }
+
+ void
+ testMembers()
+ {
+ using stream_type = basic_stream<tcp,
+ net::io_context::executor_type>;
+
+ class handler
+ {
+ bool pass_ = false;
+ boost::optional<error_code> expected_ = {};
+
+ public:
+ ~handler()
+ {
+ BEAST_EXPECT(pass_);
+ }
+
+ handler()
+ : expected_(error_code{})
+ {
+ }
+
+ explicit
+ handler(error_code expected)
+ : expected_(expected)
+ {
+ }
+
+ explicit
+ handler(boost::none_t)
+ {
+ }
+
+ handler(handler&& other)
+ : pass_(boost::exchange(other.pass_, true))
+ , expected_(other.expected_)
+ {
+ }
+
+ void operator()(error_code ec, std::size_t)
+ {
+ pass_ = true;
+ if(expected_)
+ BEAST_EXPECTS(
+ ec == expected_, ec.message());
+ }
+ };
+
+ auto const ep = net::ip::tcp::endpoint(
+ net::ip::make_address("127.0.0.1"), 0);
+
+ char buf[4];
+ net::io_context ioc;
+ auto mb = net::buffer(buf);
+ std::memset(buf, 0, sizeof(buf));
+
+ // cancel
+
+ {
+ test_server srv("", ep, log);
+ stream_type s(ioc);
+ s.connect(srv.local_endpoint());
+ s.expires_never();
+ s.socket().async_read_some(mb, handler(
+ net::error::operation_aborted));
+ s.cancel();
+ ioc.run();
+ ioc.restart();
+ }
+
+ // close
+
+ {
+ test_server srv("", ep, log);
+ stream_type s(ioc);
+ s.connect(srv.local_endpoint());
+ s.expires_never();
+ s.socket().async_read_some(mb,
+ handler(boost::none));
+ s.close();
+ ioc.run();
+ ioc.restart();
+ }
+
+ // destructor
+
+ {
+ test_server srv("", ep, log);
+ {
+ stream_type s(ioc);
+ s.connect(srv.local_endpoint());
+ s.expires_never();
+ s.socket().async_read_some(mb,
+ handler(boost::none));
+ }
+ ioc.run();
+ ioc.restart();
+ }
+
+ // customization points
+
+ {
+ stream_type s(ioc);
+ beast::close_socket(s);
+ }
+
+ {
+ error_code ec;
+ stream_type s(ioc);
+ teardown(role_type::client, s, ec);
+ }
+
+ {
+ stream_type s(ioc);
+ async_teardown(role_type::server, s,
+ [](error_code)
+ {
+ });
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ http::response<http::string_body>
+ make_response(http::request<http::empty_body>)
+ {
+ return {};
+ }
+ void process_http_1 (tcp_stream& stream, net::yield_context yield)
+ {
+ flat_buffer buffer;
+ http::request<http::empty_body> req;
+
+ // Read the request, with a 15 second timeout
+ stream.expires_after(std::chrono::seconds(15));
+ http::async_read(stream, buffer, req, yield);
+
+ // Calculate the response
+ http::response<http::string_body> res = make_response(req);
+
+ // Send the response, with a 30 second timeout.
+ stream.expires_after (std::chrono::seconds(30));
+ http::async_write (stream, res, yield);
+ }
+
+ void process_http_2 (tcp_stream& stream, net::yield_context yield)
+ {
+ flat_buffer buffer;
+ http::request<http::empty_body> req;
+
+ // Require that the read and write combined take no longer than 30 seconds
+ stream.expires_after(std::chrono::seconds(30));
+
+ http::async_read(stream, buffer, req, yield);
+
+ http::response<http::string_body> res = make_response(req);
+ http::async_write (stream, res, yield);
+ }
+
+ void
+ testJavadocs()
+ {
+ BEAST_EXPECT(&basic_stream_test::process_http_1);
+ BEAST_EXPECT(&basic_stream_test::process_http_2);
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ testIssue1589()
+ {
+ net::io_context ioc;
+
+ // the timer needlessly used polymorphic executor
+ basic_stream<
+ net::ip::tcp,
+ net::io_context::executor_type>{ioc};
+
+ // make sure strands work
+ basic_stream<
+ net::ip::tcp,
+ net::strand<
+ net::io_context::executor_type>>{
+ net::make_strand(ioc)};
+
+ // address the problem in the issue
+ {
+ net::basic_stream_socket<
+ net::ip::tcp,
+ net::strand<
+ net::io_context::executor_type>
+ > sock(net::make_strand(ioc));
+ basic_stream<
+ net::ip::tcp,
+ net::strand<
+ net::io_context::executor_type>,
+ unlimited_rate_policy> stream(std::move(sock));
+ BOOST_STATIC_ASSERT(
+ std::is_convertible<
+ decltype(sock)::executor_type,
+ decltype(stream)::executor_type>::value);
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ run()
+ {
+ testSpecialMembers();
+ testRead();
+ testWrite();
+ testConnect();
+ testMembers();
+ testJavadocs();
+ testIssue1589();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,basic_stream);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/bind_handler.cpp b/src/boost/libs/beast/test/beast/core/bind_handler.cpp
new file mode 100644
index 000000000..a4ac8f1ce
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/bind_handler.cpp
@@ -0,0 +1,520 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/bind_handler.hpp>
+
+#include "test_handler.hpp"
+
+#include <boost/beast/core/detail/type_traits.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/bind_executor.hpp>
+#include <boost/asio/executor_work_guard.hpp>
+#include <boost/asio/dispatch.hpp>
+#include <boost/asio/defer.hpp>
+#include <boost/asio/post.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/bind/placeholders.hpp>
+#include <boost/core/exchange.hpp>
+#include <memory>
+#include <string>
+
+namespace boost {
+namespace beast {
+
+class bind_handler_test : public unit_test::suite
+{
+public:
+ template<class... Args>
+ struct handler
+ {
+ void
+ operator()(Args const&...) const
+ {
+ }
+ };
+
+ struct copyable
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ struct move_only
+ {
+ move_only() = default;
+ move_only(move_only&&) = default;
+ move_only(move_only const&) = delete;
+ void operator()() const{};
+ };
+
+ // A move-only parameter
+ template<std::size_t I>
+ struct move_arg
+ {
+ move_arg() = default;
+ move_arg(move_arg&&) = default;
+ move_arg(move_arg const&) = delete;
+ void operator()() const
+ {
+ };
+ };
+
+ void
+ callback(int v)
+ {
+ BEAST_EXPECT(v == 42);
+ }
+
+ class test_executor
+ {
+ bind_handler_test& s_;
+ net::io_context::executor_type ex_;
+
+ public:
+ test_executor(
+ test_executor const&) = default;
+
+ test_executor(
+ bind_handler_test& s,
+ net::io_context& ioc)
+ : s_(s)
+ , ex_(ioc.get_executor())
+ {
+ }
+
+ bool operator==(
+ test_executor const& other) const noexcept
+ {
+ return ex_ == other.ex_;
+ }
+
+ bool operator!=(
+ test_executor const& other) const noexcept
+ {
+ return ex_ != other.ex_;
+ }
+
+ net::io_context&
+ context() const noexcept
+ {
+ return ex_.context();
+ }
+
+ void on_work_started() const noexcept
+ {
+ ex_.on_work_started();
+ }
+
+ void on_work_finished() const noexcept
+ {
+ ex_.on_work_finished();
+ }
+
+ template<class F, class Alloc>
+ void dispatch(F&& f, Alloc const& a)
+ {
+ s_.on_invoke();
+ ex_.dispatch(std::forward<F>(f), a);
+ }
+
+ template<class F, class Alloc>
+ void post(F&& f, Alloc const& a)
+ {
+ // shouldn't be called since the enclosing
+ // networking wrapper only uses dispatch
+ BEAST_FAIL();
+ }
+
+ template<class F, class Alloc>
+ void defer(F&& f, Alloc const& a)
+ {
+ // shouldn't be called since the enclosing
+ // networking wrapper only uses dispatch
+ BEAST_FAIL();
+ }
+ };
+
+ class test_cb
+ {
+ bool fail_ = true;
+
+ public:
+ test_cb() = default;
+ test_cb(test_cb const&) = delete;
+ test_cb(test_cb&& other)
+ : fail_(boost::exchange(
+ other.fail_, false))
+ {
+ }
+
+ ~test_cb()
+ {
+ BEAST_EXPECT(! fail_);
+ }
+
+ void
+ operator()()
+ {
+ fail_ = false;
+ BEAST_EXPECT(true);
+ }
+
+ void
+ operator()(int v)
+ {
+ fail_ = false;
+ BEAST_EXPECT(v == 42);
+ }
+
+ void
+ operator()(int v, string_view s)
+ {
+ fail_ = false;
+ BEAST_EXPECT(v == 42);
+ BEAST_EXPECT(s == "s");
+ }
+
+ void
+ operator()(int v, string_view s, move_arg<1>)
+ {
+ fail_ = false;
+ BEAST_EXPECT(v == 42);
+ BEAST_EXPECT(s == "s");
+ }
+
+ void
+ operator()(int v, string_view s, move_arg<1>, move_arg<2>)
+ {
+ fail_ = false;
+ BEAST_EXPECT(v == 42);
+ BEAST_EXPECT(s == "s");
+ }
+
+ void
+ operator()(error_code, std::size_t n)
+ {
+ fail_ = false;
+ BEAST_EXPECT(n == 256);
+ }
+
+ void
+ operator()(
+ error_code, std::size_t n, string_view s)
+ {
+ boost::ignore_unused(s);
+ fail_ = false;
+ BEAST_EXPECT(n == 256);
+ }
+
+ void
+ operator()(std::shared_ptr<int> const& sp)
+ {
+ fail_ = false;
+ BEAST_EXPECT(sp.get() != nullptr);
+ }
+ };
+
+#if 0
+ // These functions should fail to compile
+
+ void
+ failStdBind()
+ {
+ std::bind(bind_handler(test_cb{}));
+ }
+
+ void
+ failStdBindFront()
+ {
+ std::bind(bind_front_handler(test_cb{}));
+ }
+#endif
+
+ //--------------------------------------------------------------------------
+
+ bool invoked_;
+
+ void
+ on_invoke()
+ {
+ invoked_ = true;
+ }
+
+ template<class F>
+ void
+ testHooks(net::io_context& ioc, F&& f)
+ {
+ invoked_ = false;
+ net::post(ioc, std::forward<F>(f));
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(invoked_);
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ testBindHandler()
+ {
+ using m1 = move_arg<1>;
+ using m2 = move_arg<2>;
+
+ {
+ using namespace std::placeholders;
+
+ // 0-ary
+ bind_handler(test_cb{})();
+
+ // 1-ary
+ bind_handler(test_cb{}, 42)();
+ bind_handler(test_cb{}, _1)(42);
+ bind_handler(test_cb{}, _2)(0, 42);
+
+ // 2-ary
+ bind_handler(test_cb{}, 42, "s")();
+ bind_handler(test_cb{}, 42, "s")(0);
+ bind_handler(test_cb{}, _1, "s")(42);
+ bind_handler(test_cb{}, 42, _1) ("s");
+ bind_handler(test_cb{}, _1, _2)(42, "s");
+ bind_handler(test_cb{}, _1, _2)(42, "s", "X");
+ bind_handler(test_cb{}, _2, _1)("s", 42);
+ bind_handler(test_cb{}, _3, _2)("X", "s", 42);
+
+ // 3-ary
+ bind_handler(test_cb{}, 42, "s")(m1{});
+ bind_handler(test_cb{}, 42, "s", _1)(m1{});
+ bind_handler(test_cb{}, 42, _1, m1{})("s");
+
+ // 4-ary
+ bind_handler(test_cb{}, 42, "s")(m1{}, m2{});
+ bind_handler(test_cb{}, 42, "s", m1{})(m2{});
+ bind_handler(test_cb{}, 42, "s", m1{}, m2{})();
+ bind_handler(test_cb{}, 42, _1, m1{})("s", m2{});
+ bind_handler(test_cb{}, _3, _1, m1{})("s", m2{}, 42);
+ }
+
+ {
+ using namespace boost::placeholders;
+
+ // 0-ary
+ bind_handler(test_cb{})();
+
+ // 1-ary
+ bind_handler(test_cb{}, 42)();
+ bind_handler(test_cb{}, _1)(42);
+ bind_handler(test_cb{}, _2)(0, 42);
+
+ // 2-ary
+ bind_handler(test_cb{}, 42, "s")();
+ bind_handler(test_cb{}, 42, "s")(0);
+ bind_handler(test_cb{}, _1, "s")(42);
+ bind_handler(test_cb{}, 42, _1) ("s");
+ bind_handler(test_cb{}, _1, _2)(42, "s");
+ bind_handler(test_cb{}, _1, _2)(42, "s", "X");
+ bind_handler(test_cb{}, _2, _1)("s", 42);
+ bind_handler(test_cb{}, _3, _2)("X", "s", 42);
+
+ // 3-ary
+ bind_handler(test_cb{}, 42, "s")(m1{});
+ bind_handler(test_cb{}, 42, "s", _1)(m1{});
+ bind_handler(test_cb{}, 42, _1, m1{})("s");
+
+ // 4-ary
+ bind_handler(test_cb{}, 42, "s")(m1{}, m2{});
+ bind_handler(test_cb{}, 42, "s", m1{})(m2{});
+ bind_handler(test_cb{}, 42, "s", m1{}, m2{})();
+ bind_handler(test_cb{}, 42, _1, m1{})("s", m2{});
+ bind_handler(test_cb{}, _3, _1, m1{})("s", m2{}, 42);
+ }
+
+ // perfect forwarding
+ {
+ std::shared_ptr<int> const sp =
+ std::make_shared<int>(42);
+ {
+ bind_handler(test_cb{}, sp)();
+ BEAST_EXPECT(sp.get() != nullptr);
+ }
+ {
+ bind_handler(test_cb{})(sp);
+ BEAST_EXPECT(sp.get() != nullptr);
+ }
+ }
+
+ // associated executor
+ {
+ net::io_context ioc;
+ testHooks(ioc, bind_handler(net::bind_executor(
+ test_executor(*this, ioc), test_cb{})));
+ }
+
+ // asio_handler_invoke
+ {
+ // make sure things compile, also can set a
+ // breakpoint in asio_handler_invoke to make sure
+ // it is instantiated.
+ net::io_context ioc;
+ net::strand<
+ net::io_context::executor_type> s{
+ ioc.get_executor()};
+ net::post(s,
+ bind_handler(test_cb{}, 42));
+ ioc.run();
+ }
+
+ // legacy hooks
+ legacy_handler::test(
+ [](legacy_handler h)
+ {
+ return bind_handler(h);
+ });
+ }
+
+ void
+ testBindFrontHandler()
+ {
+ using m1 = move_arg<1>;
+ using m2 = move_arg<2>;
+
+ // 0-ary
+ bind_front_handler(test_cb{})();
+
+ // 1-ary
+ bind_front_handler(test_cb{}, 42)();
+ bind_front_handler(test_cb{})(42);
+
+ // 2-ary
+ bind_front_handler(test_cb{}, 42, "s")();
+ bind_front_handler(test_cb{}, 42)("s");
+ bind_front_handler(test_cb{})(42, "s");
+
+ // 3-ary
+ bind_front_handler(test_cb{}, 42, "s", m1{})();
+ bind_front_handler(test_cb{}, 42, "s")(m1{});
+ bind_front_handler(test_cb{}, 42)("s", m1{});
+ bind_front_handler(test_cb{})(42, "s", m1{});
+
+ // 4-ary
+ bind_front_handler(test_cb{}, 42, "s", m1{}, m2{})();
+ bind_front_handler(test_cb{}, 42, "s", m1{})(m2{});
+ bind_front_handler(test_cb{}, 42, "s")(m1{}, m2{});
+ bind_front_handler(test_cb{}, 42)("s", m1{}, m2{});
+ bind_front_handler(test_cb{})(42, "s", m1{}, m2{});
+
+ error_code ec;
+ std::size_t n = 256;
+
+ // void(error_code, size_t)
+ bind_front_handler(test_cb{}, ec, n)();
+
+ // void(error_code, size_t)(string_view)
+ bind_front_handler(test_cb{}, ec, n)("s");
+
+ // perfect forwarding
+ {
+ std::shared_ptr<int> const sp =
+ std::make_shared<int>(42);
+ bind_front_handler(test_cb{}, sp)();
+ BEAST_EXPECT(sp.get() != nullptr);
+ }
+
+ // associated executor
+ {
+ net::io_context ioc;
+
+ testHooks(ioc, bind_front_handler(net::bind_executor(
+ test_executor(*this, ioc), test_cb{})
+ ));
+ testHooks(ioc, bind_front_handler(net::bind_executor(
+ test_executor(*this, ioc), test_cb{}),
+ 42));
+ testHooks(ioc, bind_front_handler(net::bind_executor(
+ test_executor(*this, ioc), test_cb{}),
+ 42, "s"));
+ testHooks(ioc, bind_front_handler(net::bind_executor(
+ test_executor(*this, ioc), test_cb{}),
+ 42, "s", m1{}));
+ testHooks(ioc, bind_front_handler(net::bind_executor(
+ test_executor(*this, ioc), test_cb{}),
+ 42, "s", m1{}, m2{}));
+ testHooks(ioc, bind_front_handler(net::bind_executor(
+ test_executor(*this, ioc), test_cb{}),
+ ec, n));
+ }
+
+ // legacy hooks
+ legacy_handler::test(
+ [](legacy_handler h)
+ {
+ return bind_front_handler(h);
+ });
+ legacy_handler::test(
+ [](legacy_handler h)
+ {
+ return bind_front_handler(
+ h, error_code{}, std::size_t{});
+ });
+ }
+
+
+ //--------------------------------------------------------------------------
+
+ template <class AsyncReadStream, class ReadHandler>
+ void
+ signal_aborted (AsyncReadStream& stream, ReadHandler&& handler)
+ {
+ net::post(
+ stream.get_executor(),
+ bind_handler (std::forward <ReadHandler> (handler),
+ net::error::operation_aborted, 0));
+ }
+
+ template <class AsyncReadStream, class ReadHandler>
+ void
+ signal_eof (AsyncReadStream& stream, ReadHandler&& handler)
+ {
+ net::post(
+ stream.get_executor(),
+ bind_front_handler (std::forward<ReadHandler> (handler),
+ net::error::eof, 0));
+ }
+
+ void
+ testJavadocs()
+ {
+ BEAST_EXPECT((
+ &bind_handler_test::signal_aborted<
+ test::stream, handler<error_code, std::size_t>>));
+
+ BEAST_EXPECT((
+ &bind_handler_test::signal_eof<
+ test::stream, handler<error_code, std::size_t>>));
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ run() override
+ {
+ testBindHandler();
+ testBindFrontHandler();
+ testJavadocs();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,bind_handler);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffer_traits.cpp b/src/boost/libs/beast/test/beast/core/buffer_traits.cpp
new file mode 100644
index 000000000..ae8b6b6e6
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffer_traits.cpp
@@ -0,0 +1,242 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffer_traits.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/detail/is_invocable.hpp>
+#include <array>
+
+namespace boost {
+namespace beast {
+
+namespace {
+
+struct sequence
+{
+ struct value_type
+ {
+ operator net::const_buffer() const noexcept
+ {
+ return {"Hello, world!", 13};
+ }
+ };
+
+ using const_iterator = value_type const*;
+
+ const_iterator begin() const noexcept
+ {
+ return &v_;
+ }
+
+ const_iterator end() const noexcept
+ {
+ return begin() + 1;
+ }
+
+private:
+ value_type v_;
+};
+
+struct not_sequence
+{
+};
+
+} // (anon)
+
+class buffer_traits_test : public beast::unit_test::suite
+{
+public:
+ // is_const_buffer_sequence
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ net::const_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ net::const_buffer, net::const_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ net::const_buffer, net::mutable_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ net::mutable_buffer, net::mutable_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ net::const_buffer const&
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ net::const_buffer const&, net::const_buffer const&
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_const_buffer_sequence<
+ net::const_buffer const&, net::mutable_buffer const&
+ >::value);
+
+ // is_mutable_buffer_sequence
+
+ BOOST_STATIC_ASSERT(is_mutable_buffer_sequence<
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_mutable_buffer_sequence<
+ net::mutable_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_mutable_buffer_sequence<
+ net::mutable_buffer, net::mutable_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(! is_mutable_buffer_sequence<
+ net::const_buffer, net::const_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(! is_mutable_buffer_sequence<
+ net::const_buffer, net::mutable_buffer
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_mutable_buffer_sequence<
+ net::mutable_buffer const&
+ >::value);
+
+ BOOST_STATIC_ASSERT(is_mutable_buffer_sequence<
+ net::mutable_buffer const&, net::mutable_buffer const&
+ >::value);
+
+ // buffers_type
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::const_buffer, buffers_type<
+ net::const_buffer
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::const_buffer, buffers_type<
+ net::const_buffer, net::const_buffer
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::const_buffer, buffers_type<
+ net::const_buffer, net::mutable_buffer
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::mutable_buffer, buffers_type<
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::mutable_buffer, buffers_type<
+ net::mutable_buffer
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::mutable_buffer, buffers_type<
+ net::mutable_buffer, net::mutable_buffer
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::const_buffer, buffers_type<
+ std::array<net::const_buffer, 3>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::mutable_buffer, buffers_type<
+ std::array<net::mutable_buffer, 3>
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::const_buffer, buffers_type<
+ std::array<int, 3>
+ >>::value);
+
+ // buffers_iterator_type
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::const_buffer const*, buffers_iterator_type<
+ net::const_buffer
+ >>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_same<net::mutable_buffer const*, buffers_iterator_type<
+ net::mutable_buffer
+ >>::value);
+
+ // javadoc: buffers_type
+ template <class BufferSequence>
+ buffers_type <BufferSequence>
+ buffers_front (BufferSequence const& buffers)
+ {
+ static_assert(
+ net::is_const_buffer_sequence<BufferSequence>::value,
+ "BufferSequence type requirements not met");
+ auto const first = net::buffer_sequence_begin (buffers);
+ if (first == net::buffer_sequence_end (buffers))
+ return {};
+ return *first;
+ }
+
+ void
+ testJavadocs()
+ {
+ // buffers_front
+ {
+ net::const_buffer cb;
+ buffers_front(cb);
+
+ net::mutable_buffer mb;
+ buffers_front(mb);
+ }
+
+ pass();
+ }
+
+ void
+ testFunction()
+ {
+ BEAST_EXPECT(buffer_bytes(
+ net::const_buffer("Hello, world!", 13)) == 13);
+
+ BEAST_EXPECT(buffer_bytes(
+ net::mutable_buffer{}) == 0);
+
+ {
+ sequence s;
+ BEAST_EXPECT(buffer_bytes(s) == 13);
+ }
+
+ {
+ std::array<net::const_buffer, 2> s({{
+ net::const_buffer("Hello, world!", 13),
+ net::const_buffer("Hello, world!", 13)}});
+ BEAST_EXPECT(buffer_bytes(s) == 26);
+ }
+
+ BOOST_STATIC_ASSERT(! detail::is_invocable<
+ detail::buffer_bytes_impl,
+ std::size_t(not_sequence const&)>::value);
+ }
+
+ void run() override
+ {
+ testJavadocs();
+ testFunction();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffer_traits);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffered_read_stream.cpp b/src/boost/libs/beast/test/beast/core/buffered_read_stream.cpp
new file mode 100644
index 000000000..c24abf566
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffered_read_stream.cpp
@@ -0,0 +1,230 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffered_read_stream.hpp>
+
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/bind_handler.hpp>
+#include <boost/beast/test/yield_to.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/read.hpp>
+#include <boost/asio/spawn.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/optional.hpp>
+
+namespace boost {
+namespace beast {
+
+class buffered_read_stream_test
+ : public unit_test::suite
+ , public test::enable_yield_to
+{
+ using self = buffered_read_stream_test;
+
+public:
+ void testSpecialMembers()
+ {
+ net::io_context ioc;
+ {
+ buffered_read_stream<test::stream, multi_buffer> srs(ioc);
+ buffered_read_stream<test::stream, multi_buffer> srs2(std::move(srs));
+ srs = std::move(srs2);
+ BEAST_EXPECT(&srs.get_executor().context() == &ioc);
+ BEAST_EXPECT(
+ &srs.get_executor().context() == &srs2.get_executor().context());
+ }
+ {
+ test::stream ts{ioc};
+ buffered_read_stream<test::stream&, multi_buffer> srs(ts);
+ }
+ }
+
+ struct loop : std::enable_shared_from_this<loop>
+ {
+ static std::size_t constexpr limit = 100;
+ std::string s_;
+ std::size_t n_ = 0;
+ std::size_t cap_;
+ unit_test::suite& suite_;
+ net::io_context& ioc_;
+ boost::optional<test::stream> ts_;
+ boost::optional<test::fail_count> fc_;
+ boost::optional<buffered_read_stream<
+ test::stream&, multi_buffer>> brs_;
+
+ loop(
+ unit_test::suite& suite,
+ net::io_context& ioc,
+ std::size_t cap)
+ : cap_(cap)
+ , suite_(suite)
+ , ioc_(ioc)
+ {
+ }
+
+ void
+ run()
+ {
+ do_read();
+ }
+
+ void
+ on_read(error_code ec, std::size_t)
+ {
+ if(! ec)
+ {
+ suite_.expect(s_ ==
+ "Hello, world!", __FILE__, __LINE__);
+ return;
+ }
+ ++n_;
+ if(! suite_.expect(n_ < limit, __FILE__, __LINE__))
+ return;
+ s_.clear();
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ s_.resize(13);
+ fc_.emplace(n_);
+ ts_.emplace(ioc_, *fc_, ", world!");
+ brs_.emplace(*ts_);
+ brs_->buffer().commit(net::buffer_copy(
+ brs_->buffer().prepare(5), net::buffer("Hello", 5)));
+ net::async_read(*brs_,
+ net::buffer(&s_[0], s_.size()),
+ bind_front_handler(
+ &loop::on_read,
+ shared_from_this()));
+ }
+ };
+
+ void
+ testAsyncLoop()
+ {
+ std::make_shared<loop>(*this, ioc_, 0)->run();
+ std::make_shared<loop>(*this, ioc_, 3)->run();
+ }
+
+ void testRead(yield_context do_yield)
+ {
+ static std::size_t constexpr limit = 100;
+ std::size_t n;
+ std::string s;
+ s.resize(13);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream ts(ioc_, fc, ", world!");
+ buffered_read_stream<
+ test::stream&, multi_buffer> srs(ts);
+ srs.buffer().commit(net::buffer_copy(
+ srs.buffer().prepare(5), net::buffer("Hello", 5)));
+ error_code ec = test::error::test_failure;
+ net::read(srs, net::buffer(&s[0], s.size()), ec);
+ if(! ec)
+ {
+ BEAST_EXPECT(s == "Hello, world!");
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream ts(ioc_, fc, ", world!");
+ buffered_read_stream<
+ test::stream&, multi_buffer> srs(ts);
+ srs.capacity(3);
+ srs.buffer().commit(net::buffer_copy(
+ srs.buffer().prepare(5), net::buffer("Hello", 5)));
+ error_code ec = test::error::test_failure;
+ net::read(srs, net::buffer(&s[0], s.size()), ec);
+ if(! ec)
+ {
+ BEAST_EXPECT(s == "Hello, world!");
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream ts(ioc_, fc, ", world!");
+ buffered_read_stream<
+ test::stream&, multi_buffer> srs(ts);
+ srs.buffer().commit(net::buffer_copy(
+ srs.buffer().prepare(5), net::buffer("Hello", 5)));
+ error_code ec = test::error::test_failure;
+ net::async_read(
+ srs, net::buffer(&s[0], s.size()), do_yield[ec]);
+ if(! ec)
+ {
+ BEAST_EXPECT(s == "Hello, world!");
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream ts(ioc_, fc, ", world!");
+ buffered_read_stream<
+ test::stream&, multi_buffer> srs(ts);
+ srs.capacity(3);
+ srs.buffer().commit(net::buffer_copy(
+ srs.buffer().prepare(5), net::buffer("Hello", 5)));
+ error_code ec = test::error::test_failure;
+ net::async_read(
+ srs, net::buffer(&s[0], s.size()), do_yield[ec]);
+ if(! ec)
+ {
+ BEAST_EXPECT(s == "Hello, world!");
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void run() override
+ {
+ testSpecialMembers();
+
+ yield_to([&](yield_context yield)
+ {
+ testRead(yield);
+ });
+
+ testAsyncLoop();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffered_read_stream);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffers_adapter.cpp b/src/boost/libs/beast/test/beast/core/buffers_adapter.cpp
new file mode 100644
index 000000000..d5ceff3c5
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffers_adapter.cpp
@@ -0,0 +1,23 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_ALLOW_DEPRECATED
+#define BOOST_BEAST_ALLOW_DEPRECATED
+#endif
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffers_adapter.hpp>
+
+namespace boost {
+namespace beast {
+
+BOOST_STATIC_ASSERT(sizeof(buffers_adapter<net::mutable_buffer>) > 0);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffers_adaptor.cpp b/src/boost/libs/beast/test/beast/core/buffers_adaptor.cpp
new file mode 100644
index 000000000..12c1f5bba
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffers_adaptor.cpp
@@ -0,0 +1,174 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffers_adaptor.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/read_size.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/streambuf.hpp>
+#include <iterator>
+
+namespace boost {
+namespace beast {
+
+struct buffers_adaptor_test_hook
+{
+ template<class MutableBufferSequence>
+ static
+ auto
+ make_subrange(
+ buffers_adaptor <MutableBufferSequence> &adaptor,
+ std::size_t pos = 0,
+ std::size_t n = (std::numeric_limits<std::size_t>::max)())
+ -> typename buffers_adaptor<MutableBufferSequence>::mutable_buffers_type
+ {
+ return adaptor.make_subrange(pos, n);
+ }
+
+ template<class MutableBufferSequence>
+ static
+ auto
+ make_subrange(
+ buffers_adaptor<MutableBufferSequence> const& adaptor,
+ std::size_t pos = 0,
+ std::size_t n = (std::numeric_limits<std::size_t>::max)())
+ -> typename buffers_adaptor<MutableBufferSequence>::const_buffers_type
+ {
+ return adaptor.make_subrange(pos, n);
+ }
+};
+
+class buffers_adaptor_test : public unit_test::suite
+{
+public:
+ BOOST_STATIC_ASSERT(
+ is_mutable_dynamic_buffer<
+ buffers_adaptor<buffers_triple>>::value);
+
+ void
+ testDynamicBuffer()
+ {
+ char s[13];
+ buffers_triple tb(s, sizeof(s));
+ buffers_adaptor<buffers_triple> b(tb);
+ test_dynamic_buffer(b);
+ }
+
+ void
+ testSpecial()
+ {
+ char s1[13];
+ buffers_triple tb1(s1, sizeof(s1));
+ BEAST_EXPECT(buffer_bytes(tb1) == sizeof(s1));
+
+ char s2[15];
+ buffers_triple tb2(s2, sizeof(s2));
+ BEAST_EXPECT(buffer_bytes(tb2) == sizeof(s2));
+
+ {
+ // construction
+
+ buffers_adaptor<buffers_triple> b1(tb1);
+ BEAST_EXPECT(b1.value() == tb1);
+
+ buffers_adaptor<buffers_triple> b2(tb2);
+ BEAST_EXPECT(b2.value() == tb2);
+
+ buffers_adaptor<buffers_triple> b3(b2);
+ BEAST_EXPECT(b3.value() == tb2);
+
+ char s3[15];
+ buffers_adaptor<buffers_triple> b4(
+ boost::in_place_init, s3, sizeof(s3));
+ BEAST_EXPECT(b4.value() == buffers_triple(s3, sizeof(s3)));
+
+ // assignment
+
+ b3 = b1;
+ BEAST_EXPECT(b3.value() == tb1);
+ }
+ }
+
+ void
+ testIssue386()
+ {
+ using type = net::streambuf;
+ type buffer;
+ buffers_adaptor<
+ type::mutable_buffers_type> ba{buffer.prepare(512)};
+ read_size(ba, 1024);
+ }
+
+ template<bool isMutable>
+ void
+ testSubrange()
+ {
+ std::string s =
+ "the quick brown fox jumps over the lazy dog";
+
+ auto iterate_test = [&](
+ std::size_t a,
+ std::size_t b,
+ std::size_t c)
+ {
+ auto buffers = std::vector<net::mutable_buffer>();
+ if (a)
+ buffers.push_back(net::buffer(&s[0], a));
+ if (b - a)
+ buffers.push_back(net::buffer(&s[a], (b - a)));
+ if (c - b)
+ buffers.push_back(net::buffer(&s[b], (c - b)));
+ auto adapter = buffers_adaptor<std::vector<net::mutable_buffer>>(buffers);
+
+ using maybe_mutable =
+ typename std::conditional<
+ isMutable,
+ buffers_adaptor<std::vector<net::mutable_buffer>>&,
+ buffers_adaptor<std::vector<net::mutable_buffer>> const&>::type;
+
+ auto sub = buffers_adaptor_test_hook::make_subrange(static_cast<maybe_mutable>(adapter));
+ /*
+ using value_type = typename std::conditional<
+ isMutable, net::mutable_buffer, net::const_buffer>::type;
+ BEAST_EXPECTS(typeid(typename decltype(sub)::value_type) == typeid(value_type), "iterate_test");
+ */
+ BEAST_EXPECT(buffers_to_string(sub) == s.substr(0, c));
+ };
+
+ iterate_test(0, 0, 1);
+
+ for (std::size_t a = 0; a <= s.size(); ++a)
+ for (std::size_t b = a; b <= s.size(); ++b)
+ for (std::size_t c = b; c <= s.size(); ++c)
+ iterate_test(a, b, c);
+ }
+
+
+ void
+ run() override
+ {
+ testDynamicBuffer();
+ testSpecial();
+ testIssue386();
+ testSubrange<true>();
+ testSubrange<false>();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffers_adaptor);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffers_cat.cpp b/src/boost/libs/beast/test/beast/core/buffers_cat.cpp
new file mode 100644
index 000000000..7cd3e6423
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffers_cat.cpp
@@ -0,0 +1,333 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffers_cat.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_prefix.hpp>
+#include <boost/beast/core/buffers_suffix.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/streambuf.hpp>
+#include <iterator>
+#include <list>
+#include <type_traits>
+#include <vector>
+
+namespace boost {
+namespace beast {
+
+class buffers_cat_test : public unit_test::suite
+{
+public:
+ void
+ testDefaultIterators()
+ {
+ // default ctor is one past the end
+ char c[2] = {};
+ auto bs = buffers_cat(
+ net::const_buffer(&c[0], 1),
+ net::const_buffer(&c[1], 1));
+ decltype(bs)::const_iterator it;
+ decltype(bs)::const_iterator it2;
+ BEAST_EXPECT(it == it2);
+ BEAST_EXPECT(it2 == it);
+ it = bs.end();
+ it2 = bs.end();
+ BEAST_EXPECT(it == it2);
+ BEAST_EXPECT(it2 == it);
+ decltype(bs)::const_iterator it3(it2);
+ BEAST_EXPECT(it3 == it2);
+ it = bs.begin();
+ BEAST_EXPECT(it != it3);
+ it = it3;
+ BEAST_EXPECT(it == it3);
+
+ // dereferencing default iterator should throw
+ try
+ {
+ it = {};
+ (void)*it;
+ fail();
+ }
+ catch(std::logic_error const&)
+ {
+ pass();
+ }
+ catch(...)
+ {
+ fail();
+ }
+ }
+
+ void
+ testBufferSequence()
+ {
+ string_view s = "Hello, world!";
+ net::const_buffer b1(s.data(), 6);
+ net::const_buffer b2(
+ s.data() + b1.size(), s.size() - b1.size());
+ test_buffer_sequence(buffers_cat(b1, b2));
+ }
+
+ template<class F>
+ void
+ checkException(F&& f)
+ {
+ try
+ {
+ f();
+ fail("missing exception", __FILE__, __LINE__);
+ }
+ catch(std::logic_error const&)
+ {
+ pass();
+ }
+ catch(...)
+ {
+ fail("wrong exception", __FILE__, __LINE__);
+ }
+ }
+
+ void
+ testExceptions()
+ {
+ net::const_buffer b1{"He", 2};
+ net::const_buffer b2{"llo,", 4};
+ net::const_buffer b3{" world!", 7};
+
+ auto const b = beast::buffers_cat(b1, b2, b3);
+ using type = decltype(b);
+
+ // Dereferencing a default-constructed iterator
+ checkException(
+ []
+ {
+ (void)*(type::const_iterator{});
+ });
+
+ // Incrementing a default-constructed iterator
+ checkException(
+ []
+ {
+ ++(type::const_iterator{});
+ });
+
+ // Decrementing a default-constructed iterator
+ checkException(
+ []
+ {
+ --(type::const_iterator{});
+ });
+
+ // Decrementing an iterator to the beginning
+ checkException(
+ [&b]
+ {
+ --b.begin();
+ });
+
+ // Dereferencing an iterator to the end
+ checkException(
+ [&b]
+ {
+ *b.end();
+ });
+
+ // Incrementing an iterator to the end
+ checkException(
+ [&b]
+ {
+ ++b.end();
+ });
+ }
+
+ void
+ testEmpty()
+ {
+ struct empty_sequence
+ {
+ using value_type = net::const_buffer;
+ using const_iterator = value_type const*;
+
+ const_iterator
+ begin() const noexcept
+ {
+ return &v_;
+ }
+
+ const_iterator
+ end() const noexcept
+ {
+ return begin();
+ }
+
+ private:
+ value_type v_;
+ };
+
+ {
+ net::const_buffer b0{};
+ net::const_buffer b1{"He", 2};
+ net::const_buffer b2{"llo,", 4};
+ net::const_buffer b3{" world!", 7};
+
+ {
+ auto const b = beast::buffers_cat(b0, b0);
+ BEAST_EXPECT(buffer_bytes(b) == 0);
+ BEAST_EXPECT(buffers_length(b) == 0);
+ }
+ {
+ auto const b = beast::buffers_cat(b0, b0, b0, b0);
+ BEAST_EXPECT(buffer_bytes(b) == 0);
+ BEAST_EXPECT(buffers_length(b) == 0);
+ }
+ {
+ auto const b = beast::buffers_cat(b1, b2, b3);
+ BEAST_EXPECT(beast::buffers_to_string(b) == "Hello, world!");
+ BEAST_EXPECT(buffers_length(b) == 3);
+ test_buffer_sequence(b);
+ }
+ {
+ auto const b = beast::buffers_cat(b0, b1, b2, b3);
+ BEAST_EXPECT(beast::buffers_to_string(b) == "Hello, world!");
+ BEAST_EXPECT(buffers_length(b) == 3);
+ test_buffer_sequence(b);
+ }
+ {
+ auto const b = beast::buffers_cat(b1, b0, b2, b3);
+ BEAST_EXPECT(beast::buffers_to_string(b) == "Hello, world!");
+ BEAST_EXPECT(buffers_length(b) == 3);
+ test_buffer_sequence(b);
+ }
+ {
+ auto const b = beast::buffers_cat(b1, b2, b0, b3);
+ BEAST_EXPECT(beast::buffers_to_string(b) == "Hello, world!");
+ BEAST_EXPECT(buffers_length(b) == 3);
+ test_buffer_sequence(b);
+ }
+ {
+ auto const b = beast::buffers_cat(b1, b2, b3, b0);
+ BEAST_EXPECT(beast::buffers_to_string(b) == "Hello, world!");
+ BEAST_EXPECT(buffers_length(b) == 3);
+ test_buffer_sequence(b);
+ }
+ }
+
+ {
+ auto e1 = net::const_buffer{};
+ auto b1 = std::array<net::const_buffer, 3>{{
+ e1,
+ net::const_buffer{"He", 2},
+ net::const_buffer{"l", 1} }};
+ auto b2 = std::array<net::const_buffer, 3>{{
+ net::const_buffer{"lo", 2},
+ e1,
+ net::const_buffer{", ", 2} }};
+ auto b3 = std::array<net::const_buffer, 3>{{
+ net::const_buffer{"w", 1},
+ net::const_buffer{"orld!", 5},
+ e1 }};
+ {
+ auto const b = beast::buffers_cat(
+ e1, b1, e1, b2, e1, b3, e1);
+ BEAST_EXPECT(beast::buffers_to_string(b) == "Hello, world!");
+ BEAST_EXPECT(buffers_length(b) == 6);
+ }
+ }
+
+ {
+ auto e1 = net::const_buffer{};
+ auto e2 = empty_sequence{};
+ auto b1 = std::array<net::const_buffer, 3>{{
+ e1,
+ net::const_buffer{"He", 2},
+ net::const_buffer{"l", 1} }};
+ auto b2 = std::array<net::const_buffer, 3>{{
+ net::const_buffer{"lo", 2},
+ e1,
+ net::const_buffer{", ", 2} }};
+ auto b3 = std::array<net::const_buffer, 3>{{
+ net::const_buffer{"w", 1},
+ net::const_buffer{"orld!", 5},
+ e1 }};
+ {
+ auto const b = beast::buffers_cat(
+ e2, b1, e2, b2, e2, b3, e2);
+ BEAST_EXPECT(beast::buffers_to_string(b) == "Hello, world!");
+ BEAST_EXPECT(buffers_length(b) == 6);
+ }
+ }
+ }
+
+ void
+ testGccWarning1()
+ {
+ char out[64];
+ std::array<net::const_buffer, 2> buffers{
+ {net::buffer("Hello, "), net::buffer("world!")}};
+ std::size_t i = 3;
+ buffers_suffix<std::array<net::const_buffer, 2>> cb(buffers);
+ cb.consume(i);
+ net::buffer_copy(
+ net::buffer(out),
+ buffers_cat(cb, cb));
+ }
+
+ // VFALCO Some version of g++ incorrectly complain about
+ // uninitialized values when buffers_cat and
+ // buffers_prefix and/or buffers_suffix are used
+ // together.
+ void
+ testGccWarning2()
+ {
+ char out[64];
+ net::const_buffer buffers("Hello, world!", 13);
+ std::size_t i = 3;
+ buffers_suffix<net::const_buffer> cb{buffers};
+ cb.consume(i);
+ net::buffer_copy(
+ net::buffer(out),
+ buffers_cat(buffers_prefix(i, buffers), cb));
+ }
+
+ void
+ testSingleBuffer()
+ {
+ char c[1] = {};
+ auto b = net::const_buffer(c, 1);
+ auto bs = buffers_cat(net::const_buffer(c, 1));
+ auto first = net::buffer_sequence_begin(bs);
+ auto last = net::buffer_sequence_end(bs);
+ BOOST_ASSERT(first != last);
+ BEAST_EXPECT(std::distance(first, last) == 1);
+ net::const_buffer b2(*first);
+ BEAST_EXPECT(b.data() == b2.data());
+ BEAST_EXPECT(b.size() == b2.size());
+ }
+
+ void run() override
+ {
+ testDefaultIterators();
+ testBufferSequence();
+ testExceptions();
+ testEmpty();
+ testGccWarning1();
+ testGccWarning2();
+ testSingleBuffer();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffers_cat);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffers_prefix.cpp b/src/boost/libs/beast/test/beast/core/buffers_prefix.cpp
new file mode 100644
index 000000000..86f84e5b9
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffers_prefix.cpp
@@ -0,0 +1,172 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffers_prefix.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <string>
+
+namespace boost {
+namespace beast {
+
+class buffers_prefix_test : public beast::unit_test::suite
+{
+public:
+ void
+ testBufferSequence()
+ {
+ char buf[13];
+ auto const b =
+ buffers_triple(buf, sizeof(buf));
+ for(std::size_t i = 1; i <= sizeof(buf); ++i)
+ test_buffer_sequence(
+ buffers_prefix(i, b));
+ }
+
+ void
+ testInPlaceInit()
+ {
+ {
+ class test_buffers
+ {
+ net::const_buffer cb_;
+
+ public:
+ using const_iterator =
+ net::const_buffer const*;
+
+ explicit
+ test_buffers(std::true_type)
+ {
+ }
+
+ const_iterator
+ begin() const
+ {
+ return &cb_;
+ }
+
+ const_iterator
+ end() const
+ {
+ return begin() + 1;
+ }
+ };
+ buffers_prefix_view<test_buffers> v(
+ 2, boost::in_place_init, std::true_type{});
+ BEAST_EXPECT(buffer_bytes(v) == 0);
+ }
+
+ {
+ char c[2];
+ c[0] = 0;
+ c[1] = 0;
+ buffers_prefix_view<net::const_buffer> v(
+ 2, boost::in_place_init, c, sizeof(c));
+ BEAST_EXPECT(buffer_bytes(v) == 2);
+ }
+
+ {
+ char c[2];
+ buffers_prefix_view<net::mutable_buffer> v(
+ 2, boost::in_place_init, c, sizeof(c));
+ BEAST_EXPECT(buffer_bytes(v) == 2);
+ }
+ }
+
+ template<class BufferType>
+ void
+ testPrefixes()
+ {
+ std::string s = "Hello, world";
+ BEAST_EXPECT(s.size() == 12);
+ for(std::size_t x = 1; x < 4; ++x) {
+ for(std::size_t y = 1; y < 4; ++y) {
+ {
+ std::size_t z = s.size() - (x + y);
+ std::array<BufferType, 3> bs{{
+ BufferType{&s[0], x},
+ BufferType{&s[x], y},
+ BufferType{&s[x+y], z}}};
+ for(std::size_t i = 0; i <= s.size() + 1; ++i)
+ {
+ auto pb = buffers_prefix(i, bs);
+ BEAST_EXPECT(buffers_to_string(pb) == s.substr(0, i));
+ auto pb2 = pb;
+ BEAST_EXPECT(buffers_to_string(pb2) == buffers_to_string(pb));
+ pb = buffers_prefix(0, bs);
+ pb2 = pb;
+ BEAST_EXPECT(buffer_bytes(pb2) == 0);
+ pb2 = buffers_prefix(i, bs);
+ BEAST_EXPECT(buffers_to_string(pb2) == s.substr(0, i));
+ }
+ }
+ } }
+ }
+
+ void testEmpty()
+ {
+ auto pb0 = buffers_prefix(0, net::mutable_buffer{});
+ BEAST_EXPECT(buffer_bytes(pb0) == 0);
+ auto pb1 = buffers_prefix(1, net::mutable_buffer{});
+ BEAST_EXPECT(buffer_bytes(pb1) == 0);
+ BEAST_EXPECT(net::buffer_copy(pb0, pb1) == 0);
+ }
+
+ void
+ testBuffersFront()
+ {
+ {
+ std::array<net::const_buffer, 2> v;
+ v[0] = {"", 0};
+ v[1] = net::const_buffer("Hello, world!", 13);
+ BEAST_EXPECT(buffers_front(v).size() == 0);
+ std::swap(v[0], v[1]);
+ BEAST_EXPECT(buffers_front(v).size() == 13);
+ }
+ {
+ struct null_sequence
+ {
+ net::const_buffer b;
+ using iterator = net::const_buffer const*;
+ iterator begin() const noexcept
+ {
+ return &b;
+ }
+ iterator end() const noexcept
+ {
+ return begin();
+ }
+ };
+ null_sequence z;
+ BEAST_EXPECT(buffers_front(z).size() == 0);
+ }
+ }
+
+ void
+ run() override
+ {
+ testBufferSequence();
+ testInPlaceInit();
+ testPrefixes<net::const_buffer>();
+ testPrefixes<net::mutable_buffer>();
+ testEmpty();
+ testBuffersFront();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffers_prefix);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffers_range.cpp b/src/boost/libs/beast/test/beast/core/buffers_range.cpp
new file mode 100644
index 000000000..12a5ece32
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffers_range.cpp
@@ -0,0 +1,95 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffers_range.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+
+class buffers_range_test : public beast::unit_test::suite
+{
+public:
+ BOOST_STATIC_ASSERT(
+ is_const_buffer_sequence<
+ decltype(beast::buffers_range(
+ std::declval<net::const_buffer>()))>::value);
+
+ BOOST_STATIC_ASSERT(
+ is_const_buffer_sequence<
+ decltype(beast::buffers_range(
+ std::declval<net::mutable_buffer>()))>::value);
+
+ BOOST_STATIC_ASSERT(
+ ! net::is_mutable_buffer_sequence<
+ decltype(beast::buffers_range(
+ std::declval<net::const_buffer>()))>::value);
+
+ BOOST_STATIC_ASSERT(
+ net::is_mutable_buffer_sequence<
+ decltype(beast::buffers_range(
+ std::declval<net::mutable_buffer>()))>::value);
+
+ template <class BufferSequence>
+ std::size_t buffer_sequence_size (BufferSequence const& buffers)
+ {
+ std::size_t size = 0;
+ for (auto const buffer : buffers_range (buffers))
+ size += buffer.size();
+ return size;
+ }
+
+ template <class BufferSequence>
+ std::size_t buffer_sequence_size_ref (BufferSequence const& buffers)
+ {
+ std::size_t size = 0;
+ for (auto const buffer : buffers_range_ref (buffers))
+ size += buffer.size();
+ return size;
+ }
+
+ void
+ testJavadocs()
+ {
+ BEAST_EXPECT(&buffers_range_test::buffer_sequence_size<net::const_buffer>);
+ BEAST_EXPECT(&buffers_range_test::buffer_sequence_size_ref<net::const_buffer>);
+ }
+
+ void
+ testBufferSequence()
+ {
+ {
+ string_view s = "Hello, world!";
+ test_buffer_sequence(buffers_range(
+ net::const_buffer{s.data(), s.size()}));
+ }
+ {
+ char buf[13];
+ test_buffer_sequence(
+ buffers_range(net::mutable_buffer{
+ buf, sizeof(buf)}));
+ }
+ }
+
+ void
+ run() override
+ {
+ testJavadocs();
+ testBufferSequence();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffers_range);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffers_suffix.cpp b/src/boost/libs/beast/test/beast/core/buffers_suffix.cpp
new file mode 100644
index 000000000..e08bfdf30
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffers_suffix.cpp
@@ -0,0 +1,167 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffers_suffix.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_cat.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/buffer.hpp>
+#include <string>
+
+namespace boost {
+namespace beast {
+
+class buffers_suffix_test : public beast::unit_test::suite
+{
+public:
+ void
+ testBufferSequence()
+ {
+ // mutable
+ {
+ char buf[13];
+ auto b = buffers_triple(buf, sizeof(buf));
+ buffers_suffix<decltype(b)> bs(b);
+ test_buffer_sequence(bs);
+ }
+
+ // const
+ {
+ string_view src = "Hello, world!";
+ std::array<net::const_buffer, 3> b{{
+ net::const_buffer(src.data(), 3),
+ net::const_buffer(src.data() + 3, 4),
+ net::const_buffer(src.data() + 7, 6) }};
+ buffers_suffix<decltype(b)> bs(b);
+ test_buffer_sequence(bs);
+ }
+ }
+
+ void
+ testSpecial()
+ {
+ // default construction
+ {
+ class test_buffer
+ : public net::const_buffer
+ {
+ public:
+ test_buffer()
+ : net::const_buffer("\r\n", 2)
+ {
+ }
+ };
+
+ buffers_suffix<test_buffer> cb;
+ BEAST_EXPECT(buffers_to_string(cb) == "\r\n");
+ cb.consume(1);
+ BEAST_EXPECT(buffers_to_string(cb) == "\n");
+ }
+
+ // in-place init
+ {
+ buffers_suffix<buffers_cat_view<
+ net::const_buffer,
+ net::const_buffer>> cb(
+ boost::in_place_init,
+ net::const_buffer("\r", 1),
+ net::const_buffer("\n", 1));
+ BEAST_EXPECT(buffers_to_string(cb) == "\r\n");
+ }
+
+ // empty sequence
+ {
+ buffers_suffix<net::mutable_buffer> cb(
+ net::mutable_buffer{});
+ BEAST_EXPECT(buffer_bytes(cb) == 0);
+ buffers_suffix<net::mutable_buffer> cb2(
+ net::mutable_buffer{});
+ BEAST_EXPECT(net::buffer_copy(cb2, cb) == 0);
+ }
+ }
+
+ template<class BufferSequence>
+ static
+ buffers_suffix<BufferSequence>
+ consumed_buffers(BufferSequence const& bs, std::size_t n)
+ {
+ buffers_suffix<BufferSequence> cb(bs);
+ cb.consume(n);
+ return cb;
+ }
+
+ template<class Buffers1, class Buffers2>
+ static
+ bool
+ eq(Buffers1 const& lhs, Buffers2 const& rhs)
+ {
+ return
+ buffers_to_string(lhs) ==
+ buffers_to_string(rhs);
+ }
+
+ void
+ testMatrix()
+ {
+ char buf[12];
+ std::string const s = "Hello, world";
+ BEAST_EXPECT(s.size() == sizeof(buf));
+ net::buffer_copy(net::buffer(buf), net::buffer(s));
+ BEAST_EXPECT(buffers_to_string(net::buffer(buf)) == s);
+ for(std::size_t i = 1; i < 4; ++i) {
+ for(std::size_t j = 1; j < 4; ++j) {
+ for(std::size_t x = 1; x < 4; ++x) {
+ for(std::size_t y = 1; y < 4; ++y) {
+ std::size_t k = sizeof(buf) - (i + j);
+ std::size_t z = sizeof(buf) - (x + y);
+ {
+ std::array<net::const_buffer, 3> bs{{
+ net::const_buffer{&buf[0], i},
+ net::const_buffer{&buf[i], j},
+ net::const_buffer{&buf[i+j], k}}};
+ buffers_suffix<decltype(bs)> cb(bs);
+ BEAST_EXPECT(buffers_to_string(cb) == s);
+ BEAST_EXPECT(buffer_bytes(cb) == s.size());
+ cb.consume(0);
+ BEAST_EXPECT(eq(cb, consumed_buffers(bs, 0)));
+ BEAST_EXPECT(buffers_to_string(cb) == s);
+ BEAST_EXPECT(buffer_bytes(cb) == s.size());
+ cb.consume(x);
+ BEAST_EXPECT(buffers_to_string(cb) == s.substr(x));
+ BEAST_EXPECT(eq(cb, consumed_buffers(bs, x)));
+ cb.consume(y);
+ BEAST_EXPECT(buffers_to_string(cb) == s.substr(x+y));
+ BEAST_EXPECT(eq(cb, consumed_buffers(bs, x+y)));
+ cb.consume(z);
+ BEAST_EXPECT(buffers_to_string(cb) == "");
+ BEAST_EXPECT(eq(cb, consumed_buffers(bs, x+y+z)));
+ cb.consume(1);
+ BEAST_EXPECT(buffers_to_string(cb) == "");
+ BEAST_EXPECT(eq(cb, consumed_buffers(bs, x+y+z)));
+ }
+ }}}}
+ }
+
+ void
+ run() override
+ {
+ testBufferSequence();
+ testSpecial();
+ testMatrix();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffers_suffix);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/buffers_to_string.cpp b/src/boost/libs/beast/test/beast/core/buffers_to_string.cpp
new file mode 100644
index 000000000..4df9422d3
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/buffers_to_string.cpp
@@ -0,0 +1,37 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/buffers_to_string.hpp>
+
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+
+class buffers_to_string_test : public unit_test::suite
+{
+public:
+ void
+ run() override
+ {
+ multi_buffer b;
+ ostream(b) << "Hello, ";
+ BEAST_EXPECT(buffers_to_string(b.data()) == "Hello, ");
+ ostream(b) << "world!";
+ BEAST_EXPECT(buffers_to_string(b.data()) == "Hello, world!");
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,buffers_to_string);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/close_socket.cpp b/src/boost/libs/beast/test/beast/core/close_socket.cpp
new file mode 100644
index 000000000..01703c3f2
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/close_socket.cpp
@@ -0,0 +1,39 @@
+//
+// Copyright (c) 2018 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/close_socket.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/core/stream_traits.hpp>
+#include <boost/beast/core/string.hpp>
+
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/write.hpp>
+#include <utility>
+
+namespace boost {
+namespace beast {
+
+class close_socket_test : public beast::unit_test::suite
+{
+public:
+ void
+ run() override
+ {
+ testClose();
+ testJavadocs();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,close_socket);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/detect_ssl.cpp b/src/boost/libs/beast/test/beast/core/detect_ssl.cpp
new file mode 100644
index 000000000..7e457414e
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/detect_ssl.cpp
@@ -0,0 +1,181 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/detect_ssl.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/test/handler.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/core/exchange.hpp>
+namespace boost {
+namespace beast {
+
+class detect_ssl_test : public unit_test::suite
+{
+public:
+ void
+ testDetect()
+ {
+ auto const yes =
+ [](int n, string_view s)
+ {
+ BEAST_EXPECT(detail::is_tls_client_hello(
+ net::const_buffer(s.data(), n)));
+ };
+
+ auto const no =
+ [](int n, string_view s)
+ {
+ BEAST_EXPECT(! detail::is_tls_client_hello(
+ net::const_buffer(s.data(), n)));
+ };
+
+ auto const maybe =
+ [](int n, string_view s)
+ {
+ BEAST_EXPECT(boost::indeterminate(
+ detail::is_tls_client_hello(
+ net::const_buffer(s.data(), n))));
+ };
+
+ maybe( 0, "\x00\x00\x00\x00\x00\x00\x00\x00\x00");
+ no ( 1, "\x01\x00\x00\x00\x00\x00\x00\x00\x00");
+ maybe( 1, "\x16\x00\x00\x00\x00\x00\x00\x00\x00");
+ maybe( 4, "\x16\x00\x00\x00\x00\x00\x00\x00\x00");
+ no ( 5, "\x16\x00\x00\x00\x00\x00\x00\x00\x00");
+ maybe( 5, "\x16\x00\x00\x01\x00\x00\x00\x00\x00");
+ no ( 8, "\x16\x00\x00\x01\x00\x00\x00\x00\x00");
+ maybe( 8, "\x16\x00\x00\x01\x00\x01\x00\x00\x00");
+ no ( 9, "\x16\x00\x00\x01\x00\x01\x01\x00\x00");
+ yes ( 9, "\x16\x00\x00\x01\x00\x01\x00\x00\x00");
+ }
+
+ void
+ testRead()
+ {
+ net::io_context ioc;
+
+ // true
+
+ {
+ error_code ec;
+ flat_buffer b;
+ test::stream s1(ioc);
+ s1.append({"\x16\x00\x00\x01\x00\x01\x00\x00\x00", 9});
+ auto result = detect_ssl(s1, b, ec);
+ BEAST_EXPECT(result == true);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ // true
+
+ {
+ error_code ec;
+ flat_buffer b;
+ test::stream s1(ioc);
+ auto s2 = test::connect(s1);
+ s1.append({"\x16\x00\x00\x01\x00\x01\x00\x00\x00", 9});
+ s2.close();
+ auto result = detect_ssl(s1, b, ec);
+ BEAST_EXPECT(result == true);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ // false
+
+ {
+ error_code ec;
+ flat_buffer b;
+ test::stream s1(ioc);
+ s1.append({"\x16\x00\x00\x01\x00\x01\x01\x00\x00", 9});
+ auto result = detect_ssl(s1, b, ec);
+ BEAST_EXPECT(result == false);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ // eof
+ {
+ error_code ec;
+ flat_buffer b;
+ test::stream s1(ioc);
+ auto s2 = test::connect(s1);
+ s1.append({"\x16\x00\x00\x01\x00", 5});
+ s2.close();
+ auto result = detect_ssl(s1, b, ec);
+ BEAST_EXPECT(result == false);
+ BEAST_EXPECT(ec);
+ }
+ }
+
+ void
+ testAsyncRead()
+ {
+ net::io_context ioc;
+
+ // true
+
+ {
+ flat_buffer b;
+ test::stream s1(ioc);
+ s1.append({"\x16\x00\x00\x01\x00\x01\x00\x00\x00", 9});
+ async_detect_ssl(s1, b, test::success_handler());
+ test::run(ioc);
+ }
+
+ // true
+
+ {
+ flat_buffer b;
+ test::stream s1(ioc);
+ auto s2 = test::connect(s1);
+ s1.append({"\x16\x00\x00\x01\x00\x01\x00\x00\x00", 9});
+ s2.close();
+ async_detect_ssl(s1, b, test::success_handler());
+ test::run(ioc);
+ }
+
+ // false
+
+ {
+ flat_buffer b;
+ test::stream s1(ioc);
+ s1.append({"\x16\x00\x00\x01\x00\x01\x01\x00\x00", 9});
+ async_detect_ssl(s1, b, test::success_handler());
+ test::run(ioc);
+ }
+
+ // eof
+ {
+ flat_buffer b;
+ test::stream s1(ioc);
+ auto s2 = test::connect(s1);
+ s1.append({"\x16\x00\x00\x01\x00", 5});
+ s2.close();
+ async_detect_ssl(s1, b,
+ test::fail_handler(net::error::eof));
+ test::run(ioc);
+ }
+ }
+
+ void
+ run() override
+ {
+ testDetect();
+ testRead();
+ testAsyncRead();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,detect_ssl);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/error.cpp b/src/boost/libs/beast/test/beast/core/error.cpp
new file mode 100644
index 000000000..40d9de9f3
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/error.cpp
@@ -0,0 +1,55 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/error.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <memory>
+
+namespace boost {
+namespace beast {
+
+class error_test : public unit_test::suite
+{
+public:
+ // no condition
+ void check(error e)
+ {
+ auto const ec = make_error_code(e);
+ ec.category().name();
+ BEAST_EXPECT(! ec.message().empty());
+ }
+
+ void check(condition c, error e)
+ {
+ {
+ auto const ec = make_error_code(e);
+ BEAST_EXPECT(ec.category().name() != nullptr);
+ BEAST_EXPECT(! ec.message().empty());
+ BEAST_EXPECT(ec == c);
+ }
+ {
+ auto ec = make_error_condition(c);
+ BEAST_EXPECT(ec.category().name() != nullptr);
+ BEAST_EXPECT(! ec.message().empty());
+ BEAST_EXPECT(ec == c);
+ }
+ }
+
+ void run() override
+ {
+ check(condition::timeout, error::timeout);
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,error);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/file.cpp b/src/boost/libs/beast/test/beast/core/file.cpp
new file mode 100644
index 000000000..69d93cbf4
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/file.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/file.hpp>
diff --git a/src/boost/libs/beast/test/beast/core/file_base.cpp b/src/boost/libs/beast/test/beast/core/file_base.cpp
new file mode 100644
index 000000000..f4b99e40b
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/file_base.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/file_base.hpp>
diff --git a/src/boost/libs/beast/test/beast/core/file_posix.cpp b/src/boost/libs/beast/test/beast/core/file_posix.cpp
new file mode 100644
index 000000000..23bfe8f05
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/file_posix.cpp
@@ -0,0 +1,40 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/file_posix.hpp>
+
+#if BOOST_BEAST_USE_POSIX_FILE
+
+#include "file_test.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+
+BOOST_STATIC_ASSERT(! std::is_copy_constructible<file_posix>::value);
+
+class file_posix_test
+ : public beast::unit_test::suite
+{
+public:
+ void
+ run()
+ {
+ test_file<file_posix>();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,file_posix);
+
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/file_stdio.cpp b/src/boost/libs/beast/test/beast/core/file_stdio.cpp
new file mode 100644
index 000000000..3af8400cc
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/file_stdio.cpp
@@ -0,0 +1,40 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/file_stdio.hpp>
+
+#include "file_test.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+
+BOOST_STATIC_ASSERT(! std::is_copy_constructible<file_stdio>::value);
+
+class file_stdio_test
+ : public beast::unit_test::suite
+{
+public:
+ void
+ run()
+ {
+#ifdef BOOST_MSVC
+ test_file<file_stdio, true>();
+#else
+ test_file<file_stdio>();
+#endif
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,file_stdio);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/file_test.hpp b/src/boost/libs/beast/test/beast/core/file_test.hpp
new file mode 100644
index 000000000..280bf7276
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/file_test.hpp
@@ -0,0 +1,413 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_FILE_TEST_HPP
+#define BOOST_BEAST_FILE_TEST_HPP
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/core/file_base.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <boost/filesystem/fstream.hpp>
+#include <cstdio>
+#include <string>
+#include <type_traits>
+
+namespace boost {
+namespace beast {
+
+template<class File, bool append_unicode_suffix = false>
+void
+test_file()
+{
+ BOOST_STATIC_ASSERT(
+ is_file<File>::value);
+ BOOST_STATIC_ASSERT(
+ ! std::is_copy_constructible<File>::value);
+ BOOST_STATIC_ASSERT(
+ ! std::is_copy_assignable<File>::value);
+
+ namespace fs = boost::filesystem;
+
+ static constexpr
+#ifdef _WIN32
+ boost::winapi::WCHAR_ unicode_suffix[] = { 0xd83e, 0xdd84, 0x0000 }; // UTF-16-LE unicorn
+#else
+ char unicode_suffix[] = { '\xf0', '\x9f', '\xa6', '\x84', '\x00' }; // UTF-8 unicorn
+#endif
+
+ class temp_path
+ {
+ fs::path path_;
+ std::vector<char> utf8_str_;
+
+ public:
+ temp_path()
+ : path_(fs::unique_path())
+ {
+ if (append_unicode_suffix)
+ path_ += unicode_suffix;
+#ifdef _WIN32
+ constexpr auto cp = boost::winapi::CP_UTF8_;
+ constexpr auto flags = boost::winapi::WC_ERR_INVALID_CHARS_;
+ auto sz = boost::winapi::WideCharToMultiByte(
+ cp, flags, path_.c_str(), -1, nullptr, 0,
+ nullptr, nullptr);
+ BEAST_EXPECT(sz != 0);
+ utf8_str_.resize(sz);
+ auto ret = boost::winapi::WideCharToMultiByte(
+ cp, flags, path_.c_str(), -1,
+ utf8_str_.data(), sz,
+ nullptr, nullptr);
+ BEAST_EXPECT(ret == sz);
+#endif
+ }
+
+ operator fs::path const&()
+ {
+ return path_;
+ }
+
+ operator char const*()
+ {
+#ifdef _WIN32
+ return utf8_str_.data();
+#else
+ return path_.c_str();
+#endif
+ }
+ };
+
+ auto const create =
+ [](fs::path const& path)
+ {
+ BEAST_EXPECT(! fs::exists(path));
+ fs::ofstream out(path);
+ BEAST_EXPECT(out.is_open());
+ };
+
+ auto const remove =
+ [](fs::path const& path)
+ {
+ fs::remove(path);
+ BEAST_EXPECT(! fs::exists(path));
+ };
+
+ temp_path path;
+
+ // bad file descriptor
+ {
+ File f;
+ char buf[1];
+ BEAST_EXPECT(! f.is_open());
+ BEAST_EXPECT(! fs::exists(path));
+ {
+ error_code ec;
+ f.size(ec);
+ BEAST_EXPECT(ec == errc::bad_file_descriptor);
+ }
+ {
+ error_code ec;
+ f.pos(ec);
+ BEAST_EXPECT(ec == errc::bad_file_descriptor);
+ }
+ {
+ error_code ec;
+ f.seek(0, ec);
+ BEAST_EXPECT(ec == errc::bad_file_descriptor);
+ }
+ {
+ error_code ec;
+ f.read(buf, 0, ec);
+ BEAST_EXPECT(ec == errc::bad_file_descriptor);
+ }
+ {
+ error_code ec;
+ f.write(buf, 0, ec);
+ BEAST_EXPECT(ec == errc::bad_file_descriptor);
+ }
+ }
+
+ // file_mode::read
+ {
+ {
+ File f;
+ error_code ec;
+ create(path);
+ f.open(path, file_mode::read, ec);
+ BEAST_EXPECT(! ec);
+ }
+ remove(path);
+ }
+
+ // file_mode::scan
+ {
+ {
+ File f;
+ error_code ec;
+ create(path);
+ f.open(path, file_mode::scan, ec);
+ BEAST_EXPECT(! ec);
+ }
+ remove(path);
+ }
+
+ // file_mode::write
+ {
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(! fs::exists(path));
+ f.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(fs::exists(path));
+ }
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(fs::exists(path));
+ f.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(fs::exists(path));
+ }
+ remove(path);
+ }
+
+ // file_mode::write_new
+ {
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(! fs::exists(path));
+ f.open(path, file_mode::write_new, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(fs::exists(path));
+ }
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(fs::exists(path));
+ f.open(path, file_mode::write_new, ec);
+ BEAST_EXPECT(ec);
+ }
+ remove(path);
+ }
+
+ // file_mode::write_existing
+ {
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(! fs::exists(path));
+ f.open(path, file_mode::write_existing, ec);
+ BEAST_EXPECT(ec);
+ BEAST_EXPECT(! fs::exists(path));
+ }
+ {
+ File f;
+ error_code ec;
+ create(path);
+ BEAST_EXPECT(fs::exists(path));
+ f.open(path, file_mode::write_existing, ec);
+ BEAST_EXPECT(! ec);
+ }
+ remove(path);
+ }
+
+ // file_mode::append
+ {
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(! fs::exists(path));
+ f.open(path, file_mode::append, ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(fs::exists(path));
+ }
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(fs::exists(path));
+ f.open(path, file_mode::append, ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(fs::exists(path));
+ }
+ remove(path);
+ }
+
+ // file_mode::append_existing
+ {
+ {
+ File f;
+ error_code ec;
+ BEAST_EXPECT(! fs::exists(path));
+ f.open(path, file_mode::append_existing, ec);
+ BEAST_EXPECT(ec);
+ BEAST_EXPECT(! fs::exists(path));
+ }
+ remove(path);
+ {
+ File f;
+ error_code ec;
+ create(path);
+ BEAST_EXPECT(fs::exists(path));
+ f.open(path, file_mode::append_existing, ec);
+ BEAST_EXPECT(! ec);
+ }
+ remove(path);
+ }
+
+ // special members
+ {
+ {
+ File f1;
+ error_code ec;
+ f1.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(f1.is_open());
+
+ // move constructor
+ File f2(std::move(f1));
+ BEAST_EXPECT(! f1.is_open());
+ BEAST_EXPECT(f2.is_open());
+
+ // move assignment
+ File f3;
+ f3 = std::move(f2);
+ BEAST_EXPECT(! f2.is_open());
+ BEAST_EXPECT(f3.is_open());
+ }
+ remove(path);
+ }
+
+ // re-open
+ {
+ {
+ File f;
+ error_code ec;
+ f.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+ f.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+ }
+ remove(path);
+ }
+
+ // re-assign
+ {
+ temp_path path2;
+ {
+ error_code ec;
+
+ File f1;
+ f1.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+
+ File f2;
+ f2.open(path2, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+
+ f2 = std::move(f1);
+ BEAST_EXPECT(! f1.is_open());
+ BEAST_EXPECT(f2.is_open());
+ }
+ remove(path);
+ remove(path2);
+ }
+
+ // self-move
+ {
+ {
+ File f;
+ error_code ec;
+ f.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+ f = std::move(f);
+ BEAST_EXPECT(f.is_open());
+ }
+ remove(path);
+ }
+
+ // native_handle
+ {
+ {
+ File f;
+ auto none = f.native_handle();
+ error_code ec;
+ f.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+ auto fd = f.native_handle();
+ BEAST_EXPECT(fd != none);
+ f.native_handle(none);
+ BEAST_EXPECT(! f.is_open());
+ }
+ remove(path);
+ }
+
+ // read and write
+ {
+ string_view const s = "Hello, world!";
+
+ // write
+ {
+ File f;
+ error_code ec;
+ f.open(path, file_mode::write, ec);
+ BEAST_EXPECT(! ec);
+
+ f.write(s.data(), s.size(), ec);
+ BEAST_EXPECT(! ec);
+
+ auto size = f.size(ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(size == s.size());
+
+ auto pos = f.pos(ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(pos == size);
+
+ f.close(ec);
+ BEAST_EXPECT(! ec);
+ }
+
+ // read
+ {
+ File f;
+ error_code ec;
+ f.open(path, file_mode::read, ec);
+ BEAST_EXPECT(! ec);
+
+ std::string buf;
+ buf.resize(s.size());
+ f.read(&buf[0], buf.size(), ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(buf == s);
+
+ f.seek(1, ec);
+ BEAST_EXPECT(! ec);
+ buf.resize(3);
+ f.read(&buf[0], buf.size(), ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(buf == "ell");
+
+ auto pos = f.pos(ec);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(pos == 4);
+ }
+ remove(path);
+ }
+
+ BEAST_EXPECT(! fs::exists(path));
+}
+
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/file_win32.cpp b/src/boost/libs/beast/test/beast/core/file_win32.cpp
new file mode 100644
index 000000000..f0f2b4ac1
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/file_win32.cpp
@@ -0,0 +1,38 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/file_win32.hpp>
+
+#if BOOST_BEAST_USE_WIN32_FILE
+
+#include "file_test.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+
+class file_win32_test
+ : public beast::unit_test::suite
+{
+public:
+ void
+ run()
+ {
+ test_file<file_win32, true>();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,file_win32);
+
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/flat_buffer.cpp b/src/boost/libs/beast/test/beast/core/flat_buffer.cpp
new file mode 100644
index 000000000..df7b06a98
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/flat_buffer.cpp
@@ -0,0 +1,438 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/flat_buffer.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/read_size.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/test/test_allocator.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <algorithm>
+#include <cctype>
+
+namespace boost {
+namespace beast {
+
+class flat_buffer_test : public beast::unit_test::suite
+{
+public:
+ BOOST_STATIC_ASSERT(
+ is_mutable_dynamic_buffer<flat_buffer>::value);
+
+ void
+ testDynamicBuffer()
+ {
+ flat_buffer b(30);
+ BEAST_EXPECT(b.max_size() == 30);
+ test_dynamic_buffer(b);
+ }
+
+ void
+ testSpecialMembers()
+ {
+ using namespace test;
+
+ using a_t = test::test_allocator<char,
+ true, true, true, true, true>;
+
+ // Equal == false
+ using a_neq_t = test::test_allocator<char,
+ false, true, true, true, true>;
+
+ // construction
+ {
+ {
+ flat_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ }
+ {
+ flat_buffer b{500};
+ BEAST_EXPECT(b.capacity() == 0);
+ BEAST_EXPECT(b.max_size() == 500);
+ }
+ {
+ a_neq_t a1;
+ basic_flat_buffer<a_neq_t> b{a1};
+ BEAST_EXPECT(b.get_allocator() == a1);
+ a_neq_t a2;
+ BEAST_EXPECT(b.get_allocator() != a2);
+ }
+ {
+ a_neq_t a;
+ basic_flat_buffer<a_neq_t> b{500, a};
+ BEAST_EXPECT(b.capacity() == 0);
+ BEAST_EXPECT(b.max_size() == 500);
+ }
+ }
+
+ // move construction
+ {
+ {
+ basic_flat_buffer<a_t> b1{30};
+ BEAST_EXPECT(b1.get_allocator()->nmove == 0);
+ ostream(b1) << "Hello";
+ basic_flat_buffer<a_t> b2{std::move(b1)};
+ BEAST_EXPECT(b2.get_allocator()->nmove == 1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ BEAST_EXPECT(b1.max_size() == b2.max_size());
+ }
+ {
+ basic_flat_buffer<a_t> b1{30};
+ ostream(b1) << "Hello";
+ a_t a;
+ basic_flat_buffer<a_t> b2{std::move(b1), a};
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ BEAST_EXPECT(b1.max_size() == b2.max_size());
+ }
+ {
+ basic_flat_buffer<a_neq_t> b1{30};
+ ostream(b1) << "Hello";
+ a_neq_t a;
+ basic_flat_buffer<a_neq_t> b2{std::move(b1), a};
+ BEAST_EXPECT(b1.size() != 0);
+ BEAST_EXPECT(b1.capacity() != 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ BEAST_EXPECT(b1.max_size() == b2.max_size());
+ }
+ }
+
+ // copy construction
+ {
+ basic_flat_buffer<a_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<a_t> b2(b1);
+ BEAST_EXPECT(b1.get_allocator() == b2.get_allocator());
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ basic_flat_buffer<a_neq_t> b1;
+ ostream(b1) << "Hello";
+ a_neq_t a;
+ basic_flat_buffer<a_neq_t> b2(b1, a);
+ BEAST_EXPECT(b1.get_allocator() != b2.get_allocator());
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ basic_flat_buffer<a_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<a_neq_t> b2(b1);
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ basic_flat_buffer<a_neq_t> b1;
+ ostream(b1) << "Hello";
+ a_t a;
+ basic_flat_buffer<a_t> b2(b1, a);
+ BEAST_EXPECT(b2.get_allocator() == a);
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ flat_buffer b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<a_t> b2;
+ b2.reserve(1);
+ BEAST_EXPECT(b2.capacity() == 1);
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ BEAST_EXPECT(b2.capacity() == b2.size());
+ }
+
+ // move assignment
+ {
+ {
+ flat_buffer b1;
+ ostream(b1) << "Hello";
+ flat_buffer b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ using na_t = test::test_allocator<char,
+ true, true, false, true, true>;
+ basic_flat_buffer<na_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<na_t> b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.get_allocator() == b2.get_allocator());
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ using na_t = test::test_allocator<char,
+ false, true, false, true, true>;
+ basic_flat_buffer<na_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<na_t> b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.get_allocator() != b2.get_allocator());
+ BEAST_EXPECT(b1.size() != 0);
+ BEAST_EXPECT(b1.capacity() != 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_move_assignment : true
+ using pocma_t = test::test_allocator<char,
+ true, true, true, true, true>;
+ basic_flat_buffer<pocma_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<pocma_t> b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_move_assignment : false
+ using pocma_t = test::test_allocator<char,
+ true, true, false, true, true>;
+ basic_flat_buffer<pocma_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<pocma_t> b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ }
+
+ // copy assignment
+ {
+ {
+ flat_buffer b1;
+ ostream(b1) << "Hello";
+ flat_buffer b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ basic_flat_buffer<a_t> b3;
+ b3 = b2;
+ BEAST_EXPECT(buffers_to_string(b3.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_copy_assignment : true
+ using pocca_t = test::test_allocator<char,
+ true, true, true, true, true>;
+ basic_flat_buffer<pocca_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<pocca_t> b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_copy_assignment : false
+ using pocca_t = test::test_allocator<char,
+ true, false, true, true, true>;
+ basic_flat_buffer<pocca_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<pocca_t> b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ }
+
+ // operations
+ {
+ string_view const s = "Hello, world!";
+ flat_buffer b1{64};
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.max_size() == 64);
+ BEAST_EXPECT(b1.capacity() == 0);
+ ostream(b1) << s;
+ BEAST_EXPECT(buffers_to_string(b1.data()) == s);
+ {
+ flat_buffer b2{b1};
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ {
+ flat_buffer b2{32};
+ BEAST_EXPECT(b2.max_size() == 32);
+ b2 = b1;
+ BEAST_EXPECT(b2.max_size() == b1.max_size());
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ }
+
+ // cause memmove
+ {
+ flat_buffer b{20};
+ ostream(b) << "12345";
+ b.consume(3);
+ ostream(b) << "67890123";
+ BEAST_EXPECT(buffers_to_string(b.data()) == "4567890123");
+ }
+
+ // max_size
+ {
+ flat_buffer b{10};
+ BEAST_EXPECT(b.max_size() == 10);
+ b.max_size(32);
+ BEAST_EXPECT(b.max_size() == 32);
+ }
+
+ // allocator max_size
+ {
+ basic_flat_buffer<a_t> b;
+ auto a = b.get_allocator();
+ BOOST_STATIC_ASSERT(
+ ! std::is_const<decltype(a)>::value);
+ a->max_size = 30;
+ try
+ {
+ b.prepare(1000);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ // read_size
+ {
+ flat_buffer b{10};
+ BEAST_EXPECT(read_size(b, 512) == 10);
+ b.prepare(4);
+ b.commit(4);
+ BEAST_EXPECT(read_size(b, 512) == 6);
+ b.consume(2);
+ BEAST_EXPECT(read_size(b, 512) == 8);
+ b.prepare(8);
+ b.commit(8);
+ BEAST_EXPECT(read_size(b, 512) == 0);
+ }
+
+ // swap
+ {
+ {
+ basic_flat_buffer<a_neq_t> b1;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<a_neq_t> b2;
+ BEAST_EXPECT(b1.get_allocator() != b2.get_allocator());
+ swap(b1, b2);
+ BEAST_EXPECT(b1.get_allocator() != b2.get_allocator());
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ using na_t = test::test_allocator<char,
+ true, true, true, false, true>;
+ na_t a1;
+ basic_flat_buffer<na_t> b1{a1};
+ na_t a2;
+ ostream(b1) << "Hello";
+ basic_flat_buffer<na_t> b2{a2};
+ BEAST_EXPECT(b1.get_allocator() == a1);
+ BEAST_EXPECT(b2.get_allocator() == a2);
+ swap(b1, b2);
+ BEAST_EXPECT(b1.get_allocator() == b2.get_allocator());
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ }
+
+ // prepare
+ {
+ flat_buffer b{100};
+ b.prepare(10);
+ b.commit(10);
+ b.prepare(5);
+ BEAST_EXPECT(b.capacity() >= 5);
+ try
+ {
+ b.prepare(1000);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ // reserve
+ {
+ flat_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ b.reserve(50);
+ BEAST_EXPECT(b.capacity() == 50);
+ b.prepare(20);
+ b.commit(20);
+ b.reserve(50);
+ BEAST_EXPECT(b.capacity() == 50);
+
+ b.max_size(b.capacity());
+ b.reserve(b.max_size() + 20);
+ BEAST_EXPECT(b.capacity() == 70);
+ BEAST_EXPECT(b.max_size() == 70);
+ }
+
+ // shrink to fit
+ {
+ flat_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ b.prepare(50);
+ BEAST_EXPECT(b.capacity() == 50);
+ b.commit(50);
+ BEAST_EXPECT(b.capacity() == 50);
+ b.prepare(75);
+ BEAST_EXPECT(b.capacity() >= 125);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.capacity() == b.size());
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.capacity() == b.size());
+ b.consume(b.size());
+ BEAST_EXPECT(b.size() == 0);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.capacity() == 0);
+ }
+
+ // clear
+ {
+ flat_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ b.prepare(50);
+ b.commit(50);
+ BEAST_EXPECT(b.size() == 50);
+ BEAST_EXPECT(b.capacity() == 50);
+ b.clear();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 50);
+ }
+ }
+
+ void
+ run() override
+ {
+ testDynamicBuffer();
+ testSpecialMembers();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,flat_buffer);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/flat_static_buffer.cpp b/src/boost/libs/beast/test/beast/core/flat_static_buffer.cpp
new file mode 100644
index 000000000..a74eaad9a
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/flat_static_buffer.cpp
@@ -0,0 +1,139 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/flat_static_buffer.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/read_size.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/buffers_iterator.hpp>
+#include <algorithm>
+#include <cctype>
+#include <string>
+
+namespace boost {
+namespace beast {
+
+class flat_static_buffer_test : public beast::unit_test::suite
+{
+public:
+ BOOST_STATIC_ASSERT(
+ is_mutable_dynamic_buffer<
+ flat_static_buffer<13>>::value);
+
+ void
+ testDynamicBuffer()
+ {
+ test_dynamic_buffer(flat_static_buffer<13>{});
+ }
+
+ void
+ testMembers()
+ {
+ string_view const s = "Hello, world!";
+
+ // flat_static_buffer_base
+ {
+ char buf[64];
+ flat_static_buffer_base b{buf, sizeof(buf)};
+ ostream(b) << s;
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ b.clear();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(buffer_bytes(b.data()) == 0);
+ }
+
+ // flat_static_buffer
+ {
+ flat_static_buffer<64> b1;
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.max_size() == 64);
+ BEAST_EXPECT(b1.capacity() == 64);
+ ostream(b1) << s;
+ BEAST_EXPECT(buffers_to_string(b1.data()) == s);
+ {
+ flat_static_buffer<64> b2{b1};
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ {
+ flat_static_buffer<64> b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ }
+
+ // cause memmove
+ {
+ flat_static_buffer<10> b;
+ ostream(b) << "12345";
+ b.consume(3);
+ ostream(b) << "67890123";
+ BEAST_EXPECT(buffers_to_string(b.data()) == "4567890123");
+ try
+ {
+ b.prepare(1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ // read_size
+ {
+ flat_static_buffer<10> b;
+ BEAST_EXPECT(read_size(b, 512) == 10);
+ b.prepare(4);
+ b.commit(4);
+ BEAST_EXPECT(read_size(b, 512) == 6);
+ b.consume(2);
+ BEAST_EXPECT(read_size(b, 512) == 8);
+ b.prepare(8);
+ b.commit(8);
+ BEAST_EXPECT(read_size(b, 512) == 0);
+ }
+
+ // base
+ {
+ flat_static_buffer<10> b;
+ [&](flat_static_buffer_base& base)
+ {
+ BEAST_EXPECT(base.max_size() == b.capacity());
+ }
+ (b.base());
+
+ [&](flat_static_buffer_base const& base)
+ {
+ BEAST_EXPECT(base.max_size() == b.capacity());
+ }
+ (b.base());
+ }
+ }
+
+ void run() override
+ {
+ testDynamicBuffer();
+ testMembers();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,flat_static_buffer);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/flat_stream.cpp b/src/boost/libs/beast/test/beast/core/flat_stream.cpp
new file mode 100644
index 000000000..d2ce65faa
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/flat_stream.cpp
@@ -0,0 +1,222 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/flat_stream.hpp>
+
+#include "stream_tests.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/core/role.hpp>
+#include <initializer_list>
+#include <vector>
+
+namespace boost {
+namespace beast {
+
+class flat_stream_test : public unit_test::suite
+{
+public:
+ void
+ testMembers()
+ {
+ net::io_context ioc;
+
+ test_sync_stream<flat_stream<test::stream>>();
+
+ test_async_stream<flat_stream<test::stream>>();
+
+ // read/write
+
+ {
+ error_code ec;
+ flat_stream<test::stream> s(ioc);
+ {
+ // VFALCO Hack to make test stream code = eof
+ test::stream ts(ioc);
+ s.next_layer().connect(ts);
+ }
+ char buf[1];
+ net::mutable_buffer m1 = net::buffer(buf);
+
+ BEAST_EXPECT(s.read_some(net::mutable_buffer{}) == 0);
+ BEAST_EXPECT(s.read_some(net::mutable_buffer{}, ec) == 0);
+ BEAST_EXPECTS(! ec, ec.message());
+
+ try
+ {
+ s.read_some(m1);
+ BEAST_FAIL();
+ }
+ catch(std::exception const&)
+ {
+ BEAST_PASS();
+ }
+ catch(...)
+ {
+ BEAST_FAIL();
+ }
+
+ BEAST_EXPECT(s.write_some(net::const_buffer{}) == 0);
+ BEAST_EXPECT(s.write_some(net::const_buffer{}, ec) == 0);
+ BEAST_EXPECTS(! ec, ec.message());
+
+ try
+ {
+ s.write_some(m1);
+ BEAST_FAIL();
+ }
+ catch(std::exception const&)
+ {
+ BEAST_PASS();
+ }
+ catch(...)
+ {
+ BEAST_FAIL();
+ }
+
+ bool invoked;
+
+ invoked = false;
+ s.async_read_some(net::mutable_buffer{},
+ [&](error_code ec, std::size_t)
+ {
+ invoked = true;
+ BEAST_EXPECTS(! ec, ec.message());
+ });
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(invoked);
+
+ invoked = false;
+ s.async_write_some(net::const_buffer{},
+ [&](error_code ec, std::size_t)
+ {
+ invoked = true;
+ BEAST_EXPECTS(! ec, ec.message());
+ });
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(invoked);
+ }
+
+ // stack_write_some
+
+ {
+ char b[detail::flat_stream_base::max_size];
+ std::array<net::const_buffer, 3> bs;
+ bs[0] = net::const_buffer(b, 100);
+ bs[1] = net::const_buffer(b + 100, 200);
+ bs[2] = net::const_buffer(b + 100 + 200, 300);
+ BEAST_EXPECT(buffer_bytes(bs) <=
+ detail::flat_stream_base::max_stack);
+ flat_stream<test::stream> s(ioc);
+ error_code ec;
+ s.write_some(bs, ec);
+ }
+
+ // write_some
+
+ {
+ char b[detail::flat_stream_base::max_size];
+ std::array<net::const_buffer, 2> bs;
+ bs[0] = net::const_buffer(b,
+ detail::flat_stream_base::max_stack);
+ bs[1] = net::const_buffer(b + bs[0].size(), 1024);
+ BEAST_EXPECT(buffer_bytes(bs) <=
+ detail::flat_stream_base::max_size);
+ flat_stream<test::stream> s(ioc);
+ error_code ec;
+ s.write_some(bs, ec);
+ }
+
+ // async_write_some
+
+ {
+ char b[detail::flat_stream_base::max_size];
+ std::array<net::const_buffer, 2> bs;
+ bs[0] = net::const_buffer(b,
+ detail::flat_stream_base::max_stack);
+ bs[1] = net::const_buffer(b + bs[0].size(), 1024);
+ BEAST_EXPECT(buffer_bytes(bs) <=
+ detail::flat_stream_base::max_size);
+ flat_stream<test::stream> s(ioc);
+ s.async_write_some(bs,
+ [](error_code, std::size_t)
+ {
+ });
+ }
+
+ // teardown
+
+ {
+ test::stream ts(ioc);
+ flat_stream<test::stream> s(ioc);
+ ts.connect(s.next_layer());
+ error_code ec;
+ teardown(role_type::client, s, ec);
+ }
+
+ {
+ test::stream ts(ioc);
+ flat_stream<test::stream> s(ioc);
+ ts.connect(s.next_layer());
+ async_teardown(role_type::client, s,
+ [](error_code)
+ {
+ });
+ }
+ }
+
+ void
+ testSplit()
+ {
+ auto const check =
+ [&](
+ std::initializer_list<int> v0,
+ std::size_t limit,
+ unsigned long count,
+ bool copy)
+ {
+ std::vector<net::const_buffer> v;
+ v.reserve(v0.size());
+ for(auto const n : v0)
+ v.emplace_back("", n);
+ auto const result =
+ boost::beast::detail::flat_stream_base::flatten(v, limit);
+ BEAST_EXPECT(result.size == count);
+ BEAST_EXPECT(result.flatten == copy);
+ return result;
+ };
+ check({}, 1, 0, false);
+ check({1,2}, 1, 1, false);
+ check({1,2}, 2, 1, false);
+ check({1,2}, 3, 3, true);
+ check({1,2}, 4, 3, true);
+ check({1,2,3}, 1, 1, false);
+ check({1,2,3}, 2, 1, false);
+ check({1,2,3}, 3, 3, true);
+ check({1,2,3}, 4, 3, true);
+ check({1,2,3}, 7, 6, true);
+ check({1,2,3,4}, 3, 3, true);
+ }
+
+ void
+ run() override
+ {
+ testMembers();
+ testSplit();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,flat_stream);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/make_printable.cpp b/src/boost/libs/beast/test/beast/core/make_printable.cpp
new file mode 100644
index 000000000..0b081cd43
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/make_printable.cpp
@@ -0,0 +1,66 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/make_printable.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <iostream>
+#include <sstream>
+
+#include "test_buffer.hpp"
+
+namespace boost {
+namespace beast {
+
+class make_printable_test : public beast::unit_test::suite
+{
+public:
+ template <class ConstBufferSequence>
+ void
+ print (ConstBufferSequence const& buffers)
+ {
+ std::cout <<
+ "Buffer size: " << buffer_bytes(buffers) << " bytes\n"
+ "Buffer data: '" << make_printable(buffers) << "'\n";
+ }
+
+ void
+ testJavadoc()
+ {
+ BEAST_EXPECT(&make_printable_test::print<buffers_triple>);
+ }
+
+ void
+ testMakePrintable()
+ {
+ char buf[13];
+ buffers_triple b(buf, sizeof(buf));
+ string_view src = "Hello, world!";
+ BEAST_EXPECT(src.size() == sizeof(buf));
+ net::buffer_copy(b,
+ net::const_buffer(src.data(), src.size()));
+ std::ostringstream ss;
+ ss << make_printable(b);
+ BEAST_EXPECT(ss.str() == src);
+ }
+
+ void
+ run() override
+ {
+ testJavadoc();
+ testMakePrintable();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,make_printable);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/make_strand.cpp b/src/boost/libs/beast/test/beast/core/make_strand.cpp
new file mode 100644
index 000000000..b356c8ebf
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/make_strand.cpp
@@ -0,0 +1,49 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/net::make_strand.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/executor.hpp>
+#include <boost/asio/io_context.hpp>
+
+namespace boost {
+namespace beast {
+
+class make_strand_test : public beast::unit_test::suite
+{
+public:
+ void
+ testFunction()
+ {
+ net::io_context ioc;
+ net::make_strand(ioc);
+ net::make_strand(ioc.get_executor());
+ net::make_strand(net::make_strand(ioc));
+
+ net::executor ex(ioc.get_executor());
+ net::make_strand(ex);
+
+ // this *should-not* compile
+ //net::make_strand(ex.context());
+ }
+
+ void
+ run() override
+ {
+ testFunction();
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,net::make_strand);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/multi_buffer.cpp b/src/boost/libs/beast/test/beast/core/multi_buffer.cpp
new file mode 100644
index 000000000..7d6b90b46
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/multi_buffer.cpp
@@ -0,0 +1,830 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/multi_buffer.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/read_size.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/test/test_allocator.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/buffers_iterator.hpp>
+#include <algorithm>
+#include <atomic>
+#include <cctype>
+#include <memory>
+#include <string>
+
+namespace boost {
+namespace beast {
+
+class multi_buffer_test : public beast::unit_test::suite
+{
+public:
+ BOOST_STATIC_ASSERT(
+ is_mutable_dynamic_buffer<multi_buffer>::value);
+
+#if ! BOOST_WORKAROUND(BOOST_LIBSTDCXX_VERSION, < 50000) && \
+ ! BOOST_WORKAROUND(BOOST_MSVC, < 1910)
+// BOOST_STATIC_ASSERT(std::is_trivially_copyable<
+// multi_buffer::const_buffers_type>::value);
+// BOOST_STATIC_ASSERT(std::is_trivially_copyable<
+// multi_buffer::mutable_data_type>::value);
+#endif
+
+ template<class Alloc1, class Alloc2>
+ static
+ bool
+ eq( basic_multi_buffer<Alloc1> const& mb1,
+ basic_multi_buffer<Alloc2> const& mb2)
+ {
+ return buffers_to_string(mb1.data()) ==
+ buffers_to_string(mb2.data());
+ }
+
+ void
+ testShrinkToFit()
+ {
+ // empty list
+
+ {
+ multi_buffer b;
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 0);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 0);
+ }
+
+ // zero readable bytes
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 0);
+ }
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.commit(32);
+ b.consume(32);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 0);
+ }
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.commit(512);
+ b.prepare(512);
+ b.clear();
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 0);
+ }
+
+ // unused list
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.commit(512);
+ b.prepare(512);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 512);
+ BEAST_EXPECT(b.capacity() == 512);
+ }
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.commit(512);
+ b.prepare(512);
+ b.prepare(1024);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 512);
+ BEAST_EXPECT(b.capacity() == 512);
+ }
+
+ // partial last buffer
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.commit(512);
+ b.prepare(512);
+ b.commit(88);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 600);
+ BEAST_EXPECT(b.capacity() == 600);
+ }
+
+ // shrink front of first buffer
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.commit(512);
+ b.consume(12);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 500);
+ BEAST_EXPECT(b.capacity() == 500);
+ }
+
+ // shrink ends of first buffer
+
+ {
+ multi_buffer b;
+ b.prepare(512);
+ b.commit(500);
+ b.consume(100);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.size() == 400);
+ BEAST_EXPECT(b.capacity() == 400);
+ }
+ }
+
+ void
+ testDynamicBuffer()
+ {
+ multi_buffer b(30);
+ BEAST_EXPECT(b.max_size() == 30);
+ test_dynamic_buffer(b);
+ }
+
+ void
+ testMembers()
+ {
+ using namespace test;
+
+ // compare equal
+ using equal_t = test::test_allocator<char,
+ true, true, true, true, true>;
+
+ // compare not equal
+ using unequal_t = test::test_allocator<char,
+ false, true, true, true, true>;
+
+ // construction
+ {
+ {
+ multi_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ }
+ {
+ multi_buffer b{500};
+ BEAST_EXPECT(b.capacity() == 0);
+ BEAST_EXPECT(b.max_size() == 500);
+ }
+ {
+ unequal_t a1;
+ basic_multi_buffer<unequal_t> b{a1};
+ BEAST_EXPECT(b.get_allocator() == a1);
+ BEAST_EXPECT(b.get_allocator() != unequal_t{});
+ }
+ {
+ unequal_t a1;
+ basic_multi_buffer<unequal_t> b{500, a1};
+ BEAST_EXPECT(b.capacity() == 0);
+ BEAST_EXPECT(b.max_size() == 500);
+ BEAST_EXPECT(b.get_allocator() == a1);
+ BEAST_EXPECT(b.get_allocator() != unequal_t{});
+ }
+ }
+
+ // move construction
+ {
+ {
+ basic_multi_buffer<equal_t> b1{30};
+ BEAST_EXPECT(b1.get_allocator()->nmove == 0);
+ ostream(b1) << "Hello";
+ basic_multi_buffer<equal_t> b2{std::move(b1)};
+ BEAST_EXPECT(b2.get_allocator()->nmove == 1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ BEAST_EXPECT(b1.max_size() == b2.max_size());
+ }
+ // allocators equal
+ {
+ basic_multi_buffer<equal_t> b1{30};
+ ostream(b1) << "Hello";
+ equal_t a;
+ basic_multi_buffer<equal_t> b2{std::move(b1), a};
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ BEAST_EXPECT(b1.max_size() == b2.max_size());
+ }
+ {
+ // allocators unequal
+ basic_multi_buffer<unequal_t> b1{30};
+ ostream(b1) << "Hello";
+ unequal_t a;
+ basic_multi_buffer<unequal_t> b2{std::move(b1), a};
+ BEAST_EXPECT(b1.size() != 0);
+ BEAST_EXPECT(b1.capacity() != 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ BEAST_EXPECT(b1.max_size() == b2.max_size());
+ }
+ }
+
+ // copy construction
+ {
+ {
+ basic_multi_buffer<equal_t> b1;
+ ostream(b1) << "Hello";
+ basic_multi_buffer<equal_t> b2{b1};
+ BEAST_EXPECT(b1.get_allocator() == b2.get_allocator());
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ basic_multi_buffer<unequal_t> b1;
+ ostream(b1) << "Hello";
+ unequal_t a;
+ basic_multi_buffer<unequal_t> b2(b1, a);
+ BEAST_EXPECT(b1.get_allocator() != b2.get_allocator());
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ basic_multi_buffer<equal_t> b1;
+ ostream(b1) << "Hello";
+ basic_multi_buffer<unequal_t> b2(b1);
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ basic_multi_buffer<unequal_t> b1;
+ ostream(b1) << "Hello";
+ equal_t a;
+ basic_multi_buffer<equal_t> b2(b1, a);
+ BEAST_EXPECT(b2.get_allocator() == a);
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ }
+
+ // move assignment
+ {
+ {
+ multi_buffer b1;
+ ostream(b1) << "Hello";
+ multi_buffer b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.capacity() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ using na_t = test::test_allocator<char,
+ false, true, false, true, true>;
+ basic_multi_buffer<na_t> b1;
+ ostream(b1) << "Hello";
+ basic_multi_buffer<na_t> b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.get_allocator() != b2.get_allocator());
+ BEAST_EXPECT(b1.size() != 0);
+ BEAST_EXPECT(b1.capacity() != 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_move_assignment : true
+ using pocma_t = test::test_allocator<char,
+ true, true, true, true, true>;
+ basic_multi_buffer<pocma_t> b1;
+ ostream(b1) << "Hello";
+ basic_multi_buffer<pocma_t> b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_move_assignment : false
+ using pocma_t = test::test_allocator<char,
+ true, true, false, true, true>;
+ basic_multi_buffer<pocma_t> b1;
+ ostream(b1) << "Hello";
+ basic_multi_buffer<pocma_t> b2;
+ b2 = std::move(b1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ }
+
+ // copy assignment
+ {
+ {
+ multi_buffer b1;
+ ostream(b1) << "Hello";
+ multi_buffer b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ basic_multi_buffer<equal_t> b3;
+ b3 = b2;
+ BEAST_EXPECT(buffers_to_string(b3.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_copy_assignment : true
+ using pocca_t = test::test_allocator<char,
+ true, true, true, true, true>;
+ basic_multi_buffer<pocca_t> b1;
+ ostream(b1) << "Hello";
+ basic_multi_buffer<pocca_t> b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ {
+ // propagate_on_container_copy_assignment : false
+ using pocca_t = test::test_allocator<char,
+ true, false, true, true, true>;
+ basic_multi_buffer<pocca_t> b1;
+ ostream(b1) << "Hello";
+ basic_multi_buffer<pocca_t> b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ }
+ }
+
+ // max_size
+ {
+ multi_buffer b{10};
+ BEAST_EXPECT(b.max_size() == 10);
+ b.max_size(32);
+ BEAST_EXPECT(b.max_size() == 32);
+ }
+
+ // allocator max_size
+ {
+ basic_multi_buffer<equal_t> b;
+ auto a = b.get_allocator();
+ BOOST_STATIC_ASSERT(
+ ! std::is_const<decltype(a)>::value);
+ a->max_size = 30;
+ try
+ {
+ b.prepare(1000);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ b.reserve(1000);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+
+ // prepare
+ {
+ {
+ multi_buffer b{100};
+ try
+ {
+ b.prepare(b.max_size() + 1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ string_view const s = "Hello, world!";
+ multi_buffer b1{64};
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.max_size() == 64);
+ BEAST_EXPECT(b1.capacity() == 0);
+ ostream(b1) << s;
+ BEAST_EXPECT(buffers_to_string(b1.data()) == s);
+ {
+ multi_buffer b2{b1};
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ {
+ multi_buffer b2{64};
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ }
+ {
+ multi_buffer b;
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.commit(1);
+ BEAST_EXPECT(b.size() == 1);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(1000);
+ BEAST_EXPECT(b.size() == 1);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(1500);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ }
+ {
+ multi_buffer b;
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.commit(1);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(2000);
+ BEAST_EXPECT(b.capacity() >= 2000);
+ b.commit(2);
+ }
+ {
+ multi_buffer b;
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(2000);
+ BEAST_EXPECT(b.capacity() >= 2000);
+ b.prepare(4000);
+ BEAST_EXPECT(b.capacity() >= 4000);
+ b.prepare(50);
+ BEAST_EXPECT(b.capacity() >= 50);
+ }
+ }
+
+ // commit
+ {
+ {
+ multi_buffer b;
+ b.prepare(16);
+ b.commit(16);
+ auto const n =
+ b.capacity() - b.size();
+ b.prepare(n);
+ b.commit(n);
+ auto const size =
+ b.size();
+ auto const capacity =
+ b.capacity();
+ b.commit(1);
+ BEAST_EXPECT(b.size() == size);
+ BEAST_EXPECT(b.capacity() == capacity);
+ }
+
+ multi_buffer b;
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.commit(1000);
+ BEAST_EXPECT(b.size() == 1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.consume(1000);
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 0);
+ b.prepare(1000);
+ b.commit(650);
+ BEAST_EXPECT(b.size() == 650);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 1650);
+ b.commit(100);
+ BEAST_EXPECT(b.size() == 750);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 2000);
+ b.commit(500);
+ }
+
+ // consume
+ {
+ multi_buffer b;
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.commit(1000);
+ BEAST_EXPECT(b.size() == 1000);
+ BEAST_EXPECT(b.capacity() >= 1000);
+ b.prepare(1000);
+ BEAST_EXPECT(b.capacity() >= 2000);
+ b.commit(750);
+ BEAST_EXPECT(b.size() == 1750);
+ b.consume(500);
+ BEAST_EXPECT(b.size() == 1250);
+ b.consume(500);
+ BEAST_EXPECT(b.size() == 750);
+ b.prepare(250);
+ b.consume(750);
+ BEAST_EXPECT(b.size() == 0);
+ b.prepare(1000);
+ b.commit(800);
+ BEAST_EXPECT(b.size() == 800);
+ b.prepare(1000);
+ b.commit(600);
+ BEAST_EXPECT(b.size() == 1400);
+ b.consume(1400);
+ BEAST_EXPECT(b.size() == 0);
+ }
+
+ // reserve
+ {
+ multi_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ b.reserve(50);
+ BEAST_EXPECT(b.capacity() >= 50);
+ b.prepare(20);
+ b.commit(20);
+ b.reserve(50);
+ BEAST_EXPECT(b.capacity() >= 50);
+ BEAST_EXPECT(b.size() > 1);
+ auto capacity = b.capacity();
+ b.reserve(b.size() - 1);
+ BEAST_EXPECT(b.capacity() == capacity);
+ b.reserve(b.capacity() + 1);
+ BEAST_EXPECT(b.capacity() > capacity);
+ capacity = b.capacity();
+ BEAST_EXPECT(buffers_length(
+ b.prepare(b.capacity() + 200)) > 1);
+ BEAST_EXPECT(b.capacity() > capacity);
+ b.reserve(b.capacity() + 2);
+ BEAST_EXPECT(b.capacity() > capacity);
+ capacity = b.capacity();
+ b.reserve(b.capacity());
+ BEAST_EXPECT(b.capacity() == capacity);
+ }
+
+ // shrink to fit
+ {
+ {
+ multi_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ b.prepare(50);
+ BEAST_EXPECT(b.capacity() >= 50);
+ b.commit(50);
+ BEAST_EXPECT(b.capacity() >= 50);
+ b.prepare(75);
+ BEAST_EXPECT(b.capacity() >= 125);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.capacity() >= b.size());
+ }
+ {
+ multi_buffer b;
+ b.prepare(2000);
+ BEAST_EXPECT(b.capacity() == 2000);
+ b.commit(1800);
+ BEAST_EXPECT(b.size() == 1800);
+ BEAST_EXPECT(b.capacity() == 2000);
+ b.prepare(5000);
+ BEAST_EXPECT(b.capacity() == 6800);
+ b.shrink_to_fit();
+ BEAST_EXPECT(b.capacity() == 2000);
+ }
+ }
+
+ // clear
+ {
+ multi_buffer b;
+ BEAST_EXPECT(b.capacity() == 0);
+ b.prepare(50);
+ b.commit(50);
+ BEAST_EXPECT(b.size() == 50);
+ BEAST_EXPECT(b.capacity() == 512);
+ b.clear();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(b.capacity() == 512);
+ }
+
+ // swap
+ {
+ {
+ // propagate_on_container_swap : true
+ using pocs_t = test::test_allocator<char,
+ false, true, true, true, true>;
+ pocs_t a1, a2;
+ BEAST_EXPECT(a1 != a2);
+ basic_multi_buffer<pocs_t> b1{a1};
+ ostream(b1) << "Hello";
+ basic_multi_buffer<pocs_t> b2{a2};
+ BEAST_EXPECT(b1.get_allocator() == a1);
+ BEAST_EXPECT(b2.get_allocator() == a2);
+ swap(b1, b2);
+ BEAST_EXPECT(b1.get_allocator() == a2);
+ BEAST_EXPECT(b2.get_allocator() == a1);
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ swap(b1, b2);
+ BEAST_EXPECT(b1.get_allocator() == a1);
+ BEAST_EXPECT(b2.get_allocator() == a2);
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(b2.size() == 0);
+ }
+ {
+ // propagate_on_container_swap : false
+ using pocs_t = test::test_allocator<char,
+ true, true, true, false, true>;
+ pocs_t a1, a2;
+ BEAST_EXPECT(a1 == a2);
+ BEAST_EXPECT(a1.id() != a2.id());
+ basic_multi_buffer<pocs_t> b1{a1};
+ ostream(b1) << "Hello";
+ basic_multi_buffer<pocs_t> b2{a2};
+ BEAST_EXPECT(b1.get_allocator() == a1);
+ BEAST_EXPECT(b2.get_allocator() == a2);
+ swap(b1, b2);
+ BEAST_EXPECT(b1.get_allocator().id() == a1.id());
+ BEAST_EXPECT(b2.get_allocator().id() == a2.id());
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == "Hello");
+ swap(b1, b2);
+ BEAST_EXPECT(b1.get_allocator().id() == a1.id());
+ BEAST_EXPECT(b2.get_allocator().id() == a2.id());
+ BEAST_EXPECT(buffers_to_string(b1.data()) == "Hello");
+ BEAST_EXPECT(b2.size() == 0);
+ }
+ }
+
+ // read_size
+ {
+ multi_buffer b{10};
+ BEAST_EXPECT(read_size(b, 512) == 10);
+ b.prepare(4);
+ b.commit(4);
+ BEAST_EXPECT(read_size(b, 512) == 6);
+ b.consume(2);
+ BEAST_EXPECT(read_size(b, 512) == 8);
+ b.prepare(8);
+ b.commit(8);
+ BEAST_EXPECT(read_size(b, 512) == 0);
+ }
+ }
+
+ void
+ testMatrix1()
+ {
+ string_view s = "Hello, world";
+ BEAST_EXPECT(s.size() == 12);
+ for(std::size_t i = 1; i < 12; ++i) {
+ for(std::size_t x = 1; x < 4; ++x) {
+ for(std::size_t y = 1; y < 4; ++y) {
+ std::size_t z = s.size() - (x + y);
+ {
+ multi_buffer b;
+ b.commit(net::buffer_copy(
+ b.prepare(x), net::buffer(s.data(), x)));
+ b.commit(net::buffer_copy(
+ b.prepare(y), net::buffer(s.data()+x, y)));
+ b.commit(net::buffer_copy(
+ b.prepare(z), net::buffer(s.data()+x+y, z)));
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ {
+ multi_buffer mb2{b};
+ BEAST_EXPECT(eq(b, mb2));
+ }
+ {
+ multi_buffer mb2;
+ mb2 = b;
+ BEAST_EXPECT(eq(b, mb2));
+ }
+ {
+ multi_buffer mb2{std::move(b)};
+ BEAST_EXPECT(buffers_to_string(mb2.data()) == s);
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(buffer_bytes(b.data()) == 0);
+ b = std::move(mb2);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ BEAST_EXPECT(mb2.size() == 0);
+ BEAST_EXPECT(buffer_bytes(mb2.data()) == 0);
+ }
+ }
+ }}}
+ }
+
+ void
+ testMatrix2()
+ {
+ using namespace test;
+ std::string const s = "Hello, world";
+ BEAST_EXPECT(s.size() == 12);
+ for(std::size_t i = 1; i < 12; ++i) {
+ for(std::size_t x = 1; x < 4; ++x) {
+ for(std::size_t y = 1; y < 4; ++y) {
+ for(std::size_t t = 1; t < 4; ++ t) {
+ for(std::size_t u = 1; u < 4; ++ u) {
+ std::size_t z = s.size() - (x + y);
+ std::size_t v = s.size() - (t + u);
+ {
+ multi_buffer b;
+ {
+ auto d = b.prepare(z);
+ BEAST_EXPECT(buffer_bytes(d) == z);
+ }
+ {
+ auto d = b.prepare(0);
+ BEAST_EXPECT(buffer_bytes(d) == 0);
+ }
+ {
+ auto d = b.prepare(y);
+ BEAST_EXPECT(buffer_bytes(d) == y);
+ }
+ {
+ auto d = b.prepare(x);
+ BEAST_EXPECT(buffer_bytes(d) == x);
+ b.commit(buffer_copy(d, net::buffer(s.data(), x)));
+ }
+ BEAST_EXPECT(b.size() == x);
+ BEAST_EXPECT(buffer_bytes(b.data()) == b.size());
+ {
+ auto d = b.prepare(x);
+ BEAST_EXPECT(buffer_bytes(d) == x);
+ }
+ {
+ auto d = b.prepare(0);
+ BEAST_EXPECT(buffer_bytes(d) == 0);
+ }
+ {
+ auto d = b.prepare(z);
+ BEAST_EXPECT(buffer_bytes(d) == z);
+ }
+ {
+ auto d = b.prepare(y);
+ BEAST_EXPECT(buffer_bytes(d) == y);
+ b.commit(buffer_copy(d, net::buffer(s.data()+x, y)));
+ }
+ b.commit(1);
+ BEAST_EXPECT(b.size() == x + y);
+ BEAST_EXPECT(buffer_bytes(b.data()) == b.size());
+ {
+ auto d = b.prepare(x);
+ BEAST_EXPECT(buffer_bytes(d) == x);
+ }
+ {
+ auto d = b.prepare(y);
+ BEAST_EXPECT(buffer_bytes(d) == y);
+ }
+ {
+ auto d = b.prepare(0);
+ BEAST_EXPECT(buffer_bytes(d) == 0);
+ }
+ {
+ auto d = b.prepare(z);
+ BEAST_EXPECT(buffer_bytes(d) == z);
+ b.commit(buffer_copy(d, net::buffer(s.data()+x+y, z)));
+ }
+ b.commit(2);
+ BEAST_EXPECT(b.size() == x + y + z);
+ BEAST_EXPECT(buffer_bytes(b.data()) == b.size());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ b.consume(t);
+ {
+ auto d = b.prepare(0);
+ BEAST_EXPECT(buffer_bytes(d) == 0);
+ }
+ BEAST_EXPECT(buffers_to_string(b.data()) ==
+ s.substr(t, std::string::npos));
+ b.consume(u);
+ BEAST_EXPECT(buffers_to_string(b.data()) ==
+ s.substr(t + u, std::string::npos));
+ b.consume(v);
+ BEAST_EXPECT(buffers_to_string(b.data()).empty());
+ b.consume(1);
+ {
+ auto d = b.prepare(0);
+ BEAST_EXPECT(buffer_bytes(d) == 0);
+ }
+ }
+ }}}}}
+ }
+
+ void
+ run() override
+ {
+ testShrinkToFit();
+ testDynamicBuffer();
+ testMembers();
+ testMatrix1();
+ testMatrix2();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,multi_buffer);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/ostream.cpp b/src/boost/libs/beast/test/beast/core/ostream.cpp
new file mode 100644
index 000000000..a1319b885
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/ostream.cpp
@@ -0,0 +1,106 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/ostream.hpp>
+
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/flat_static_buffer.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <ostream>
+
+namespace boost {
+namespace beast {
+
+class ostream_test : public beast::unit_test::suite
+{
+public:
+ void
+ testOstream()
+ {
+ string_view const s = "0123456789abcdef";
+ BEAST_EXPECT(s.size() == 16);
+
+ // overflow
+ {
+ flat_static_buffer<16> b;
+ ostream(b) << s;
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ }
+
+ // max_size
+ {
+ flat_static_buffer<16> b;
+ auto os = ostream(b);
+ os << s;
+ os << '*';
+ BEAST_EXPECT(os.bad());
+ }
+
+ // max_size (exception
+ {
+ flat_static_buffer<16> b;
+ auto os = ostream(b);
+ os.exceptions(os.badbit);
+ os << s;
+ try
+ {
+ os << '*';
+ fail("missing exception", __FILE__, __LINE__);
+ }
+ catch(std::ios_base::failure const&)
+ {
+ pass();
+ }
+ catch(...)
+ {
+ fail("wrong exception", __FILE__, __LINE__);
+ }
+ }
+
+ // flush
+ {
+ // Issue #1853
+ flat_static_buffer<16> b;
+ auto half_view = string_view(s.data(), 8);
+ {
+ auto os = ostream(b);
+ os << half_view;
+ os.flush();
+ }
+ BEAST_EXPECT(buffers_to_string(b.data()) == half_view);
+ }
+
+ {
+ flat_static_buffer<16> b;
+ {
+ auto os = ostream(b);
+ os << string_view(s.data(), 8);
+ os.flush();
+ os << string_view(s.data() + 8, 8);
+ os.flush();
+ }
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ }
+ }
+
+ void
+ run() override
+ {
+ testOstream();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,ostream);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/prepare_buffers.cpp b/src/boost/libs/beast/test/beast/core/prepare_buffers.cpp
new file mode 100644
index 000000000..3a9902de5
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/prepare_buffers.cpp
@@ -0,0 +1,12 @@
+//
+// 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <beast/core/prepare_buffers.hpp>
+
diff --git a/src/boost/libs/beast/test/beast/core/rate_policy.cpp b/src/boost/libs/beast/test/beast/core/rate_policy.cpp
new file mode 100644
index 000000000..bb520945c
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/rate_policy.cpp
@@ -0,0 +1,57 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/rate_policy.hpp>
+#include <boost/core/ignore_unused.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+//[concept_RatePolicy
+class RatePolicy
+{
+ friend class rate_policy_access;
+
+ std::size_t
+ available_read_bytes();
+
+ std::size_t
+ available_write_bytes();
+
+ void
+ transfer_read_bytes(std::size_t);
+
+ void
+ transfer_write_bytes(std::size_t);
+
+ void
+ on_timer();
+};
+//]
+
+namespace boost {
+namespace beast {
+
+class rate_policy_test : public unit_test::suite
+{
+public:
+ void
+ run() override
+ {
+ boost::ignore_unused(unlimited_rate_policy{});
+ boost::ignore_unused(simple_rate_policy{});
+
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,rate_policy);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/read_size.cpp b/src/boost/libs/beast/test/beast/core/read_size.cpp
new file mode 100644
index 000000000..027fa7beb
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/read_size.cpp
@@ -0,0 +1,50 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/read_size.hpp>
+
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/flat_static_buffer.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/core/static_buffer.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+#include <boost/asio/streambuf.hpp>
+
+namespace boost {
+namespace beast {
+
+class read_size_test : public beast::unit_test::suite
+{
+public:
+ template<class DynamicBuffer>
+ void
+ check()
+ {
+ DynamicBuffer buffer;
+ read_size(buffer, 65536);
+ pass();
+ }
+
+ void
+ run() override
+ {
+ check<flat_buffer>();
+ check<flat_static_buffer<1024>>();
+ check<multi_buffer>();
+ check<static_buffer<1024>>();
+ check<net::streambuf>();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,read_size);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/role.cpp b/src/boost/libs/beast/test/beast/core/role.cpp
new file mode 100644
index 000000000..51b32ea1f
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/role.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/role.hpp>
diff --git a/src/boost/libs/beast/test/beast/core/saved_handler.cpp b/src/boost/libs/beast/test/beast/core/saved_handler.cpp
new file mode 100644
index 000000000..57a105c63
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/saved_handler.cpp
@@ -0,0 +1,144 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/saved_handler.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <stdexcept>
+
+namespace boost {
+namespace beast {
+
+//------------------------------------------------------------------------------
+
+class saved_handler_test : public unit_test::suite
+{
+public:
+ class handler
+ {
+ bool failed_ = true;
+ bool throw_on_move_ = false;
+
+ public:
+ handler() = default;
+ handler(handler const&) = delete;
+ handler& operator=(handler&&) = delete;
+ handler& operator=(handler const&) = delete;
+
+ ~handler()
+ {
+ BEAST_EXPECT(! failed_);
+ }
+
+ handler(handler&& other)
+ : failed_(boost::exchange(
+ other.failed_, false))
+ {
+ if(throw_on_move_)
+ throw std::bad_alloc{};
+ }
+
+ void
+ operator()()
+ {
+ failed_ = false;
+ }
+ };
+
+ class unhandler
+ {
+ bool invoked_ = false;
+
+ public:
+ unhandler() = default;
+ unhandler(unhandler const&) = delete;
+ unhandler& operator=(unhandler&&) = delete;
+ unhandler& operator=(unhandler const&) = delete;
+
+ ~unhandler()
+ {
+ BEAST_EXPECT(! invoked_);
+ }
+
+ unhandler(unhandler&& other)
+ : invoked_(boost::exchange(
+ other.invoked_, false))
+ {
+ }
+
+ void
+ operator()()
+ {
+ invoked_ = true;
+ }
+ };
+
+ struct throwing_handler
+ {
+ throwing_handler() = default;
+
+ throwing_handler(throwing_handler&&)
+ {
+ BOOST_THROW_EXCEPTION(std::exception{});
+ }
+
+ void
+ operator()()
+ {
+ }
+ };
+
+ void
+ testSavedHandler()
+ {
+ {
+ saved_handler sh;
+ BEAST_EXPECT(! sh.has_value());
+
+ sh.emplace(handler{});
+ BEAST_EXPECT(sh.has_value());
+ sh.invoke();
+ BEAST_EXPECT(! sh.has_value());
+
+ sh.emplace(handler{}, std::allocator<char>{});
+ BEAST_EXPECT(sh.has_value());
+ sh.invoke();
+ BEAST_EXPECT(! sh.has_value());
+
+ sh.emplace(unhandler{});
+ BEAST_EXPECT(sh.has_value());
+ }
+
+ {
+ saved_handler sh;
+ try
+ {
+ sh.emplace(throwing_handler{});
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ BEAST_EXPECT(! sh.has_value());
+ }
+ }
+
+ void
+ run() override
+ {
+ testSavedHandler();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,saved_handler);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/span.cpp b/src/boost/libs/beast/test/beast/core/span.cpp
new file mode 100644
index 000000000..96b6a774a
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/span.cpp
@@ -0,0 +1,62 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/span.hpp>
+
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+#include <vector>
+
+namespace boost {
+namespace beast {
+
+class span_test : public beast::unit_test::suite
+{
+public:
+ BOOST_STATIC_ASSERT(
+ detail::is_contiguous_container<
+ string_view, char const>::value);
+
+ struct base {};
+ struct derived : base {};
+
+ BOOST_STATIC_ASSERT(detail::is_contiguous_container<
+ std::vector<char>, char>::value);
+
+ BOOST_STATIC_ASSERT(detail::is_contiguous_container<
+ std::vector<char>, char const>::value);
+
+ BOOST_STATIC_ASSERT(! detail::is_contiguous_container<
+ std::vector<derived>, base>::value);
+
+ BOOST_STATIC_ASSERT(! detail::is_contiguous_container<
+ std::vector<derived>, base const>::value);
+
+ void
+ testSpan()
+ {
+ span<char const> sp{"hello", 5};
+ BEAST_EXPECT(sp.size() == 5);
+ std::string s("world");
+ sp = s;
+ }
+
+ void
+ run() override
+ {
+ testSpan();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,span);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/static_buffer.cpp b/src/boost/libs/beast/test/beast/core/static_buffer.cpp
new file mode 100644
index 000000000..9a8b55a72
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/static_buffer.cpp
@@ -0,0 +1,184 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/static_buffer.hpp>
+
+#include "test_buffer.hpp"
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/read_size.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/buffers_iterator.hpp>
+#include <algorithm>
+#include <cctype>
+#include <string>
+
+namespace boost {
+namespace beast {
+
+class static_buffer_test : public beast::unit_test::suite
+{
+public:
+ BOOST_STATIC_ASSERT(
+ is_mutable_dynamic_buffer<
+ static_buffer<13>>::value);
+
+ BOOST_STATIC_ASSERT(
+ is_mutable_dynamic_buffer<
+ static_buffer_base>::value);
+
+ void
+ testDynamicBuffer()
+ {
+ test_dynamic_buffer(static_buffer<13>{});
+ }
+
+ void
+ testMembers()
+ {
+ string_view const s = "Hello, world!";
+
+ // static_buffer_base
+ {
+ char buf[64];
+ static_buffer_base b{buf, sizeof(buf)};
+ ostream(b) << s;
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ b.clear();
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(buffer_bytes(b.data()) == 0);
+ }
+
+ // static_buffer
+ {
+ static_buffer<64> b1;
+ BEAST_EXPECT(b1.size() == 0);
+ BEAST_EXPECT(b1.max_size() == 64);
+ BEAST_EXPECT(b1.capacity() == 64);
+ ostream(b1) << s;
+ BEAST_EXPECT(buffers_to_string(b1.data()) == s);
+ {
+ static_buffer<64> b2{b1};
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ {
+ static_buffer<64> b2;
+ b2 = b1;
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s);
+ b2.consume(7);
+ BEAST_EXPECT(buffers_to_string(b2.data()) == s.substr(7));
+ }
+ }
+
+ // cause memmove
+ {
+ static_buffer<10> b;
+ ostream(b) << "12345";
+ b.consume(3);
+ ostream(b) << "67890123";
+ BEAST_EXPECT(buffers_to_string(b.data()) == "4567890123");
+ try
+ {
+ b.prepare(1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ // read_size
+ {
+ static_buffer<10> b;
+ BEAST_EXPECT(read_size(b, 512) == 10);
+ b.prepare(4);
+ b.commit(4);
+ BEAST_EXPECT(read_size(b, 512) == 6);
+ b.consume(2);
+ BEAST_EXPECT(read_size(b, 512) == 8);
+ b.prepare(8);
+ b.commit(8);
+ BEAST_EXPECT(read_size(b, 512) == 0);
+ }
+
+ // base
+ {
+ static_buffer<10> b;
+ [&](static_buffer_base& base)
+ {
+ BEAST_EXPECT(base.max_size() == b.capacity());
+ }
+ (b.base());
+
+ [&](static_buffer_base const& base)
+ {
+ BEAST_EXPECT(base.max_size() == b.capacity());
+ }
+ (b.base());
+ }
+
+ // This exercises the wrap-around cases
+ // for the circular buffer representation
+ {
+ static_buffer<5> b;
+ {
+ auto const mb = b.prepare(5);
+ BEAST_EXPECT(buffers_length(mb) == 1);
+ }
+ b.commit(4);
+ BEAST_EXPECT(buffers_length(b.data()) == 1);
+ BEAST_EXPECT(buffers_length(b.cdata()) == 1);
+ b.consume(3);
+ {
+ auto const mb = b.prepare(3);
+ BEAST_EXPECT(buffers_length(mb) == 2);
+ auto it1 = mb.begin();
+ auto it2 = std::next(it1);
+ BEAST_EXPECT(
+ net::const_buffer(*it1).data() >
+ net::const_buffer(*it2).data());
+ }
+ b.commit(2);
+ {
+ auto const mb = b.data();
+ auto it1 = mb.begin();
+ auto it2 = std::next(it1);
+ BEAST_EXPECT(
+ net::const_buffer(*it1).data() >
+ net::const_buffer(*it2).data());
+ }
+ {
+ auto const cb = b.cdata();
+ auto it1 = cb.begin();
+ auto it2 = std::next(it1);
+ BEAST_EXPECT(
+ net::const_buffer(*it1).data() >
+ net::const_buffer(*it2).data());
+ }
+ }
+ }
+
+ void
+ run() override
+ {
+ testDynamicBuffer();
+ testMembers();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,static_buffer);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/static_string.cpp b/src/boost/libs/beast/test/beast/core/static_string.cpp
new file mode 100644
index 000000000..6e14715ae
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/static_string.cpp
@@ -0,0 +1,1481 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/static_string.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+
+class static_string_test : public beast::unit_test::suite
+{
+public:
+ void
+ testConstruct()
+ {
+ {
+ static_string<1> s;
+ BEAST_EXPECT(s.empty());
+ BEAST_EXPECT(s.size() == 0);
+ BEAST_EXPECT(s == "");
+ BEAST_EXPECT(*s.end() == 0);
+ }
+ {
+ static_string<4> s1(3, 'x');
+ BEAST_EXPECT(! s1.empty());
+ BEAST_EXPECT(s1.size() == 3);
+ BEAST_EXPECT(s1 == "xxx");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<2> s2(3, 'x');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("12345");
+ BEAST_EXPECT(*s1.end() == 0);
+ static_string<3> s2(s1, 2);
+ BEAST_EXPECT(s2 == "345");
+ BEAST_EXPECT(*s2.end() == 0);
+ static_string<0> s3(s1, 5);
+ BEAST_EXPECT(s3.empty());
+ BEAST_EXPECT(s3.front() == 0);
+ BEAST_EXPECT(*s3.end() == 0);
+ }
+ {
+ static_string<5> s1("12345");
+ static_string<2> s2(s1, 1, 2);
+ BEAST_EXPECT(s2 == "23");
+ BEAST_EXPECT(*s2.end() == 0);
+ static_string<0> s3(s1, 5, 1);
+ BEAST_EXPECT(s3.empty());
+ BEAST_EXPECT(s3.front() == 0);
+ BEAST_EXPECT(*s3.end() == 0);
+ try
+ {
+ static_string<5> s4(s1, 6);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("UVXYZ", 3);
+ BEAST_EXPECT(s1 == "UVX");
+ BEAST_EXPECT(*s1.end() == 0);
+ static_string<5> s2("X\0""Y\0""Z", 3);
+ BEAST_EXPECT(std::memcmp(
+ s2.data(), "X\0""Y", 3) == 0);
+ BEAST_EXPECT(*s2.end() == 0);
+ }
+ {
+ static_string<5> s1("12345");
+ static_string<3> s2(
+ s1.begin() + 1, s1.begin() + 3);
+ BEAST_EXPECT(s2 == "23");
+ BEAST_EXPECT(*s2.end() == 0);
+ }
+ {
+ static_string<5> s1("12345");
+ static_string<5> s2(s1);
+ BEAST_EXPECT(s2 == "12345");
+ BEAST_EXPECT(*s2.end() == 0);
+ static_string<6> s3(s1);
+ BEAST_EXPECT(s3 == "12345");
+ BEAST_EXPECT(*s3.end() == 0);
+ try
+ {
+ static_string<4> s4(s1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1({'1', '2', '3'});
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ BEAST_EXPECT(
+ static_string<0>({}) == static_string<0>());
+ try
+ {
+ static_string<2> s2({'1', '2', '3'});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1(
+ string_view("123"));
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<2> s2(
+ string_view("123"));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1(
+ std::string("12345"), 2, 2);
+ BEAST_EXPECT(s1 == "34");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<2> s2(
+ std::string("12345"), 1, 3);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ }
+
+ void
+ testAssign()
+ {
+ {
+ static_string<3> s1("123");
+ static_string<3> s2;
+ s2 = s1;
+ BEAST_EXPECT(s2 == "123");
+ BEAST_EXPECT(*s2.end() == 0);
+ }
+ {
+ static_string<3> s1("123");
+ static_string<5> s2;
+ s2 = s1;
+ BEAST_EXPECT(s2 == "123");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ static_string<1> s3;
+ s3 = s1;
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1;
+ s1 = "123";
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<1> s2;
+ s2 = "123";
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<1> s1;
+ s1 = 'x';
+ BEAST_EXPECT(s1 == "x");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<0> s2;
+ s2 = 'x';
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1;
+ s1 = {'1', '2', '3'};
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<1> s2;
+ s2 = {'1', '2', '3'};
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1;
+ s1 = string_view("123");
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<1> s2;
+ s2 = string_view("123");
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ {
+ static_string<4> s1;
+ s1.assign(3, 'x');
+ BEAST_EXPECT(s1 == "xxx");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<2> s2;
+ s2.assign(3, 'x');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("12345");
+ BEAST_EXPECT(*s1.end() == 0);
+ static_string<5> s2;
+ s2.assign(s1);
+ BEAST_EXPECT(s2 == "12345");
+ BEAST_EXPECT(*s2.end() == 0);
+ }
+ {
+ static_string<5> s1("12345");
+ BEAST_EXPECT(*s1.end() == 0);
+ static_string<7> s2;
+ s2.assign(s1);
+ BEAST_EXPECT(s2 == "12345");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ static_string<3> s3;
+ s3.assign(s1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("12345");
+ static_string<5> s2;
+ s2.assign(s1, 1);
+ BEAST_EXPECT(s2 == "2345");
+ BEAST_EXPECT(*s2.end() == 0);
+ s2.assign(s1, 1, 2);
+ BEAST_EXPECT(s2 == "23");
+ BEAST_EXPECT(*s2.end() == 0);
+ s2.assign(s1, 1, 100);
+ BEAST_EXPECT(s2 == "2345");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ s2.assign(s1, 6);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<3> s3;
+ s3.assign(s1, 1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1;
+ s1.assign("12");
+ BEAST_EXPECT(s1 == "12");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1.assign("12345");
+ BEAST_EXPECT(s1 == "12345");
+ BEAST_EXPECT(*s1.end() == 0);
+ }
+ {
+ static_string<5> s1;
+ s1.assign("12345", 3);
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ }
+ {
+ static_string<5> s1("12345");
+ static_string<3> s2;
+ s2.assign(s1.begin(), s1.begin() + 2);
+ BEAST_EXPECT(s2 == "12");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ s2.assign(s1.begin(), s1.end());
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1;
+ s1.assign({'1', '2', '3'});
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<1> s2;
+ s2.assign({'1', '2', '3'});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1;
+ s1.assign(string_view("123"));
+ BEAST_EXPECT(s1 == "123");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1.assign(string_view("12345"));
+ BEAST_EXPECT(s1 == "12345");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ s1.assign(string_view("1234567"));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1;
+ s1.assign(std::string("12345"), 2, 2);
+ BEAST_EXPECT(s1 == "34");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1.assign(std::string("12345"), 3);
+ BEAST_EXPECT(s1 == "45");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<2> s2;
+ s2.assign(
+ std::string("12345"), 1, 3);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ }
+
+ void
+ testAccess()
+ {
+ {
+ static_string<5> s("12345");
+ BEAST_EXPECT(s.at(1) == '2');
+ BEAST_EXPECT(s.at(4) == '5');
+ try
+ {
+ BEAST_EXPECT(s.at(5) == 0);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> const s("12345");
+ BEAST_EXPECT(s.at(1) == '2');
+ BEAST_EXPECT(s.at(4) == '5');
+ try
+ {
+ BEAST_EXPECT(s.at(5) == 0);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s("12345");
+ BEAST_EXPECT(s[1] == '2');
+ BEAST_EXPECT(s[4] == '5');
+ s[1] = '_';
+ BEAST_EXPECT(s == "1_345");
+ }
+ {
+ static_string<5> const s("12345");
+ BEAST_EXPECT(s[1] == '2');
+ BEAST_EXPECT(s[4] == '5');
+ BEAST_EXPECT(s[5] == 0);
+ }
+ {
+ static_string<3> s("123");
+ BEAST_EXPECT(s.front() == '1');
+ BEAST_EXPECT(s.back() == '3');
+ s.front() = '_';
+ BEAST_EXPECT(s == "_23");
+ s.back() = '_';
+ BEAST_EXPECT(s == "_2_");
+ }
+ {
+ static_string<3> const s("123");
+ BEAST_EXPECT(s.front() == '1');
+ BEAST_EXPECT(s.back() == '3');
+ }
+ {
+ static_string<3> s("123");
+ BEAST_EXPECT(std::memcmp(
+ s.data(), "123", 3) == 0);
+ }
+ {
+ static_string<3> const s("123");
+ BEAST_EXPECT(std::memcmp(
+ s.data(), "123", 3) == 0);
+ }
+ {
+ static_string<3> s("123");
+ BEAST_EXPECT(std::memcmp(
+ s.c_str(), "123\0", 4) == 0);
+ }
+ {
+ static_string<3> s("123");
+ string_view sv = s;
+ BEAST_EXPECT(static_string<5>(sv) == "123");
+ }
+ }
+
+ void
+ testIterators()
+ {
+ {
+ static_string<3> s;
+ BEAST_EXPECT(std::distance(
+ s.begin(), s.end()) == 0);
+ BEAST_EXPECT(std::distance(
+ s.rbegin(), s.rend()) == 0);
+ s = "123";
+ BEAST_EXPECT(std::distance(
+ s.begin(), s.end()) == 3);
+ BEAST_EXPECT(std::distance(
+ s.rbegin(), s.rend()) == 3);
+ }
+ {
+ static_string<3> const s("123");
+ BEAST_EXPECT(std::distance(
+ s.begin(), s.end()) == 3);
+ BEAST_EXPECT(std::distance(
+ s.cbegin(), s.cend()) == 3);
+ BEAST_EXPECT(std::distance(
+ s.rbegin(), s.rend()) == 3);
+ BEAST_EXPECT(std::distance(
+ s.crbegin(), s.crend()) == 3);
+ }
+ }
+
+ void
+ testCapacity()
+ {
+ static_string<3> s;
+ BEAST_EXPECT(s.empty());
+ BEAST_EXPECT(s.size() == 0);
+ BEAST_EXPECT(s.length() == 0);
+ BEAST_EXPECT(s.max_size() == 3);
+ BEAST_EXPECT(s.capacity() == 3);
+ s = "123";
+ BEAST_EXPECT(! s.empty());
+ BEAST_EXPECT(s.size() == 3);
+ BEAST_EXPECT(s.length() == 3);
+ s.reserve(0);
+ s.reserve(3);
+ try
+ {
+ s.reserve(4);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ s.shrink_to_fit();
+ BEAST_EXPECT(! s.empty());
+ BEAST_EXPECT(s.size() == 3);
+ BEAST_EXPECT(s.length() == 3);
+ BEAST_EXPECT(*s.end() == 0);
+ }
+
+ void
+ testOperations()
+ {
+ //
+ // clear
+ //
+
+ {
+ static_string<3> s("123");
+ s.clear();
+ BEAST_EXPECT(s.empty());
+ BEAST_EXPECT(*s.end() == 0);
+ }
+
+ //
+ // insert
+ //
+
+ {
+ // Using 7 as the size causes a miscompile in MSVC14.2 x64 Release
+ static_string<8> s1("12345");
+ s1.insert(2, 2, '_');
+ BEAST_EXPECT(s1 == "12__345");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(2, 2, '_');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(6, 2, '_');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<7> s1("12345");
+ s1.insert(2, "__");
+ BEAST_EXPECT(s1 == "12__345");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(2, "__");
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(6, "__");
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<7> s1("12345");
+ s1.insert(2, "TUV", 2);
+ BEAST_EXPECT(s1 == "12TU345");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(2, "TUV", 2);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(6, "TUV", 2);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<7> s1("12345");
+ s1.insert(2, static_string<3>("TU"));
+ BEAST_EXPECT(s1 == "12TU345");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(2, static_string<3>("TUV"));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(6, static_string<3>("TUV"));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<7> s1("12345");
+ s1.insert(2, static_string<3>("TUV"), 1);
+ BEAST_EXPECT(s1 == "12UV345");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1 = "12345";
+ s1.insert(2, static_string<3>("TUV"), 1, 1);
+ BEAST_EXPECT(s1 == "12U345");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(2, static_string<3>("TUV"), 1, 2);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<6> s2("12345");
+ s2.insert(6, static_string<3>("TUV"), 1, 2);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<4> s1("123");
+ s1.insert(s1.begin() + 1, '_');
+ BEAST_EXPECT(s1 == "1_23");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<3> s2("123");
+ s2.insert(s2.begin() + 1, '_');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<4> s1("12");
+ s1.insert(s1.begin() + 1, 2, '_');
+ BEAST_EXPECT(s1 == "1__2");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<4> s2("123");
+ s2.insert(s2.begin() + 1, 2, ' ');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1("123");
+ static_string<5> s2("UV");
+ s2.insert(s2.begin() + 1, s1.begin(), s1.end());
+ BEAST_EXPECT(s2 == "U123V");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ static_string<4> s3("UV");
+ s3.insert(s3.begin() + 1, s1.begin(), s1.end());
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("123");
+ s1.insert(1, string_view("UV"));
+ BEAST_EXPECT(s1 == "1UV23");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<4> s2("123");
+ s2.insert(1, string_view("UV"));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<5> s2("123");
+ s2.insert(5, string_view("UV"));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("123");
+ s1.insert(1, std::string("UV"));
+ BEAST_EXPECT(s1 == "1UV23");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ s1.insert(1, std::string("UV"));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<6> s1("123");
+ s1.insert(1, std::string("UVX"), 1);
+ BEAST_EXPECT(s1 == "1VX23");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1.insert(4, std::string("PQR"), 1, 1);
+ BEAST_EXPECT(s1 == "1VX2Q3");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ s1.insert(4, std::string("PQR"), 1, 1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ //
+ // erase
+ //
+
+ {
+ static_string<9> s1("123456789");
+ BEAST_EXPECT(s1.erase(1, 1) == "13456789");
+ BEAST_EXPECT(s1 == "13456789");
+ BEAST_EXPECT(*s1.end() == 0);
+ BEAST_EXPECT(s1.erase(5) == "13456");
+ BEAST_EXPECT(s1 == "13456");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ s1.erase(7);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<9> s1("123456789");
+ BEAST_EXPECT(*s1.erase(s1.begin() + 5) == '7');
+ BEAST_EXPECT(s1 == "12345789");
+ BEAST_EXPECT(*s1.end() == 0);
+ }
+ {
+ static_string<9> s1("123456789");
+ BEAST_EXPECT(*s1.erase(
+ s1.begin() + 5, s1.begin() + 7) == '8');
+ BEAST_EXPECT(s1 == "1234589");
+ BEAST_EXPECT(*s1.end() == 0);
+ }
+
+ //
+ // push_back
+ //
+
+ {
+ static_string<3> s1("12");
+ s1.push_back('3');
+ BEAST_EXPECT(s1 == "123");
+ try
+ {
+ s1.push_back('4');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ static_string<0> s2;
+ try
+ {
+ s2.push_back('_');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ //
+ // pop_back
+ //
+
+ {
+ static_string<3> s1("123");
+ s1.pop_back();
+ BEAST_EXPECT(s1 == "12");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1.pop_back();
+ BEAST_EXPECT(s1 == "1");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1.pop_back();
+ BEAST_EXPECT(s1.empty());
+ BEAST_EXPECT(*s1.end() == 0);
+ }
+
+ //
+ // append
+ //
+
+ {
+ static_string<3> s1("1");
+ s1.append(2, '_');
+ BEAST_EXPECT(s1 == "1__");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<2> s2("1");
+ s2.append(2, '_');
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<2> s1("__");
+ static_string<3> s2("1");
+ s2.append(s1);
+ BEAST_EXPECT(s2 == "1__");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ static_string<2> s3("1");
+ s3.append(s1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1("XYZ");
+ static_string<4> s2("12");
+ s2.append(s1, 1);
+ BEAST_EXPECT(s2 == "12YZ");
+ BEAST_EXPECT(*s2.end() == 0);
+ static_string<3> s3("12");
+ s3.append(s1, 1, 1);
+ BEAST_EXPECT(s3 == "12Y");
+ BEAST_EXPECT(*s3.end() == 0);
+ try
+ {
+ static_string<3> s4("12");
+ s4.append(s1, 3);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::out_of_range const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<3> s4("12");
+ s4.append(s1, 1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<4> s1("12");
+ s1.append("XYZ", 2);
+ BEAST_EXPECT(s1 == "12XY");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<3> s3("12");
+ s3.append("XYZ", 2);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("12");
+ s1.append("XYZ");
+ BEAST_EXPECT(s1 == "12XYZ");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<4> s2("12");
+ s2.append("XYZ");
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1("XYZ");
+ static_string<5> s2("12");
+ s2.append(s1.begin(), s1.end());
+ BEAST_EXPECT(s2 == "12XYZ");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ static_string<4> s3("12");
+ s3.append(s1.begin(), s1.end());
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<5> s1("123");
+ s1.append({'X', 'Y'});
+ BEAST_EXPECT(s1 == "123XY");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<4> s2("123");
+ s2.append({'X', 'Y'});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ string_view s1("XYZ");
+ static_string<5> s2("12");
+ s2.append(s1);
+ BEAST_EXPECT(s2 == "12XYZ");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ static_string<4> s3("12");
+ s3.append(s1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<6> s1("123");
+ s1.append(std::string("UVX"), 1);
+ BEAST_EXPECT(s1 == "123VX");
+ BEAST_EXPECT(*s1.end() == 0);
+ s1.append(std::string("PQR"), 1, 1);
+ BEAST_EXPECT(s1 == "123VXQ");
+ BEAST_EXPECT(*s1.end() == 0);
+ try
+ {
+ static_string<3> s2("123");
+ s2.append(std::string("PQR"), 1, 1);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+
+ //
+ // operator+=
+ //
+
+ {
+ static_string<2> s1("__");
+ static_string<3> s2("1");
+ s2 += s1;
+ BEAST_EXPECT(s2 == "1__");
+ BEAST_EXPECT(*s2.end() == 0);
+ try
+ {
+ static_string<2> s3("1");
+ s3 += s1;
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<3> s1("12");
+ s1 += '3';
+ BEAST_EXPECT(s1 == "123");
+ try
+ {
+ s1 += '4';
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<4> s1("12");
+ s1 += "34";
+ BEAST_EXPECT(s1 == "1234");
+ try
+ {
+ s1 += "5";
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ static_string<4> s1("12");
+ s1 += {'3', '4'};
+ BEAST_EXPECT(s1 == "1234");
+ try
+ {
+ s1 += {'5'};
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ {
+ string_view s1("34");
+ static_string<4> s2("12");
+ s2 += s1;
+ BEAST_EXPECT(s2 == "1234");
+ try
+ {
+ s2 += s1;
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ }
+
+ void
+ testCompare()
+ {
+ using str1 = static_string<1>;
+ using str2 = static_string<2>;
+ {
+ str1 s1;
+ str2 s2;
+ s1 = "1";
+ s2 = "22";
+ BEAST_EXPECT(s1.compare(s2) < 0);
+ BEAST_EXPECT(s2.compare(s1) > 0);
+ BEAST_EXPECT(s1 < "10");
+ BEAST_EXPECT(s2 > "1");
+ BEAST_EXPECT("10" > s1);
+ BEAST_EXPECT("1" < s2);
+ BEAST_EXPECT(s1 < "20");
+ BEAST_EXPECT(s2 > "1");
+ BEAST_EXPECT(s2 > "2");
+ }
+ {
+ str2 s1("x");
+ str2 s2("x");
+ BEAST_EXPECT(s1 == s2);
+ BEAST_EXPECT(s1 <= s2);
+ BEAST_EXPECT(s1 >= s2);
+ BEAST_EXPECT(! (s1 < s2));
+ BEAST_EXPECT(! (s1 > s2));
+ BEAST_EXPECT(! (s1 != s2));
+ }
+ {
+ str1 s1("x");
+ str2 s2("x");
+ BEAST_EXPECT(s1 == s2);
+ BEAST_EXPECT(s1 <= s2);
+ BEAST_EXPECT(s1 >= s2);
+ BEAST_EXPECT(! (s1 < s2));
+ BEAST_EXPECT(! (s1 > s2));
+ BEAST_EXPECT(! (s1 != s2));
+ }
+ {
+ str2 s("x");
+ BEAST_EXPECT(s == "x");
+ BEAST_EXPECT(s <= "x");
+ BEAST_EXPECT(s >= "x");
+ BEAST_EXPECT(! (s < "x"));
+ BEAST_EXPECT(! (s > "x"));
+ BEAST_EXPECT(! (s != "x"));
+ BEAST_EXPECT("x" == s);
+ BEAST_EXPECT("x" <= s);
+ BEAST_EXPECT("x" >= s);
+ BEAST_EXPECT(! ("x" < s));
+ BEAST_EXPECT(! ("x" > s));
+ BEAST_EXPECT(! ("x" != s));
+ }
+ {
+ str2 s("x");
+ BEAST_EXPECT(s <= "y");
+ BEAST_EXPECT(s < "y");
+ BEAST_EXPECT(s != "y");
+ BEAST_EXPECT(! (s == "y"));
+ BEAST_EXPECT(! (s >= "y"));
+ BEAST_EXPECT(! (s > "x"));
+ BEAST_EXPECT("y" >= s);
+ BEAST_EXPECT("y" > s);
+ BEAST_EXPECT("y" != s);
+ BEAST_EXPECT(! ("y" == s));
+ BEAST_EXPECT(! ("y" <= s));
+ BEAST_EXPECT(! ("y" < s));
+ }
+ {
+ str1 s1("x");
+ str2 s2("y");
+ BEAST_EXPECT(s1 <= s2);
+ BEAST_EXPECT(s1 < s2);
+ BEAST_EXPECT(s1 != s2);
+ BEAST_EXPECT(! (s1 == s2));
+ BEAST_EXPECT(! (s1 >= s2));
+ BEAST_EXPECT(! (s1 > s2));
+ }
+ {
+ str1 s1("x");
+ str2 s2("xx");
+ BEAST_EXPECT(s1 < s2);
+ BEAST_EXPECT(s2 > s1);
+ }
+ {
+ str1 s1("x");
+ str2 s2("yy");
+ BEAST_EXPECT(s1 < s2);
+ BEAST_EXPECT(s2 > s1);
+ }
+ }
+
+ void
+ testSwap()
+ {
+ {
+ static_string<3> s1("123");
+ static_string<3> s2("XYZ");
+ swap(s1, s2);
+ BEAST_EXPECT(s1 == "XYZ");
+ BEAST_EXPECT(*s1.end() == 0);
+ BEAST_EXPECT(s2 == "123");
+ BEAST_EXPECT(*s2.end() == 0);
+ static_string<3> s3("UV");
+ swap(s2, s3);
+ BEAST_EXPECT(s2 == "UV");
+ BEAST_EXPECT(*s2.end() == 0);
+ BEAST_EXPECT(s3 == "123");
+ BEAST_EXPECT(*s3.end() == 0);
+ }
+ {
+ static_string<5> s1("123");
+ static_string<7> s2("XYZ");
+ swap(s1, s2);
+ BEAST_EXPECT(s1 == "XYZ");
+ BEAST_EXPECT(*s1.end() == 0);
+ BEAST_EXPECT(s2 == "123");
+ BEAST_EXPECT(*s2.end() == 0);
+ static_string<3> s3("UV");
+ swap(s2, s3);
+ BEAST_EXPECT(s2 == "UV");
+ BEAST_EXPECT(*s2.end() == 0);
+ BEAST_EXPECT(s3 == "123");
+ BEAST_EXPECT(*s3.end() == 0);
+ try
+ {
+ static_string<5> s4("12345");
+ static_string<3> s5("XYZ");
+ swap(s4, s5);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ try
+ {
+ static_string<3> s4("XYZ");
+ static_string<5> s5("12345");
+ swap(s4, s5);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ }
+
+ void
+ testGeneral()
+ {
+ using str1 = static_string<1>;
+ using str2 = static_string<2>;
+ {
+ str1 s1;
+ BEAST_EXPECT(s1 == "");
+ BEAST_EXPECT(s1.empty());
+ BEAST_EXPECT(s1.size() == 0);
+ BEAST_EXPECT(s1.max_size() == 1);
+ BEAST_EXPECT(s1.capacity() == 1);
+ BEAST_EXPECT(s1.begin() == s1.end());
+ BEAST_EXPECT(s1.cbegin() == s1.cend());
+ BEAST_EXPECT(s1.rbegin() == s1.rend());
+ BEAST_EXPECT(s1.crbegin() == s1.crend());
+ try
+ {
+ BEAST_EXPECT(s1.at(0) == 0);
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ BEAST_EXPECT(s1.data()[0] == 0);
+ BEAST_EXPECT(*s1.c_str() == 0);
+ BEAST_EXPECT(std::distance(s1.begin(), s1.end()) == 0);
+ BEAST_EXPECT(std::distance(s1.cbegin(), s1.cend()) == 0);
+ BEAST_EXPECT(std::distance(s1.rbegin(), s1.rend()) == 0);
+ BEAST_EXPECT(std::distance(s1.crbegin(), s1.crend()) == 0);
+ BEAST_EXPECT(s1.compare(s1) == 0);
+ }
+ {
+ str1 const s1;
+ BEAST_EXPECT(s1 == "");
+ BEAST_EXPECT(s1.empty());
+ BEAST_EXPECT(s1.size() == 0);
+ BEAST_EXPECT(s1.max_size() == 1);
+ BEAST_EXPECT(s1.capacity() == 1);
+ BEAST_EXPECT(s1.begin() == s1.end());
+ BEAST_EXPECT(s1.cbegin() == s1.cend());
+ BEAST_EXPECT(s1.rbegin() == s1.rend());
+ BEAST_EXPECT(s1.crbegin() == s1.crend());
+ try
+ {
+ BEAST_EXPECT(s1.at(0) == 0);
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ BEAST_EXPECT(s1.data()[0] == 0);
+ BEAST_EXPECT(*s1.c_str() == 0);
+ BEAST_EXPECT(std::distance(s1.begin(), s1.end()) == 0);
+ BEAST_EXPECT(std::distance(s1.cbegin(), s1.cend()) == 0);
+ BEAST_EXPECT(std::distance(s1.rbegin(), s1.rend()) == 0);
+ BEAST_EXPECT(std::distance(s1.crbegin(), s1.crend()) == 0);
+ BEAST_EXPECT(s1.compare(s1) == 0);
+ }
+ {
+ str1 s1;
+ str1 s2("x");
+ BEAST_EXPECT(s2 == "x");
+ BEAST_EXPECT(s2[0] == 'x');
+ BEAST_EXPECT(s2.at(0) == 'x');
+ BEAST_EXPECT(s2.front() == 'x');
+ BEAST_EXPECT(s2.back() == 'x');
+ str1 const s3(s2);
+ BEAST_EXPECT(s3 == "x");
+ BEAST_EXPECT(s3[0] == 'x');
+ BEAST_EXPECT(s3.at(0) == 'x');
+ BEAST_EXPECT(s3.front() == 'x');
+ BEAST_EXPECT(s3.back() == 'x');
+ s2 = "y";
+ BEAST_EXPECT(s2 == "y");
+ BEAST_EXPECT(s3 == "x");
+ s1 = s2;
+ BEAST_EXPECT(s1 == "y");
+ s1.clear();
+ BEAST_EXPECT(s1.empty());
+ BEAST_EXPECT(s1.size() == 0);
+ }
+ {
+ str2 s1("x");
+ str1 s2(s1);
+ BEAST_EXPECT(s2 == "x");
+ str1 s3;
+ s3 = s2;
+ BEAST_EXPECT(s3 == "x");
+ s1 = "xy";
+ BEAST_EXPECT(s1.size() == 2);
+ BEAST_EXPECT(s1[0] == 'x');
+ BEAST_EXPECT(s1[1] == 'y');
+ BEAST_EXPECT(s1.at(0) == 'x');
+ BEAST_EXPECT(s1.at(1) == 'y');
+ BEAST_EXPECT(s1.front() == 'x');
+ BEAST_EXPECT(s1.back() == 'y');
+ auto const s4 = s1;
+ BEAST_EXPECT(s4[0] == 'x');
+ BEAST_EXPECT(s4[1] == 'y');
+ BEAST_EXPECT(s4.at(0) == 'x');
+ BEAST_EXPECT(s4.at(1) == 'y');
+ BEAST_EXPECT(s4.front() == 'x');
+ BEAST_EXPECT(s4.back() == 'y');
+ try
+ {
+ s3 = s1;
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ try
+ {
+ str1 s5(s1);
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ }
+ {
+ str1 s1("x");
+ str2 s2;
+ s2 = s1;
+ try
+ {
+ s1.resize(2);
+ fail();
+ }
+ catch(std::length_error const&)
+ {
+ pass();
+ }
+ }
+ pass();
+ }
+
+ void
+ testToStaticString()
+ {
+ BEAST_EXPECT(to_static_string<long>(0) == "0");
+ BEAST_EXPECT(to_static_string<long>(1) == "1");
+ BEAST_EXPECT(to_static_string<long>(0xffff) == "65535");
+ BEAST_EXPECT(to_static_string<long>(0x10000) == "65536");
+ BEAST_EXPECT(to_static_string<long long>(0xffffffff) == "4294967295");
+
+ BEAST_EXPECT(to_static_string<long>(-1) == "-1");
+ BEAST_EXPECT(to_static_string<long>(-65535) == "-65535");
+ BEAST_EXPECT(to_static_string<long>(-65536) == "-65536");
+ BEAST_EXPECT(to_static_string<long long>(-4294967295ll) == "-4294967295");
+
+ BEAST_EXPECT(to_static_string<unsigned long>(0) == "0");
+ BEAST_EXPECT(to_static_string<unsigned long>(1) == "1");
+ BEAST_EXPECT(to_static_string<unsigned long>(0xffff) == "65535");
+ BEAST_EXPECT(to_static_string<unsigned long>(0x10000) == "65536");
+ BEAST_EXPECT(to_static_string<unsigned long>(0xffffffff) == "4294967295");
+ }
+
+ void
+ run() override
+ {
+ testConstruct();
+ testAssign();
+ testAccess();
+ testIterators();
+ testCapacity();
+ testOperations();
+ testCompare();
+ testSwap();
+
+ testGeneral();
+ testToStaticString();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,static_string);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/stream_tests.hpp b/src/boost/libs/beast/test/beast/core/stream_tests.hpp
new file mode 100644
index 000000000..67ad983eb
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/stream_tests.hpp
@@ -0,0 +1,107 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_STREAM_TESTS_HPP
+#define BOOST_BEAST_STREAM_TESTS_HPP
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/error.hpp>
+#include <boost/beast/core/stream_traits.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/spawn.hpp>
+#include <boost/asio/use_future.hpp>
+
+namespace boost {
+namespace beast {
+
+template<class SyncReadStream>
+void
+test_sync_read_stream()
+{
+ BOOST_ASSERT(is_sync_read_stream<SyncReadStream>::value);
+ BEAST_EXPECT(static_cast<
+ std::size_t(SyncReadStream::*)(net::mutable_buffer const&)>(
+ &SyncReadStream::template read_some<net::mutable_buffer>));
+ BEAST_EXPECT(static_cast<
+ std::size_t(SyncReadStream::*)(net::mutable_buffer const&, error_code&)>(
+ &SyncReadStream::template read_some<net::mutable_buffer>));
+}
+
+template<class SyncWriteStream>
+void
+test_sync_write_stream()
+{
+ BOOST_ASSERT(is_sync_write_stream<SyncWriteStream>::value);
+ BEAST_EXPECT(static_cast<
+ std::size_t(SyncWriteStream::*)(net::const_buffer const&)>(
+ &SyncWriteStream::template write_some<net::const_buffer>));
+ BEAST_EXPECT(static_cast<
+ std::size_t(SyncWriteStream::*)(net::const_buffer const&, error_code&)>(
+ &SyncWriteStream::template write_some<net::const_buffer>));
+}
+
+template<class SyncReadStream>
+void
+test_sync_stream()
+{
+ test_sync_read_stream<SyncReadStream>();
+ test_sync_write_stream<SyncReadStream>();
+}
+
+template<class AsyncReadStream>
+void
+test_async_read_stream()
+{
+ struct handler
+ {
+ void operator()(error_code, std::size_t)
+ {
+ }
+ };
+
+ BOOST_ASSERT(is_async_read_stream<AsyncReadStream>::value);
+ BEAST_EXPECT(&AsyncReadStream::get_executor);
+
+ // VFALCO These stopped working because of enable_if as the last parameter
+ //BEAST_EXPECT((&AsyncReadStream::template async_read_some<net::mutable_buffer, handler>));
+ //BEAST_EXPECT((&AsyncReadStream::template async_read_some<net::mutable_buffer, net::use_future_t<>>));
+ //BEAST_EXPECT((&AsyncReadStream::template async_read_some<net::mutable_buffer, net::yield_context>));
+}
+
+template<class AsyncWriteStream>
+void
+test_async_write_stream()
+{
+ struct handler
+ {
+ void operator()(error_code, std::size_t)
+ {
+ }
+ };
+
+ BOOST_ASSERT(is_async_write_stream<AsyncWriteStream>::value);
+ BEAST_EXPECT(&AsyncWriteStream::get_executor);
+ // VFALCO These stopped working because of enable_if as the last parameter
+ //BEAST_EXPECT((&AsyncWriteStream::template async_write_some<net::const_buffer, handler>));
+ //BEAST_EXPECT((&AsyncWriteStream::template async_write_some<net::const_buffer, net::use_future_t<>>));
+ //BEAST_EXPECT((&AsyncWriteStream::template async_write_some<net::const_buffer, net::yield_context>));
+}
+
+template<class AsyncStream>
+void
+test_async_stream()
+{
+ test_async_read_stream<AsyncStream>();
+ test_async_write_stream<AsyncStream>();
+}
+
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/stream_traits.cpp b/src/boost/libs/beast/test/beast/core/stream_traits.cpp
new file mode 100644
index 000000000..4498837ac
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/stream_traits.cpp
@@ -0,0 +1,381 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/stream_traits.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/error.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/write.hpp>
+#include <utility>
+
+namespace boost {
+namespace beast {
+
+class stream_traits_test
+ : public beast::unit_test::suite
+{
+public:
+ struct without
+ {
+ int dummy = 0;
+
+ without() = default;
+
+ template<class T>
+ std::size_t write_some(T const&)
+ {
+ return 0;
+ }
+
+ template<class T>
+ std::size_t write_some(T const&, boost::system::error_code&)
+ {
+ return 0;
+ }
+ };
+
+ template<class T>
+ struct with
+ {
+ T t;
+
+ with() = default;
+
+ T&
+ next_layer()
+ {
+ return t;
+ }
+
+ T const&
+ next_layer() const
+ {
+ return t;
+ }
+ };
+
+ BOOST_STATIC_ASSERT(
+ ! detail::has_next_layer<without>::value);
+
+ BOOST_STATIC_ASSERT(
+ detail::has_next_layer<with<without>>::value);
+
+ BOOST_STATIC_ASSERT(
+ detail::has_next_layer<with<with<without>>>::value);
+
+ void
+ testGetLowestLayer()
+ {
+ {
+ without w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w);
+ }
+ {
+ without const w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w);
+ }
+ {
+ with<without> w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w.t);
+ }
+ {
+ with<without> const w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w.t);
+ }
+ {
+ with<with<without>> w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w.t.t);
+ }
+ {
+ with<with<without>> const w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w.t.t);
+ }
+ {
+ with<with<with<without>>> w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w.t.t.t);
+ }
+ {
+ with<with<with<without>>> const w{};
+ BEAST_EXPECT(&get_lowest_layer(w) == &w.t.t.t);
+ }
+ }
+
+ //--------------------------------------------------------------------------
+/*
+ @par Example
+ This code implements a <em>SyncWriteStream</em> wrapper which calls
+ `std::terminate` upon any error.
+*/
+ template <class NextLayer>
+ class write_stream
+ {
+ NextLayer next_layer_;
+
+ public:
+ static_assert(is_sync_write_stream<NextLayer>::value,
+ "SyncWriteStream type requirements not met");
+
+ template<class... Args>
+ explicit
+ write_stream(Args&&... args)
+ : next_layer_(std::forward<Args>(args)...)
+ {
+ }
+
+ NextLayer& next_layer() noexcept
+ {
+ return next_layer_;
+ }
+
+ NextLayer const& next_layer() const noexcept
+ {
+ return next_layer_;
+ }
+
+ template<class ConstBufferSequence>
+ std::size_t
+ write_some(ConstBufferSequence const& buffers)
+ {
+ error_code ec;
+ auto const bytes_transferred = next_layer_.write_some(buffers, ec);
+ if(ec)
+ std::terminate();
+ return bytes_transferred;
+ }
+
+ template<class ConstBufferSequence>
+ std::size_t
+ write_some(ConstBufferSequence const& buffers, error_code& ec)
+ {
+ auto const bytes_transferred = next_layer_.write_some(buffers, ec);
+ if(ec)
+ std::terminate();
+ return bytes_transferred;
+ }
+ };
+
+ void
+ testGetLowestLayerJavadoc()
+ {
+ write_stream<without> s;
+ BOOST_STATIC_ASSERT(
+ is_sync_write_stream<without>::value);
+ BOOST_STATIC_ASSERT(std::is_same<
+ decltype(get_lowest_layer(s)), without&>::value);
+
+#if 0
+ BEAST_EXPECT(static_cast<
+ std::size_t(type::*)(net::const_buffer)>(
+ &type::write_some<net::const_buffer>));
+#endif
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ testExecutorType()
+ {
+ }
+
+ void
+ testExecutorTypeJavadoc()
+ {
+ }
+
+ //--------------------------------------------------------------------------
+
+ struct sync_read_stream
+ {
+ template<class MutableBufferSequence>
+ std::size_t read_some(MutableBufferSequence const&);
+ template<class MutableBufferSequence>
+ std::size_t read_some(MutableBufferSequence const&, error_code& ec);
+ };
+
+ struct sync_write_stream
+ {
+ template<class ConstBufferSequence>
+ std::size_t write_some(ConstBufferSequence const&);
+ template<class ConstBufferSequence>
+ std::size_t write_some(ConstBufferSequence const&, error_code&);
+ };
+
+ struct async_read_stream
+ {
+ net::io_context::executor_type get_executor() noexcept;
+ template<class MutableBufferSequence, class ReadHandler>
+ void async_read_some(MutableBufferSequence const&, ReadHandler&&);
+ };
+
+ struct async_write_stream
+ {
+ net::io_context::executor_type get_executor() noexcept;
+ template<class ConstBufferSequence, class WriteHandler>
+ void async_write_some(ConstBufferSequence const&, WriteHandler&&);
+ };
+
+ struct sync_stream : sync_read_stream, sync_write_stream
+ {
+ };
+
+ struct async_stream : async_read_stream, async_write_stream
+ {
+ net::io_context::executor_type get_executor() noexcept;
+ template<class MutableBufferSequence, class ReadHandler>
+ void async_read_some(MutableBufferSequence const&, ReadHandler&&);
+ template<class ConstBufferSequence, class WriteHandler>
+ void async_write_some(ConstBufferSequence const&, WriteHandler&&);
+ };
+
+ BOOST_STATIC_ASSERT(is_sync_read_stream<sync_read_stream>::value);
+ BOOST_STATIC_ASSERT(is_sync_read_stream<sync_stream>::value);
+ BOOST_STATIC_ASSERT(is_sync_write_stream<sync_write_stream>::value);
+ BOOST_STATIC_ASSERT(is_sync_write_stream<sync_stream>::value);
+ BOOST_STATIC_ASSERT(is_sync_stream<sync_stream>::value);
+
+ BOOST_STATIC_ASSERT(! is_sync_read_stream<sync_write_stream>::value);
+ BOOST_STATIC_ASSERT(! is_sync_write_stream<sync_read_stream>::value);
+ BOOST_STATIC_ASSERT(! is_sync_stream<async_stream>::value);
+
+ BOOST_STATIC_ASSERT(has_get_executor<async_read_stream>::value);
+ BOOST_STATIC_ASSERT(has_get_executor<async_write_stream>::value);
+ BOOST_STATIC_ASSERT(has_get_executor<async_stream>::value);
+
+ BOOST_STATIC_ASSERT(! has_get_executor<sync_read_stream>::value);
+ BOOST_STATIC_ASSERT(! has_get_executor<sync_write_stream>::value);
+ BOOST_STATIC_ASSERT(! has_get_executor<sync_stream>::value);
+
+ BOOST_STATIC_ASSERT(is_async_read_stream<async_read_stream>::value);
+ BOOST_STATIC_ASSERT(is_async_read_stream<async_stream>::value);
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1910)
+ BOOST_STATIC_ASSERT(is_async_write_stream<net::ip::tcp::socket>::value);
+#else
+ BOOST_STATIC_ASSERT(is_async_write_stream<async_write_stream>::value);
+#endif
+ BOOST_STATIC_ASSERT(is_async_write_stream<async_stream>::value);
+ BOOST_STATIC_ASSERT(is_async_stream<async_stream>::value);
+
+ BOOST_STATIC_ASSERT(! is_async_write_stream<async_read_stream>::value);
+ BOOST_STATIC_ASSERT(! is_async_read_stream<async_write_stream>::value);
+ BOOST_STATIC_ASSERT(! is_async_stream<sync_stream>::value);
+
+ //--------------------------------------------------------------------------
+
+ template<class T>
+ struct layer
+ {
+ T t;
+
+ template<class U>
+ explicit
+ layer(U&& u)
+ : t(std::forward<U>(u))
+ {
+ }
+
+ T& next_layer()
+ {
+ return t;
+ }
+ };
+
+ void
+ testClose()
+ {
+ net::io_context ioc;
+ {
+ net::ip::tcp::socket sock(ioc);
+ sock.open(net::ip::tcp::v4());
+ BEAST_EXPECT(sock.is_open());
+ close_socket(get_lowest_layer(sock));
+ BEAST_EXPECT(! sock.is_open());
+ }
+ {
+ using type = layer<net::ip::tcp::socket>;
+ type layer(ioc);
+ layer.next_layer().open(net::ip::tcp::v4());
+ BEAST_EXPECT(layer.next_layer().is_open());
+ BOOST_STATIC_ASSERT(detail::has_next_layer<type>::value);
+ BOOST_STATIC_ASSERT((std::is_same<
+ typename std::decay<decltype(get_lowest_layer(layer))>::type,
+ lowest_layer_type<decltype(layer)>>::value));
+ BOOST_STATIC_ASSERT(std::is_same<net::ip::tcp::socket&,
+ decltype(get_lowest_layer(layer))>::value);
+ BOOST_STATIC_ASSERT(std::is_same<net::ip::tcp::socket,
+ lowest_layer_type<decltype(layer)>>::value);
+ close_socket(get_lowest_layer(layer));
+ BEAST_EXPECT(! layer.next_layer().is_open());
+ }
+ {
+ test::stream ts(ioc);
+ close_socket(ts);
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ template <class WriteStream>
+ void hello_and_close (WriteStream& stream)
+ {
+ net::write(stream, net::const_buffer("Hello, world!", 13));
+ close_socket(get_lowest_layer(stream));
+ }
+
+ class my_socket
+ {
+ net::ip::tcp::socket sock_;
+
+ public:
+ my_socket(net::io_context& ioc)
+ : sock_(ioc)
+ {
+ }
+
+ friend void beast_close_socket(my_socket& s)
+ {
+ error_code ec;
+ s.sock_.close(ec);
+ // ignore the error
+ }
+ };
+
+ void
+ testCloseJavadoc()
+ {
+ BEAST_EXPECT(&stream_traits_test::template hello_and_close<net::ip::tcp::socket>);
+ {
+ net::io_context ioc;
+ my_socket s(ioc);
+ close_socket(s);
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ run() override
+ {
+ testGetLowestLayer();
+ testGetLowestLayerJavadoc();
+ testExecutorType();
+ testExecutorTypeJavadoc();
+ testClose();
+ testCloseJavadoc();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,stream_traits);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/string.cpp b/src/boost/libs/beast/test/beast/core/string.cpp
new file mode 100644
index 000000000..75818269d
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/string.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/string.hpp>
diff --git a/src/boost/libs/beast/test/beast/core/string_param.cpp b/src/boost/libs/beast/test/beast/core/string_param.cpp
new file mode 100644
index 000000000..395dea240
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/string_param.cpp
@@ -0,0 +1,83 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/string_param.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/detail/type_traits.hpp>
+
+namespace boost {
+namespace beast {
+
+class string_param_test : public unit_test::suite
+{
+public:
+ struct nop {};
+
+ void
+ check(string_param const& v, string_view s)
+ {
+ BEAST_EXPECT(static_cast<string_view>(v) == s);
+ }
+
+ class repeater
+ {
+ std::size_t n_;
+
+ public:
+ explicit
+ repeater(std::size_t n)
+ : n_(n)
+ {
+ }
+
+ friend
+ std::ostream&
+ operator<<(std::ostream& os, repeater const& v)
+ {
+ return os << std::string(v.n_, '*');
+ }
+ };
+
+ void
+ testConversion()
+ {
+ // Make sure things convert correctly
+ check(std::string("hello"), "hello");
+ check("xyz", "xyz");
+ check(1, "1");
+ check(12, "12");
+ check(123, "123");
+ check(1234, "1234");
+ check(12345, "12345");
+ check({"a", "b"}, "ab");
+ check({1, 2, 3}, "123");
+ }
+
+ void
+ testStaticOstream()
+ {
+ // exercise static_ostream for coverage
+ std::string s(500, '*');
+ check(repeater{500}, s);
+ }
+
+ void
+ run() override
+ {
+ testConversion();
+ testStaticOstream();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,string_param);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/tcp_stream.cpp b/src/boost/libs/beast/test/beast/core/tcp_stream.cpp
new file mode 100644
index 000000000..50e0ef2e1
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/tcp_stream.cpp
@@ -0,0 +1,45 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/core/tcp_stream.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+
+class tcp_stream_test
+ : public beast::unit_test::suite
+{
+public:
+ using tcp = net::ip::tcp;
+
+ void
+ testStream()
+ {
+ net::io_context ioc;
+ {
+ tcp::socket s(ioc);
+ tcp_stream s1(std::move(s));
+ }
+ }
+
+ void
+ run()
+ {
+ testStream();
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,core,tcp_stream);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/core/test_buffer.hpp b/src/boost/libs/beast/test/beast/core/test_buffer.hpp
new file mode 100644
index 000000000..3b72dccf9
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/test_buffer.hpp
@@ -0,0 +1,599 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_BUFFER_HPP
+#define BOOST_BEAST_TEST_BUFFER_HPP
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/core/detail/type_traits.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/assert.hpp>
+#include <algorithm>
+#include <string>
+#include <type_traits>
+
+namespace boost {
+namespace beast {
+
+/** A MutableBufferSequence for tests, where length is always 3.
+*/
+class buffers_triple
+{
+ net::mutable_buffer b_[3];
+
+public:
+ using value_type = net::mutable_buffer;
+ using const_iterator = net::mutable_buffer const*;
+
+ buffers_triple(
+ buffers_triple const&) = default;
+
+ buffers_triple& operator=(
+ buffers_triple const&) = default;
+
+ buffers_triple(char* data, std::size_t size)
+ {
+ b_[0] = {data, size/6};
+ data += b_[0].size();
+ size -= b_[0].size();
+
+ b_[1] = {data, 2*size/5};
+ data += b_[1].size();
+ size -= b_[1].size();
+
+ b_[2] = {data, size};
+
+ BOOST_ASSERT(b_[0].size() > 0);
+ BOOST_ASSERT(b_[1].size() > 0);
+ BOOST_ASSERT(b_[2].size() > 0);
+ }
+
+ bool
+ operator==(buffers_triple const& rhs) const noexcept
+ {
+ return
+ b_[0].data() == rhs.b_[0].data() &&
+ b_[0].size() == rhs.b_[0].size() &&
+ b_[1].data() == rhs.b_[1].data() &&
+ b_[1].size() == rhs.b_[1].size() &&
+ b_[2].data() == rhs.b_[2].data() &&
+ b_[2].size() == rhs.b_[2].size();
+ }
+
+ bool
+ operator!=(buffers_triple const& rhs) const noexcept
+ {
+ return !(*this == rhs);
+ }
+
+ const_iterator
+ begin() const noexcept
+ {
+ return &b_[0];
+ }
+
+ const_iterator
+ end() const noexcept
+ {
+ return &b_[3];
+ }
+};
+
+template<class ConstBufferSequence>
+std::size_t
+buffers_length(
+ ConstBufferSequence const& buffers)
+{
+ return std::distance(
+ net::buffer_sequence_begin(buffers),
+ net::buffer_sequence_end(buffers));
+}
+
+//------------------------------------------------------------------------------
+
+namespace detail {
+
+template<class MutableBufferSequence>
+void test_mutable_buffers(
+ MutableBufferSequence const&,
+ net::const_buffer)
+{
+}
+
+template<class MutableBufferSequence>
+void test_mutable_buffers(
+ MutableBufferSequence const& b,
+ net::mutable_buffer)
+{
+ string_view src = "Hello, world!";
+ BOOST_ASSERT(buffer_bytes(b) <= src.size());
+ if(src.size() > buffer_bytes(b))
+ src = {src.data(), buffer_bytes(b)};
+ net::buffer_copy(b, net::const_buffer(
+ src.data(), src.size()));
+ BEAST_EXPECT(beast::buffers_to_string(b) == src);
+}
+
+} // detail
+
+/** Test an instance of a constant or mutable buffer sequence.
+*/
+template<class ConstBufferSequence>
+void
+test_buffer_sequence(
+ ConstBufferSequence const& buffers)
+{
+ BOOST_STATIC_ASSERT(
+ net::is_const_buffer_sequence<
+ ConstBufferSequence>::value);
+
+ using iterator = decltype(
+ net::buffer_sequence_begin(buffers));
+ BEAST_EXPECT(sizeof(iterator) > 0);
+
+ auto const size = buffer_bytes(buffers);
+ BEAST_EXPECT(size > 0 );
+
+ // begin, end
+ auto const length = std::distance(
+ net::buffer_sequence_begin(buffers),
+ net::buffer_sequence_end(buffers));
+ BEAST_EXPECT(length > 0);
+ BEAST_EXPECT(
+ net::buffer_sequence_begin(buffers) !=
+ net::buffer_sequence_end(buffers));
+
+ // copy construction
+ ConstBufferSequence b1(buffers);
+ BEAST_EXPECT(buffer_bytes(b1) == size);
+
+ // copy assignment
+ ConstBufferSequence b2(buffers);
+ b2 = b1;
+ BEAST_EXPECT(buffer_bytes(b2) == size);
+
+ // iterators
+ {
+ iterator it1{};
+ iterator it2{};
+ iterator it3 =
+ net::buffer_sequence_begin(buffers);
+ iterator it4 =
+ net::buffer_sequence_end(buffers);
+ BEAST_EXPECT(it1 == it2);
+ BEAST_EXPECT(it1 != it3);
+ BEAST_EXPECT(it3 != it1);
+ BEAST_EXPECT(it1 != it4);
+ BEAST_EXPECT(it4 != it1);
+ }
+
+ // bidirectional
+ {
+ auto const first =
+ net::buffer_sequence_begin(buffers);
+ auto const last =
+ net::buffer_sequence_end(buffers);
+ std::size_t n, m;
+ iterator it;
+
+ // pre-increment
+ m = 0;
+ n = length;
+ for(it = first; n--; ++it)
+ m += buffer_bytes(*it);
+ BEAST_EXPECT(it == last);
+ BEAST_EXPECT(m == size);
+
+ // post-increment
+ m = 0;
+ n = length;
+ for(it = first; n--;)
+ m += buffer_bytes(*it++);
+ BEAST_EXPECT(it == last);
+ BEAST_EXPECT(m == size);
+
+ // pre-decrement
+ m = 0;
+ n = length;
+ for(it = last; n--;)
+ m += buffer_bytes(*--it);
+ BEAST_EXPECT(it == first);
+ BEAST_EXPECT(m == size);
+
+ // post-decrement
+ m = 0;
+ n = length;
+ for(it = last; n--;)
+ {
+ it--;
+ m += buffer_bytes(*it);
+ }
+ BEAST_EXPECT(it == first);
+ BEAST_EXPECT(m == size);
+ }
+
+ detail::test_mutable_buffers(buffers,
+ buffers_type<ConstBufferSequence>{});
+}
+
+//------------------------------------------------------------------------------
+
+/** Metafunction to determine if a type meets the requirements of MutableDynamicBuffer_v0
+*/
+/* @{ */
+// VFALCO This trait needs tests
+template<class T, class = void>
+struct is_mutable_dynamic_buffer
+ : std::false_type
+{
+};
+
+template<class T>
+struct is_mutable_dynamic_buffer<T, detail::void_t<decltype(
+ std::declval<typename T::const_buffers_type&>() =
+ std::declval<T const&>().data(),
+ std::declval<typename T::const_buffers_type&>() =
+ std::declval<T&>().cdata(),
+ std::declval<typename T::mutable_buffers_type&>() =
+ std::declval<T&>().data()
+ ) > > : net::is_dynamic_buffer_v1<T>
+{
+};
+/** @} */
+
+namespace detail {
+
+template<class MutableBufferSequence>
+void
+buffers_fill(
+ MutableBufferSequence const& buffers,
+ char c)
+{
+ auto const end =
+ net::buffer_sequence_end(buffers);
+ for(auto it = net::buffer_sequence_begin(buffers);
+ it != end; ++it)
+ {
+ net::mutable_buffer b(*it);
+ std::fill(
+ static_cast<char*>(b.data()),
+ static_cast<char*>(b.data()) + b.size(), c);
+ }
+}
+
+template<class MutableDynamicBuffer_v0>
+void
+test_mutable_dynamic_buffer(
+ MutableDynamicBuffer_v0 const&,
+ std::false_type)
+{
+}
+
+template<class MutableDynamicBuffer_v0>
+void
+test_mutable_dynamic_buffer(
+ MutableDynamicBuffer_v0 const& b0,
+ std::true_type)
+{
+ BOOST_STATIC_ASSERT(
+ net::is_mutable_buffer_sequence<typename
+ MutableDynamicBuffer_v0::mutable_buffers_type>::value);
+
+ BOOST_STATIC_ASSERT(
+ std::is_convertible<
+ typename MutableDynamicBuffer_v0::mutable_buffers_type,
+ typename MutableDynamicBuffer_v0::const_buffers_type>::value);
+
+ string_view src = "Hello, world!";
+ if(src.size() > b0.max_size())
+ src = {src.data(), b0.max_size()};
+
+ // modify readable bytes
+ {
+ MutableDynamicBuffer_v0 b(b0);
+ auto const mb = b.prepare(src.size());
+ BEAST_EXPECT(buffer_bytes(mb) == src.size());
+ buffers_fill(mb, '*');
+ b.commit(src.size());
+ BEAST_EXPECT(b.size() == src.size());
+ BEAST_EXPECT(
+ beast::buffers_to_string(b.data()) ==
+ std::string(src.size(), '*'));
+ BEAST_EXPECT(
+ beast::buffers_to_string(b.cdata()) ==
+ std::string(src.size(), '*'));
+ auto const n = net::buffer_copy(
+ b.data(), net::const_buffer(
+ src.data(), src.size()));
+ BEAST_EXPECT(n == src.size());
+ BEAST_EXPECT(
+ beast::buffers_to_string(b.data()) == src);
+ BEAST_EXPECT(
+ beast::buffers_to_string(b.cdata()) == src);
+ }
+
+ // mutable to const sequence conversion
+ {
+ MutableDynamicBuffer_v0 b(b0);
+ b.commit(net::buffer_copy(
+ b.prepare(src.size()),
+ net::const_buffer(src.data(), src.size())));
+ auto mb = b.data();
+ auto cb = static_cast<
+ MutableDynamicBuffer_v0 const&>(b).data();
+ auto cbc = b.cdata();
+ BEAST_EXPECT(
+ beast::buffers_to_string(b.data()) == src);
+ BEAST_EXPECT(
+ beast::buffers_to_string(b.cdata()) == src);
+ beast::test_buffer_sequence(cb);
+ beast::test_buffer_sequence(cbc);
+ beast::test_buffer_sequence(mb);
+ {
+ decltype(mb) mb2(mb);
+ mb = mb2;
+ decltype(cb) cb2(cb);
+ cb = cb2;
+ decltype(cbc) cbc2(cbc);
+ cbc = cbc2;
+ }
+ {
+ decltype(cb) cb2(mb);
+ decltype(cbc) cbc2(mb);
+ cb2 = mb;
+ cbc2 = mb;
+ }
+ }
+}
+
+} // detail
+
+/** Test an instance of a dynamic buffer or mutable dynamic buffer.
+*/
+template<class DynamicBuffer_v0>
+void
+test_dynamic_buffer(
+ DynamicBuffer_v0 const& b0)
+{
+ BOOST_STATIC_ASSERT(
+ net::is_dynamic_buffer_v1<DynamicBuffer_v0>::value);
+
+ BOOST_STATIC_ASSERT(
+ net::is_const_buffer_sequence<typename
+ DynamicBuffer_v0::const_buffers_type>::value);
+
+ BOOST_STATIC_ASSERT(
+ net::is_mutable_buffer_sequence<typename
+ DynamicBuffer_v0::mutable_buffers_type>::value);
+
+ BEAST_EXPECT(b0.size() == 0);
+ BEAST_EXPECT(buffer_bytes(b0.data()) == 0);
+
+ // members
+ {
+ string_view src = "Hello, world!";
+
+ DynamicBuffer_v0 b1(b0);
+ auto const mb = b1.prepare(src.size());
+ b1.commit(net::buffer_copy(mb,
+ net::const_buffer(src.data(), src.size())));
+
+ // copy constructor
+ {
+ DynamicBuffer_v0 b2(b1);
+ BEAST_EXPECT(b2.size() == b1.size());
+ BEAST_EXPECT(
+ buffers_to_string(b1.data()) ==
+ buffers_to_string(b2.data()));
+
+ // https://github.com/boostorg/beast/issues/1621
+ b2.consume(1);
+ DynamicBuffer_v0 b3(b2);
+ BEAST_EXPECT(b3.size() == b2.size());
+ BEAST_EXPECT(
+ buffers_to_string(b2.data()) ==
+ buffers_to_string(b3.data()));
+ }
+
+ // move constructor
+ {
+ DynamicBuffer_v0 b2(b1);
+ DynamicBuffer_v0 b3(std::move(b2));
+ BEAST_EXPECT(b3.size() == b1.size());
+ BEAST_EXPECT(
+ buffers_to_string(b3.data()) ==
+ buffers_to_string(b1.data()));
+ }
+
+ // copy assignment
+ {
+ DynamicBuffer_v0 b2(b0);
+ b2 = b1;
+ BEAST_EXPECT(b2.size() == b1.size());
+ BEAST_EXPECT(
+ buffers_to_string(b1.data()) ==
+ buffers_to_string(b2.data()));
+
+ // self assignment
+ b2 = *&b2;
+ BEAST_EXPECT(b2.size() == b1.size());
+ BEAST_EXPECT(
+ buffers_to_string(b2.data()) ==
+ buffers_to_string(b1.data()));
+
+ // https://github.com/boostorg/beast/issues/1621
+ b2.consume(1);
+ DynamicBuffer_v0 b3(b2);
+ BEAST_EXPECT(b3.size() == b2.size());
+ BEAST_EXPECT(
+ buffers_to_string(b2.data()) ==
+ buffers_to_string(b3.data()));
+
+ }
+
+ // move assignment
+ {
+ DynamicBuffer_v0 b2(b1);
+ DynamicBuffer_v0 b3(b0);
+ b3 = std::move(b2);
+ BEAST_EXPECT(b3.size() == b1.size());
+ BEAST_EXPECT(
+ buffers_to_string(b3.data()) ==
+ buffers_to_string(b1.data()));
+
+ // self move
+ b3 = std::move(b3);
+ BEAST_EXPECT(b3.size() == b1.size());
+ BEAST_EXPECT(
+ buffers_to_string(b3.data()) ==
+ buffers_to_string(b1.data()));
+ }
+
+ // swap
+ {
+ DynamicBuffer_v0 b2(b1);
+ DynamicBuffer_v0 b3(b0);
+ BEAST_EXPECT(b2.size() == b1.size());
+ BEAST_EXPECT(b3.size() == b0.size());
+ using std::swap;
+ swap(b2, b3);
+ BEAST_EXPECT(b2.size() == b0.size());
+ BEAST_EXPECT(b3.size() == b1.size());
+ BEAST_EXPECT(
+ buffers_to_string(b3.data()) ==
+ buffers_to_string(b1.data()));
+ }
+ }
+
+ // n == 0
+ {
+ DynamicBuffer_v0 b(b0);
+ b.commit(1);
+ BEAST_EXPECT(b.size() == 0);
+ BEAST_EXPECT(buffer_bytes(b.prepare(0)) == 0);
+ b.commit(0);
+ BEAST_EXPECT(b.size() == 0);
+ b.commit(1);
+ BEAST_EXPECT(b.size() == 0);
+ b.commit(b.max_size() + 1);
+ BEAST_EXPECT(b.size() == 0);
+ b.consume(0);
+ BEAST_EXPECT(b.size() == 0);
+ b.consume(1);
+ BEAST_EXPECT(b.size() == 0);
+ b.consume(b.max_size() + 1);
+ BEAST_EXPECT(b.size() == 0);
+ }
+
+ // max_size
+ {
+ DynamicBuffer_v0 b(b0);
+ if(BEAST_EXPECT(
+ b.max_size() + 1 > b.max_size()))
+ {
+ try
+ {
+ b.prepare(b.max_size() + 1);
+ BEAST_FAIL();
+ }
+ catch(std::length_error const&)
+ {
+ BEAST_PASS();
+ }
+ catch(...)
+ {
+ BEAST_FAIL();
+ }
+ }
+ }
+
+ // setup source buffer
+ char buf[13];
+ unsigned char k0 = 0;
+ string_view src(buf, sizeof(buf));
+ if(src.size() > b0.max_size())
+ src = {src.data(), b0.max_size()};
+ BEAST_EXPECT(b0.max_size() >= src.size());
+ BEAST_EXPECT(b0.size() == 0);
+ BEAST_EXPECT(buffer_bytes(b0.data()) == 0);
+ auto const make_new_src =
+ [&buf, &k0, &src]
+ {
+ auto k = k0++;
+ for(std::size_t i = 0; i < src.size(); ++i)
+ buf[i] = k++;
+ };
+
+ // readable / writable buffer sequence tests
+ {
+ make_new_src();
+ DynamicBuffer_v0 b(b0);
+ auto const& bc(b);
+ auto const mb = b.prepare(src.size());
+ BEAST_EXPECT(buffer_bytes(mb) == src.size());
+ beast::test_buffer_sequence(mb);
+ b.commit(net::buffer_copy(mb,
+ net::const_buffer(src.data(), src.size())));
+ BEAST_EXPECT(
+ buffer_bytes(bc.data()) == src.size());
+ beast::test_buffer_sequence(bc.data());
+ }
+
+ // h = in size
+ // i = prepare size
+ // j = commit size
+ // k = consume size
+ for(std::size_t h = 1; h <= src.size(); ++h)
+ {
+ string_view in(src.data(), h);
+ for(std::size_t i = 1; i <= in.size(); ++i) {
+ for(std::size_t j = 1; j <= i + 1; ++j) {
+ for(std::size_t k = 1; k <= in.size(); ++k) {
+ {
+ make_new_src();
+
+ DynamicBuffer_v0 b(b0);
+ auto const& bc(b);
+ net::const_buffer cb(in.data(), in.size());
+ while(cb.size() > 0)
+ {
+ auto const mb = b.prepare(
+ std::min<std::size_t>(i,
+ b.max_size() - b.size()));
+ auto const n = net::buffer_copy(mb,
+ net::const_buffer(cb.data(),
+ std::min<std::size_t>(j, cb.size())));
+ b.commit(n);
+ cb += n;
+ }
+ BEAST_EXPECT(b.size() == in.size());
+ BEAST_EXPECT(
+ buffer_bytes(bc.data()) == in.size());
+ BEAST_EXPECT(beast::buffers_to_string(
+ bc.data()) == in);
+ while(b.size() > 0)
+ b.consume(k);
+ BEAST_EXPECT(buffer_bytes(bc.data()) == 0);
+ }
+ } } }
+ }
+
+ // MutableDynamicBuffer_v0 refinement
+ detail::test_mutable_dynamic_buffer(b0,
+ is_mutable_dynamic_buffer<DynamicBuffer_v0>{});
+}
+
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/test_executor.hpp b/src/boost/libs/beast/test/beast/core/test_executor.hpp
new file mode 100644
index 000000000..6c65c77f5
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/test_executor.hpp
@@ -0,0 +1,122 @@
+//
+// Copyright (c) 2018 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_TEST_EXECUTOR_HPP
+#define BOOST_BEAST_TEST_TEST_EXECUTOR_HPP
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/io_context.hpp>
+#include <memory>
+
+namespace boost {
+namespace beast {
+
+template<class Executor = net::io_context::executor_type>
+class test_executor
+{
+public:
+ // VFALCO These need to be atomic or something
+ struct info
+ {
+ int dispatch = 0;
+ int post = 0;
+ int defer = 0;
+ int work = 0;
+ int total = 0;
+ };
+
+private:
+ struct state
+ {
+ Executor ex;
+ info info_;
+
+ state(Executor const& ex_)
+ : ex(ex_)
+ {
+ }
+ };
+
+ std::shared_ptr<state> sp_;
+
+public:
+ test_executor(test_executor const&) = default;
+ test_executor& operator=(test_executor const&) = default;
+
+ explicit
+ test_executor(Executor const& ex)
+ : sp_(std::make_shared<state>(ex))
+ {
+ }
+
+ decltype(sp_->ex.context())
+ context() const noexcept
+ {
+ return sp_->ex.context();
+ }
+
+ info&
+ operator*() noexcept
+ {
+ return sp_->info_;
+ }
+
+ info*
+ operator->() noexcept
+ {
+ return &sp_->info_;
+ }
+
+ void
+ on_work_started() const noexcept
+ {
+ ++sp_->info_.work;
+ }
+
+ void
+ on_work_finished() const noexcept
+ {
+ }
+
+ template<class F, class A>
+ void
+ dispatch(F&& f, A const& a) const
+ {
+ ++sp_->info_.dispatch;
+ ++sp_->info_.total;
+ sp_->ex.dispatch(
+ std::forward<F>(f), a);
+ }
+
+ template<class F, class A>
+ void
+ post(F&& f, A const& a) const
+ {
+ ++sp_->info_.post;
+ ++sp_->info_.total;
+ sp_->ex.post(
+ std::forward<F>(f), a);
+ }
+
+ template<class F, class A>
+ void
+ defer(F&& f, A const& a) const
+ {
+ ++sp_->info_.defer;
+ ++sp_->info_.total;
+ sp_->ex.defer(
+ std::forward<F>(f), a);
+ }
+};
+
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/test_handler.hpp b/src/boost/libs/beast/test/beast/core/test_handler.hpp
new file mode 100644
index 000000000..1e33d46e6
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/test_handler.hpp
@@ -0,0 +1,231 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_HANDLER_XXX_HPP
+#define BOOST_BEAST_TEST_HANDLER_XXX_HPP
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/associated_allocator.hpp>
+#include <boost/asio/associated_executor.hpp>
+#include <boost/asio/handler_alloc_hook.hpp>
+#include <boost/asio/handler_continuation_hook.hpp>
+#include <boost/asio/handler_invoke_hook.hpp>
+
+namespace boost {
+namespace beast {
+
+class simple_allocator
+{
+ std::size_t id_;
+
+public:
+ simple_allocator()
+ : id_([]
+ {
+ static std::size_t n = 0;
+ return ++n;
+ }())
+ {
+ }
+
+ friend
+ bool operator==(
+ simple_allocator const& lhs,
+ simple_allocator const& rhs) noexcept
+ {
+ return lhs.id_ == rhs.id_;
+ }
+
+ friend
+ bool operator!=(
+ simple_allocator const& lhs,
+ simple_allocator const& rhs) noexcept
+ {
+ return lhs.id_ != rhs.id_;
+ }
+};
+
+class simple_executor
+{
+ std::size_t id_;
+
+public:
+ simple_executor()
+ : id_([]
+ {
+ static std::size_t n = 0;
+ return ++n;
+ }())
+ {
+ }
+
+ void* context() { return nullptr; }
+ void on_work_started() {}
+ void on_work_finished() {}
+ template<class F> void dispatch(F&&) {}
+ template<class F> void post(F&&) {}
+ template<class F> void defer(F&&) {}
+
+ friend
+ bool operator==(
+ simple_executor const& lhs,
+ simple_executor const& rhs) noexcept
+ {
+ return lhs.id_ == rhs.id_;
+ }
+
+ friend
+ bool operator!=(
+ simple_executor const& lhs,
+ simple_executor const& rhs) noexcept
+ {
+ return lhs.id_ != rhs.id_;
+ }
+};
+
+// A move-only handler
+struct move_only_handler
+{
+ move_only_handler() = default;
+ move_only_handler(move_only_handler&&) = default;
+ move_only_handler(move_only_handler const&) = delete;
+ void operator()() const{};
+};
+
+// Used to test the legacy handler hooks
+struct legacy_handler
+{
+ bool& hook_invoked;
+
+ simple_executor
+ get_executor() const noexcept
+ {
+ return {};
+ };
+
+ // Signature of `f` is H<legacy_handler> where H is the wrapper to test
+ template<class F>
+ static
+ void
+ test(F const& f)
+ {
+ {
+ bool hook_invoked = false;
+ bool lambda_invoked = false;
+ auto h = f(legacy_handler{hook_invoked});
+ using net::asio_handler_invoke;
+ asio_handler_invoke(
+ [&lambda_invoked]
+ {
+ lambda_invoked =true;
+ }, &h);
+ BEAST_EXPECT(hook_invoked);
+ BEAST_EXPECT(lambda_invoked);
+ }
+ {
+ bool hook_invoked = false;
+ auto h = f(legacy_handler{hook_invoked});
+ using net::asio_handler_allocate;
+ asio_handler_allocate(0, &h);
+ BEAST_EXPECT(hook_invoked);
+ }
+ {
+ bool hook_invoked = false;
+ auto h = f(legacy_handler{hook_invoked});
+ using net::asio_handler_deallocate;
+ asio_handler_deallocate(nullptr, 0, &h);
+ BEAST_EXPECT(hook_invoked);
+ }
+ {
+ bool hook_invoked = false;
+ auto h = f(legacy_handler{hook_invoked});
+ using net::asio_handler_is_continuation;
+ asio_handler_is_continuation(&h);
+ BEAST_EXPECT(hook_invoked);
+ }
+ }
+};
+
+template<class Function>
+void
+asio_handler_invoke(
+ Function&& f,
+ legacy_handler* p)
+{
+ p->hook_invoked = true;
+ f();
+}
+
+inline
+void*
+asio_handler_allocate(
+ std::size_t,
+ legacy_handler* p)
+{
+ p->hook_invoked = true;
+ return nullptr;
+}
+
+inline
+void
+asio_handler_deallocate(
+ void*, std::size_t,
+ legacy_handler* p)
+{
+ p->hook_invoked = true;
+}
+
+inline
+bool
+asio_handler_is_continuation(
+ legacy_handler* p)
+{
+ p->hook_invoked = true;
+ return false;
+}
+
+} // beast
+} // boost
+
+namespace boost {
+namespace asio {
+
+template<class Allocator>
+struct associated_allocator<
+ boost::beast::legacy_handler, Allocator>
+{
+ using type = std::allocator<int>;
+
+ static type get(
+ boost::beast::legacy_handler const&,
+ Allocator const& = Allocator()) noexcept
+ {
+ return type{};
+ }
+};
+
+template<class Executor>
+struct associated_executor<
+ boost::beast::legacy_handler, Executor>
+{
+ using type = boost::beast::simple_executor;
+
+ static type get(
+ boost::beast::legacy_handler const&,
+ Executor const& = Executor()) noexcept
+ {
+ return type{};
+ }
+};
+
+} // asio
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/core/zlib.cpp b/src/boost/libs/beast/test/beast/core/zlib.cpp
new file mode 100644
index 000000000..6662e61c7
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/core/zlib.cpp
@@ -0,0 +1,235 @@
+//
+// 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <beast/detail/zlib/deflate_stream.hpp>
+#include <beast/detail/zlib/inflate_stream.hpp>
+
+#include <beast/unit_test/suite.hpp>
+#include <array>
+#include <cassert>
+#include <memory>
+#include <random>
+
+namespace boost {
+namespace beast {
+namespace zlib {
+
+class zlib_test : public beast::unit_test::suite
+{
+public:
+ class buffer
+ {
+ std::size_t size_ = 0;
+ std::size_t capacity_ = 0;
+ std::unique_ptr<std::uint8_t[]> p_;
+
+ public:
+ buffer() = default;
+ buffer(buffer&&) = default;
+ buffer& operator=(buffer&&) = default;
+
+
+ explicit
+ buffer(std::size_t capacity)
+ {
+ reserve(capacity);
+ }
+
+ bool
+ empty() const
+ {
+ return size_ == 0;
+ }
+
+ std::size_t
+ size() const
+ {
+ return size_;
+ }
+
+ std::size_t
+ capacity() const
+ {
+ return capacity_;
+ }
+
+ std::uint8_t const*
+ data() const
+ {
+ return p_.get();
+ }
+
+ std::uint8_t*
+ data()
+ {
+ return p_.get();
+ }
+
+ void
+ reserve(std::size_t capacity)
+ {
+ if(capacity != capacity_)
+ {
+ p_.reset(new std::uint8_t[capacity]);
+ capacity_ = capacity;
+ }
+ }
+
+ void
+ resize(std::size_t size)
+ {
+ assert(size <= capacity_);
+ size_ = size;
+ }
+ };
+
+ buffer
+ make_source1(std::size_t size)
+ {
+ std::mt19937 rng;
+ buffer b(size);
+ auto p = b.data();
+ std::size_t n = 0;
+ static std::string const chars(
+ "01234567890{}\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ "{{{{{{{{{{}}}}}}}}}} ");
+ while(n < size)
+ {
+ *p++ = chars[rng()%chars.size()];
+ ++n;
+ }
+ b.resize(n);
+ return b;
+ }
+
+ buffer
+ make_source2(std::size_t size)
+ {
+ std::mt19937 rng;
+ std::array<double, 2> const i{0, 65535};
+ std::array<double, 2> const w{0, 1};
+ std::piecewise_linear_distribution<double> d(
+ i.begin(), i.end(), w.begin());
+ buffer b(size);
+ auto p = b.data();
+ std::size_t n = 0;
+ while(n < size)
+ {
+ if(n == 1)
+ {
+ *p++ = rng()%256;
+ ++n;
+ continue;
+ }
+ auto const v = static_cast<std::uint16_t>(d(rng));
+ *p++ = v>>8;
+ *p++ = v&0xff;
+ n += 2;
+
+ }
+ b.resize(n);
+ return b;
+ }
+
+ void
+ checkInflate(buffer const& input, buffer const& original)
+ {
+ for(std::size_t i = 0; i < input.size(); ++i)
+ {
+ buffer output(original.size());
+ inflate_stream zs;
+ zs.avail_in = 0;
+ zs.next_in = 0;
+ zs.next_out = output.data();
+ zs.avail_out = output.capacity();
+ if(i > 0)
+ {
+ zs.next_in = (Byte*)input.data();
+ zs.avail_in = i;
+ auto result = zs.write(Z_FULL_FLUSH);
+ expect(result == Z_OK);
+ }
+ zs.next_in = (Byte*)input.data() + i;
+ zs.avail_in = input.size() - i;
+ auto result = zs.write(Z_FULL_FLUSH);
+ output.resize(output.capacity() - zs.avail_out);
+ expect(result == Z_OK);
+ expect(output.size() == original.size());
+ expect(std::memcmp(
+ output.data(), original.data(), original.size()) == 0);
+ }
+ }
+
+ void testSpecial()
+ {
+ {
+ deflate_stream zs;
+ }
+ {
+ inflate_stream zs;
+ }
+ }
+
+ void testCompress()
+ {
+ static std::size_t constexpr N = 2048;
+ for(int source = 0; source <= 1; ++source)
+ {
+ buffer original;
+ switch(source)
+ {
+ case 0:
+ original = make_source1(N);
+ break;
+ case 1:
+ original = make_source2(N);
+ break;
+ }
+ for(int level = 0; level <= 9; ++level)
+ {
+ for(int strategy = 0; strategy <= 4; ++strategy)
+ {
+ for(int wbits = 15; wbits <= 15; ++wbits)
+ {
+ deflate_stream zs;
+ zs.avail_in = 0;
+ zs.next_in = 0;
+ expect(deflate_stream::deflateInit2(&zs,
+ level,
+ wbits,
+ 4,
+ strategy) == Z_OK);
+ buffer output(deflate_stream::deflateBound(&zs, original.size()));
+ zs.next_in = (Byte*)original.data();
+ zs.avail_in = original.size();
+ zs.next_out = output.data();
+ zs.avail_out = output.capacity();
+ auto result = zs.deflate(Z_FULL_FLUSH);
+ expect(result == Z_OK);
+ output.resize(output.capacity() - zs.avail_out);
+ checkInflate(output, original);
+ }
+ }
+ }
+ }
+ }
+
+ void run() override
+ {
+ testSpecial();
+ testCompress();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(zlib,core,beast);
+
+} // zlib
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http.cpp b/src/boost/libs/beast/test/beast/http.cpp
new file mode 100644
index 000000000..bd630abcb
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http.cpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// If including Windows.h generates errors, it
+// means that min/max macros are being substituted.
+#ifdef _MSC_VER
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#endif
+
+// Test that header file is self-contained.
+#include <boost/beast/http.hpp>
diff --git a/src/boost/libs/beast/test/beast/http/CMakeLists.txt b/src/boost/libs/beast/test/beast/http/CMakeLists.txt
new file mode 100644
index 000000000..ac48fd36a
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/CMakeLists.txt
@@ -0,0 +1,52 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/extras/include/boost/beast extras)
+GroupSources (test/beast/http "/")
+
+add_executable (tests-beast-http
+ ${BOOST_BEAST_FILES}
+ ${EXTRAS_FILES}
+ Jamfile
+ message_fuzz.hpp
+ test_parser.hpp
+ basic_dynamic_body.cpp
+ basic_file_body.cpp
+ basic_parser.cpp
+ buffer_body.cpp
+ chunk_encode.cpp
+ dynamic_body.cpp
+ empty_body.cpp
+ error.cpp
+ field.cpp
+ fields.cpp
+ file_body.cpp
+ message.cpp
+ parser.cpp
+ read.cpp
+ rfc7230.cpp
+ serializer.cpp
+ span_body.cpp
+ status.cpp
+ string_body.cpp
+ type_traits.cpp
+ vector_body.cpp
+ verb.cpp
+ write.cpp
+)
+
+target_link_libraries(tests-beast-http
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET tests-beast-http PROPERTY FOLDER "tests")
diff --git a/src/boost/libs/beast/test/beast/http/Jamfile b/src/boost/libs/beast/test/beast/http/Jamfile
new file mode 100644
index 000000000..f96155d6e
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/Jamfile
@@ -0,0 +1,57 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+local SOURCES =
+ basic_dynamic_body.cpp
+ basic_file_body.cpp
+ basic_parser.cpp
+ buffer_body.cpp
+ chunk_encode.cpp
+ dynamic_body.cpp
+ error.cpp
+ field.cpp
+ fields.cpp
+ file_body.cpp
+ message.cpp
+ parser.cpp
+ read.cpp
+ rfc7230.cpp
+ serializer.cpp
+ span_body.cpp
+ status.cpp
+ string_body.cpp
+ type_traits.cpp
+ vector_body.cpp
+ verb.cpp
+ write.cpp
+ ;
+
+local RUN_TESTS ;
+
+for local f in $(SOURCES)
+{
+ RUN_TESTS += [ run $(f)
+ /boost/beast/test//lib-test
+ ] ;
+}
+
+alias run-tests : $(RUN_TESTS) ;
+
+exe fat-tests :
+ $(SOURCES)
+ /boost/beast/test//lib-test
+ ;
+
+explicit fat-tests ;
+
+run $(SOURCES)
+ /boost/beast/test//lib-test
+ : : : : run-fat-tests ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/http/basic_dynamic_body.cpp b/src/boost/libs/beast/test/beast/http/basic_dynamic_body.cpp
new file mode 100644
index 000000000..8f945c484
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/basic_dynamic_body.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/basic_dynamic_body.hpp>
diff --git a/src/boost/libs/beast/test/beast/http/basic_file_body.cpp b/src/boost/libs/beast/test/beast/http/basic_file_body.cpp
new file mode 100644
index 000000000..79710bbeb
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/basic_file_body.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/basic_file_body.hpp>
diff --git a/src/boost/libs/beast/test/beast/http/basic_parser.cpp b/src/boost/libs/beast/test/beast/http/basic_parser.cpp
new file mode 100644
index 000000000..f4073b745
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/basic_parser.cpp
@@ -0,0 +1,1414 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/basic_parser.hpp>
+
+#include "message_fuzz.hpp"
+#include "test_parser.hpp"
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_cat.hpp>
+#include <boost/beast/core/buffers_prefix.hpp>
+#include <boost/beast/core/buffers_suffix.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/http/parser.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/test/fuzz.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class basic_parser_test : public beast::unit_test::suite
+{
+public:
+ enum parse_flag
+ {
+ chunked = 1,
+ connection_keep_alive = 2,
+ connection_close = 4,
+ connection_upgrade = 8,
+ upgrade = 16,
+ };
+
+ class expect_version
+ {
+ suite& s_;
+ int version_;
+
+ public:
+ expect_version(suite& s, int version)
+ : s_(s)
+ , version_(version)
+ {
+ }
+
+ template<class Parser>
+ void
+ operator()(Parser const& p) const
+ {
+ s_.BEAST_EXPECT(p.version == version_);
+ }
+ };
+
+ class expect_status
+ {
+ suite& s_;
+ int status_;
+
+ public:
+ expect_status(suite& s, int status)
+ : s_(s)
+ , status_(status)
+ {
+ }
+
+ template<class Parser>
+ void
+ operator()(Parser const& p) const
+ {
+ s_.BEAST_EXPECT(p.status == status_);
+ }
+ };
+
+ class expect_flags
+ {
+ suite& s_;
+ unsigned flags_;
+
+ public:
+ expect_flags(suite& s, unsigned flags)
+ : s_(s)
+ , flags_(flags)
+ {
+ }
+
+ template<class Parser>
+ void
+ operator()(Parser const& p) const
+ {
+ if(flags_ & parse_flag::chunked)
+ s_.BEAST_EXPECT(p.chunked());
+ if(flags_ & parse_flag::connection_keep_alive)
+ s_.BEAST_EXPECT(p.keep_alive());
+ if(flags_ & parse_flag::connection_close)
+ s_.BEAST_EXPECT(! p.keep_alive());
+ if(flags_ & parse_flag::upgrade)
+ s_.BEAST_EXPECT(! p.upgrade());
+ }
+ };
+
+ class expect_keepalive
+ {
+ suite& s_;
+ bool v_;
+
+ public:
+ expect_keepalive(suite& s, bool v)
+ : s_(s)
+ , v_(v)
+ {
+ }
+
+ template<class Parser>
+ void
+ operator()(Parser const& p) const
+ {
+ s_.BEAST_EXPECT(p.keep_alive() == v_);
+ }
+ };
+
+ class expect_body
+ {
+ suite& s_;
+ std::string const& body_;
+
+ public:
+ expect_body(expect_body&&) = default;
+
+ expect_body(suite& s, std::string const& v)
+ : s_(s)
+ , body_(v)
+ {
+ }
+
+ template<class Parser>
+ void
+ operator()(Parser const& p) const
+ {
+ s_.BEAST_EXPECT(p.body == body_);
+ }
+ };
+
+ //--------------------------------------------------------------------------
+
+ template<class Parser, class ConstBufferSequence, class Test>
+ typename std::enable_if<
+ net::is_const_buffer_sequence<ConstBufferSequence>::value>::type
+ parsegrind(ConstBufferSequence const& buffers,
+ Test const& test, bool skip = false)
+ {
+ auto const size = buffer_bytes(buffers);
+ for(std::size_t i = 1; i < size - 1; ++i)
+ {
+ Parser p;
+ p.eager(true);
+ p.skip(skip);
+ error_code ec;
+ buffers_suffix<ConstBufferSequence> cb{buffers};
+ auto n = p.put(buffers_prefix(i, cb), ec);
+ if(! BEAST_EXPECTS(! ec ||
+ ec == error::need_more, ec.message()))
+ continue;
+ if(! BEAST_EXPECT(! p.is_done()))
+ continue;
+ cb.consume(n);
+ n = p.put(cb, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ if(! BEAST_EXPECT(n == buffer_bytes(cb)))
+ continue;
+ if(p.need_eof())
+ {
+ p.put_eof(ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ }
+ if(! BEAST_EXPECT(p.is_done()))
+ continue;
+ test(p);
+ }
+ for(std::size_t i = 1; i < size - 1; ++i)
+ {
+ Parser p;
+ p.eager(true);
+ error_code ec;
+ buffers_suffix<ConstBufferSequence> cb{buffers};
+ cb.consume(i);
+ auto n = p.put(buffers_cat(
+ buffers_prefix(i, buffers), cb), ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ if(! BEAST_EXPECT(n == size))
+ continue;
+ if(p.need_eof())
+ {
+ p.put_eof(ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ }
+ test(p);
+ }
+ }
+
+ template<class Parser, class Test>
+ void
+ parsegrind(string_view msg, Test const& test, bool skip = false)
+ {
+ parsegrind<Parser>(net::const_buffer{
+ msg.data(), msg.size()}, test, skip);
+ }
+
+ template<class Parser, class ConstBufferSequence>
+ typename std::enable_if<
+ net::is_const_buffer_sequence<ConstBufferSequence>::value>::type
+ parsegrind(ConstBufferSequence const& buffers)
+ {
+ parsegrind<Parser>(buffers, [](Parser const&){});
+ }
+
+ template<class Parser>
+ void
+ parsegrind(string_view msg)
+ {
+ parsegrind<Parser>(msg, [](Parser const&){});
+ }
+
+ template<class Parser>
+ void
+ failgrind(string_view msg, error_code const& result)
+ {
+ for(std::size_t i = 1; i < msg.size() - 1; ++i)
+ {
+ Parser p;
+ p.eager(true);
+ error_code ec;
+ buffers_suffix<net::const_buffer> cb{
+ boost::in_place_init, msg.data(), msg.size()};
+ auto n = p.put(buffers_prefix(i, cb), ec);
+ if(ec == result)
+ {
+ pass();
+ continue;
+ }
+ if(! BEAST_EXPECTS(
+ ec == error::need_more, ec.message()))
+ continue;
+ if(! BEAST_EXPECT(! p.is_done()))
+ continue;
+ cb.consume(n);
+ n = p.put(cb, ec);
+ if(! ec)
+ p.put_eof(ec);
+ BEAST_EXPECTS(ec == result, ec.message());
+ }
+ for(std::size_t i = 1; i < msg.size() - 1; ++i)
+ {
+ Parser p;
+ p.eager(true);
+ error_code ec;
+ p.put(buffers_cat(
+ net::const_buffer{msg.data(), i},
+ net::const_buffer{
+ msg.data() + i, msg.size() - i}), ec);
+ if(! ec)
+ p.put_eof(ec);
+ BEAST_EXPECTS(ec == result, ec.message());
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ testFlatten()
+ {
+ parsegrind<test_parser<true>>(
+ "GET / HTTP/1.1\r\n"
+ "\r\n"
+ );
+ parsegrind<test_parser<true>>(
+ "POST / HTTP/1.1\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****"
+ );
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 403 Not Found\r\n"
+ "\r\n"
+ );
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****"
+ );
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "5;x\r\n*****\r\n"
+ "0\r\nMD5: 0xff30\r\n"
+ "\r\n"
+ );
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "\r\n"
+ "*****"
+ );
+ }
+
+ void
+ testObsFold()
+ {
+ auto const check =
+ [&](std::string const& s, string_view value)
+ {
+ std::string m =
+ "GET / HTTP/1.1\r\n"
+ "f: " + s + "\r\n"
+ "\r\n";
+ parsegrind<request_parser<string_body>>(m,
+ [&](request_parser<string_body> const& p)
+ {
+ BEAST_EXPECT(p.get()["f"] == value);
+ });
+ };
+ check("x", "x");
+ check(" x", "x");
+ check("\tx", "x");
+ check(" \tx", "x");
+ check("\t x", "x");
+ check("x ", "x");
+ check(" x\t", "x");
+ check("\tx \t", "x");
+ check(" \tx\t ", "x");
+ check("\t x \t ", "x");
+ check("\r\n x", "x");
+ check(" \r\n x", "x");
+ check(" \r\n\tx", "x");
+ check(" \r\n\t x", "x");
+ check(" \r\n \tx", "x");
+ check(" \r\n \r\n \r\n x \t", "x");
+ check("xy", "xy");
+ check("\r\n x", "x");
+ check("\r\n x", "x");
+ check("\r\n xy", "xy");
+ check("\r\n \r\n \r\n x", "x");
+ check("\r\n \r\n \r\n xy", "xy");
+ check("x\r\n y", "x y");
+ check("x\r\n y\r\n z ", "x y z");
+ }
+
+ // Check that all callbacks are invoked
+ void
+ testCallbacks()
+ {
+ parsegrind<test_parser<true>>(
+ "GET / HTTP/1.1\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n"
+ "*",
+ [&](test_parser<true> const& p)
+ {
+ BEAST_EXPECT(p.got_on_begin == 1);
+ BEAST_EXPECT(p.got_on_field == 2);
+ BEAST_EXPECT(p.got_on_header == 1);
+ BEAST_EXPECT(p.got_on_body == 1);
+ BEAST_EXPECT(p.got_on_chunk == 0);
+ BEAST_EXPECT(p.got_on_complete == 1);
+ });
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n"
+ "*",
+ [&](test_parser<false> const& p)
+ {
+ BEAST_EXPECT(p.got_on_begin == 1);
+ BEAST_EXPECT(p.got_on_field == 2);
+ BEAST_EXPECT(p.got_on_header == 1);
+ BEAST_EXPECT(p.got_on_body == 1);
+ BEAST_EXPECT(p.got_on_chunk == 0);
+ BEAST_EXPECT(p.got_on_complete == 1);
+ });
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "1\r\n*\r\n"
+ "0\r\n\r\n",
+ [&](test_parser<false> const& p)
+ {
+ BEAST_EXPECT(p.got_on_begin == 1);
+ BEAST_EXPECT(p.got_on_field == 2);
+ BEAST_EXPECT(p.got_on_header == 1);
+ BEAST_EXPECT(p.got_on_body == 1);
+ BEAST_EXPECT(p.got_on_chunk == 2);
+ BEAST_EXPECT(p.got_on_complete == 1);
+ });
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "1;x\r\n*\r\n"
+ "0\r\n\r\n",
+ [&](test_parser<false> const& p)
+ {
+ BEAST_EXPECT(p.got_on_begin == 1);
+ BEAST_EXPECT(p.got_on_field == 2);
+ BEAST_EXPECT(p.got_on_header == 1);
+ BEAST_EXPECT(p.got_on_body == 1);
+ BEAST_EXPECT(p.got_on_chunk == 2);
+ BEAST_EXPECT(p.got_on_complete == 1);
+ });
+ }
+
+ void
+ testRequestLine()
+ {
+ using P = test_parser<true>;
+
+ parsegrind<P>("GET /x HTTP/1.0\r\n\r\n");
+ parsegrind<P>("!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz / HTTP/1.0\r\n\r\n");
+ parsegrind<P>("GET / HTTP/1.0\r\n\r\n", expect_version{*this, 10});
+ parsegrind<P>("G / HTTP/1.1\r\n\r\n", expect_version{*this, 11});
+ // VFALCO TODO various forms of good request-target (uri)
+
+ failgrind<P>("\tGET / HTTP/1.0\r\n" "\r\n", error::bad_method);
+ failgrind<P>("GET\x01 / HTTP/1.0\r\n" "\r\n", error::bad_method);
+ failgrind<P>("GET / HTTP/1.0\r\n" "\r\n", error::bad_target);
+ failgrind<P>("GET \x01 HTTP/1.0\r\n" "\r\n", error::bad_target);
+ failgrind<P>("GET /\x01 HTTP/1.0\r\n" "\r\n", error::bad_target);
+ // VFALCO TODO various forms of bad request-target (uri)
+ failgrind<P>("GET / HTTP/1.0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / _TTP/1.0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / H_TP/1.0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HT_P/1.0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTT_/1.0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP_1.0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/01.2\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/3.45\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/67.89\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/x.0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/1.x\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/1.0 \r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/1_0\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/1.0\n\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/1.0\n\r\r\n" "\r\n", error::bad_version);
+ failgrind<P>("GET / HTTP/1.0\r\r\n" "\r\n", error::bad_version);
+ }
+
+ void
+ testStatusLine()
+ {
+ using P = test_parser<false>;
+
+ parsegrind<P>("HTTP/1.0 000 OK\r\n" "\r\n", expect_status{*this, 0});
+ parsegrind<P>("HTTP/1.1 012 OK\r\n" "\r\n", expect_status{*this, 12});
+ parsegrind<P>("HTTP/1.0 345 OK\r\n" "\r\n", expect_status{*this, 345});
+ parsegrind<P>("HTTP/1.0 678 OK\r\n" "\r\n", expect_status{*this, 678});
+ parsegrind<P>("HTTP/1.0 999 OK\r\n" "\r\n", expect_status{*this, 999});
+ parsegrind<P>("HTTP/1.0 200 \tX\r\n" "\r\n", expect_version{*this, 10});
+ parsegrind<P>("HTTP/1.1 200 X\r\n" "\r\n", expect_version{*this, 11});
+ parsegrind<P>("HTTP/1.0 200 \r\n" "\r\n");
+ parsegrind<P>("HTTP/1.1 200 X \r\n" "\r\n");
+ parsegrind<P>("HTTP/1.1 200 X\t\r\n" "\r\n");
+ parsegrind<P>("HTTP/1.1 200 \x80\x81...\xfe\xff\r\n\r\n");
+ parsegrind<P>("HTTP/1.1 200 !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\r\n\r\n");
+
+ failgrind<P>("\rHTTP/1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("\nHTTP/1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>(" HTTP/1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("_TTP/1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("H_TP/1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HT_P/1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTT_/1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP_1.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP/01.2 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP/3.45 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP/67.89 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP/x.0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP/1.x 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP/1_0 200 OK\r\n" "\r\n", error::bad_version);
+ failgrind<P>("HTTP/1.0 200 OK\r\n" "\r\n", error::bad_status);
+ failgrind<P>("HTTP/1.0 0 OK\r\n" "\r\n", error::bad_status);
+ failgrind<P>("HTTP/1.0 12 OK\r\n" "\r\n", error::bad_status);
+ failgrind<P>("HTTP/1.0 3456 OK\r\n" "\r\n", error::bad_status);
+ failgrind<P>("HTTP/1.0 200\r\n" "\r\n", error::bad_status);
+ failgrind<P>("HTTP/1.0 200 \n\r\n" "\r\n", error::bad_reason);
+ failgrind<P>("HTTP/1.0 200 \x01\r\n" "\r\n", error::bad_reason);
+ failgrind<P>("HTTP/1.0 200 \x7f\r\n" "\r\n", error::bad_reason);
+ failgrind<P>("HTTP/1.0 200 OK\n\r\n" "\r\n", error::bad_reason);
+ failgrind<P>("HTTP/1.0 200 OK\r\r\n" "\r\n", error::bad_line_ending);
+ }
+
+ void
+ testFields()
+ {
+ auto const m =
+ [](std::string const& s)
+ {
+ return "GET / HTTP/1.1\r\n" + s + "\r\n";
+ };
+
+ using P = test_parser<true>;
+
+ parsegrind<P>(m("f:\r\n"));
+ parsegrind<P>(m("f: \r\n"));
+ parsegrind<P>(m("f:\t\r\n"));
+ parsegrind<P>(m("f: \t\r\n"));
+ parsegrind<P>(m("f: v\r\n"));
+ parsegrind<P>(m("f:\tv\r\n"));
+ parsegrind<P>(m("f:\tv \r\n"));
+ parsegrind<P>(m("f:\tv\t\r\n"));
+ parsegrind<P>(m("f:\tv\t \r\n"));
+ parsegrind<P>(m("f:\r\n \r\n"));
+ parsegrind<P>(m("f:v\r\n"));
+ parsegrind<P>(m("f: v\r\n u\r\n"));
+ parsegrind<P>(m("!#$%&'*+-.^_`|~0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz: v\r\n"));
+ parsegrind<P>(m("f: !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x80\x81...\xfe\xff\r\n"));
+
+ failgrind<P>(m(" f: v\r\n"), error::bad_field);
+ failgrind<P>(m("\tf: v\r\n"), error::bad_field);
+ failgrind<P>(m("f : v\r\n"), error::bad_field);
+ failgrind<P>(m("f\t: v\r\n"), error::bad_field);
+ failgrind<P>(m("f: \n\r\n"), error::bad_value);
+ failgrind<P>(m("f: v\r \r\n"), error::bad_line_ending);
+ failgrind<P>(m("f: \r v\r\n"), error::bad_line_ending);
+ failgrind<P>(
+ "GET / HTTP/1.1\r\n"
+ "\r \n\r\n"
+ "\r\n", error::bad_line_ending);
+ }
+
+ void
+ testConnectionField()
+ {
+ auto const m = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\n" + s + "\r\n"; };
+ auto const cn = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\nConnection: " + s + "\r\n"; };
+ #if 0
+ auto const keepalive = [&](bool v)
+ { //return keepalive_f{*this, v}; return true; };
+ #endif
+
+ using P = test_parser<true>;
+
+ parsegrind<P>(cn("close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn(",close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn(" close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("\tclose\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("close,\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("close\t\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn(" ,\t,,close,, ,\t,,\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("\r\n close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("close\r\n \r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("any,close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("close,any\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("any\r\n ,close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("close\r\n ,any\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(cn("close,close\r\n"), expect_flags{*this, parse_flag::connection_close}); // weird but allowed
+
+ parsegrind<P>(cn("keep-alive\r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("keep-alive \r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("keep-alive\t \r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("keep-alive\t ,x\r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("\r\n keep-alive \t\r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("keep-alive \r\n \t \r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("keep-alive\r\n \r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+
+ parsegrind<P>(cn("upgrade\r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+ parsegrind<P>(cn("upgrade \r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+ parsegrind<P>(cn("upgrade\t \r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+ parsegrind<P>(cn("upgrade\t ,x\r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+ parsegrind<P>(cn("\r\n upgrade \t\r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+ parsegrind<P>(cn("upgrade \r\n \t \r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+ parsegrind<P>(cn("upgrade\r\n \r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+
+ // VFALCO What's up with these?
+ //parsegrind<P>(cn("close,keep-alive\r\n"), expect_flags{*this, parse_flag::connection_close | parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("upgrade,keep-alive\r\n"), expect_flags{*this, parse_flag::connection_upgrade | parse_flag::connection_keep_alive});
+ parsegrind<P>(cn("upgrade,\r\n keep-alive\r\n"), expect_flags{*this, parse_flag::connection_upgrade | parse_flag::connection_keep_alive});
+ //parsegrind<P>(cn("close,keep-alive,upgrade\r\n"), expect_flags{*this, parse_flag::connection_close | parse_flag::connection_keep_alive | parse_flag::connection_upgrade});
+
+ parsegrind<P>("GET / HTTP/1.1\r\n\r\n", expect_keepalive(*this, true));
+ parsegrind<P>("GET / HTTP/1.0\r\n\r\n", expect_keepalive(*this, false));
+ parsegrind<P>("GET / HTTP/1.0\r\n"
+ "Connection: keep-alive\r\n\r\n", expect_keepalive(*this, true));
+ parsegrind<P>("GET / HTTP/1.1\r\n"
+ "Connection: close\r\n\r\n", expect_keepalive(*this, false));
+
+ parsegrind<P>(cn("x\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("x,y\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("x ,y\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("x\t,y\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("keep\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn(",keep\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn(" keep\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("\tnone\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("keep,\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("keep\t\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("keep\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn(" ,\t,,keep,, ,\t,,\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("\r\n keep\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("keep\r\n \r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("closet\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn(",closet\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn(" closet\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("\tcloset\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("closet,\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("closet\t\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("closet\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn(" ,\t,,closet,, ,\t,,\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("\r\n closet\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("closet\r\n \r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("clog\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("key\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("uptown\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("keeper\r\n \r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("keep-alively\r\n \r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("up\r\n \r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("upgrader\r\n \r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("none\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(cn("\r\n none\r\n"), expect_flags{*this, 0});
+
+ parsegrind<P>(m("ConnectioX: close\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Condor: close\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Connect: close\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Connections: close\r\n"), expect_flags{*this, 0});
+
+ parsegrind<P>(m("Proxy-Connection: close\r\n"), expect_flags{*this, parse_flag::connection_close});
+ parsegrind<P>(m("Proxy-Connection: keep-alive\r\n"), expect_flags{*this, parse_flag::connection_keep_alive});
+ parsegrind<P>(m("Proxy-Connection: upgrade\r\n"), expect_flags{*this, parse_flag::connection_upgrade});
+ parsegrind<P>(m("Proxy-ConnectioX: none\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Proxy-Connections: 1\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Proxy-Connotes: see-also\r\n"), expect_flags{*this, 0});
+
+ failgrind<P>(cn("[\r\n"), error::bad_value);
+ failgrind<P>(cn("close[\r\n"), error::bad_value);
+ failgrind<P>(cn("close [\r\n"), error::bad_value);
+ failgrind<P>(cn("close, upgrade [\r\n"), error::bad_value);
+ failgrind<P>(cn("upgrade[]\r\n"), error::bad_value);
+ failgrind<P>(cn("keep\r\n -alive\r\n"), error::bad_value);
+ failgrind<P>(cn("keep-alive[\r\n"), error::bad_value);
+ failgrind<P>(cn("keep-alive []\r\n"), error::bad_value);
+ failgrind<P>(cn("no[ne]\r\n"), error::bad_value);
+ }
+
+ void
+ testContentLengthField()
+ {
+ using P = test_parser<true>;
+ auto const c = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\nContent-Length: " + s + "\r\n"; };
+ auto const m = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\n" + s + "\r\n"; };
+ auto const check =
+ [&](std::string const& s, std::uint64_t v)
+ {
+ parsegrind<P>(c(s),
+ [&](P const& p)
+ {
+ BEAST_EXPECT(p.content_length());
+ BEAST_EXPECT(p.content_length() && *p.content_length() == v);
+ }, true);
+ };
+
+ check("0\r\n", 0);
+ check("00\r\n", 0);
+ check("1\r\n", 1);
+ check("01\r\n", 1);
+ check("9\r\n", 9);
+ check("42 \r\n", 42);
+ check("42\t\r\n", 42);
+ check("42 \t \r\n", 42);
+ check("42\r\n \t \r\n", 42);
+
+ parsegrind<P>(m("Content-LengtX: 0\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Content-Lengths: many\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Content: full\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Content-Length: 0\r\n"
+ "Content-Length: 0\r\n"), expect_flags{*this, 0});
+
+ failgrind<P>(c("\r\n"), error::bad_content_length);
+ failgrind<P>(c("18446744073709551616\r\n"), error::bad_content_length);
+ failgrind<P>(c("0 0\r\n"), error::bad_content_length);
+ failgrind<P>(c("0 1\r\n"), error::bad_content_length);
+ failgrind<P>(c(",\r\n"), error::bad_content_length);
+ failgrind<P>(c("0,\r\n"), error::bad_content_length);
+ failgrind<P>(m("Content-Length: 0\r\n"
+ "Content-Length: 100\r\n"), error::bad_content_length);
+ }
+
+ void
+ testTransferEncodingField()
+ {
+ auto const m = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\n" + s + "\r\n"; };
+ auto const ce = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\nTransfer-Encoding: " + s + "\r\n0\r\n\r\n"; };
+ auto const te = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\nTransfer-Encoding: " + s + "\r\n"; };
+
+ using P = test_parser<true>;
+
+ parsegrind<P>(ce("chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("chunked \r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("chunked\t\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("chunked \t\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce(" chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("\tchunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("chunked,\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("chunked ,\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("chunked, \r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce(",chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce(", chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce(" ,chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("chunked\r\n \r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("\r\n chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce(",\r\n chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("\r\n ,chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce(",\r\n chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("gzip, chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("gzip, chunked \r\n"), expect_flags{*this, parse_flag::chunked});
+ parsegrind<P>(ce("gzip, \r\n chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+
+ // Technically invalid but beyond the parser's scope to detect
+ // VFALCO Look into this
+ //parsegrind<P>(ce("custom;key=\",chunked\r\n"), expect_flags{*this, parse_flag::chunked});
+
+ parsegrind<P>(te("gzip\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("chunked, gzip\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("chunked\r\n , gzip\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("chunked,\r\n gzip\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("chunked,\r\n ,gzip\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("bigchunked\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("chunk\r\n ked\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("bar\r\n ley chunked\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(te("barley\r\n chunked\r\n"), expect_flags{*this, 0});
+
+ parsegrind<P>(m("Transfer-EncodinX: none\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Transfer-Encodings: 2\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Transfer-Encoded: false\r\n"), expect_flags{*this, 0});
+
+ failgrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 1\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n", error::bad_transfer_encoding);
+ }
+
+ void
+ testUpgradeField()
+ {
+ auto const m = [](std::string const& s)
+ { return "GET / HTTP/1.1\r\n" + s + "\r\n"; };
+
+ using P = test_parser<true>;
+
+ parsegrind<P>(m("Upgrade:\r\n"), expect_flags{*this, parse_flag::upgrade});
+ parsegrind<P>(m("Upgrade: \r\n"), expect_flags{*this, parse_flag::upgrade});
+ parsegrind<P>(m("Upgrade: yes\r\n"), expect_flags{*this, parse_flag::upgrade});
+
+ parsegrind<P>(m("Up: yes\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("UpgradX: none\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Upgrades: 2\r\n"), expect_flags{*this, 0});
+ parsegrind<P>(m("Upsample: 4x\r\n"), expect_flags{*this, 0});
+
+ parsegrind<P>(
+ "GET / HTTP/1.1\r\n"
+ "Connection: upgrade\r\n"
+ "Upgrade: WebSocket\r\n"
+ "\r\n",
+ [&](P const& p)
+ {
+ BEAST_EXPECT(p.upgrade());
+ });
+ }
+
+ void
+ testPartial()
+ {
+ // Make sure the slow-loris defense works and that
+ // we don't get duplicate or missing fields on a split.
+ parsegrind<test_parser<true>>(
+ "GET / HTTP/1.1\r\n"
+ "a: 0\r\n"
+ "b: 1\r\n"
+ "c: 2\r\n"
+ "d: 3\r\n"
+ "e: 4\r\n"
+ "f: 5\r\n"
+ "g: 6\r\n"
+ "h: 7\r\n"
+ "i: 8\r\n"
+ "j: 9\r\n"
+ "\r\n",
+ [&](test_parser<true> const& p)
+ {
+ BEAST_EXPECT(p.fields.size() == 10);
+ BEAST_EXPECT(p.fields.at("a") == "0");
+ BEAST_EXPECT(p.fields.at("b") == "1");
+ BEAST_EXPECT(p.fields.at("c") == "2");
+ BEAST_EXPECT(p.fields.at("d") == "3");
+ BEAST_EXPECT(p.fields.at("e") == "4");
+ BEAST_EXPECT(p.fields.at("f") == "5");
+ BEAST_EXPECT(p.fields.at("g") == "6");
+ BEAST_EXPECT(p.fields.at("h") == "7");
+ BEAST_EXPECT(p.fields.at("i") == "8");
+ BEAST_EXPECT(p.fields.at("j") == "9");
+ });
+ }
+
+ void
+ testLimits()
+ {
+ {
+ multi_buffer b;
+ ostream(b) <<
+ "POST / HTTP/1.1\r\n"
+ "Content-Length: 2\r\n"
+ "\r\n"
+ "**";
+ error_code ec;
+ test_parser<true> p;
+ p.header_limit(10);
+ p.eager(true);
+ p.put(b.data(), ec);
+ BEAST_EXPECTS(ec == error::header_limit, ec.message());
+ }
+ {
+ multi_buffer b;
+ ostream(b) <<
+ "POST / HTTP/1.1\r\n"
+ "Content-Length: 2\r\n"
+ "\r\n"
+ "**";
+ error_code ec;
+ test_parser<true> p;
+ p.body_limit(1);
+ p.eager(true);
+ p.put(b.data(), ec);
+ BEAST_EXPECTS(ec == error::body_limit, ec.message());
+ }
+ {
+ multi_buffer b;
+ ostream(b) <<
+ "HTTP/1.1 200 OK\r\n"
+ "\r\n"
+ "**";
+ error_code ec;
+ test_parser<false> p;
+ p.body_limit(1);
+ p.eager(true);
+ p.put(b.data(), ec);
+ BEAST_EXPECTS(ec == error::body_limit, ec.message());
+ }
+ {
+ multi_buffer b;
+ ostream(b) <<
+ "POST / HTTP/1.1\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "2\r\n"
+ "**\r\n"
+ "0\r\n\r\n";
+ error_code ec;
+ test_parser<true> p;
+ p.body_limit(1);
+ p.eager(true);
+ p.put(b.data(), ec);
+ BEAST_EXPECTS(ec == error::body_limit, ec.message());
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ static
+ net::const_buffer
+ buf(string_view s)
+ {
+ return {s.data(), s.size()};
+ }
+
+ template<class ConstBufferSequence, bool isRequest>
+ std::size_t
+ feed(ConstBufferSequence const& buffers,
+ basic_parser<isRequest>& p, error_code& ec)
+ {
+ p.eager(true);
+ return p.put(buffers, ec);
+ }
+
+ void
+ testBody()
+ {
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "Content-Type: application/octet-stream\r\n"
+ "\r\n"
+ "4\r\nabcd\r\n"
+ "0\r\n\r\n"
+ ,[&](test_parser<false> const& p)
+ {
+ BEAST_EXPECT(p.body == "abcd");
+ });
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Expect: Expires, MD5-Fingerprint\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "5\r\n"
+ "*****\r\n"
+ "2;a;b=1;c=\"2\"\r\n"
+ "--\r\n"
+ "0;d;e=3;f=\"4\"\r\n"
+ "Expires: never\r\n"
+ "MD5-Fingerprint: -\r\n"
+ "\r\n"
+ ,[&](test_parser<false> const& p)
+ {
+ BEAST_EXPECT(p.body == "*****--");
+ });
+
+ parsegrind<test_parser<true>>(
+ "GET / HTTP/1.1\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n"
+ "1",
+ expect_body(*this, "1"));
+
+ parsegrind<test_parser<false>>(
+ "HTTP/1.0 200 OK\r\n"
+ "\r\n"
+ "hello",
+ expect_body(*this, "hello"));
+
+ parsegrind<test_parser<true>>(buffers_cat(
+ buf("GET / HTTP/1.1\r\n"
+ "Content-Length: 10\r\n"
+ "\r\n"),
+ buf("12"),
+ buf("345"),
+ buf("67890")));
+
+ // request without Content-Length or
+ // Transfer-Encoding: chunked has no body.
+ {
+ error_code ec;
+ test_parser<true> p;
+ feed(buf(
+ "GET / HTTP/1.0\r\n"
+ "\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ }
+ {
+ error_code ec;
+ test_parser<true> p;
+ feed(buf(
+ "GET / HTTP/1.1\r\n"
+ "\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ }
+
+ // response without Content-Length or
+ // Transfer-Encoding: chunked requires eof.
+ {
+ error_code ec;
+ test_parser<false> p;
+ feed(buf(
+ "HTTP/1.0 200 OK\r\n"
+ "\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(! p.is_done());
+ BEAST_EXPECT(p.need_eof());
+ }
+
+ // 304 "Not Modified" response does not require eof
+ {
+ error_code ec;
+ test_parser<false> p;
+ feed(buf(
+ "HTTP/1.0 304 Not Modified\r\n"
+ "\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ }
+
+ // Chunked response does not require eof
+ {
+ error_code ec;
+ test_parser<false> p;
+ feed(buf(
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(! p.is_done());
+ feed(buf(
+ "0\r\n\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ }
+
+ // restart: 1.0 assumes Connection: close
+ {
+ error_code ec;
+ test_parser<true> p;
+ feed(buf(
+ "GET / HTTP/1.0\r\n"
+ "\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ }
+
+ // restart: 1.1 assumes Connection: keep-alive
+ {
+ error_code ec;
+ test_parser<true> p;
+ feed(buf(
+ "GET / HTTP/1.1\r\n"
+ "\r\n"
+ ), p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ }
+
+ failgrind<test_parser<true>>(
+ "GET / HTTP/1.1\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n",
+ error::partial_message);
+ }
+
+ //--------------------------------------------------------------------------
+
+ // https://github.com/boostorg/beast/issues/430
+ void
+ testIssue430()
+ {
+ parsegrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "Content-Type: application/octet-stream\r\n"
+ "\r\n"
+ "4\r\nabcd\r\n"
+ "0\r\n\r\n");
+ }
+
+ // https://github.com/boostorg/beast/issues/452
+ void
+ testIssue452()
+ {
+ error_code ec;
+ test_parser<true> p;
+ p.eager(true);
+ string_view s =
+ "GET / HTTP/1.1\r\n"
+ "\r\n"
+ "die!";
+ p.put(net::buffer(
+ s.data(), s.size()), ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ BEAST_EXPECT(p.is_done());
+ }
+
+ // https://github.com/boostorg/beast/issues/496
+ void
+ testIssue496()
+ {
+ // The bug affected hex parsing with leading zeroes
+ using P = test_parser<false>;
+ parsegrind<P>(
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "Content-Type: application/octet-stream\r\n"
+ "\r\n"
+ "0004\r\nabcd\r\n"
+ "0\r\n\r\n"
+ ,[&](P const& p)
+ {
+ BEAST_EXPECT(p.body == "abcd");
+ });
+ }
+
+ // https://github.com/boostorg/beast/issues/692
+ void
+ testIssue692()
+ {
+ error_code ec;
+ test_parser<false> p;
+ p.eager(true);
+ string_view s =
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Content-Length: 2147483648\r\n"
+ "\r\n";
+ p.put(net::buffer(
+ s.data(), s.size()), ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ BEAST_EXPECT(p.is_done());
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ testFuzz()
+ {
+ auto const grind =
+ [&](string_view s)
+ {
+ static_string<100> ss{s};
+ test::fuzz_rand r;
+ test::fuzz(ss, 4, 5, r,
+ [&](string_view s)
+ {
+ error_code ec;
+ test_parser<false> p;
+ p.eager(true);
+ p.put(net::const_buffer{
+ s.data(), s.size()}, ec);
+ });
+ };
+ auto const good =
+ [&](string_view s)
+ {
+ std::string msg =
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "0" + std::string(s) + "\r\n"
+ "\r\n";
+ error_code ec;
+ test_parser<false> p;
+ p.eager(true);
+ p.put(net::const_buffer{
+ msg.data(), msg.size()}, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ grind(msg);
+ };
+ auto const bad =
+ [&](string_view s)
+ {
+ std::string msg =
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "0" + std::string(s) + "\r\n"
+ "\r\n";
+ error_code ec;
+ test_parser<false> p;
+ p.eager(true);
+ p.put(net::const_buffer{
+ msg.data(), msg.size()}, ec);
+ BEAST_EXPECT(ec);
+ grind(msg);
+ };
+ chunkExtensionsTest(good, bad);
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ testRegression1()
+ {
+ // crash_00cda0b02d5166bd1039ddb3b12618cd80da75f3
+ unsigned char buf[] ={
+ 0x4C,0x4F,0x43,0x4B,0x20,0x2F,0x25,0x65,0x37,0x6C,0x59,0x3B,0x2F,0x3B,0x3B,0x25,0x30,0x62,0x38,0x3D,0x70,0x2F,0x72,0x20,
+ 0x48,0x54,0x54,0x50,0x2F,0x31,0x2E,0x31,0x0D,0x0A,0x41,0x63,0x63,0x65,0x70,0x74,0x2D,0x45,0x6E,0x63,0x6F,0x64,0x69,0x6E,
+ 0x67,0x3A,0x0D,0x0A,0x09,0x20,0xEE,0x0D,0x0A,0x4F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x2D,0x4D,0x65,0x73,0x73,0x61,0x67,
+ 0x65,0x2D,0x49,0x44,0x3A,0xEB,0x09,0x09,0x09,0x09,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x3A,0x20,0x0D,0x0A,0x09,0x20,
+ 0xF7,0x44,0x9B,0xA5,0x06,0x9F,0x0D,0x0A,0x52,0x65,0x73,0x65,0x6E,0x74,0x2D,0x44,0x61,0x74,0x65,0x3A,0xF4,0x0D,0x0A,0x41,
+ 0x6C,0x74,0x2D,0x53,0x76,0x63,0x3A,0x20,0x0D,0x0A,0x54,0x72,0x61,0x69,0x6C,0x65,0x72,0x3A,0x20,0x20,0x09,0x20,0x20,0x20,
+ 0x0D,0x0A,0x4C,0x69,0x73,0x74,0x2D,0x49,0x44,0x3A,0xA6,0x6B,0x86,0x09,0x09,0x20,0x09,0x0D,0x0A,0x41,0x6C,0x74,0x65,0x72,
+ 0x6E,0x61,0x74,0x65,0x2D,0x52,0x65,0x63,0x69,0x70,0x69,0x65,0x6E,0x74,0x3A,0xF3,0x13,0xE3,0x22,0x9D,0xEF,0xFB,0x84,0x71,
+ 0x4A,0xCC,0xBC,0x96,0xF7,0x5B,0x72,0xF1,0xF2,0x0D,0x0A,0x4C,0x6F,0x63,0x61,0x74,0x69,0x6F,0x6E,0x3A,0x20,0x0D,0x0A,0x41,
+ 0x63,0x63,0x65,0x70,0x74,0x2D,0x41,0x64,0x64,0x69,0x74,0x69,0x6F,0x6E,0x73,0x3A,0x20,0x0D,0x0A,0x4D,0x4D,0x48,0x53,0x2D,
+ 0x4F,0x72,0x69,0x67,0x69,0x6E,0x61,0x74,0x6F,0x72,0x2D,0x50,0x4C,0x41,0x44,0x3A,0x20,0x0D,0x0A,0x4F,0x72,0x69,0x67,0x69,
+ 0x6E,0x61,0x6C,0x2D,0x53,0x65,0x6E,0x64,0x65,0x72,0x3A,0x20,0x0D,0x0A,0x4F,0x72,0x69,0x67,0x69,0x6E,0x61,0x6C,0x2D,0x53,
+ 0x65,0x6E,0x64,0x65,0x72,0x3A,0x0D,0x0A,0x50,0x49,0x43,0x53,0x2D,0x4C,0x61,0x62,0x65,0x6C,0x3A,0x0D,0x0A,0x20,0x09,0x0D,
+ 0x0A,0x49,0x66,0x3A,0x20,0x40,0xC1,0x50,0x5C,0xD6,0xC3,0x86,0xFC,0x8D,0x5C,0x7C,0x96,0x45,0x0D,0x0A,0x4D,0x4D,0x48,0x53,
+ 0x2D,0x45,0x78,0x65,0x6D,0x70,0x74,0x65,0x64,0x2D,0x41,0x64,0x64,0x72,0x65,0x73,0x73,0x3A,0x0D,0x0A,0x49,0x6E,0x6A,0x65,
+ 0x63,0x74,0x69,0x6F,0x6E,0x2D,0x49,0x6E,0x66,0x6F,0x3A,0x20,0x0D,0x0A,0x43,0x6F,0x6E,0x74,0x65,0x74,0x6E,0x2D,0x4C,0x65,
+ 0x6E,0x67,0x74,0x68,0x3A,0x20,0x30,0x0D,0x0A,0x0D,0x0A
+ };
+
+ error_code ec;
+ test_parser<true> p;
+ feed(net::buffer(buf, sizeof(buf)), p, ec);
+ BEAST_EXPECT(ec);
+ }
+
+ void
+ testIssue1211()
+ {
+ using base = detail::basic_parser_base;
+ auto const good =
+ [&](string_view s, std::uint32_t v0)
+ {
+ std::uint64_t v;
+ auto const result =
+ base::parse_dec(s, v);
+ if(BEAST_EXPECTS(result, s))
+ BEAST_EXPECTS(v == v0, s);
+ };
+ auto const bad =
+ [&](string_view s)
+ {
+ std::uint64_t v;
+ auto const result =
+ base::parse_dec(s, v);
+ BEAST_EXPECTS(! result, s);
+ };
+ good("0", 0);
+ good("00", 0);
+ good("001", 1);
+ good("255", 255);
+ good("65535", 65535);
+ good("65536", 65536);
+ good("4294967295", 4294967295);
+ bad ("");
+ bad (" ");
+ bad (" 0");
+ bad ("0 ");
+ bad ("-1");
+ bad ("18446744073709551616"); // max(uint64) + 1
+ }
+
+ void
+ testIssue1267()
+ {
+ using base = detail::basic_parser_base;
+ auto const good =
+ [&](string_view s, std::uint64_t v0)
+ {
+ std::uint64_t v;
+ auto it = s.data();
+ auto const result =
+ base::parse_hex(it, v);
+ if(BEAST_EXPECTS(result, s))
+ BEAST_EXPECTS(v == v0, s);
+ };
+ auto const bad =
+ [&](string_view s)
+ {
+ std::uint64_t v;
+ auto it = s.data();
+ auto const result =
+ base::parse_hex(it, v);
+ BEAST_EXPECTS(! result, s);
+ };
+ good("f\r\n", 15);
+ good("ff\r\n", 255);
+ good("ffff\r\n", 65535);
+ good("ffffffffr\n", 4294967295);
+ good("ffffffffffffffff\r\n", 18446744073709551615ULL);
+ bad ("\r\n");
+ bad ("g\r\n");
+ bad ("10000000000000000\r\n");
+ bad ("ffffffffffffffffffffff\r\n");
+ }
+
+ //--------------------------------------------------------------------------
+
+ // https://github.com/boostorg/beast/issues/1734
+
+ void
+ testIssue1734()
+ {
+ // Ensure more than one buffer, this is to avoid an optimized path in
+ // basic_parser::put(ConstBufferSequence const&,...) which avoids
+ // buffer flattening.
+ auto multibufs = [](multi_buffer::const_buffers_type buffers) {
+ std::vector<net::const_buffer> bs;
+ for (auto b : buffers_range(buffers))
+ bs.push_back(b);
+ while (std::distance(bs.begin(), bs.end()) < 2) {
+ bs.push_back({});
+ }
+ return bs;
+ };
+
+ // Buffers must be bigger than max_stack_buffer to force flattening
+ // in basic_parser::put(ConstBufferSequence const&,...)
+ std::string first_chunk_data(
+ 2 * basic_parser<false>::max_stack_buffer + 1, 'x');
+
+ std::string second_chunk_data_part1(
+ basic_parser<false>::max_stack_buffer + 2, 'x');
+ std::string second_chunk_data_part2(
+ basic_parser<false>::max_stack_buffer + 1, 'x');
+
+ multi_buffer b;
+ parser<false, string_body> p;
+ p.eager(true);
+ error_code ec;
+ std::size_t used;
+
+ ostream(b) <<
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n";
+
+ used = p.put(b.data(), ec);
+ b.consume(used);
+
+ BEAST_EXPECT(net::buffer_size(b.data()) == 0);
+ BEAST_EXPECTS(!ec, ec.message());
+ BEAST_EXPECT(!p.is_done());
+ BEAST_EXPECT(p.is_header_done());
+
+ ostream(b) <<
+ std::hex <<
+ first_chunk_data.size() << "\r\n" <<
+ first_chunk_data << "\r\n";
+
+ // First chunk
+ used = p.put(multibufs(b.data()), ec);
+ b.consume(used);
+
+ BEAST_EXPECTS(ec == error::need_more, ec.message());
+ BEAST_EXPECT(!p.is_done());
+
+ ostream(b) <<
+ std::hex <<
+ (second_chunk_data_part1.size() +
+ second_chunk_data_part2.size() ) << "\r\n" <<
+ second_chunk_data_part1;
+
+ // Second chunk, part 1
+ used = p.put(multibufs(b.data()), ec);
+ b.consume(used);
+
+ BEAST_EXPECTS(!ec, ec.message());
+ BEAST_EXPECT(!p.is_done());
+
+ ostream(b) <<
+ second_chunk_data_part2 << "\r\n"
+ << "0\r\n\r\n";
+
+ // Second chunk, part 2
+ used = p.put(multibufs(b.data()), ec);
+ b.consume(used);
+
+ BEAST_EXPECTS(!ec, ec.message()); // <-- Error: bad chunk
+ if(p.need_eof())
+ {
+ p.put_eof(ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+ BEAST_EXPECT(p.is_done());
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ run() override
+ {
+ testFlatten();
+ testObsFold();
+ testCallbacks();
+ testRequestLine();
+ testStatusLine();
+ testFields();
+ testConnectionField();
+ testContentLengthField();
+ testTransferEncodingField();
+ testUpgradeField();
+ testPartial();
+ testLimits();
+ testBody();
+ testIssue430();
+ testIssue452();
+ testIssue496();
+ testIssue692();
+ testFuzz();
+ testRegression1();
+ testIssue1211();
+ testIssue1267();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,basic_parser);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/buffer_body.cpp b/src/boost/libs/beast/test/beast/http/buffer_body.cpp
new file mode 100644
index 000000000..14ce1413d
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/buffer_body.cpp
@@ -0,0 +1,65 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/buffer_body.hpp>
+
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/http/parser.hpp>
+#include <boost/beast/http/read.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class buffer_body_test : public beast::unit_test::suite
+{
+public:
+ void
+ testIssue1717()
+ {
+ net::io_context ioc;
+ test::stream ts{ioc};
+ ostream(ts.buffer()) <<
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length:3\r\n"
+ "\r\n"
+ "1.0";
+ error_code ec;
+ flat_buffer fb;
+ response_parser<buffer_body> p;
+ char buf[256];
+ p.get().body().data = buf;
+ p.get().body().size = sizeof(buf);
+ read_header(ts, fb, p, ec);
+ auto const bytes_transferred =
+ read(ts, fb, p, ec);
+ boost::ignore_unused(bytes_transferred);
+ BEAST_EXPECTS(! ec, ec.message());
+
+ // VFALCO What should the read algorithms return?
+ //BEAST_EXPECT(bytes_transferred == 3);
+ }
+
+ void
+ run() override
+ {
+ testIssue1717();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,buffer_body);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/chunk_encode.cpp b/src/boost/libs/beast/test/beast/http/chunk_encode.cpp
new file mode 100644
index 000000000..9f779e2e4
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/chunk_encode.cpp
@@ -0,0 +1,298 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/chunk_encode.hpp>
+
+#include "message_fuzz.hpp"
+
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/static_string.hpp>
+#include <boost/beast/http/fields.hpp>
+#include <boost/beast/test/fuzz.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/optional.hpp>
+#include <random>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class chunk_encode_test
+ : public beast::unit_test::suite
+{
+public:
+ struct not_chunk_extensions {};
+
+ BOOST_STATIC_ASSERT(
+ detail::is_chunk_extensions<chunk_extensions>::value);
+
+ BOOST_STATIC_ASSERT(
+ ! detail::is_chunk_extensions<not_chunk_extensions>::value);
+
+ template<class T, class... Args>
+ void
+ check(string_view match, Args&&... args)
+ {
+ T t(std::forward<Args>(args)...);
+ BEAST_EXPECT(buffers_to_string(t) == match);
+ T t2(t);
+ BEAST_EXPECT(buffers_to_string(t2) == match);
+ T t3(std::move(t2));
+ BEAST_EXPECT(buffers_to_string(t3) == match);
+ }
+
+ template<class T, class... Args>
+ void
+ check_fwd(string_view match, Args&&... args)
+ {
+ T t(std::forward<Args>(args)...);
+ BEAST_EXPECT(buffers_to_string(t) == match);
+ T t2(t);
+ BEAST_EXPECT(buffers_to_string(t2) == match);
+ T t3(std::move(t2));
+ BEAST_EXPECT(buffers_to_string(t3) == match);
+ }
+
+ using cb_t = net::const_buffer;
+
+ static
+ cb_t
+ cb(string_view s)
+ {
+ return {s.data(), s.size()};
+ }
+
+ void
+ testChunkCRLF()
+ {
+ #if ! defined(BOOST_GCC) || BOOST_GCC >= 50000
+ check<chunk_crlf>("\r\n");
+ #endif
+ }
+
+ void
+ testChunkHeader()
+ {
+ check<chunk_header>("10\r\n", 16u);
+
+ check<chunk_header>("20;x\r\n", 32u, ";x");
+
+ chunk_extensions exts;
+ exts.insert("y");
+ exts.insert("z");
+
+ check<chunk_header>("30;y;z\r\n", 48u, exts);
+
+ {
+ auto exts2 = exts;
+
+ check_fwd<chunk_header>(
+ "30;y;z\r\n", 48u, std::move(exts2));
+ }
+
+ check<chunk_header>("30;y;z\r\n", 48u, exts,
+ std::allocator<double>{});
+
+ {
+ auto exts2 = exts;
+
+ check<chunk_header>(
+ "30;y;z\r\n", 48u, std::move(exts2),
+ std::allocator<double>{});
+ }
+ }
+
+ void
+ testChunkBody()
+ {
+ check<chunk_body<cb_t>>(
+ "3\r\n***\r\n", cb("***"));
+
+ check<chunk_body<cb_t>>(
+ "3;x\r\n***\r\n", cb("***"), ";x");
+
+ chunk_extensions exts;
+ exts.insert("y");
+ exts.insert("z");
+
+ check<chunk_body<cb_t>>(
+ "3;y;z\r\n***\r\n",
+ cb("***"), exts);
+
+ {
+ auto exts2 = exts;
+
+ check_fwd<chunk_body<cb_t>>(
+ "3;y;z\r\n***\r\n",
+ cb("***"), std::move(exts2));
+ }
+
+ check<chunk_body<cb_t>>(
+ "3;y;z\r\n***\r\n",
+ cb("***"), exts, std::allocator<double>{});
+
+ {
+ auto exts2 = exts;
+
+ check_fwd<chunk_body<cb_t>>(
+ "3;y;z\r\n***\r\n",
+ cb("***"), std::move(exts2),
+ std::allocator<double>{});
+ }
+ }
+
+ void
+ testChunkFinal()
+ {
+ check<chunk_last<>>(
+ "0\r\n\r\n");
+
+ check<chunk_last<cb_t>>(
+ "0\r\nMD5:ou812\r\n\r\n",
+ cb("MD5:ou812\r\n\r\n"));
+
+ fields trailers;
+ trailers.set(field::content_md5, "ou812");
+
+ check<chunk_last<fields>>(
+ "0\r\nContent-MD5: ou812\r\n\r\n",
+ trailers);
+
+ {
+ auto trailers2 = trailers;
+
+ check_fwd<chunk_last<fields>>(
+ "0\r\nContent-MD5: ou812\r\n\r\n",
+ std::move(trailers2));
+ }
+
+ check<chunk_last<fields>>(
+ "0\r\nContent-MD5: ou812\r\n\r\n",
+ trailers, std::allocator<double>{});
+
+ {
+ auto trailers2 = trailers;
+
+ check<chunk_last<fields>>(
+ "0\r\nContent-MD5: ou812\r\n\r\n",
+ std::move(trailers2), std::allocator<double>{});
+ }
+ }
+
+ void
+ testChunkExtensions()
+ {
+ auto const str =
+ [](chunk_extensions const& ce)
+ {
+ std::string s;
+ for(auto const& v : ce)
+ {
+ s.append(std::string(v.first));
+ s.push_back(',');
+ if(! v.second.empty())
+ {
+ s.append(std::string(v.second));
+ s.push_back(',');
+ }
+ }
+ return s;
+ };
+ chunk_extensions ce;
+ ce.insert("x");
+ BEAST_EXPECT(ce.str() == ";x");
+ BEAST_EXPECT(str(ce) == "x,");
+ ce.insert("y", "z");
+ BEAST_EXPECT(ce.str() == ";x;y=z");
+ BEAST_EXPECT(str(ce) == "x,y,z,");
+ ce.insert("z", R"(")");
+ BEAST_EXPECT(ce.str() == R"(;x;y=z;z="\"")");
+ BEAST_EXPECT(str(ce) == R"(x,y,z,z,",)");
+ ce.insert("p", R"(\)");
+ BEAST_EXPECT(ce.str() == R"(;x;y=z;z="\"";p="\\")");
+ BEAST_EXPECT(str(ce) == R"(x,y,z,z,",p,\,)");
+ ce.insert("q", R"(1"2\)");
+ BEAST_EXPECT(ce.str() == R"(;x;y=z;z="\"";p="\\";q="1\"2\\")");
+ BEAST_EXPECT(str(ce) == R"(x,y,z,z,",p,\,q,1"2\,)");
+ }
+
+ void
+ testParseChunkExtensions()
+ {
+ auto const grind =
+ [&](string_view s)
+ {
+ error_code ec;
+ static_string<200> ss{s};
+ test::fuzz_rand r;
+ for(auto i = 3; i--;)
+ {
+ test::fuzz(ss, 5, 5, r,
+ [&](string_view s)
+ {
+ chunk_extensions c1;
+ c1.parse(s, ec);
+ if(ec)
+ {
+ pass();
+ return;
+ }
+ chunk_extensions c2;
+ c2.parse(c1.str(), ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ chunk_extensions c3;
+ for(auto const& v : c2)
+ if(v.second.empty())
+ c3.insert(v.first);
+ else
+ c3.insert(v.first, v.second);
+ BEAST_EXPECTS(c2.str() == c3.str(), c3.str());
+ });
+ }
+ };
+ auto const good =
+ [&](string_view s)
+ {
+ error_code ec;
+ chunk_extensions ce;
+ ce.parse(s, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ grind(s);
+ };
+ auto const bad =
+ [&](string_view s)
+ {
+ error_code ec;
+ chunk_extensions ce;
+ ce.parse(s, ec);
+ BEAST_EXPECT(ec);
+ grind(s);
+ };
+ chunkExtensionsTest(good, bad);
+ }
+
+ void
+ run() override
+ {
+ testChunkCRLF();
+ testChunkHeader();
+ testChunkBody();
+ testChunkFinal();
+ testChunkExtensions();
+ testParseChunkExtensions();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,chunk_encode);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/dynamic_body.cpp b/src/boost/libs/beast/test/beast/http/dynamic_body.cpp
new file mode 100644
index 000000000..179731ee6
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/dynamic_body.cpp
@@ -0,0 +1,92 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/dynamic_body.hpp>
+
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/http/fields.hpp>
+#include <boost/beast/http/parser.hpp>
+#include <boost/beast/http/read.hpp>
+#include <boost/beast/http/write.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class dynamic_body_test : public beast::unit_test::suite
+{
+ net::io_context ioc_;
+
+public:
+ template<bool isRequest, class Body, class Fields>
+ static
+ std::string
+ to_string(message<isRequest, Body, Fields> const& m)
+ {
+ std::stringstream ss;
+ ss << m;
+ return ss.str();
+ }
+
+ void
+ test_success()
+ {
+ std::string const s =
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Content-Length: 3\r\n"
+ "\r\n"
+ "xyz";
+ test::stream ts(ioc_, s);
+ response_parser<dynamic_body> p;
+ multi_buffer b;
+ read(ts, b, p);
+ auto const& m = p.get();
+ BEAST_EXPECT(buffers_to_string(m.body().data()) == "xyz");
+ BEAST_EXPECT(to_string(m) == s);
+ }
+
+ void
+ test_issue1581()
+ {
+ std::string const s =
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Content-Length: 132\r\n"
+ "\r\n"
+ "xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz"
+ "xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz"
+ "xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz"
+ "xyzxyzxyzxyzxyzxyzxyzxyzxyzxyzxyz";
+ test::stream ts(ioc_, s);
+ response_parser<dynamic_body> p;
+ multi_buffer b;
+ p.get().body().max_size(64);
+ error_code ec;
+ read(ts, b, p, ec);
+ BEAST_EXPECT(ec == http::error::buffer_overflow);
+ }
+
+ void
+ run() override
+ {
+ test_success();
+ test_issue1581();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,dynamic_body);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/empty_body.cpp b/src/boost/libs/beast/test/beast/http/empty_body.cpp
new file mode 100644
index 000000000..96db2bc9d
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/empty_body.cpp
@@ -0,0 +1,23 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/empty_body.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+BOOST_STATIC_ASSERT(is_body<empty_body>::value);
+BOOST_STATIC_ASSERT(is_body_writer<empty_body>::value);
+BOOST_STATIC_ASSERT(is_body_reader<empty_body>::value);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/error.cpp b/src/boost/libs/beast/test/beast/http/error.cpp
new file mode 100644
index 000000000..8689cd9d4
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/error.cpp
@@ -0,0 +1,78 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/error.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <memory>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class error_test : public unit_test::suite
+{
+public:
+ void
+ check(char const* name, error ev)
+ {
+ auto const ec = make_error_code(ev);
+ auto const& cat = make_error_code(
+ static_cast<http::error>(0)).category();
+ BEAST_EXPECT(std::string(ec.category().name()) == name);
+ BEAST_EXPECT(! ec.message().empty());
+ BEAST_EXPECT(
+ std::addressof(ec.category()) == std::addressof(cat));
+ BEAST_EXPECT(cat.equivalent(
+ static_cast<std::underlying_type<error>::type>(ev),
+ ec.category().default_error_condition(
+ static_cast<std::underlying_type<error>::type>(ev))));
+ BEAST_EXPECT(cat.equivalent(ec,
+ static_cast<std::underlying_type<error>::type>(ev)));
+ }
+
+ void
+ run() override
+ {
+ check("beast.http", error::end_of_stream);
+ check("beast.http", error::partial_message);
+ check("beast.http", error::need_more);
+ check("beast.http", error::unexpected_body);
+ check("beast.http", error::need_buffer);
+ check("beast.http", error::end_of_chunk);
+ check("beast.http", error::buffer_overflow);
+ check("beast.http", error::header_limit);
+ check("beast.http", error::body_limit);
+ check("beast.http", error::bad_alloc);
+
+ check("beast.http", error::bad_line_ending);
+ check("beast.http", error::bad_method);
+ check("beast.http", error::bad_target);
+ check("beast.http", error::bad_version);
+ check("beast.http", error::bad_status);
+ check("beast.http", error::bad_reason);
+ check("beast.http", error::bad_field);
+ check("beast.http", error::bad_value);
+ check("beast.http", error::bad_content_length);
+ check("beast.http", error::bad_transfer_encoding);
+ check("beast.http", error::bad_chunk);
+ check("beast.http", error::bad_chunk_extension);
+ check("beast.http", error::bad_obs_fold);
+
+ check("beast.http", error::stale_parser);
+ check("beast.http", error::short_read);
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,error);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/field.cpp b/src/boost/libs/beast/test/beast/http/field.cpp
new file mode 100644
index 000000000..d512f672c
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/field.cpp
@@ -0,0 +1,410 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/field.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class field_test : public beast::unit_test::suite
+{
+public:
+ void
+ testField()
+ {
+ auto const match =
+ [&](field f, string_view s)
+ {
+ BEAST_EXPECT(iequals(to_string(f), s));
+ BEAST_EXPECT(string_to_field(s) == f);
+ };
+
+ match(field::accept, "accept");
+ match(field::accept, "aCcept");
+ match(field::accept, "ACCEPT");
+
+
+ match(field::a_im, "A-IM");
+ match(field::accept, "Accept");
+ match(field::accept_additions, "Accept-Additions");
+ match(field::accept_charset, "Accept-Charset");
+ match(field::accept_datetime, "Accept-Datetime");
+ match(field::accept_encoding, "Accept-Encoding");
+ match(field::accept_features, "Accept-Features");
+ match(field::accept_language, "Accept-Language");
+ match(field::accept_patch, "Accept-Patch");
+ match(field::accept_post, "Accept-Post");
+ match(field::accept_ranges, "Accept-Ranges");
+ match(field::access_control, "Access-Control");
+ match(field::access_control_allow_credentials, "Access-Control-Allow-Credentials");
+ match(field::access_control_allow_headers, "Access-Control-Allow-Headers");
+ match(field::access_control_allow_methods, "Access-Control-Allow-Methods");
+ match(field::access_control_allow_origin, "Access-Control-Allow-Origin");
+ match(field::access_control_expose_headers, "Access-Control-Expose-Headers");
+ match(field::access_control_max_age, "Access-Control-Max-Age");
+ match(field::access_control_request_headers, "Access-Control-Request-Headers");
+ match(field::access_control_request_method, "Access-Control-Request-Method");
+ match(field::age, "Age");
+ match(field::allow, "Allow");
+ match(field::alpn, "ALPN");
+ match(field::also_control, "Also-Control");
+ match(field::alt_svc, "Alt-Svc");
+ match(field::alt_used, "Alt-Used");
+ match(field::alternate_recipient, "Alternate-Recipient");
+ match(field::alternates, "Alternates");
+ match(field::apparently_to, "Apparently-To");
+ match(field::apply_to_redirect_ref, "Apply-To-Redirect-Ref");
+ match(field::approved, "Approved");
+ match(field::archive, "Archive");
+ match(field::archived_at, "Archived-At");
+ match(field::article_names, "Article-Names");
+ match(field::article_updates, "Article-Updates");
+ match(field::authentication_control, "Authentication-Control");
+ match(field::authentication_info, "Authentication-Info");
+ match(field::authentication_results, "Authentication-Results");
+ match(field::authorization, "Authorization");
+ match(field::auto_submitted, "Auto-Submitted");
+ match(field::autoforwarded, "Autoforwarded");
+ match(field::autosubmitted, "Autosubmitted");
+ match(field::base, "Base");
+ match(field::bcc, "Bcc");
+ match(field::body, "Body");
+ match(field::c_ext, "C-Ext");
+ match(field::c_man, "C-Man");
+ match(field::c_opt, "C-Opt");
+ match(field::c_pep, "C-PEP");
+ match(field::c_pep_info, "C-PEP-Info");
+ match(field::cache_control, "Cache-Control");
+ match(field::caldav_timezones, "CalDAV-Timezones");
+ match(field::cancel_key, "Cancel-Key");
+ match(field::cancel_lock, "Cancel-Lock");
+ match(field::cc, "Cc");
+ match(field::close, "Close");
+ match(field::comments, "Comments");
+ match(field::compliance, "Compliance");
+ match(field::connection, "Connection");
+ match(field::content_alternative, "Content-Alternative");
+ match(field::content_base, "Content-Base");
+ match(field::content_description, "Content-Description");
+ match(field::content_disposition, "Content-Disposition");
+ match(field::content_duration, "Content-Duration");
+ match(field::content_encoding, "Content-Encoding");
+ match(field::content_features, "Content-features");
+ match(field::content_id, "Content-ID");
+ match(field::content_identifier, "Content-Identifier");
+ match(field::content_language, "Content-Language");
+ match(field::content_length, "Content-Length");
+ match(field::content_location, "Content-Location");
+ match(field::content_md5, "Content-MD5");
+ match(field::content_range, "Content-Range");
+ match(field::content_return, "Content-Return");
+ match(field::content_script_type, "Content-Script-Type");
+ match(field::content_style_type, "Content-Style-Type");
+ match(field::content_transfer_encoding, "Content-Transfer-Encoding");
+ match(field::content_type, "Content-Type");
+ match(field::content_version, "Content-Version");
+ match(field::control, "Control");
+ match(field::conversion, "Conversion");
+ match(field::conversion_with_loss, "Conversion-With-Loss");
+ match(field::cookie, "Cookie");
+ match(field::cookie2, "Cookie2");
+ match(field::cost, "Cost");
+ match(field::dasl, "DASL");
+ match(field::date, "Date");
+ match(field::date_received, "Date-Received");
+ match(field::dav, "DAV");
+ match(field::default_style, "Default-Style");
+ match(field::deferred_delivery, "Deferred-Delivery");
+ match(field::delivery_date, "Delivery-Date");
+ match(field::delta_base, "Delta-Base");
+ match(field::depth, "Depth");
+ match(field::derived_from, "Derived-From");
+ match(field::destination, "Destination");
+ match(field::differential_id, "Differential-ID");
+ match(field::digest, "Digest");
+ match(field::discarded_x400_ipms_extensions, "Discarded-X400-IPMS-Extensions");
+ match(field::discarded_x400_mts_extensions, "Discarded-X400-MTS-Extensions");
+ match(field::disclose_recipients, "Disclose-Recipients");
+ match(field::disposition_notification_options, "Disposition-Notification-Options");
+ match(field::disposition_notification_to, "Disposition-Notification-To");
+ match(field::distribution, "Distribution");
+ match(field::dkim_signature, "DKIM-Signature");
+ match(field::dl_expansion_history, "DL-Expansion-History");
+ match(field::downgraded_bcc, "Downgraded-Bcc");
+ match(field::downgraded_cc, "Downgraded-Cc");
+ match(field::downgraded_disposition_notification_to, "Downgraded-Disposition-Notification-To");
+ match(field::downgraded_final_recipient, "Downgraded-Final-Recipient");
+ match(field::downgraded_from, "Downgraded-From");
+ match(field::downgraded_in_reply_to, "Downgraded-In-Reply-To");
+ match(field::downgraded_mail_from, "Downgraded-Mail-From");
+ match(field::downgraded_message_id, "Downgraded-Message-Id");
+ match(field::downgraded_original_recipient, "Downgraded-Original-Recipient");
+ match(field::downgraded_rcpt_to, "Downgraded-Rcpt-To");
+ match(field::downgraded_references, "Downgraded-References");
+ match(field::downgraded_reply_to, "Downgraded-Reply-To");
+ match(field::downgraded_resent_bcc, "Downgraded-Resent-Bcc");
+ match(field::downgraded_resent_cc, "Downgraded-Resent-Cc");
+ match(field::downgraded_resent_from, "Downgraded-Resent-From");
+ match(field::downgraded_resent_reply_to, "Downgraded-Resent-Reply-To");
+ match(field::downgraded_resent_sender, "Downgraded-Resent-Sender");
+ match(field::downgraded_resent_to, "Downgraded-Resent-To");
+ match(field::downgraded_return_path, "Downgraded-Return-Path");
+ match(field::downgraded_sender, "Downgraded-Sender");
+ match(field::downgraded_to, "Downgraded-To");
+ match(field::ediint_features, "EDIINT-Features");
+ match(field::eesst_version, "Eesst-Version");
+ match(field::encoding, "Encoding");
+ match(field::encrypted, "Encrypted");
+ match(field::errors_to, "Errors-To");
+ match(field::etag, "ETag");
+ match(field::expect, "Expect");
+ match(field::expires, "Expires");
+ match(field::expiry_date, "Expiry-Date");
+ match(field::ext, "Ext");
+ match(field::followup_to, "Followup-To");
+ match(field::forwarded, "Forwarded");
+ match(field::from, "From");
+ match(field::generate_delivery_report, "Generate-Delivery-Report");
+ match(field::getprofile, "GetProfile");
+ match(field::hobareg, "Hobareg");
+ match(field::host, "Host");
+ match(field::http2_settings, "HTTP2-Settings");
+ match(field::if_, "If");
+ match(field::if_match, "If-Match");
+ match(field::if_modified_since, "If-Modified-Since");
+ match(field::if_none_match, "If-None-Match");
+ match(field::if_range, "If-Range");
+ match(field::if_schedule_tag_match, "If-Schedule-Tag-Match");
+ match(field::if_unmodified_since, "If-Unmodified-Since");
+ match(field::im, "IM");
+ match(field::importance, "Importance");
+ match(field::in_reply_to, "In-Reply-To");
+ match(field::incomplete_copy, "Incomplete-Copy");
+ match(field::injection_date, "Injection-Date");
+ match(field::injection_info, "Injection-Info");
+ match(field::jabber_id, "Jabber-ID");
+ match(field::keep_alive, "Keep-Alive");
+ match(field::keywords, "Keywords");
+ match(field::label, "Label");
+ match(field::language, "Language");
+ match(field::last_modified, "Last-Modified");
+ match(field::latest_delivery_time, "Latest-Delivery-Time");
+ match(field::lines, "Lines");
+ match(field::link, "Link");
+ match(field::list_archive, "List-Archive");
+ match(field::list_help, "List-Help");
+ match(field::list_id, "List-ID");
+ match(field::list_owner, "List-Owner");
+ match(field::list_post, "List-Post");
+ match(field::list_subscribe, "List-Subscribe");
+ match(field::list_unsubscribe, "List-Unsubscribe");
+ match(field::list_unsubscribe_post, "List-Unsubscribe-Post");
+ match(field::location, "Location");
+ match(field::lock_token, "Lock-Token");
+ match(field::man, "Man");
+ match(field::max_forwards, "Max-Forwards");
+ match(field::memento_datetime, "Memento-Datetime");
+ match(field::message_context, "Message-Context");
+ match(field::message_id, "Message-ID");
+ match(field::message_type, "Message-Type");
+ match(field::meter, "Meter");
+ match(field::method_check, "Method-Check");
+ match(field::method_check_expires, "Method-Check-Expires");
+ match(field::mime_version, "MIME-Version");
+ match(field::mmhs_acp127_message_identifier, "MMHS-Acp127-Message-Identifier");
+ match(field::mmhs_authorizing_users, "MMHS-Authorizing-Users");
+ match(field::mmhs_codress_message_indicator, "MMHS-Codress-Message-Indicator");
+ match(field::mmhs_copy_precedence, "MMHS-Copy-Precedence");
+ match(field::mmhs_exempted_address, "MMHS-Exempted-Address");
+ match(field::mmhs_extended_authorisation_info, "MMHS-Extended-Authorisation-Info");
+ match(field::mmhs_handling_instructions, "MMHS-Handling-Instructions");
+ match(field::mmhs_message_instructions, "MMHS-Message-Instructions");
+ match(field::mmhs_message_type, "MMHS-Message-Type");
+ match(field::mmhs_originator_plad, "MMHS-Originator-PLAD");
+ match(field::mmhs_originator_reference, "MMHS-Originator-Reference");
+ match(field::mmhs_other_recipients_indicator_cc, "MMHS-Other-Recipients-Indicator-CC");
+ match(field::mmhs_other_recipients_indicator_to, "MMHS-Other-Recipients-Indicator-To");
+ match(field::mmhs_primary_precedence, "MMHS-Primary-Precedence");
+ match(field::mmhs_subject_indicator_codes, "MMHS-Subject-Indicator-Codes");
+ match(field::mt_priority, "MT-Priority");
+ match(field::negotiate, "Negotiate");
+ match(field::newsgroups, "Newsgroups");
+ match(field::nntp_posting_date, "NNTP-Posting-Date");
+ match(field::nntp_posting_host, "NNTP-Posting-Host");
+ match(field::non_compliance, "Non-Compliance");
+ match(field::obsoletes, "Obsoletes");
+ match(field::opt, "Opt");
+ match(field::optional, "Optional");
+ match(field::optional_www_authenticate, "Optional-WWW-Authenticate");
+ match(field::ordering_type, "Ordering-Type");
+ match(field::organization, "Organization");
+ match(field::origin, "Origin");
+ match(field::original_encoded_information_types, "Original-Encoded-Information-Types");
+ match(field::original_from, "Original-From");
+ match(field::original_message_id, "Original-Message-ID");
+ match(field::original_recipient, "Original-Recipient");
+ match(field::original_sender, "Original-Sender");
+ match(field::original_subject, "Original-Subject");
+ match(field::originator_return_address, "Originator-Return-Address");
+ match(field::overwrite, "Overwrite");
+ match(field::p3p, "P3P");
+ match(field::path, "Path");
+ match(field::pep, "PEP");
+ match(field::pep_info, "Pep-Info");
+ match(field::pics_label, "PICS-Label");
+ match(field::position, "Position");
+ match(field::posting_version, "Posting-Version");
+ match(field::pragma, "Pragma");
+ match(field::prefer, "Prefer");
+ match(field::preference_applied, "Preference-Applied");
+ match(field::prevent_nondelivery_report, "Prevent-NonDelivery-Report");
+ match(field::priority, "Priority");
+ match(field::privicon, "Privicon");
+ match(field::profileobject, "ProfileObject");
+ match(field::protocol, "Protocol");
+ match(field::protocol_info, "Protocol-Info");
+ match(field::protocol_query, "Protocol-Query");
+ match(field::protocol_request, "Protocol-Request");
+ match(field::proxy_authenticate, "Proxy-Authenticate");
+ match(field::proxy_authentication_info, "Proxy-Authentication-Info");
+ match(field::proxy_authorization, "Proxy-Authorization");
+ match(field::proxy_connection, "Proxy-Connection");
+ match(field::proxy_features, "Proxy-Features");
+ match(field::proxy_instruction, "Proxy-Instruction");
+ match(field::public_, "Public");
+ match(field::public_key_pins, "Public-Key-Pins");
+ match(field::public_key_pins_report_only, "Public-Key-Pins-Report-Only");
+ match(field::range, "Range");
+ match(field::received, "Received");
+ match(field::received_spf, "Received-SPF");
+ match(field::redirect_ref, "Redirect-Ref");
+ match(field::references, "References");
+ match(field::referer, "Referer");
+ match(field::referer_root, "Referer-Root");
+ match(field::relay_version, "Relay-Version");
+ match(field::reply_by, "Reply-By");
+ match(field::reply_to, "Reply-To");
+ match(field::require_recipient_valid_since, "Require-Recipient-Valid-Since");
+ match(field::resent_bcc, "Resent-Bcc");
+ match(field::resent_cc, "Resent-Cc");
+ match(field::resent_date, "Resent-Date");
+ match(field::resent_from, "Resent-From");
+ match(field::resent_message_id, "Resent-Message-ID");
+ match(field::resent_reply_to, "Resent-Reply-To");
+ match(field::resent_sender, "Resent-Sender");
+ match(field::resent_to, "Resent-To");
+ match(field::resolution_hint, "Resolution-Hint");
+ match(field::resolver_location, "Resolver-Location");
+ match(field::retry_after, "Retry-After");
+ match(field::return_path, "Return-Path");
+ match(field::safe, "Safe");
+ match(field::schedule_reply, "Schedule-Reply");
+ match(field::schedule_tag, "Schedule-Tag");
+ match(field::sec_websocket_accept, "Sec-WebSocket-Accept");
+ match(field::sec_websocket_extensions, "Sec-WebSocket-Extensions");
+ match(field::sec_websocket_key, "Sec-WebSocket-Key");
+ match(field::sec_websocket_protocol, "Sec-WebSocket-Protocol");
+ match(field::sec_websocket_version, "Sec-WebSocket-Version");
+ match(field::security_scheme, "Security-Scheme");
+ match(field::see_also, "See-Also");
+ match(field::sender, "Sender");
+ match(field::sensitivity, "Sensitivity");
+ match(field::server, "Server");
+ match(field::set_cookie, "Set-Cookie");
+ match(field::set_cookie2, "Set-Cookie2");
+ match(field::setprofile, "SetProfile");
+ match(field::sio_label, "SIO-Label");
+ match(field::sio_label_history, "SIO-Label-History");
+ match(field::slug, "SLUG");
+ match(field::soapaction, "SoapAction");
+ match(field::solicitation, "Solicitation");
+ match(field::status_uri, "Status-URI");
+ match(field::strict_transport_security, "Strict-Transport-Security");
+ match(field::subject, "Subject");
+ match(field::subok, "SubOK");
+ match(field::subst, "Subst");
+ match(field::summary, "Summary");
+ match(field::supersedes, "Supersedes");
+ match(field::surrogate_capability, "Surrogate-Capability");
+ match(field::surrogate_control, "Surrogate-Control");
+ match(field::tcn, "TCN");
+ match(field::te, "TE");
+ match(field::timeout, "Timeout");
+ match(field::title, "Title");
+ match(field::to, "To");
+ match(field::topic, "Topic");
+ match(field::trailer, "Trailer");
+ match(field::transfer_encoding, "Transfer-Encoding");
+ match(field::ttl, "TTL");
+ match(field::ua_color, "UA-Color");
+ match(field::ua_media, "UA-Media");
+ match(field::ua_pixels, "UA-Pixels");
+ match(field::ua_resolution, "UA-Resolution");
+ match(field::ua_windowpixels, "UA-Windowpixels");
+ match(field::upgrade, "Upgrade");
+ match(field::urgency, "Urgency");
+ match(field::uri, "URI");
+ match(field::user_agent, "User-Agent");
+ match(field::variant_vary, "Variant-Vary");
+ match(field::vary, "Vary");
+ match(field::vbr_info, "VBR-Info");
+ match(field::version, "Version");
+ match(field::via, "Via");
+ match(field::want_digest, "Want-Digest");
+ match(field::warning, "Warning");
+ match(field::www_authenticate, "WWW-Authenticate");
+ match(field::x_archived_at, "X-Archived-At");
+ match(field::x_device_accept, "X-Device-Accept");
+ match(field::x_device_accept_charset, "X-Device-Accept-Charset");
+ match(field::x_device_accept_encoding, "X-Device-Accept-Encoding");
+ match(field::x_device_accept_language, "X-Device-Accept-Language");
+ match(field::x_device_user_agent, "X-Device-User-Agent");
+ match(field::x_frame_options, "X-Frame-Options");
+ match(field::x_mittente, "X-Mittente");
+ match(field::x_pgp_sig, "X-PGP-Sig");
+ match(field::x_ricevuta, "X-Ricevuta");
+ match(field::x_riferimento_message_id, "X-Riferimento-Message-ID");
+ match(field::x_tiporicevuta, "X-TipoRicevuta");
+ match(field::x_trasporto, "X-Trasporto");
+ match(field::x_verificasicurezza, "X-VerificaSicurezza");
+ match(field::x400_content_identifier, "X400-Content-Identifier");
+ match(field::x400_content_return, "X400-Content-Return");
+ match(field::x400_content_type, "X400-Content-Type");
+ match(field::x400_mts_identifier, "X400-MTS-Identifier");
+ match(field::x400_originator, "X400-Originator");
+ match(field::x400_received, "X400-Received");
+ match(field::x400_recipients, "X400-Recipients");
+ match(field::x400_trace, "X400-Trace");
+ match(field::xref, "Xref");
+
+ auto const unknown =
+ [&](string_view s)
+ {
+ BEAST_EXPECT(string_to_field(s) == field::unknown);
+ };
+ unknown("");
+ unknown("x");
+ }
+
+ void run() override
+ {
+ testField();
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,field);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/fields.cpp b/src/boost/libs/beast/test/beast/http/fields.cpp
new file mode 100644
index 000000000..7ddb9d441
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/fields.cpp
@@ -0,0 +1,1029 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/fields.hpp>
+
+#include <boost/beast/http/empty_body.hpp>
+#include <boost/beast/http/message.hpp>
+#include <boost/beast/http/type_traits.hpp>
+#include <boost/beast/test/test_allocator.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class fields_test : public beast::unit_test::suite
+{
+public:
+ static constexpr std::size_t max_static_buffer =
+ sizeof(beast::detail::temporary_buffer);
+
+ template<class T>
+ class test_allocator
+ {
+ public:
+ using value_type = T;
+
+ test_allocator() noexcept(false) {}
+
+ template<class U, class = typename
+ std::enable_if<!std::is_same<test_allocator, U>::value>::type>
+ test_allocator(test_allocator<U> const&) noexcept {}
+
+ value_type*
+ allocate(std::size_t n)
+ {
+ return static_cast<value_type*>(::operator new (n*sizeof(value_type)));
+ }
+
+ void
+ deallocate(value_type* p, std::size_t) noexcept
+ {
+ ::operator delete(p);
+ }
+
+ template<class U>
+ friend
+ bool
+ operator==(test_allocator<T> const&, test_allocator<U> const&) noexcept
+ {
+ return true;
+ }
+
+ template<class U>
+ friend
+ bool
+ operator!=(test_allocator<T> const& x, test_allocator<U> const& y) noexcept
+ {
+ return !(x == y);
+ }
+ };
+
+ using test_fields = basic_fields<test_allocator<char>>;
+
+ BOOST_STATIC_ASSERT(is_fields<fields>::value);
+ BOOST_STATIC_ASSERT(is_fields<test_fields>::value);
+
+ // std::allocator is noexcept movable, fields should satisfy
+ // these constraints as well.
+ BOOST_STATIC_ASSERT(std::is_nothrow_move_constructible<fields>::value);
+ BOOST_STATIC_ASSERT(std::is_nothrow_move_assignable<fields>::value);
+
+ // Check if basic_fields respects throw-constructibility and
+ // propagate_on_container_move_assignment of the allocator.
+ BOOST_STATIC_ASSERT(std::is_nothrow_move_constructible<test_fields>::value);
+ BOOST_STATIC_ASSERT(!std::is_nothrow_move_assignable<test_fields>::value);
+
+ template<class Allocator>
+ using fa_t = basic_fields<Allocator>;
+
+ using f_t = fa_t<std::allocator<char>>;
+
+ template<class Allocator>
+ static
+ void
+ fill(std::size_t n, basic_fields<Allocator>& f)
+ {
+ for(std::size_t i = 1; i<= n; ++i)
+ f.insert(std::to_string(i), i);
+ }
+
+ template<class U, class V>
+ static
+ void
+ self_assign(U& u, V&& v)
+ {
+ u = std::forward<V>(v);
+ }
+
+ template<class Alloc>
+ static
+ bool
+ empty(basic_fields<Alloc> const& f)
+ {
+ return f.begin() == f.end();
+ }
+
+ template<class Alloc>
+ static
+ std::size_t
+ size(basic_fields<Alloc> const& f)
+ {
+ return std::distance(f.begin(), f.end());
+ }
+
+ void
+ testMembers()
+ {
+ using namespace test;
+
+ // compare equal
+ using equal_t = test::test_allocator<char,
+ true, true, true, true, true>;
+
+ // compare not equal
+ using unequal_t = test::test_allocator<char,
+ false, true, true, true, true>;
+
+ // construction
+ {
+ {
+ fields f;
+ BEAST_EXPECT(f.begin() == f.end());
+ }
+ {
+ unequal_t a1;
+ basic_fields<unequal_t> f{a1};
+ BEAST_EXPECT(f.get_allocator() == a1);
+ BEAST_EXPECT(f.get_allocator() != unequal_t{});
+ }
+ }
+
+ // move construction
+ {
+ {
+ basic_fields<equal_t> f1;
+ BEAST_EXPECT(f1.get_allocator()->nmove == 0);
+ f1.insert("1", "1");
+ BEAST_EXPECT(f1["1"] == "1");
+ basic_fields<equal_t> f2{std::move(f1)};
+ BEAST_EXPECT(f2.get_allocator()->nmove == 1);
+ BEAST_EXPECT(f2["1"] == "1");
+ BEAST_EXPECT(f1["1"] == "");
+ }
+ // allocators equal
+ {
+ basic_fields<equal_t> f1;
+ f1.insert("1", "1");
+ equal_t a;
+ basic_fields<equal_t> f2{std::move(f1), a};
+ BEAST_EXPECT(f2["1"] == "1");
+ BEAST_EXPECT(f1["1"] == "");
+ }
+ {
+ // allocators unequal
+ basic_fields<unequal_t> f1;
+ f1.insert("1", "1");
+ unequal_t a;
+ basic_fields<unequal_t> f2{std::move(f1), a};
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ }
+
+ // copy construction
+ {
+ {
+ basic_fields<equal_t> f1;
+ f1.insert("1", "1");
+ basic_fields<equal_t> f2{f1};
+ BEAST_EXPECT(f1.get_allocator() == f2.get_allocator());
+ BEAST_EXPECT(f1["1"] == "1");
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ {
+ basic_fields<unequal_t> f1;
+ f1.insert("1", "1");
+ unequal_t a;
+ basic_fields<unequal_t> f2(f1, a);
+ BEAST_EXPECT(f1.get_allocator() != f2.get_allocator());
+ BEAST_EXPECT(f1["1"] == "1");
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ {
+ basic_fields<equal_t> f1;
+ f1.insert("1", "1");
+ basic_fields<unequal_t> f2(f1);
+ BEAST_EXPECT(f1["1"] == "1");
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ {
+ basic_fields<unequal_t> f1;
+ f1.insert("1", "1");
+ equal_t a;
+ basic_fields<equal_t> f2(f1, a);
+ BEAST_EXPECT(f2.get_allocator() == a);
+ BEAST_EXPECT(f1["1"] == "1");
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ }
+
+ // move assignment
+ {
+ {
+ fields f1;
+ f1.insert("1", "1");
+ fields f2;
+ f2 = std::move(f1);
+ BEAST_EXPECT(f1.begin() == f1.end());
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ {
+ // propagate_on_container_move_assignment : true
+ using pocma_t = test::test_allocator<char,
+ true, true, true, true, true>;
+ basic_fields<pocma_t> f1;
+ f1.insert("1", "1");
+ basic_fields<pocma_t> f2;
+ f2 = std::move(f1);
+ BEAST_EXPECT(f1.begin() == f1.end());
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ {
+ // propagate_on_container_move_assignment : false
+ using pocma_t = test::test_allocator<char,
+ true, true, false, true, true>;
+ basic_fields<pocma_t> f1;
+ f1.insert("1", "1");
+ basic_fields<pocma_t> f2;
+ f2 = std::move(f1);
+ BEAST_EXPECT(f1.begin() == f1.end());
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ }
+
+ // copy assignment
+ {
+ {
+ fields f1;
+ f1.insert("1", "1");
+ fields f2;
+ f2 = f1;
+ BEAST_EXPECT(f1["1"] == "1");
+ BEAST_EXPECT(f2["1"] == "1");
+ basic_fields<equal_t> f3;
+ f3 = f2;
+ BEAST_EXPECT(f3["1"] == "1");
+ }
+ {
+ // propagate_on_container_copy_assignment : true
+ using pocca_t = test::test_allocator<char,
+ true, true, true, true, true>;
+ basic_fields<pocca_t> f1;
+ f1.insert("1", "1");
+ basic_fields<pocca_t> f2;
+ f2 = f1;
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ {
+ // propagate_on_container_copy_assignment : false
+ using pocca_t = test::test_allocator<char,
+ true, false, true, true, true>;
+ basic_fields<pocca_t> f1;
+ f1.insert("1", "1");
+ basic_fields<pocca_t> f2;
+ f2 = f1;
+ BEAST_EXPECT(f2["1"] == "1");
+ }
+ }
+
+ // swap
+ {
+ {
+ // propagate_on_container_swap : true
+ using pocs_t = test::test_allocator<char,
+ false, true, true, true, true>;
+ pocs_t a1, a2;
+ BEAST_EXPECT(a1 != a2);
+ basic_fields<pocs_t> f1{a1};
+ f1.insert("1", "1");
+ basic_fields<pocs_t> f2{a2};
+ BEAST_EXPECT(f1.get_allocator() == a1);
+ BEAST_EXPECT(f2.get_allocator() == a2);
+ swap(f1, f2);
+ BEAST_EXPECT(f1.get_allocator() == a2);
+ BEAST_EXPECT(f2.get_allocator() == a1);
+ BEAST_EXPECT(f1.begin() == f1.end());
+ BEAST_EXPECT(f2["1"] == "1");
+ swap(f1, f2);
+ BEAST_EXPECT(f1.get_allocator() == a1);
+ BEAST_EXPECT(f2.get_allocator() == a2);
+ BEAST_EXPECT(f1["1"] == "1");
+ BEAST_EXPECT(f2.begin() == f2.end());
+ }
+ {
+ // propagate_on_container_swap : false
+ using pocs_t = test::test_allocator<char,
+ true, true, true, false, true>;
+ pocs_t a1, a2;
+ BEAST_EXPECT(a1 == a2);
+ BEAST_EXPECT(a1.id() != a2.id());
+ basic_fields<pocs_t> f1{a1};
+ f1.insert("1", "1");
+ basic_fields<pocs_t> f2{a2};
+ BEAST_EXPECT(f1.get_allocator() == a1);
+ BEAST_EXPECT(f2.get_allocator() == a2);
+ swap(f1, f2);
+ BEAST_EXPECT(f1.get_allocator().id() == a1.id());
+ BEAST_EXPECT(f2.get_allocator().id() == a2.id());
+ BEAST_EXPECT(f1.begin() == f1.end());
+ BEAST_EXPECT(f2["1"] == "1");
+ swap(f1, f2);
+ BEAST_EXPECT(f1.get_allocator().id() == a1.id());
+ BEAST_EXPECT(f2.get_allocator().id() == a2.id());
+ BEAST_EXPECT(f1["1"] == "1");
+ BEAST_EXPECT(f2.begin() == f2.end());
+ }
+ }
+
+ // operations
+ {
+ fields f;
+ f.insert(field::user_agent, "x");
+ BEAST_EXPECT(f.count(field::user_agent));
+ BEAST_EXPECT(f.count(to_string(field::user_agent)));
+ BEAST_EXPECT(f.count(field::user_agent) == 1);
+ BEAST_EXPECT(f.count(to_string(field::user_agent)) == 1);
+ f.insert(field::user_agent, "y");
+ BEAST_EXPECT(f.count(field::user_agent) == 2);
+ }
+ }
+
+ void testHeaders()
+ {
+ f_t f1;
+ BEAST_EXPECT(empty(f1));
+ fill(1, f1);
+ BEAST_EXPECT(size(f1) == 1);
+ f_t f2;
+ f2 = f1;
+ BEAST_EXPECT(size(f2) == 1);
+ f2.insert("2", "2");
+ BEAST_EXPECT(std::distance(f2.begin(), f2.end()) == 2);
+ f1 = std::move(f2);
+ BEAST_EXPECT(size(f1) == 2);
+ BEAST_EXPECT(size(f2) == 0);
+ f_t f3(std::move(f1));
+ BEAST_EXPECT(size(f3) == 2);
+ BEAST_EXPECT(size(f1) == 0);
+ self_assign(f3, std::move(f3));
+ BEAST_EXPECT(size(f3) == 2);
+ BEAST_EXPECT(f2.erase("Not-Present") == 0);
+ }
+
+ void testRFC2616()
+ {
+ f_t f;
+ f.insert("a", "w");
+ f.insert("a", "x");
+ f.insert("aa", "y");
+ f.insert("f", "z");
+ BEAST_EXPECT(f.count("a") == 2);
+ }
+
+ void testErase()
+ {
+ f_t f;
+ f.insert("a", "w");
+ f.insert("a", "x");
+ f.insert("aa", "y");
+ f.insert("f", "z");
+ BEAST_EXPECT(size(f) == 4);
+ f.erase("a");
+ BEAST_EXPECT(size(f) == 2);
+ }
+
+ void testIteratorErase()
+ {
+ f_t f;
+ f.insert("a", "x");
+ f.insert("b", "y");
+ f.insert("c", "z");
+ BEAST_EXPECT(size(f) == 3);
+ f_t::const_iterator i = std::next(f.begin());
+ f.erase(i);
+ BEAST_EXPECT(size(f) == 2);
+ BEAST_EXPECT(std::next(f.begin(), 0)->name_string() == "a");
+ BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "c");
+ }
+
+ void
+ testContainer()
+ {
+ {
+ // group fields
+ fields f;
+ f.insert(field::age, 1);
+ f.insert(field::body, 2);
+ f.insert(field::close, 3);
+ f.insert(field::body, 4);
+ BEAST_EXPECT(std::next(f.begin(), 0)->name() == field::age);
+ BEAST_EXPECT(std::next(f.begin(), 1)->name() == field::body);
+ BEAST_EXPECT(std::next(f.begin(), 2)->name() == field::body);
+ BEAST_EXPECT(std::next(f.begin(), 3)->name() == field::close);
+ BEAST_EXPECT(std::next(f.begin(), 0)->name_string() == "Age");
+ BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "Body");
+ BEAST_EXPECT(std::next(f.begin(), 2)->name_string() == "Body");
+ BEAST_EXPECT(std::next(f.begin(), 3)->name_string() == "Close");
+ BEAST_EXPECT(std::next(f.begin(), 0)->value() == "1");
+ BEAST_EXPECT(std::next(f.begin(), 1)->value() == "2");
+ BEAST_EXPECT(std::next(f.begin(), 2)->value() == "4");
+ BEAST_EXPECT(std::next(f.begin(), 3)->value() == "3");
+ BEAST_EXPECT(f.erase(field::body) == 2);
+ BEAST_EXPECT(std::next(f.begin(), 0)->name_string() == "Age");
+ BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "Close");
+ }
+ {
+ // group fields, case insensitive
+ fields f;
+ f.insert("a", 1);
+ f.insert("ab", 2);
+ f.insert("b", 3);
+ f.insert("AB", 4);
+ BEAST_EXPECT(std::next(f.begin(), 0)->name() == field::unknown);
+ BEAST_EXPECT(std::next(f.begin(), 1)->name() == field::unknown);
+ BEAST_EXPECT(std::next(f.begin(), 2)->name() == field::unknown);
+ BEAST_EXPECT(std::next(f.begin(), 3)->name() == field::unknown);
+ BEAST_EXPECT(std::next(f.begin(), 0)->name_string() == "a");
+ BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "ab");
+ BEAST_EXPECT(std::next(f.begin(), 2)->name_string() == "AB");
+ BEAST_EXPECT(std::next(f.begin(), 3)->name_string() == "b");
+ BEAST_EXPECT(std::next(f.begin(), 0)->value() == "1");
+ BEAST_EXPECT(std::next(f.begin(), 1)->value() == "2");
+ BEAST_EXPECT(std::next(f.begin(), 2)->value() == "4");
+ BEAST_EXPECT(std::next(f.begin(), 3)->value() == "3");
+ BEAST_EXPECT(f.erase("Ab") == 2);
+ BEAST_EXPECT(std::next(f.begin(), 0)->name_string() == "a");
+ BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "b");
+ }
+ {
+ // verify insertion orde
+ fields f;
+ f.insert( "a", 1);
+ f.insert("dd", 2);
+ f.insert("b", 3);
+ f.insert("dD", 4);
+ f.insert("c", 5);
+ f.insert("Dd", 6);
+ f.insert("DD", 7);
+ f.insert( "e", 8);
+ BEAST_EXPECT(f.count("dd") == 4);
+ BEAST_EXPECT(std::next(f.begin(), 1)->name_string() == "dd");
+ BEAST_EXPECT(std::next(f.begin(), 2)->name_string() == "dD");
+ BEAST_EXPECT(std::next(f.begin(), 3)->name_string() == "Dd");
+ BEAST_EXPECT(std::next(f.begin(), 4)->name_string() == "DD");
+ f.set("dd", "-");
+ BEAST_EXPECT(f.count("dd") == 1);
+ BEAST_EXPECT(f["dd"] == "-");
+ }
+
+ // equal_range
+ {
+ fields f;
+ f.insert("E", 1);
+ f.insert("B", 2);
+ f.insert("D", 3);
+ f.insert("B", 4);
+ f.insert("C", 5);
+ f.insert("B", 6);
+ f.insert("A", 7);
+ auto const rng = f.equal_range("B");
+ BEAST_EXPECT(std::distance(rng.first, rng.second) == 3);
+ BEAST_EXPECT(std::next(rng.first, 0)->value() == "2");
+ BEAST_EXPECT(std::next(rng.first, 1)->value() == "4");
+ BEAST_EXPECT(std::next(rng.first, 2)->value() == "6");
+ }
+ }
+
+ struct sized_body
+ {
+ using value_type = std::uint64_t;
+
+ static
+ std::uint64_t
+ size(value_type const& v)
+ {
+ return v;
+ }
+ };
+
+ struct unsized_body
+ {
+ struct value_type {};
+ };
+
+ void
+ testPreparePayload()
+ {
+ // GET, empty
+ {
+ request<empty_body> req;
+ req.version(11);
+ req.method(verb::get);
+
+ req.prepare_payload();
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req.count(field::transfer_encoding) == 0);
+
+ req.set(field::content_length, "0");
+ req.set(field::transfer_encoding, "chunked");
+ req.prepare_payload();
+
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req.count(field::transfer_encoding) == 0);
+
+ req.set(field::transfer_encoding, "deflate");
+ req.prepare_payload();
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req[field::transfer_encoding] == "deflate");
+
+ req.set(field::transfer_encoding, "deflate, chunked");
+ req.prepare_payload();
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req[field::transfer_encoding] == "deflate");
+ }
+
+ // GET, sized
+ {
+ request<sized_body> req;
+ req.version(11);
+ req.method(verb::get);
+ req.body() = 50;
+
+ req.prepare_payload();
+ BEAST_EXPECT(req[field::content_length] == "50");
+ BEAST_EXPECT(req[field::transfer_encoding] == "");
+
+ req.set(field::content_length, "0");
+ req.set(field::transfer_encoding, "chunked");
+ req.prepare_payload();
+ BEAST_EXPECT(req[field::content_length] == "50");
+ BEAST_EXPECT(req.count(field::transfer_encoding) == 0);
+
+ req.set(field::transfer_encoding, "deflate, chunked");
+ req.prepare_payload();
+ BEAST_EXPECT(req[field::content_length] == "50");
+ BEAST_EXPECT(req[field::transfer_encoding] == "deflate");
+ }
+
+ // PUT, empty
+ {
+ request<empty_body> req;
+ req.version(11);
+ req.method(verb::put);
+
+ req.prepare_payload();
+ BEAST_EXPECT(req[field::content_length] == "0");
+ BEAST_EXPECT(req.count(field::transfer_encoding) == 0);
+
+ req.set(field::content_length, "50");
+ req.set(field::transfer_encoding, "deflate, chunked");
+ req.prepare_payload();
+ BEAST_EXPECT(req[field::content_length] == "0");
+ BEAST_EXPECT(req[field::transfer_encoding] == "deflate");
+ }
+
+ // PUT, sized
+ {
+ request<sized_body> req;
+ req.version(11);
+ req.method(verb::put);
+ req.body() = 50;
+
+ req.prepare_payload();
+ BEAST_EXPECT(req[field::content_length] == "50");
+ BEAST_EXPECT(req.count(field::transfer_encoding) == 0);
+
+ req.set(field::content_length, "25");
+ req.set(field::transfer_encoding, "deflate, chunked");
+ req.prepare_payload();
+ BEAST_EXPECT(req[field::content_length] == "50");
+ BEAST_EXPECT(req[field::transfer_encoding] == "deflate");
+ }
+
+ // POST, unsized
+ {
+ request<unsized_body> req;
+ req.version(11);
+ req.method(verb::post);
+
+ req.prepare_payload();
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req[field::transfer_encoding] == "chunked");
+
+ req.set(field::transfer_encoding, "deflate");
+ req.prepare_payload();
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req[field::transfer_encoding] == "deflate, chunked");
+ }
+
+ // POST, unsized HTTP/1.0
+ {
+ request<unsized_body> req;
+ req.version(10);
+ req.method(verb::post);
+
+ req.prepare_payload();
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req.count(field::transfer_encoding) == 0);
+
+ req.set(field::transfer_encoding, "deflate");
+ req.prepare_payload();
+ BEAST_EXPECT(req.count(field::content_length) == 0);
+ BEAST_EXPECT(req[field::transfer_encoding] == "deflate");
+ }
+
+ // OK, empty
+ {
+ response<empty_body> res;
+ res.version(11);
+
+ res.prepare_payload();
+ BEAST_EXPECT(res[field::content_length] == "0");
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ res.erase(field::content_length);
+ res.set(field::transfer_encoding, "chunked");
+ res.prepare_payload();
+ BEAST_EXPECT(res[field::content_length] == "0");
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+ }
+
+ // OK, sized
+ {
+ response<sized_body> res;
+ res.version(11);
+ res.body() = 50;
+
+ res.prepare_payload();
+ BEAST_EXPECT(res[field::content_length] == "50");
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ res.erase(field::content_length);
+ res.set(field::transfer_encoding, "chunked");
+ res.prepare_payload();
+ BEAST_EXPECT(res[field::content_length] == "50");
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+ }
+
+ // OK, unsized
+ {
+ response<unsized_body> res;
+ res.version(11);
+
+ res.prepare_payload();
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked");
+ }
+ }
+
+ void
+ testKeepAlive()
+ {
+ response<empty_body> res;
+ auto const keep_alive =
+ [&](bool v)
+ {
+ res.keep_alive(v);
+ BEAST_EXPECT(
+ (res.keep_alive() && v) ||
+ (! res.keep_alive() && ! v));
+ };
+
+ std::string const big(max_static_buffer + 1, 'a');
+
+ // HTTP/1.0
+ res.version(10);
+ res.erase(field::connection);
+
+ keep_alive(false);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.set(field::connection, "close");
+ keep_alive(false);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.set(field::connection, "keep-alive");
+ keep_alive(false);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.set(field::connection, "keep-alive, close");
+ keep_alive(false);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.erase(field::connection);
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == "keep-alive");
+
+ res.set(field::connection, "close");
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == "keep-alive");
+
+ res.set(field::connection, "keep-alive");
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == "keep-alive");
+
+ res.set(field::connection, "keep-alive, close");
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == "keep-alive");
+
+ auto const test10 =
+ [&](std::string s)
+ {
+ res.set(field::connection, s);
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, s + ", close");
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, "keep-alive, " + s);
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, "keep-alive, " + s + ", close");
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, s);
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == s + ", keep-alive");
+
+ res.set(field::connection, s + ", close");
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == s + ", keep-alive");
+
+ res.set(field::connection, "keep-alive, " + s);
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == "keep-alive, " + s);
+
+ res.set(field::connection, "keep-alive, " + s+ ", close");
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == "keep-alive, " + s);
+ };
+
+ test10("foo");
+ test10(big);
+
+ // HTTP/1.1
+ res.version(11);
+
+ res.erase(field::connection);
+ keep_alive(true);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.set(field::connection, "close");
+ keep_alive(true);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.set(field::connection, "keep-alive");
+ keep_alive(true);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.set(field::connection, "keep-alive, close");
+ keep_alive(true);
+ BEAST_EXPECT(res.count(field::connection) == 0);
+
+ res.erase(field::connection);
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == "close");
+
+ res.set(field::connection, "close");
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == "close");
+
+ res.set(field::connection, "keep-alive");
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == "close");
+
+ res.set(field::connection, "keep-alive, close");
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == "close");
+
+ auto const test11 =
+ [&](std::string s)
+ {
+ res.set(field::connection, s);
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, s + ", close");
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, "keep-alive, " + s);
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, "keep-alive, " + s + ", close");
+ keep_alive(true);
+ BEAST_EXPECT(res[field::connection] == s);
+
+ res.set(field::connection, s);
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == s + ", close");
+
+ res.set(field::connection, "close, " + s);
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == "close, " + s);
+
+ res.set(field::connection, "keep-alive, " + s);
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == s + ", close");
+
+ res.set(field::connection, "close, " + s + ", keep-alive");
+ keep_alive(false);
+ BEAST_EXPECT(res[field::connection] == "close, " + s);
+ };
+
+ test11("foo");
+ test11(big);
+ }
+
+ void
+ testContentLength()
+ {
+ response<empty_body> res{status::ok, 11};
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ res.content_length(0);
+ BEAST_EXPECT(res[field::content_length] == "0");
+
+ res.content_length(100);
+ BEAST_EXPECT(res[field::content_length] == "100");
+
+ res.content_length(boost::none);
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+
+ res.set(field::transfer_encoding, "chunked");
+ res.content_length(0);
+ BEAST_EXPECT(res[field::content_length] == "0");
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ res.set(field::transfer_encoding, "chunked");
+ res.content_length(100);
+ BEAST_EXPECT(res[field::content_length] == "100");
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ res.set(field::transfer_encoding, "chunked");
+ res.content_length(boost::none);
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ auto const check = [&](std::string s)
+ {
+ res.set(field::transfer_encoding, s);
+ res.content_length(0);
+ BEAST_EXPECT(res[field::content_length] == "0");
+ BEAST_EXPECT(res[field::transfer_encoding] == s);
+
+ res.set(field::transfer_encoding, s);
+ res.content_length(100);
+ BEAST_EXPECT(res[field::content_length] == "100");
+ BEAST_EXPECT(res[field::transfer_encoding] == s);
+
+ res.set(field::transfer_encoding, s);
+ res.content_length(boost::none);
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+ BEAST_EXPECT(res[field::transfer_encoding] == s);
+
+ res.set(field::transfer_encoding, s + ", chunked");
+ res.content_length(0);
+ BEAST_EXPECT(res[field::content_length] == "0");
+ BEAST_EXPECT(res[field::transfer_encoding] == s);
+
+ res.set(field::transfer_encoding, s + ", chunked");
+ res.content_length(100);
+ BEAST_EXPECT(res[field::content_length] == "100");
+ BEAST_EXPECT(res[field::transfer_encoding] == s);
+
+ res.set(field::transfer_encoding, s + ", chunked");
+ res.content_length(boost::none);
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+ BEAST_EXPECT(res[field::transfer_encoding] == s);
+
+ res.set(field::transfer_encoding, "chunked, " + s);
+ res.content_length(0);
+ BEAST_EXPECT(res[field::content_length] == "0");
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked, " + s);
+
+ res.set(field::transfer_encoding, "chunked, " + s);
+ res.content_length(100);
+ BEAST_EXPECT(res[field::content_length] == "100");
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked, " + s);
+
+ res.set(field::transfer_encoding, "chunked, " + s);
+ res.content_length(boost::none);
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked, " + s);
+ };
+
+ check("foo");
+
+ std::string const big(max_static_buffer + 1, 'a');
+
+ check(big);
+ }
+
+ void
+ testChunked()
+ {
+ response<empty_body> res{status::ok, 11};
+ BEAST_EXPECT(res.count(field::content_length) == 0);
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ auto const chunked =
+ [&](bool v)
+ {
+ res.chunked(v);
+ BEAST_EXPECT(
+ (res.chunked() && v) ||
+ (! res.chunked() && ! v));
+ BEAST_EXPECT(res.count(
+ field::content_length) == 0);
+ };
+
+ res.erase(field::transfer_encoding);
+ res.set(field::content_length, 32);
+ chunked(true);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked");
+
+ res.set(field::transfer_encoding, "chunked");
+ chunked(true);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked");
+
+ res.erase(field::transfer_encoding);
+ res.set(field::content_length, 32);
+ chunked(false);
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+ res.set(field::transfer_encoding, "chunked");
+ chunked(false);
+ BEAST_EXPECT(res.count(field::transfer_encoding) == 0);
+
+
+
+ res.set(field::transfer_encoding, "foo");
+ chunked(true);
+ BEAST_EXPECT(res[field::transfer_encoding] == "foo, chunked");
+
+ res.set(field::transfer_encoding, "chunked, foo");
+ chunked(true);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked, foo, chunked");
+
+ res.set(field::transfer_encoding, "chunked, foo, chunked");
+ chunked(true);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked, foo, chunked");
+
+ res.set(field::transfer_encoding, "foo, chunked");
+ chunked(false);
+ BEAST_EXPECT(res[field::transfer_encoding] == "foo");
+
+ res.set(field::transfer_encoding, "chunked, foo");
+ chunked(false);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked, foo");
+
+ res.set(field::transfer_encoding, "chunked, foo, chunked");
+ chunked(false);
+ BEAST_EXPECT(res[field::transfer_encoding] == "chunked, foo");
+ }
+
+ void
+ testIssue1828()
+ {
+ beast::http::fields req;
+ req.insert("abc", "1");
+ req.insert("abc", "2");
+ req.insert("abc", "3");
+ BEAST_EXPECT(req.count("abc") == 3);
+ auto iter = req.find("abc");
+ BEAST_EXPECT(iter->value() == "1");
+ req.insert("abc", "4");
+ req.erase(iter);
+ BEAST_EXPECT(req.count("abc") == 3);
+ }
+
+ void
+ run() override
+ {
+ testMembers();
+ testHeaders();
+ testRFC2616();
+ testErase();
+ testIteratorErase();
+ testContainer();
+ testPreparePayload();
+
+ testKeepAlive();
+ testContentLength();
+ testChunked();
+
+ testIssue1828();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,fields);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/file_body.cpp b/src/boost/libs/beast/test/beast/http/file_body.cpp
new file mode 100644
index 000000000..96873b3a6
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/file_body.cpp
@@ -0,0 +1,220 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/file_body.hpp>
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_prefix.hpp>
+#include <boost/beast/core/file_stdio.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/http/parser.hpp>
+#include <boost/beast/http/serializer.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/filesystem.hpp>
+#include <boost/asio/error.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class file_body_test : public beast::unit_test::suite
+{
+public:
+ struct lambda
+ {
+ flat_buffer buffer;
+
+ template<class ConstBufferSequence>
+ void
+ operator()(error_code&, ConstBufferSequence const& buffers)
+ {
+ buffer.commit(net::buffer_copy(
+ buffer.prepare(buffer_bytes(buffers)),
+ buffers));
+ }
+ };
+
+ struct temp_file
+ {
+ temp_file(std::ostream& logger)
+ : path_(boost::filesystem::unique_path())
+ , log_(logger)
+ {}
+
+ ~temp_file()
+ {
+ if (!path_.empty())
+ {
+ auto ec = error_code();
+ boost::filesystem::remove(path_, ec);
+ if (ec)
+ {
+ log_ << "warning: failed to remove temporary file: " << path_ << "\n";
+ }
+ }
+
+ }
+
+ temp_file(temp_file&&) = default;
+ temp_file(temp_file const&) = delete;
+ temp_file& operator=(temp_file&&) = delete;
+ temp_file& operator=(temp_file const&) = delete;
+
+ boost::filesystem::path const& path() const
+ {
+ return path_;
+ }
+
+ private:
+
+ boost::filesystem::path path_;
+ std::ostream& log_;
+ };
+
+ template<class File>
+ void
+ doTestFileBody()
+ {
+ error_code ec;
+ string_view const s =
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Content-Length: 3\r\n"
+ "\r\n"
+ "xyz";
+ auto const temp = boost::filesystem::unique_path();
+ {
+ response_parser<basic_file_body<File>> p;
+ p.eager(true);
+
+ p.get().body().open(
+ temp.string<std::string>().c_str(), file_mode::write, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+
+ p.put(net::buffer(s.data(), s.size()), ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+ {
+ File f;
+ f.open(temp.string<std::string>().c_str(), file_mode::read, ec);
+ auto size = f.size(ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(size == 3);
+ std::string s1;
+ s1.resize(3);
+ f.read(&s1[0], s1.size(), ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECTS(s1 == "xyz", s);
+ }
+ {
+ lambda visit;
+ {
+ response<basic_file_body<File>> res{status::ok, 11};
+ res.set(field::server, "test");
+ res.body().open(temp.string<std::string>().c_str(),
+ file_mode::scan, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ res.prepare_payload();
+
+ serializer<false, basic_file_body<File>, fields> sr{res};
+ sr.next(ec, visit);
+ BEAST_EXPECTS(! ec, ec.message());
+ auto const b = buffers_front(visit.buffer.data());
+ string_view const s1{
+ reinterpret_cast<char const*>(b.data()),
+ b.size()};
+ BEAST_EXPECTS(s1 == s, s1);
+ }
+ }
+ boost::filesystem::remove(temp, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ template<class File>
+ void
+ fileBodyUnexpectedEofOnGet()
+ {
+ auto temp = temp_file(log);
+
+ error_code ec;
+ string_view const ten =
+ "0123456789"; // 40
+ // create the temporary file
+ {
+ std::ofstream fstemp(temp.path().native());
+ std::size_t written = 0;
+ std::size_t to_write = 4097;
+ while (written < to_write)
+ {
+ auto size = std::min(ten.size(), to_write - written);
+ fstemp << ten.substr(0, size);
+ BEAST_EXPECT(fstemp.good());
+ written += size;
+ }
+ fstemp.close();
+ }
+
+ // open the file and read the header
+ {
+ using file_body_type = basic_file_body<File>;
+
+ typename file_body_type::value_type value;
+ // opened in write mode so we can truncate later
+ value.open(temp.path().string<std::string>().c_str(), file_mode::read, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+
+ response_header<> header;
+ header.version(11);
+ header.result(status::accepted);
+ header.set(field::server, "test");
+ header.set(field::content_length, 4097);
+
+ typename file_body_type::writer w(header, value);
+ auto maybe_range = w.get(ec);
+ BEAST_EXPECTS(!ec, ec.message());
+ BEAST_EXPECTS(maybe_range.has_value(), "no range returned");
+ BEAST_EXPECT(maybe_range.value().second);
+
+ value.file().seek(4097, ec);
+ BEAST_EXPECTS(!ec, ec.message());
+
+ maybe_range = w.get(ec);
+ BEAST_EXPECTS(ec == error::short_read, ec.message());
+ BEAST_EXPECTS(!maybe_range.has_value(), "range returned on error");
+ }
+ }
+
+ void
+ run() override
+ {
+ doTestFileBody<file_stdio>();
+#if BOOST_BEAST_USE_WIN32_FILE
+ doTestFileBody<file_win32>();
+#endif
+#if BOOST_BEAST_USE_POSIX_FILE
+ doTestFileBody<file_posix>();
+#endif
+
+ fileBodyUnexpectedEofOnGet<file_stdio>();
+ #if BOOST_BEAST_USE_POSIX_FILE
+ fileBodyUnexpectedEofOnGet<file_posix>();
+ #endif
+ #if BOOST_BEAST_USE_WIN32_FILE
+ fileBodyUnexpectedEofOnGet<file_win32>();
+ #endif
+
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,file_body);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/message.cpp b/src/boost/libs/beast/test/beast/http/message.cpp
new file mode 100644
index 000000000..b1062814a
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/message.cpp
@@ -0,0 +1,521 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/message.hpp>
+
+#include <boost/beast/http/empty_body.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/http/fields.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <type_traits>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class message_test : public beast::unit_test::suite
+{
+public:
+ struct Arg1
+ {
+ bool moved = false;
+
+ Arg1(Arg1 const&) = default;
+
+ Arg1()
+ {
+ }
+
+ Arg1(Arg1&& other)
+ {
+ other.moved = true;
+ }
+ };
+
+ struct Arg2 { };
+ struct Arg3 { };
+
+ // default constructible Body
+ struct default_body
+ {
+ using value_type = std::string;
+ };
+
+ // 1-arg constructible Body
+ struct one_arg_body
+ {
+ struct value_type
+ {
+ explicit
+ value_type(Arg1 const&)
+ {
+ }
+
+ explicit
+ value_type(Arg1&& arg)
+ {
+ Arg1 arg_(std::move(arg));
+ }
+ };
+ };
+
+ // 2-arg constructible Body
+ struct two_arg_body
+ {
+ struct value_type
+ {
+ value_type(Arg1 const&, Arg2 const&)
+ {
+ }
+ };
+ };
+
+ // 0-arg
+ BOOST_STATIC_ASSERT(std::is_constructible<
+ request<default_body>>::value);
+
+ // 1-arg
+ BOOST_STATIC_ASSERT(! std::is_constructible<request<one_arg_body>
+ >::value);
+
+ //BOOST_STATIC_ASSERT(! std::is_constructible<request<one_arg_body>,
+ // verb, string_view, unsigned>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<request<one_arg_body>,
+ verb, string_view, unsigned, Arg1>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<request<one_arg_body>,
+ verb, string_view, unsigned, Arg1&&>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<request<one_arg_body>,
+ verb, string_view, unsigned, Arg1 const>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<request<one_arg_body>,
+ verb, string_view, unsigned, Arg1 const&>::value);
+
+ // 1-arg + fields
+ BOOST_STATIC_ASSERT(std::is_constructible<request<one_arg_body>,
+ verb, string_view, unsigned, Arg1, fields::allocator_type>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<request<one_arg_body>, std::piecewise_construct_t,
+ std::tuple<Arg1>>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<request<two_arg_body>, std::piecewise_construct_t,
+ std::tuple<Arg1, Arg2>>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<request<two_arg_body>, std::piecewise_construct_t,
+ std::tuple<Arg1, Arg2>, std::tuple<fields::allocator_type>>::value);
+
+ // special members
+ BOOST_STATIC_ASSERT(std::is_copy_constructible<header<true>>::value);
+ BOOST_STATIC_ASSERT(std::is_move_constructible<header<true>>::value);
+ BOOST_STATIC_ASSERT(std::is_copy_assignable<header<true>>::value);
+ BOOST_STATIC_ASSERT(std::is_move_assignable<header<true>>::value);
+ BOOST_STATIC_ASSERT(std::is_copy_constructible<header<false>>::value);
+ BOOST_STATIC_ASSERT(std::is_move_constructible<header<false>>::value);
+ BOOST_STATIC_ASSERT(std::is_copy_assignable<header<false>>::value);
+ BOOST_STATIC_ASSERT(std::is_move_assignable<header<false>>::value);
+
+ void
+ testMessage()
+ {
+ {
+ Arg1 arg1;
+ request<one_arg_body>{verb::get, "/", 11, std::move(arg1)};
+ BEAST_EXPECT(arg1.moved);
+ }
+
+ {
+ header<true> h;
+ h.set(field::user_agent, "test");
+ BEAST_EXPECT(h[field::user_agent] == "test");
+ request<default_body> m{std::move(h)};
+ BEAST_EXPECT(m[field::user_agent] == "test");
+ BEAST_EXPECT(h.count(field::user_agent) == 0);
+ }
+ {
+ request<empty_body> h{verb::get, "/", 10};
+ h.set(field::user_agent, "test");
+ request<one_arg_body> m{std::move(h.base()), Arg1{}};
+ BEAST_EXPECT(m["User-Agent"] == "test");
+ BEAST_EXPECT(h.count(http::field::user_agent) == 0);
+ BEAST_EXPECT(m.method() == verb::get);
+ BEAST_EXPECT(m.target() == "/");
+ BEAST_EXPECT(m.version() == 10);
+ }
+
+ // swap
+ request<string_body> m1;
+ request<string_body> m2;
+ m1.target("u");
+ m1.body() = "1";
+ m1.insert("h", "v");
+ m2.method_string("G");
+ m2.body() = "2";
+ swap(m1, m2);
+ BEAST_EXPECT(m1.method_string() == "G");
+ BEAST_EXPECT(m2.method_string().empty());
+ BEAST_EXPECT(m1.target().empty());
+ BEAST_EXPECT(m2.target() == "u");
+ BEAST_EXPECT(m1.body() == "2");
+ BEAST_EXPECT(m2.body() == "1");
+ BEAST_EXPECT(! m1.count("h"));
+ BEAST_EXPECT(m2.count("h"));
+ }
+
+ struct MoveFields : fields
+ {
+ bool moved_to = false;
+ bool moved_from = false;
+
+ MoveFields() = default;
+
+ MoveFields(MoveFields&& other)
+ : moved_to(true)
+ {
+ other.moved_from = true;
+ }
+
+ MoveFields& operator=(MoveFields&&)
+ {
+ return *this;
+ }
+ };
+
+ struct token {};
+
+ struct test_fields
+ {
+ std::string target;
+
+ test_fields() = delete;
+ test_fields(token) {}
+ string_view get_method_impl() const { return {}; }
+ string_view get_target_impl() const { return target; }
+ string_view get_reason_impl() const { return {}; }
+ bool get_chunked_impl() const { return false; }
+ bool get_keep_alive_impl(unsigned) const { return true; }
+ bool has_content_length_impl() const { return false; }
+ void set_method_impl(string_view) {}
+ void set_target_impl(string_view s) { target = std::string(s); }
+ void set_reason_impl(string_view) {}
+ void set_chunked_impl(bool) {}
+ void set_content_length_impl(boost::optional<std::uint64_t>) {}
+ void set_keep_alive_impl(unsigned, bool) {}
+ };
+
+ void
+ testMessageCtors()
+ {
+ {
+ request<empty_body> req;
+ BEAST_EXPECT(req.version() == 11);
+ BEAST_EXPECT(req.method() == verb::unknown);
+ BEAST_EXPECT(req.target() == "");
+ }
+ {
+ request<empty_body> req{verb::get, "/", 11};
+ BEAST_EXPECT(req.version() == 11);
+ BEAST_EXPECT(req.method() == verb::get);
+ BEAST_EXPECT(req.target() == "/");
+ }
+ {
+ request<string_body> req{verb::get, "/", 11, "Hello"};
+ BEAST_EXPECT(req.version() == 11);
+ BEAST_EXPECT(req.method() == verb::get);
+ BEAST_EXPECT(req.target() == "/");
+ BEAST_EXPECT(req.body() == "Hello");
+ }
+ {
+ request<string_body, test_fields> req{
+ verb::get, "/", 11, "Hello", token{}};
+ BEAST_EXPECT(req.version() == 11);
+ BEAST_EXPECT(req.method() == verb::get);
+ BEAST_EXPECT(req.target() == "/");
+ BEAST_EXPECT(req.body() == "Hello");
+ BEAST_EXPECT(! req.has_content_length());
+ }
+ {
+ response<string_body> res;
+ BEAST_EXPECT(res.version() == 11);
+ BEAST_EXPECT(res.result() == status::ok);
+ BEAST_EXPECT(res.reason() == "OK");
+ }
+ {
+ response<string_body> res{status::bad_request, 10};
+ BEAST_EXPECT(res.version() == 10);
+ BEAST_EXPECT(res.result() == status::bad_request);
+ BEAST_EXPECT(res.reason() == "Bad Request");
+ }
+ {
+ response<string_body> res{status::bad_request, 10, "Hello"};
+ BEAST_EXPECT(res.version() == 10);
+ BEAST_EXPECT(res.result() == status::bad_request);
+ BEAST_EXPECT(res.reason() == "Bad Request");
+ BEAST_EXPECT(res.body() == "Hello");
+ }
+ {
+ response<string_body, test_fields> res{
+ status::bad_request, 10, "Hello", token{}};
+ BEAST_EXPECT(res.version() == 10);
+ BEAST_EXPECT(res.result() == status::bad_request);
+ BEAST_EXPECT(res.reason() == "Bad Request");
+ BEAST_EXPECT(res.body() == "Hello");
+ BEAST_EXPECT(! res.has_content_length());
+ }
+ }
+
+ void
+ testBody()
+ {
+ {
+ auto f = [](empty_body::value_type&){};
+ request<empty_body> m;
+ f(m.body());
+ }
+ {
+ auto f = [](empty_body::value_type const&){};
+ request<empty_body> const m{};
+ f(m.body());
+ f(std::move(m.body()));
+ }
+ {
+ auto f = [](empty_body::value_type&&){};
+ request<empty_body> m;
+ f(std::move(m).body());
+ f(std::move(m.body()));
+ }
+ {
+ auto f = [](empty_body::value_type const&&){};
+ request<empty_body> const m{};
+ f(std::move(m.body()));
+ }
+ }
+
+ void
+ testSwap()
+ {
+ response<string_body> m1;
+ response<string_body> m2;
+ m1.result(status::ok);
+ m1.version(10);
+ m1.body() = "1";
+ m1.insert("h", "v");
+ m2.result(status::not_found);
+ m2.body() = "2";
+ m2.version(11);
+ swap(m1, m2);
+ BEAST_EXPECT(m1.result() == status::not_found);
+ BEAST_EXPECT(m1.result_int() == 404);
+ BEAST_EXPECT(m2.result() == status::ok);
+ BEAST_EXPECT(m2.result_int() == 200);
+ BEAST_EXPECT(m1.reason() == "Not Found");
+ BEAST_EXPECT(m2.reason() == "OK");
+ BEAST_EXPECT(m1.version() == 11);
+ BEAST_EXPECT(m2.version() == 10);
+ BEAST_EXPECT(m1.body() == "2");
+ BEAST_EXPECT(m2.body() == "1");
+ BEAST_EXPECT(! m1.count("h"));
+ BEAST_EXPECT(m2.count("h"));
+ }
+
+ void
+ testSpecialMembers()
+ {
+ response<string_body> r1;
+ response<string_body> r2{r1};
+ response<string_body> r3{std::move(r2)};
+ r2 = r3;
+ r1 = std::move(r2);
+ [r1]()
+ {
+ }();
+ }
+
+ void
+ testMethod()
+ {
+ header<true> h;
+ auto const vcheck =
+ [&](verb v)
+ {
+ h.method(v);
+ BEAST_EXPECT(h.method() == v);
+ BEAST_EXPECT(h.method_string() == to_string(v));
+ };
+ auto const scheck =
+ [&](string_view s)
+ {
+ h.method_string(s);
+ BEAST_EXPECT(h.method() == string_to_verb(s));
+ BEAST_EXPECT(h.method_string() == s);
+ };
+ vcheck(verb::get);
+ vcheck(verb::head);
+ scheck("GET");
+ scheck("HEAD");
+ scheck("XYZ");
+ }
+
+ void
+ testStatus()
+ {
+ header<false> h;
+ h.result(200);
+ BEAST_EXPECT(h.result_int() == 200);
+ BEAST_EXPECT(h.result() == status::ok);
+ h.result(status::switching_protocols);
+ BEAST_EXPECT(h.result_int() == 101);
+ BEAST_EXPECT(h.result() == status::switching_protocols);
+ h.result(1);
+ BEAST_EXPECT(h.result_int() == 1);
+ BEAST_EXPECT(h.result() == status::unknown);
+ }
+
+ void
+ testReason()
+ {
+ header<false> h;
+ h.result(status::ok);
+ BEAST_EXPECT(h.reason() == "OK");
+ h.reason("Pepe");
+ BEAST_EXPECT(h.reason() == "Pepe");
+ h.result(status::not_found);
+ BEAST_EXPECT(h.reason() == "Pepe");
+ h.reason({});
+ BEAST_EXPECT(h.reason() == "Not Found");
+ }
+
+ void
+ testNeedEof()
+ {
+ {
+ request<empty_body> m;
+
+ m.version(10);
+ m.keep_alive(false);
+ BEAST_EXPECT(m.need_eof());
+ m.keep_alive(true);
+ BEAST_EXPECT(! m.need_eof());
+
+ m.version(11);
+ m.keep_alive(false);
+ BEAST_EXPECT(m.need_eof());
+ m.keep_alive(true);
+ BEAST_EXPECT(! m.need_eof());
+ }
+
+ {
+ response<empty_body> m;
+ m.result(status::ok);
+
+ m.version(10);
+ m.keep_alive(false);
+ BEAST_EXPECT(! m.has_content_length());
+ BEAST_EXPECT(! m.chunked());
+ m.result(status::no_content);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::not_modified);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::continue_);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::switching_protocols);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::ok);
+ BEAST_EXPECT(m.need_eof());
+
+ m.version(10);
+ m.keep_alive(true);
+ BEAST_EXPECT(! m.has_content_length());
+ BEAST_EXPECT(! m.chunked());
+ m.result(status::no_content);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::not_modified);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::continue_);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::switching_protocols);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::ok);
+ BEAST_EXPECT(m.need_eof());
+ m.set(field::content_length, "1");
+ BEAST_EXPECT(! m.need_eof());
+ }
+
+ {
+ response<empty_body> m;
+ m.result(status::ok);
+
+ m.version(11);
+ m.keep_alive(false);
+ BEAST_EXPECT(! m.has_content_length());
+ BEAST_EXPECT(! m.chunked());
+ m.result(status::no_content);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::not_modified);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::continue_);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::switching_protocols);
+ BEAST_EXPECT(m.need_eof());
+ m.result(status::ok);
+ BEAST_EXPECT(m.need_eof());
+ m.chunked(true);
+ BEAST_EXPECT(m.need_eof());
+ m.content_length(1);
+ BEAST_EXPECT(m.need_eof());
+ }
+
+ {
+ response<empty_body> m;
+ m.result(status::ok);
+
+ m.version(11);
+ m.keep_alive(true);
+ BEAST_EXPECT(! m.has_content_length());
+ BEAST_EXPECT(! m.chunked());
+ m.result(status::no_content);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::not_modified);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::continue_);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::switching_protocols);
+ BEAST_EXPECT(! m.need_eof());
+ m.result(status::ok);
+ BEAST_EXPECT(m.need_eof());
+ m.chunked(true);
+ BEAST_EXPECT(! m.need_eof());
+ m.content_length(1);
+ BEAST_EXPECT(! m.need_eof());
+ }
+ }
+
+ void
+ run() override
+ {
+ testMessage();
+ testMessageCtors();
+ testBody();
+ testSwap();
+ testSpecialMembers();
+ testMethod();
+ testStatus();
+ testReason();
+ testNeedEof();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,message);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/message_fuzz.hpp b/src/boost/libs/beast/test/beast/http/message_fuzz.hpp
new file mode 100644
index 000000000..521f48064
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/message_fuzz.hpp
@@ -0,0 +1,614 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_HTTP_TEST_MESSAGE_FUZZ_HPP
+#define BOOST_BEAST_HTTP_TEST_MESSAGE_FUZZ_HPP
+
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/http/detail/rfc7230.hpp>
+#include <cstdint>
+#include <random>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+template<class = void>
+std::string
+escaped_string(string_view s)
+{
+ std::string out;
+ out.reserve(s.size());
+ for(char c : s)
+ {
+ if(c == '\r')
+ out.append("\\r");
+ else if(c == '\n')
+ out.append("\\n");
+ else if(c == '\t')
+ out.append("\\t");
+ else
+ out.append(&c, 1);
+ }
+ return out;
+}
+
+// Produces random HTTP messages
+//
+template<class = void>
+class message_fuzz_t
+{
+ std::mt19937 rng_;
+
+ static
+ std::string
+ to_hex(std::size_t v)
+ {
+ if(! v)
+ return "0";
+ std::string s;
+ while(v > 0)
+ {
+ s.insert(s.begin(),
+ "0123456789abcdef"[v&0xf]);
+ v >>= 4;
+ }
+ return s;
+ }
+
+public:
+ template<class UInt = std::size_t>
+ UInt
+ rand(std::size_t n)
+ {
+ return static_cast<UInt>(
+ std::uniform_int_distribution<
+ std::size_t>{0, n-1}(rng_));
+ }
+
+ std::string
+ method()
+ {
+#if 0
+ // All IANA registered methods
+ static char const* const list[39] = {
+ "ACL", "BASELINE-CONTROL", "BIND", "CHECKIN", "CHECKOUT", "CONNECT",
+ "COPY", "DELETE", "GET", "HEAD", "LABEL", "LINK", "LOCK", "MERGE",
+ "MKACTIVITY", "MKCALENDAR", "MKCOL", "MKREDIRECTREF", "MKWORKSPACE",
+ "MOVE", "OPTIONS", "ORDERPATCH", "PATCH", "POST", "PRI", "PROPFIND",
+ "PROPPATCH", "PUT", "REBIND", "REPORT", "SEARCH", "TRACE", "UNBIND",
+ "UNCHECKOUT", "UNLINK", "UNLOCK", "UPDATE", "UPDATEREDIRECTREF",
+ "VERSION-CONTROL"
+ };
+ return list[rand(39)];
+#else
+ // methods parsed by nodejs-http-parser
+ static char const* const list[33] = {
+ "ACL", "BIND", "CHECKOUT", "CONNECT", "COPY", "DELETE", "HEAD", "GET",
+ "LINK", "LOCK", "MERGE", "MKCOL", "MKCALENDAR", "MKACTIVITY", "M-SEARCH",
+ "MOVE", "NOTIFY", "OPTIONS", "PATCH", "POST", "PROPFIND", "PROPPATCH",
+ "PURGE", "PUT", "REBIND", "REPORT", "SEARCH", "SUBSCRIBE", "TRACE",
+ "UNBIND", "UNLINK", "UNLOCK", "UNSUBSCRIBE"
+ };
+ return list[rand(33)];
+#endif
+ }
+
+ std::string
+ scheme()
+ {
+ static char const* const list[241] = {
+ "aaa", "aaas", "about", "acap", "acct", "acr", "adiumxtra", "afp", "afs",
+ "aim", "appdata", "apt", "attachment", "aw", "barion", "beshare", "bitcoin",
+ "blob", "bolo", "callto", "cap", "chrome", "chrome-extension", "cid",
+ "coap", "coaps", "com-eventbrite-attendee", "content", "crid", "cvs",
+ "data", "dav", "dict", "dis", "dlna-playcontainer", "dlna-playsingle",
+ "dns", "dntp", "dtn", "dvb", "ed2k", "example", "facetime", "fax", "feed",
+ "feedready", "file", "filesystem", "finger", "fish", "ftp", "geo", "gg",
+ "git", "gizmoproject", "go", "gopher", "gtalk", "h323", "ham", "hcp",
+ "http", "https", "iax", "icap", "icon", "im", "imap", "info", "iotdisco",
+ "ipn", "ipp", "ipps", "irc", "irc6", "ircs", "iris", "iris.beep",
+ "iris.lwz", "iris.xpc", "iris.xpcs", "isostore", "itms", "jabber", "jar",
+ "jms", "keyparc", "lastfm", "ldap", "ldaps", "magnet", "mailserver",
+ "mailto", "maps", "market", "message", "mid", "mms",
+ "modem", "ms-access", "ms-drive-to", "ms-enrollment", "ms-excel",
+ "ms-getoffice", "ms-help", "ms-infopath", "ms-media-stream-id", "ms-project",
+ "ms-powerpoint", "ms-publisher", "ms-search-repair",
+ "ms-secondary-screen-controller", "ms-secondary-screen-setup",
+ "ms-settings", "ms-settings-airplanemode", "ms-settings-bluetooth",
+ "ms-settings-camera", "ms-settings-cellular", "ms-settings-cloudstorage",
+ "ms-settings-emailandaccounts", "ms-settings-language", "ms-settings-location",
+ "ms-settings-lock", "ms-settings-nfctransactions", "ms-settings-notifications",
+ "ms-settings-power", "ms-settings-privacy", "ms-settings-proximity",
+ "ms-settings-screenrotation", "ms-settings-wifi", "ms-settings-workplace",
+ "ms-spd", "ms-transit-to", "ms-visio", "ms-walk-to", "ms-word", "msnim",
+ "msrp", "msrps", "mtqp", "mumble", "mupdate", "mvn", "news", "nfs", "ni",
+ "nih", "nntp", "notes", "oid", "opaquelocktoken", "pack", "palm", "paparazzi",
+ "pkcs11", "platform", "pop", "pres", "prospero", "proxy", "psyc", "query",
+ "redis", "rediss", "reload", "res", "target", "rmi", "rsync", "rtmfp",
+ "rtmp", "rtsp", "rtsps", "rtspu", "secondlife", "service", "session", "sftp",
+ "sgn", "shttp", "sieve", "sip", "sips", "skype", "smb", "sms", "smtp",
+ "snews", "snmp", "soap.beep", "soap.beeps", "soldat", "spotify", "ssh",
+ "steam", "stun", "stuns", "submit", "svn", "tag", "teamspeak", "tel",
+ "teliaeid", "telnet", "tftp", "things", "thismessage", "tip", "tn3270",
+ "tool", "turn", "turns", "tv", "udp", "unreal", "urn", "ut2004", "v-event",
+ "vemmi", "ventrilo", "videotex", "vnc", "view-source", "wais", "webcal",
+ "wpid", "ws", "wss", "wtai", "wyciwyg", "xcon", "xcon-userid", "xfire",
+ "xmlrpc.beep", "xmlrpc.beeps", "xmpp", "xri", "ymsgr", "z39.50", "z39.50r",
+ "z39.50s:"
+ };
+ return list[rand(241)];
+ }
+
+ std::string
+ pchar()
+ {
+ if(rand(4))
+ return std::string(1,
+ "0123456789"
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+ "abcdefghijklmnopqrstuvwxyz"
+ ":@&=+$,"[rand(69)]);
+ std::string s = "%";
+ s += "0123456789abcdef"[rand(16)];
+ s += "0123456789abcdef"[rand(16)];
+ return s;
+ }
+
+ char
+ uric()
+ {
+ return 'a';
+ }
+
+ char
+ uric_no_slash()
+ {
+ return 'a';
+ }
+
+ std::string
+ param()
+ {
+ std::string s;
+ while(rand(2))
+ s += pchar();
+ return s;
+ }
+
+ std::string
+ query()
+ {
+ std::string s;
+ while(rand(2))
+ s += uric();
+ return s;
+ }
+
+ std::string
+ userinfo()
+ {
+ std::string s;
+ while(rand(2))
+ s += "a";
+ return s;
+ }
+
+ /* authority = server | reg_name
+
+ reg_name = 1*( unreserved | escaped | "$" | "," |
+ ";" | ":" | "@" | "&" | "=" | "+" )
+
+ server = [ [ userinfo "@" ] hostport ]
+ userinfo = *( unreserved | escaped |
+ ";" | ":" | "&" | "=" | "+" | "$" | "," )
+
+ hostport = host [ ":" port ]
+ host = hostname | IPv4address
+ hostname = *( domainlabel "." ) toplabel [ "." ]
+ domainlabel = alphanum | alphanum *( alphanum | "-" ) alphanum
+ toplabel = alpha | alpha *( alphanum | "-" ) alphanum
+ IPv4address = 1*digit "." 1*digit "." 1*digit "." 1*digit
+ port = *digit
+ */
+ std::string
+ server()
+ {
+ std::string s;
+ if(rand(2))
+ s += userinfo() + "@";
+ return s;
+ }
+
+ std::string
+ reg_name()
+ {
+ std::string s;
+ s = "a";
+ while(rand(2))
+ s += "a";
+ return s;
+ }
+
+ std::string
+ authority()
+ {
+ if(rand(2))
+ return server();
+ return reg_name();
+ }
+
+ std::string
+ opaque_part()
+ {
+ std::string s;
+ s += uric_no_slash();
+ while(rand(2))
+ s += uric();
+ return s;
+ }
+
+ /* abs_path = "/" path_segments
+ path_segments = segment *( "/" segment )
+ segment = *pchar *( ";" param )
+ param = *pchar
+ pchar = unreserved | escaped |
+ ":" | "@" | "&" | "=" | "+" | "$" | ","
+ */
+ std::string
+ abs_path()
+ {
+ std::string s = "/";
+ for(;;)
+ {
+ while(rand(2))
+ s += pchar();
+ while(rand(2))
+ s += ";" + param();
+ if(rand(2))
+ break;
+ s.append("/");
+ }
+ return s;
+ }
+
+ /* net_path = "//" authority [ abs_path ]
+ */
+ std::string
+ net_path()
+ {
+ std::string s = "//";
+ s += authority();
+ if(rand(2))
+ s += abs_path();
+ return s;
+ }
+
+ /* absoluteURI = scheme ":" ( hier_part | opaque_part )
+ scheme = alpha *( alpha | digit | "+" | "-" | "." )
+ hier_part = ( net_path | abs_path ) [ "?" query ]
+ abs_path = "/" path_segments
+ query = *uric
+ opaque_part = uric_no_slash *uric
+ */
+ std::string
+ abs_uri()
+ {
+ std::string s;
+ s = scheme() + ":";
+ if(rand(2))
+ {
+ if(rand(2))
+ s += net_path();
+ else
+ s += abs_path();
+ if(rand(2))
+ s += "?" + query();
+ }
+ else
+ {
+ s += opaque_part();
+ }
+ return s;
+ }
+
+ std::string
+ target()
+ {
+ //switch(rand(4))
+ switch(1)
+ {
+ case 0: return abs_uri();
+ case 1: return abs_path();
+ case 2: return authority();
+ default:
+ case 3: break;
+ }
+ return "*";
+ }
+
+ std::string
+ token()
+ {
+ static char constexpr valid[78] =
+ "!#$%&\'*+-." "0123456789" "ABCDEFGHIJ" "KLMNOPQRST"
+ "UVWXYZ^_`a" "bcdefghijk" "lmnopqrstu" "vwxyz|~";
+ std::string s;
+ s.append(1, valid[rand(77)]);
+ while(rand(4))
+ s.append(1, valid[rand(77)]);
+ return s;
+ }
+
+#if 0
+ std::string
+ target()
+ {
+ static char constexpr alpha[63] =
+ "0123456789" "ABCDEFGHIJ" "KLMNOPQRST"
+ "UVWXYZabcd" "efghijklmn" "opqrstuvwx" "yz";
+ std::string s;
+ s = "/";
+ while(rand(4))
+ s.append(1, alpha[rand(62)]);
+ return s;
+ }
+#endif
+
+ std::string
+ field()
+ { static char const* const list[289] =
+ {
+ "A-IM",
+ "Accept", "Accept-Additions", "Accept-Charset", "Accept-Datetime", "Accept-Encoding",
+ "Accept-Features", "Accept-Language", "Accept-Patch", "Accept-Ranges", "Age", "Allow",
+ "ALPN", "Also-Control", "Alt-Svc", "Alt-Used", "Alternate-Recipient", "Alternates",
+ "Apply-To-Redirect-Ref", "Approved", "Archive", "Archived-At", "Article-Names",
+ "Article-Updates", "Authentication-Info", "Authentication-Results", "Authorization",
+ "Auto-Submitted", "Autoforwarded", "Autosubmitted", "Base", "Bcc", "Body", "C-Ext",
+ "C-Man", "C-Opt", "C-PEP", "C-PEP-Info", "Cache-Control",
+ "CalDAV-Timezones", "Cc", "Close", "Comments", /*"Connection",*/ "Content-Alternative",
+ "Content-Base", "Content-Description", "Content-Disposition", "Content-Duration",
+ "Content-Encoding", "Content-features", "Content-ID", "Content-Identifier",
+ "Content-Language", /*"Content-Length",*/ "Content-Location", "Content-MD5",
+ "Content-Range", "Content-Return", "Content-Script-Type", "Content-Style-Type",
+ "Content-Transfer-Encoding", "Content-Type", "Content-Version", "Control", "Conversion",
+ "Conversion-With-Loss", "Cookie", "Cookie2", "DASL", "DAV", "DL-Expansion-History", "Date",
+ "Date-Received", "Default-Style", "Deferred-Delivery", "Delivery-Date", "Delta-Base",
+ "Depth", "Derived-From", "Destination", "Differential-ID", "Digest",
+ "Discarded-X400-IPMS-Extensions", "Discarded-X400-MTS-Extensions", "Disclose-Recipients",
+ "Disposition-Notification-Options", "Disposition-Notification-To", "Distribution",
+ "DKIM-Signature", "Downgraded-Bcc", "Downgraded-Cc", "Downgraded-Disposition-Notification-To",
+ "Downgraded-Final-Recipient", "Downgraded-From", "Downgraded-In-Reply-To",
+ "Downgraded-Mail-From", "Downgraded-Message-Id", "Downgraded-Original-Recipient",
+ "Downgraded-Rcpt-To", "Downgraded-References", "Downgraded-Reply-To", "Downgraded-Resent-Bcc",
+ "Downgraded-Resent-Cc", "Downgraded-Resent-From", "Downgraded-Resent-Reply-To",
+ "Downgraded-Resent-Sender", "Downgraded-Resent-To", "Downgraded-Return-Path",
+ "Downgraded-Sender", "Downgraded-To", "Encoding", "Encrypted", "ETag", "Expect",
+ "Expires", "Expiry-Date", "Ext", "Followup-To", "Forwarded", "From",
+ "Generate-Delivery-Report", "GetProfile", "Hobareg", "Host", "HTTP2-Settings", "IM", "If",
+ "If-Match", "If-Modified-Since", "If-None-Match", "If-Range", "If-Schedule-Tag-Match",
+ "If-Unmodified-Since", "Importance", "In-Reply-To", "Incomplete-Copy", "Injection-Date",
+ "Injection-Info", "Keep-Alive", "Keywords", "Label", "Language", "Last-Modified",
+ "Latest-Delivery-Time", "Lines", "Link", "List-Archive", "List-Help", "List-ID",
+ "List-Owner", "List-Post", "List-Subscribe", "List-Unsubscribe", "Location", "Lock-Token",
+ "Man", "Max-Forwards", "Memento-Datetime", "Message-Context", "Message-ID", "Message-Type",
+ "Meter", "MIME-Version", "MMHS-Exempted-Address", "MMHS-Extended-Authorisation-Info",
+ "MMHS-Subject-Indicator-Codes", "MMHS-Handling-Instructions", "MMHS-Message-Instructions",
+ "MMHS-Codress-Message-Indicator", "MMHS-Originator-Reference", "MMHS-Primary-Precedence",
+ "MMHS-Copy-Precedence", "MMHS-Message-Type", "MMHS-Other-Recipients-Indicator-To",
+ "MMHS-Other-Recipients-Indicator-CC", "MMHS-Acp127-Message-Identifier", "MMHS-Originator-PLAD",
+ "MT-Priority", "Negotiate", "Newsgroups", "NNTP-Posting-Date", "NNTP-Posting-Host",
+ "Obsoletes", "Opt", "Ordering-Type", "Organization", "Origin",
+ "Original-Encoded-Information-Types", "Original-From", "Original-Message-ID",
+ "Original-Recipient", "Original-Sender", "Originator-Return-Address", "Original-Subject",
+ "Overwrite", "P3P", "Path", "PEP", "PICS-Label", "Pep-Info", "Position", "Posting-Version",
+ "Pragma", "Prefer", "Preference-Applied", "Prevent-NonDelivery-Report", "Priority",
+ "ProfileObject", "Protocol", "Protocol-Info", "Protocol-Query", "Protocol-Request",
+ "Proxy-Authenticate", "Proxy-Authentication-Info", "Proxy-Authorization", "Proxy-Features",
+ "Proxy-Instruction", "Public", "Public-Key-Pins", "Public-Key-Pins-Report-Only", "Range",
+ "Received", "Received-SPF", "Redirect-Ref", "References", "Referer", "Relay-Version",
+ "Reply-By", "Reply-To", "Require-Recipient-Valid-Since", "Resent-Bcc", "Resent-Cc",
+ "Resent-Date", "Resent-From", "Resent-Message-ID", "Resent-Reply-To", "Resent-Sender",
+ "Resent-To", "Retry-After", "Return-Path", "Safe", "Schedule-Reply", "Schedule-Tag",
+ "Sec-WebSocket-Accept", "Sec-WebSocket-Extensions", "Sec-WebSocket-Key",
+ "Sec-WebSocket-Protocol", "Sec-WebSocket-Version", "Security-Scheme", "See-Also", "Sender",
+ "Sensitivity", "Server", "Set-Cookie", "Set-Cookie2",
+ "SetProfile", "SLUG", "SoapAction", "Solicitation", "Status-URI", "Strict-Transport-Security",
+ "Subject", "Summary", "Supersedes", "Surrogate-Capability", "Surrogate-Control", "TCN",
+ "TE", "Timeout", "To", "Trailer", /*"Transfer-Encoding",*/ "URI", /*"Upgrade",*/ "User-Agent",
+ "Variant-Vary", "Vary", "VBR-Info", "Via", "WWW-Authenticate", "Want-Digest", "Warning",
+ "X400-Content-Identifier", "X400-Content-Return", "X400-Content-Type", "X400-MTS-Identifier",
+ "X400-Originator", "X400-Received", "X400-Recipients", "X400-Trace", "X-Frame-Options", "Xref"
+ };
+ return list[rand(289)];
+ }
+
+ std::string
+ text()
+ {
+ std::string s;
+ while(rand(3))
+ {
+ for(;;)
+ {
+ char c = rand<char>(256);
+ if(detail::is_text(c))
+ {
+ s.append(1, c);
+ break;
+ }
+ }
+ }
+ return s;
+ }
+
+ std::string
+ value()
+ {
+ std::string s;
+ while(rand(3))
+ {
+ if(rand(5))
+ {
+ s.append(text());
+ }
+ else
+ {
+ // LWS
+ if(! rand(4))
+ s.append("\r\n");
+ s.append(1, rand(2) ? ' ' : '\t');
+ while(rand(2))
+ s.append(1, rand(2) ? ' ' : '\t');
+ }
+ }
+ return s;
+ }
+
+ template<class DynamicBuffer>
+ void
+ fields(DynamicBuffer& db)
+ {
+ auto os = ostream(db);
+ while(rand(6))
+ os <<
+ field() <<
+ (rand(4) ? ": " : ":") <<
+ value() <<
+ "\r\n";
+ }
+
+ template<class DynamicBuffer>
+ void
+ body(DynamicBuffer& db)
+ {
+ if(! rand(4))
+ {
+ ostream(db) <<
+ "Content-Length: 0\r\n\r\n";
+ return;
+ }
+ if(rand(2))
+ {
+ auto const len = rand(500);
+ ostream(db) <<
+ "Content-Length: " << len << "\r\n\r\n";
+ auto mb = db.prepare(len);
+ for(auto it = net::buffer_sequence_begin(mb);
+ it != net::buffer_sequence_end(mb);
+ ++it)
+ {
+ net::mutable_buffer b = *it;
+ auto p = static_cast<char*>(b.data());
+ auto n = b.size();
+ while(n--)
+ *p++ = static_cast<char>(32 + rand(26+26+10+6));
+ }
+ db.commit(len);
+ }
+ else
+ {
+ auto len = rand(500);
+ ostream(db) <<
+ "Transfer-Encoding: chunked\r\n\r\n";
+ while(len > 0)
+ {
+ auto n = (std::min)(1 + rand(300), len);
+ len -= n;
+ ostream(db) <<
+ to_hex(n) << "\r\n";
+ auto mb = db.prepare(n);
+ for(auto it = net::buffer_sequence_begin(mb);
+ it != net::buffer_sequence_end(mb);
+ ++it)
+ {
+ net::mutable_buffer b = *it;
+ auto p = static_cast<char*>(b.data());
+ auto m = b.size();
+ while(m--)
+ *p++ = static_cast<char>(32 + rand(26+26+10+6));
+ }
+ db.commit(n);
+ ostream(db) << "\r\n";
+ }
+ ostream(db) << "0\r\n\r\n";
+ }
+ }
+
+ template<class DynamicBuffer>
+ void
+ request(DynamicBuffer& db)
+ {
+ ostream(db) <<
+ method() << " " << target() << " HTTP/1.1\r\n";
+ fields(db);
+ body(db);
+ }
+
+ template<class DynamicBuffer>
+ void
+ response(DynamicBuffer& db)
+ {
+ ostream(db) <<
+ "HTTP/1." <<
+ (rand(2) ? "0" : "1") << " " <<
+ (100 + rand(401)) << " " <<
+ token() <<
+ "\r\n";
+ fields(db);
+ body(db);
+ ostream(db) << "\r\n";
+ }
+};
+
+using message_fuzz = message_fuzz_t<>;
+
+template<class Good, class Bad>
+void
+chunkExtensionsTest(
+ Good const& good, Bad const& bad)
+{
+ good("");
+ good(";x");
+ good(";x;y");
+ good(";x=y");
+ good(";x;y=z");
+ good(" ;x");
+ good("\t;x");
+ good(" \t;x");
+ good("\t ;x");
+ good(" ; x");
+ good(" ;\tx");
+ good("\t ; \tx");
+ good(";x= y");
+ good(" ;x= y");
+ good(" ; x= y");
+ good(R"(;x="\"")");
+ good(R"(;x="\\")");
+ good(R"(;x;y=z;z="\"";p="\\";q="1\"2\\")");
+
+ bad(" ");
+ bad(";");
+ bad("=");
+ bad(" ;");
+ bad("; ");
+ bad(" ; ");
+ bad(" ; x ");
+ bad(";x =");
+ bad(";x = ");
+ bad(";x==");
+}
+
+} // http
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/http/parser.cpp b/src/boost/libs/beast/test/beast/http/parser.cpp
new file mode 100644
index 000000000..d68426222
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/parser.cpp
@@ -0,0 +1,436 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/parser.hpp>
+
+#include "test_parser.hpp"
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_suffix.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/http/read.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/system/system_error.hpp>
+#include <algorithm>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class parser_test
+ : public beast::unit_test::suite
+{
+public:
+ template<bool isRequest>
+ using parser_type =
+ parser<isRequest, string_body>;
+
+ static
+ net::const_buffer
+ buf(string_view s)
+ {
+ return {s.data(), s.size()};
+ }
+
+ template<class ConstBufferSequence,
+ bool isRequest>
+ static
+ void
+ put(ConstBufferSequence const& buffers,
+ basic_parser<isRequest>& p,
+ error_code& ec)
+ {
+ buffers_suffix<ConstBufferSequence> cb{buffers};
+ for(;;)
+ {
+ auto const used = p.put(cb, ec);
+ cb.consume(used);
+ if(ec)
+ return;
+ if(p.need_eof() &&
+ buffer_bytes(cb) == 0)
+ {
+ p.put_eof(ec);
+ if(ec)
+ return;
+ }
+ if(p.is_done())
+ break;
+ }
+ }
+
+ template<bool isRequest, class F>
+ void
+ doMatrix(string_view s0, F const& f)
+ {
+ // parse a single buffer
+ {
+ auto s = s0;
+ error_code ec;
+ parser_type<isRequest> p;
+ put(net::buffer(s.data(), s.size()), p, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ f(p);
+ }
+ // parse two buffers
+ for(auto n = s0.size() - 1; n >= 1; --n)
+ {
+ auto s = s0;
+ error_code ec;
+ parser_type<isRequest> p;
+ p.eager(true);
+ auto used =
+ p.put(net::buffer(s.data(), n), ec);
+ s.remove_prefix(used);
+ if(ec == error::need_more)
+ ec = {};
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ BEAST_EXPECT(! p.is_done());
+ used = p.put(
+ net::buffer(s.data(), s.size()), ec);
+ s.remove_prefix(used);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ BEAST_EXPECT(s.empty());
+ if(p.need_eof())
+ {
+ p.put_eof(ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ }
+ if(BEAST_EXPECT(p.is_done()))
+ f(p);
+ }
+ }
+
+ void
+ testParse()
+ {
+ doMatrix<false>(
+ "HTTP/1.0 200 OK\r\n"
+ "Server: test\r\n"
+ "\r\n"
+ "Hello, world!",
+ [&](parser_type<false> const& p)
+ {
+ auto const& m = p.get();
+ BEAST_EXPECT(! p.chunked());
+ BEAST_EXPECT(p.need_eof());
+ BEAST_EXPECT(p.content_length() == boost::none);
+ BEAST_EXPECT(m.version() == 10);
+ BEAST_EXPECT(m.result() == status::ok);
+ BEAST_EXPECT(m.reason() == "OK");
+ BEAST_EXPECT(m["Server"] == "test");
+ BEAST_EXPECT(m.body() == "Hello, world!");
+ }
+ );
+ doMatrix<false>(
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Expect: Expires, MD5-Fingerprint\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "5\r\n"
+ "*****\r\n"
+ "2;a;b=1;c=\"2\"\r\n"
+ "--\r\n"
+ "0;d;e=3;f=\"4\"\r\n"
+ "Expires: never\r\n"
+ "MD5-Fingerprint: -\r\n"
+ "\r\n",
+ [&](parser_type<false> const& p)
+ {
+ auto const& m = p.get();
+ BEAST_EXPECT(! p.need_eof());
+ BEAST_EXPECT(p.chunked());
+ BEAST_EXPECT(p.content_length() == boost::none);
+ BEAST_EXPECT(m.version() == 11);
+ BEAST_EXPECT(m.result() == status::ok);
+ BEAST_EXPECT(m.reason() == "OK");
+ BEAST_EXPECT(m["Server"] == "test");
+ BEAST_EXPECT(m["Transfer-Encoding"] == "chunked");
+ BEAST_EXPECT(m["Expires"] == "never");
+ BEAST_EXPECT(m["MD5-Fingerprint"] == "-");
+ BEAST_EXPECT(m.body() == "*****--");
+ }
+ );
+ doMatrix<false>(
+ "HTTP/1.0 200 OK\r\n"
+ "Server: test\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****",
+ [&](parser_type<false> const& p)
+ {
+ auto const& m = p.get();
+ BEAST_EXPECT(m.body() == "*****");
+ }
+ );
+ doMatrix<true>(
+ "GET / HTTP/1.1\r\n"
+ "User-Agent: test\r\n"
+ "\r\n",
+ [&](parser_type<true> const& p)
+ {
+ auto const& m = p.get();
+ BEAST_EXPECT(m.method() == verb::get);
+ BEAST_EXPECT(m.target() == "/");
+ BEAST_EXPECT(m.version() == 11);
+ BEAST_EXPECT(! p.need_eof());
+ BEAST_EXPECT(! p.chunked());
+ BEAST_EXPECT(p.content_length() == boost::none);
+ }
+ );
+ doMatrix<true>(
+ "GET / HTTP/1.1\r\n"
+ "User-Agent: test\r\n"
+ "X: \t x \t \r\n"
+ "\r\n",
+ [&](parser_type<true> const& p)
+ {
+ auto const& m = p.get();
+ BEAST_EXPECT(m["X"] == "x");
+ }
+ );
+
+ // test eager(true)
+ {
+ error_code ec;
+ parser_type<true> p;
+ p.eager(true);
+ p.put(buf(
+ "GET / HTTP/1.1\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n"
+ "*")
+ , ec);
+ auto const& m = p.get();
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(p.is_done());
+ BEAST_EXPECT(p.is_header_done());
+ BEAST_EXPECT(! p.need_eof());
+ BEAST_EXPECT(m.method() == verb::get);
+ BEAST_EXPECT(m.target() == "/");
+ BEAST_EXPECT(m.version() == 11);
+ BEAST_EXPECT(m["User-Agent"] == "test");
+ BEAST_EXPECT(m.body() == "*");
+ }
+ {
+ // test partial parsing of final chunk
+ // parse through the chunk body
+ error_code ec;
+ flat_buffer b;
+ parser_type<true> p;
+ p.eager(true);
+ ostream(b) <<
+ "PUT / HTTP/1.1\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "1\r\n"
+ "*";
+ auto used = p.put(b.data(), ec);
+ b.consume(used);
+ BEAST_EXPECT(! ec);
+ BEAST_EXPECT(! p.is_done());
+ BEAST_EXPECT(p.get().body() == "*");
+ ostream(b) <<
+ "\r\n"
+ "0;d;e=3;f=\"4\"\r\n"
+ "Expires: never\r\n"
+ "MD5-Fingerprint: -\r\n";
+ // incomplete parse, missing the final crlf
+ used = p.put(b.data(), ec);
+ b.consume(used);
+ BEAST_EXPECT(ec == error::need_more);
+ ec = {};
+ BEAST_EXPECT(! p.is_done());
+ ostream(b) <<
+ "\r\n"; // final crlf to end message
+ used = p.put(b.data(), ec);
+ b.consume(used);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ }
+ // skip body
+ {
+ error_code ec;
+ response_parser<string_body> p;
+ p.skip(true);
+ p.put(buf(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****")
+ , ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_done());
+ BEAST_EXPECT(p.is_header_done());
+ BEAST_EXPECT(p.content_length() &&
+ *p.content_length() == 5);
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ template<class DynamicBuffer>
+ void
+ testNeedMore()
+ {
+ error_code ec;
+ std::size_t used;
+ {
+ DynamicBuffer b;
+ parser_type<true> p;
+ ostream(b) <<
+ "GET / HTTP/1.1\r\n";
+ used = p.put(b.data(), ec);
+ BEAST_EXPECTS(ec == error::need_more, ec.message());
+ b.consume(used);
+ ec = {};
+ ostream(b) <<
+ "User-Agent: test\r\n"
+ "\r\n";
+ used = p.put(b.data(), ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ b.consume(used);
+ BEAST_EXPECT(p.is_done());
+ BEAST_EXPECT(p.is_header_done());
+ }
+ }
+
+ void
+ testGotSome()
+ {
+ error_code ec;
+ parser_type<true> p;
+ auto used = p.put(buf(""), ec);
+ BEAST_EXPECT(ec == error::need_more);
+ BEAST_EXPECT(! p.got_some());
+ BEAST_EXPECT(used == 0);
+ ec = {};
+ used = p.put(buf("G"), ec);
+ BEAST_EXPECT(ec == error::need_more);
+ BEAST_EXPECT(p.got_some());
+ BEAST_EXPECT(used == 0);
+ }
+
+ void
+ testIssue818()
+ {
+ // Make sure that the parser clears pre-existing fields
+ request<string_body> m;
+ m.set(field::accept, "html/text");
+ BEAST_EXPECT(std::distance(m.begin(), m.end()) == 1);
+ request_parser<string_body> p{std::move(m)};
+ BEAST_EXPECT(std::distance(m.begin(), m.end()) == 0);
+ auto& m1 = p.get();
+ BEAST_EXPECT(std::distance(m1.begin(), m1.end()) == 0);
+ }
+
+ void
+ testIssue1187()
+ {
+ // make sure parser finishes on redirect
+ error_code ec;
+ parser_type<false> p;
+ p.eager(true);
+ p.put(buf(
+ "HTTP/1.1 301 Moved Permanently\r\n"
+ "Location: https://www.ebay.com\r\n"
+ "\r\n\r\n"), ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(p.is_header_done());
+ BEAST_EXPECT(! p.is_done());
+ BEAST_EXPECT(p.need_eof());
+ }
+
+ void
+ testIssue1880()
+ {
+ // A user raised the issue that multiple Content-Length fields and
+ // values are permissible provided all values are the same.
+ // See rfc7230 section-3.3.2
+ // https://tools.ietf.org/html/rfc7230#section-3.3.2
+ // Credit: Dimitry Bulsunov
+
+ auto checkPass = [&](std::string const& message)
+ {
+ response_parser<string_body> parser;
+ error_code ec;
+ parser.put(net::buffer(message), ec);
+ BEAST_EXPECTS(!ec.failed(), ec.message());
+ };
+
+ auto checkFail = [&](std::string const& message)
+ {
+ response_parser<string_body> parser;
+ error_code ec;
+ parser.put(net::buffer(message), ec);
+ BEAST_EXPECTS(ec == error::bad_content_length, ec.message());
+ };
+
+ // multiple contents lengths the same
+ checkPass(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 0\r\n"
+ "Content-Length: 0\r\n"
+ "\r\n");
+
+ // multiple contents lengths different
+ checkFail(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 0\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n");
+
+ // multiple content in same header
+ checkPass(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 0, 0, 0\r\n"
+ "\r\n");
+
+ // multiple content in same header but mismatch (case 1)
+ checkFail(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 0, 0, 1\r\n"
+ "\r\n");
+
+ // multiple content in same header but mismatch (case 2)
+ checkFail(
+ "HTTP/1.1 200 OK\r\n"
+ "Content-Length: 0, 0, 0\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n");
+ }
+
+ void
+ run() override
+ {
+ testParse();
+ testNeedMore<flat_buffer>();
+ testNeedMore<multi_buffer>();
+ testGotSome();
+ testIssue818();
+ testIssue1187();
+ testIssue1880();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,parser);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/read.cpp b/src/boost/libs/beast/test/beast/http/read.cpp
new file mode 100644
index 000000000..8446894b8
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/read.cpp
@@ -0,0 +1,562 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/read.hpp>
+
+#include "test_parser.hpp"
+
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/flat_static_buffer.hpp>
+#include <boost/beast/http/fields.hpp>
+#include <boost/beast/http/dynamic_body.hpp>
+#include <boost/beast/http/parser.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/test/yield_to.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <atomic>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class read_test
+ : public beast::unit_test::suite
+ , public test::enable_yield_to
+{
+public:
+ template<bool isRequest>
+ void
+ failMatrix(char const* s, yield_context do_yield)
+ {
+ static std::size_t constexpr limit = 100;
+ std::size_t n;
+ auto const len = strlen(s);
+ for(n = 0; n < limit; ++n)
+ {
+ multi_buffer b;
+ b.commit(net::buffer_copy(
+ b.prepare(len), net::buffer(s, len)));
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc};
+ test_parser<isRequest> p(fc);
+ error_code ec = test::error::test_failure;
+ ts.close_remote();
+ read(ts, b, p, ec);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+ for(n = 0; n < limit; ++n)
+ {
+ static std::size_t constexpr pre = 10;
+ multi_buffer b;
+ b.commit(net::buffer_copy(
+ b.prepare(pre), net::buffer(s, pre)));
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc,
+ std::string(s + pre, len - pre)};
+ test_parser<isRequest> p(fc);
+ error_code ec = test::error::test_failure;
+ ts.close_remote();
+ read(ts, b, p, ec);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+ for(n = 0; n < limit; ++n)
+ {
+ multi_buffer b;
+ b.commit(net::buffer_copy(
+ b.prepare(len), net::buffer(s, len)));
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc};
+ test_parser<isRequest> p(fc);
+ error_code ec = test::error::test_failure;
+ ts.close_remote();
+ async_read(ts, b, p, do_yield[ec]);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+ for(n = 0; n < limit; ++n)
+ {
+ multi_buffer b;
+ b.commit(net::buffer_copy(
+ b.prepare(len), net::buffer(s, len)));
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc};
+ test_parser<isRequest> p(fc);
+ error_code ec = test::error::test_failure;
+ ts.close_remote();
+ async_read_header(ts, b, p, do_yield[ec]);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+ for(n = 0; n < limit; ++n)
+ {
+ static std::size_t constexpr pre = 10;
+ multi_buffer b;
+ b.commit(net::buffer_copy(
+ b.prepare(pre), net::buffer(s, pre)));
+ test::fail_count fc(n);
+ test::stream ts(ioc_, fc,
+ std::string{s + pre, len - pre});
+ test_parser<isRequest> p(fc);
+ error_code ec = test::error::test_failure;
+ ts.close_remote();
+ async_read(ts, b, p, do_yield[ec]);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+ }
+
+ void testThrow()
+ {
+ try
+ {
+ multi_buffer b;
+ test::stream c{ioc_, "GET / X"};
+ c.close_remote();
+ request_parser<dynamic_body> p;
+ read(c, b, p);
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ }
+
+ void
+ testBufferOverflow()
+ {
+ {
+ test::stream c{ioc_};
+ ostream(c.buffer()) <<
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "10\r\n"
+ "****************\r\n"
+ "0\r\n\r\n";
+ flat_static_buffer<1024> b;
+ request<string_body> req;
+ try
+ {
+ read(c, b, req);
+ pass();
+ }
+ catch(std::exception const& e)
+ {
+ fail(e.what(), __FILE__, __LINE__);
+ }
+ }
+ {
+ test::stream c{ioc_};
+ ostream(c.buffer()) <<
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "10\r\n"
+ "****************\r\n"
+ "0\r\n\r\n";
+ error_code ec = test::error::test_failure;
+ flat_static_buffer<10> b;
+ request<string_body> req;
+ read(c, b, req, ec);
+ BEAST_EXPECTS(ec == error::buffer_overflow,
+ ec.message());
+ }
+ }
+
+ void testFailures(yield_context do_yield)
+ {
+ char const* req[] = {
+ "GET / HTTP/1.0\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Empty:\r\n"
+ "\r\n"
+ ,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 2\r\n"
+ "\r\n"
+ "**"
+ ,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "10\r\n"
+ "****************\r\n"
+ "0\r\n\r\n"
+ ,
+ nullptr
+ };
+
+ char const* res[] = {
+ "HTTP/1.0 200 OK\r\n"
+ "Server: test\r\n"
+ "\r\n"
+ ,
+ "HTTP/1.0 200 OK\r\n"
+ "Server: test\r\n"
+ "\r\n"
+ "***"
+ ,
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Content-Length: 3\r\n"
+ "\r\n"
+ "***"
+ ,
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "10\r\n"
+ "****************\r\n"
+ "0\r\n\r\n"
+ ,
+ nullptr
+ };
+ for(std::size_t i = 0; req[i]; ++i)
+ failMatrix<true>(req[i], do_yield);
+ for(std::size_t i = 0; res[i]; ++i)
+ failMatrix<false>(res[i], do_yield);
+ }
+
+ void testRead(yield_context do_yield)
+ {
+ static std::size_t constexpr limit = 100;
+ std::size_t n;
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream c{ioc_, fc,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 0\r\n"
+ "\r\n"
+ };
+ request<dynamic_body> m;
+ try
+ {
+ multi_buffer b;
+ read(c, b, m);
+ break;
+ }
+ catch(std::exception const&)
+ {
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream ts{ioc_, fc,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 0\r\n"
+ "\r\n"
+ };
+ request<dynamic_body> m;
+ error_code ec = test::error::test_failure;
+ multi_buffer b;
+ read(ts, b, m, ec);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream c{ioc_, fc,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 0\r\n"
+ "\r\n"
+ };
+ request<dynamic_body> m;
+ error_code ec = test::error::test_failure;
+ multi_buffer b;
+ async_read(c, b, m, do_yield[ec]);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream c{ioc_, fc,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 0\r\n"
+ "\r\n"
+ };
+ request_parser<dynamic_body> m;
+ error_code ec = test::error::test_failure;
+ multi_buffer b;
+ async_read_some(c, b, m, do_yield[ec]);
+ if(! ec)
+ break;
+ }
+ BEAST_EXPECT(n < limit);
+ }
+
+ void
+ testEof(yield_context do_yield)
+ {
+ {
+ multi_buffer b;
+ test::stream ts{ioc_};
+ request_parser<dynamic_body> p;
+ error_code ec;
+ ts.close_remote();
+ read(ts, b, p, ec);
+ BEAST_EXPECT(ec == http::error::end_of_stream);
+ }
+ {
+ multi_buffer b;
+ test::stream ts{ioc_};
+ request_parser<dynamic_body> p;
+ error_code ec;
+ ts.close_remote();
+ async_read(ts, b, p, do_yield[ec]);
+ BEAST_EXPECT(ec == http::error::end_of_stream);
+ }
+ }
+
+ // Ensure completion handlers are not leaked
+ struct handler
+ {
+ static std::atomic<std::size_t>&
+ count() { static std::atomic<std::size_t> n; return n; }
+ handler() { ++count(); }
+ ~handler() { --count(); }
+ handler(handler const&) { ++count(); }
+ void operator()(error_code const&, std::size_t) const {}
+ };
+
+ void
+ testIoService()
+ {
+ {
+ // Make sure handlers are not destroyed
+ // after calling io_context::stop
+ net::io_context ioc;
+ test::stream ts{ioc,
+ "GET / HTTP/1.1\r\n\r\n"};
+ BEAST_EXPECT(handler::count() == 0);
+ multi_buffer b;
+ request<dynamic_body> m;
+ async_read(ts, b, m, handler{});
+ BEAST_EXPECT(handler::count() > 0);
+ ioc.stop();
+ BEAST_EXPECT(handler::count() > 0);
+ ioc.restart();
+ BEAST_EXPECT(handler::count() > 0);
+ ioc.run_one();
+ BEAST_EXPECT(handler::count() == 0);
+ }
+ {
+ // Make sure uninvoked handlers are
+ // destroyed when calling ~io_context
+ {
+ net::io_context ioc;
+ test::stream ts{ioc,
+ "GET / HTTP/1.1\r\n\r\n"};
+ BEAST_EXPECT(handler::count() == 0);
+ multi_buffer b;
+ request<dynamic_body> m;
+ async_read(ts, b, m, handler{});
+ BEAST_EXPECT(handler::count() > 0);
+ }
+ BEAST_EXPECT(handler::count() == 0);
+ }
+ }
+
+ // https://github.com/boostorg/beast/issues/430
+ void
+ testRegression430()
+ {
+ test::stream ts{ioc_};
+ ts.read_size(1);
+ ostream(ts.buffer()) <<
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "Content-Type: application/octet-stream\r\n"
+ "\r\n"
+ "4\r\nabcd\r\n"
+ "0\r\n\r\n";
+ error_code ec;
+ flat_buffer fb;
+ response_parser<dynamic_body> p;
+ read(ts, fb, p, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+
+ //--------------------------------------------------------------------------
+
+ template<class Parser, class Pred>
+ void
+ readgrind(string_view s, Pred&& pred)
+ {
+ for(std::size_t n = 1; n < s.size() - 1; ++n)
+ {
+ Parser p;
+ error_code ec = test::error::test_failure;
+ flat_buffer b;
+ test::stream ts{ioc_};
+ ostream(ts.buffer()) << s;
+ ts.read_size(n);
+ read(ts, b, p, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ continue;
+ pred(p);
+ }
+ }
+
+ void
+ testReadGrind()
+ {
+ readgrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "Content-Type: application/octet-stream\r\n"
+ "\r\n"
+ "4\r\nabcd\r\n"
+ "0\r\n\r\n"
+ ,[&](test_parser<false> const& p)
+ {
+ BEAST_EXPECT(p.body == "abcd");
+ });
+ readgrind<test_parser<false>>(
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Expect: Expires, MD5-Fingerprint\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "5\r\n"
+ "*****\r\n"
+ "2;a;b=1;c=\"2\"\r\n"
+ "--\r\n"
+ "0;d;e=3;f=\"4\"\r\n"
+ "Expires: never\r\n"
+ "MD5-Fingerprint: -\r\n"
+ "\r\n"
+ ,[&](test_parser<false> const& p)
+ {
+ BEAST_EXPECT(p.body == "*****--");
+ });
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void
+ testAsioHandlerInvoke()
+ {
+ using strand = net::strand<
+ net::io_context::executor_type>;
+
+ // make sure things compile, also can set a
+ // breakpoint in asio_handler_invoke to make sure
+ // it is instantiated.
+ {
+ net::io_context ioc;
+ strand s{ioc.get_executor()};
+ test::stream ts{ioc};
+ flat_buffer b;
+ request_parser<dynamic_body> p;
+ async_read_some(ts, b, p,
+ net::bind_executor(
+ s, copyable_handler{}));
+ }
+ {
+ net::io_context ioc;
+ strand s{ioc.get_executor()};
+ test::stream ts{ioc};
+ flat_buffer b;
+ request_parser<dynamic_body> p;
+ async_read(ts, b, p,
+ net::bind_executor(
+ s, copyable_handler{}));
+ }
+ {
+ net::io_context ioc;
+ strand s{ioc.get_executor()};
+ test::stream ts{ioc};
+ flat_buffer b;
+ request<dynamic_body> m;
+ async_read(ts, b, m,
+ net::bind_executor(
+ s, copyable_handler{}));
+ }
+ }
+
+ void
+ run() override
+ {
+ testThrow();
+ testBufferOverflow();
+
+ yield_to([&](yield_context yield)
+ {
+ testFailures(yield);
+ });
+ yield_to([&](yield_context yield)
+ {
+ testRead(yield);
+ });
+ yield_to([&](yield_context yield)
+ {
+ testEof(yield);
+ });
+
+ testIoService();
+ testRegression430();
+ testReadGrind();
+ testAsioHandlerInvoke();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,read);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/rfc7230.cpp b/src/boost/libs/beast/test/beast/http/rfc7230.cpp
new file mode 100644
index 000000000..1bcc13534
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/rfc7230.cpp
@@ -0,0 +1,361 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/rfc7230.hpp>
+
+#include <boost/beast/http/detail/rfc7230.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <string>
+#include <vector>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class rfc7230_test : public beast::unit_test::suite
+{
+public:
+ static
+ std::string
+ fmt(std::string const& s)
+ {
+ return '\'' + s + '\'';
+ }
+
+ static
+ std::string
+ str(string_view s)
+ {
+ return std::string(s.data(), s.size());
+ }
+
+ static
+ std::string
+ str(param_list const& c)
+ {
+ std::string s;
+ for(auto const& p : c)
+ {
+ s.push_back(';');
+ s.append(str(p.first));
+ if(! p.second.empty())
+ {
+ s.push_back('=');
+ s.append(str(p.second));
+ }
+ }
+ return s;
+ }
+
+ void
+ testParamList()
+ {
+ auto const ce =
+ [&](std::string const& s)
+ {
+ auto const got = str(param_list{s});
+ BEAST_EXPECTS(got == s, fmt(got));
+ };
+ auto const cs =
+ [&](std::string const& s, std::string const& answer)
+ {
+ ce(answer);
+ auto const got = str(param_list{s});
+ ce(got);
+ BEAST_EXPECTS(got == answer, fmt(got));
+ };
+ auto const cq =
+ [&](std::string const& s, std::string const& answer)
+ {
+ auto const got = str(param_list{s});
+ BEAST_EXPECTS(got == answer, fmt(got));
+ };
+
+ ce("");
+ ce(";x");
+ ce(";xy");
+ ce(";x;y");
+
+ ce("");
+ cs(" ;\t i =\t 1 \t", ";i=1");
+ cq("\t; \t xyz=1 ; ijk=\"q\\\"t\"", ";xyz=1;ijk=q\"t");
+ ce(";x;y");
+
+ ce(";chunked;a=b;i=j;gzip;windowBits=12");
+ ce(";chunked;a=b;i=j;gzip;windowBits=12;permessage-deflate");
+
+ // invalid strings
+ cs(";", "");
+ cs(";,", "");
+ cq(";x=,", "");
+ cq(";xy=\"", "");
+ cq(";xy=\"\x7f", "");
+ cq(";xy=\"\\", "");
+ cq(";xy=\"\\\x01\"", "");
+
+ }
+
+ static
+ std::string
+ str(ext_list const& ex)
+ {
+ std::string s;
+ for(auto const& e : ex)
+ {
+ if(! s.empty())
+ s += ',';
+ s.append(str(e.first));
+ s += str(e.second);
+ }
+ return s;
+ }
+
+ void
+ testExtList()
+ {
+ auto const ce =
+ [&](std::string const& s)
+ {
+ auto const got = str(ext_list{s});
+ BEAST_EXPECTS(got == s, fmt(got));
+ };
+ auto const cs =
+ [&](std::string const& s, std::string const& good)
+ {
+ ce(good);
+ auto const got = str(ext_list{s});
+ ce(got);
+ BEAST_EXPECTS(got == good, fmt(got));
+ };
+ auto const cq =
+ [&](std::string const& s, std::string const& good)
+ {
+ auto const got = str(ext_list{s});
+ BEAST_EXPECTS(got == good, fmt(got));
+ };
+ /*
+ ext-basic_parsed_list = *( "," OWS ) ext *( OWS "," [ OWS ext ] )
+ ext = token param-basic_parsed_list
+ param-basic_parsed_list = *( OWS ";" OWS param )
+ param = token OWS "=" OWS ( token / quoted-string )
+ */
+ cs(",", "");
+ cs(", ", "");
+ cs(",\t", "");
+ cs(", \t", "");
+ cs(" ", "");
+ cs(" ,", "");
+ cs("\t,", "");
+ cs("\t , \t", "");
+ cs(",,", "");
+ cs(" , \t,, \t,", "");
+ cs( "permessage-deflate; client_no_context_takeover; client_max_window_bits",
+ "permessage-deflate;client_no_context_takeover;client_max_window_bits");
+
+ ce("a");
+ ce("ab");
+ ce("a,b");
+ cs(" a ", "a");
+ cs("\t a, b\t , c\t", "a,b,c");
+ ce("a;b");
+ ce("a;b;c");
+
+ cs("a; \t i\t=\t \t1\t ", "a;i=1");
+ ce("a;i=1;j=2;k=3");
+ ce("a;i=1;j=2;k=3,b;i=4;j=5;k=6");
+
+ cq("ab;x=\" \"", "ab;x= ");
+ cq("ab;x=\"\\\"\"", "ab;x=\"");
+
+ BEAST_EXPECT(ext_list{"a,b;i=1,c;j=2;k=3"}.exists("A"));
+ BEAST_EXPECT(ext_list{"a,b;i=1,c;j=2;k=3"}.exists("b"));
+ BEAST_EXPECT(! ext_list{"a,b;i=1,c;j=2;k=3"}.exists("d"));
+
+ // invalid strings
+ cs("i j", "i");
+ cs(";", "");
+ }
+
+ static
+ std::string
+ str(token_list const& c)
+ {
+ bool first = true;
+ std::string s;
+ for(auto const& p : c)
+ {
+ if(! first)
+ s.push_back(',');
+ s.append(str(p));
+ first = false;
+ }
+ return s;
+ }
+
+ void
+ testTokenList()
+ {
+ auto const ce =
+ [&](std::string const& s)
+ {
+ auto const got = str(token_list{s});
+ BEAST_EXPECTS(got == s, fmt(got));
+ };
+ auto const cs =
+ [&](std::string const& s, std::string const& good)
+ {
+ ce(good);
+ auto const got = str(token_list{s});
+ ce(got);
+ BEAST_EXPECTS(got == good, fmt(got));
+ };
+
+ cs("", "");
+ cs(" ", "");
+ cs(" ", "");
+ cs("\t", "");
+ cs(" \t ", "");
+ cs(",", "");
+ cs(",,", "");
+ cs(" ,", "");
+ cs(" , ,", "");
+ cs(" x", "x");
+ cs(" \t x", "x");
+ cs("x ", "x");
+ cs("x \t", "x");
+ cs(" \t x \t ", "x");
+ ce("x,y");
+ cs("x ,\ty ", "x,y");
+ cs("x, y, z", "x,y,z");
+
+ BEAST_EXPECT(token_list{"a,b,c"}.exists("A"));
+ BEAST_EXPECT(token_list{"a,b,c"}.exists("b"));
+ BEAST_EXPECT(! token_list{"a,b,c"}.exists("d"));
+
+ // invalid
+ cs("x y", "x");
+ }
+
+ template<class Policy>
+ static
+ std::vector<std::string>
+ to_vector(string_view in)
+ {
+ std::vector<std::string> v;
+ detail::basic_parsed_list<Policy> list{in};
+ for(auto const& s :
+ detail::basic_parsed_list<Policy>{in})
+ v.emplace_back(s.data(), s.size());
+ return v;
+ }
+
+ template<class Policy>
+ void
+ validate(string_view in,
+ std::vector<std::string> const& v)
+ {
+ BEAST_EXPECT(to_vector<Policy>(in) == v);
+ }
+
+ template<class Policy>
+ void
+ good(string_view in)
+ {
+ BEAST_EXPECT(validate_list(
+ detail::basic_parsed_list<Policy>{in}));
+ }
+
+ template<class Policy>
+ void
+ good(string_view in,
+ std::vector<std::string> const& v)
+ {
+ BEAST_EXPECT(validate_list(
+ detail::basic_parsed_list<Policy>{in}));
+ validate<Policy>(in, v);
+ }
+
+ template<class Policy>
+ void
+ bad(string_view in)
+ {
+ BEAST_EXPECT(! validate_list(
+ detail::basic_parsed_list<Policy>{in}));
+ }
+
+ void
+ testOptTokenList()
+ {
+ /*
+ #token = [ ( "," / token ) *( OWS "," [ OWS token ] ) ]
+ */
+ using type = detail::opt_token_list_policy;
+
+ good<type>("", {});
+ good<type>(" ", {});
+ good<type>("\t", {});
+ good<type>(" \t", {});
+ good<type>(",", {});
+ good<type>(",,", {});
+ good<type>(", ,", {});
+ good<type>(",\t,", {});
+ good<type>(", \t,", {});
+ good<type>(", \t, ", {});
+ good<type>(", \t,\t", {});
+ good<type>(", \t, \t", {});
+
+ good<type>("x", {"x"});
+ good<type>(" x", {"x"});
+ good<type>("x,,", {"x"});
+ good<type>("x, ,", {"x"});
+ good<type>("x,, ", {"x"});
+ good<type>("x,,,", {"x"});
+
+ good<type>("x,y", {"x","y"});
+ good<type>("x ,y", {"x","y"});
+ good<type>("x\t,y", {"x","y"});
+ good<type>("x \t,y", {"x","y"});
+ good<type>(" x,y", {"x","y"});
+ good<type>(" x,y ", {"x","y"});
+ good<type>(",x,y", {"x","y"});
+ good<type>("x,y,", {"x","y"});
+ good<type>(",,x,y", {"x","y"});
+ good<type>(",x,,y", {"x","y"});
+ good<type>(",x,y,", {"x","y"});
+ good<type>("x ,, y", {"x","y"});
+ good<type>("x , ,y", {"x","y"});
+
+ good<type>("x,y,z", {"x","y","z"});
+
+ bad<type>("(");
+ bad<type>("x(");
+ bad<type>("(x");
+ bad<type>(",(");
+ bad<type>("(,");
+ bad<type>("x,(");
+ bad<type>("(,x");
+ bad<type>("x y");
+ }
+
+ void
+ run()
+ {
+ testOptTokenList();
+ testParamList();
+ testExtList();
+ testTokenList();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,rfc7230);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/serializer.cpp b/src/boost/libs/beast/test/beast/http/serializer.cpp
new file mode 100644
index 000000000..4b14d63fc
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/serializer.cpp
@@ -0,0 +1,130 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/serializer.hpp>
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class serializer_test : public beast::unit_test::suite
+{
+public:
+ struct const_body
+ {
+ struct value_type{};
+
+ struct writer
+ {
+ using const_buffers_type =
+ net::const_buffer;
+
+ template<bool isRequest, class Fields>
+ writer(header<isRequest, Fields> const&, value_type const&);
+
+ void
+ init(error_code& ec);
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(error_code&);
+ };
+ };
+
+ struct mutable_body
+ {
+ struct value_type{};
+
+ struct writer
+ {
+ using const_buffers_type =
+ net::const_buffer;
+
+ template<bool isRequest, class Fields>
+ writer(header<isRequest, Fields>&, value_type&);
+
+ void
+ init(error_code& ec);
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(error_code&);
+ };
+ };
+
+ BOOST_STATIC_ASSERT(std::is_const< serializer<
+ true, const_body>::value_type>::value);
+
+ BOOST_STATIC_ASSERT(! std::is_const<serializer<
+ true, mutable_body>::value_type>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<
+ serializer<true, const_body>,
+ message <true, const_body>&>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<
+ serializer<true, const_body>,
+ message <true, const_body> const&>::value);
+
+ BOOST_STATIC_ASSERT(std::is_constructible<
+ serializer<true, mutable_body>,
+ message <true, mutable_body>&>::value);
+
+ BOOST_STATIC_ASSERT(! std::is_constructible<
+ serializer<true, mutable_body>,
+ message <true, mutable_body> const&>::value);
+
+ struct lambda
+ {
+ std::size_t size;
+
+ template<class ConstBufferSequence>
+ void
+ operator()(error_code&,
+ ConstBufferSequence const& buffers)
+ {
+ size = buffer_bytes(buffers);
+ }
+ };
+
+ void
+ testWriteLimit()
+ {
+ auto const limit = 30;
+ lambda visit;
+ error_code ec;
+ response<string_body> res;
+ res.body().append(1000, '*');
+ serializer<false, string_body> sr{res};
+ sr.limit(limit);
+ for(;;)
+ {
+ sr.next(ec, visit);
+ BEAST_EXPECT(visit.size <= limit);
+ sr.consume(visit.size);
+ if(sr.is_done())
+ break;
+ }
+ }
+
+ void
+ run() override
+ {
+ testWriteLimit();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,serializer);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/span_body.cpp b/src/boost/libs/beast/test/beast/http/span_body.cpp
new file mode 100644
index 000000000..ab75857be
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/span_body.cpp
@@ -0,0 +1,81 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/span_body.hpp>
+
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/http/message.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+struct span_body_test
+ : public beast::unit_test::suite
+{
+ void
+ testSpanBody()
+ {
+ {
+ using B = span_body<char const>;
+ request<B> req;
+
+ BEAST_EXPECT(req.body().size() == 0);
+ BEAST_EXPECT(B::size(req.body()) == 0);
+
+ req.body() = B::value_type("xyz", 3);
+ BEAST_EXPECT(req.body().size() == 3);
+ BEAST_EXPECT(B::size(req.body()) == 3);
+
+ B::writer r{req, req.body()};
+ error_code ec;
+ r.init(ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ auto const buf = r.get(ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ if(! BEAST_EXPECT(buf != boost::none))
+ return;
+ BEAST_EXPECT(buffer_bytes(buf->first) == 3);
+ BEAST_EXPECT(! buf->second);
+ }
+ {
+ char buf[5] = {};
+ using B = span_body<char>;
+ request<B> req;
+ req.body() = span<char>{buf, sizeof(buf)};
+ B::reader w{req, req.body()};
+ error_code ec;
+ w.init(boost::none, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ w.put(net::const_buffer{
+ "123", 3}, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(buf[0] == '1');
+ BEAST_EXPECT(buf[1] == '2');
+ BEAST_EXPECT(buf[2] == '3');
+ w.put(net::const_buffer{
+ "456", 3}, ec);
+ BEAST_EXPECTS(ec == error::buffer_overflow, ec.message());
+ }
+ }
+
+ void
+ run() override
+ {
+ testSpanBody();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,span_body);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/status.cpp b/src/boost/libs/beast/test/beast/http/status.cpp
new file mode 100644
index 000000000..ea220736f
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/status.cpp
@@ -0,0 +1,180 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/status.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class status_test
+ : public beast::unit_test::suite
+{
+public:
+ void
+ testStatus()
+ {
+ auto const check = [&](status s, int i, status_class sc)
+ {
+ BEAST_EXPECT(int_to_status(i) == s);
+ BEAST_EXPECT(to_status_class(i) == sc);
+ BEAST_EXPECT(to_status_class(int_to_status(i)) == sc);
+ };
+ check(status::continue_ ,100, status_class::informational);
+ check(status::switching_protocols ,101, status_class::informational);
+ check(status::processing ,102, status_class::informational);
+
+ check(status::ok ,200, status_class::successful);
+ check(status::created ,201, status_class::successful);
+ check(status::accepted ,202, status_class::successful);
+ check(status::non_authoritative_information ,203, status_class::successful);
+ check(status::no_content ,204, status_class::successful);
+ check(status::reset_content ,205, status_class::successful);
+ check(status::partial_content ,206, status_class::successful);
+ check(status::multi_status ,207, status_class::successful);
+ check(status::already_reported ,208, status_class::successful);
+ check(status::im_used ,226, status_class::successful);
+
+ check(status::multiple_choices ,300, status_class::redirection);
+ check(status::moved_permanently ,301, status_class::redirection);
+ check(status::found ,302, status_class::redirection);
+ check(status::see_other ,303, status_class::redirection);
+ check(status::not_modified ,304, status_class::redirection);
+ check(status::use_proxy ,305, status_class::redirection);
+ check(status::temporary_redirect ,307, status_class::redirection);
+ check(status::permanent_redirect ,308, status_class::redirection);
+
+ check(status::bad_request ,400, status_class::client_error);
+ check(status::unauthorized ,401, status_class::client_error);
+ check(status::payment_required ,402, status_class::client_error);
+ check(status::forbidden ,403, status_class::client_error);
+ check(status::not_found ,404, status_class::client_error);
+ check(status::method_not_allowed ,405, status_class::client_error);
+ check(status::not_acceptable ,406, status_class::client_error);
+ check(status::proxy_authentication_required ,407, status_class::client_error);
+ check(status::request_timeout ,408, status_class::client_error);
+ check(status::conflict ,409, status_class::client_error);
+ check(status::gone ,410, status_class::client_error);
+ check(status::length_required ,411, status_class::client_error);
+ check(status::precondition_failed ,412, status_class::client_error);
+ check(status::payload_too_large ,413, status_class::client_error);
+ check(status::uri_too_long ,414, status_class::client_error);
+ check(status::unsupported_media_type ,415, status_class::client_error);
+ check(status::range_not_satisfiable ,416, status_class::client_error);
+ check(status::expectation_failed ,417, status_class::client_error);
+ check(status::misdirected_request ,421, status_class::client_error);
+ check(status::unprocessable_entity ,422, status_class::client_error);
+ check(status::locked ,423, status_class::client_error);
+ check(status::failed_dependency ,424, status_class::client_error);
+ check(status::upgrade_required ,426, status_class::client_error);
+ check(status::precondition_required ,428, status_class::client_error);
+ check(status::too_many_requests ,429, status_class::client_error);
+ check(status::request_header_fields_too_large ,431, status_class::client_error);
+ check(status::connection_closed_without_response ,444, status_class::client_error);
+ check(status::unavailable_for_legal_reasons ,451, status_class::client_error);
+ check(status::client_closed_request ,499, status_class::client_error);
+
+ check(status::internal_server_error ,500, status_class::server_error);
+ check(status::not_implemented ,501, status_class::server_error);
+ check(status::bad_gateway ,502, status_class::server_error);
+ check(status::service_unavailable ,503, status_class::server_error);
+ check(status::gateway_timeout ,504, status_class::server_error);
+ check(status::http_version_not_supported ,505, status_class::server_error);
+ check(status::variant_also_negotiates ,506, status_class::server_error);
+ check(status::insufficient_storage ,507, status_class::server_error);
+ check(status::loop_detected ,508, status_class::server_error);
+ check(status::not_extended ,510, status_class::server_error);
+ check(status::network_authentication_required ,511, status_class::server_error);
+ check(status::network_connect_timeout_error ,599, status_class::server_error);
+
+ BEAST_EXPECT(to_status_class(1) == status_class::unknown);
+ BEAST_EXPECT(to_status_class(status::unknown) == status_class::unknown);
+
+ auto const good =
+ [&](status v)
+ {
+ BEAST_EXPECT(obsolete_reason(v) != "Unknown Status");
+ };
+ good(status::continue_);
+ good(status::switching_protocols);
+ good(status::processing);
+ good(status::ok);
+ good(status::created);
+ good(status::accepted);
+ good(status::non_authoritative_information);
+ good(status::no_content);
+ good(status::reset_content);
+ good(status::partial_content);
+ good(status::multi_status);
+ good(status::already_reported);
+ good(status::im_used);
+ good(status::multiple_choices);
+ good(status::moved_permanently);
+ good(status::found);
+ good(status::see_other);
+ good(status::not_modified);
+ good(status::use_proxy);
+ good(status::temporary_redirect);
+ good(status::permanent_redirect);
+ good(status::bad_request);
+ good(status::unauthorized);
+ good(status::payment_required);
+ good(status::forbidden);
+ good(status::not_found);
+ good(status::method_not_allowed);
+ good(status::not_acceptable);
+ good(status::proxy_authentication_required);
+ good(status::request_timeout);
+ good(status::conflict);
+ good(status::gone);
+ good(status::length_required);
+ good(status::precondition_failed);
+ good(status::payload_too_large);
+ good(status::uri_too_long);
+ good(status::unsupported_media_type);
+ good(status::range_not_satisfiable);
+ good(status::expectation_failed);
+ good(status::misdirected_request);
+ good(status::unprocessable_entity);
+ good(status::locked);
+ good(status::failed_dependency);
+ good(status::upgrade_required);
+ good(status::precondition_required);
+ good(status::too_many_requests);
+ good(status::request_header_fields_too_large);
+ good(status::unavailable_for_legal_reasons);
+ good(status::internal_server_error);
+ good(status::not_implemented);
+ good(status::bad_gateway);
+ good(status::service_unavailable);
+ good(status::gateway_timeout);
+ good(status::http_version_not_supported);
+ good(status::variant_also_negotiates);
+ good(status::insufficient_storage);
+ good(status::loop_detected);
+ good(status::not_extended);
+ good(status::network_authentication_required);
+ }
+
+ void
+ run()
+ {
+ testStatus();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,status);
+
+} // http
+} // beast
+} // boost
+
diff --git a/src/boost/libs/beast/test/beast/http/string_body.cpp b/src/boost/libs/beast/test/beast/http/string_body.cpp
new file mode 100644
index 000000000..14f873b5f
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/string_body.cpp
@@ -0,0 +1,23 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/string_body.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+BOOST_STATIC_ASSERT(is_body<string_body>::value);
+BOOST_STATIC_ASSERT(is_body_writer<string_body>::value);
+BOOST_STATIC_ASSERT(is_body_reader<string_body>::value);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/test_parser.hpp b/src/boost/libs/beast/test/beast/http/test_parser.hpp
new file mode 100644
index 000000000..a12ad2b45
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/test_parser.hpp
@@ -0,0 +1,161 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_HTTP_TEST_PARSER_HPP
+#define BOOST_BEAST_HTTP_TEST_PARSER_HPP
+
+#include <boost/beast/http/basic_parser.hpp>
+#include <boost/beast/_experimental/test/fail_count.hpp>
+#include <string>
+#include <unordered_map>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+template<bool isRequest>
+class test_parser
+ : public basic_parser<isRequest>
+{
+ test::fail_count* fc_ = nullptr;
+
+public:
+ using mutable_buffers_type =
+ net::mutable_buffer;
+
+ int status = 0;
+ int version = 0;
+ std::string method;
+ std::string path;
+ std::string reason;
+ std::string body;
+ int got_on_begin = 0;
+ int got_on_field = 0;
+ int got_on_header = 0;
+ int got_on_body = 0;
+ int got_content_length = 0;
+ int got_on_chunk = 0;
+ int got_on_complete = 0;
+ std::unordered_map<
+ std::string, std::string> fields;
+
+ test_parser() = default;
+
+ explicit
+ test_parser(test::fail_count& fc)
+ : fc_(&fc)
+ {
+ }
+
+ void
+ on_request_impl(verb, string_view method_str_,
+ string_view path_, int version_, error_code& ec)
+ {
+ method = std::string(
+ method_str_.data(), method_str_.size());
+ path = std::string(
+ path_.data(), path_.size());
+ version = version_;
+ ++got_on_begin;
+ if(fc_)
+ fc_->fail(ec);
+ }
+
+ void
+ on_response_impl(int code,
+ string_view reason_,
+ int version_, error_code& ec)
+ {
+ status = code;
+ reason = std::string(
+ reason_.data(), reason_.size());
+ version = version_;
+ ++got_on_begin;
+ if(fc_)
+ fc_->fail(ec);
+ }
+
+ void
+ on_field_impl(field, string_view name,
+ string_view value, error_code& ec)
+ {
+ ++got_on_field;
+ if(fc_)
+ fc_->fail(ec);
+ fields[std::string(name)] = std::string(value);
+ }
+
+ void
+ on_header_impl(error_code& ec)
+ {
+ ++got_on_header;
+ if(fc_)
+ fc_->fail(ec);
+ }
+
+ void
+ on_body_init_impl(
+ boost::optional<std::uint64_t> const& content_length_,
+ error_code& ec)
+ {
+ ++got_on_body;
+ got_content_length =
+ static_cast<bool>(content_length_);
+ if(fc_)
+ fc_->fail(ec);
+ }
+
+ std::size_t
+ on_body_impl(string_view s,
+ error_code& ec)
+ {
+ body.append(s.data(), s.size());
+ if(fc_)
+ fc_->fail(ec);
+ return s.size();
+ }
+
+ void
+ on_chunk_header_impl(
+ std::uint64_t,
+ string_view,
+ error_code& ec)
+ {
+ ++got_on_chunk;
+ if(fc_)
+ fc_->fail(ec);
+ }
+
+ std::size_t
+ on_chunk_body_impl(
+ std::uint64_t,
+ string_view s,
+ error_code& ec)
+ {
+ body.append(s.data(), s.size());
+ if(fc_)
+ fc_->fail(ec);
+ return s.size();
+ }
+
+
+ void
+ on_finish_impl(error_code& ec)
+ {
+ ++got_on_complete;
+ if(fc_)
+ fc_->fail(ec);
+ }
+};
+
+} // http
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/http/type_traits.cpp b/src/boost/libs/beast/test/beast/http/type_traits.cpp
new file mode 100644
index 000000000..fef17fb69
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/type_traits.cpp
@@ -0,0 +1,156 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/type_traits.hpp>
+
+#include <boost/beast/http/empty_body.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_cat.hpp>
+#include <boost/beast/core/buffers_suffix.hpp>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+// Buffers
+
+BOOST_STATIC_ASSERT(net::is_const_buffer_sequence<chunk_crlf>::value);
+
+BOOST_STATIC_ASSERT(std::is_same<
+ buffers_type<chunk_crlf>,
+ net::const_buffer>::value);
+
+BOOST_STATIC_ASSERT(! std::is_same<
+ buffers_type<chunk_crlf>,
+ net::mutable_buffer>::value);
+
+BOOST_STATIC_ASSERT(std::is_convertible<
+ decltype(*net::buffer_sequence_begin(std::declval<chunk_crlf const&>())),
+ net::const_buffer
+ >::value);
+
+BOOST_STATIC_ASSERT(! std::is_convertible<
+ decltype(*net::buffer_sequence_begin(std::declval<chunk_crlf const&>())),
+ net::mutable_buffer
+ >::value);
+
+BOOST_STATIC_ASSERT(net::is_const_buffer_sequence<
+ buffers_cat_view<net::const_buffer, chunk_crlf>
+ >::value);
+
+BOOST_STATIC_ASSERT(std::is_same<
+ buffers_type<buffers_cat_view<net::const_buffer, chunk_crlf>>,
+ net::const_buffer>::value);
+
+BOOST_STATIC_ASSERT(! std::is_same<
+ buffers_type<buffers_cat_view<net::const_buffer, chunk_crlf>>,
+ net::mutable_buffer>::value);
+
+using bs_t = buffers_suffix<buffers_cat_view<net::const_buffer, chunk_crlf>>;
+
+BOOST_STATIC_ASSERT(std::is_same<
+ buffers_type<bs_t>,
+ net::const_buffer>::value);
+
+BOOST_STATIC_ASSERT(! std::is_same<
+ buffers_type<bs_t>,
+ net::mutable_buffer>::value);
+
+BOOST_STATIC_ASSERT(std::is_convertible<
+ decltype(*std::declval<bs_t const&>().begin()),
+ net::const_buffer>::value);
+
+BOOST_STATIC_ASSERT(! std::is_convertible<
+ decltype(*std::declval<bs_t const&>().begin()),
+ net::mutable_buffer>::value);
+
+BOOST_STATIC_ASSERT(std::is_same<
+ buffers_iterator_type<bs_t>,
+ decltype(std::declval<bs_t const&>().begin())>::value);
+
+using iter_t = bs_t::const_iterator;
+
+BOOST_STATIC_ASSERT(std::is_same<
+ net::const_buffer,
+ decltype(std::declval<iter_t const&>().operator*())
+ >::value);
+
+BOOST_STATIC_ASSERT(! std::is_same<
+ net::mutable_buffer,
+ decltype(std::declval<iter_t const&>().operator*())
+ >::value);
+
+BOOST_STATIC_ASSERT(std::is_constructible<
+ net::const_buffer,
+ decltype(std::declval<iter_t const&>().operator*())>::value);
+
+BOOST_STATIC_ASSERT(std::is_same<
+ net::const_buffer, buffers_suffix<
+ buffers_cat_view<net::const_buffer, net::const_buffer, chunk_crlf>
+ >::const_iterator::value_type>::value);
+
+BOOST_STATIC_ASSERT(std::is_same<
+ net::const_buffer, buffers_type<
+ std::decay<buffers_cat_view<net::const_buffer, net::const_buffer, chunk_crlf>>::type
+ >>::value);
+
+BOOST_STATIC_ASSERT(std::is_same<net::const_buffer, decltype(
+ std::declval<buffers_suffix<buffers_cat_view<
+ net::const_buffer, net::const_buffer, chunk_crlf>
+ >::const_iterator const&>().operator*())>::value);
+
+BOOST_STATIC_ASSERT(std::is_same<net::const_buffer, decltype(
+ std::declval<buffers_suffix<buffers_cat_view<
+ net::const_buffer, net::const_buffer, chunk_crlf>
+ >::const_iterator const&>().operator*())>::value);
+
+BOOST_STATIC_ASSERT(std::is_same<net::const_buffer, decltype(
+ std::declval<buffers_suffix<
+ buffers_cat_view<
+ beast::detail::buffers_ref<buffers_cat_view<
+ net::const_buffer,
+ net::const_buffer,
+ net::const_buffer,
+ http::basic_fields<
+ std::allocator<char>>::writer::field_range,
+ http::chunk_crlf> >,
+ http::detail::chunk_size,
+ net::const_buffer,
+ http::chunk_crlf,
+ http::basic_string_body<
+ char, std::char_traits<char>,
+ std::allocator<char>>::writer::const_buffers_type,
+ http::chunk_crlf,
+ net::const_buffer,
+ net::const_buffer,
+ http::chunk_crlf>>::const_iterator const&>(
+ ).operator*())>::value);
+
+// Body
+
+BOOST_STATIC_ASSERT(! is_body_writer<int>::value);
+
+BOOST_STATIC_ASSERT(is_body_writer<empty_body>::value);
+
+BOOST_STATIC_ASSERT(! is_body_reader<std::string>::value);
+
+namespace {
+
+struct not_fields {};
+
+} // (anonymous)
+
+BOOST_STATIC_ASSERT(! is_fields<not_fields>::value);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/vector_body.cpp b/src/boost/libs/beast/test/beast/http/vector_body.cpp
new file mode 100644
index 000000000..142d17e18
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/vector_body.cpp
@@ -0,0 +1,30 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/vector_body.hpp>
+#include <cstddef>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+BOOST_STATIC_ASSERT(is_body<vector_body<char>>::value);
+BOOST_STATIC_ASSERT(is_body_writer<vector_body<char>>::value);
+BOOST_STATIC_ASSERT(is_body_reader<vector_body<char>>::value);
+
+#if __cpp_lib_byte >= 201603
+BOOST_STATIC_ASSERT(is_body<vector_body<std::byte>>::value);
+BOOST_STATIC_ASSERT(is_body_writer<vector_body<std::byte>>::value);
+BOOST_STATIC_ASSERT(is_body_reader<vector_body<std::byte>>::value);
+#endif
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/verb.cpp b/src/boost/libs/beast/test/beast/http/verb.cpp
new file mode 100644
index 000000000..46ef531f0
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/verb.cpp
@@ -0,0 +1,131 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/verb.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class verb_test
+ : public beast::unit_test::suite
+{
+public:
+ void
+ testVerb()
+ {
+ auto const good =
+ [&](verb v)
+ {
+ BEAST_EXPECT(string_to_verb(to_string(v)) == v);
+ };
+
+ good(verb::unknown);
+
+ good(verb::delete_);
+ good(verb::get);
+ good(verb::head);
+ good(verb::post);
+ good(verb::put);
+ good(verb::connect);
+ good(verb::options);
+ good(verb::trace);
+ good(verb::copy);
+ good(verb::lock);
+ good(verb::mkcol);
+ good(verb::move);
+ good(verb::propfind);
+ good(verb::proppatch);
+ good(verb::search);
+ good(verb::unlock);
+ good(verb::bind);
+ good(verb::rebind);
+ good(verb::unbind);
+ good(verb::acl);
+ good(verb::report);
+ good(verb::mkactivity);
+ good(verb::checkout);
+ good(verb::merge);
+ good(verb::msearch);
+ good(verb::notify);
+ good(verb::subscribe);
+ good(verb::unsubscribe);
+ good(verb::patch);
+ good(verb::purge);
+ good(verb::mkcalendar);
+ good(verb::link);
+ good(verb::unlink);
+
+ auto const bad =
+ [&](string_view s)
+ {
+ auto const v = string_to_verb(s);
+ BEAST_EXPECTS(v == verb::unknown, to_string(v));
+ };
+
+ bad("AC_");
+ bad("BIN_");
+ bad("CHECKOU_");
+ bad("CONNEC_");
+ bad("COP_");
+ bad("DELET_");
+ bad("GE_");
+ bad("HEA_");
+ bad("LIN_");
+ bad("LOC_");
+ bad("M-SEARC_");
+ bad("MERG_");
+ bad("MKACTIVIT_");
+ bad("MKCALENDA_");
+ bad("MKCO_");
+ bad("MOV_");
+ bad("NOTIF_");
+ bad("OPTION_");
+ bad("PATC_");
+ bad("POS_");
+ bad("PROPFIN_");
+ bad("PROPPATC_");
+ bad("PURG_");
+ bad("PU_");
+ bad("REBIN_");
+ bad("REPOR_");
+ bad("SEARC_");
+ bad("SUBSCRIB_");
+ bad("TRAC_");
+ bad("UNBIN_");
+ bad("UNLIN_");
+ bad("UNLOC_");
+ bad("UNSUBSCRIB_");
+
+ try
+ {
+ to_string(static_cast<verb>(-1));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ }
+
+ void
+ run()
+ {
+ testVerb();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,verb);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/http/write.cpp b/src/boost/libs/beast/test/beast/http/write.cpp
new file mode 100644
index 000000000..f6cfadea2
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/http/write.cpp
@@ -0,0 +1,1027 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/http/write.hpp>
+
+#include <boost/beast/http/empty_body.hpp>
+#include <boost/beast/http/fields.hpp>
+#include <boost/beast/http/message.hpp>
+#include <boost/beast/http/read.hpp>
+#include <boost/beast/http/string_body.hpp>
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/error.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/test/yield_to.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/error.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/strand.hpp>
+#include <sstream>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class write_test
+ : public beast::unit_test::suite
+ , public test::enable_yield_to
+{
+public:
+ struct unsized_body
+ {
+ using value_type = std::string;
+
+ class writer
+ {
+ value_type const& body_;
+
+ public:
+ using const_buffers_type =
+ net::const_buffer;
+
+ template<bool isRequest, class Fields>
+ writer(
+ header<isRequest, Fields> const&,
+ value_type const& b)
+ : body_(b)
+ {
+ }
+
+ void
+ init(error_code& ec)
+ {
+ ec = {};
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(error_code& ec)
+ {
+ ec = {};
+ return {{const_buffers_type{
+ body_.data(), body_.size()}, false}};
+ }
+ };
+ };
+
+ template<
+ bool isSplit,
+ bool isFinalEmpty
+ >
+ struct test_body
+ {
+ struct value_type
+ {
+ std::string s;
+ bool mutable read = false;
+ };
+
+ class writer
+ {
+ int step_ = 0;
+ value_type const& body_;
+
+ public:
+ using const_buffers_type =
+ net::const_buffer;
+
+ template<bool isRequest, class Fields>
+ writer(
+ header<isRequest, Fields> const&,
+ value_type const& b)
+ : body_(b)
+ {
+ }
+
+ void
+ init(error_code& ec)
+ {
+ ec = {};
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(error_code& ec)
+ {
+ ec = {};
+ body_.read = true;
+ return get(
+ std::integral_constant<bool, isSplit>{},
+ std::integral_constant<bool, isFinalEmpty>{});
+ }
+
+ private:
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(
+ std::false_type, // isSplit
+ std::false_type) // isFinalEmpty
+ {
+ if(body_.s.empty())
+ return boost::none;
+ return {{net::buffer(
+ body_.s.data(), body_.s.size()), false}};
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(
+ std::false_type, // isSplit
+ std::true_type) // isFinalEmpty
+ {
+ if(body_.s.empty())
+ return boost::none;
+ switch(step_)
+ {
+ case 0:
+ step_ = 1;
+ return {{net::buffer(
+ body_.s.data(), body_.s.size()), true}};
+ default:
+ return boost::none;
+ }
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(
+ std::true_type, // isSplit
+ std::false_type) // isFinalEmpty
+ {
+ auto const n = (body_.s.size() + 1) / 2;
+ switch(step_)
+ {
+ case 0:
+ if(n == 0)
+ return boost::none;
+ step_ = 1;
+ return {{net::buffer(body_.s.data(), n),
+ body_.s.size() > 1}};
+ default:
+ return {{net::buffer(body_.s.data() + n,
+ body_.s.size() - n), false}};
+ }
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(
+ std::true_type, // isSplit
+ std::true_type) // isFinalEmpty
+ {
+ auto const n = (body_.s.size() + 1) / 2;
+ switch(step_)
+ {
+ case 0:
+ if(n == 0)
+ return boost::none;
+ step_ = body_.s.size() > 1 ? 1 : 2;
+ return {{net::buffer(body_.s.data(), n), true}};
+ case 1:
+ BOOST_ASSERT(body_.s.size() > 1);
+ step_ = 2;
+ return {{net::buffer(body_.s.data() + n,
+ body_.s.size() - n), true}};
+ default:
+ return boost::none;
+ }
+ }
+ };
+ };
+
+ struct fail_body
+ {
+ class writer;
+
+ class value_type
+ {
+ friend class writer;
+
+ std::string s_;
+ test::fail_count& fc_;
+
+ public:
+ explicit
+ value_type(test::fail_count& fc)
+ : fc_(fc)
+ {
+ }
+
+ value_type&
+ operator=(std::string s)
+ {
+ s_ = std::move(s);
+ return *this;
+ }
+ };
+
+ class writer
+ {
+ std::size_t n_ = 0;
+ value_type const& body_;
+
+ public:
+ using const_buffers_type =
+ net::const_buffer;
+
+ template<bool isRequest, class Fields>
+ explicit
+ writer(header<isRequest, Fields> const&, value_type const& b)
+ : body_(b)
+ {
+ }
+
+ void
+ init(error_code& ec)
+ {
+ body_.fc_.fail(ec);
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(error_code& ec)
+ {
+ if(body_.fc_.fail(ec))
+ return boost::none;
+ if(n_ >= body_.s_.size())
+ return boost::none;
+ return {{const_buffers_type{
+ body_.s_.data() + n_++, 1}, true}};
+ }
+ };
+ };
+
+ template<bool isRequest, class Body, class Fields>
+ static
+ std::string
+ to_string(message<isRequest, Body, Fields> const& m)
+ {
+ std::stringstream ss;
+ ss << m;
+ return ss.str();
+ }
+
+ template<bool isRequest>
+ bool
+ equal_body(string_view sv, string_view body)
+ {
+ test::stream ts{ioc_, sv}, tr{ioc_};
+ ts.connect(tr);
+ message<isRequest, string_body, fields> m;
+ multi_buffer b;
+ ts.close_remote();
+ try
+ {
+ read(ts, b, m);
+ return m.body() == body;
+ }
+ catch(std::exception const& e)
+ {
+ log << "equal_body: " << e.what() << std::endl;
+ return false;
+ }
+ }
+
+ template<bool isRequest, class Body, class Fields>
+ std::string
+ str(message<isRequest, Body, Fields> const& m)
+ {
+ test::stream ts{ioc_}, tr{ioc_};
+ ts.connect(tr);
+ error_code ec;
+ write(ts, m, ec);
+ if(ec && ec != error::end_of_stream)
+ BOOST_THROW_EXCEPTION(system_error{ec});
+ return std::string(tr.str());
+ }
+
+ void
+ testAsyncWrite(yield_context do_yield)
+ {
+ {
+ response<string_body> m;
+ m.version(10);
+ m.result(status::ok);
+ m.set(field::server, "test");
+ m.set(field::content_length, "5");
+ m.body() = "*****";
+ error_code ec;
+ test::stream ts{ioc_}, tr{ioc_};
+ ts.connect(tr);
+ async_write(ts, m, do_yield[ec]);
+ BEAST_EXPECT(! m.keep_alive());
+ if(BEAST_EXPECTS(! ec, ec.message()))
+ BEAST_EXPECT(tr.str() ==
+ "HTTP/1.0 200 OK\r\n"
+ "Server: test\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****");
+ }
+ {
+ response<string_body> m;
+ m.version(11);
+ m.result(status::ok);
+ m.set(field::server, "test");
+ m.set(field::transfer_encoding, "chunked");
+ m.body() = "*****";
+ error_code ec;
+ test::stream ts{ioc_}, tr{ioc_};
+ ts.connect(tr);
+ async_write(ts, m, do_yield[ec]);
+ if(BEAST_EXPECTS(! ec, ec.message()))
+ BEAST_EXPECT(tr.str() ==
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "5\r\n"
+ "*****\r\n"
+ "0\r\n\r\n");
+ }
+ }
+
+ void
+ testFailures(yield_context do_yield)
+ {
+ static std::size_t constexpr limit = 100;
+ std::size_t n;
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc}, tr{ioc_};
+ ts.connect(tr);
+ request<fail_body> m(verb::get, "/", 10, fc);
+ m.set(field::user_agent, "test");
+ m.set(field::connection, "keep-alive");
+ m.set(field::content_length, "5");
+ m.body() = "*****";
+ try
+ {
+ write(ts, m);
+ BEAST_EXPECT(tr.str() ==
+ "GET / HTTP/1.0\r\n"
+ "User-Agent: test\r\n"
+ "Connection: keep-alive\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****"
+ );
+ pass();
+ break;
+ }
+ catch(std::exception const&)
+ {
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc}, tr{ioc_};
+ ts.connect(tr);
+ request<fail_body> m{verb::get, "/", 10, fc};
+ m.set(field::user_agent, "test");
+ m.set(field::transfer_encoding, "chunked");
+ m.body() = "*****";
+ error_code ec = test::error::test_failure;
+ write(ts, m, ec);
+ if(! ec)
+ {
+ BEAST_EXPECT(! m.keep_alive());
+ BEAST_EXPECT(tr.str() ==
+ "GET / HTTP/1.0\r\n"
+ "User-Agent: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "0\r\n\r\n"
+ );
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc}, tr{ioc_};
+ ts.connect(tr);
+ request<fail_body> m{verb::get, "/", 10, fc};
+ m.set(field::user_agent, "test");
+ m.set(field::transfer_encoding, "chunked");
+ m.body() = "*****";
+ error_code ec = test::error::test_failure;
+ async_write(ts, m, do_yield[ec]);
+ if(! ec)
+ {
+ BEAST_EXPECT(! m.keep_alive());
+ BEAST_EXPECT(tr.str() ==
+ "GET / HTTP/1.0\r\n"
+ "User-Agent: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "1\r\n*\r\n"
+ "0\r\n\r\n"
+ );
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc}, tr{ioc_};
+ ts.connect(tr);
+ request<fail_body> m{verb::get, "/", 10, fc};
+ m.set(field::user_agent, "test");
+ m.set(field::connection, "keep-alive");
+ m.set(field::content_length, "5");
+ m.body() = "*****";
+ error_code ec = test::error::test_failure;
+ write(ts, m, ec);
+ if(! ec)
+ {
+ BEAST_EXPECT(tr.str() ==
+ "GET / HTTP/1.0\r\n"
+ "User-Agent: test\r\n"
+ "Connection: keep-alive\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****"
+ );
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc(n);
+ test::stream ts{ioc_, fc}, tr{ioc_};
+ ts.connect(tr);
+ request<fail_body> m{verb::get, "/", 10, fc};
+ m.set(field::user_agent, "test");
+ m.set(field::connection, "keep-alive");
+ m.set(field::content_length, "5");
+ m.body() = "*****";
+ error_code ec = test::error::test_failure;
+ async_write(ts, m, do_yield[ec]);
+ if(! ec)
+ {
+ BEAST_EXPECT(tr.str() ==
+ "GET / HTTP/1.0\r\n"
+ "User-Agent: test\r\n"
+ "Connection: keep-alive\r\n"
+ "Content-Length: 5\r\n"
+ "\r\n"
+ "*****"
+ );
+ break;
+ }
+ }
+ BEAST_EXPECT(n < limit);
+ }
+
+ void
+ testOutput()
+ {
+ // auto content-length HTTP/1.0
+ {
+ request<string_body> m;
+ m.method(verb::get);
+ m.target("/");
+ m.version(10);
+ m.set(field::user_agent, "test");
+ m.body() = "*";
+ m.prepare_payload();
+ BEAST_EXPECT(str(m) ==
+ "GET / HTTP/1.0\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n"
+ "*"
+ );
+ }
+ // no content-length HTTP/1.0
+ {
+ request<unsized_body> m;
+ m.method(verb::get);
+ m.target("/");
+ m.version(10);
+ m.set(field::user_agent, "test");
+ m.body() = "*";
+ m.prepare_payload();
+ test::stream ts{ioc_}, tr{ioc_};
+ ts.connect(tr);
+ error_code ec;
+ write(ts, m, ec);
+ BEAST_EXPECT(! m.keep_alive());
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(tr.str() ==
+ "GET / HTTP/1.0\r\n"
+ "User-Agent: test\r\n"
+ "\r\n"
+ "*"
+ );
+ }
+ // auto content-length HTTP/1.1
+ {
+ request<string_body> m;
+ m.method(verb::get);
+ m.target("/");
+ m.version(11);
+ m.set(field::user_agent, "test");
+ m.body() = "*";
+ m.prepare_payload();
+ BEAST_EXPECT(str(m) ==
+ "GET / HTTP/1.1\r\n"
+ "User-Agent: test\r\n"
+ "Content-Length: 1\r\n"
+ "\r\n"
+ "*"
+ );
+ }
+ // no content-length HTTP/1.1
+ {
+ request<unsized_body> m;
+ m.method(verb::get);
+ m.target("/");
+ m.version(11);
+ m.set(field::user_agent, "test");
+ m.body() = "*";
+ m.prepare_payload();
+ test::stream ts{ioc_}, tr{ioc_};
+ ts.connect(tr);
+ error_code ec;
+ write(ts, m, ec);
+ BEAST_EXPECT(tr.str() ==
+ "GET / HTTP/1.1\r\n"
+ "User-Agent: test\r\n"
+ "Transfer-Encoding: chunked\r\n"
+ "\r\n"
+ "1\r\n"
+ "*\r\n"
+ "0\r\n\r\n"
+ );
+ }
+ }
+
+ void test_std_ostream()
+ {
+ // Conversion to std::string via operator<<
+ {
+ request<string_body> m;
+ m.method(verb::get);
+ m.target("/");
+ m.version(11);
+ m.set(field::user_agent, "test");
+ m.body() = "*";
+ BEAST_EXPECT(to_string(m) ==
+ "GET / HTTP/1.1\r\nUser-Agent: test\r\n\r\n*");
+ }
+
+ // Output to std::ostream
+ {
+ request<string_body> m{verb::get, "/", 11};
+ std::stringstream ss;
+ ss << m;
+ BEAST_EXPECT(ss.str() ==
+ "GET / HTTP/1.1\r\n"
+ "\r\n");
+ }
+
+ // Output header to std::ostream
+ {
+ request<string_body> m{verb::get, "/", 11};
+ std::stringstream ss;
+ ss << m.base();
+ BEAST_EXPECT(ss.str() ==
+ "GET / HTTP/1.1\r\n"
+ "\r\n");
+ }
+ }
+
+ // Ensure completion handlers are not leaked
+ struct handler
+ {
+ static std::atomic<std::size_t>&
+ count() { static std::atomic<std::size_t> n; return n; }
+ handler() { ++count(); }
+ ~handler() { --count(); }
+ handler(handler const&) { ++count(); }
+ void operator()(error_code const&, std::size_t) const {}
+ };
+
+ void
+ testIoService()
+ {
+ {
+ // Make sure handlers are not destroyed
+ // after calling io_context::stop
+ net::io_context ioc;
+ test::stream ts{ioc};
+ BEAST_EXPECT(handler::count() == 0);
+ request<string_body> m;
+ m.method(verb::get);
+ m.version(11);
+ m.target("/");
+ m.set("Content-Length", 5);
+ m.body() = "*****";
+ async_write(ts, m, handler{});
+ BEAST_EXPECT(handler::count() > 0);
+ ioc.stop();
+ BEAST_EXPECT(handler::count() > 0);
+ ioc.restart();
+ BEAST_EXPECT(handler::count() > 0);
+ ioc.run_one();
+ BEAST_EXPECT(handler::count() == 0);
+ }
+ {
+ // Make sure uninvoked handlers are
+ // destroyed when calling ~io_context
+ {
+ net::io_context ioc;
+ test::stream ts{ioc}, tr{ioc};
+ ts.connect(tr);
+ BEAST_EXPECT(handler::count() == 0);
+ request<string_body> m;
+ m.method(verb::get);
+ m.version(11);
+ m.target("/");
+ m.set("Content-Length", 5);
+ m.body() = "*****";
+ async_write(ts, m, handler{});
+ BEAST_EXPECT(handler::count() > 0);
+ }
+ BEAST_EXPECT(handler::count() == 0);
+ }
+ }
+
+ template<
+ class Stream,
+ bool isRequest, class Body, class Fields>
+ void
+ do_write(
+ Stream& stream,
+ message<isRequest, Body, Fields> const& m,
+ error_code& ec)
+ {
+ serializer<isRequest, Body, Fields> sr{m};
+ for(;;)
+ {
+ write_some(stream, sr, ec);
+ if(ec)
+ return;
+ if(sr.is_done())
+ break;
+ }
+ }
+
+ template<
+ class Stream,
+ bool isRequest, class Body, class Fields>
+ void
+ do_async_write(
+ Stream& stream,
+ message<isRequest, Body, Fields> const& m,
+ error_code& ec,
+ yield_context yield)
+ {
+ serializer<isRequest, Body, Fields> sr{m};
+ for(;;)
+ {
+ async_write_some(stream, sr, yield[ec]);
+ if(ec)
+ return;
+ if(sr.is_done())
+ break;
+ }
+ }
+
+ template<class Body>
+ void
+ testWriteStream(net::yield_context yield)
+ {
+ test::stream ts{ioc_}, tr{ioc_};
+ ts.connect(tr);
+ ts.write_size(3);
+
+ response<Body> m0;
+ m0.version(11);
+ m0.result(status::ok);
+ m0.reason("OK");
+ m0.set(field::server, "test");
+ m0.body().s = "Hello, world!\n";
+
+ {
+ std::string const result =
+ "HTTP/1.1 200 OK\r\n"
+ "Server: test\r\n"
+ "\r\n"
+ "Hello, world!\n";
+ {
+ auto m = m0;
+ error_code ec;
+ do_write(ts, m, ec);
+ BEAST_EXPECT(tr.str() == result);
+ BEAST_EXPECT(equal_body<false>(
+ tr.str(), m.body().s));
+ tr.clear();
+ }
+ {
+ auto m = m0;
+ error_code ec;
+ do_async_write(ts, m, ec, yield);
+ BEAST_EXPECT(tr.str() == result);
+ BEAST_EXPECT(equal_body<false>(
+ tr.str(), m.body().s));
+ tr.clear();
+ }
+ {
+ auto m = m0;
+ response_serializer<Body, fields> sr{m};
+ sr.split(true);
+ for(;;)
+ {
+ write_some(ts, sr);
+ if(sr.is_header_done())
+ break;
+ }
+ BEAST_EXPECT(! m.body().read);
+ tr.clear();
+ }
+ {
+ auto m = m0;
+ response_serializer<Body, fields> sr{m};
+ sr.split(true);
+ for(;;)
+ {
+ async_write_some(ts, sr, yield);
+ if(sr.is_header_done())
+ break;
+ }
+ BEAST_EXPECT(! m.body().read);
+ tr.clear();
+ }
+ }
+ {
+ m0.set("Transfer-Encoding", "chunked");
+ {
+ auto m = m0;
+ error_code ec;
+ do_write(ts, m, ec);
+ BEAST_EXPECT(equal_body<false>(
+ tr.str(), m.body().s));
+ tr.clear();
+ }
+ {
+ auto m = m0;
+ error_code ec;
+ do_async_write(ts, m, ec, yield);
+ BEAST_EXPECT(equal_body<false>(
+ tr.str(), m.body().s));
+ tr.clear();
+ }
+ {
+ auto m = m0;
+ response_serializer<Body, fields> sr{m};
+ sr.split(true);
+ for(;;)
+ {
+ write_some(ts, sr);
+ if(sr.is_header_done())
+ break;
+ }
+ BEAST_EXPECT(! m.body().read);
+ tr.clear();
+ }
+ {
+ auto m = m0;
+ response_serializer<Body, fields> sr{m};
+ sr.split(true);
+ for(;;)
+ {
+ async_write_some(ts, sr, yield);
+ if(sr.is_header_done())
+ break;
+ }
+ BEAST_EXPECT(! m.body().read);
+ tr.clear();
+ }
+ }
+ }
+
+ void
+ testIssue655()
+ {
+ net::io_context ioc;
+ test::stream ts{ioc}, tr{ioc};
+ ts.connect(tr);
+ response<empty_body> res;
+ res.chunked(true);
+ response_serializer<empty_body> sr{res};
+ async_write_header(ts, sr,
+ [&](error_code const&, std::size_t)
+ {
+ });
+ ioc.run();
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void
+ testAsioHandlerInvoke()
+ {
+ using strand = net::strand<
+ net::io_context::executor_type>;
+
+ // make sure things compile, also can set a
+ // breakpoint in asio_handler_invoke to make sure
+ // it is instantiated.
+ {
+ net::io_context ioc;
+ strand s{ioc.get_executor()};
+ test::stream ts{ioc};
+ flat_buffer b;
+ request<empty_body> m;
+ request_serializer<empty_body, fields> sr{m};
+ async_write_some(ts, sr,
+ net::bind_executor(
+ s, copyable_handler{}));
+ }
+ {
+ net::io_context ioc;
+ strand s{ioc.get_executor()};
+ test::stream ts{ioc};
+ flat_buffer b;
+ request<empty_body> m;
+ request_serializer<empty_body, fields> sr{m};
+ async_write(ts, sr,
+ net::bind_executor(
+ s, copyable_handler{}));
+ }
+ {
+ net::io_context ioc;
+ strand s{ioc.get_executor()};
+ test::stream ts{ioc};
+ flat_buffer b;
+ request<empty_body> m;
+ async_write(ts, m,
+ net::bind_executor(
+ s, copyable_handler{}));
+ }
+ }
+
+ struct const_body_writer
+ {
+ struct value_type{};
+
+ struct writer
+ {
+ using const_buffers_type =
+ net::const_buffer;
+
+ template<bool isRequest, class Fields>
+ writer(
+ header<isRequest, Fields> const&,
+ value_type const&)
+ {
+ }
+
+ void
+ init(error_code& ec)
+ {
+ ec = {};
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(error_code& ec)
+ {
+ ec = {};
+ return {{const_buffers_type{"", 0}, false}};
+ }
+ };
+ };
+
+ struct mutable_body_writer
+ {
+ struct value_type{};
+
+ struct writer
+ {
+ using const_buffers_type =
+ net::const_buffer;
+
+ template<bool isRequest, class Fields>
+ writer(
+ header<isRequest, Fields>&,
+ value_type&)
+ {
+ }
+
+ void
+ init(error_code& ec)
+ {
+ ec = {};
+ }
+
+ boost::optional<std::pair<const_buffers_type, bool>>
+ get(error_code& ec)
+ {
+ ec = {};
+ return {{const_buffers_type{"", 0}, false}};
+ }
+ };
+ };
+
+ void
+ testBodyWriters()
+ {
+ {
+ test::stream s{ioc_};
+ message<true, const_body_writer> m;
+ try
+ {
+ write(s, m);
+ }
+ catch(std::exception const&)
+ {
+ }
+ }
+ {
+ error_code ec;
+ test::stream s{ioc_};
+ message<true, const_body_writer> m;
+ write(s, m, ec);
+ }
+ {
+ test::stream s{ioc_};
+ message<true, mutable_body_writer> m;
+ try
+ {
+ write(s, m);
+ }
+ catch(std::exception const&)
+ {
+ }
+ }
+ {
+ error_code ec;
+ test::stream s{ioc_};
+ message<true, mutable_body_writer> m;
+ write(s, m, ec);
+ }
+ }
+
+ void
+ run() override
+ {
+ testIssue655();
+ yield_to(
+ [&](yield_context yield)
+ {
+ testAsyncWrite(yield);
+ testFailures(yield);
+ });
+ testOutput();
+ test_std_ostream();
+ testIoService();
+ yield_to(
+ [&](yield_context yield)
+ {
+ testWriteStream<test_body<false, false>>(yield);
+ testWriteStream<test_body<false, true>>(yield);
+ testWriteStream<test_body< true, false>>(yield);
+ testWriteStream<test_body< true, true>>(yield);
+ });
+ testAsioHandlerInvoke();
+ testBodyWriters();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,http,write);
+
+} // http
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/ssl.cpp b/src/boost/libs/beast/test/beast/ssl.cpp
new file mode 100644
index 000000000..f0eec1593
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/ssl.cpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// If including Windows.h generates errors, it
+// means that min/max macros are being substituted.
+#ifdef _MSC_VER
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#endif
+
+// Test that header file is self-contained.
+#include <boost/beast/ssl.hpp>
diff --git a/src/boost/libs/beast/test/beast/ssl/CMakeLists.txt b/src/boost/libs/beast/test/beast/ssl/CMakeLists.txt
new file mode 100644
index 000000000..0a6c1a120
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/ssl/CMakeLists.txt
@@ -0,0 +1,26 @@
+#
+# Copyright (c) 2016-2019 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/beast/ssl "/")
+
+add_executable (tests-beast-ssl
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ ssl_stream.cpp
+)
+
+target_link_libraries(tests-beast-ssl
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET tests-beast-ssl PROPERTY FOLDER "tests")
diff --git a/src/boost/libs/beast/test/beast/ssl/Jamfile b/src/boost/libs/beast/test/beast/ssl/Jamfile
new file mode 100644
index 000000000..afb789e68
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/ssl/Jamfile
@@ -0,0 +1,40 @@
+#
+# Copyright (c) 2016-2019 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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+local SOURCES =
+ ssl_stream.cpp
+ ;
+
+local RUN_TESTS ;
+
+for local f in $(SOURCES)
+{
+ RUN_TESTS += [ run $(f)
+ /boost/beast//lib-asio-ssl
+ /boost/beast/test//lib-test
+ ] ;
+}
+
+alias run-tests : $(RUN_TESTS) ;
+
+exe fat-tests
+ :
+ $(SOURCES)
+ /boost/beast//lib-asio-ssl
+ /boost/beast/test//lib-test
+ ;
+
+explicit fat-tests ;
+
+run $(SOURCES)
+ /boost/beast//lib-asio-ssl
+ /boost/beast/test//lib-test
+ : : : : run-fat-tests ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/ssl/ssl_stream.cpp b/src/boost/libs/beast/test/beast/ssl/ssl_stream.cpp
new file mode 100644
index 000000000..da5717037
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/ssl/ssl_stream.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/ssl/ssl_stream.hpp>
diff --git a/src/boost/libs/beast/test/beast/version.cpp b/src/boost/libs/beast/test/beast/version.cpp
new file mode 100644
index 000000000..502126e56
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/version.cpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// If including Windows.h generates errors, it
+// means that min/max macros are being substituted.
+#ifdef _MSC_VER
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#endif
+
+// Test that header file is self-contained.
+#include <boost/beast/version.hpp>
diff --git a/src/boost/libs/beast/test/beast/websocket.cpp b/src/boost/libs/beast/test/beast/websocket.cpp
new file mode 100644
index 000000000..4dd358d55
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket.cpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// If including Windows.h generates errors, it
+// means that min/max macros are being substituted.
+#ifdef _MSC_VER
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#endif
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket.hpp>
diff --git a/src/boost/libs/beast/test/beast/websocket/CMakeLists.txt b/src/boost/libs/beast/test/beast/websocket/CMakeLists.txt
new file mode 100644
index 000000000..50036eeb8
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/CMakeLists.txt
@@ -0,0 +1,52 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/extras/include/boost/beast extras)
+GroupSources (test/beast/websocket "/")
+
+add_executable (tests-beast-websocket
+ ${BOOST_BEAST_FILES}
+ ${EXTRAS_FILES}
+ Jamfile
+ _detail_decorator.cpp
+ _detail_prng.cpp
+ _detail_impl_base.cpp
+ test.hpp
+ _detail_prng.cpp
+ accept.cpp
+ close.cpp
+ error.cpp
+ frame.cpp
+ handshake.cpp
+ option.cpp
+ ping.cpp
+ read1.cpp
+ read2.cpp
+ read3.cpp
+ rfc6455.cpp
+ ssl.cpp
+ stream.cpp
+ stream_base.cpp
+ stream_explicit.cpp
+ stream_fwd.cpp
+ teardown.cpp
+ timer.cpp
+ utf8_checker.cpp
+ write.cpp
+)
+
+target_link_libraries(tests-beast-websocket
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET tests-beast-websocket PROPERTY FOLDER "tests")
diff --git a/src/boost/libs/beast/test/beast/websocket/Jamfile b/src/boost/libs/beast/test/beast/websocket/Jamfile
new file mode 100644
index 000000000..1469d8611
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/Jamfile
@@ -0,0 +1,62 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+local SOURCES =
+ _detail_decorator.cpp
+ _detail_impl_base.cpp
+ _detail_prng.cpp
+ accept.cpp
+ close.cpp
+ error.cpp
+ frame.cpp
+ handshake.cpp
+ option.cpp
+ ping.cpp
+ read1.cpp
+ read2.cpp
+ read3.cpp
+ rfc6455.cpp
+ ssl.cpp
+ stream.cpp
+ stream_base.cpp
+ stream_explicit.cpp
+ stream_fwd.cpp
+ teardown.cpp
+ timer.cpp
+ utf8_checker.cpp
+ write.cpp
+ ;
+
+local RUN_TESTS ;
+
+for local f in $(SOURCES)
+{
+ RUN_TESTS += [ run $(f)
+ /boost/beast//lib-asio-ssl
+ /boost/beast/test//lib-test
+ ] ;
+}
+
+alias run-tests : $(RUN_TESTS) ;
+
+exe fat-tests
+ :
+ $(SOURCES)
+ /boost/beast//lib-asio-ssl
+ /boost/beast/test//lib-test
+ ;
+
+explicit fat-tests ;
+
+run $(SOURCES)
+ /boost/beast//lib-asio-ssl
+ /boost/beast/test//lib-test
+ : : : : run-fat-tests ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/websocket/_detail_decorator.cpp b/src/boost/libs/beast/test/beast/websocket/_detail_decorator.cpp
new file mode 100644
index 000000000..fe51f6f03
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/_detail_decorator.cpp
@@ -0,0 +1,152 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/detail/decorator.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+namespace detail {
+
+class decorator_test : public unit_test::suite
+{
+public:
+ struct req_t
+ {
+ bool pass_ = false;
+
+ req_t() = default;
+
+ ~req_t()
+ {
+ BEAST_EXPECT(pass_);
+ }
+
+ req_t(req_t&& other) noexcept
+ : pass_(boost::exchange(other.pass_, true))
+ {
+ }
+
+ void
+ operator()(request_type&)
+ {
+ BEAST_EXPECT(! pass_);
+ pass_ = true;
+ }
+ };
+
+ struct res_t
+ {
+ bool pass_ = false;
+
+ res_t() = default;
+
+ ~res_t()
+ {
+ BEAST_EXPECT(pass_);
+ }
+
+ res_t(res_t&& other) noexcept
+ : pass_(boost::exchange(other.pass_, true))
+ {
+ }
+
+ void
+ operator()(response_type&)
+ {
+ BEAST_EXPECT(! pass_);
+ pass_ = true;
+ }
+ };
+
+ struct both_t : res_t , req_t
+ {
+ using req_t::operator();
+ using res_t::operator();
+ };
+
+ struct big_t : both_t
+ {
+ using both_t::operator();
+ char buf[2048];
+ };
+
+ struct goldi // just right
+ {
+ struct incomplete;
+ std::shared_ptr<incomplete> sp1;
+ std::shared_ptr<incomplete> sp2;
+ void* param;
+
+ void operator()(request_type &) const
+ {
+ }
+ };
+
+ void
+ dec_req(request_type&)
+ {
+ }
+
+ void
+ testDecorator()
+ {
+ request_type req;
+ response_type res;
+
+ decorator{}(req);
+ decorator{}(res);
+ decorator{req_t{}}(req);
+ decorator{res_t{}}(res);
+
+ {
+ decorator d(both_t{});
+ d(req);
+ d(res);
+ }
+
+ {
+ decorator d(big_t{});
+ d(req);
+ d(res);
+ }
+
+ {
+ decorator d1{req_t{}};
+ decorator d2{std::move(d1)};
+ d2(req);
+ decorator d3;
+ d3 = std::move(d2);
+ }
+
+ {
+ decorator d{goldi{}};
+ bool is_inline = d.vtable_ ==
+ decorator::vtable_impl<goldi, true>::get();
+ BEAST_EXPECT(is_inline);
+ }
+ }
+
+ void
+ run() override
+ {
+ log << "sizeof(decorator)==" << sizeof(decorator) << "\n";
+ testDecorator();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,decorator);
+
+} // detail
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/_detail_impl_base.cpp b/src/boost/libs/beast/test/beast/websocket/_detail_impl_base.cpp
new file mode 100644
index 000000000..026a61b9f
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/_detail_impl_base.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/detail/impl_base.hpp>
diff --git a/src/boost/libs/beast/test/beast/websocket/_detail_prng.cpp b/src/boost/libs/beast/test/beast/websocket/_detail_prng.cpp
new file mode 100644
index 000000000..882940e07
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/_detail_prng.cpp
@@ -0,0 +1,76 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/detail/prng.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+namespace detail {
+
+#ifdef BOOST_BEAST_TEST_STATIC_PRNG_SEED
+auto prng_init = []()
+{
+ // Workaround for https://bugs.launchpad.net/ubuntu/+source/valgrind/+bug/1501545
+ std::seed_seq seq{{0xDEAD, 0xBEEF}};
+ detail::prng_seed(&seq);
+ return 0;
+}();
+#endif // BOOST_BEAST_TEST_STATIC_PRNG_SEED
+
+class prng_test
+ : public beast::unit_test::suite
+{
+public:
+#if 0
+ char const* name() const noexcept //override
+ {
+ return "boost.beast.websocket.detail.prng";
+ }
+#endif
+
+ template <class F>
+ void
+ testPrng(F const& f)
+ {
+ auto const min = std::numeric_limits<std::uint32_t>::min();
+ auto const max = std::numeric_limits<std::uint32_t>::max();
+
+ {
+ auto v = f()();
+ BEAST_EXPECT(
+ v >= min &&
+ v <= max);
+ }
+ {
+ auto v = f()();
+ BEAST_EXPECT(
+ v >= min &&
+ v <= max);
+ }
+ }
+
+ void
+ run() override
+ {
+ testPrng([]{ return make_prng(true); });
+ testPrng([]{ return make_prng(false); });
+ }
+};
+
+//static prng_test t;
+BEAST_DEFINE_TESTSUITE(beast,websocket,prng);
+
+} // detail
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/accept.cpp b/src/boost/libs/beast/test/beast/websocket/accept.cpp
new file mode 100644
index 000000000..9c1e58bf1
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/accept.cpp
@@ -0,0 +1,830 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/test/tcp.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include "test.hpp"
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class accept_test : public unit_test::suite //: public websocket_test_suite
+{
+public:
+ class res_decorator
+ {
+ bool& b_;
+
+ public:
+ res_decorator(res_decorator const&) = default;
+
+ explicit
+ res_decorator(bool& b)
+ : b_(b)
+ {
+ }
+
+ void
+ operator()(response_type&) const
+ {
+ this->b_ = true;
+ }
+ };
+
+ template<std::size_t N>
+ static
+ net::const_buffer
+ sbuf(const char (&s)[N])
+ {
+ return net::const_buffer(&s[0], N-1);
+ }
+
+ static
+ void
+ fail_loop(
+ std::function<void(stream<test::stream>&)> f,
+ std::chrono::steady_clock::duration amount =
+ std::chrono::seconds(5))
+ {
+ using clock_type = std::chrono::steady_clock;
+ auto const expires_at =
+ clock_type::now() + amount;
+ net::io_context ioc;
+ for(std::size_t n = 0;;++n)
+ {
+ test::fail_count fc(n);
+ try
+ {
+ stream<test::stream> ws(ioc, fc);
+ auto tr = connect(ws.next_layer());
+ f(ws);
+ break;
+ }
+ catch(system_error const& se)
+ {
+ // VFALCO Commented this out after the short
+ // read change, because it converts test_failure
+ // into http::partial_message
+ //
+ boost::ignore_unused(se);
+ #if 0
+ if(! BEAST_EXPECTS(
+ se.code() == test::error::test_failure,
+ se.code().message()))
+ throw;
+ #endif
+ if(! BEAST_EXPECTS(
+ clock_type::now() < expires_at,
+ "a test timeout occurred"))
+ break;
+ }
+ }
+ }
+
+ template<class Api>
+ void
+ testMatrix(Api api)
+ {
+ net::io_context ioc;
+
+ // request in stream
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ ws.next_layer().append(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n");
+ ws.next_layer().read_size(20);
+ api.accept(ws);
+ });
+
+ // request in stream, decorator
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ ws.next_layer().append(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n");
+ ws.next_layer().read_size(20);
+ bool called = false;
+ ws.set_option(stream_base::decorator(
+ res_decorator{called}));
+ api.accept(ws);
+ BEAST_EXPECT(called);
+ });
+
+ // request in buffers
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ api.accept(ws, sbuf(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ ));
+ });
+
+ // request in buffers, decorator
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ bool called = false;
+ ws.set_option(stream_base::decorator(
+ res_decorator{called}));
+ api.accept(ws, sbuf(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"));
+ BEAST_EXPECT(called);
+ });
+
+ // request in buffers and stream
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ ws.next_layer().append(
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n");
+ ws.next_layer().read_size(16);
+ api.accept(ws, sbuf(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ ));
+ // VFALCO validate contents of ws.next_layer().str?
+ });
+
+ // request in buffers and stream, decorator
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ ws.next_layer().append(
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n");
+ ws.next_layer().read_size(16);
+ bool called = false;
+ ws.set_option(stream_base::decorator(
+ res_decorator{called}));
+ api.accept(ws, sbuf(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"));
+ BEAST_EXPECT(called);
+ });
+
+ // request in message
+ {
+ request_type req;
+ req.method(http::verb::get);
+ req.target("/");
+ req.version(11);
+ req.insert(http::field::host, "localhost");
+ req.insert(http::field::upgrade, "websocket");
+ req.insert(http::field::connection, "upgrade");
+ req.insert(http::field::sec_websocket_key, "dGhlIHNhbXBsZSBub25jZQ==");
+ req.insert(http::field::sec_websocket_version, "13");
+
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ api.accept(ws, req);
+ });
+ }
+
+ // request in message, decorator
+ {
+ request_type req;
+ req.method(http::verb::get);
+ req.target("/");
+ req.version(11);
+ req.insert(http::field::host, "localhost");
+ req.insert(http::field::upgrade, "websocket");
+ req.insert(http::field::connection, "upgrade");
+ req.insert(http::field::sec_websocket_key, "dGhlIHNhbXBsZSBub25jZQ==");
+ req.insert(http::field::sec_websocket_version, "13");
+
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ bool called = false;
+ ws.set_option(stream_base::decorator(
+ res_decorator{called}));
+ api.accept(ws, req);
+ BEAST_EXPECT(called);
+ });
+ }
+
+ // request in message, close frame in stream
+ {
+ request_type req;
+ req.method(http::verb::get);
+ req.target("/");
+ req.version(11);
+ req.insert(http::field::host, "localhost");
+ req.insert(http::field::upgrade, "websocket");
+ req.insert(http::field::connection, "upgrade");
+ req.insert(http::field::sec_websocket_key, "dGhlIHNhbXBsZSBub25jZQ==");
+ req.insert(http::field::sec_websocket_version, "13");
+
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ ws.next_layer().append("\x88\x82\xff\xff\xff\xff\xfc\x17");
+ api.accept(ws, req);
+ try
+ {
+ static_buffer<1> b;
+ api.read(ws, b);
+ fail("success", __FILE__, __LINE__);
+ }
+ catch(system_error const& e)
+ {
+ if(e.code() != websocket::error::closed)
+ throw;
+ }
+ });
+ }
+
+ // failed handshake (missing Sec-WebSocket-Key)
+ fail_loop([&](stream<test::stream>& ws)
+ {
+ ws.next_layer().append(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n");
+ ws.next_layer().read_size(20);
+ try
+ {
+ api.accept(ws);
+ BEAST_FAIL();
+ }
+ catch(system_error const& e)
+ {
+ if( e.code() != websocket::error::no_sec_key &&
+ e.code() != net::error::eof)
+ throw;
+ }
+ });
+ }
+
+ template<class Api>
+ void
+ testOversized(Api const& api)
+ {
+ net::io_context ioc;
+
+ auto const big = []
+ {
+ std::string s;
+ s += "X1: " + std::string(2000, '*') + "\r\n";
+ return s;
+ }();
+
+ // request in stream
+ {
+ stream<test::stream> ws{ioc,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ + big +
+ "\r\n"};
+ auto tr = connect(ws.next_layer());
+ try
+ {
+ api.accept(ws);
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ // VFALCO Its the http error category...
+ BEAST_EXPECTS(
+ se.code() == http::error::buffer_overflow,
+ se.code().message());
+ }
+ }
+
+ // request in stream, decorator
+ {
+ stream<test::stream> ws{ioc,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ + big +
+ "\r\n"};
+ auto tr = connect(ws.next_layer());
+ try
+ {
+ bool called = false;
+ ws.set_option(stream_base::decorator(
+ res_decorator{called}));
+ api.accept(ws);
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ // VFALCO Its the http error category...
+ BEAST_EXPECTS(
+ se.code() == http::error::buffer_overflow,
+ se.code().message());
+ }
+ }
+
+ // request in buffers
+ {
+ stream<test::stream> ws{ioc};
+ auto tr = connect(ws.next_layer());
+ try
+ {
+ api.accept(ws, net::buffer(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ + big +
+ "\r\n"
+ ));
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == error::buffer_overflow,
+ se.code().message());
+ }
+ }
+
+ // request in buffers, decorator
+ {
+ stream<test::stream> ws{ioc};
+ auto tr = connect(ws.next_layer());
+ try
+ {
+ bool called = false;
+ ws.set_option(stream_base::decorator(
+ res_decorator{called}));
+ api.accept(ws, net::buffer(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ + big +
+ "\r\n"));
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == error::buffer_overflow,
+ se.code().message());
+ }
+ }
+
+ // request in buffers and stream
+ {
+ stream<test::stream> ws{ioc,
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ + big +
+ "\r\n"};
+ auto tr = connect(ws.next_layer());
+ try
+ {
+ api.accept(ws, websocket_test_suite::sbuf(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ ));
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == http::error::buffer_overflow,
+ se.code().message());
+ }
+ }
+
+ // request in buffers and stream, decorator
+ {
+ stream<test::stream> ws{ioc,
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ + big +
+ "\r\n"};
+ auto tr = connect(ws.next_layer());
+ try
+ {
+ bool called = false;
+ ws.set_option(stream_base::decorator(
+ res_decorator{called}));
+ api.accept(ws, websocket_test_suite::sbuf(
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"));
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == http::error::buffer_overflow,
+ se.code().message());
+ }
+ }
+ }
+
+ void
+ testInvalidInputs()
+ {
+ net::io_context ioc;
+
+ auto const check =
+ [&](error_code ev, string_view s)
+ {
+ for(int i = 0; i < 3; ++i)
+ {
+ std::size_t n;
+ switch(i)
+ {
+ default:
+ case 0:
+ n = 1;
+ break;
+ case 1:
+ n = s.size() / 2;
+ break;
+ case 2:
+ n = s.size() - 1;
+ break;
+ }
+ stream<test::stream> ws(ioc);
+ auto tr = connect(ws.next_layer());
+ ws.next_layer().append(
+ s.substr(n, s.size() - n));
+ tr.close();
+ try
+ {
+ ws.accept(net::buffer(s.data(), n));
+ BEAST_EXPECTS(! ev, ev.message());
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(se.code() == ev, se.what());
+ }
+ }
+ };
+
+ // bad version
+ check(error::bad_http_version,
+ "GET / HTTP/1.0\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive,upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // bad method
+ check(error::bad_method,
+ "POST / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive,upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // no Host
+ check(error::no_host,
+ "GET / HTTP/1.1\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive,upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // no Connection
+ check(error::no_connection,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // no Connection upgrade
+ check(error::no_connection_upgrade,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // no Upgrade
+ check(error::no_upgrade,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // no Upgrade websocket
+ check(error::no_upgrade_websocket,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: HTTP/2\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // no Sec-WebSocket-Key
+ check(error::no_sec_key,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive,upgrade\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // bad Sec-WebSocket-Key
+ check(error::bad_sec_key,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQdGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+
+ // no Sec-WebSocket-Version
+ check(error::no_sec_version,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive,upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "\r\n"
+ );
+
+ // bad Sec-WebSocket-Version
+ check(error::bad_sec_version,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive,upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 1\r\n"
+ "\r\n"
+ );
+
+ // bad Sec-WebSocket-Version
+ check(error::bad_sec_version,
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 12\r\n"
+ "\r\n"
+ );
+
+ // valid request
+ check({},
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost:80\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ }
+
+ void
+ testEndOfStream()
+ {
+ net::io_context ioc;
+ {
+ stream<test::stream> ws(ioc);
+ auto tr = connect(ws.next_layer());
+ tr.close();
+ try
+ {
+ test_sync_api api;
+ api.accept(ws, net::const_buffer{});
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == error::closed,
+ se.code().message());
+ }
+ }
+ {
+ stream<test::stream> ws(ioc);
+ auto tr = connect(ws.next_layer());
+ tr.close();
+ try
+ {
+ test_async_api api;
+ api.accept(ws, net::const_buffer{});
+ BEAST_FAIL();
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == error::closed,
+ se.code().message());
+ }
+ }
+ }
+
+ void
+ testAsync()
+ {
+ using tcp = net::ip::tcp;
+
+ net::io_context ioc;
+
+ // success, no timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ // success, timeout enabled
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_accept(test::success_handler());
+ ws2.async_handshake("test", "/", test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_accept(test::success_handler());
+ ws2.async_handshake("test", "/", test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ // timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_accept(test::fail_handler(beast::error::timeout));
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_accept(test::fail_handler(beast::error::timeout));
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ // abandoned operation
+
+ {
+ {
+ stream<tcp::socket> ws1(ioc);
+ ws1.async_accept(test::fail_handler(
+ net::error::operation_aborted));
+ }
+ test::run(ioc);
+ }
+
+ {
+ {
+ stream<tcp::socket> ws1(ioc);
+ string_view s =
+ "GET / HTTP/1.1\r\n"
+ "Host: localhost\r\n"
+ "Upgrade: websocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZQ==\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n";
+ error_code ec;
+ http::request_parser<http::empty_body> p;
+ p.put(net::const_buffer(s.data(), s.size()), ec);
+ ws1.async_accept(p.get(), test::fail_handler(
+ net::error::operation_aborted));
+ }
+ test::run(ioc);
+ }
+ }
+
+ void
+ run() override
+ {
+ testMatrix(test_sync_api{});
+ testMatrix(test_async_api{});
+ testOversized(test_sync_api{});
+ testOversized(test_async_api{});
+ testInvalidInputs();
+ testEndOfStream();
+ testAsync();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,accept);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/close.cpp b/src/boost/libs/beast/test/beast/websocket/close.cpp
new file mode 100644
index 000000000..1b891b339
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/close.cpp
@@ -0,0 +1,752 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/test/tcp.hpp>
+#include "test.hpp"
+
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/strand.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class close_test : public websocket_test_suite
+{
+public:
+ template<class Wrap>
+ void
+ doTestClose(Wrap const& w)
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = false;
+ pmd.server_enable = false;
+
+ // close
+ doTest(pmd, [&](ws_type& ws)
+ {
+ w.close(ws, {});
+ });
+
+ // close with code
+ doTest(pmd, [&](ws_type& ws)
+ {
+ w.close(ws, close_code::going_away);
+ });
+
+ // close with code and reason
+ doTest(pmd, [&](ws_type& ws)
+ {
+ w.close(ws, {
+ close_code::going_away,
+ "going away"});
+ });
+
+ // already closed
+ {
+ echo_server es{log};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ w.handshake(ws, "localhost", "/");
+ w.close(ws, {});
+ try
+ {
+ w.close(ws, {});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == net::error::operation_aborted,
+ se.code().message());
+ }
+ }
+
+ // drain a message after close
+ doTest(pmd, [&](ws_type& ws)
+ {
+ ws.next_layer().append("\x81\x01\x2a");
+ w.close(ws, {});
+ });
+
+ // drain a big message after close
+ {
+ std::string s;
+ s = "\x81\x7e\x10\x01";
+ s.append(4097, '*');
+ doTest(pmd, [&](ws_type& ws)
+ {
+ ws.next_layer().append(s);
+ w.close(ws, {});
+ });
+ }
+
+ // drain a ping after close
+ doTest(pmd, [&](ws_type& ws)
+ {
+ ws.next_layer().append("\x89\x01*");
+ w.close(ws, {});
+ });
+
+ // drain invalid message frame after close
+ {
+ echo_server es{log};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ w.handshake(ws, "localhost", "/");
+ ws.next_layer().append("\x81\x81\xff\xff\xff\xff*");
+ try
+ {
+ w.close(ws, {});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == error::bad_masked_frame,
+ se.code().message());
+ }
+ }
+
+ // drain invalid close frame after close
+ {
+ echo_server es{log};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ w.handshake(ws, "localhost", "/");
+ ws.next_layer().append("\x88\x01*");
+ try
+ {
+ w.close(ws, {});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == error::bad_close_size,
+ se.code().message());
+ }
+ }
+
+ // drain masked close frame
+ {
+ echo_server es{log, kind::async_client};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ ws.set_option(pmd);
+ es.async_handshake();
+ ws.accept();
+ w.close(ws, {});
+ }
+
+ // close with incomplete read message
+ doTest(pmd, [&](ws_type& ws)
+ {
+ ws.next_layer().append("\x81\x02**");
+ static_buffer<1> b;
+ w.read_some(ws, 1, b);
+ w.close(ws, {});
+ });
+ }
+
+ void
+ testClose()
+ {
+ doTestClose(SyncClient{});
+
+ yield_to([&](yield_context yield)
+ {
+ doTestClose(AsyncClient{yield});
+ });
+ }
+
+ void
+ testTimeout()
+ {
+ using tcp = net::ip::tcp;
+
+ net::io_context ioc;
+
+ // success
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ ws1.async_close({}, test::success_handler());
+ ws2.async_close({}, test::success_handler());
+ test::run(ioc);
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ ws1.async_close({}, test::success_handler());
+ ws2.async_close({}, test::success_handler());
+ test::run(ioc);
+ }
+
+ // success, timeout enabled
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_close({}, test::success_handler());
+ ws2.async_close({}, test::success_handler());
+ test::run(ioc);
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_close({}, test::success_handler());
+ ws2.async_close({}, test::success_handler());
+ test::run(ioc);
+ }
+
+ // timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_close({}, test::fail_handler(
+ beast::error::timeout));
+ test::run(ioc);
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_close({}, test::fail_handler(
+ beast::error::timeout));
+ test::run(ioc);
+ }
+ }
+
+ void
+ testSuspend()
+ {
+ // suspend on ping
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ BEAST_EXPECT(count == 0);
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on write
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_write(sbuf("*"),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 1);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ BEAST_EXPECT(count == 0);
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read ping + message
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ multi_buffer b;
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add a ping and message to the input
+ ws.next_layer().append(string_view{
+ "\x89\x00" "\x81\x01*", 5});
+ std::size_t count = 0;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read bad message
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ multi_buffer b;
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add an invalid frame to the input
+ ws.next_layer().append(string_view{
+ "\x09\x00", 2});
+ std::size_t count = 0;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != error::bad_control_fragment)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 1);
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read close #1
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ multi_buffer b;
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add a close frame to the input
+ ws.next_layer().append(string_view{
+ "\x88\x00", 2});
+ std::size_t count = 0;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != error::closed)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 1);
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // teardown on received close
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ std::string const s = "Hello, world!";
+ multi_buffer b;
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add a close frame to the input
+ ws.next_layer().append(string_view{
+ "\x88\x00", 2});
+ std::size_t count = 0;
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == s.size());
+ BEAST_EXPECT(++count == 1);
+ });
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 3);
+ });
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 3);
+ });
+
+ // check for deadlock
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ multi_buffer b;
+ std::string const s = "Hello, world!";
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add a ping frame to the input
+ ws.next_layer().append(string_view{
+ "\x89\x00", 2});
+ std::size_t count = 0;
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == s.size());
+ BEAST_EXPECT(++count == 1);
+ });
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 3);
+ });
+ BEAST_EXPECT(ws.impl_->rd_block.is_locked());
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BEAST_EXPECT(ws.is_open());
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 3);
+ });
+
+ // Four-way: close, read, write, ping
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ std::string const s = "Hello, world!";
+ multi_buffer b;
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 1);
+ });
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ ++count;
+ });
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ ++count;
+ });
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ ++count;
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 4);
+ });
+
+ // Four-way: read, write, ping, close
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ multi_buffer b;
+ std::string const s = "Hello, world!";
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec && ec != net::error::operation_aborted)
+ {
+ BEAST_EXPECTS(ec, ec.message());
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ }
+ if(! ec)
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ ++count;
+ if(count == 4)
+ BEAST_EXPECT(
+ ec == net::error::operation_aborted);
+ });
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == s.size());
+ BEAST_EXPECT(++count == 1);
+ });
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ if(ec != net::error::operation_aborted)
+ {
+ BEAST_EXPECTS(ec, ec.message());
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ }
+ ++count;
+ });
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ ++count;
+ BEAST_EXPECT(count == 2 || count == 3);
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 4);
+ });
+
+ // Four-way: ping, read, write, close
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ multi_buffer b;
+ std::string const s = "Hello, world!";
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 1);
+ });
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ ++count;
+ });
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ ++count;
+ });
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 4);
+ });
+ }
+
+ void
+ testMoveOnly()
+ {
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.async_close({}, move_only_handler{});
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void
+ run() override
+ {
+ testClose();
+ testTimeout();
+ testSuspend();
+ testMoveOnly();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,close);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/doc_snippets.cpp b/src/boost/libs/beast/test/beast/websocket/doc_snippets.cpp
new file mode 100644
index 000000000..4e8ae0eaf
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/doc_snippets.cpp
@@ -0,0 +1,285 @@
+//
+// Copyright (c) 2016-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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core.hpp>
+#include <boost/asio.hpp>
+#include <boost/asio/spawn.hpp>
+#include <boost/asio/use_future.hpp>
+#include <algorithm>
+#include <future>
+#include <iostream>
+#include <thread>
+
+//[ws_snippet_1
+#include <boost/beast/websocket.hpp>
+using namespace boost::beast::websocket;
+//]
+
+using namespace boost::beast;
+
+namespace doc_ws_snippets {
+
+void fxx() {
+
+net::io_service ios;
+net::io_service::work work{ios};
+std::thread t{[&](){ ios.run(); }};
+error_code ec;
+net::ip::tcp::socket sock{ios};
+
+{
+//[ws_snippet_2
+ stream<net::ip::tcp::socket> ws{ios};
+//]
+}
+
+{
+//[ws_snippet_3
+ stream<net::ip::tcp::socket> ws{std::move(sock)};
+//]
+}
+
+{
+//[ws_snippet_4
+ stream<net::ip::tcp::socket&> ws{sock};
+//]
+
+//[ws_snippet_5
+ ws.next_layer().shutdown(net::ip::tcp::socket::shutdown_send);
+//]
+}
+
+{
+//[ws_snippet_6
+ std::string const host = "mywebapp.com";
+ net::ip::tcp::resolver r{ios};
+ stream<net::ip::tcp::socket> ws{ios};
+ net::connect(ws.next_layer(), r.resolve({host, "ws"}));
+//]
+}
+
+{
+//[ws_snippet_7
+ net::ip::tcp::acceptor acceptor{ios};
+ stream<net::ip::tcp::socket> ws{acceptor.get_io_service()};
+ acceptor.accept(ws.next_layer());
+//]
+}
+
+{
+ stream<net::ip::tcp::socket> ws{ios};
+//[ws_snippet_8
+ ws.handshake("localhost", "/");
+//]
+
+//[ws_snippet_9
+ ws.handshake_ex("localhost", "/",
+ [](request_type& m)
+ {
+ m.insert(http::field::sec_websocket_protocol, "xmpp;ws-chat");
+ });
+//]
+
+//[ws_snippet_10
+ response_type res;
+ ws.handshake(res, "localhost", "/");
+ if(! res.count(http::field::sec_websocket_protocol))
+ throw std::invalid_argument("missing subprotocols");
+//]
+
+//[ws_snippet_11
+ ws.accept();
+//]
+
+//[ws_snippet_12
+ ws.accept_ex(
+ [](response_type& m)
+ {
+ m.insert(http::field::server, "MyServer");
+ });
+//]
+}
+
+{
+//[ws_snippet_13]
+ // Buffer required for reading HTTP messages
+ flat_buffer buffer;
+
+ // Read the HTTP request ourselves
+ http::request<http::string_body> req;
+ http::read(sock, buffer, req);
+
+ // See if its a WebSocket upgrade request
+ if(websocket::is_upgrade(req))
+ {
+ // Construct the stream, transferring ownership of the socket
+ stream<net::ip::tcp::socket> ws{std::move(sock)};
+
+ // Accept the request from our message. Clients SHOULD NOT
+ // begin sending WebSocket frames until the server has
+ // provided a response, but just in case they did, we pass
+ // any leftovers in the buffer to the accept function.
+ //
+ ws.accept(req, buffer.data());
+ }
+ else
+ {
+ // Its not a WebSocket upgrade, so
+ // handle it like a normal HTTP request.
+ }
+//]
+}
+
+{
+ stream<net::ip::tcp::socket> ws{ios};
+//[ws_snippet_14
+ // Read into our buffer until we reach the end of the HTTP request.
+ // No parsing takes place here, we are just accumulating data.
+ net::streambuf buffer;
+ net::read_until(sock, buffer, "\r\n\r\n");
+
+ // Now accept the connection, using the buffered data.
+ ws.accept(buffer.data());
+//]
+}
+{
+ stream<net::ip::tcp::socket> ws{ios};
+//[ws_snippet_15
+ multi_buffer buffer;
+ ws.read(buffer);
+
+ ws.text(ws.got_text());
+ ws.write(buffer.data());
+ buffer.consume(buffer.size());
+//]
+}
+
+{
+ stream<net::ip::tcp::socket> ws{ios};
+//[ws_snippet_16
+ multi_buffer buffer;
+ for(;;)
+ if(ws.read_some(buffer, 0))
+ break;
+ ws.binary(ws.got_binary());
+ consuming_buffers<multi_buffer::const_buffers_type> cb{buffer.data()};
+ for(;;)
+ {
+ using net::buffer_size;
+ if(buffer_size(cb) > 512)
+ {
+ ws.write_some(false, buffer_prefix(512, cb));
+ cb.consume(512);
+ }
+ else
+ {
+ ws.write_some(true, cb);
+ break;
+ }
+ }
+//]
+}
+
+{
+ stream<net::ip::tcp::socket> ws{ios};
+//[ws_snippet_17
+ auto cb =
+ [](frame_type kind, string_view payload)
+ {
+ // Do something with the payload
+ boost::ignore_unused(kind, payload);
+ };
+ ws.control_callback(cb);
+//]
+
+//[ws_snippet_18
+ ws.close(close_code::normal);
+//]
+
+//[ws_snippet_19
+ ws.auto_fragment(true);
+ ws.write_buffer_size(16384);
+//]
+
+//[ws_snippet_20
+ multi_buffer buffer;
+ ws.async_read(buffer,
+ [](error_code, std::size_t)
+ {
+ // Do something with the buffer
+ });
+//]
+}
+
+} // fxx()
+
+// workaround for https://github.com/chriskohlhoff/asio/issues/112
+#ifdef BOOST_MSVC
+//[ws_snippet_21
+void echo(stream<net::ip::tcp::socket>& ws,
+ multi_buffer& buffer, net::yield_context yield)
+{
+ ws.async_read(buffer, yield);
+ std::future<void> fut =
+ ws.async_write(buffer.data(), net::use_future);
+}
+//]
+#endif
+
+} // doc_ws_snippets
+
+//------------------------------------------------------------------------------
+
+#if BOOST_BEAST_USE_OPENSSL
+
+//[wss_snippet_1
+#include <boost/beast/websocket/ssl.hpp>
+#include <boost/asio/ssl.hpp>
+//]
+
+namespace doc_wss_snippets {
+
+void fxx() {
+
+net::io_service ios;
+net::io_service::work work{ios};
+std::thread t{[&](){ ios.run(); }};
+error_code ec;
+net::ip::tcp::socket sock{ios};
+
+{
+//[wss_snippet_2
+ net::ssl::context ctx{net::ssl::context::tlsv12};
+ stream<net::ssl::stream<net::ip::tcp::socket>> wss{ios, ctx};
+//]
+}
+
+{
+//[wss_snippet_3
+ net::ip::tcp::endpoint ep;
+ net::ssl::context ctx{net::ssl::context::tlsv12};
+ stream<net::ssl::stream<net::ip::tcp::socket>> ws{ios, ctx};
+
+ // connect the underlying TCP/IP socket
+ ws.next_layer().next_layer().connect(ep);
+
+ // perform SSL handshake
+ ws.next_layer().handshake(net::ssl::stream_base::client);
+
+ // perform WebSocket handshake
+ ws.handshake("localhost", "/");
+//]
+}
+
+} // fxx()
+
+} // doc_wss_snippets
+
+#endif
+
diff --git a/src/boost/libs/beast/test/beast/websocket/error.cpp b/src/boost/libs/beast/test/beast/websocket/error.cpp
new file mode 100644
index 000000000..2a272184b
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/error.cpp
@@ -0,0 +1,82 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/error.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <memory>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class error_test : public unit_test::suite
+{
+public:
+ void check(error e)
+ {
+ auto const ec = make_error_code(e);
+ ec.category().name();
+ BEAST_EXPECT(! ec.message().empty());
+ BEAST_EXPECT(ec != condition::handshake_failed);
+ BEAST_EXPECT(ec != condition::protocol_violation);
+ }
+
+ void check(condition c, error e)
+ {
+ auto const ec = make_error_code(e);
+ BEAST_EXPECT(ec.category().name() != nullptr);
+ BEAST_EXPECT(! ec.message().empty());
+ BEAST_EXPECT(ec == c);
+ }
+
+ void run() override
+ {
+ check(error::closed);
+ check(error::buffer_overflow);
+ check(error::partial_deflate_block);
+ check(error::message_too_big);
+
+ check(condition::protocol_violation, error::bad_opcode);
+ check(condition::protocol_violation, error::bad_data_frame);
+ check(condition::protocol_violation, error::bad_continuation);
+ check(condition::protocol_violation, error::bad_reserved_bits);
+ check(condition::protocol_violation, error::bad_control_fragment);
+ check(condition::protocol_violation, error::bad_control_size);
+ check(condition::protocol_violation, error::bad_unmasked_frame);
+ check(condition::protocol_violation, error::bad_masked_frame);
+ check(condition::protocol_violation, error::bad_size);
+ check(condition::protocol_violation, error::bad_frame_payload);
+ check(condition::protocol_violation, error::bad_close_code);
+ check(condition::protocol_violation, error::bad_close_size);
+ check(condition::protocol_violation, error::bad_close_payload);
+
+ check(condition::handshake_failed, error::bad_http_version);
+ check(condition::handshake_failed, error::bad_method);
+ check(condition::handshake_failed, error::no_host);
+ check(condition::handshake_failed, error::no_connection);
+ check(condition::handshake_failed, error::no_connection_upgrade);
+ check(condition::handshake_failed, error::no_upgrade);
+ check(condition::handshake_failed, error::no_upgrade_websocket);
+ check(condition::handshake_failed, error::no_sec_key);
+ check(condition::handshake_failed, error::bad_sec_key);
+ check(condition::handshake_failed, error::no_sec_version);
+ check(condition::handshake_failed, error::bad_sec_version);
+ check(condition::handshake_failed, error::no_sec_accept);
+ check(condition::handshake_failed, error::bad_sec_accept);
+ check(condition::handshake_failed, error::upgrade_declined);
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,error);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/frame.cpp b/src/boost/libs/beast/test/beast/websocket/frame.cpp
new file mode 100644
index 000000000..8380e132c
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/frame.cpp
@@ -0,0 +1,78 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/websocket/detail/frame.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+namespace detail {
+
+class frame_test
+ : public beast::unit_test::suite
+{
+public:
+ void testCloseCodes()
+ {
+ BEAST_EXPECT(! is_valid_close_code(0));
+ BEAST_EXPECT(! is_valid_close_code(1));
+ BEAST_EXPECT(! is_valid_close_code(999));
+ BEAST_EXPECT(! is_valid_close_code(1004));
+ BEAST_EXPECT(! is_valid_close_code(1005));
+ BEAST_EXPECT(! is_valid_close_code(1006));
+ BEAST_EXPECT(! is_valid_close_code(1016));
+ BEAST_EXPECT(! is_valid_close_code(2000));
+ BEAST_EXPECT(! is_valid_close_code(2999));
+ BEAST_EXPECT(is_valid_close_code(1000));
+ BEAST_EXPECT(is_valid_close_code(1002));
+ BEAST_EXPECT(is_valid_close_code(3000));
+ BEAST_EXPECT(is_valid_close_code(4000));
+ BEAST_EXPECT(is_valid_close_code(5000));
+ }
+
+ struct test_fh : frame_header
+ {
+ test_fh()
+ {
+ op = detail::opcode::text;
+ fin = true;
+ mask = false;
+ rsv1 = false;
+ rsv2 = false;
+ rsv3 = false;
+ len = 0;
+ key = 0;
+ }
+ };
+
+ void
+ testWriteFrame()
+ {
+ test_fh fh;
+ fh.rsv2 = true;
+ fh.rsv3 = true;
+ fh.len = 65536;
+ frame_buffer fb;
+ write(fb, fh);
+ }
+
+ void run() override
+ {
+ testWriteFrame();
+ testCloseCodes();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,frame);
+
+} // detail
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/handshake.cpp b/src/boost/libs/beast/test/beast/websocket/handshake.cpp
new file mode 100644
index 000000000..e5ea4004c
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/handshake.cpp
@@ -0,0 +1,724 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/test/tcp.hpp>
+
+#include "test.hpp"
+
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/strand.hpp>
+#include <thread>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class handshake_test : public websocket_test_suite
+{
+public:
+ template<class Wrap>
+ void
+ doTestHandshake(Wrap const& w)
+ {
+ class req_decorator
+ {
+ bool& b_;
+
+ public:
+ req_decorator(req_decorator const&) = default;
+
+ explicit
+ req_decorator(bool& b)
+ : b_(b)
+ {
+ }
+
+ void
+ operator()(request_type&) const
+ {
+ b_ = true;
+ }
+ };
+
+ // handshake
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log};
+ ws_type ws{ts};
+ ws.next_layer().connect(es.stream());
+ try
+ {
+ w.handshake(ws, "localhost", "/");
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ ts.close();
+ });
+
+ // handshake, response
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log};
+ ws_type ws{ts};
+ ws.next_layer().connect(es.stream());
+ response_type res;
+ try
+ {
+ w.handshake(ws, res, "localhost", "/");
+ // VFALCO validate res?
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ ts.close();
+ });
+
+ // handshake, decorator
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log};
+ ws_type ws{ts};
+ ws.next_layer().connect(es.stream());
+ bool called = false;
+ try
+ {
+ ws.set_option(stream_base::decorator(
+ req_decorator{called}));
+ w.handshake(ws, "localhost", "/");
+ BEAST_EXPECT(called);
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ ts.close();
+ });
+
+ // handshake, response, decorator
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log};
+ ws_type ws{ts};
+ ws.next_layer().connect(es.stream());
+ bool called = false;
+ response_type res;
+ try
+ {
+ ws.set_option(stream_base::decorator(
+ req_decorator{called}));
+ w.handshake(ws, res, "localhost", "/");
+ // VFALCO validate res?
+ BEAST_EXPECT(called);
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ ts.close();
+ });
+ }
+
+ void
+ testHandshake()
+ {
+ doTestHandshake(SyncClient{});
+
+ yield_to([&](yield_context yield)
+ {
+ doTestHandshake(AsyncClient{yield});
+ });
+
+ auto const check =
+ [&](error e, std::string const& s)
+ {
+ stream<test::stream> ws{ioc_};
+ auto tr = connect(ws.next_layer());
+ ws.next_layer().append(s);
+ tr.close();
+ try
+ {
+ ws.handshake("localhost:80", "/");
+ fail();
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(se.code() == e, se.what());
+ }
+ };
+ // bad HTTP version
+ check(error::bad_http_version,
+ "HTTP/1.0 101 Switching Protocols\r\n"
+ "Server: beast\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ // no Connection
+ check(error::no_connection,
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Server: beast\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ // no Connection upgrade
+ check(error::no_connection_upgrade,
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Server: beast\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: keep-alive\r\n"
+ "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ // no Upgrade
+ check(error::no_upgrade,
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Server: beast\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ // no Upgrade websocket
+ check(error::no_upgrade_websocket,
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Server: beast\r\n"
+ "Upgrade: HTTP/2\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ // no Sec-WebSocket-Accept
+ check(error::no_sec_accept,
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Server: beast\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ // bad Sec-WebSocket-Accept
+ check(error::bad_sec_accept,
+ "HTTP/1.1 101 Switching Protocols\r\n"
+ "Server: beast\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Accept: *\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ // declined
+ check(error::upgrade_declined,
+ "HTTP/1.1 200 OK\r\n"
+ "Server: beast\r\n"
+ "Upgrade: WebSocket\r\n"
+ "Connection: upgrade\r\n"
+ "Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzhZRbK+xOo=\r\n"
+ "Sec-WebSocket-Version: 13\r\n"
+ "\r\n"
+ );
+ }
+
+ // Compression Extensions for WebSocket
+ //
+ // https://tools.ietf.org/html/rfc7692
+ //
+ void
+ testExtRead()
+ {
+ detail::pmd_offer po;
+
+ auto const accept =
+ [&](string_view s)
+ {
+ http::fields f;
+ f.set(http::field::sec_websocket_extensions, s);
+ po = detail::pmd_offer();
+ detail::pmd_read(po, f);
+ BEAST_EXPECT(po.accept);
+ };
+
+ auto const reject =
+ [&](string_view s)
+ {
+ http::fields f;
+ f.set(http::field::sec_websocket_extensions, s);
+ po = detail::pmd_offer();
+ detail::pmd_read(po, f);
+ BEAST_EXPECT(! po.accept);
+ };
+
+ // duplicate parameters
+ reject("permessage-deflate; server_max_window_bits=8; server_max_window_bits=8");
+
+ // missing value
+ reject("permessage-deflate; server_max_window_bits");
+ reject("permessage-deflate; server_max_window_bits=");
+
+ // invalid value
+ reject("permessage-deflate; server_max_window_bits=-1");
+ reject("permessage-deflate; server_max_window_bits=7");
+ reject("permessage-deflate; server_max_window_bits=16");
+ reject("permessage-deflate; server_max_window_bits=999999999999999999999999");
+ reject("permessage-deflate; server_max_window_bits=9a");
+
+ // duplicate parameters
+ reject("permessage-deflate; client_max_window_bits=8; client_max_window_bits=8");
+
+ // optional value excluded
+ accept("permessage-deflate; client_max_window_bits");
+ BEAST_EXPECT(po.client_max_window_bits == -1);
+ accept("permessage-deflate; client_max_window_bits=");
+ BEAST_EXPECT(po.client_max_window_bits == -1);
+
+ // invalid value
+ reject("permessage-deflate; client_max_window_bits=-1");
+ reject("permessage-deflate; client_max_window_bits=7");
+ reject("permessage-deflate; client_max_window_bits=16");
+ reject("permessage-deflate; client_max_window_bits=999999999999999999999999");
+
+ // duplicate parameters
+ reject("permessage-deflate; server_no_context_takeover; server_no_context_takeover");
+
+ // valueless parameter
+ accept("permessage-deflate; server_no_context_takeover");
+ BEAST_EXPECT(po.server_no_context_takeover);
+ accept("permessage-deflate; server_no_context_takeover=");
+ BEAST_EXPECT(po.server_no_context_takeover);
+
+ // disallowed value
+ reject("permessage-deflate; server_no_context_takeover=-1");
+ reject("permessage-deflate; server_no_context_takeover=x");
+ reject("permessage-deflate; server_no_context_takeover=\"yz\"");
+ reject("permessage-deflate; server_no_context_takeover=999999999999999999999999");
+
+ // duplicate parameters
+ reject("permessage-deflate; client_no_context_takeover; client_no_context_takeover");
+
+ // valueless parameter
+ accept("permessage-deflate; client_no_context_takeover");
+ BEAST_EXPECT(po.client_no_context_takeover);
+ accept("permessage-deflate; client_no_context_takeover=");
+ BEAST_EXPECT(po.client_no_context_takeover);
+
+ // disallowed value
+ reject("permessage-deflate; client_no_context_takeover=-1");
+ reject("permessage-deflate; client_no_context_takeover=x");
+ reject("permessage-deflate; client_no_context_takeover=\"yz\"");
+ reject("permessage-deflate; client_no_context_takeover=999999999999999999999999");
+
+ // unknown extension parameter
+ reject("permessage-deflate; unknown");
+ reject("permessage-deflate; unknown=");
+ reject("permessage-deflate; unknown=1");
+ reject("permessage-deflate; unknown=x");
+ reject("permessage-deflate; unknown=\"xy\"");
+ }
+
+ void
+ testExtWrite()
+ {
+ detail::pmd_offer po;
+
+ auto const check =
+ [&](string_view match)
+ {
+ http::fields f;
+ detail::pmd_write(f, po);
+ BEAST_EXPECT(
+ f[http::field::sec_websocket_extensions]
+ == match);
+ };
+
+ po.accept = true;
+ po.server_max_window_bits = 0;
+ po.client_max_window_bits = 0;
+ po.server_no_context_takeover = false;
+ po.client_no_context_takeover = false;
+
+ check("permessage-deflate");
+
+ po.server_max_window_bits = 10;
+ check("permessage-deflate; server_max_window_bits=10");
+
+ po.server_max_window_bits = -1;
+ check("permessage-deflate; server_max_window_bits");
+
+ po.server_max_window_bits = 0;
+ po.client_max_window_bits = 10;
+ check("permessage-deflate; client_max_window_bits=10");
+
+ po.client_max_window_bits = -1;
+ check("permessage-deflate; client_max_window_bits");
+
+ po.client_max_window_bits = 0;
+ po.server_no_context_takeover = true;
+ check("permessage-deflate; server_no_context_takeover");
+
+ po.server_no_context_takeover = false;
+ po.client_no_context_takeover = true;
+ check("permessage-deflate; client_no_context_takeover");
+ }
+
+ void
+ testExtNegotiate()
+ {
+ permessage_deflate pmd;
+
+ auto const reject =
+ [&](
+ string_view offer)
+ {
+ detail::pmd_offer po;
+ {
+ http::fields f;
+ f.set(http::field::sec_websocket_extensions, offer);
+ detail::pmd_read(po, f);
+ }
+ http::fields f;
+ detail::pmd_offer config;
+ detail::pmd_negotiate(f, config, po, pmd);
+ BEAST_EXPECT(! config.accept);
+ };
+
+ auto const accept =
+ [&](
+ string_view offer,
+ string_view result)
+ {
+ detail::pmd_offer po;
+ {
+ http::fields f;
+ f.set(http::field::sec_websocket_extensions, offer);
+ detail::pmd_read(po, f);
+ }
+ http::fields f;
+ detail::pmd_offer config;
+ detail::pmd_negotiate(f, config, po, pmd);
+ auto const got =
+ f[http::field::sec_websocket_extensions];
+ BEAST_EXPECTS(got == result, got);
+ {
+ detail::pmd_offer poc;
+ detail::pmd_read(poc, f);
+ detail::pmd_normalize(poc);
+ BEAST_EXPECT(poc.accept);
+ }
+ BEAST_EXPECT(config.server_max_window_bits != 0);
+ BEAST_EXPECT(config.client_max_window_bits != 0);
+ };
+
+ pmd.server_enable = true;
+ pmd.server_max_window_bits = 15;
+ pmd.client_max_window_bits = 15;
+ pmd.server_no_context_takeover = false;
+ pmd.client_no_context_takeover = false;
+
+ // default
+ accept(
+ "permessage-deflate",
+ "permessage-deflate");
+
+ // non-default server_max_window_bits
+ accept(
+ "permessage-deflate; server_max_window_bits=14",
+ "permessage-deflate; server_max_window_bits=14");
+
+ // explicit default server_max_window_bits
+ accept(
+ "permessage-deflate; server_max_window_bits=15",
+ "permessage-deflate");
+
+ // minimum window size of 8 bits (a zlib bug)
+ accept(
+ "permessage-deflate; server_max_window_bits=8",
+ "permessage-deflate; server_max_window_bits=9");
+
+ // non-default server_max_window_bits setting
+ pmd.server_max_window_bits = 10;
+ accept(
+ "permessage-deflate",
+ "permessage-deflate; server_max_window_bits=10");
+
+ // clamped server_max_window_bits setting #1
+ pmd.server_max_window_bits = 10;
+ accept(
+ "permessage-deflate; server_max_window_bits=14",
+ "permessage-deflate; server_max_window_bits=10");
+
+ // clamped server_max_window_bits setting #2
+ pmd.server_max_window_bits=8;
+ accept(
+ "permessage-deflate; server_max_window_bits=14",
+ "permessage-deflate; server_max_window_bits=9");
+
+ pmd.server_max_window_bits = 15;
+
+ // present with no value
+ accept(
+ "permessage-deflate; client_max_window_bits",
+ "permessage-deflate");
+
+ // present with no value, non-default setting
+ pmd.client_max_window_bits = 10;
+ accept(
+ "permessage-deflate; client_max_window_bits",
+ "permessage-deflate; client_max_window_bits=10");
+
+ // absent, non-default setting
+ pmd.client_max_window_bits = 10;
+ reject(
+ "permessage-deflate");
+ }
+
+ void
+ testMoveOnly()
+ {
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.async_handshake("", "", move_only_handler{});
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void
+ testAsync()
+ {
+ using tcp = net::ip::tcp;
+
+ net::io_context ioc;
+
+ // success, no timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ // success, timeout enabled
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ // timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_handshake("test", "/",
+ test::fail_handler(beast::error::timeout));
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(stream_base::timeout{
+ std::chrono::milliseconds(50),
+ stream_base::none(),
+ false});
+ ws1.async_handshake("test", "/",
+ test::fail_handler(beast::error::timeout));
+ test::run_for(ioc, std::chrono::seconds(1));
+ }
+
+ // abandoned operation
+
+ {
+ {
+ stream<tcp::socket> ws1(ioc);
+ ws1.async_handshake("test", "/",
+ test::fail_handler(
+ net::error::operation_aborted));
+ }
+ test::run(ioc);
+ }
+ }
+
+ // https://github.com/boostorg/beast/issues/1460
+ void
+ testIssue1460()
+ {
+ net::io_context ioc;
+ auto const make_big = [](response_type& res)
+ {
+ res.insert("Date", "Mon, 18 Feb 2019 12:48:36 GMT");
+ res.insert("Set-Cookie",
+ "__cfduid=de1e209833e7f05aaa1044c6d448994761550494116; "
+ "expires=Tue, 18-Feb-20 12:48:36 GMT; path=/; domain=.cryptofacilities.com; HttpOnly; Secure");
+ res.insert("Feature-Policy",
+ "accelerometer 'none'; ambient-light-sensor 'none'; "
+ "animations 'none'; autoplay 'none'; camera 'none'; document-write 'none'; "
+ "encrypted-media 'none'; geolocation 'none'; gyroscope 'none'; legacy-image-formats 'none'; "
+ "magnetometer 'none'; max-downscaling-image 'none'; microphone 'none'; midi 'none'; "
+ "payment 'none'; picture-in-picture 'none'; unsized-media 'none'; usb 'none'; vr 'none'");
+ res.insert("Referrer-Policy", "origin");
+ res.insert("Strict-Transport-Security", "max-age=15552000; includeSubDomains; preload");
+ res.insert("X-Content-Type-Options", "nosniff");
+ res.insert("Content-Security-Policy",
+ "default-src 'none'; manifest-src 'self'; object-src 'self'; "
+ "child-src 'self' https://www.google.com; "
+ "font-src 'self' https://use.typekit.net https://maxcdn.bootstrapcdn.com https://fonts.gstatic.com data:; "
+ "script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ajax.cloudflare.com https://use.typekit.net "
+ "https://www.googletagmanager.com https://www.google-analytics.com https://www.google.com https://www.googleadservices.com "
+ "https://googleads.g.doubleclick.net https://www.gstatic.com; connect-src 'self' wss://*.cryptofacilities.com/ws/v1 wss://*.cryptofacilities.com/ws/indices "
+ "https://uat.cryptofacilities.com https://uat.cf0.io wss://*.cf0.io https://www.googletagmanager.com https://www.google-analytics.com https://www.google.com "
+ "https://fonts.googleapis.com https://google-analytics.com https://use.typekit.net https://p.typekit.net https://fonts.gstatic.com https://www.gstatic.com "
+ "https://chart.googleapis.com; worker-src 'self'; img-src 'self' https://chart.googleapis.com https://p.typekit.net https://www.google.co.uk https://www.google.com "
+ "https://www.google-analytics.com https://stats.g.doubleclick.net data:; style-src 'self' 'unsafe-inline' https://use.typekit.net https://p.typekit.net "
+ "https://fonts.googleapis.com https://maxcdn.bootstrapcdn.com");
+ res.insert("X-Frame-Options", "SAMEORIGIN");
+ res.insert("X-Xss-Protection", "1; mode=block");
+ res.insert("Expect-CT", "max-age=604800, report-uri=\"https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct\"");
+ res.insert("Server", "cloudflare");
+ res.insert("CF-RAY", "4ab09be1a9d0cb06-ARN");
+ res.insert("Bulk",
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************"
+ "****************************************************************************************************");
+ };
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws2.set_option(stream_base::decorator(make_big));
+ error_code ec;
+ ws2.async_accept(test::success_handler());
+ std::thread t(
+ [&ioc]
+ {
+ ioc.run();
+ ioc.restart();
+ });
+ ws1.handshake("test", "/", ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ t.join();
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws2.set_option(stream_base::decorator(make_big));
+ ws2.async_accept(test::success_handler());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ioc.run();
+ ioc.restart();
+ }
+ }
+
+ void
+ run() override
+ {
+ testHandshake();
+ testExtRead();
+ testExtWrite();
+ testExtNegotiate();
+ testMoveOnly();
+ testAsync();
+ testIssue1460();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,handshake);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/option.cpp b/src/boost/libs/beast/test/beast/websocket/option.cpp
new file mode 100644
index 000000000..5eddbbec8
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/option.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/option.hpp>
diff --git a/src/boost/libs/beast/test/beast/websocket/ping.cpp b/src/boost/libs/beast/test/beast/websocket/ping.cpp
new file mode 100644
index 000000000..1810927bc
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/ping.cpp
@@ -0,0 +1,499 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/_experimental/test/tcp.hpp>
+
+#include "test.hpp"
+
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/strand.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class ping_test : public websocket_test_suite
+{
+public:
+ template<class Wrap>
+ void
+ doTestPing(Wrap const& w)
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = false;
+ pmd.server_enable = false;
+
+ // ping
+ doTest(pmd, [&](ws_type& ws)
+ {
+ w.ping(ws, {});
+ });
+
+ // pong
+ doTest(pmd, [&](ws_type& ws)
+ {
+ w.pong(ws, {});
+ });
+
+ // ping, already closed
+ {
+ echo_server es{log};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.close({});
+ try
+ {
+ w.ping(ws, {});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == net::error::operation_aborted,
+ se.code().message());
+ }
+ }
+
+ // pong, already closed
+ {
+ echo_server es{log};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.close({});
+ try
+ {
+ w.pong(ws, {});
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == net::error::operation_aborted,
+ se.code().message());
+ }
+ }
+ }
+
+ void
+ testPing()
+ {
+ doTestPing(SyncClient{});
+
+ yield_to([&](yield_context yield)
+ {
+ doTestPing(AsyncClient{yield});
+ });
+ }
+
+ void
+ testSuspend()
+ {
+ // suspend on write
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_write(sbuf("Hello, world"),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 12);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ BEAST_EXPECT(count == 0);
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on close
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ BEAST_EXPECT(count == 0);
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read ping + message
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add a ping and message to the input
+ ws.next_layer().append(string_view{
+ "\x89\x00" "\x81\x01*", 5});
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read bad message
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add an invalid frame to the input
+ ws.next_layer().append(string_view{
+ "\x09\x00", 2});
+
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec != error::bad_control_fragment)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read close #1
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add a close frame to the input
+ ws.next_layer().append(string_view{
+ "\x88\x00", 2});
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec != error::closed)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read close #2
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log, kind::async};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // Cause close to be received
+ es.async_close();
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec != error::closed)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_ping({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // don't ping on close
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ error_code ec;
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_write(sbuf("*"),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 1);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ws.async_close({},
+ [&](error_code)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ioc.run();
+ BEAST_EXPECT(count == 3);
+ });
+
+ // suspend idle ping
+ {
+ using socket_type =
+ net::basic_stream_socket<
+ net::ip::tcp,
+ net::executor>;
+ net::io_context ioc;
+ stream<socket_type> ws1(ioc);
+ stream<socket_type> ws2(ioc);
+ ws1.set_option(stream_base::timeout{
+ stream_base::none(),
+ std::chrono::seconds(0),
+ true});
+ test::connect(
+ ws1.next_layer(),
+ ws2.next_layer());
+ ws1.async_handshake("localhost", "/",
+ [](error_code){});
+ ws2.async_accept([](error_code){});
+ ioc.run();
+ ioc.restart();
+ flat_buffer b1;
+ auto mb = b1.prepare(65536);
+ std::memset(mb.data(), 0, mb.size());
+ b1.commit(65536);
+ ws1.async_write(b1.data(),
+ [&](error_code, std::size_t){});
+ BEAST_EXPECT(
+ ws1.impl_->wr_block.is_locked());
+ ws1.async_read_some(net::mutable_buffer{},
+ [&](error_code, std::size_t){});
+ ioc.run();
+ ioc.restart();
+ flat_buffer b2;
+ ws2.async_read(b2,
+ [&](error_code, std::size_t){});
+ ioc.run();
+ }
+ //);
+
+ {
+ echo_server es{log, kind::async};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+
+ // Cause close to be received
+ es.async_close();
+
+ multi_buffer b;
+ std::size_t count = 0;
+ // Read a close frame.
+ // Sends a close frame, blocking writes.
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ // Read should complete with error::closed
+ ++count;
+ BEAST_EXPECTS(ec == error::closed,
+ ec.message());
+ });
+ if(! BEAST_EXPECT(run_until(ioc, 100,
+ [&]{ return ws.impl_->wr_close; })))
+ return;
+ // Try to ping
+ ws.async_ping("payload",
+ [&](error_code ec)
+ {
+ // Pings after a close are aborted
+ ++count;
+ BEAST_EXPECTS(ec == net::
+ error::operation_aborted,
+ ec.message());
+ // Subsequent calls to close are aborted
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ ++count;
+ BEAST_EXPECTS(ec == net::
+ error::operation_aborted,
+ ec.message());
+ });
+ });
+ static std::size_t constexpr limit = 100;
+ std::size_t n;
+ for(n = 0; n < limit; ++n)
+ {
+ if(count >= 3)
+ break;
+ ioc.run_one();
+ }
+ BEAST_EXPECT(n < limit);
+ ioc.run();
+ }
+ }
+
+ void
+ testMoveOnly()
+ {
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.async_ping({}, move_only_handler{});
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void
+ run() override
+ {
+ testPing();
+ testSuspend();
+ testMoveOnly();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,ping);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/read1.cpp b/src/boost/libs/beast/test/beast/websocket/read1.cpp
new file mode 100644
index 000000000..1e98e4543
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/read1.cpp
@@ -0,0 +1,153 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/test/tcp.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class read1_test : public unit_test::suite
+{
+public:
+ void
+ testTimeout()
+ {
+ using tcp = net::ip::tcp;
+
+ net::io_context ioc;
+
+ // success
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ flat_buffer b;
+ ws1.async_write(net::const_buffer("Hello, world!", 13),
+ test::success_handler());
+ ws2.async_read(b, test::success_handler());
+ test::run(ioc);
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ flat_buffer b;
+ ws1.async_write(net::const_buffer("Hello, world!", 13),
+ test::success_handler());
+ ws2.async_read(b, test::success_handler());
+ test::run(ioc);
+ }
+
+ // success, timeout enabled
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ flat_buffer b;
+ ws1.set_option(stream_base::timeout{
+ stream_base::none(),
+ std::chrono::milliseconds(50),
+ false});
+ ws1.async_read(b, test::success_handler());
+ ws2.async_write(net::const_buffer("Hello, world!", 13),
+ test::success_handler());
+ test::run(ioc);
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ flat_buffer b;
+ ws1.set_option(stream_base::timeout{
+ stream_base::none(),
+ std::chrono::milliseconds(50),
+ false});
+ ws1.async_read(b, test::success_handler());
+ ws2.async_write(net::const_buffer("Hello, world!", 13),
+ test::success_handler());
+ test::run(ioc);
+ }
+
+ // timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ flat_buffer b;
+ ws1.set_option(stream_base::timeout{
+ stream_base::none(),
+ std::chrono::milliseconds(50),
+ false});
+ ws1.async_read(b, test::fail_handler(
+ beast::error::timeout));
+ test::run(ioc);
+ }
+
+ {
+ stream<test::stream> ws1(ioc);
+ stream<test::stream> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_handshake("test", "/", test::success_handler());
+ ws2.async_accept(test::success_handler());
+ test::run(ioc);
+
+ flat_buffer b;
+ ws1.set_option(stream_base::timeout{
+ stream_base::none(),
+ std::chrono::milliseconds(50),
+ false});
+ ws1.async_read(b, test::fail_handler(
+ beast::error::timeout));
+ test::run(ioc);
+ }
+ }
+
+ void
+ run() override
+ {
+ testTimeout();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,read1);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/read2.cpp b/src/boost/libs/beast/test/beast/websocket/read2.cpp
new file mode 100644
index 000000000..0f211fcf2
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/read2.cpp
@@ -0,0 +1,687 @@
+
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include "test.hpp"
+
+#include <boost/asio/write.hpp>
+
+#include <boost/config/workaround.hpp>
+#if BOOST_WORKAROUND(BOOST_GCC, < 80200)
+#define BOOST_BEAST_SYMBOL_HIDDEN __attribute__ ((visibility("hidden")))
+#else
+#define BOOST_BEAST_SYMBOL_HIDDEN
+#endif
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class BOOST_BEAST_SYMBOL_HIDDEN read2_test
+ : public websocket_test_suite
+{
+public:
+ template<class Wrap, bool deflateSupported>
+ void
+ doReadTest(
+ Wrap const& w,
+ ws_type_t<deflateSupported>& ws,
+ close_code code)
+ {
+ try
+ {
+ multi_buffer b;
+ w.read(ws, b);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ if(se.code() != error::closed)
+ throw;
+ BEAST_EXPECT(
+ ws.reason().code == code);
+ }
+ }
+
+ template<class Wrap, bool deflateSupported>
+ void
+ doFailTest(
+ Wrap const& w,
+ ws_type_t<deflateSupported>& ws,
+ error_code ev)
+ {
+ try
+ {
+ multi_buffer b;
+ w.read(ws, b);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ if(se.code() != ev)
+ throw;
+ }
+ }
+
+ template<bool deflateSupported = true, class Wrap>
+ void
+ doTestRead(Wrap const& w)
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = false;
+ pmd.server_enable = false;
+
+ // already closed
+ {
+ echo_server es{log};
+ stream<test::stream, deflateSupported> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.close({});
+ try
+ {
+ multi_buffer b;
+ w.read(ws, b);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == net::error::operation_aborted,
+ se.code().message());
+ }
+ }
+
+ // empty, fragmented message
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.next_layer().append(
+ string_view(
+ "\x01\x00" "\x80\x00", 4));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(b.size() == 0);
+ });
+
+ // two part message
+ // triggers "fill the read buffer first"
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ w.write_raw(ws, sbuf(
+ "\x01\x81\xff\xff\xff\xff"));
+ w.write_raw(ws, sbuf(
+ "\xd5"));
+ w.write_raw(ws, sbuf(
+ "\x80\x81\xff\xff\xff\xff\xd5"));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == "**");
+ });
+
+ // ping
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ put(ws.next_layer().buffer(), cbuf(
+ {0x89, 0x00}));
+ bool invoked = false;
+ ws.control_callback(
+ [&](frame_type kind, string_view)
+ {
+ BEAST_EXPECT(! invoked);
+ BEAST_EXPECT(kind == frame_type::ping);
+ invoked = true;
+ });
+ w.write(ws, sbuf("Hello"));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(invoked);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(buffers_to_string(b.data()) == "Hello");
+ });
+
+ // ping
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ put(ws.next_layer().buffer(), cbuf(
+ {0x88, 0x00}));
+ bool invoked = false;
+ ws.control_callback(
+ [&](frame_type kind, string_view)
+ {
+ BEAST_EXPECT(! invoked);
+ BEAST_EXPECT(kind == frame_type::close);
+ invoked = true;
+ });
+ w.write(ws, sbuf("Hello"));
+ doReadTest(w, ws, close_code::none);
+ });
+
+ // ping then message
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ bool once = false;
+ ws.control_callback(
+ [&](frame_type kind, string_view s)
+ {
+ BEAST_EXPECT(kind == frame_type::pong);
+ BEAST_EXPECT(! once);
+ once = true;
+ BEAST_EXPECT(s == "");
+ });
+ w.ping(ws, "");
+ ws.binary(true);
+ w.write(ws, sbuf("Hello"));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(once);
+ BEAST_EXPECT(ws.got_binary());
+ BEAST_EXPECT(buffers_to_string(b.data()) == "Hello");
+ });
+
+ // ping then fragmented message
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ bool once = false;
+ ws.control_callback(
+ [&](frame_type kind, string_view s)
+ {
+ BEAST_EXPECT(kind == frame_type::pong);
+ BEAST_EXPECT(! once);
+ once = true;
+ BEAST_EXPECT(s == "payload");
+ });
+ ws.ping("payload");
+ w.write_some(ws, false, sbuf("Hello, "));
+ w.write_some(ws, false, sbuf(""));
+ w.write_some(ws, true, sbuf("World!"));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(once);
+ BEAST_EXPECT(buffers_to_string(b.data()) == "Hello, World!");
+ });
+
+ // masked message, big
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log, kind::async_client};
+ ws_type_t<deflateSupported> ws{ts};
+ ws.next_layer().connect(es.stream());
+ ws.set_option(pmd);
+ es.async_handshake();
+ try
+ {
+ w.accept(ws);
+ std::string const s(2000, '*');
+ ws.auto_fragment(false);
+ ws.binary(false);
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ ws.next_layer().close();
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ });
+
+ // close
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log, kind::async};
+ net::io_context ioc;
+ stream<test::stream, deflateSupported> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // Cause close to be received
+ es.async_close();
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec != error::closed)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ioc.run();
+ BEAST_EXPECT(count == 1);
+ });
+
+ // already closed
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ w.close(ws, {});
+ multi_buffer b;
+ doFailTest(w, ws,
+ net::error::operation_aborted);
+ });
+
+ // buffer overflow
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ std::string const s = "Hello, world!";
+ ws.auto_fragment(false);
+ ws.binary(false);
+ w.write(ws, net::buffer(s));
+ try
+ {
+ multi_buffer b(3);
+ w.read(ws, b);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ if(se.code() != error::buffer_overflow)
+ throw;
+ }
+ });
+
+ // bad utf8, big
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ auto const s = std::string(2000, '*') +
+ random_string();
+ ws.text(true);
+ w.write(ws, net::buffer(s));
+ doReadTest(w, ws, close_code::bad_payload);
+ });
+
+ // invalid fixed frame header
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ w.write_raw(ws, cbuf(
+ {0x8f, 0x80, 0xff, 0xff, 0xff, 0xff}));
+ doReadTest(w, ws, close_code::protocol_error);
+ });
+
+ // bad close
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ put(ws.next_layer().buffer(), cbuf(
+ {0x88, 0x02, 0x03, 0xed}));
+ doFailTest(w, ws, error::bad_close_code);
+ });
+
+ // message size above 2^64
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ w.write_some(ws, false, sbuf("*"));
+ w.write_raw(ws, cbuf(
+ {0x80, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}));
+ doReadTest(w, ws, close_code::too_big);
+ });
+
+ // message size exceeds max
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.read_message_max(1);
+ w.write(ws, sbuf("**"));
+ doFailTest(w, ws, error::message_too_big);
+ });
+
+ // bad utf8
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ put(ws.next_layer().buffer(), cbuf(
+ {0x81, 0x06, 0x03, 0xea, 0xf0, 0x28, 0x8c, 0xbc}));
+ doFailTest(w, ws, error::bad_frame_payload);
+ });
+
+ // incomplete utf8
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ std::string const s =
+ "Hello, world!" "\xc0";
+ w.write(ws, net::buffer(s));
+ doReadTest(w, ws, close_code::bad_payload);
+ });
+
+ // incomplete utf8, big
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ std::string const s =
+ "\x81\x7e\x0f\xa1" +
+ std::string(4000, '*') + "\xc0";
+ ws.next_layer().append(s);
+ multi_buffer b;
+ try
+ {
+ do
+ {
+ b.commit(w.read_some(ws, b.prepare(4000)));
+ }
+ while(! ws.is_message_done());
+ }
+ catch(system_error const& se)
+ {
+ if(se.code() != error::bad_frame_payload)
+ throw;
+ }
+ });
+
+ // close frames
+ {
+ auto const check =
+ [&](error_code ev, string_view s)
+ {
+ echo_server es{log};
+ stream<test::stream, deflateSupported> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ w.handshake(ws, "localhost", "/");
+ ws.next_layer().append(s);
+ static_buffer<1> b;
+ try
+ {
+ w.read(ws, b);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(se.code() == ev,
+ se.code().message());
+ }
+ ws.next_layer().close();
+ };
+
+ // payload length 1
+ check(error::bad_close_size,
+ "\x88\x01\x01");
+
+ // invalid close code 1005
+ check(error::bad_close_code,
+ "\x88\x02\x03\xed");
+
+ // invalid utf8
+ check(error::bad_close_payload,
+ "\x88\x06\xfc\x15\x0f\xd7\x73\x43");
+
+ // good utf8
+ check(error::closed,
+ "\x88\x06\xfc\x15utf8");
+ }
+ }
+
+ template<class Wrap>
+ void
+ doTestReadDeflate(Wrap const& w)
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = true;
+ pmd.server_enable = true;
+ pmd.client_max_window_bits = 9;
+ pmd.server_max_window_bits = 9;
+ pmd.compLevel = 1;
+
+ // message size limit
+ doTest<true>(pmd,
+ [&](ws_type_t<true>& ws)
+ {
+ std::string const s = std::string(128, '*');
+ w.write(ws, net::buffer(s));
+ ws.read_message_max(32);
+ doFailTest(w, ws, error::message_too_big);
+ });
+
+ // invalid inflate block
+ doTest<true>(pmd,
+ [&](ws_type_t<true>& ws)
+ {
+ auto const& s = random_string();
+ ws.binary(true);
+ ws.next_layer().append(
+ "\xc2\x40" + s.substr(0, 64));
+ flat_buffer b;
+ try
+ {
+ w.read(ws, b);
+ }
+ catch(system_error const& se)
+ {
+ if(se.code() == test::error::test_failure)
+ throw;
+ BEAST_EXPECTS(se.code().category() ==
+ make_error_code(static_cast<
+ zlib::error>(0)).category(),
+ se.code().message());
+ }
+ catch(...)
+ {
+ throw;
+ }
+ });
+
+ // no_context_takeover
+ pmd.server_no_context_takeover = true;
+ doTest<true>(pmd,
+ [&](ws_type_t<true>& ws)
+ {
+ auto const& s = random_string();
+ ws.binary(true);
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+ pmd.client_no_context_takeover = false;
+ }
+
+ template<class Wrap>
+ void
+ doTestRead(
+ permessage_deflate const& pmd,
+ Wrap const& w)
+ {
+ // message
+ doTest(pmd, [&](ws_type& ws)
+ {
+ std::string const s = "Hello, world!";
+ ws.auto_fragment(false);
+ ws.binary(false);
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // masked message
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log, kind::async_client};
+ ws_type ws{ts};
+ ws.next_layer().connect(es.stream());
+ ws.set_option(pmd);
+ es.async_handshake();
+ try
+ {
+ w.accept(ws);
+ std::string const s = "Hello, world!";
+ ws.auto_fragment(false);
+ ws.binary(false);
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ ws.next_layer().close();
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ });
+
+ // empty message
+ doTest(pmd, [&](ws_type& ws)
+ {
+ std::string const s = "";
+ ws.text(true);
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // partial message
+ doTest(pmd, [&](ws_type& ws)
+ {
+ std::string const s = "Hello";
+ w.write(ws, net::buffer(s));
+ char buf[3];
+ auto const bytes_written =
+ w.read_some(ws, net::buffer(buf, sizeof(buf)));
+ BEAST_EXPECT(bytes_written > 0);
+ BEAST_EXPECT(
+ string_view(buf, 3).substr(0, bytes_written) ==
+ s.substr(0, bytes_written));
+ });
+
+ // partial message, dynamic buffer
+ doTest(pmd, [&](ws_type& ws)
+ {
+ std::string const s = "Hello, world!";
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ auto bytes_written =
+ w.read_some(ws, 3, b);
+ BEAST_EXPECT(bytes_written > 0);
+ BEAST_EXPECT(buffers_to_string(b.data()) ==
+ s.substr(0, b.size()));
+ w.read_some(ws, 256, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // big message
+ doTest(pmd, [&](ws_type& ws)
+ {
+ auto const& s = random_string();
+ ws.binary(true);
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // message, bad utf8
+ doTest(pmd, [&](ws_type& ws)
+ {
+ std::string const s = "\x03\xea\xf0\x28\x8c\xbc";
+ ws.auto_fragment(false);
+ ws.text(true);
+ w.write(ws, net::buffer(s));
+ doReadTest(w, ws, close_code::bad_payload);
+ });
+ }
+
+ void
+ testRead()
+ {
+ doTestRead<false>(SyncClient{});
+ doTestRead<true>(SyncClient{});
+ doTestReadDeflate(SyncClient{});
+ yield_to([&](yield_context yield)
+ {
+ doTestRead<false>(AsyncClient{yield});
+ doTestRead<true>(AsyncClient{yield});
+ doTestReadDeflate(AsyncClient{yield});
+ });
+
+ permessage_deflate pmd;
+ pmd.client_enable = false;
+ pmd.server_enable = false;
+ doTestRead(pmd, SyncClient{});
+ yield_to([&](yield_context yield)
+ {
+ doTestRead(pmd, AsyncClient{yield});
+ });
+
+ pmd.client_enable = true;
+ pmd.server_enable = true;
+ pmd.client_max_window_bits = 9;
+ pmd.server_max_window_bits = 9;
+ pmd.compLevel = 1;
+ doTestRead(pmd, SyncClient{});
+ yield_to([&](yield_context yield)
+ {
+ doTestRead(pmd, AsyncClient{yield});
+ });
+
+ // Read close frames
+ {
+ auto const check =
+ [&](error_code ev, string_view s)
+ {
+ echo_server es{log};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.next_layer().append(s);
+ static_buffer<1> b;
+ error_code ec;
+ ws.read(b, ec);
+ BEAST_EXPECTS(ec == ev, ec.message());
+ ws.next_layer().close();
+ };
+
+ // payload length 1
+ check(error::bad_close_size,
+ "\x88\x01\x01");
+
+ // invalid close code 1005
+ check(error::bad_close_code,
+ "\x88\x02\x03\xed");
+
+ // invalid utf8
+ check(error::bad_close_payload,
+ "\x88\x06\xfc\x15\x0f\xd7\x73\x43");
+
+ // good utf8
+ check(error::closed,
+ "\x88\x06\xfc\x15utf8");
+ }
+ }
+
+ void
+ run() override
+ {
+ testRead();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,read2);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/read3.cpp b/src/boost/libs/beast/test/beast/websocket/read3.cpp
new file mode 100644
index 000000000..e9559d440
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/read3.cpp
@@ -0,0 +1,655 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include "test.hpp"
+
+#include <boost/asio/buffer.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/strand.hpp>
+#include <boost/asio/write.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class read3_test : public websocket_test_suite
+{
+public:
+ void
+ testSuspend()
+ {
+ // suspend on read block
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 1);
+ });
+ while(! ws.impl_->rd_block.is_locked())
+ ioc.run_one();
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on release read block
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BOOST_ASSERT(ws.impl_->rd_block.is_locked());
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 1);
+ });
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on write pong
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // insert a ping
+ ws.next_layer().append(string_view(
+ "\x89\x00", 2));
+ std::size_t count = 0;
+ std::string const s = "Hello, world";
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ ++count;
+ });
+ BEAST_EXPECT(ws.impl_->rd_block.is_locked());
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == s.size());
+ ++count;
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // Ignore ping when closing
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ // insert fragmented message with
+ // a ping in between the frames.
+ ws.next_layer().append(string_view(
+ "\x01\x01*"
+ "\x89\x00"
+ "\x80\x01*", 8));
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(buffers_to_string(b.data()) == "**");
+ BEAST_EXPECT(++count == 1);
+ b.consume(b.size());
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 3);
+ });
+ });
+ BEAST_EXPECT(ws.impl_->rd_block.is_locked());
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ioc.run();
+ BEAST_EXPECT(count == 3);
+ });
+
+ // See if we are already closing
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ // insert fragmented message with
+ // a close in between the frames.
+ ws.next_layer().append(string_view(
+ "\x01\x01*"
+ "\x88\x00"
+ "\x80\x01*", 8));
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 2);
+ });
+ BEAST_EXPECT(ws.impl_->rd_block.is_locked());
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(++count == 1);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+ }
+
+ void
+ testParseFrame()
+ {
+ auto const bad =
+ [&](string_view s)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.next_layer().append(s);
+ error_code ec;
+ multi_buffer b;
+ ws.read(b, ec);
+ BEAST_EXPECT(ec);
+ };
+
+ // chopped frame header
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.next_layer().append(
+ "\x81\x7e\x01");
+ std::size_t count = 0;
+ std::string const s(257, '*');
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+ ioc.run_one();
+ es.stream().write_some(
+ net::buffer("\x01" + s));
+ ioc.run();
+ BEAST_EXPECT(count == 1);
+ }
+
+ // new data frame when continuation expected
+ bad("\x01\x01*" "\x81\x01*");
+
+ // reserved bits not cleared
+ bad("\xb1\x01*");
+ bad("\xc1\x01*");
+ bad("\xd1\x01*");
+
+ // continuation without an active message
+ bad("\x80\x01*");
+
+ // reserved bits not cleared (cont)
+ bad("\x01\x01*" "\xb0\x01*");
+ bad("\x01\x01*" "\xc0\x01*");
+ bad("\x01\x01*" "\xd0\x01*");
+
+ // reserved opcode
+ bad("\x83\x01*");
+
+ // fragmented control message
+ bad("\x09\x01*");
+
+ // invalid length for control message
+ bad("\x89\x7e\x01\x01");
+
+ // reserved bits not cleared (control)
+ bad("\xb9\x01*");
+ bad("\xc9\x01*");
+ bad("\xd9\x01*");
+
+ // unmasked frame from client
+ {
+ echo_server es{log, kind::async_client};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ es.async_handshake();
+ ws.accept();
+ ws.next_layer().append(
+ "\x81\x01*");
+ error_code ec;
+ multi_buffer b;
+ ws.read(b, ec);
+ BEAST_EXPECT(ec);
+ }
+
+ // masked frame from server
+ bad("\x81\x80\xff\xff\xff\xff");
+
+ // chopped control frame payload
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.next_layer().append(
+ "\x89\x02*");
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ BEAST_EXPECTS(! ec, ec.message());
+ BEAST_EXPECT(buffers_to_string(b.data()) == "**");
+ });
+ ioc.run_one();
+ es.stream().write_some(
+ net::buffer(
+ "*" "\x81\x02**"));
+ ioc.run();
+ BEAST_EXPECT(count == 1);
+ }
+
+ // length not canonical
+ bad(string_view("\x81\x7e\x00\x7d", 4));
+ bad(string_view("\x81\x7f\x00\x00\x00\x00\x00\x00\xff\xff", 10));
+ }
+
+ void
+ testIssue802()
+ {
+ for(std::size_t i = 0; i < 100; ++i)
+ {
+ echo_server es{log, kind::async};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // too-big message frame indicates payload of 2^64-1
+ net::write(ws.next_layer(), sbuf(
+ "\x81\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"));
+ multi_buffer b;
+ error_code ec;
+ ws.read(b, ec);
+ BEAST_EXPECT(ec == error::closed);
+ BEAST_EXPECT(ws.reason().code == 1009);
+ }
+ }
+
+ void
+ testIssue807()
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.write(sbuf("Hello, world!"));
+ char buf[4];
+ net::mutable_buffer b{buf, 0};
+ auto const n = ws.read_some(b);
+ BEAST_EXPECT(n == 0);
+ }
+
+ /*
+ When the internal read buffer contains a control frame and
+ stream::async_read_some is called, it is possible for the control
+ callback to be invoked on the caller's stack instead of through
+ the executor associated with the final completion handler.
+ */
+ void
+ testIssue954()
+ {
+ echo_server es{log};
+ multi_buffer b;
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // message followed by ping
+ ws.next_layer().append({
+ "\x81\x00"
+ "\x89\x00",
+ 4});
+ bool called_cb = false;
+ bool called_handler = false;
+ ws.control_callback(
+ [&called_cb](frame_type, string_view)
+ {
+ called_cb = true;
+ });
+ ws.async_read(b,
+ [&](error_code, std::size_t)
+ {
+ called_handler = true;
+ });
+ BEAST_EXPECT(! called_cb);
+ BEAST_EXPECT(! called_handler);
+ ioc.run();
+ BEAST_EXPECT(! called_cb);
+ BEAST_EXPECT(called_handler);
+ ws.async_read(b,
+ [&](error_code, std::size_t)
+ {
+ });
+ BEAST_EXPECT(! called_cb);
+ }
+
+ /* Bishop Fox Hybrid Assessment issue 1
+
+ Happens with permessage-deflate enabled and a
+ compressed frame with the FIN bit set ends with an
+ invalid prefix.
+ */
+ void
+ testIssueBF1()
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = true;
+ pmd.server_enable = true;
+
+ // read
+#if 0
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.set_option(pmd);
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // invalid 1-byte deflate block in frame
+ net::write(ws.next_layer(), sbuf(
+ "\xc1\x81\x3a\xa1\x74\x3b\x49"));
+ }
+#endif
+ {
+ net::io_context ioc;
+ stream<test::stream> wsc{ioc};
+ stream<test::stream> wss{ioc};
+ wsc.set_option(pmd);
+ wss.set_option(pmd);
+ wsc.next_layer().connect(wss.next_layer());
+ wsc.async_handshake(
+ "localhost", "/", [](error_code){});
+ wss.async_accept([](error_code){});
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(wsc.is_open());
+ BEAST_EXPECT(wss.is_open());
+ // invalid 1-byte deflate block in frame
+ net::write(wsc.next_layer(), sbuf(
+ "\xc1\x81\x3a\xa1\x74\x3b\x49"));
+ error_code ec;
+ multi_buffer b;
+ wss.read(b, ec);
+ BEAST_EXPECTS(ec == zlib::error::end_of_stream, ec.message());
+ }
+
+ // async read
+#if 0
+ {
+ echo_server es{log, kind::async};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.set_option(pmd);
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // invalid 1-byte deflate block in frame
+ net::write(ws.next_layer(), sbuf(
+ "\xc1\x81\x3a\xa1\x74\x3b\x49"));
+ }
+#endif
+ {
+ net::io_context ioc;
+ stream<test::stream> wsc{ioc};
+ stream<test::stream> wss{ioc};
+ wsc.set_option(pmd);
+ wss.set_option(pmd);
+ wsc.next_layer().connect(wss.next_layer());
+ wsc.async_handshake(
+ "localhost", "/", [](error_code){});
+ wss.async_accept([](error_code){});
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(wsc.is_open());
+ BEAST_EXPECT(wss.is_open());
+ // invalid 1-byte deflate block in frame
+ net::write(wsc.next_layer(), sbuf(
+ "\xc1\x81\x3a\xa1\x74\x3b\x49"));
+ error_code ec;
+ flat_buffer b;
+ wss.async_read(b,
+ [&ec](error_code ec_, std::size_t){ ec = ec_; });
+ ioc.run();
+ BEAST_EXPECTS(ec == zlib::error::end_of_stream, ec.message());
+ }
+ }
+
+ /* Bishop Fox Hybrid Assessment issue 2
+
+ Happens with permessage-deflate enabled,
+ and a deflate block with the BFINAL bit set
+ is encountered in a compressed payload.
+ */
+ void
+ testIssueBF2()
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = true;
+ pmd.server_enable = true;
+
+ // read
+ {
+ net::io_context ioc;
+ stream<test::stream> wsc{ioc};
+ stream<test::stream> wss{ioc};
+ wsc.set_option(pmd);
+ wss.set_option(pmd);
+ wsc.next_layer().connect(wss.next_layer());
+ wsc.async_handshake(
+ "localhost", "/", [](error_code){});
+ wss.async_accept([](error_code){});
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(wsc.is_open());
+ BEAST_EXPECT(wss.is_open());
+ // contains a deflate block with BFINAL set
+ net::write(wsc.next_layer(), sbuf(
+ "\xc1\xf8\xd1\xe4\xcc\x3e\xda\xe4\xcc\x3e"
+ "\x2b\x1e\x36\xc4\x2b\x1e\x36\xc4\x2b\x1e"
+ "\x36\x3e\x35\xae\x4f\x54\x18\xae\x4f\x7b"
+ "\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e"
+ "\xd1\x1e\x36\xc4\x2b\x1e\x36\xc4\x2b\xe4"
+ "\x28\x74\x52\x8e\x05\x74\x52\xa1\xcc\x3e"
+ "\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e"
+ "\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4\x36\x3e"
+ "\xd1\xec\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e"));
+ error_code ec;
+ flat_buffer b;
+ wss.read(b, ec);
+ BEAST_EXPECTS(ec == zlib::error::end_of_stream, ec.message());
+ }
+
+ // async read
+ {
+ net::io_context ioc;
+ stream<test::stream> wsc{ioc};
+ stream<test::stream> wss{ioc};
+ wsc.set_option(pmd);
+ wss.set_option(pmd);
+ wsc.next_layer().connect(wss.next_layer());
+ wsc.async_handshake(
+ "localhost", "/", [](error_code){});
+ wss.async_accept([](error_code){});
+ ioc.run();
+ ioc.restart();
+ BEAST_EXPECT(wsc.is_open());
+ BEAST_EXPECT(wss.is_open());
+ // contains a deflate block with BFINAL set
+ net::write(wsc.next_layer(), sbuf(
+ "\xc1\xf8\xd1\xe4\xcc\x3e\xda\xe4\xcc\x3e"
+ "\x2b\x1e\x36\xc4\x2b\x1e\x36\xc4\x2b\x1e"
+ "\x36\x3e\x35\xae\x4f\x54\x18\xae\x4f\x7b"
+ "\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e"
+ "\xd1\x1e\x36\xc4\x2b\x1e\x36\xc4\x2b\xe4"
+ "\x28\x74\x52\x8e\x05\x74\x52\xa1\xcc\x3e"
+ "\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e"
+ "\xd1\xe4\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4\x36\x3e"
+ "\xd1\xec\xcc\x3e\xd1\xe4\xcc\x3e\xd1\xe4"
+ "\xcc\x3e\xd1\xe4\xcc\x3e"));
+ error_code ec;
+ flat_buffer b;
+ wss.async_read(b,
+ [&ec](error_code ec_, std::size_t){ ec = ec_; });
+ ioc.run();
+ BEAST_EXPECTS(ec == zlib::error::end_of_stream, ec.message());
+ }
+ }
+
+ void
+ testMoveOnly()
+ {
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.async_read_some(
+ net::mutable_buffer{},
+ move_only_handler{});
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void
+ testAsioHandlerInvoke()
+ {
+ // make sure things compile, also can set a
+ // breakpoint in asio_handler_invoke to make sure
+ // it is instantiated.
+ {
+ net::io_context ioc;
+ net::strand<
+ net::io_context::executor_type> s(
+ ioc.get_executor());
+ stream<test::stream> ws{ioc};
+ flat_buffer b;
+ ws.async_read(b, net::bind_executor(
+ s, copyable_handler{}));
+ }
+ }
+
+ void
+ run() override
+ {
+ testParseFrame();
+ testIssue802();
+ testIssue807();
+ testIssue954();
+ testIssueBF1();
+ testIssueBF2();
+ testMoveOnly();
+ testAsioHandlerInvoke();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,read3);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/rfc6455.cpp b/src/boost/libs/beast/test/beast/websocket/rfc6455.cpp
new file mode 100644
index 000000000..97db0222d
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/rfc6455.cpp
@@ -0,0 +1,51 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/rfc6455.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class rfc6455_test
+ : public beast::unit_test::suite
+{
+public:
+ void
+ test_is_upgrade()
+ {
+ http::header<true> req;
+ req.version(10);
+ BEAST_EXPECT(! is_upgrade(req));
+ req.version(11);
+ req.method(http::verb::post);
+ req.target("/");
+ BEAST_EXPECT(! is_upgrade(req));
+ req.method(http::verb::get);
+ req.insert("Connection", "upgrade");
+ BEAST_EXPECT(! is_upgrade(req));
+ req.insert("Upgrade", "websocket");
+ BEAST_EXPECT(is_upgrade(req));
+ }
+
+ void
+ run() override
+ {
+ test_is_upgrade();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,rfc6455);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/ssl.cpp b/src/boost/libs/beast/test/beast/websocket/ssl.cpp
new file mode 100644
index 000000000..cbb64eea4
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/ssl.cpp
@@ -0,0 +1,74 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// VFALCO This causes a compilation error
+#include <boost/beast/websocket/stream.hpp>
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/ssl.hpp>
+
+#include <boost/beast/websocket/stream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/executor.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/ssl.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class ssl_test : public unit_test::suite
+{
+public:
+ template<class Socket>
+ void
+ testTeardown()
+ {
+ net::io_context ioc;
+ net::ssl::context ctx(net::ssl::context::tlsv12);
+ Socket ss(ioc, ctx);
+
+ struct handler
+ {
+ void
+ operator()(error_code)
+ {
+ }
+ };
+
+ websocket::stream<Socket> ws(ioc, ctx);
+
+ BEAST_EXPECT(static_cast<
+ void(websocket::stream<Socket>::*)(
+ close_reason const&)>(
+ &websocket::stream<Socket>::close));
+
+ BEAST_EXPECT(static_cast<
+ void(websocket::stream<Socket>::*)(
+ close_reason const&, error_code&)>(
+ &websocket::stream<Socket>::close));
+ }
+
+ void
+ run() override
+ {
+ testTeardown<
+ boost::asio::ssl::stream<
+ boost::asio::basic_stream_socket<
+ boost::asio::ip::tcp,
+ boost::asio::executor>>>();
+
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,ssl);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/stream.cpp b/src/boost/libs/beast/test/beast/websocket/stream.cpp
new file mode 100644
index 000000000..5b1028d0b
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/stream.cpp
@@ -0,0 +1,206 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/core/tcp_stream.hpp>
+#include <boost/asio/strand.hpp>
+
+#include "test.hpp"
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class stream_test : public websocket_test_suite
+{
+public:
+ void
+ testGetSetOption()
+ {
+ net::io_context ioc;
+ stream<test::stream> ws(ioc);
+
+ {
+ ws.set_option(
+ stream_base::decorator(
+ [](request_type&)
+ {
+ }));
+
+ ws.set_option(
+ stream_base::decorator(
+ [](response_type&)
+ {
+ }));
+ }
+
+ {
+ ws.set_option(
+ stream_base::timeout::suggested(
+ role_type::client));
+
+ ws.set_option(
+ stream_base::timeout::suggested(
+ role_type::server));
+
+ ws.set_option({
+ std::chrono::seconds(30),
+ std::chrono::seconds(300),
+ true});
+
+ stream_base::timeout opt;
+ ws.get_option(opt);
+ ws.set_option(opt);
+ }
+ }
+
+ void
+ testOptions()
+ {
+ {
+ std::seed_seq ss{42};
+ seed_prng(ss);
+ }
+
+ stream<test::stream> ws{ioc_};
+ ws.auto_fragment(true);
+ ws.write_buffer_bytes(2048);
+ ws.binary(false);
+ ws.read_message_max(1 * 1024 * 1024);
+ try
+ {
+ ws.write_buffer_bytes(7);
+ fail();
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+
+ ws.secure_prng(true);
+ ws.secure_prng(false);
+
+ auto const bad =
+ [&](permessage_deflate const& pmd)
+ {
+ stream<test::stream> ws{ioc_};
+ try
+ {
+ ws.set_option(pmd);
+ fail("", __FILE__, __LINE__);
+ }
+ catch(std::exception const&)
+ {
+ pass();
+ }
+ };
+
+ {
+ permessage_deflate pmd;
+ pmd.server_max_window_bits = 16;
+ bad(pmd);
+ }
+
+ {
+ permessage_deflate pmd;
+ pmd.server_max_window_bits = 8;
+ bad(pmd);
+ }
+
+ {
+ permessage_deflate pmd;
+ pmd.client_max_window_bits = 16;
+ bad(pmd);
+ }
+
+ {
+ permessage_deflate pmd;
+ pmd.client_max_window_bits = 8;
+ bad(pmd);
+ }
+
+ {
+ permessage_deflate pmd;
+ pmd.compLevel = -1;
+ bad(pmd);
+ }
+
+ {
+ permessage_deflate pmd;
+ pmd.compLevel = 10;
+ bad(pmd);
+ }
+
+ {
+ permessage_deflate pmd;
+ pmd.memLevel = 0;
+ bad(pmd);
+ }
+
+ {
+ permessage_deflate pmd;
+ pmd.memLevel = 10;
+ bad(pmd);
+ }
+ }
+
+ void
+ testJavadoc()
+ {
+ net::io_context ioc;
+ {
+ websocket::stream<tcp_stream> ws{net::make_strand(ioc)};
+ }
+ {
+ websocket::stream<tcp_stream> ws(ioc);
+ }
+ }
+
+ void
+ run() override
+ {
+ BOOST_STATIC_ASSERT(std::is_constructible<
+ stream<test::stream>, net::io_context&>::value);
+
+ BOOST_STATIC_ASSERT(std::is_move_constructible<
+ stream<test::stream>>::value);
+
+ #if 0
+ BOOST_STATIC_ASSERT(std::is_move_assignable<
+ stream<test::stream>>::value);
+ #endif
+
+ BOOST_STATIC_ASSERT(std::is_constructible<
+ stream<test::stream&>, test::stream&>::value);
+
+ // VFALCO Should these be allowed for NextLayer references?
+ BOOST_STATIC_ASSERT(std::is_move_constructible<
+ stream<test::stream&>>::value);
+ #if 0
+ BOOST_STATIC_ASSERT(std::is_move_assignable<
+ stream<test::stream&>>::value);
+ #endif
+
+ log << "sizeof(websocket::stream) == " <<
+ sizeof(websocket::stream<test::stream&>) << std::endl;
+ log << "sizeof(websocket::stream::impl_type) == " <<
+ sizeof(websocket::stream<test::stream&>::impl_type) << std::endl;
+
+ testOptions();
+ testJavadoc();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,stream);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/stream_base.cpp b/src/boost/libs/beast/test/beast/websocket/stream_base.cpp
new file mode 100644
index 000000000..e61a51ed4
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/stream_base.cpp
@@ -0,0 +1,73 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream_base.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class stream_base_test : public unit_test::suite
+{
+public:
+ struct T1
+ {
+ void operator()(request_type&);
+ };
+
+ struct T2
+ {
+ void operator()(response_type&);
+ };
+
+ struct T3
+ {
+ void operator()(request_type&);
+ void operator()(response_type&);
+ };
+
+ struct T4
+ {
+ template<class T>
+ void operator()(T&);
+ };
+
+ struct T5
+ {
+ void operator()();
+ };
+
+ BOOST_STATIC_ASSERT(detail::is_decorator<T1>::value);
+ BOOST_STATIC_ASSERT(detail::is_decorator<T2>::value);
+ BOOST_STATIC_ASSERT(detail::is_decorator<T3>::value);
+ BOOST_STATIC_ASSERT(detail::is_decorator<T4>::value);
+ BOOST_STATIC_ASSERT(! detail::is_decorator<T5>::value);
+ BOOST_STATIC_ASSERT(! detail::is_decorator<int>::value);
+
+ void
+ testJavadoc()
+ {
+ }
+
+ void
+ run() override
+ {
+ testJavadoc();
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,stream_base);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/stream_explicit.cpp b/src/boost/libs/beast/test/beast/websocket/stream_explicit.cpp
new file mode 100644
index 000000000..5a7bdccc1
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/stream_explicit.cpp
@@ -0,0 +1,23 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/core/detail/config.hpp>
+#include <boost/asio/ip/tcp.hpp>
+
+namespace boost {
+namespace beast {
+
+template class websocket::stream<net::ip::tcp::socket, false>;
+template class websocket::stream<net::ip::tcp::socket, true>;
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/stream_fwd.cpp b/src/boost/libs/beast/test/beast/websocket/stream_fwd.cpp
new file mode 100644
index 000000000..7622f4ffa
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/stream_fwd.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream_fwd.hpp>
diff --git a/src/boost/libs/beast/test/beast/websocket/teardown.cpp b/src/boost/libs/beast/test/beast/websocket/teardown.cpp
new file mode 100644
index 000000000..ce1518dce
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/teardown.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/teardown.hpp>
diff --git a/src/boost/libs/beast/test/beast/websocket/test.hpp b/src/boost/libs/beast/test/beast/websocket/test.hpp
new file mode 100644
index 000000000..b4c90d2b7
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/test.hpp
@@ -0,0 +1,1590 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BEAST_TEST_WEBSOCKET_TEST_HPP
+#define BEAST_TEST_WEBSOCKET_TEST_HPP
+
+#include <boost/beast/core/bind_handler.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/websocket/stream.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/test/yield_to.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/executor_work_guard.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/optional.hpp>
+#include <cstdlib>
+#include <memory>
+#include <random>
+#include <string>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class websocket_test_suite
+ : public beast::unit_test::suite
+ , public test::enable_yield_to
+{
+public:
+ template<bool deflateSupported>
+ using ws_type_t =
+ websocket::stream<test::stream&, deflateSupported>;
+
+ using ws_type =
+ websocket::stream<test::stream&>;
+
+ struct move_only_handler
+ {
+ move_only_handler() = default;
+ move_only_handler(move_only_handler&&) = default;
+ move_only_handler(move_only_handler const&) = delete;
+
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ enum class kind
+ {
+ sync,
+ async,
+ async_client
+ };
+
+ class echo_server
+ {
+ enum
+ {
+ buf_size = 20000
+ };
+
+ std::ostream& log_;
+ net::io_context ioc_;
+ net::executor_work_guard<
+ net::io_context::executor_type> work_;
+ static_buffer<buf_size> buffer_;
+ test::stream ts_;
+ std::thread t_;
+ websocket::stream<test::stream&> ws_;
+ bool close_ = false;
+
+ public:
+ explicit
+ echo_server(
+ std::ostream& log,
+ kind k = kind::sync)
+ : log_(log)
+ , work_(ioc_.get_executor())
+ , ts_(ioc_)
+ , ws_(ts_)
+ {
+ permessage_deflate pmd;
+ pmd.server_enable = true;
+ pmd.server_max_window_bits = 9;
+ pmd.compLevel = 1;
+ ws_.set_option(pmd);
+
+ switch(k)
+ {
+ case kind::sync:
+ t_ = std::thread{[&]{ do_sync(); }};
+ break;
+
+ case kind::async:
+ t_ = std::thread{[&]{ ioc_.run(); }};
+ do_accept();
+ break;
+
+ case kind::async_client:
+ t_ = std::thread{[&]{ ioc_.run(); }};
+ break;
+ }
+ }
+
+ ~echo_server()
+ {
+ work_.reset();
+ t_.join();
+ }
+
+ test::stream&
+ stream()
+ {
+ return ts_;
+ }
+
+ void
+ async_handshake()
+ {
+ ws_.async_handshake("localhost", "/",
+ bind_front_handler(
+ &echo_server::on_handshake,
+ this));
+ }
+
+ void
+ async_close()
+ {
+ net::post(ioc_,
+ [&]
+ {
+ if(ws_.is_open())
+ {
+ ws_.async_close({},
+ bind_front_handler(
+ &echo_server::on_close,
+ this));
+ }
+ else
+ {
+ close_ = true;
+ }
+ });
+ }
+
+ private:
+ void
+ do_sync()
+ {
+ try
+ {
+ ws_.accept();
+ for(;;)
+ {
+ ws_.read(buffer_);
+ ws_.text(ws_.got_text());
+ ws_.write(buffer_.data());
+ buffer_.consume(buffer_.size());
+ }
+ }
+ catch(system_error const& se)
+ {
+ boost::ignore_unused(se);
+ #if 0
+ if( se.code() != error::closed &&
+ se.code() != error::failed &&
+ se.code() != net::error::eof)
+ log_ << "echo_server: " << se.code().message() << std::endl;
+ #endif
+ }
+ catch(std::exception const& e)
+ {
+ log_ << "echo_server: " << e.what() << std::endl;
+ }
+ }
+
+ void
+ do_accept()
+ {
+ ws_.async_accept(
+ bind_front_handler(
+ &echo_server::on_accept,
+ this));
+ }
+
+ void
+ on_handshake(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+
+ do_read();
+ }
+
+ void
+ on_accept(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+
+ if(close_)
+ {
+ return ws_.async_close({},
+ bind_front_handler(
+ &echo_server::on_close,
+ this));
+ }
+
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ ws_.async_read(buffer_,
+ beast::bind_front_handler(
+ &echo_server::on_read,
+ this));
+ }
+
+ void
+ on_read(error_code ec, std::size_t)
+ {
+ if(ec)
+ return fail(ec);
+ ws_.text(ws_.got_text());
+ ws_.async_write(buffer_.data(),
+ beast::bind_front_handler(
+ &echo_server::on_write,
+ this));
+ }
+
+ void
+ on_write(error_code ec, std::size_t)
+ {
+ if(ec)
+ return fail(ec);
+ buffer_.consume(buffer_.size());
+ do_read();
+ }
+
+ void
+ on_close(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+ }
+
+ void
+ fail(error_code ec)
+ {
+ boost::ignore_unused(ec);
+ #if 0
+ if( ec != error::closed &&
+ ec != error::failed &&
+ ec != net::error::eof)
+ log_ <<
+ "echo_server_async: " <<
+ ec.message() <<
+ std::endl;
+ #endif
+ }
+ };
+
+ template<class Test>
+ void
+ doFailLoop(
+ Test const& f, std::size_t limit = 200)
+ {
+ std::size_t n;
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ try
+ {
+ f(fc);
+ break;
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == test::error::test_failure,
+ se.code().message());
+ }
+ }
+ BEAST_EXPECT(n < limit);
+ }
+
+ template<class Test>
+ void
+ doStreamLoop(Test const& f)
+ {
+ // This number has to be high for the
+ // test that writes the large buffer.
+ static std::size_t constexpr limit = 200;
+
+ doFailLoop(
+ [&](test::fail_count& fc)
+ {
+ test::stream ts{ioc_, fc};
+ f(ts);
+ ts.close();
+ }
+ , limit);
+ }
+
+ template<bool deflateSupported = true, class Test>
+ void
+ doTest(
+ permessage_deflate const& pmd,
+ Test const& f)
+ {
+ // This number has to be high for the
+ // test that writes the large buffer.
+ static std::size_t constexpr limit = 200;
+
+ for(int i = 0; i < 2; ++i)
+ {
+ std::size_t n;
+ for(n = 0; n < limit; ++n)
+ {
+ test::fail_count fc{n};
+ test::stream ts{ioc_, fc};
+ ws_type_t<deflateSupported> ws{ts};
+ ws.set_option(pmd);
+
+ echo_server es{log, i==1 ?
+ kind::async : kind::sync};
+ error_code ec;
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/", ec);
+ if(ec)
+ {
+ ts.close();
+ if( ! BEAST_EXPECTS(
+ ec == test::error::test_failure,
+ ec.message()))
+ BOOST_THROW_EXCEPTION(system_error{ec});
+ continue;
+ }
+ try
+ {
+ f(ws);
+ ts.close();
+ break;
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == test::error::test_failure,
+ se.code().message());
+ }
+ catch(std::exception const& e)
+ {
+ fail(e.what(), __FILE__, __LINE__);
+ }
+ ts.close();
+ continue;
+ }
+ BEAST_EXPECT(n < limit);
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ net::const_buffer cbuf(std::initializer_list<std::uint8_t> bytes)
+ {
+ return {bytes.begin(), bytes.size()};
+ }
+
+ template<std::size_t N>
+ static
+ net::const_buffer
+ sbuf(const char (&s)[N])
+ {
+ return net::const_buffer(&s[0], N-1);
+ }
+
+ template<
+ class DynamicBuffer,
+ class ConstBufferSequence>
+ void
+ put(
+ DynamicBuffer& buffer,
+ ConstBufferSequence const& buffers)
+ {
+ buffer.commit(net::buffer_copy(
+ buffer.prepare(buffer_bytes(buffers)),
+ buffers));
+ }
+
+ template<class Pred>
+ bool
+ run_until(net::io_context& ioc,
+ std::size_t limit, Pred&& pred)
+ {
+ for(std::size_t i = 0; i < limit; ++i)
+ {
+ if(pred())
+ return true;
+ ioc.run_one();
+ }
+ return false;
+ }
+
+ template<class Pred>
+ bool
+ run_until(
+ net::io_context& ioc, Pred&& pred)
+ {
+ return run_until(ioc, 100, pred);
+ }
+
+ inline
+ std::string const&
+ random_string()
+ {
+ static std::string const s = []
+ {
+ std::size_t constexpr N = 16384;
+ std::mt19937 mt{1};
+ std::string tmp;
+ tmp.reserve(N);
+ for(std::size_t i = 0; i < N; ++ i)
+ tmp.push_back(static_cast<char>(
+ std::uniform_int_distribution<
+ unsigned>{0, 255}(mt)));
+ return tmp;
+ }();
+ return s;
+ }
+
+ //--------------------------------------------------------------------------
+
+ struct SyncClient
+ {
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(
+ stream<NextLayer, deflateSupported>& ws) const
+ {
+ ws.accept();
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept(stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers) const
+ {
+ ws.accept(buffers);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req) const
+ {
+ ws.accept(req);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Decorator const& d) const
+ {
+ ws.accept_ex(d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ ws.accept_ex(buffers, d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Decorator const& d) const
+ {
+ ws.accept_ex(req, d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ ws.accept_ex(req, buffers, d);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ handshake(
+ stream<NextLayer, deflateSupported>& ws,
+ string_view uri,
+ string_view path) const
+ {
+ ws.handshake(uri, path);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ handshake(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path) const
+ {
+ ws.handshake(res, uri, path);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ string_view uri,
+ string_view path,
+ Decorator const& d) const
+ {
+ ws.handshake_ex(uri, path, d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path,
+ Decorator const& d) const
+ {
+ ws.handshake_ex(res, uri, path, d);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ ping(stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ ws.ping(payload);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ pong(stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ ws.pong(payload);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ close(stream<NextLayer, deflateSupported>& ws,
+ close_reason const& cr) const
+ {
+ ws.close(cr);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read(stream<NextLayer, deflateSupported>& ws,
+ DynamicBuffer& buffer) const
+ {
+ return ws.read(buffer);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ std::size_t limit,
+ DynamicBuffer& buffer) const
+ {
+ return ws.read_some(buffer, limit);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class MutableBufferSequence>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ MutableBufferSequence const& buffers) const
+ {
+ return ws.read_some(buffers);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ return ws.write(buffers);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_some(
+ stream<NextLayer, deflateSupported>& ws,
+ bool fin,
+ ConstBufferSequence const& buffers) const
+ {
+ return ws.write_some(fin, buffers);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_raw(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ return net::write(
+ ws.next_layer(), buffers);
+ }
+ };
+
+ //--------------------------------------------------------------------------
+
+ class AsyncClient
+ {
+ net::yield_context& yield_;
+
+ public:
+ explicit
+ AsyncClient(net::yield_context& yield)
+ : yield_(yield)
+ {
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(stream<NextLayer, deflateSupported>& ws) const
+ {
+ error_code ec;
+ ws.async_accept(yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept(
+ stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers) const
+ {
+ error_code ec;
+ ws.async_accept(buffers, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req) const
+ {
+ error_code ec;
+ ws.async_accept(req, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(d, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(buffers, d, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(req, d, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(
+ req, buffers, d, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported>
+ void
+ handshake(
+ stream<NextLayer, deflateSupported>& ws,
+ string_view uri,
+ string_view path) const
+ {
+ error_code ec;
+ ws.async_handshake(
+ uri, path, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ handshake(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path) const
+ {
+ error_code ec;
+ ws.async_handshake(
+ res, uri, path, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ string_view uri,
+ string_view path,
+ Decorator const &d) const
+ {
+ error_code ec;
+ ws.async_handshake_ex(
+ uri, path, d, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path,
+ Decorator const &d) const
+ {
+ error_code ec;
+ ws.async_handshake_ex(
+ res, uri, path, d, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ ping(
+ stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ error_code ec;
+ ws.async_ping(payload, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ pong(
+ stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ error_code ec;
+ ws.async_pong(payload, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ close(
+ stream<NextLayer, deflateSupported>& ws,
+ close_reason const& cr) const
+ {
+ error_code ec;
+ ws.async_close(cr, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read(
+ stream<NextLayer, deflateSupported>& ws,
+ DynamicBuffer& buffer) const
+ {
+ error_code ec;
+ auto const bytes_written =
+ ws.async_read(buffer, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ return bytes_written;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ std::size_t limit,
+ DynamicBuffer& buffer) const
+ {
+ error_code ec;
+ auto const bytes_written =
+ ws.async_read_some(buffer, limit, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ return bytes_written;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class MutableBufferSequence>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ MutableBufferSequence const& buffers) const
+ {
+ error_code ec;
+ auto const bytes_written =
+ ws.async_read_some(buffers, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ return bytes_written;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ error_code ec;
+ auto const bytes_transferred =
+ ws.async_write(buffers, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ return bytes_transferred;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_some(
+ stream<NextLayer, deflateSupported>& ws,
+ bool fin,
+ ConstBufferSequence const& buffers) const
+ {
+ error_code ec;
+ auto const bytes_transferred =
+ ws.async_write_some(fin, buffers, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ return bytes_transferred;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_raw(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ error_code ec;
+ auto const bytes_transferred =
+ net::async_write(
+ ws.next_layer(), buffers, yield_[ec]);
+ if(ec)
+ throw system_error{ec};
+ return bytes_transferred;
+ }
+ };
+};
+
+struct test_sync_api
+{
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(
+ stream<NextLayer, deflateSupported>& ws) const
+ {
+ ws.accept();
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept(stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers) const
+ {
+ ws.accept(buffers);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req) const
+ {
+ ws.accept(req);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Decorator const& d) const
+ {
+ ws.accept_ex(d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ ws.accept_ex(buffers, d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Decorator const& d) const
+ {
+ ws.accept_ex(req, d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ ws.accept_ex(req, buffers, d);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ handshake(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path) const
+ {
+ ws.handshake(res, uri, path);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ string_view uri,
+ string_view path,
+ Decorator const& d) const
+ {
+ ws.handshake_ex(uri, path, d);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path,
+ Decorator const& d) const
+ {
+ ws.handshake_ex(res, uri, path, d);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ ping(stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ ws.ping(payload);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ pong(stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ ws.pong(payload);
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ close(stream<NextLayer, deflateSupported>& ws,
+ close_reason const& cr) const
+ {
+ ws.close(cr);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read(stream<NextLayer, deflateSupported>& ws,
+ DynamicBuffer& buffer) const
+ {
+ return ws.read(buffer);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ std::size_t limit,
+ DynamicBuffer& buffer) const
+ {
+ return ws.read_some(buffer, limit);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class MutableBufferSequence>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ MutableBufferSequence const& buffers) const
+ {
+ return ws.read_some(buffers);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ return ws.write(buffers);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_some(
+ stream<NextLayer, deflateSupported>& ws,
+ bool fin,
+ ConstBufferSequence const& buffers) const
+ {
+ return ws.write_some(fin, buffers);
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_raw(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ return net::write(
+ ws.next_layer(), buffers);
+ }
+};
+
+//--------------------------------------------------------------------------
+
+class test_async_api
+{
+ struct handler
+ {
+ error_code& ec_;
+ std::size_t* n_ = 0;
+ bool pass_ = false;
+
+ explicit
+ handler(error_code& ec)
+ : ec_(ec)
+ {
+ }
+
+ explicit
+ handler(error_code& ec, std::size_t& n)
+ : ec_(ec)
+ , n_(&n)
+ {
+ *n_ = 0;
+ }
+
+ handler(handler&& other)
+ : ec_(other.ec_)
+ , pass_(boost::exchange(other.pass_, true))
+ {
+ }
+
+ ~handler()
+ {
+ BEAST_EXPECT(pass_);
+ }
+
+ void
+ operator()(error_code ec)
+ {
+ BEAST_EXPECT(! pass_);
+ pass_ = true;
+ ec_ = ec;
+ }
+
+ void
+ operator()(error_code ec, std::size_t n)
+ {
+ BEAST_EXPECT(! pass_);
+ pass_ = true;
+ ec_ = ec;
+ if(n_)
+ *n_ = n;
+ }
+ };
+
+public:
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(
+ stream<NextLayer, deflateSupported>& ws) const
+ {
+ error_code ec;
+ ws.async_accept(handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept(
+ stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers) const
+ {
+ error_code ec;
+ ws.async_accept(buffers, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ accept(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req) const
+ {
+ error_code ec;
+ ws.async_accept(req, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(d, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ typename std::enable_if<
+ ! http::detail::is_header<Buffers>::value>::type
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(buffers, d, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(req, d, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Buffers, class Decorator>
+ void
+ accept_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ http::request<http::empty_body> const& req,
+ Buffers const& buffers,
+ Decorator const& d) const
+ {
+ error_code ec;
+ ws.async_accept_ex(
+ req, buffers, d, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported>
+ void
+ handshake(
+ stream<NextLayer, deflateSupported>& ws,
+ string_view uri,
+ string_view path) const
+ {
+ error_code ec;
+ ws.async_handshake(
+ uri, path, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ handshake(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path) const
+ {
+ error_code ec;
+ ws.async_handshake(
+ res, uri, path, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ string_view uri,
+ string_view path,
+ Decorator const &d) const
+ {
+ error_code ec;
+ ws.async_handshake_ex(
+ uri, path, d, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class Decorator>
+ void
+ handshake_ex(
+ stream<NextLayer, deflateSupported>& ws,
+ response_type& res,
+ string_view uri,
+ string_view path,
+ Decorator const &d) const
+ {
+ error_code ec;
+ ws.async_handshake_ex(
+ res, uri, path, d, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ ping(
+ stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ error_code ec;
+ ws.async_ping(payload, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ pong(
+ stream<NextLayer, deflateSupported>& ws,
+ ping_data const& payload) const
+ {
+ error_code ec;
+ ws.async_pong(payload, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<class NextLayer, bool deflateSupported>
+ void
+ close(
+ stream<NextLayer, deflateSupported>& ws,
+ close_reason const& cr) const
+ {
+ error_code ec;
+ ws.async_close(cr, handler(ec));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read(
+ stream<NextLayer, deflateSupported>& ws,
+ DynamicBuffer& buffer) const
+ {
+ error_code ec;
+ std::size_t n;
+ ws.async_read(buffer, handler(ec, n));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ return n;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class DynamicBuffer>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ std::size_t limit,
+ DynamicBuffer& buffer) const
+ {
+ error_code ec;
+ std::size_t n;
+ ws.async_read_some(buffer, limit, handler(ec, n));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ return n;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class MutableBufferSequence>
+ std::size_t
+ read_some(
+ stream<NextLayer, deflateSupported>& ws,
+ MutableBufferSequence const& buffers) const
+ {
+ error_code ec;
+ std::size_t n;
+ ws.async_read_some(buffers, handler(ec, n));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ return n;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ error_code ec;
+ std::size_t n;
+ ws.async_write(buffers, handler(ec, n));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ return n;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_some(
+ stream<NextLayer, deflateSupported>& ws,
+ bool fin,
+ ConstBufferSequence const& buffers) const
+ {
+ error_code ec;
+ std::size_t n;
+ ws.async_write_some(fin, buffers, handler(ec, n));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ return n;
+ }
+
+ template<
+ class NextLayer, bool deflateSupported,
+ class ConstBufferSequence>
+ std::size_t
+ write_raw(
+ stream<NextLayer, deflateSupported>& ws,
+ ConstBufferSequence const& buffers) const
+ {
+ error_code ec;
+ std::size_t n;
+ net::async_write(ws.next_layer(),
+ buffers, handler(ec, n));
+ ws.get_executor().context().run();
+ ws.get_executor().context().restart();
+ if(ec)
+ throw system_error{ec};
+ return n;
+ }
+};
+
+} // websocket
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/beast/websocket/timer.cpp b/src/boost/libs/beast/test/beast/websocket/timer.cpp
new file mode 100644
index 000000000..f3507c1d1
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/timer.cpp
@@ -0,0 +1,199 @@
+
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/beast/_experimental/test/tcp.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/asio/ip/tcp.hpp>
+#include <boost/asio/detached.hpp>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+struct timer_test : unit_test::suite
+{
+ using tcp = boost::asio::ip::tcp;
+
+ void
+ testIdlePing()
+ {
+ net::io_context ioc;
+
+ // idle ping, no timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_accept(test::success_handler());
+ ws2.async_handshake("test", "/", test::success_handler());
+ test::run(ioc);
+
+ ws2.set_option(stream_base::timeout{
+ stream_base::none(),
+ std::chrono::milliseconds(100),
+ true});
+ flat_buffer b1;
+ flat_buffer b2;
+ bool received = false;
+ ws1.control_callback(
+ [&received](frame_type ft, string_view)
+ {
+ received = true;
+ BEAST_EXPECT(ft == frame_type::ping);
+ });
+ ws1.async_read(b1, test::fail_handler(
+ net::error::operation_aborted));
+ ws2.async_read(b2, test::fail_handler(
+ net::error::operation_aborted));
+ test::run_for(ioc, std::chrono::milliseconds(500));
+ BEAST_EXPECT(received);
+ }
+
+ test::run(ioc);
+
+ // idle ping, timeout
+
+ {
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+ ws1.async_accept(test::success_handler());
+ ws2.async_handshake("test", "/", test::success_handler());
+ test::run(ioc);
+
+ ws2.set_option(stream_base::timeout{
+ stream_base::none(),
+ std::chrono::milliseconds(50),
+ true});
+ flat_buffer b;
+ ws2.async_read(b,
+ test::fail_handler(beast::error::timeout));
+ test::run(ioc);
+ }
+
+ test::run(ioc);
+ }
+
+ // https://github.com/boostorg/beast/issues/1729
+ void
+ testIssue1729()
+ {
+ {
+ net::io_context ioc;
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(websocket::stream_base::timeout{
+ std::chrono::milliseconds(50),
+ websocket::stream_base::none(),
+ false});
+
+ ws1.async_accept(net::detached);
+ ws2.async_handshake(
+ "localhost", "/", net::detached);
+ ioc.run();
+ ioc.restart();
+
+ flat_buffer b;
+ error_code ec1, ec2;
+ ws1.async_close({},
+ [&ec2](error_code ec)
+ {
+ ec2 = ec;
+ });
+ ioc.run();
+ BEAST_EXPECT(
+ ec1 == beast::error::timeout ||
+ ec2 == beast::error::timeout);
+ }
+ {
+ net::io_context ioc;
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(websocket::stream_base::timeout{
+ std::chrono::milliseconds(50),
+ websocket::stream_base::none(),
+ false});
+
+ ws1.async_accept(net::detached);
+ ws2.async_handshake(
+ "localhost", "/", net::detached);
+ ioc.run();
+ ioc.restart();
+
+ flat_buffer b;
+ error_code ec1, ec2;
+ ws1.async_read(b,
+ [&ec1](error_code ec, std::size_t)
+ {
+ ec1 = ec;
+ });
+ ws1.async_close({},
+ [&ec2](error_code ec)
+ {
+ ec2 = ec;
+ });
+ ioc.run();
+ BEAST_EXPECT(
+ ec1 == beast::error::timeout ||
+ ec2 == beast::error::timeout);
+ }
+ }
+
+ // https://github.com/boostorg/beast/issues/1729#issuecomment-540481056
+ void
+ testCloseWhileRead()
+ {
+ net::io_context ioc;
+ stream<tcp::socket> ws1(ioc);
+ stream<tcp::socket> ws2(ioc);
+ test::connect(ws1.next_layer(), ws2.next_layer());
+
+ ws1.set_option(websocket::stream_base::timeout{
+ std::chrono::milliseconds(50),
+ websocket::stream_base::none(),
+ false});
+
+ ws1.async_accept(net::detached);
+ ws2.async_handshake(
+ "localhost", "/", net::detached);
+ ioc.run();
+ ioc.restart();
+
+ flat_buffer b;
+ ws1.async_read(b, test::fail_handler(
+ beast::error::timeout));
+ ws1.async_close({}, test::fail_handler(
+ net::error::operation_aborted));
+ ioc.run();
+ }
+
+ void
+ run() override
+ {
+ testIdlePing();
+ testIssue1729();
+ testCloseWhileRead();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,timer);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/utf8_checker.cpp b/src/boost/libs/beast/test/beast/websocket/utf8_checker.cpp
new file mode 100644
index 000000000..a54aee3b8
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/utf8_checker.cpp
@@ -0,0 +1,597 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/detail/utf8_checker.hpp>
+
+#include <boost/beast/core/buffers_suffix.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <array>
+
+namespace boost {
+namespace beast {
+namespace websocket {
+namespace detail {
+
+class utf8_checker_test : public beast::unit_test::suite
+{
+public:
+ void
+ testOneByteSequence()
+ {
+ // valid single-char code points
+ for(unsigned char c = 0; c < 128; ++c)
+ {
+ utf8_checker u;
+ BEAST_EXPECT(u.write(&c, 1));
+ BEAST_EXPECT(u.finish());
+ }
+
+ // invalid lead bytes
+ for(unsigned char c = 128; c < 192; ++c)
+ {
+ utf8_checker u;
+ BEAST_EXPECT(! u.write(&c, 1));
+ }
+
+ // two byte sequences
+ for(unsigned char c = 192; c < 224; ++c)
+ {
+ // fail fast
+ utf8_checker u;
+ if (c < 194)
+ BEAST_EXPECT(! u.write(&c, 1));
+ else
+ {
+ BEAST_EXPECT(u.write(&c, 1));
+ BEAST_EXPECT(! u.finish());
+ }
+ }
+
+ // three byte sequences
+ for(unsigned char c = 224; c < 240; ++c)
+ {
+ utf8_checker u;
+ BEAST_EXPECT(u.write(&c, 1));
+ BEAST_EXPECT(! u.finish());
+ }
+
+ // four byte sequences
+ for(unsigned char c = 240; c < 245; ++c)
+ {
+ // fail fast
+ utf8_checker u;
+ BEAST_EXPECT(u.write(&c, 1));
+ BEAST_EXPECT(! u.finish());
+ }
+
+ // invalid lead bytes
+ for(unsigned char c = 245; c; ++c)
+ {
+ utf8_checker u;
+ BEAST_EXPECT(! u.write(&c, 1));
+ }
+ }
+
+ void
+ testTwoByteSequence()
+ {
+ // Autobahn 6.18.1
+ {
+ utf8_checker u;
+ BEAST_EXPECT(! u.write(net::buffer("\xc1\xbf", 2)));
+ }
+
+ utf8_checker u;
+ std::uint8_t buf[2];
+ // First byte valid range 194-223
+ for(auto i : {194, 223})
+ {
+ buf[0] = static_cast<std::uint8_t>(i);
+
+ // Second byte valid range 128-191
+ for(auto j : {128, 191})
+ {
+ buf[1] = static_cast<std::uint8_t>(j);
+ BEAST_EXPECT(u.write(buf, 2));
+ BEAST_EXPECT(u.finish());
+ }
+
+ // Second byte invalid range 0-127
+ for(auto j : {0, 127})
+ {
+ buf[1] = static_cast<std::uint8_t>(j);
+ BEAST_EXPECT(! u.write(buf, 2));
+ u.reset();
+ }
+
+ // Second byte invalid range 192-255
+ for(auto j : {192, 255})
+ {
+ buf[1] = static_cast<std::uint8_t>(j);
+ BEAST_EXPECT(! u.write(buf, 2));
+ u.reset();
+ }
+
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(u.write(buf, 1));
+ BEAST_EXPECT(! u.write(&buf[1], 1));
+ u.reset();
+ }
+ }
+
+ void
+ testThreeByteSequence()
+ {
+ {
+ utf8_checker u;
+ BEAST_EXPECT(u.write(net::buffer("\xef\xbf\xbf", 3)));
+ BEAST_EXPECT(u.finish());
+ }
+ utf8_checker u;
+ std::uint8_t buf[3];
+ // First byte valid range 224-239
+ for(auto i : {224, 239})
+ {
+ buf[0] = static_cast<std::uint8_t>(i);
+
+ // Second byte valid range 128-191 or 160-191 or 128-159
+ std::int32_t const b = (i == 224 ? 160 : 128);
+ std::int32_t const e = (i == 237 ? 159 : 191);
+ for(auto j : {b, e})
+ {
+ buf[1] = static_cast<std::uint8_t>(j);
+
+ // Third byte valid range 128-191
+ for(auto k : {128, 191})
+ {
+ buf[2] = static_cast<std::uint8_t>(k);
+ BEAST_EXPECT(u.write(buf, 3));
+ BEAST_EXPECT(u.finish());
+ // Segmented sequence
+ if (i == 224)
+ {
+ BEAST_EXPECT(u.write(buf, 1));
+ BEAST_EXPECT(!u.finish());
+ }
+ else
+ {
+ BEAST_EXPECT(u.write(buf, 1));
+ BEAST_EXPECT(u.write(&buf[1], 2));
+ }
+ u.reset();
+ // Segmented sequence
+ BEAST_EXPECT(u.write(buf, 2));
+ BEAST_EXPECT(u.write(&buf[2], 1));
+ u.reset();
+
+ if (i == 224)
+ {
+ // Second byte invalid range 0-159
+ for (auto l : {0, 159})
+ {
+ buf[1] = static_cast<std::uint8_t>(l);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(!u.write(buf, 2));
+ u.reset();
+ }
+ // Second byte invalid range 192-255
+ for(auto l : {192, 255})
+ {
+ buf[1] = static_cast<std::uint8_t>(l);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(!u.write(buf, 2));
+ u.reset();
+ }
+ buf[1] = static_cast<std::uint8_t>(j);
+ }
+ else if (i == 237)
+ {
+ // Second byte invalid range 0-127
+ for(auto l : {0, 127})
+ {
+ buf[1] = static_cast<std::uint8_t>(l);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(!u.write(buf, 2));
+ u.reset();
+ }
+
+ // Second byte invalid range 160-255
+ for(auto l : {160, 255})
+ {
+ buf[1] = static_cast<std::uint8_t>(l);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(! u.write(buf, 2));
+ u.reset();
+ }
+ buf[1] = static_cast<std::uint8_t>(j);
+ }
+ }
+
+ // Third byte invalid range 0-127
+ for(auto k : {0, 127})
+ {
+ buf[2] = static_cast<std::uint8_t>(k);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ }
+
+ // Third byte invalid range 192-255
+ for(auto k : {192, 255})
+ {
+ buf[2] = static_cast<std::uint8_t>(k);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ }
+
+ // Segmented sequence third byte invalid
+ BEAST_EXPECT(u.write(buf, 2));
+ BEAST_EXPECT(! u.write(&buf[2], 1));
+ u.reset();
+ }
+
+ // Second byte invalid range 0-127 or 0-159
+ for(auto j : {0, b - 1})
+ {
+ buf[1] = static_cast<std::uint8_t>(j);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ }
+
+ // Second byte invalid range 160-255 or 192-255
+ for(auto j : {e + 1, 255})
+ {
+ buf[1] = static_cast<std::uint8_t>(j);
+ BEAST_EXPECT(! u.write(buf, 3));
+ u.reset();
+ }
+
+ // Segmented sequence second byte invalid
+ if (i == 224) {
+ BEAST_EXPECT(u.write(buf, 1));
+ BEAST_EXPECT(!u.finish());
+ }
+ else
+ {
+ BEAST_EXPECT(u.write(buf, 1));
+ BEAST_EXPECT(!u.write(&buf[1], 1));
+ }
+ u.reset();
+ }
+ }
+
+ void
+ testFourByteSequence()
+ {
+ using net::const_buffer;
+ utf8_checker u;
+ std::uint8_t buf[4];
+ // First byte valid range 240-244
+ for(auto i : {240, 244})
+ {
+ buf[0] = static_cast<std::uint8_t>(i);
+
+ std::int32_t const b = (i == 240 ? 144 : 128);
+ std::int32_t const e = (i == 244 ? 143 : 191);
+ for(auto j = b; j <= e; ++j)
+ {
+ buf[1] = static_cast<std::uint8_t>(j);
+
+ // Second byte valid range 144-191 or 128-191 or 128-143
+ for(auto k : {128, 191})
+ {
+ buf[2] = static_cast<std::uint8_t>(k);
+
+ // Third byte valid range 128-191
+ for(auto n : {128, 191})
+ {
+ // Fourth byte valid range 128-191
+ buf[3] = static_cast<std::uint8_t>(n);
+ BEAST_EXPECT(u.write(buf, 4));
+ BEAST_EXPECT(u.finish());
+ // Segmented sequence
+ BEAST_EXPECT(u.write(buf, 1));
+ BEAST_EXPECT(u.write(&buf[1], 3));
+ u.reset();
+ // Segmented sequence
+ BEAST_EXPECT(u.write(buf, 2));
+ BEAST_EXPECT(u.write(&buf[2], 2));
+ u.reset();
+ // Segmented sequence
+ BEAST_EXPECT(u.write(buf, 3));
+ BEAST_EXPECT(u.write(&buf[3], 1));
+ u.reset();
+
+ if (i == 240)
+ {
+ // Second byte invalid range 0-143
+ for(auto r : {0, 143})
+ {
+ buf[1] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(! u.write(buf, 2));
+ u.reset();
+ }
+
+ // Second byte invalid range 192-255
+ for(auto r : {192, 255})
+ {
+ buf[1] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(!u.write(buf, 2));
+ u.reset();
+ }
+ buf[1] = static_cast<std::uint8_t>(j);
+ }
+ else if (i == 244)
+ {
+ // Second byte invalid range 0-127
+ for(auto r : {0, 127})
+ {
+ buf[1] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(! u.write(buf, 2));
+ u.reset();
+ }
+ // Second byte invalid range 144-255
+ for(auto r : {144, 255})
+ {
+ buf[1] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(! u.write(buf, 2));
+ u.reset();
+ }
+ buf[1] = static_cast<std::uint8_t>(j);
+ }
+ }
+
+ // Fourth byte invalid ranges 0-127, 192-255
+ for(auto r : {0, 127, 192, 255})
+ {
+ buf[3] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ }
+
+ // Segmented sequence fourth byte invalid
+ BEAST_EXPECT(u.write(buf, 3));
+ BEAST_EXPECT(! u.write(&buf[3], 1));
+ u.reset();
+ }
+
+ // Third byte invalid ranges 0-127, 192-255
+ for(auto r : {0, 127, 192, 255})
+ {
+ buf[2] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ }
+
+ // Segmented sequence third byte invalid
+ BEAST_EXPECT(u.write(buf, 2));
+ BEAST_EXPECT(! u.write(&buf[2], 1));
+ u.reset();
+ }
+
+ // Second byte invalid range 0-127 or 0-143
+ for(auto r : {0, b - 1})
+ {
+ buf[1] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ }
+
+ // Second byte invalid range 144-255 or 192-255
+ for(auto r : {e + 1, 255})
+ {
+ buf[1] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ }
+
+ // Segmented sequence second byte invalid
+ BEAST_EXPECT(u.write(buf, 1));
+ BEAST_EXPECT(! u.write(&buf[1], 1));
+
+ u.reset();
+ }
+
+ // First byte invalid range 245-255
+ for(auto r : {245, 255})
+ {
+ buf[0] = static_cast<std::uint8_t>(r);
+ BEAST_EXPECT(! u.write(buf, 4));
+ u.reset();
+ }
+ }
+
+ void
+ testWithStreamBuffer()
+ {
+ {
+ // Valid UTF8 encoded text
+ std::vector<std::vector<std::uint8_t>> const data{{
+ 0x48,0x65,0x69,0x7A,0xC3,0xB6,0x6C,0x72,0xC3,0xBC,0x63,0x6B,
+ 0x73,0x74,0x6F,0xC3,0x9F,0x61,0x62,0x64,0xC3,0xA4,0x6D,0x70,
+ 0x66,0x75,0x6E,0x67
+ }, {
+ 0xCE,0x93,0xCE,0xB1,0xCE,0xB6,0xCE,0xAD,0xCE,0xB5,0xCF,0x82,
+ 0x20,0xCE,0xBA,0xCE,0xB1,0xE1,0xBD,0xB6,0x20,0xCE,0xBC,0xCF,
+ 0x85,0xCF,0x81,0xCF,0x84,0xCE,0xB9,0xE1,0xBD,0xB2,0xCF,0x82,
+ 0x20,0xCE,0xB4,0xE1,0xBD,0xB2,0xCE,0xBD,0x20,0xCE,0xB8,0xE1,
+ 0xBD,0xB0,0x20,0xCE,0xB2,0xCF,0x81,0xE1,0xBF,0xB6,0x20,0xCF,
+ 0x80,0xCE,0xB9,0xE1,0xBD,0xB0,0x20,0xCF,0x83,0xCF,0x84,0xE1,
+ 0xBD,0xB8,0x20,0xCF,0x87,0xCF,0x81,0xCF,0x85,0xCF,0x83,0xCE,
+ 0xB1,0xCF,0x86,0xE1,0xBD,0xB6,0x20,0xCE,0xBE,0xCE,0xAD,0xCF,
+ 0x86,0xCF,0x89,0xCF,0x84,0xCE,0xBF
+ }, {
+ 0xC3,0x81,0x72,0x76,0xC3,0xAD,0x7A,0x74,0xC5,0xB1,0x72,0xC5,
+ 0x91,0x20,0x74,0xC3,0xBC,0x6B,0xC3,0xB6,0x72,0x66,0xC3,0xBA,
+ 0x72,0xC3,0xB3,0x67,0xC3,0xA9,0x70
+ }, {
+ 240, 144, 128, 128
+ }
+ };
+ utf8_checker u;
+ for(auto const& s : data)
+ {
+ static std::size_t constexpr size = 3;
+ std::size_t n = s.size();
+ buffers_suffix<
+ net::const_buffer> cb{
+ net::const_buffer(s.data(), n)};
+ multi_buffer b;
+ while(n)
+ {
+ auto const amount = (std::min)(n, size);
+ b.commit(net::buffer_copy(
+ b.prepare(amount), cb));
+ cb.consume(amount);
+ n -= amount;
+ }
+ BEAST_EXPECT(u.write(b.data()));
+ BEAST_EXPECT(u.finish());
+ }
+ }
+ }
+
+ void
+ testBranches()
+ {
+ // switch to slow loop from alignment loop
+ {
+ char buf[32];
+ for(unsigned i = 0; i < sizeof(buf); i += 2)
+ {
+ buf[i ] = '\xc2';
+ buf[i+1] = '\x80';
+ }
+ auto p = reinterpret_cast<char const*>(sizeof(std::size_t) * (
+ (std::uintptr_t(buf) + sizeof(std::size_t) - 1) /
+ sizeof(std::size_t))) + 2;
+ utf8_checker u;
+ BEAST_EXPECT(u.write(
+ reinterpret_cast<std::uint8_t const*>(p),
+ sizeof(buf)-(p-buf)));
+ BEAST_EXPECT(u.finish());
+ }
+
+ // invalid code point in the last dword of a fast run
+ {
+ char buf[20];
+ auto p = reinterpret_cast<char*>(sizeof(std::size_t) * (
+ (std::uintptr_t(buf) + sizeof(std::size_t) - 1) /
+ sizeof(std::size_t)));
+ BOOST_ASSERT(p + 12 <= buf + sizeof(buf));
+ auto const in = p;
+ *p++ = '*'; *p++ = '*'; *p++ = '*'; *p++ = '*';
+ *p++ = '*'; *p++ = '*'; *p++ = '*'; *p++ = '*';
+ p[0] = '\x80'; // invalid
+ p[1] = '*';
+ p[2] = '*';
+ p[3] = '*';
+ utf8_checker u;
+ BEAST_EXPECT(! u.write(reinterpret_cast<
+ std::uint8_t const*>(in), 12));
+ }
+ }
+
+ void
+ AutodeskTests()
+ {
+ std::vector<std::vector<std::uint8_t>> const data{
+ { 's','t','a','r','t', 0xE0 },
+ { 0xA6, 0x81, 'e','n','d' } };
+ utf8_checker u;
+ for(auto const& s : data)
+ {
+ std::size_t n = s.size();
+ buffers_suffix<net::const_buffer> cb{net::const_buffer(s.data(), n)};
+ multi_buffer b;
+ while(n)
+ {
+ auto const amount = (std::min)(n, std::size_t(3)/*size*/);
+ b.commit(net::buffer_copy(b.prepare(amount), cb));
+ cb.consume(amount);
+ n -= amount;
+ }
+ BEAST_EXPECT(u.write(b.data()));
+ }
+ BEAST_EXPECT(u.finish());
+ }
+
+ void
+ AutobahnTest(std::vector<std::vector<std::uint8_t>>&& data, std::vector<bool> result)
+ {
+ BEAST_EXPECT(data.size() == result.size());
+ utf8_checker u;
+ for(std::size_t i = 0; i < data.size(); ++i)
+ {
+ auto const& s = data[i];
+
+ std::size_t n = s.size();
+ buffers_suffix<net::const_buffer> cb{net::const_buffer(s.data(), n)};
+ multi_buffer b;
+ while(n)
+ {
+ auto const amount = (std::min)(n, std::size_t(3)/*size*/);
+ b.commit(net::buffer_copy(b.prepare(amount), cb));
+ cb.consume(amount);
+ n -= amount;
+ }
+ BEAST_EXPECT(u.write(b.data()) == result[i]);
+ }
+ }
+
+ void
+ run() override
+ {
+ testOneByteSequence();
+ testTwoByteSequence();
+ testThreeByteSequence();
+ testFourByteSequence();
+ testWithStreamBuffer();
+ testBranches();
+ AutodeskTests();
+ // 6.4.2
+ AutobahnTest(std::vector<std::vector<std::uint8_t>>{
+ { 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0xCF, 0x83, 0xCE, 0xBC, 0xCE, 0xB5, 0xF4 },
+ { 0x90 }, { 0x80, 0x80, 0x65, 0x64, 0x69, 0x74, 0x65, 0x64 } },
+ { true, false, false});
+ // 6.4.4
+ AutobahnTest(std::vector<std::vector<std::uint8_t>>{
+ { 0xCE, 0xBA, 0xE1, 0xBD, 0xB9, 0xCF, 0x83, 0xCE, 0xBC, 0xCE, 0xB5, 0xF4 },
+ { 0x90 } },
+ { true, false });
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,utf8_checker);
+
+} // detail
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/websocket/write.cpp b/src/boost/libs/beast/test/beast/websocket/write.cpp
new file mode 100644
index 000000000..c9b0b7ff4
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/websocket/write.cpp
@@ -0,0 +1,736 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/websocket/stream.hpp>
+
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/strand.hpp>
+
+#include "test.hpp"
+
+namespace boost {
+namespace beast {
+namespace websocket {
+
+class write_test : public websocket_test_suite
+{
+public:
+ template<bool deflateSupported, class Wrap>
+ void
+ doTestWrite(Wrap const& w)
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = false;
+ pmd.server_enable = false;
+
+ // already closed
+ {
+ echo_server es{log};
+ stream<test::stream> ws{ioc_};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ ws.close({});
+ try
+ {
+ w.write(ws, sbuf(""));
+ fail("", __FILE__, __LINE__);
+ }
+ catch(system_error const& se)
+ {
+ BEAST_EXPECTS(
+ se.code() == net::error::operation_aborted,
+ se.code().message());
+ }
+ }
+
+ // message
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.auto_fragment(false);
+ ws.binary(false);
+ std::string const s = "Hello, world!";
+ w.write(ws, net::buffer(s));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // empty message
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.text(true);
+ w.write(ws, net::const_buffer{});
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(b.size() == 0);
+ });
+
+ // fragmented message
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.auto_fragment(false);
+ ws.binary(false);
+ std::string const s = "Hello, world!";
+ w.write_some(ws, false, net::buffer(s.data(), 5));
+ w.write_some(ws, true, net::buffer(s.data() + 5, s.size() - 5));
+ multi_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(ws.got_text());
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // continuation
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ std::string const s = "Hello";
+ std::size_t const chop = 3;
+ BOOST_ASSERT(chop < s.size());
+ w.write_some(ws, false,
+ net::buffer(s.data(), chop));
+ w.write_some(ws, true, net::buffer(
+ s.data() + chop, s.size() - chop));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // mask
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.auto_fragment(false);
+ std::string const s = "Hello";
+ w.write(ws, net::buffer(s));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // mask (large)
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.auto_fragment(false);
+ ws.write_buffer_bytes(16);
+ std::string const s(32, '*');
+ w.write(ws, net::buffer(s));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // mask, autofrag
+ doTest<deflateSupported>(pmd,
+ [&](ws_type_t<deflateSupported>& ws)
+ {
+ ws.auto_fragment(true);
+ std::string const s(16384, '*');
+ w.write(ws, net::buffer(s));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // nomask
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log, kind::async_client};
+ ws_type_t<deflateSupported> ws{ts};
+ ws.next_layer().connect(es.stream());
+ try
+ {
+ es.async_handshake();
+ w.accept(ws);
+ ws.auto_fragment(false);
+ std::string const s = "Hello";
+ w.write(ws, net::buffer(s));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ w.close(ws, {});
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ ts.close();
+ });
+
+ // nomask, autofrag
+ doStreamLoop([&](test::stream& ts)
+ {
+ echo_server es{log, kind::async_client};
+ ws_type_t<deflateSupported> ws{ts};
+ ws.next_layer().connect(es.stream());
+ try
+ {
+ es.async_handshake();
+ w.accept(ws);
+ ws.auto_fragment(true);
+ std::string const s(16384, '*');
+ w.write(ws, net::buffer(s));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ w.close(ws, {});
+ }
+ catch(...)
+ {
+ ts.close();
+ throw;
+ }
+ ts.close();
+ });
+ }
+
+ template<class Wrap>
+ void
+ doTestWriteDeflate(Wrap const& w)
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = true;
+ pmd.server_enable = true;
+ pmd.compLevel = 1;
+
+ // deflate
+ doTest(pmd, [&](ws_type& ws)
+ {
+ auto const& s = random_string();
+ ws.binary(true);
+ w.write(ws, net::buffer(s));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // deflate, continuation
+ doTest(pmd, [&](ws_type& ws)
+ {
+ std::string const s = "Hello";
+ std::size_t const chop = 3;
+ BOOST_ASSERT(chop < s.size());
+ // This call should produce no
+ // output due to compression latency.
+ w.write_some(ws, false,
+ net::buffer(s.data(), chop));
+ w.write_some(ws, true, net::buffer(
+ s.data() + chop, s.size() - chop));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+
+ // deflate, no context takeover
+ pmd.client_no_context_takeover = true;
+ doTest(pmd, [&](ws_type& ws)
+ {
+ auto const& s = random_string();
+ ws.binary(true);
+ w.write(ws, net::buffer(s));
+ flat_buffer b;
+ w.read(ws, b);
+ BEAST_EXPECT(buffers_to_string(b.data()) == s);
+ });
+ }
+
+ void
+ testWrite()
+ {
+ doTestWrite<false>(SyncClient{});
+ doTestWrite<true>(SyncClient{});
+ doTestWriteDeflate(SyncClient{});
+
+ yield_to([&](yield_context yield)
+ {
+ doTestWrite<false>(AsyncClient{yield});
+ doTestWrite<true>(AsyncClient{yield});
+ doTestWriteDeflate(AsyncClient{yield});
+ });
+ }
+
+ void
+ testPausationAbandoning()
+ {
+ struct test_op
+ {
+ std::shared_ptr<stream<test::stream>> s_;
+
+ void operator()(
+ boost::system::error_code = {},
+ std::size_t = 0)
+ {
+ BEAST_FAIL();
+ }
+ };
+
+ std::weak_ptr<stream<test::stream>> weak_ws;
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ auto ws = std::make_shared<stream<test::stream>>(ioc);
+ test_op op{ws};
+ ws->next_layer().connect(es.stream());
+ ws->handshake("localhost", "/");
+ ws->async_ping("", op);
+ BEAST_EXPECT(ws->impl_->wr_block.is_locked());
+ ws->async_write(sbuf("*"), op);
+ weak_ws = ws;
+ ws->next_layer().close();
+ }
+ BEAST_EXPECT(weak_ws.expired());
+ }
+
+ void
+ testWriteSuspend()
+ {
+ // suspend on ping
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ BEAST_EXPECT(count == 0);
+ ws.async_write(sbuf("*"),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 1);
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on close
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ ws.async_close({},
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ BEAST_EXPECT(count == 0);
+ ws.async_write(sbuf("*"),
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec != net::error::operation_aborted)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on read ping + message
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ // add a ping and message to the input
+ ws.next_layer().append(string_view{
+ "\x89\x00" "\x81\x01*", 5});
+ std::size_t count = 0;
+ multi_buffer b;
+ ws.async_read(b,
+ [&](error_code ec, std::size_t)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ while(! ws.impl_->wr_block.is_locked())
+ {
+ ioc.run_one();
+ if(! BEAST_EXPECT(! ioc.stopped()))
+ break;
+ }
+ BEAST_EXPECT(count == 0);
+ ws.async_write(sbuf("*"),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 1);
+ });
+ BEAST_EXPECT(count == 0);
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on ping: nomask, nofrag
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log, kind::async_client};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ es.async_handshake();
+ ws.accept();
+ std::size_t count = 0;
+ std::string const s(16384, '*');
+ ws.auto_fragment(false);
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 16384);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on ping: nomask, frag
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log, kind::async_client};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ es.async_handshake();
+ ws.accept();
+ std::size_t count = 0;
+ std::string const s(16384, '*');
+ ws.auto_fragment(true);
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 16384);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ioc.run();
+ BEAST_EXPECT(count == 2);
+ });
+
+ // suspend on ping: mask, nofrag
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ std::string const s(16384, '*');
+ ws.auto_fragment(false);
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 16384);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ioc.run();
+ });
+
+ // suspend on ping: mask, frag
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ std::string const s(16384, '*');
+ ws.auto_fragment(true);
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == 16384);
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ioc.run();
+ });
+
+ // suspend on ping: deflate
+ doFailLoop([&](test::fail_count& fc)
+ {
+ echo_server es{log, kind::async};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc, fc};
+ {
+ permessage_deflate pmd;
+ pmd.client_enable = true;
+ pmd.compLevel = 1;
+ ws.set_option(pmd);
+ }
+ ws.next_layer().connect(es.stream());
+ ws.handshake("localhost", "/");
+ std::size_t count = 0;
+ auto const& s = random_string();
+ ws.binary(true);
+ ws.async_write(net::buffer(s),
+ [&](error_code ec, std::size_t n)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ BEAST_EXPECT(n == s.size());
+ });
+ BEAST_EXPECT(ws.impl_->wr_block.is_locked());
+ ws.async_ping("",
+ [&](error_code ec)
+ {
+ ++count;
+ if(ec)
+ BOOST_THROW_EXCEPTION(
+ system_error{ec});
+ });
+ ioc.run();
+ });
+ }
+
+ void
+ testAsyncWriteFrame()
+ {
+ for(int i = 0; i < 2; ++i)
+ {
+ for(;;)
+ {
+ echo_server es{log, i==1 ?
+ kind::async : kind::sync};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+
+ error_code ec;
+ ws.handshake("localhost", "/", ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ break;
+ ws.async_write_some(false,
+ net::const_buffer{},
+ [&](error_code, std::size_t)
+ {
+ fail();
+ });
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ break;
+ //
+ // Destruction of the io_context will cause destruction
+ // of the write_some_op without invoking the final handler.
+ //
+ break;
+ }
+ }
+ }
+
+ void
+ testMoveOnly()
+ {
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.async_write_some(
+ true, net::const_buffer{},
+ move_only_handler{});
+ }
+
+ struct copyable_handler
+ {
+ template<class... Args>
+ void
+ operator()(Args&&...) const
+ {
+ }
+ };
+
+ void
+ testAsioHandlerInvoke()
+ {
+ // make sure things compile, also can set a
+ // breakpoint in asio_handler_invoke to make sure
+ // it is instantiated.
+ {
+ net::io_context ioc;
+ net::strand<
+ net::io_context::executor_type> s(
+ ioc.get_executor());
+ stream<test::stream> ws{ioc};
+ flat_buffer b;
+ ws.async_write(net::const_buffer{},
+ net::bind_executor(s,
+ copyable_handler{}));
+ }
+ }
+
+ /*
+ https://github.com/boostorg/beast/issues/300
+
+ Write a message as two individual frames
+ */
+ void
+ testIssue300()
+ {
+ for(int i = 0; i < 2; ++i )
+ {
+ echo_server es{log, i==1 ?
+ kind::async : kind::sync};
+ net::io_context ioc;
+ stream<test::stream> ws{ioc};
+ ws.next_layer().connect(es.stream());
+
+ error_code ec;
+ ws.handshake("localhost", "/", ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ return;
+ ws.write_some(false, sbuf("u"));
+ ws.write_some(true, sbuf("v"));
+ multi_buffer b;
+ ws.read(b, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ }
+ }
+
+ /*
+ https://github.com/boostorg/beast/issues/1666
+
+ permessage-deflate not working in version 1.70.
+ */
+ void
+ testIssue1666()
+ {
+ net::io_context ioc;
+ permessage_deflate pmd;
+ pmd.client_enable = true;
+ pmd.server_enable = true;
+ stream<test::stream> ws0{ioc};
+ stream<test::stream> ws1{ioc};
+ ws0.next_layer().connect(ws1.next_layer());
+ ws0.set_option(pmd);
+ ws1.set_option(pmd);
+ ws1.async_accept(
+ [](error_code ec)
+ {
+ BEAST_EXPECTS(! ec, ec.message());
+ });
+ ws0.async_handshake("test", "/",
+ [](error_code ec)
+ {
+ BEAST_EXPECTS(! ec, ec.message());
+ });
+ ioc.run();
+ ioc.restart();
+ std::string s(256, '*');
+ auto const n0 =
+ ws0.next_layer().nwrite_bytes();
+ error_code ec;
+ BEAST_EXPECTS(! ec, ec.message());
+ ws1.write(net::buffer(s), ec);
+ auto const n1 =
+ ws0.next_layer().nwrite_bytes();
+ // Make sure the string was actually compressed
+ BEAST_EXPECT(n1 < n0 + s.size());
+ }
+
+ void
+ run() override
+ {
+ testWrite();
+ testPausationAbandoning();
+ testWriteSuspend();
+ testAsyncWriteFrame();
+ testMoveOnly();
+ testIssue300();
+ testIssue1666();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,websocket,write);
+
+} // websocket
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/zlib.cpp b/src/boost/libs/beast/test/beast/zlib.cpp
new file mode 100644
index 000000000..c0cf68a6c
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/zlib.cpp
@@ -0,0 +1,18 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// If including Windows.h generates errors, it
+// means that min/max macros are being substituted.
+#ifdef _MSC_VER
+#define WIN32_LEAN_AND_MEAN
+#include <Windows.h>
+#endif
+
+// Test that header file is self-contained.
+#include <boost/beast/zlib.hpp>
diff --git a/src/boost/libs/beast/test/beast/zlib/CMakeLists.txt b/src/boost/libs/beast/test/beast/zlib/CMakeLists.txt
new file mode 100644
index 000000000..ecb9898ab
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/zlib/CMakeLists.txt
@@ -0,0 +1,34 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/extern/zlib-1.2.11 zlib)
+GroupSources (test/beast/zlib "/")
+
+if (MSVC)
+ set_source_files_properties (${ZLIB_SOURCES} PROPERTIES COMPILE_FLAGS "/wd4127 /wd4131 /wd4244")
+endif()
+
+add_executable (tests-beast-zlib
+ ${BOOST_BEAST_FILES}
+ ${ZLIB_SOURCES}
+ Jamfile
+ error.cpp
+ deflate_stream.cpp
+ inflate_stream.cpp
+ zlib.cpp
+)
+
+target_link_libraries(tests-beast-zlib
+ lib-asio
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET tests-beast-zlib PROPERTY FOLDER "tests")
diff --git a/src/boost/libs/beast/test/beast/zlib/Jamfile b/src/boost/libs/beast/test/beast/zlib/Jamfile
new file mode 100644
index 000000000..b191a2423
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/zlib/Jamfile
@@ -0,0 +1,44 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+local SOURCES =
+ error.cpp
+ deflate_stream.cpp
+ inflate_stream.cpp
+ zlib.cpp
+ ;
+
+local RUN_TESTS ;
+
+for local f in $(SOURCES)
+{
+ RUN_TESTS += [ run $(f)
+ $(ZLIB_SOURCES)
+ /boost/beast/test//lib-test
+ ] ;
+}
+
+alias run-tests : $(RUN_TESTS) ;
+
+exe fat-tests
+ :
+ $(ZLIB_SOURCES)
+ $(SOURCES)
+ /boost/beast/test//lib-test
+ ;
+
+explicit fat-tests ;
+
+run
+ $(ZLIB_SOURCES)
+ $(SOURCES)
+ /boost/beast/test//lib-test
+ : : : : run-fat-tests ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/beast/zlib/deflate_stream.cpp b/src/boost/libs/beast/test/beast/zlib/deflate_stream.cpp
new file mode 100644
index 000000000..0129ce118
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/zlib/deflate_stream.cpp
@@ -0,0 +1,635 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/zlib/deflate_stream.hpp>
+
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <array>
+#include <cstdint>
+#include <numeric>
+#include <random>
+
+#include "zlib-1.2.11/zlib.h"
+
+namespace boost {
+namespace beast {
+namespace zlib {
+
+class deflate_stream_test : public beast::unit_test::suite
+{
+ struct ICompressor {
+ virtual void init() = 0;
+ virtual void init(
+ int level,
+ int windowBits,
+ int memLevel,
+ int strategy) = 0;
+
+ virtual std::size_t avail_in() const noexcept = 0;
+ virtual void avail_in(std::size_t) noexcept = 0;
+ virtual void const* next_in() const noexcept = 0;
+ virtual void next_in(const void*) noexcept = 0;
+ virtual std::size_t avail_out() const noexcept = 0;
+ virtual void avail_out(std::size_t) noexcept = 0;
+ virtual void* next_out() const noexcept = 0;
+ virtual void next_out(void*) noexcept = 0;
+ virtual std::size_t total_out() const noexcept = 0;
+
+ virtual std::size_t bound(std::size_t) = 0;
+ virtual error_code write(Flush) = 0;
+ virtual ~ICompressor() = default;
+ };
+ class ZlibCompressor : public ICompressor {
+ z_stream zs{};
+
+ public:
+ ZlibCompressor() = default;
+ void init() override {
+ deflateEnd(&zs);
+ zs = {};
+ const auto res = deflateInit2(&zs, -1, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
+ if(res != Z_OK)
+ throw std::invalid_argument{"zlib compressor: failure"};
+ }
+ void init(
+ int level,
+ int windowBits,
+ int memLevel,
+ int strategy) override
+ {
+ deflateEnd(&zs);
+ zs = {};
+ const auto res = deflateInit2(&zs, level, Z_DEFLATED, -windowBits, memLevel, strategy);
+ if(res != Z_OK)
+ BOOST_THROW_EXCEPTION(std::invalid_argument{"zlib compressor: bad arg"});
+ }
+
+ virtual std::size_t avail_in() const noexcept override { return zs.avail_in; }
+ virtual void avail_in(std::size_t n) noexcept override { zs.avail_in = n; }
+ virtual void const* next_in() const noexcept override { return zs.next_in; }
+ virtual void next_in(const void* ptr) noexcept override { zs.next_in = const_cast<Bytef*>(static_cast<const Bytef*>(ptr)); }
+ virtual std::size_t avail_out() const noexcept override { return zs.avail_out; }
+ virtual void avail_out(std::size_t n_out) noexcept override { zs.avail_out = n_out; }
+ virtual void* next_out() const noexcept override { return zs.next_out; }
+ virtual void next_out(void* ptr) noexcept override { zs.next_out = (Bytef*)ptr; }
+ virtual std::size_t total_out() const noexcept override { return zs.total_out; }
+
+ std::size_t bound(std::size_t src_size) override {
+ return deflateBound(&zs, static_cast<uLong>(src_size));
+ }
+ error_code write(Flush flush) override {
+ constexpr static int zlib_flushes[] = {0, Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH, Z_TREES};
+ const auto zlib_flush = zlib_flushes[static_cast<int>(flush)];
+ if(zs.next_in == nullptr && zs.avail_in != 0)
+ BOOST_THROW_EXCEPTION(std::invalid_argument{"zlib compressor: invalid input"});
+ const auto res = deflate(&zs, zlib_flush);
+ switch(res){
+ case Z_OK:
+ return {};
+ case Z_STREAM_END:
+ return error::end_of_stream;
+ case Z_STREAM_ERROR:
+ return error::stream_error;
+ case Z_BUF_ERROR:
+ return error::need_buffers;
+ default:
+ throw;
+ }
+ }
+
+ ~ZlibCompressor() override {
+ deflateEnd(&zs);
+ }
+ } zlib_compressor;
+ class BeastCompressor : public ICompressor {
+ z_params zp;
+ deflate_stream ds;
+
+ public:
+ BeastCompressor() = default;
+ void init() override {
+ zp = {};
+ ds.clear();
+ ds.reset();
+ }
+ void init(
+ int level,
+ int windowBits,
+ int memLevel,
+ int strategy) override
+ {
+ zp = {};
+ ds.clear();
+ ds.reset(
+ level,
+ windowBits,
+ memLevel,
+ toStrategy(strategy));
+ }
+
+ virtual std::size_t avail_in() const noexcept override { return zp.avail_in; }
+ virtual void avail_in(std::size_t n) noexcept override { zp.avail_in = n; }
+ virtual void const* next_in() const noexcept override { return zp.next_in; }
+ virtual void next_in(const void* ptr) noexcept override { zp.next_in = ptr; }
+ virtual std::size_t avail_out() const noexcept override { return zp.avail_out; }
+ virtual void avail_out(std::size_t n_out) noexcept override { zp.avail_out = n_out; }
+ virtual void* next_out() const noexcept override { return zp.next_out; }
+ virtual void next_out(void* ptr) noexcept override { zp.next_out = (Bytef*)ptr; }
+ virtual std::size_t total_out() const noexcept override { return zp.total_out; }
+
+ std::size_t bound(std::size_t src_size) override {
+ return ds.upper_bound(src_size);
+ }
+ error_code write(Flush flush) override {
+ error_code ec{};
+ ds.write(zp, flush, ec);
+ return ec;
+ }
+
+ ~BeastCompressor() override = default;
+ } beast_compressor;
+
+public:
+ // Lots of repeats, limited char range
+ static
+ std::string
+ corpus1(std::size_t n)
+ {
+ static std::string const alphabet{
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ };
+ std::string s;
+ s.reserve(n + 5);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::size_t> d0{
+ 0, alphabet.size() - 1};
+ std::uniform_int_distribution<std::size_t> d1{
+ 1, 5};
+ while(s.size() < n)
+ {
+ auto const rep = d1(g);
+ auto const ch = alphabet[d0(g)];
+ s.insert(s.end(), rep, ch);
+ }
+ s.resize(n);
+ return s;
+ }
+
+ // Random data
+ static
+ std::string
+ corpus2(std::size_t n)
+ {
+ std::string s;
+ s.reserve(n);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::uint32_t> d0{0, 255};
+ while(n--)
+ s.push_back(static_cast<char>(d0(g)));
+ return s;
+ }
+
+ static
+ std::string
+ compress(
+ string_view const& in,
+ int level, // 0=none, 1..9, -1=default
+ int windowBits, // 9..15
+ int memLevel) // 1..9 (8=default)
+ {
+ int const strategy = Z_DEFAULT_STRATEGY;
+ int result;
+ z_stream zs;
+ memset(&zs, 0, sizeof(zs));
+ result = deflateInit2(
+ &zs,
+ level,
+ Z_DEFLATED,
+ -windowBits,
+ memLevel,
+ strategy);
+ if(result != Z_OK)
+ throw std::logic_error{"deflateInit2 failed"};
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ std::string out;
+ out.resize(deflateBound(&zs,
+ static_cast<uLong>(in.size())));
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ zs.next_out = (Bytef*)&out[0];
+ zs.avail_out = static_cast<uInt>(out.size());
+ result = deflate(&zs, Z_FULL_FLUSH);
+ if(result != Z_OK)
+ throw std::logic_error("deflate failed");
+ out.resize(zs.total_out);
+ deflateEnd(&zs);
+ return out;
+ }
+
+ static
+ std::string
+ decompress(string_view const& in)
+ {
+ int result;
+ std::string out;
+ z_stream zs;
+ memset(&zs, 0, sizeof(zs));
+ result = inflateInit2(&zs, -15);
+ if(result != Z_OK)
+ throw std::logic_error{"inflateInit2 failed"};
+ try
+ {
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ for(;;)
+ {
+ out.resize(zs.total_out + 1024);
+ zs.next_out = (Bytef*)&out[zs.total_out];
+ zs.avail_out = static_cast<uInt>(
+ out.size() - zs.total_out);
+ result = inflate(&zs, Z_SYNC_FLUSH);
+ if( result == Z_NEED_DICT ||
+ result == Z_DATA_ERROR ||
+ result == Z_MEM_ERROR)
+ {
+ throw std::logic_error("inflate failed");
+ }
+ if(zs.avail_out > 0)
+ break;
+ if(result == Z_STREAM_END)
+ break;
+ }
+ out.resize(zs.total_out);
+ inflateEnd(&zs);
+ }
+ catch(...)
+ {
+ inflateEnd(&zs);
+ throw;
+ }
+ return out;
+ }
+
+ //--------------------------------------------------------------------------
+
+ using self = deflate_stream_test;
+ typedef void(self::*pmf_t)(
+ ICompressor& c,
+ int level, int windowBits, int memLevel,
+ int strategy, std::string const&);
+
+ static
+ Strategy
+ toStrategy(int strategy)
+ {
+ switch(strategy)
+ {
+ default:
+ case 0: return Strategy::normal;
+ case 1: return Strategy::filtered;
+ case 2: return Strategy::huffman;
+ case 3: return Strategy::rle;
+ case 4: return Strategy::fixed;
+ }
+ }
+
+ void
+ doDeflate1_beast(
+ ICompressor& c,
+ int level, int windowBits, int memLevel,
+ int strategy, std::string const& check)
+ {
+ std::string out;
+ c.init(
+ level,
+ windowBits,
+ memLevel,
+ strategy);
+ out.resize(c.bound(check.size()));
+ c.next_in(check.data());
+ c.avail_in(check.size());
+ c.next_out((void*)out.data());
+ c.avail_out(out.size());
+ {
+ bool progress = true;
+ for(;;)
+ {
+ error_code ec = c.write(Flush::full);
+ if( ec == error::need_buffers ||
+ ec == error::end_of_stream) // per zlib FAQ
+ goto fin;
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ goto err;
+ if(! BEAST_EXPECT(progress))
+ goto err;
+ progress = false;
+ }
+ }
+
+ fin:
+ out.resize(c.total_out());
+ BEAST_EXPECT(decompress(out) == check);
+
+ err:
+ ;
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ doDeflate2_beast(
+ ICompressor& c,
+ int level, int windowBits, int memLevel,
+ int strategy, std::string const& check)
+ {
+ for(std::size_t i = 1; i < check.size(); ++i)
+ {
+ for(std::size_t j = 1;; ++j)
+ {
+ c.init(
+ level,
+ windowBits,
+ memLevel,
+ strategy);
+ std::string out;
+ out.resize(c.bound(check.size()));
+ if(j >= out.size())
+ break;
+ c.next_in((void*)check.data());
+ c.avail_in(i);
+ c.next_out((void*)out.data());
+ c.avail_out(j);
+ bool bi = false;
+ bool bo = false;
+ for(;;)
+ {
+ error_code ec = c.write(
+ bi ? Flush::full : Flush::none);
+ if( ec == error::need_buffers ||
+ ec == error::end_of_stream) // per zlib FAQ
+ goto fin;
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ goto err;
+ if(c.avail_in() == 0 && ! bi)
+ {
+ bi = true;
+ c.avail_in(check.size() - i);
+ }
+ if(c.avail_out() == 0 && ! bo)
+ {
+ bo = true;
+ c.avail_out(out.size() - j);
+ }
+ }
+
+ fin:
+ out.resize(c.total_out());
+ BEAST_EXPECT(decompress(out) == check);
+
+ err:
+ ;
+ }
+ }
+ }
+
+ //--------------------------------------------------------------------------
+
+ void
+ doMatrix(ICompressor& c, std::string const& check, pmf_t pmf)
+ {
+ for(int level = 0; level <= 9; ++level)
+ {
+ for(int windowBits = 8; windowBits <= 9; ++windowBits)
+ {
+ // zlib has a bug with windowBits==8
+ if(windowBits == 8)
+ continue;
+ for(int strategy = 0; strategy <= 4; ++strategy)
+ {
+ for (int memLevel = 8; memLevel <= 9; ++memLevel)
+ {
+ (this->*pmf)(
+ c, level, windowBits, memLevel, strategy, check);
+ }
+ }
+ }
+ }
+
+ // Check default settings
+ (this->*pmf)(c, compression::default_size, 15, 8, 0, check);
+ }
+
+ void
+ testDeflate(ICompressor& c)
+ {
+ doMatrix(c, "Hello, world!", &self::doDeflate1_beast);
+ doMatrix(c, "Hello, world!", &self::doDeflate2_beast);
+ log << "no-silence keepalive" << std::endl;
+ doMatrix(c, corpus1(56), &self::doDeflate2_beast);
+ doMatrix(c, corpus1(1024), &self::doDeflate1_beast);
+ }
+
+ void testInvalidSettings(ICompressor& c)
+ {
+ except<std::invalid_argument>(
+ [&]()
+ {
+ c.init(-42, 15, 8, static_cast<int>(Strategy::normal));
+ });
+ except<std::invalid_argument>(
+ [&]()
+ {
+ c.init(compression::default_size, -1, 8, static_cast<int>(Strategy::normal));
+ });
+ except<std::invalid_argument>(
+ [&]()
+ {
+ c.init(compression::default_size, 15, -1, static_cast<int>(Strategy::normal));
+ });
+ except<std::invalid_argument>(
+ [&]()
+ {
+ c.init();
+ c.avail_in(1);
+ c.next_in(nullptr);
+ c.write(Flush::full);
+ });
+ }
+
+ void
+ testWriteAfterFinish(ICompressor& c)
+ {
+ c.init();
+ std::string out;
+ out.resize(1024);
+ string_view s = "Hello";
+ c.next_in(s.data());
+ c.avail_in(s.size());
+ c.next_out(&out.front());
+ c.avail_out(out.size());
+ error_code ec = c.write(Flush::sync);
+ BEAST_EXPECT(!ec);
+ c.next_in(nullptr);
+ c.avail_in(0);
+ ec = c.write(Flush::finish);
+ BEAST_EXPECT(ec == error::end_of_stream);
+ c.next_in(s.data());
+ c.avail_in(s.size());
+ c.next_out(&out.front());
+ c.avail_out(out.size());
+ ec = c.write(Flush::sync);
+ BEAST_EXPECT(ec == error::stream_error);
+ ec = c.write(Flush::finish);
+ BEAST_EXPECT(ec == error::need_buffers);
+ }
+
+ void
+ testFlushPartial(ICompressor& c)
+ {
+ c.init();
+ std::string out;
+ out.resize(1024);
+ string_view s = "Hello";
+ c.next_in(s.data());
+ c.avail_in(s.size());
+ c.next_out(&out.front());
+ c.avail_out(out.size());
+ error_code ec;
+ ec = c.write(Flush::none);
+ BEAST_EXPECT(!ec);
+ ec = c.write(Flush::partial);
+ BEAST_EXPECT(!ec);
+ }
+
+ void
+ testFlushAtLiteralBufferFull(ICompressor& c)
+ {
+ struct fixture
+ {
+ ICompressor& c;
+ explicit fixture(ICompressor&c, std::size_t n, Strategy s) : c(c)
+ {
+ c.init(8, 15, 1, static_cast<int>(s));
+ std::iota(in.begin(), in.end(), std::uint8_t{0});
+ out.resize(n);
+ c.next_in(in.data());
+ c.avail_in(in.size());
+ c.next_out(&out.front());
+ c.avail_out(out.size());
+ }
+
+ std::array<std::uint8_t, 255> in;
+ std::string out;
+ };
+
+ for (auto s : {Strategy::huffman, Strategy::rle, Strategy::normal})
+ {
+ {
+ fixture f{c, 264, s};
+ error_code ec = c.write(Flush::finish);
+ BEAST_EXPECT(ec == error::end_of_stream);
+ BEAST_EXPECT(c.avail_out() == 1);
+ }
+
+ {
+ fixture f{c,263, s};
+ error_code ec = c.write(Flush::finish);
+ BEAST_EXPECT(!ec);
+ BEAST_EXPECT(c.avail_out() == 0);
+ }
+
+ {
+ fixture f{c, 20, s};
+ error_code ec = c.write(Flush::sync);
+ BEAST_EXPECT(!ec);
+ }
+
+ }
+ }
+
+ void
+ testRLEMatchLengthExceedLookahead(ICompressor& c)
+ {
+ std::vector<std::uint8_t> in;
+ in.resize(300);
+
+ c.init(8, 15, 1, static_cast<int>(Strategy::rle));
+ std::fill_n(in.begin(), 4, 'a');
+ std::string out;
+ out.resize(in.size() * 2);
+ c.next_in(in.data());
+ c.avail_in(in.size());
+ c.next_out(&out.front());
+ c.avail_out(out.size());
+
+ error_code ec;
+ ec = c.write(Flush::sync);
+ BEAST_EXPECT(!ec);
+ }
+
+ void
+ testFlushAfterDistMatch(ICompressor& c)
+ {
+ for (auto out_size : {144, 129})
+ {
+ std::array<std::uint8_t, 256> in{};
+ // 125 will mostly fill the lit buffer, so emitting a distance code
+ // results in a flush.
+ auto constexpr n = 125;
+ std::iota(in.begin(), in.begin() + n,
+ static_cast<std::uint8_t>(0));
+ std::iota(in.begin() + n, in.end(),
+ static_cast<std::uint8_t>(0));
+
+ c.init(8, 15, 1, static_cast<int>(Strategy::normal));
+ std::string out;
+ out.resize(out_size);
+ c.next_in(in.data());
+ c.avail_in(in.size());
+ c.next_out(&out.front());
+ c.avail_out(out.size());
+
+ error_code ec;
+ ec = c.write(Flush::sync);
+ BEAST_EXPECT(!ec);
+ }
+ }
+
+ void
+ run() override
+ {
+ log <<
+ "sizeof(deflate_stream) == " <<
+ sizeof(deflate_stream) << std::endl;
+
+ testDeflate(zlib_compressor);
+ testDeflate(beast_compressor);
+ testInvalidSettings(zlib_compressor);
+ testInvalidSettings(beast_compressor);
+ testWriteAfterFinish(zlib_compressor);
+ testWriteAfterFinish(beast_compressor);
+ testFlushPartial(zlib_compressor);
+ testFlushPartial(beast_compressor);
+ testFlushAtLiteralBufferFull(zlib_compressor);
+ testFlushAtLiteralBufferFull(beast_compressor);
+ testRLEMatchLengthExceedLookahead(zlib_compressor);
+ testRLEMatchLengthExceedLookahead(beast_compressor);
+ testFlushAfterDistMatch(zlib_compressor);
+ testFlushAfterDistMatch(beast_compressor);
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,zlib,deflate_stream);
+
+} // zlib
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/zlib/error.cpp b/src/boost/libs/beast/test/beast/zlib/error.cpp
new file mode 100644
index 000000000..f9096e6e4
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/zlib/error.cpp
@@ -0,0 +1,68 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/zlib/error.hpp>
+
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <memory>
+
+namespace boost {
+namespace beast {
+namespace zlib {
+
+class error_test : public unit_test::suite
+{
+public:
+ void check(char const* name, error ev)
+ {
+ auto const ec = make_error_code(ev);
+ auto const& cat = make_error_code(
+ static_cast<zlib::error>(0)).category();
+ BEAST_EXPECT(std::string{ec.category().name()} == name);
+ BEAST_EXPECT(! ec.message().empty());
+ BEAST_EXPECT(
+ std::addressof(ec.category()) == std::addressof(cat));
+ BEAST_EXPECT(cat.equivalent(
+ static_cast<std::underlying_type<error>::type>(ev),
+ ec.category().default_error_condition(
+ static_cast<std::underlying_type<error>::type>(ev))));
+ BEAST_EXPECT(cat.equivalent(ec,
+ static_cast<std::underlying_type<error>::type>(ev)));
+ }
+
+ void run() override
+ {
+ check("boost.beast.zlib", error::need_buffers);
+ check("boost.beast.zlib", error::end_of_stream);
+ check("boost.beast.zlib", error::need_dict);
+ check("boost.beast.zlib", error::stream_error);
+
+ check("boost.beast.zlib", error::invalid_block_type);
+ check("boost.beast.zlib", error::invalid_stored_length);
+ check("boost.beast.zlib", error::too_many_symbols);
+ check("boost.beast.zlib", error::invalid_code_lengths);
+ check("boost.beast.zlib", error::invalid_bit_length_repeat);
+ check("boost.beast.zlib", error::missing_eob);
+ check("boost.beast.zlib", error::invalid_literal_length);
+ check("boost.beast.zlib", error::invalid_distance_code);
+ check("boost.beast.zlib", error::invalid_distance);
+
+ check("boost.beast.zlib", error::over_subscribed_length);
+ check("boost.beast.zlib", error::incomplete_length_set);
+
+ check("boost.beast.zlib", error::general);
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,zlib,error);
+
+} // zlib
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/zlib/inflate_stream.cpp b/src/boost/libs/beast/test/beast/zlib/inflate_stream.cpp
new file mode 100644
index 000000000..0f1e9d1d6
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/zlib/inflate_stream.cpp
@@ -0,0 +1,660 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include <boost/beast/zlib/inflate_stream.hpp>
+
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <chrono>
+#include <random>
+
+#include "zlib-1.2.11/zlib.h"
+
+namespace boost {
+namespace beast {
+namespace zlib {
+
+class inflate_stream_test : public beast::unit_test::suite
+{
+ struct IDecompressor {
+ virtual void init() = 0;
+ virtual void init(int windowBits) = 0;
+
+ virtual std::size_t avail_in() const noexcept = 0;
+ virtual void avail_in(std::size_t) noexcept = 0;
+ virtual void const* next_in() const noexcept = 0;
+ virtual void next_in(const void*) noexcept = 0;
+ virtual std::size_t avail_out() const noexcept = 0;
+ virtual void avail_out(std::size_t) noexcept = 0;
+ virtual void* next_out() const noexcept = 0;
+ virtual void next_out(void*) noexcept = 0;
+
+ virtual error_code write(Flush) = 0;
+ virtual ~IDecompressor() = default;
+ };
+ class ZlibDecompressor : public IDecompressor {
+ z_stream zs;
+
+ public:
+ ZlibDecompressor() = default;
+ void init(int windowBits) override
+ {
+ inflateEnd(&zs);
+ zs = {};
+ const auto res = inflateInit2(&zs, windowBits);
+ switch(res){
+ case Z_OK:
+ break;
+ case Z_MEM_ERROR:
+ throw std::runtime_error{"zlib decompressor: no memory"};
+ case Z_STREAM_ERROR:
+ throw std::domain_error{"zlib decompressor: bad arg"};
+ }
+ }
+ void init() override {
+ inflateEnd(&zs);
+ zs = {};
+ const auto res = inflateInit2(&zs, -15);
+ switch(res){
+ case Z_OK:
+ break;
+ case Z_MEM_ERROR:
+ throw std::runtime_error{"zlib decompressor: no memory"};
+ case Z_STREAM_ERROR:
+ throw std::domain_error{"zlib decompressor: bad arg"};
+ }
+ }
+
+ virtual std::size_t avail_in() const noexcept override { return zs.avail_in; }
+ virtual void avail_in(std::size_t n) noexcept override { zs.avail_in = n; }
+ virtual void const* next_in() const noexcept override { return zs.next_in; }
+ virtual void next_in(const void* ptr) noexcept override { zs.next_in = const_cast<Bytef*>(static_cast<const Bytef*>(ptr)); }
+ virtual std::size_t avail_out() const noexcept override { return zs.avail_out; }
+ virtual void avail_out(std::size_t n_out) noexcept override { zs.avail_out = n_out; }
+ virtual void* next_out() const noexcept override { return zs.next_out; }
+ virtual void next_out(void* ptr) noexcept override { zs.next_out = (Bytef*)ptr; }
+
+ error_code write(Flush flush) override {
+ constexpr static int zlib_flushes[] = {0, Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, Z_FULL_FLUSH, Z_FINISH, Z_TREES};
+ const auto zlib_flush = zlib_flushes[static_cast<int>(flush)];
+ const auto res = inflate(&zs, zlib_flush);
+ switch(res){
+ case Z_OK:
+ return {};
+ case Z_STREAM_END:
+ return error::end_of_stream;
+ case Z_NEED_DICT:
+ return error::need_dict;
+ case Z_DATA_ERROR:
+ case Z_STREAM_ERROR:
+ return error::stream_error;
+ case Z_MEM_ERROR:
+ throw std::bad_alloc{};
+ case Z_BUF_ERROR:
+ return error::need_buffers;
+ default:
+ throw std::runtime_error{"zlib decompressor: impossible value"};
+ }
+ }
+
+ ~ZlibDecompressor() override {
+ inflateEnd(&zs);
+ }
+ } zlib_decompressor{};
+ class BeastCompressor : public IDecompressor {
+ z_params zp;
+ inflate_stream is;
+
+ public:
+ BeastCompressor() = default;
+
+ void init(int windowBits) override
+ {
+ zp = {};
+ is.clear();
+ is.reset(windowBits);
+ }
+ void init() override {
+ zp = {};
+ is.clear();
+ is.reset();
+ }
+
+ virtual std::size_t avail_in() const noexcept override { return zp.avail_in; }
+ virtual void avail_in(std::size_t n) noexcept override { zp.avail_in = n; }
+ virtual void const* next_in() const noexcept override { return zp.next_in; }
+ virtual void next_in(const void* ptr) noexcept override { zp.next_in = ptr; }
+ virtual std::size_t avail_out() const noexcept override { return zp.avail_out; }
+ virtual void avail_out(std::size_t n_out) noexcept override { zp.avail_out = n_out; }
+ virtual void* next_out() const noexcept override { return zp.next_out; }
+ virtual void next_out(void* ptr) noexcept override { zp.next_out = (Bytef*)ptr; }
+
+ error_code write(Flush flush) override {
+ error_code ec{};
+ is.write(zp, flush, ec);
+ return ec;
+ }
+
+ ~BeastCompressor() override = default;
+ } beast_decompressor{};
+public:
+ // Lots of repeats, limited char range
+ static
+ std::string
+ corpus1(std::size_t n)
+ {
+ static std::string const alphabet{
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ };
+ std::string s;
+ s.reserve(n + 5);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::size_t> d0{
+ 0, alphabet.size() - 1};
+ std::uniform_int_distribution<std::size_t> d1{
+ 1, 5};
+ while(s.size() < n)
+ {
+ auto const rep = d1(g);
+ auto const ch = alphabet[d0(g)];
+ s.insert(s.end(), rep, ch);
+ }
+ s.resize(n);
+ return s;
+ }
+
+ // Random data
+ static
+ std::string
+ corpus2(std::size_t n)
+ {
+ std::string s;
+ s.reserve(n);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::uint32_t> d0{0, 255};
+ while(n--)
+ s.push_back(static_cast<char>(d0(g)));
+ return s;
+ }
+
+ static
+ std::string
+ compress(
+ string_view const& in,
+ int level, // 0=none, 1..9, -1=default
+ int windowBits, // 9..15
+ int memLevel, // 1..9 (8=default)
+ int strategy) // e.g. Z_DEFAULT_STRATEGY
+ {
+ int result;
+ z_stream zs;
+ memset(&zs, 0, sizeof(zs));
+ result = deflateInit2(
+ &zs,
+ level,
+ Z_DEFLATED,
+ -windowBits,
+ memLevel,
+ strategy);
+ if(result != Z_OK)
+ throw std::logic_error{"deflateInit2 failed"};
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ std::string out;
+ out.resize(deflateBound(&zs,
+ static_cast<uLong>(in.size())));
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ zs.next_out = (Bytef*)&out[0];
+ zs.avail_out = static_cast<uInt>(out.size());
+ result = deflate(&zs, Z_FULL_FLUSH);
+ if(result != Z_OK)
+ throw std::logic_error("deflate failed");
+ out.resize(zs.total_out);
+ deflateEnd(&zs);
+ return out;
+ }
+
+ //--------------------------------------------------------------------------
+
+ enum Split
+ {
+ once,
+ half,
+ full
+ };
+
+ class Beast
+ {
+ Split in_;
+ Split check_;
+ Flush flush_;
+
+ public:
+ Beast(Split in, Split check, Flush flush = Flush::sync)
+ : in_(in)
+ , check_(check)
+ , flush_(flush)
+ {
+ }
+
+ void
+ operator()(
+ int window,
+ std::string const& in,
+ std::string const& check,
+ unit_test::suite& suite) const
+ {
+ auto const f =
+ [&](std::size_t i, std::size_t j)
+ {
+ std::string out(check.size(), 0);
+ z_params zs;
+ zs.next_in = in.data();
+ zs.next_out = &out[0];
+ zs.avail_in = i;
+ zs.avail_out = j;
+ inflate_stream is;
+ is.reset(window);
+ bool bi = ! (i < in.size());
+ bool bo = ! (j < check.size());
+ for(;;)
+ {
+ error_code ec;
+ is.write(zs, flush_, ec);
+ if( ec == error::need_buffers ||
+ ec == error::end_of_stream)
+ {
+ out.resize(zs.total_out);
+ suite.expect(out == check, __FILE__, __LINE__);
+ break;
+ }
+ if(ec)
+ {
+ suite.fail(ec.message(), __FILE__, __LINE__);
+ break;
+ }
+ if(zs.avail_in == 0 && ! bi)
+ {
+ bi = true;
+ zs.avail_in = in.size() - i;
+ }
+ if(zs.avail_out == 0 && ! bo)
+ {
+ bo = true;
+ zs.avail_out = check.size() - j;
+ }
+ }
+ };
+
+ std::size_t i0, i1;
+ std::size_t j0, j1;
+
+ switch(in_)
+ {
+ default:
+ case once: i0 = in.size(); i1 = i0; break;
+ case half: i0 = in.size() / 2; i1 = i0; break;
+ case full: i0 = 1; i1 = in.size(); break;
+ }
+
+ switch(check_)
+ {
+ default:
+ case once: j0 = check.size(); j1 = j0; break;
+ case half: j0 = check.size() / 2; j1 = j0; break;
+ case full: j0 = 1; j1 = check.size(); break;
+ }
+
+ for(std::size_t i = i0; i <= i1; ++i)
+ for(std::size_t j = j0; j <= j1; ++j)
+ f(i, j);
+ }
+ };
+
+ class Matrix
+ {
+ unit_test::suite& suite_;
+
+ int level_[2];
+ int window_[2];
+ int strategy_[2];
+
+ public:
+ explicit
+ Matrix(unit_test::suite& suite)
+ : suite_(suite)
+ {
+ level_[0] = 0;
+ level_[1] = 9;
+ window_[0] = 9;
+ window_[1] = 15;
+ strategy_[0] = 0;
+ strategy_[1] = 4;
+ }
+
+ void
+ level(int from, int to)
+ {
+ level_[0] = from;
+ level_[1] = to;
+ }
+
+ void
+ level(int what)
+ {
+ level(what, what);
+ }
+
+ void
+ window(int from, int to)
+ {
+ window_[0] = from;
+ window_[1] = to;
+ }
+
+ void
+ window(int what)
+ {
+ window(what, what);
+ }
+
+ void
+ strategy(int from, int to)
+ {
+ strategy_[0] = from;
+ strategy_[1] = to;
+ }
+
+ void
+ strategy(int what)
+ {
+ strategy(what, what);
+ }
+
+ template<class F>
+ void
+ operator()(
+ F const& f,
+ std::string const& check) const
+ {
+ for(auto level = level_[0];
+ level <= level_[1]; ++level)
+ {
+ for(auto window = window_[0];
+ window <= window_[1]; ++window)
+ {
+ for(auto strategy = strategy_[0];
+ strategy <= strategy_[1]; ++strategy)
+ f(
+ window,
+ compress(check, level, window, 4, strategy),
+ check,
+ suite_);
+ }
+ }
+ }
+ };
+
+ void
+ testInflate(IDecompressor& d)
+ {
+ {
+ Matrix m{*this};
+ std::string check =
+ "{\n \"AutobahnPython/0.6.0\": {\n"
+ " \"1.1.1\": {\n"
+ " \"behavior\": \"OK\",\n"
+ " \"behaviorClose\": \"OK\",\n"
+ " \"duration\": 2,\n"
+ " \"remoteCloseCode\": 1000,\n"
+ " \"reportfile\": \"autobahnpython_0_6_0_case_1_1_1.json\"\n"
+ ;
+ m(Beast{half, half}, check);
+ }
+
+ {
+ Matrix m{*this};
+ auto const check = corpus1(5000);
+ m(Beast{half, half}, check);
+ }
+ {
+ Matrix m{*this};
+ auto const check = corpus2(5000);
+ m(Beast{half, half}, check);
+ }
+ {
+ Matrix m{*this};
+ auto const check = corpus1(1000);
+ m.level(6);
+ m.window(9);
+ m.strategy(Z_DEFAULT_STRATEGY);
+ m(Beast{once, full}, check);
+ }
+ {
+ Matrix m{*this};
+ auto const check = corpus2(1000);
+ m.level(6);
+ m.window(9);
+ m.strategy(Z_DEFAULT_STRATEGY);
+ m(Beast{once, full}, check);
+ }
+ {
+ Matrix m{*this};
+ m.level(6);
+ m.window(9);
+ auto const check = corpus1(200);
+ m(Beast{full, full}, check);
+ }
+ {
+ Matrix m{*this};
+ m.level(6);
+ m.window(9);
+ auto const check = corpus2(500);
+ m(Beast{full, full}, check);
+ }
+ {
+ Matrix m{*this};
+ auto const check = corpus2(1000);
+ m.level(6);
+ m.window(9);
+ m.strategy(Z_DEFAULT_STRATEGY);
+ m(Beast{full, once, Flush::block}, check);
+ }
+ {
+ // Check a known string - this provides more stable coverage,
+ // independent of the RNG-generated strings.
+ Matrix m{*this};
+ auto const check =
+ "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do "
+ "eiusmod tempor incididunt ut labore et dolore magna aliqua. "
+ "Ultricies mi eget mauris pharetra et ultrices neque ornare. Eget est "
+ "lorem ipsum dolor. Dui faucibus in ornare quam viverra orci "
+ "sagittis. Lorem mollis aliquam ut porttitor. Pretium quam vulputate "
+ "dignissim suspendisse in est ante in. Tempus egestas sed sed risus "
+ "pretium quam vulputate dignissim. Pellentesque dignissim enim sit "
+ "amet venenatis urna. Eleifend quam adipiscing vitae proin sagittis "
+ "nisl rhoncus. Aliquam etiam erat velit scelerisque in. Accumsan in "
+ "nisl nisi scelerisque eu ultrices vitae auctor eu.";
+ m.level(6);
+ m.window(9);
+ m.strategy(Z_DEFAULT_STRATEGY);
+ m(Beast{full, full}, check);
+ }
+
+ // VFALCO Fails, but I'm unsure of what the correct
+ // behavior of Z_TREES/Flush::trees is.
+#if 0
+ {
+ Matrix m{*this};
+ auto const check = corpus2(10000);
+ m.level(6);
+ m.window(9);
+ m.strategy(Z_DEFAULT_STRATEGY);
+ m(Beast{full, once, Flush::trees}, check);
+ }
+#endif
+
+ check(d, {0x63, 0x18, 0x05, 0x40, 0x0c, 0x00}, {}, 8, 3);
+ check(d, {0xed, 0xc0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x80,
+ 0xa0, 0xfd, 0xa9, 0x17, 0xa9, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06}, {});
+ }
+
+ std::string check(IDecompressor& d,
+ std::initializer_list<std::uint8_t> const& in,
+ error_code expected,
+ std::size_t window_size = 15,
+ std::size_t len = -1)
+ {
+ std::string out(1024, 0);
+ z_params zs;
+ inflate_stream is;
+ is.reset(static_cast<int>(window_size));
+ boost::system::error_code ec;
+
+ zs.next_in = &*in.begin();
+ zs.next_out = &out[0];
+ zs.avail_in = std::min(in.size(), len);
+ zs.avail_out = out.size();
+
+ while (zs.avail_in > 0 && !ec)
+ {
+ is.write(zs, Flush::sync, ec);
+ auto n = std::min(zs.avail_in, len);
+ zs.next_in = static_cast<char const*>(zs.next_in) + n;
+ zs.avail_in -= n;
+ }
+
+ BEAST_EXPECT(ec == expected);
+ return out;
+ }
+
+ void testInflateErrors(IDecompressor& d)
+ {
+ check(d, {0x00, 0x00, 0x00, 0x00, 0x00},
+ error::invalid_stored_length);
+ check(d, {0x03, 0x00},
+ error::end_of_stream);
+ check(d, {0x06},
+ error::invalid_block_type);
+ check(d, {0xfc, 0x00, 0x00},
+ error::too_many_symbols);
+ check(d, {0x04, 0x00, 0xfe, 0xff},
+ error::incomplete_length_set);
+ check(d, {0x04, 0x00, 0x24, 0x49, 0x00},
+ error::invalid_bit_length_repeat);
+ check(d, {0x04, 0x00, 0x24, 0xe9, 0xff, 0xff},
+ error::invalid_bit_length_repeat);
+ check(d, {0x04, 0x00, 0x24, 0xe9, 0xff, 0x6d},
+ error::missing_eob);
+ check(d, {0x04, 0x80, 0x49, 0x92, 0x24, 0x49, 0x92, 0x24,
+ 0x71, 0xff, 0xff, 0x93, 0x11, 0x00},
+ error::over_subscribed_length);
+ check(d, {0x04, 0x80, 0x49, 0x92, 0x24, 0x0f, 0xb4, 0xff,
+ 0xff, 0xc3, 0x84},
+ error::incomplete_length_set);
+ check(d, {0x04, 0xc0, 0x81, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x7f, 0xeb, 0x0b, 0x00, 0x00},
+ error::invalid_literal_length);
+ check(d, {0x02, 0x7e, 0xff, 0xff},
+ error::invalid_distance_code);
+ check(d, {0x0c, 0xc0, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x90, 0xff, 0x6b, 0x04, 0x00},
+ error::invalid_distance);
+ check(d, {0x05,0xe0, 0x81, 0x91, 0x24, 0xcb, 0xb2, 0x2c,
+ 0x49, 0xe2, 0x0f, 0x2e, 0x8b, 0x9a, 0x47, 0x56,
+ 0x9f, 0xfb, 0xfe, 0xec, 0xd2, 0xff, 0x1f},
+ error::end_of_stream);
+ check(d, {0xed, 0xc0, 0x01, 0x01, 0x00, 0x00, 0x00, 0x40,
+ 0x20, 0xff, 0x57, 0x1b, 0x42, 0x2c, 0x4f},
+ error::end_of_stream);
+ check(d, {0x02, 0x08, 0x20, 0x80, 0x00, 0x03, 0x00},
+ error::end_of_stream);
+ check(d, {0x78, 0x9c, 0x03, 0x00, 0x00, 0x00, 0x00, 0x01, 0x78, 0x9c, 0xff},
+ error::invalid_stored_length);
+ }
+
+ void testInvalidSettings(IDecompressor& d)
+ {
+ except<std::domain_error>(
+ [&]()
+ {
+ d.init(7);
+ });
+ }
+
+ void testFixedHuffmanFlushTrees(IDecompressor& d)
+ {
+ std::string out(5, 0);
+ d.init();
+ boost::system::error_code ec;
+ std::initializer_list<std::uint8_t> in = {
+ 0xf2, 0x48, 0xcd, 0xc9, 0xc9, 0x07, 0x00, 0x00,
+ 0x00, 0xff, 0xff};
+ d.next_in(&*in.begin());
+ d.next_out(&out[0]);
+ d.avail_in(in.size());
+ d.avail_out(out.size());
+ ec = d.write(Flush::trees);
+ BEAST_EXPECT(!ec);
+ ec = d.write(Flush::sync);
+ BEAST_EXPECT(!ec);
+ BEAST_EXPECT(d.avail_out() == 0);
+ BEAST_EXPECT(out == "Hello");
+ }
+
+ void testUncompressedFlushTrees(IDecompressor& d)
+ {
+ std::string out(5, 0);
+ d.init();
+ boost::system::error_code ec;
+ std::initializer_list<std::uint8_t> in = {
+ 0x00, 0x05, 0x00, 0xfa, 0xff, 0x48, 0x65, 0x6c,
+ 0x6c, 0x6f, 0x00, 0x00};
+ d.next_in(&*in.begin());
+ d.next_out(&out[0]);
+ d.avail_in(in.size());
+ d.avail_out(out.size());
+ ec = d.write(Flush::trees);
+ BEAST_EXPECT(!ec);
+ ec = d.write(Flush::sync);
+ BEAST_EXPECT(!ec);
+ BEAST_EXPECT(d.avail_out() == 0);
+ BEAST_EXPECT(out == "Hello");
+ }
+
+ void
+ run() override
+ {
+ log <<
+ "sizeof(inflate_stream) == " <<
+ sizeof(inflate_stream) << std::endl;
+ testInflate(zlib_decompressor);
+ testInflate(beast_decompressor);
+ testInflateErrors(zlib_decompressor);
+ testInflateErrors(beast_decompressor);
+ testInvalidSettings(zlib_decompressor);
+ testInvalidSettings(beast_decompressor);
+ testFixedHuffmanFlushTrees(zlib_decompressor);
+ testFixedHuffmanFlushTrees(beast_decompressor);
+ testUncompressedFlushTrees(zlib_decompressor);
+ testUncompressedFlushTrees(beast_decompressor);
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,zlib,inflate_stream);
+
+} // zlib
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/beast/zlib/zlib.cpp b/src/boost/libs/beast/test/beast/zlib/zlib.cpp
new file mode 100644
index 000000000..982c315af
--- /dev/null
+++ b/src/boost/libs/beast/test/beast/zlib/zlib.cpp
@@ -0,0 +1,12 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Make sure symbols don't conflict with ZLib
+#include "zlib-1.2.11/zlib.h"
+#include <boost/beast/zlib.hpp>
diff --git a/src/boost/libs/beast/test/bench/CMakeLists.txt b/src/boost/libs/beast/test/bench/CMakeLists.txt
new file mode 100644
index 000000000..849f032a9
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/CMakeLists.txt
@@ -0,0 +1,14 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (buffers)
+add_subdirectory (parser)
+add_subdirectory (utf8_checker)
+add_subdirectory (wsload)
+add_subdirectory (zlib)
diff --git a/src/boost/libs/beast/test/bench/Jamfile b/src/boost/libs/beast/test/bench/Jamfile
new file mode 100644
index 000000000..44bae113c
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/Jamfile
@@ -0,0 +1,16 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+alias run-tests :
+ buffers//run-tests
+ parser//run-tests
+ wsload//run-tests
+ utf8_checker//run-tests
+ #zlib//run-tests # Not built, too slow
+ ;
diff --git a/src/boost/libs/beast/test/bench/buffers/CMakeLists.txt b/src/boost/libs/beast/test/bench/buffers/CMakeLists.txt
new file mode 100644
index 000000000..d05db11f4
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/buffers/CMakeLists.txt
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/bench/buffers "/")
+
+add_executable (bench-buffers
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ bench_buffers.cpp
+)
+
+target_link_libraries(bench-buffers
+ lib-asio
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET bench-buffers PROPERTY FOLDER "tests-bench")
diff --git a/src/boost/libs/beast/test/bench/buffers/Jamfile b/src/boost/libs/beast/test/bench/buffers/Jamfile
new file mode 100644
index 000000000..c73d8a115
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/buffers/Jamfile
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe bench-buffers :
+ bench_buffers.cpp
+ /boost/beast/test//lib-test
+ ;
+
+explicit bench-buffers ;
+
+alias run-tests :
+ [ compile bench_buffers.cpp ]
+ ;
diff --git a/src/boost/libs/beast/test/bench/buffers/bench_buffers.cpp b/src/boost/libs/beast/test/bench/buffers/bench_buffers.cpp
new file mode 100644
index 000000000..fdd00a470
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/buffers/bench_buffers.cpp
@@ -0,0 +1,241 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core/buffers_range.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/core/read_size.hpp>
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <boost/asio/streambuf.hpp>
+#include <algorithm>
+#include <chrono>
+#include <cstdlib>
+#include <iomanip>
+#include <utility>
+#include <vector>
+
+namespace boost {
+namespace beast {
+
+class buffers_test : public beast::unit_test::suite
+{
+public:
+ using size_type = std::uint64_t;
+
+ class timer
+ {
+ using clock_type =
+ std::chrono::system_clock;
+
+ clock_type::time_point when_;
+
+ public:
+ using duration =
+ clock_type::duration;
+
+ timer()
+ : when_(clock_type::now())
+ {
+ }
+
+ duration
+ elapsed() const
+ {
+ return clock_type::now() - when_;
+ }
+ };
+
+ inline
+ size_type
+ throughput(std::chrono::duration<
+ double> const& elapsed, size_type items)
+ {
+ using namespace std::chrono;
+ return static_cast<size_type>(
+ 1 / (elapsed/items).count());
+ }
+
+ template<class MutableBufferSequence>
+ static
+ std::size_t
+ fill(MutableBufferSequence const& buffers)
+ {
+ std::size_t n = 0;
+ for(auto b : beast::buffers_range_ref(buffers))
+ {
+ std::fill(
+ static_cast<char*>(b.data()),
+ static_cast<char*>(b.data()) +
+ b.size(), '\0');
+ n += b.size();
+ }
+ return n;
+ }
+
+ template<class DynamicBuffer>
+ size_type
+ do_prepares(std::size_t repeat,
+ std::size_t count, std::size_t size)
+ {
+ timer t;
+ size_type total = 0;
+ for(auto i = repeat; i--;)
+ {
+ DynamicBuffer b;
+ for(auto j = count; j--;)
+ {
+ auto const n = fill(b.prepare(size));
+ b.commit(n);
+ total += n;
+ }
+ }
+ return throughput(t.elapsed(), total);
+ }
+
+ template<class DynamicBuffer>
+ size_type
+ do_hints(std::size_t repeat,
+ std::size_t count, std::size_t size)
+ {
+ timer t;
+ size_type total = 0;
+ for(auto i = repeat; i--;)
+ {
+ DynamicBuffer b;
+ for(auto j = count; j--;)
+ {
+ for(auto remain = size; remain;)
+ {
+ auto const n = fill(b.prepare(
+ read_size(b, remain)));
+ b.commit(n);
+ remain -= n;
+ total += n;
+ }
+ }
+ }
+ return throughput(t.elapsed(), total);
+ }
+
+ template<class DynamicBuffer>
+ size_type
+ do_random(std::size_t repeat,
+ std::size_t count, std::size_t size)
+ {
+ timer t;
+ size_type total = 0;
+ for(auto i = repeat; i--;)
+ {
+ DynamicBuffer b;
+ for(auto j = count; j--;)
+ {
+ auto const n = fill(b.prepare(
+ 1 + (rand()%(2*size))));
+ b.commit(n);
+ total += n;
+ }
+ }
+ return throughput(t.elapsed(), total);
+ }
+
+ static
+ inline
+ void
+ do_trials_1(bool)
+ {
+ }
+
+ template<class F0, class... FN>
+ void
+ do_trials_1(bool print, F0&& f, FN... fn)
+ {
+ timer t;
+ using namespace std::chrono;
+ static size_type constexpr den = 1024 * 1024;
+ if(print)
+ {
+ log << std::right << std::setw(10) <<
+ ((f() + (den / 2)) / den) << " MB/s";
+ log.flush();
+ }
+ else
+ {
+ f();
+ }
+ do_trials_1(print, fn...);
+ }
+
+ template<class F0, class... FN>
+ void
+ do_trials(string_view name,
+ std::size_t trials, F0&& f0, FN... fn)
+ {
+ using namespace std::chrono;
+ // warm-up
+ do_trials_1(false, f0, fn...);
+ do_trials_1(false, f0, fn...);
+ while(trials--)
+ {
+ timer t;
+ log << std::left << std::setw(24) << name << ":";
+ log.flush();
+ do_trials_1(true, f0, fn...);
+ log << " " <<
+ duration_cast<milliseconds>(t.elapsed()).count() << "ms";
+ log << std::endl;
+ }
+ }
+
+ void
+ run() override
+ {
+ static std::size_t constexpr trials = 1;
+ static std::size_t constexpr repeat = 250;
+ std::vector<std::pair<std::size_t, std::size_t>> params;
+ params.emplace_back(1024, 1024);
+ params.emplace_back(512, 4096);
+ params.emplace_back(256, 32768);
+ log << std::endl;
+ for(auto const& param : params)
+ {
+ auto const count = param.first;
+ auto const size = param.second;
+ auto const s = std::string("count=") + std::to_string(count) +
+ ", size=" + std::to_string(size);
+ log << std::left << std::setw(24) << s << " " <<
+ std::right << std::setw(15) << "prepare" <<
+ std::right << std::setw(15) << "with hint" <<
+ std::right << std::setw(15) << "random" <<
+ std::endl;
+ do_trials("multi_buffer", trials,
+ [&](){ return do_prepares<multi_buffer>(repeat, count, size); }
+ ,[&](){ return do_hints <multi_buffer>(repeat, count, size); }
+ ,[&](){ return do_random <multi_buffer>(repeat, count, size); }
+ );
+ do_trials("flat_buffer", trials,
+ [&](){ return do_prepares<flat_buffer>(repeat, count, size); }
+ ,[&](){ return do_hints <flat_buffer>(repeat, count, size); }
+ ,[&](){ return do_random <flat_buffer>(repeat, count, size); }
+ );
+ do_trials("net::streambuf", trials,
+ [&](){ return do_prepares<net::streambuf>(repeat, count, size); }
+ ,[&](){ return do_hints <net::streambuf>(repeat, count, size); }
+ ,[&](){ return do_random <net::streambuf>(repeat, count, size); }
+ );
+ log << std::endl;
+ }
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,benchmarks,buffers);
+
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/bench/parser/CMakeLists.txt b/src/boost/libs/beast/test/bench/parser/CMakeLists.txt
new file mode 100644
index 000000000..4a4eb2ce9
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/CMakeLists.txt
@@ -0,0 +1,29 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/beast/http "/")
+GroupSources (test/bench/parser "/")
+
+add_executable (bench-parser
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ ${PROJECT_SOURCE_DIR}/test/beast/http/message_fuzz.hpp
+ nodejs_parser.hpp
+ nodejs_parser.cpp
+ bench_parser.cpp
+)
+
+target_link_libraries(bench-parser
+ lib-asio
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET bench-parser PROPERTY FOLDER "tests-bench")
diff --git a/src/boost/libs/beast/test/bench/parser/Jamfile b/src/boost/libs/beast/test/bench/parser/Jamfile
new file mode 100644
index 000000000..43629fc3f
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/Jamfile
@@ -0,0 +1,22 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+run
+ nodejs_parser.cpp
+ bench_parser.cpp
+ /boost/beast/test//lib-test
+ : : : :
+ bench-parser ;
+
+explicit bench-parser ;
+
+alias run-tests :
+ [ compile nodejs_parser.cpp ]
+ [ compile bench_parser.cpp ]
+ ;
diff --git a/src/boost/libs/beast/test/bench/parser/bench_parser.cpp b/src/boost/libs/beast/test/bench/parser/bench_parser.cpp
new file mode 100644
index 000000000..67cc99a0c
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/bench_parser.cpp
@@ -0,0 +1,346 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include "nodejs_parser.hpp"
+
+#include "test/beast/http/message_fuzz.hpp"
+
+#include <boost/beast/http.hpp>
+#include <boost/beast/core/buffer_traits.hpp>
+#include <boost/beast/core/buffers_suffix.hpp>
+#include <boost/beast/core/buffers_to_string.hpp>
+#include <boost/beast/core/ostream.hpp>
+#include <boost/beast/core/flat_buffer.hpp>
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <chrono>
+#include <iostream>
+#include <vector>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+class parser_test : public beast::unit_test::suite
+{
+public:
+ static std::size_t constexpr N = 2000;
+
+ //using corpus = std::vector<multi_buffer>;
+ using corpus = std::vector<flat_buffer>;
+
+ corpus creq_;
+ corpus cres_;
+ std::size_t size_ = 0;
+
+ corpus
+ build_corpus(std::size_t n, std::true_type)
+ {
+ corpus v;
+ v.resize(n);
+ message_fuzz mg;
+ for(std::size_t i = 0; i < n; ++i)
+ {
+ mg.request(v[i]);
+ size_ += v[i].size();
+ BEAST_EXPECT(v[i].size() > 0);
+ }
+ return v;
+ }
+
+ corpus
+ build_corpus(std::size_t n, std::false_type)
+ {
+ corpus v;
+ v.resize(n);
+ message_fuzz mg;
+ for(std::size_t i = 0; i < n; ++i)
+ {
+ mg.response(v[i]);
+ size_ += v[i].size();
+ BEAST_EXPECT(v[i].size() > 0);
+ }
+ return v;
+ }
+
+ template<class ConstBufferSequence,
+ bool isRequest>
+ static
+ std::size_t
+ feed(ConstBufferSequence const& buffers,
+ basic_parser<isRequest>& parser,
+ error_code& ec)
+ {
+ beast::buffers_suffix<
+ ConstBufferSequence> cb{buffers};
+ std::size_t used = 0;
+ for(;;)
+ {
+ auto const n =
+ parser.put(cb, ec);
+ if(ec)
+ return 0;
+ if(n == 0)
+ break;
+ cb.consume(n);
+ used += n;
+ if(parser.is_done())
+ break;
+ if(buffer_bytes(cb) == 0)
+ break;
+ }
+ return used;
+ }
+
+ template<class Parser>
+ void
+ testParser1(std::size_t repeat, corpus const& v)
+ {
+ while(repeat--)
+ for(auto const& b : v)
+ {
+ Parser p;
+ error_code ec;
+ p.write(b.data(), ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ log << buffers_to_string(b.data()) << std::endl;
+ }
+ }
+
+ template<class Parser>
+ void
+ testParser2(std::size_t repeat, corpus const& v)
+ {
+ while(repeat--)
+ for(auto const& b : v)
+ {
+ Parser p;
+ p.header_limit((std::numeric_limits<std::uint32_t>::max)());
+ error_code ec;
+ feed(b.data(), p, ec);
+ if(! BEAST_EXPECTS(! ec, ec.message()))
+ log << buffers_to_string(b.data()) << std::endl;
+ }
+ }
+
+ template<class Function>
+ void
+ timedTest(std::size_t repeat, std::string const& name, Function&& f)
+ {
+ using namespace std::chrono;
+ using clock_type = std::chrono::high_resolution_clock;
+ log << name << std::endl;
+ for(std::size_t trial = 1; trial <= repeat; ++trial)
+ {
+ auto const t0 = clock_type::now();
+ f();
+ auto const elapsed = clock_type::now() - t0;
+ log <<
+ "Trial " << trial << ": " <<
+ duration_cast<milliseconds>(elapsed).count() << " ms" << std::endl;
+ }
+ }
+
+ template<bool isRequest>
+ struct null_parser :
+ basic_parser<isRequest>
+ {
+ void
+ on_request_impl(
+ verb, string_view, string_view,
+ int, error_code&) override
+ {
+ }
+
+ void
+ on_response_impl(
+ int, string_view, int,
+ error_code&) override
+ {
+ }
+
+ void
+ on_field_impl(
+ field, string_view, string_view,
+ error_code&) override
+ {
+ }
+
+ void
+ on_header_impl(error_code&) override
+ {
+ }
+
+ void
+ on_body_init_impl(
+ boost::optional<std::uint64_t> const&,
+ error_code&) override
+ {
+ }
+
+ std::size_t
+ on_body_impl(
+ string_view,
+ error_code&) override
+ {
+ return 0;
+ }
+
+ void
+ on_chunk_header_impl(
+ std::uint64_t,
+ string_view,
+ error_code&) override
+ {
+ }
+
+ std::size_t
+ on_chunk_body_impl(
+ std::uint64_t,
+ string_view,
+ error_code&) override
+ {
+ return 0;
+ }
+
+ void
+ on_finish_impl(error_code&) override
+ {
+ }
+ };
+
+ template<bool isRequest, class Body, class Fields>
+ struct bench_parser : basic_parser<isRequest>
+ {
+ using mutable_buffers_type =
+ net::mutable_buffer;
+
+ void
+ on_request_impl(verb, string_view,
+ string_view, int, error_code&) override
+ {
+ }
+
+ void
+ on_response_impl(int,
+ string_view, int, error_code&) override
+ {
+ }
+
+ void
+ on_field_impl(field,
+ string_view, string_view, error_code&) override
+ {
+ }
+
+ void
+ on_header_impl(error_code&) override
+ {
+ }
+
+ void
+ on_body_init_impl(
+ boost::optional<std::uint64_t> const&,
+ error_code&) override
+ {
+ }
+
+ std::size_t
+ on_body_impl(
+ string_view s, error_code&) override
+ {
+ return s.size();
+ }
+
+ void
+ on_chunk_header_impl(std::uint64_t,
+ string_view, error_code&) override
+ {
+ }
+
+ std::size_t
+ on_chunk_body_impl(std::uint64_t,
+ string_view s, error_code&) override
+ {
+ return s.size();
+ }
+
+ void
+ on_finish_impl(error_code&) override
+ {
+ }
+ };
+
+ void
+ testSpeed()
+ {
+ static std::size_t constexpr Trials = 5;
+ static std::size_t constexpr Repeat = 500;
+
+ creq_ = build_corpus(N/2, std::true_type{});
+ cres_ = build_corpus(N/2, std::false_type{});
+
+ log << "sizeof(request parser) == " <<
+ sizeof(null_parser<true>) << '\n';
+
+ log << "sizeof(response parser) == " <<
+ sizeof(null_parser<false>)<< '\n';
+
+ testcase << "Parser speed test, " <<
+ ((Repeat * size_ + 512) / 1024) << "KB in " <<
+ (Repeat * (creq_.size() + cres_.size())) << " messages";
+
+#if 0
+ timedTest(Trials, "http::parser",
+ [&]
+ {
+ testParser2<request_parser<dynamic_body>>(Repeat, creq_);
+ testParser2<response_parser<dynamic_body>>(Repeat, cres_);
+ });
+#endif
+#if 1
+ timedTest(Trials, "http::basic_parser",
+ [&]
+ {
+ testParser2<bench_parser<
+ true, dynamic_body, fields> >(
+ Repeat, creq_);
+ testParser2<bench_parser<
+ false, dynamic_body, fields>>(
+ Repeat, cres_);
+ });
+#if 1
+ timedTest(Trials, "nodejs_parser",
+ [&]
+ {
+ testParser1<nodejs_parser<
+ true, dynamic_body, fields>>(
+ Repeat, creq_);
+ testParser1<nodejs_parser<
+ false, dynamic_body, fields>>(
+ Repeat, cres_);
+ });
+#endif
+#endif
+ pass();
+ }
+
+ void run() override
+ {
+ pass();
+ testSpeed();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,benchmarks,parser);
+
+} // http
+} // beast
+} // boost
+
diff --git a/src/boost/libs/beast/test/bench/parser/nodejs-parser/AUTHORS b/src/boost/libs/beast/test/bench/parser/nodejs-parser/AUTHORS
new file mode 100644
index 000000000..5323b685c
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/nodejs-parser/AUTHORS
@@ -0,0 +1,68 @@
+# Authors ordered by first contribution.
+Ryan Dahl <ry@tinyclouds.org>
+Jeremy Hinegardner <jeremy@hinegardner.org>
+Sergey Shepelev <temotor@gmail.com>
+Joe Damato <ice799@gmail.com>
+tomika <tomika_nospam@freemail.hu>
+Phoenix Sol <phoenix@burninglabs.com>
+Cliff Frey <cliff@meraki.com>
+Ewen Cheslack-Postava <ewencp@cs.stanford.edu>
+Santiago Gala <sgala@apache.org>
+Tim Becker <tim.becker@syngenio.de>
+Jeff Terrace <jterrace@gmail.com>
+Ben Noordhuis <info@bnoordhuis.nl>
+Nathan Rajlich <nathan@tootallnate.net>
+Mark Nottingham <mnot@mnot.net>
+Aman Gupta <aman@tmm1.net>
+Tim Becker <tim.becker@kuriositaet.de>
+Sean Cunningham <sean.cunningham@mandiant.com>
+Peter Griess <pg@std.in>
+Salman Haq <salman.haq@asti-usa.com>
+Cliff Frey <clifffrey@gmail.com>
+Jon Kolb <jon@b0g.us>
+Fouad Mardini <f.mardini@gmail.com>
+Paul Querna <pquerna@apache.org>
+Felix Geisendörfer <felix@debuggable.com>
+koichik <koichik@improvement.jp>
+Andre Caron <andre.l.caron@gmail.com>
+Ivo Raisr <ivosh@ivosh.net>
+James McLaughlin <jamie@lacewing-project.org>
+David Gwynne <loki@animata.net>
+Thomas LE ROUX <thomas@november-eleven.fr>
+Randy Rizun <rrizun@ortivawireless.com>
+Andre Louis Caron <andre.louis.caron@usherbrooke.ca>
+Simon Zimmermann <simonz05@gmail.com>
+Erik Dubbelboer <erik@dubbelboer.com>
+Martell Malone <martellmalone@gmail.com>
+Bertrand Paquet <bpaquet@octo.com>
+BogDan Vatra <bogdan@kde.org>
+Peter Faiman <peter@thepicard.org>
+Corey Richardson <corey@octayn.net>
+Tóth Tamás <tomika_nospam@freemail.hu>
+Cam Swords <cam.swords@gmail.com>
+Chris Dickinson <christopher.s.dickinson@gmail.com>
+Uli Köhler <ukoehler@btronik.de>
+Charlie Somerville <charlie@charliesomerville.com>
+Patrik Stutz <patrik.stutz@gmail.com>
+Fedor Indutny <fedor.indutny@gmail.com>
+runner <runner.mei@gmail.com>
+Alexis Campailla <alexis@janeasystems.com>
+David Wragg <david@wragg.org>
+Vinnie Falco <vinnie.falco@gmail.com>
+Alex Butum <alexbutum@linux.com>
+Rex Feng <rexfeng@gmail.com>
+Alex Kocharin <alex@kocharin.ru>
+Mark Koopman <markmontymark@yahoo.com>
+Helge Heß <me@helgehess.eu>
+Alexis La Goutte <alexis.lagoutte@gmail.com>
+George Miroshnykov <george.miroshnykov@gmail.com>
+Maciej Małecki <me@mmalecki.com>
+Marc O'Morain <github.com@marcomorain.com>
+Jeff Pinner <jpinner@twitter.com>
+Timothy J Fontaine <tjfontaine@gmail.com>
+Akagi201 <akagi201@gmail.com>
+Romain Giraud <giraud.romain@gmail.com>
+Jay Satiro <raysatiro@yahoo.com>
+Arne Steen <Arne.Steen@gmx.de>
+Kjell Schubert <kjell.schubert@gmail.com>
+Olivier Mengué <dolmen@cpan.org>
diff --git a/src/boost/libs/beast/test/bench/parser/nodejs-parser/LICENSE-MIT b/src/boost/libs/beast/test/bench/parser/nodejs-parser/LICENSE-MIT
new file mode 100644
index 000000000..58010b388
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/nodejs-parser/LICENSE-MIT
@@ -0,0 +1,23 @@
+http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright
+Igor Sysoev.
+
+Additional changes are licensed under the same terms as NGINX and
+copyright Joyent, Inc. and other Node contributors. All rights reserved.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+IN THE SOFTWARE.
diff --git a/src/boost/libs/beast/test/bench/parser/nodejs-parser/README.md b/src/boost/libs/beast/test/bench/parser/nodejs-parser/README.md
new file mode 100644
index 000000000..eedd7f8c9
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/nodejs-parser/README.md
@@ -0,0 +1,246 @@
+HTTP Parser
+===========
+
+[![Build Status](https://api.travis-ci.org/nodejs/http-parser.svg?branch=master)](https://travis-ci.org/nodejs/http-parser)
+
+This is a parser for HTTP messages written in C. It parses both requests and
+responses. The parser is designed to be used in performance HTTP
+applications. It does not make any syscalls nor allocations, it does not
+buffer data, it can be interrupted at anytime. Depending on your
+architecture, it only requires about 40 bytes of data per message
+stream (in a web server that is per connection).
+
+Features:
+
+ * No dependencies
+ * Handles persistent streams (keep-alive).
+ * Decodes chunked encoding.
+ * Upgrade support
+ * Defends against buffer overflow attacks.
+
+The parser extracts the following information from HTTP messages:
+
+ * Header fields and values
+ * Content-Length
+ * Request method
+ * Response status code
+ * Transfer-Encoding
+ * HTTP version
+ * Request URL
+ * Message body
+
+
+Usage
+-----
+
+One `http_parser` object is used per TCP connection. Initialize the struct
+using `http_parser_init()` and set the callbacks. That might look something
+like this for a request parser:
+```c
+http_parser_settings settings;
+settings.on_url = my_url_callback;
+settings.on_header_field = my_header_field_callback;
+/* ... */
+
+http_parser *parser = malloc(sizeof(http_parser));
+http_parser_init(parser, HTTP_REQUEST);
+parser->data = my_socket;
+```
+
+When data is received on the socket execute the parser and check for errors.
+
+```c
+size_t len = 80*1024, nparsed;
+char buf[len];
+ssize_t recved;
+
+recved = recv(fd, buf, len, 0);
+
+if (recved < 0) {
+ /* Handle error. */
+}
+
+/* Start up / continue the parser.
+ * Note we pass recved==0 to signal that EOF has been received.
+ */
+nparsed = http_parser_execute(parser, &settings, buf, recved);
+
+if (parser->upgrade) {
+ /* handle new protocol */
+} else if (nparsed != recved) {
+ /* Handle error. Usually just close the connection. */
+}
+```
+
+HTTP needs to know where the end of the stream is. For example, sometimes
+servers send responses without Content-Length and expect the client to
+consume input (for the body) until EOF. To tell http_parser about EOF, give
+`0` as the fourth parameter to `http_parser_execute()`. Callbacks and errors
+can still be encountered during an EOF, so one must still be prepared
+to receive them.
+
+Scalar valued message information such as `status_code`, `method`, and the
+HTTP version are stored in the parser structure. This data is only
+temporally stored in `http_parser` and gets reset on each new message. If
+this information is needed later, copy it out of the structure during the
+`headers_complete` callback.
+
+The parser decodes the transfer-encoding for both requests and responses
+transparently. That is, a chunked encoding is decoded before being sent to
+the on_body callback.
+
+
+The Special Problem of Upgrade
+------------------------------
+
+HTTP supports upgrading the connection to a different protocol. An
+increasingly common example of this is the WebSocket protocol which sends
+a request like
+
+ GET /demo HTTP/1.1
+ Upgrade: WebSocket
+ Connection: Upgrade
+ Host: example.com
+ Origin: http://example.com
+ WebSocket-Protocol: sample
+
+followed by non-HTTP data.
+
+(See [RFC6455](https://tools.ietf.org/html/rfc6455) for more information the
+WebSocket protocol.)
+
+To support this, the parser will treat this as a normal HTTP message without a
+body, issuing both on_headers_complete and on_message_complete callbacks. However
+http_parser_execute() will stop parsing at the end of the headers and return.
+
+The user is expected to check if `parser->upgrade` has been set to 1 after
+`http_parser_execute()` returns. Non-HTTP data begins at the buffer supplied
+offset by the return value of `http_parser_execute()`.
+
+
+Callbacks
+---------
+
+During the `http_parser_execute()` call, the callbacks set in
+`http_parser_settings` will be executed. The parser maintains state and
+never looks behind, so buffering the data is not necessary. If you need to
+save certain data for later usage, you can do that from the callbacks.
+
+There are two types of callbacks:
+
+* notification `typedef int (*http_cb) (http_parser*);`
+ Callbacks: on_message_begin, on_headers_complete, on_message_complete.
+* data `typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);`
+ Callbacks: (requests only) on_url,
+ (common) on_header_field, on_header_value, on_body;
+
+Callbacks must return 0 on success. Returning a non-zero value indicates
+error to the parser, making it exit immediately.
+
+For cases where it is necessary to pass local information to/from a callback,
+the `http_parser` object's `data` field can be used.
+An example of such a case is when using threads to handle a socket connection,
+parse a request, and then give a response over that socket. By instantiation
+of a thread-local struct containing relevant data (e.g. accepted socket,
+allocated memory for callbacks to write into, etc), a parser's callbacks are
+able to communicate data between the scope of the thread and the scope of the
+callback in a threadsafe manner. This allows http-parser to be used in
+multi-threaded contexts.
+
+Example:
+```
+ typedef struct {
+ socket_t sock;
+ void* buffer;
+ int buf_len;
+ } custom_data_t;
+
+
+int my_url_callback(http_parser* parser, const char *at, size_t length) {
+ /* access to thread local custom_data_t struct.
+ Use this access save parsed data for later use into thread local
+ buffer, or communicate over socket
+ */
+ parser->data;
+ ...
+ return 0;
+}
+
+...
+
+void http_parser_thread(socket_t sock) {
+ int nparsed = 0;
+ /* allocate memory for user data */
+ custom_data_t *my_data = malloc(sizeof(custom_data_t));
+
+ /* some information for use by callbacks.
+ * achieves thread -> callback information flow */
+ my_data->sock = sock;
+
+ /* instantiate a thread-local parser */
+ http_parser *parser = malloc(sizeof(http_parser));
+ http_parser_init(parser, HTTP_REQUEST); /* initialise parser */
+ /* this custom data reference is accessible through the reference to the
+ parser supplied to callback functions */
+ parser->data = my_data;
+
+ http_parser_settings settings; / * set up callbacks */
+ settings.on_url = my_url_callback;
+
+ /* execute parser */
+ nparsed = http_parser_execute(parser, &settings, buf, recved);
+
+ ...
+ /* parsed information copied from callback.
+ can now perform action on data copied into thread-local memory from callbacks.
+ achieves callback -> thread information flow */
+ my_data->buffer;
+ ...
+}
+
+```
+
+In case you parse HTTP message in chunks (i.e. `read()` request line
+from socket, parse, read half headers, parse, etc) your data callbacks
+may be called more than once. Http-parser guarantees that data pointer is only
+valid for the lifetime of callback. You can also `read()` into a heap allocated
+buffer to avoid copying memory around if this fits your application.
+
+Reading headers may be a tricky task if you read/parse headers partially.
+Basically, you need to remember whether last header callback was field or value
+and apply the following logic:
+
+ (on_header_field and on_header_value shortened to on_h_*)
+ ------------------------ ------------ --------------------------------------------
+ | State (prev. callback) | Callback | Description/action |
+ ------------------------ ------------ --------------------------------------------
+ | nothing (first call) | on_h_field | Allocate new buffer and copy callback data |
+ | | | into it |
+ ------------------------ ------------ --------------------------------------------
+ | value | on_h_field | New header started. |
+ | | | Copy current name,value buffers to headers |
+ | | | list and allocate new buffer for new name |
+ ------------------------ ------------ --------------------------------------------
+ | field | on_h_field | Previous name continues. Reallocate name |
+ | | | buffer and append callback data to it |
+ ------------------------ ------------ --------------------------------------------
+ | field | on_h_value | Value for current header started. Allocate |
+ | | | new buffer and copy callback data to it |
+ ------------------------ ------------ --------------------------------------------
+ | value | on_h_value | Value continues. Reallocate value buffer |
+ | | | and append callback data to it |
+ ------------------------ ------------ --------------------------------------------
+
+
+Parsing URLs
+------------
+
+A simplistic zero-copy URL parser is provided as `http_parser_parse_url()`.
+Users of this library may wish to use it to parse URLs constructed from
+consecutive `on_url` callbacks.
+
+See examples of reading in headers:
+
+* [partial example](http://gist.github.com/155877) in C
+* [from http-parser tests](http://github.com/joyent/http-parser/blob/37a0ff8/test.c#L403) in C
+* [from Node library](http://github.com/joyent/node/blob/842eaf4/src/http.js#L284) in Javascript
diff --git a/src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.c b/src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.c
new file mode 100644
index 000000000..719617549
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.c
@@ -0,0 +1,2468 @@
+/* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev
+ *
+ * Additional changes are licensed under the same terms as NGINX and
+ * copyright Joyent, Inc. and other Node contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+#include "http_parser.h"
+#include <assert.h>
+#include <stddef.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <string.h>
+#include <limits.h>
+
+#ifndef ULLONG_MAX
+# define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */
+#endif
+
+#ifndef MIN
+# define MIN(a,b) ((a) < (b) ? (a) : (b))
+#endif
+
+#ifndef ARRAY_SIZE
+# define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0]))
+#endif
+
+#ifndef BIT_AT
+# define BIT_AT(a, i) \
+ (!!((unsigned int) (a)[(unsigned int) (i) >> 3] & \
+ (1 << ((unsigned int) (i) & 7))))
+#endif
+
+#ifndef ELEM_AT
+# define ELEM_AT(a, i, v) ((unsigned int) (i) < ARRAY_SIZE(a) ? (a)[(i)] : (v))
+#endif
+
+#define SET_ERRNO(e) \
+do { \
+ parser->http_errno = (e); \
+} while(0)
+
+#define CURRENT_STATE() p_state
+#define UPDATE_STATE(V) p_state = (enum state) (V);
+#define RETURN(V) \
+do { \
+ parser->state = CURRENT_STATE(); \
+ return (V); \
+} while (0);
+#define REEXECUTE() \
+ goto reexecute; \
+
+
+#ifdef __GNUC__
+# define LIKELY(X) __builtin_expect(!!(X), 1)
+# define UNLIKELY(X) __builtin_expect(!!(X), 0)
+#else
+# define LIKELY(X) (X)
+# define UNLIKELY(X) (X)
+#endif
+
+
+/* Run the notify callback FOR, returning ER if it fails */
+#define CALLBACK_NOTIFY_(FOR, ER) \
+do { \
+ assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
+ \
+ if (LIKELY(settings->on_##FOR)) { \
+ parser->state = CURRENT_STATE(); \
+ if (UNLIKELY(0 != settings->on_##FOR(parser))) { \
+ SET_ERRNO(HPE_CB_##FOR); \
+ } \
+ UPDATE_STATE(parser->state); \
+ \
+ /* We either errored above or got paused; get out */ \
+ if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \
+ return (ER); \
+ } \
+ } \
+} while (0)
+
+/* Run the notify callback FOR and consume the current byte */
+#define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1)
+
+/* Run the notify callback FOR and don't consume the current byte */
+#define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data)
+
+/* Run data callback FOR with LEN bytes, returning ER if it fails */
+#define CALLBACK_DATA_(FOR, LEN, ER) \
+do { \
+ assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
+ \
+ if (FOR##_mark) { \
+ if (LIKELY(settings->on_##FOR)) { \
+ parser->state = CURRENT_STATE(); \
+ if (UNLIKELY(0 != \
+ settings->on_##FOR(parser, FOR##_mark, (LEN)))) { \
+ SET_ERRNO(HPE_CB_##FOR); \
+ } \
+ UPDATE_STATE(parser->state); \
+ \
+ /* We either errored above or got paused; get out */ \
+ if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \
+ return (ER); \
+ } \
+ } \
+ FOR##_mark = NULL; \
+ } \
+} while (0)
+
+/* Run the data callback FOR and consume the current byte */
+#define CALLBACK_DATA(FOR) \
+ CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1)
+
+/* Run the data callback FOR and don't consume the current byte */
+#define CALLBACK_DATA_NOADVANCE(FOR) \
+ CALLBACK_DATA_(FOR, p - FOR##_mark, p - data)
+
+/* Set the mark FOR; non-destructive if mark is already set */
+#define MARK(FOR) \
+do { \
+ if (!FOR##_mark) { \
+ FOR##_mark = p; \
+ } \
+} while (0)
+
+/* Don't allow the total size of the HTTP headers (including the status
+ * line) to exceed HTTP_MAX_HEADER_SIZE. This check is here to protect
+ * embedders against denial-of-service attacks where the attacker feeds
+ * us a never-ending header that the embedder keeps buffering.
+ *
+ * This check is arguably the responsibility of embedders but we're doing
+ * it on the embedder's behalf because most won't bother and this way we
+ * make the web a little safer. HTTP_MAX_HEADER_SIZE is still far bigger
+ * than any reasonable request or response so this should never affect
+ * day-to-day operation.
+ */
+#define COUNT_HEADER_SIZE(V) \
+do { \
+ parser->nread += (V); \
+ if (UNLIKELY(parser->nread > (HTTP_MAX_HEADER_SIZE))) { \
+ SET_ERRNO(HPE_HEADER_OVERFLOW); \
+ goto error; \
+ } \
+} while (0)
+
+
+#define PROXY_CONNECTION "proxy-connection"
+#define CONNECTION "connection"
+#define CONTENT_LENGTH "content-length"
+#define TRANSFER_ENCODING "transfer-encoding"
+#define UPGRADE "upgrade"
+#define CHUNKED "chunked"
+#define KEEP_ALIVE "keep-alive"
+#define CLOSE "close"
+
+
+static const char *method_strings[] =
+ {
+#define XX(num, name, string) #string,
+ HTTP_METHOD_MAP(XX)
+#undef XX
+ };
+
+
+/* Tokens as defined by rfc 2616. Also lowercases them.
+ * token = 1*<any CHAR except CTLs or separators>
+ * separators = "(" | ")" | "<" | ">" | "@"
+ * | "," | ";" | ":" | "\" | <">
+ * | "/" | "[" | "]" | "?" | "="
+ * | "{" | "}" | SP | HT
+ */
+static const char tokens[256] = {
+/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */
+ 0, 0, 0, 0, 0, 0, 0, 0,
+/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */
+ 0, '!', 0, '#', '$', '%', '&', '\'',
+/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */
+ 0, 0, '*', '+', 0, '-', '.', 0,
+/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */
+ '0', '1', '2', '3', '4', '5', '6', '7',
+/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */
+ '8', '9', 0, 0, 0, 0, 0, 0,
+/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */
+ 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
+/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */
+ 'x', 'y', 'z', 0, 0, 0, '^', '_',
+/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */
+ '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g',
+/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */
+ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o',
+/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */
+ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w',
+/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */
+ 'x', 'y', 'z', 0, '|', 0, '~', 0 };
+
+
+static const int8_t unhex[256] =
+ {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
+ , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1
+ ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
+ ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1
+ ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1
+ };
+
+
+#if HTTP_PARSER_STRICT
+# define T(v) 0
+#else
+# define T(v) v
+#endif
+
+
+static const uint8_t normal_url_char[32] = {
+/* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */
+ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
+/* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */
+ 0 | T(2) | 0 | 0 | T(16) | 0 | 0 | 0,
+/* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */
+ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
+/* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */
+ 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
+/* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */
+ 0 | 2 | 4 | 0 | 16 | 32 | 64 | 128,
+/* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0,
+/* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 128,
+/* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */
+ 1 | 2 | 4 | 8 | 16 | 32 | 64 | 0, };
+
+#undef T
+
+enum state
+ { s_dead = 1 /* important that this is > 0 */
+
+ , s_start_req_or_res
+ , s_res_or_resp_H
+ , s_start_res
+ , s_res_H
+ , s_res_HT
+ , s_res_HTT
+ , s_res_HTTP
+ , s_res_first_http_major
+ , s_res_http_major
+ , s_res_first_http_minor
+ , s_res_http_minor
+ , s_res_first_status_code
+ , s_res_status_code
+ , s_res_status_start
+ , s_res_status
+ , s_res_line_almost_done
+
+ , s_start_req
+
+ , s_req_method
+ , s_req_spaces_before_url
+ , s_req_schema
+ , s_req_schema_slash
+ , s_req_schema_slash_slash
+ , s_req_server_start
+ , s_req_server
+ , s_req_server_with_at
+ , s_req_path
+ , s_req_query_string_start
+ , s_req_query_string
+ , s_req_fragment_start
+ , s_req_fragment
+ , s_req_http_start
+ , s_req_http_H
+ , s_req_http_HT
+ , s_req_http_HTT
+ , s_req_http_HTTP
+ , s_req_first_http_major
+ , s_req_http_major
+ , s_req_first_http_minor
+ , s_req_http_minor
+ , s_req_line_almost_done
+
+ , s_header_field_start
+ , s_header_field
+ , s_header_value_discard_ws
+ , s_header_value_discard_ws_almost_done
+ , s_header_value_discard_lws
+ , s_header_value_start
+ , s_header_value
+ , s_header_value_lws
+
+ , s_header_almost_done
+
+ , s_chunk_size_start
+ , s_chunk_size
+ , s_chunk_parameters
+ , s_chunk_size_almost_done
+
+ , s_headers_almost_done
+ , s_headers_done
+
+ /* Important: 's_headers_done' must be the last 'header' state. All
+ * states beyond this must be 'body' states. It is used for overflow
+ * checking. See the PARSING_HEADER() macro.
+ */
+
+ , s_chunk_data
+ , s_chunk_data_almost_done
+ , s_chunk_data_done
+
+ , s_body_identity
+ , s_body_identity_eof
+
+ , s_message_done
+ };
+
+
+#define PARSING_HEADER(state) (state <= s_headers_done)
+
+
+enum header_states
+ { h_general = 0
+ , h_C
+ , h_CO
+ , h_CON
+
+ , h_matching_connection
+ , h_matching_proxy_connection
+ , h_matching_content_length
+ , h_matching_transfer_encoding
+ , h_matching_upgrade
+
+ , h_connection
+ , h_content_length
+ , h_transfer_encoding
+ , h_upgrade
+
+ , h_matching_transfer_encoding_chunked
+ , h_matching_connection_token_start
+ , h_matching_connection_keep_alive
+ , h_matching_connection_close
+ , h_matching_connection_upgrade
+ , h_matching_connection_token
+
+ , h_transfer_encoding_chunked
+ , h_connection_keep_alive
+ , h_connection_close
+ , h_connection_upgrade
+ };
+
+enum http_host_state
+ {
+ s_http_host_dead = 1
+ , s_http_userinfo_start
+ , s_http_userinfo
+ , s_http_host_start
+ , s_http_host_v6_start
+ , s_http_host
+ , s_http_host_v6
+ , s_http_host_v6_end
+ , s_http_host_v6_zone_start
+ , s_http_host_v6_zone
+ , s_http_host_port_start
+ , s_http_host_port
+};
+
+/* Macros for character classes; depends on strict-mode */
+#define CR '\r'
+#define LF '\n'
+#define LOWER(c) (unsigned char)(c | 0x20)
+#define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z')
+#define IS_NUM(c) ((c) >= '0' && (c) <= '9')
+#define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c))
+#define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f'))
+#define IS_MARK(c) ((c) == '-' || (c) == '_' || (c) == '.' || \
+ (c) == '!' || (c) == '~' || (c) == '*' || (c) == '\'' || (c) == '(' || \
+ (c) == ')')
+#define IS_USERINFO_CHAR(c) (IS_ALPHANUM(c) || IS_MARK(c) || (c) == '%' || \
+ (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \
+ (c) == '$' || (c) == ',')
+
+#define STRICT_TOKEN(c) (tokens[(unsigned char)c])
+
+#if HTTP_PARSER_STRICT
+#define TOKEN(c) (tokens[(unsigned char)c])
+#define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c))
+#define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
+#else
+#define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c])
+#define IS_URL_CHAR(c) \
+ (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80))
+#define IS_HOST_CHAR(c) \
+ (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_')
+#endif
+
+/**
+ * Verify that a char is a valid visible (printable) US-ASCII
+ * character or %x80-FF
+ **/
+#define IS_HEADER_CHAR(ch) \
+ (ch == CR || ch == LF || ch == 9 || ((unsigned char)ch > 31 && ch != 127))
+
+#define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
+
+
+#if HTTP_PARSER_STRICT
+# define STRICT_CHECK(cond) \
+do { \
+ if (cond) { \
+ SET_ERRNO(HPE_STRICT); \
+ goto error; \
+ } \
+} while (0)
+# define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead)
+#else
+# define STRICT_CHECK(cond)
+# define NEW_MESSAGE() start_state
+#endif
+
+
+/* Map errno values to strings for human-readable output */
+#define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s },
+static struct {
+ const char *name;
+ const char *description;
+} http_strerror_tab[] = {
+ HTTP_ERRNO_MAP(HTTP_STRERROR_GEN)
+};
+#undef HTTP_STRERROR_GEN
+
+int http_message_needs_eof(const http_parser *parser);
+
+/* Our URL parser.
+ *
+ * This is designed to be shared by http_parser_execute() for URL validation,
+ * hence it has a state transition + byte-for-byte interface. In addition, it
+ * is meant to be embedded in http_parser_parse_url(), which does the dirty
+ * work of turning state transitions URL components for its API.
+ *
+ * This function should only be invoked with non-space characters. It is
+ * assumed that the caller cares about (and can detect) the transition between
+ * URL and non-URL states by looking for these.
+ */
+static enum state
+parse_url_char(enum state s, const char ch)
+{
+ if (ch == ' ' || ch == '\r' || ch == '\n') {
+ return s_dead;
+ }
+
+#if HTTP_PARSER_STRICT
+ if (ch == '\t' || ch == '\f') {
+ return s_dead;
+ }
+#endif
+
+ switch (s) {
+ case s_req_spaces_before_url:
+ /* Proxied requests are followed by scheme of an absolute URI (alpha).
+ * All methods except CONNECT are followed by '/' or '*'.
+ */
+
+ if (ch == '/' || ch == '*') {
+ return s_req_path;
+ }
+
+ if (IS_ALPHA(ch)) {
+ return s_req_schema;
+ }
+
+ break;
+
+ case s_req_schema:
+ if (IS_ALPHA(ch)) {
+ return s;
+ }
+
+ if (ch == ':') {
+ return s_req_schema_slash;
+ }
+
+ break;
+
+ case s_req_schema_slash:
+ if (ch == '/') {
+ return s_req_schema_slash_slash;
+ }
+
+ break;
+
+ case s_req_schema_slash_slash:
+ if (ch == '/') {
+ return s_req_server_start;
+ }
+
+ break;
+
+ case s_req_server_with_at:
+ if (ch == '@') {
+ return s_dead;
+ }
+
+ /* FALLTHROUGH */
+ case s_req_server_start:
+ case s_req_server:
+ if (ch == '/') {
+ return s_req_path;
+ }
+
+ if (ch == '?') {
+ return s_req_query_string_start;
+ }
+
+ if (ch == '@') {
+ return s_req_server_with_at;
+ }
+
+ if (IS_USERINFO_CHAR(ch) || ch == '[' || ch == ']') {
+ return s_req_server;
+ }
+
+ break;
+
+ case s_req_path:
+ if (IS_URL_CHAR(ch)) {
+ return s;
+ }
+
+ switch (ch) {
+ case '?':
+ return s_req_query_string_start;
+
+ case '#':
+ return s_req_fragment_start;
+ }
+
+ break;
+
+ case s_req_query_string_start:
+ case s_req_query_string:
+ if (IS_URL_CHAR(ch)) {
+ return s_req_query_string;
+ }
+
+ switch (ch) {
+ case '?':
+ /* allow extra '?' in query string */
+ return s_req_query_string;
+
+ case '#':
+ return s_req_fragment_start;
+ }
+
+ break;
+
+ case s_req_fragment_start:
+ if (IS_URL_CHAR(ch)) {
+ return s_req_fragment;
+ }
+
+ switch (ch) {
+ case '?':
+ return s_req_fragment;
+
+ case '#':
+ return s;
+ }
+
+ break;
+
+ case s_req_fragment:
+ if (IS_URL_CHAR(ch)) {
+ return s;
+ }
+
+ switch (ch) {
+ case '?':
+ case '#':
+ return s;
+ }
+
+ break;
+
+ default:
+ break;
+ }
+
+ /* We should never fall out of the switch above unless there's an error */
+ return s_dead;
+}
+
+size_t http_parser_execute (http_parser *parser,
+ const http_parser_settings *settings,
+ const char *data,
+ size_t len)
+{
+ char c, ch;
+ int8_t unhex_val;
+ const char *p = data;
+ const char *header_field_mark = 0;
+ const char *header_value_mark = 0;
+ const char *url_mark = 0;
+ const char *body_mark = 0;
+ const char *status_mark = 0;
+ enum state p_state = (enum state) parser->state;
+ const unsigned int lenient = parser->lenient_http_headers;
+
+ /* We're in an error state. Don't bother doing anything. */
+ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {
+ return 0;
+ }
+
+ if (len == 0) {
+ switch (CURRENT_STATE()) {
+ case s_body_identity_eof:
+ /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if
+ * we got paused.
+ */
+ CALLBACK_NOTIFY_NOADVANCE(message_complete);
+ return 0;
+
+ case s_dead:
+ case s_start_req_or_res:
+ case s_start_res:
+ case s_start_req:
+ return 0;
+
+ default:
+ SET_ERRNO(HPE_INVALID_EOF_STATE);
+ return 1;
+ }
+ }
+
+
+ if (CURRENT_STATE() == s_header_field)
+ header_field_mark = data;
+ if (CURRENT_STATE() == s_header_value)
+ header_value_mark = data;
+ switch (CURRENT_STATE()) {
+ case s_req_path:
+ case s_req_schema:
+ case s_req_schema_slash:
+ case s_req_schema_slash_slash:
+ case s_req_server_start:
+ case s_req_server:
+ case s_req_server_with_at:
+ case s_req_query_string_start:
+ case s_req_query_string:
+ case s_req_fragment_start:
+ case s_req_fragment:
+ url_mark = data;
+ break;
+ case s_res_status:
+ status_mark = data;
+ break;
+ default:
+ break;
+ }
+
+ for (p=data; p != data + len; p++) {
+ ch = *p;
+
+ if (PARSING_HEADER(CURRENT_STATE()))
+ COUNT_HEADER_SIZE(1);
+
+reexecute:
+ switch (CURRENT_STATE()) {
+
+ case s_dead:
+ /* this state is used after a 'Connection: close' message
+ * the parser will error out if it reads another message
+ */
+ if (LIKELY(ch == CR || ch == LF))
+ break;
+
+ SET_ERRNO(HPE_CLOSED_CONNECTION);
+ goto error;
+
+ case s_start_req_or_res:
+ {
+ if (ch == CR || ch == LF)
+ break;
+ parser->flags = 0;
+ parser->content_length = ULLONG_MAX;
+
+ if (ch == 'H') {
+ UPDATE_STATE(s_res_or_resp_H);
+
+ CALLBACK_NOTIFY(message_begin);
+ } else {
+ parser->type = HTTP_REQUEST;
+ UPDATE_STATE(s_start_req);
+ REEXECUTE();
+ }
+
+ break;
+ }
+
+ case s_res_or_resp_H:
+ if (ch == 'T') {
+ parser->type = HTTP_RESPONSE;
+ UPDATE_STATE(s_res_HT);
+ } else {
+ if (UNLIKELY(ch != 'E')) {
+ SET_ERRNO(HPE_INVALID_CONSTANT);
+ goto error;
+ }
+
+ parser->type = HTTP_REQUEST;
+ parser->method = HTTP_HEAD;
+ parser->index = 2;
+ UPDATE_STATE(s_req_method);
+ }
+ break;
+
+ case s_start_res:
+ {
+ parser->flags = 0;
+ parser->content_length = ULLONG_MAX;
+
+ switch (ch) {
+ case 'H':
+ UPDATE_STATE(s_res_H);
+ break;
+
+ case CR:
+ case LF:
+ break;
+
+ default:
+ SET_ERRNO(HPE_INVALID_CONSTANT);
+ goto error;
+ }
+
+ CALLBACK_NOTIFY(message_begin);
+ break;
+ }
+
+ case s_res_H:
+ STRICT_CHECK(ch != 'T');
+ UPDATE_STATE(s_res_HT);
+ break;
+
+ case s_res_HT:
+ STRICT_CHECK(ch != 'T');
+ UPDATE_STATE(s_res_HTT);
+ break;
+
+ case s_res_HTT:
+ STRICT_CHECK(ch != 'P');
+ UPDATE_STATE(s_res_HTTP);
+ break;
+
+ case s_res_HTTP:
+ STRICT_CHECK(ch != '/');
+ UPDATE_STATE(s_res_first_http_major);
+ break;
+
+ case s_res_first_http_major:
+ if (UNLIKELY(ch < '0' || ch > '9')) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_major = ch - '0';
+ UPDATE_STATE(s_res_http_major);
+ break;
+
+ /* major HTTP version or dot */
+ case s_res_http_major:
+ {
+ if (ch == '.') {
+ UPDATE_STATE(s_res_first_http_minor);
+ break;
+ }
+
+ if (!IS_NUM(ch)) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_major *= 10;
+ parser->http_major += ch - '0';
+
+ if (UNLIKELY(parser->http_major > 999)) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ break;
+ }
+
+ /* first digit of minor HTTP version */
+ case s_res_first_http_minor:
+ if (UNLIKELY(!IS_NUM(ch))) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_minor = ch - '0';
+ UPDATE_STATE(s_res_http_minor);
+ break;
+
+ /* minor HTTP version or end of request line */
+ case s_res_http_minor:
+ {
+ if (ch == ' ') {
+ UPDATE_STATE(s_res_first_status_code);
+ break;
+ }
+
+ if (UNLIKELY(!IS_NUM(ch))) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_minor *= 10;
+ parser->http_minor += ch - '0';
+
+ if (UNLIKELY(parser->http_minor > 999)) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ break;
+ }
+
+ case s_res_first_status_code:
+ {
+ if (!IS_NUM(ch)) {
+ if (ch == ' ') {
+ break;
+ }
+
+ SET_ERRNO(HPE_INVALID_STATUS);
+ goto error;
+ }
+ parser->status_code = ch - '0';
+ UPDATE_STATE(s_res_status_code);
+ break;
+ }
+
+ case s_res_status_code:
+ {
+ if (!IS_NUM(ch)) {
+ switch (ch) {
+ case ' ':
+ UPDATE_STATE(s_res_status_start);
+ break;
+ case CR:
+ UPDATE_STATE(s_res_line_almost_done);
+ break;
+ case LF:
+ UPDATE_STATE(s_header_field_start);
+ break;
+ default:
+ SET_ERRNO(HPE_INVALID_STATUS);
+ goto error;
+ }
+ break;
+ }
+
+ parser->status_code *= 10;
+ parser->status_code += ch - '0';
+
+ if (UNLIKELY(parser->status_code > 999)) {
+ SET_ERRNO(HPE_INVALID_STATUS);
+ goto error;
+ }
+
+ break;
+ }
+
+ case s_res_status_start:
+ {
+ if (ch == CR) {
+ UPDATE_STATE(s_res_line_almost_done);
+ break;
+ }
+
+ if (ch == LF) {
+ UPDATE_STATE(s_header_field_start);
+ break;
+ }
+
+ MARK(status);
+ UPDATE_STATE(s_res_status);
+ parser->index = 0;
+ break;
+ }
+
+ case s_res_status:
+ if (ch == CR) {
+ UPDATE_STATE(s_res_line_almost_done);
+ CALLBACK_DATA(status);
+ break;
+ }
+
+ if (ch == LF) {
+ UPDATE_STATE(s_header_field_start);
+ CALLBACK_DATA(status);
+ break;
+ }
+
+ break;
+
+ case s_res_line_almost_done:
+ STRICT_CHECK(ch != LF);
+ UPDATE_STATE(s_header_field_start);
+ break;
+
+ case s_start_req:
+ {
+ if (ch == CR || ch == LF)
+ break;
+ parser->flags = 0;
+ parser->content_length = ULLONG_MAX;
+
+ if (UNLIKELY(!IS_ALPHA(ch))) {
+ SET_ERRNO(HPE_INVALID_METHOD);
+ goto error;
+ }
+
+ parser->method = (enum http_method) 0;
+ parser->index = 1;
+ switch (ch) {
+ case 'A': parser->method = HTTP_ACL; break;
+ case 'B': parser->method = HTTP_BIND; break;
+ case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;
+ case 'D': parser->method = HTTP_DELETE; break;
+ case 'G': parser->method = HTTP_GET; break;
+ case 'H': parser->method = HTTP_HEAD; break;
+ case 'L': parser->method = HTTP_LOCK; /* or LINK */ break;
+ case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break;
+ case 'N': parser->method = HTTP_NOTIFY; break;
+ case 'O': parser->method = HTTP_OPTIONS; break;
+ case 'P': parser->method = HTTP_POST;
+ /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
+ break;
+ case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break;
+ case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;
+ case 'T': parser->method = HTTP_TRACE; break;
+ case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND, UNLINK */ break;
+ default:
+ SET_ERRNO(HPE_INVALID_METHOD);
+ goto error;
+ }
+ UPDATE_STATE(s_req_method);
+
+ CALLBACK_NOTIFY(message_begin);
+
+ break;
+ }
+
+ case s_req_method:
+ {
+ const char *matcher;
+ if (UNLIKELY(ch == '\0')) {
+ SET_ERRNO(HPE_INVALID_METHOD);
+ goto error;
+ }
+
+ matcher = method_strings[parser->method];
+ if (ch == ' ' && matcher[parser->index] == '\0') {
+ UPDATE_STATE(s_req_spaces_before_url);
+ } else if (ch == matcher[parser->index]) {
+ ; /* nada */
+ } else if (IS_ALPHA(ch)) {
+
+ switch (parser->method << 16 | parser->index << 8 | ch) {
+#define XX(meth, pos, ch, new_meth) \
+ case (HTTP_##meth << 16 | pos << 8 | ch): \
+ parser->method = HTTP_##new_meth; break;
+
+ XX(POST, 1, 'U', PUT)
+ XX(POST, 1, 'A', PATCH)
+ XX(CONNECT, 1, 'H', CHECKOUT)
+ XX(CONNECT, 2, 'P', COPY)
+ XX(MKCOL, 1, 'O', MOVE)
+ XX(MKCOL, 1, 'E', MERGE)
+ XX(MKCOL, 2, 'A', MKACTIVITY)
+ XX(MKCOL, 3, 'A', MKCALENDAR)
+ XX(SUBSCRIBE, 1, 'E', SEARCH)
+ XX(REPORT, 2, 'B', REBIND)
+ XX(POST, 1, 'R', PROPFIND)
+ XX(PROPFIND, 4, 'P', PROPPATCH)
+ XX(PUT, 2, 'R', PURGE)
+ XX(LOCK, 1, 'I', LINK)
+ XX(UNLOCK, 2, 'S', UNSUBSCRIBE)
+ XX(UNLOCK, 2, 'B', UNBIND)
+ XX(UNLOCK, 3, 'I', UNLINK)
+#undef XX
+
+ default:
+ SET_ERRNO(HPE_INVALID_METHOD);
+ goto error;
+ }
+ } else if (ch == '-' &&
+ parser->index == 1 &&
+ parser->method == HTTP_MKCOL) {
+ parser->method = HTTP_MSEARCH;
+ } else {
+ SET_ERRNO(HPE_INVALID_METHOD);
+ goto error;
+ }
+
+ ++parser->index;
+ break;
+ }
+
+ case s_req_spaces_before_url:
+ {
+ if (ch == ' ') break;
+
+ MARK(url);
+ if (parser->method == HTTP_CONNECT) {
+ UPDATE_STATE(s_req_server_start);
+ }
+
+ UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
+ if (UNLIKELY(CURRENT_STATE() == s_dead)) {
+ SET_ERRNO(HPE_INVALID_URL);
+ goto error;
+ }
+
+ break;
+ }
+
+ case s_req_schema:
+ case s_req_schema_slash:
+ case s_req_schema_slash_slash:
+ case s_req_server_start:
+ {
+ switch (ch) {
+ /* No whitespace allowed here */
+ case ' ':
+ case CR:
+ case LF:
+ SET_ERRNO(HPE_INVALID_URL);
+ goto error;
+ default:
+ UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
+ if (UNLIKELY(CURRENT_STATE() == s_dead)) {
+ SET_ERRNO(HPE_INVALID_URL);
+ goto error;
+ }
+ }
+
+ break;
+ }
+
+ case s_req_server:
+ case s_req_server_with_at:
+ case s_req_path:
+ case s_req_query_string_start:
+ case s_req_query_string:
+ case s_req_fragment_start:
+ case s_req_fragment:
+ {
+ switch (ch) {
+ case ' ':
+ UPDATE_STATE(s_req_http_start);
+ CALLBACK_DATA(url);
+ break;
+ case CR:
+ case LF:
+ parser->http_major = 0;
+ parser->http_minor = 9;
+ UPDATE_STATE((ch == CR) ?
+ s_req_line_almost_done :
+ s_header_field_start);
+ CALLBACK_DATA(url);
+ break;
+ default:
+ UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
+ if (UNLIKELY(CURRENT_STATE() == s_dead)) {
+ SET_ERRNO(HPE_INVALID_URL);
+ goto error;
+ }
+ }
+ break;
+ }
+
+ case s_req_http_start:
+ switch (ch) {
+ case 'H':
+ UPDATE_STATE(s_req_http_H);
+ break;
+ case ' ':
+ break;
+ default:
+ SET_ERRNO(HPE_INVALID_CONSTANT);
+ goto error;
+ }
+ break;
+
+ case s_req_http_H:
+ STRICT_CHECK(ch != 'T');
+ UPDATE_STATE(s_req_http_HT);
+ break;
+
+ case s_req_http_HT:
+ STRICT_CHECK(ch != 'T');
+ UPDATE_STATE(s_req_http_HTT);
+ break;
+
+ case s_req_http_HTT:
+ STRICT_CHECK(ch != 'P');
+ UPDATE_STATE(s_req_http_HTTP);
+ break;
+
+ case s_req_http_HTTP:
+ STRICT_CHECK(ch != '/');
+ UPDATE_STATE(s_req_first_http_major);
+ break;
+
+ /* first digit of major HTTP version */
+ case s_req_first_http_major:
+ if (UNLIKELY(ch < '1' || ch > '9')) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_major = ch - '0';
+ UPDATE_STATE(s_req_http_major);
+ break;
+
+ /* major HTTP version or dot */
+ case s_req_http_major:
+ {
+ if (ch == '.') {
+ UPDATE_STATE(s_req_first_http_minor);
+ break;
+ }
+
+ if (UNLIKELY(!IS_NUM(ch))) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_major *= 10;
+ parser->http_major += ch - '0';
+
+ if (UNLIKELY(parser->http_major > 999)) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ break;
+ }
+
+ /* first digit of minor HTTP version */
+ case s_req_first_http_minor:
+ if (UNLIKELY(!IS_NUM(ch))) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_minor = ch - '0';
+ UPDATE_STATE(s_req_http_minor);
+ break;
+
+ /* minor HTTP version or end of request line */
+ case s_req_http_minor:
+ {
+ if (ch == CR) {
+ UPDATE_STATE(s_req_line_almost_done);
+ break;
+ }
+
+ if (ch == LF) {
+ UPDATE_STATE(s_header_field_start);
+ break;
+ }
+
+ /* XXX allow spaces after digit? */
+
+ if (UNLIKELY(!IS_NUM(ch))) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ parser->http_minor *= 10;
+ parser->http_minor += ch - '0';
+
+ if (UNLIKELY(parser->http_minor > 999)) {
+ SET_ERRNO(HPE_INVALID_VERSION);
+ goto error;
+ }
+
+ break;
+ }
+
+ /* end of request line */
+ case s_req_line_almost_done:
+ {
+ if (UNLIKELY(ch != LF)) {
+ SET_ERRNO(HPE_LF_EXPECTED);
+ goto error;
+ }
+
+ UPDATE_STATE(s_header_field_start);
+ break;
+ }
+
+ case s_header_field_start:
+ {
+ if (ch == CR) {
+ UPDATE_STATE(s_headers_almost_done);
+ break;
+ }
+
+ if (ch == LF) {
+ /* they might be just sending \n instead of \r\n so this would be
+ * the second \n to denote the end of headers*/
+ UPDATE_STATE(s_headers_almost_done);
+ REEXECUTE();
+ }
+
+ c = TOKEN(ch);
+
+ if (UNLIKELY(!c)) {
+ SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
+ goto error;
+ }
+
+ MARK(header_field);
+
+ parser->index = 0;
+ UPDATE_STATE(s_header_field);
+
+ switch (c) {
+ case 'c':
+ parser->header_state = h_C;
+ break;
+
+ case 'p':
+ parser->header_state = h_matching_proxy_connection;
+ break;
+
+ case 't':
+ parser->header_state = h_matching_transfer_encoding;
+ break;
+
+ case 'u':
+ parser->header_state = h_matching_upgrade;
+ break;
+
+ default:
+ parser->header_state = h_general;
+ break;
+ }
+ break;
+ }
+
+ case s_header_field:
+ {
+ const char* start = p;
+ for (; p != data + len; p++) {
+ ch = *p;
+ c = TOKEN(ch);
+
+ if (!c)
+ break;
+
+ switch (parser->header_state) {
+ case h_general:
+ break;
+
+ case h_C:
+ parser->index++;
+ parser->header_state = (c == 'o' ? h_CO : h_general);
+ break;
+
+ case h_CO:
+ parser->index++;
+ parser->header_state = (c == 'n' ? h_CON : h_general);
+ break;
+
+ case h_CON:
+ parser->index++;
+ switch (c) {
+ case 'n':
+ parser->header_state = h_matching_connection;
+ break;
+ case 't':
+ parser->header_state = h_matching_content_length;
+ break;
+ default:
+ parser->header_state = h_general;
+ break;
+ }
+ break;
+
+ /* connection */
+
+ case h_matching_connection:
+ parser->index++;
+ if (parser->index > sizeof(CONNECTION)-1
+ || c != CONNECTION[parser->index]) {
+ parser->header_state = h_general;
+ } else if (parser->index == sizeof(CONNECTION)-2) {
+ parser->header_state = h_connection;
+ }
+ break;
+
+ /* proxy-connection */
+
+ case h_matching_proxy_connection:
+ parser->index++;
+ if (parser->index > sizeof(PROXY_CONNECTION)-1
+ || c != PROXY_CONNECTION[parser->index]) {
+ parser->header_state = h_general;
+ } else if (parser->index == sizeof(PROXY_CONNECTION)-2) {
+ parser->header_state = h_connection;
+ }
+ break;
+
+ /* content-length */
+
+ case h_matching_content_length:
+ parser->index++;
+ if (parser->index > sizeof(CONTENT_LENGTH)-1
+ || c != CONTENT_LENGTH[parser->index]) {
+ parser->header_state = h_general;
+ } else if (parser->index == sizeof(CONTENT_LENGTH)-2) {
+ if (parser->flags & F_CONTENTLENGTH) {
+ SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
+ goto error;
+ }
+ parser->header_state = h_content_length;
+ parser->flags |= F_CONTENTLENGTH;
+ }
+ break;
+
+ /* transfer-encoding */
+
+ case h_matching_transfer_encoding:
+ parser->index++;
+ if (parser->index > sizeof(TRANSFER_ENCODING)-1
+ || c != TRANSFER_ENCODING[parser->index]) {
+ parser->header_state = h_general;
+ } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {
+ parser->header_state = h_transfer_encoding;
+ }
+ break;
+
+ /* upgrade */
+
+ case h_matching_upgrade:
+ parser->index++;
+ if (parser->index > sizeof(UPGRADE)-1
+ || c != UPGRADE[parser->index]) {
+ parser->header_state = h_general;
+ } else if (parser->index == sizeof(UPGRADE)-2) {
+ parser->header_state = h_upgrade;
+ }
+ break;
+
+ case h_connection:
+ case h_content_length:
+ case h_transfer_encoding:
+ case h_upgrade:
+ if (ch != ' ') parser->header_state = h_general;
+ break;
+
+ default:
+ assert(0 && "Unknown header_state");
+ break;
+ }
+ }
+
+ COUNT_HEADER_SIZE(p - start);
+
+ if (p == data + len) {
+ --p;
+ break;
+ }
+
+ if (ch == ':') {
+ UPDATE_STATE(s_header_value_discard_ws);
+ CALLBACK_DATA(header_field);
+ break;
+ }
+
+ SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
+ goto error;
+ }
+
+ case s_header_value_discard_ws:
+ if (ch == ' ' || ch == '\t') break;
+
+ if (ch == CR) {
+ UPDATE_STATE(s_header_value_discard_ws_almost_done);
+ break;
+ }
+
+ if (ch == LF) {
+ UPDATE_STATE(s_header_value_discard_lws);
+ break;
+ }
+
+ /* FALLTHROUGH */
+
+ case s_header_value_start:
+ {
+ MARK(header_value);
+
+ UPDATE_STATE(s_header_value);
+ parser->index = 0;
+
+ c = LOWER(ch);
+
+ switch (parser->header_state) {
+ case h_upgrade:
+ parser->flags |= F_UPGRADE;
+ parser->header_state = h_general;
+ break;
+
+ case h_transfer_encoding:
+ /* looking for 'Transfer-Encoding: chunked' */
+ if ('c' == c) {
+ parser->header_state = h_matching_transfer_encoding_chunked;
+ } else {
+ parser->header_state = h_general;
+ }
+ break;
+
+ case h_content_length:
+ if (UNLIKELY(!IS_NUM(ch))) {
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
+ goto error;
+ }
+
+ parser->content_length = ch - '0';
+ break;
+
+ case h_connection:
+ /* looking for 'Connection: keep-alive' */
+ if (c == 'k') {
+ parser->header_state = h_matching_connection_keep_alive;
+ /* looking for 'Connection: close' */
+ } else if (c == 'c') {
+ parser->header_state = h_matching_connection_close;
+ } else if (c == 'u') {
+ parser->header_state = h_matching_connection_upgrade;
+ } else {
+ parser->header_state = h_matching_connection_token;
+ }
+ break;
+
+ /* Multi-value `Connection` header */
+ case h_matching_connection_token_start:
+ break;
+
+ default:
+ parser->header_state = h_general;
+ break;
+ }
+ break;
+ }
+
+ case s_header_value:
+ {
+ const char* start = p;
+ enum header_states h_state = (enum header_states) parser->header_state;
+ for (; p != data + len; p++) {
+ ch = *p;
+ if (ch == CR) {
+ UPDATE_STATE(s_header_almost_done);
+ parser->header_state = h_state;
+ CALLBACK_DATA(header_value);
+ break;
+ }
+
+ if (ch == LF) {
+ UPDATE_STATE(s_header_almost_done);
+ COUNT_HEADER_SIZE(p - start);
+ parser->header_state = h_state;
+ CALLBACK_DATA_NOADVANCE(header_value);
+ REEXECUTE();
+ }
+
+ if (!lenient && !IS_HEADER_CHAR(ch)) {
+ SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
+ goto error;
+ }
+
+ c = LOWER(ch);
+
+ switch (h_state) {
+ case h_general:
+ {
+ const char* p_cr;
+ const char* p_lf;
+ size_t limit = data + len - p;
+
+ limit = MIN(limit, HTTP_MAX_HEADER_SIZE);
+
+ p_cr = (const char*) memchr(p, CR, limit);
+ p_lf = (const char*) memchr(p, LF, limit);
+ if (p_cr != NULL) {
+ if (p_lf != NULL && p_cr >= p_lf)
+ p = p_lf;
+ else
+ p = p_cr;
+ } else if (UNLIKELY(p_lf != NULL)) {
+ p = p_lf;
+ } else {
+ p = data + len;
+ }
+ --p;
+
+ break;
+ }
+
+ case h_connection:
+ case h_transfer_encoding:
+ assert(0 && "Shouldn't get here.");
+ break;
+
+ case h_content_length:
+ {
+ uint64_t t;
+
+ if (ch == ' ') break;
+
+ if (UNLIKELY(!IS_NUM(ch))) {
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
+ parser->header_state = h_state;
+ goto error;
+ }
+
+ t = parser->content_length;
+ t *= 10;
+ t += ch - '0';
+
+ /* Overflow? Test against a conservative limit for simplicity. */
+ if (UNLIKELY((ULLONG_MAX - 10) / 10 < parser->content_length)) {
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
+ parser->header_state = h_state;
+ goto error;
+ }
+
+ parser->content_length = t;
+ break;
+ }
+
+ /* Transfer-Encoding: chunked */
+ case h_matching_transfer_encoding_chunked:
+ parser->index++;
+ if (parser->index > sizeof(CHUNKED)-1
+ || c != CHUNKED[parser->index]) {
+ h_state = h_general;
+ } else if (parser->index == sizeof(CHUNKED)-2) {
+ h_state = h_transfer_encoding_chunked;
+ }
+ break;
+
+ case h_matching_connection_token_start:
+ /* looking for 'Connection: keep-alive' */
+ if (c == 'k') {
+ h_state = h_matching_connection_keep_alive;
+ /* looking for 'Connection: close' */
+ } else if (c == 'c') {
+ h_state = h_matching_connection_close;
+ } else if (c == 'u') {
+ h_state = h_matching_connection_upgrade;
+ } else if (STRICT_TOKEN(c)) {
+ h_state = h_matching_connection_token;
+ } else if (c == ' ' || c == '\t') {
+ /* Skip lws */
+ } else {
+ h_state = h_general;
+ }
+ break;
+
+ /* looking for 'Connection: keep-alive' */
+ case h_matching_connection_keep_alive:
+ parser->index++;
+ if (parser->index > sizeof(KEEP_ALIVE)-1
+ || c != KEEP_ALIVE[parser->index]) {
+ h_state = h_matching_connection_token;
+ } else if (parser->index == sizeof(KEEP_ALIVE)-2) {
+ h_state = h_connection_keep_alive;
+ }
+ break;
+
+ /* looking for 'Connection: close' */
+ case h_matching_connection_close:
+ parser->index++;
+ if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) {
+ h_state = h_matching_connection_token;
+ } else if (parser->index == sizeof(CLOSE)-2) {
+ h_state = h_connection_close;
+ }
+ break;
+
+ /* looking for 'Connection: upgrade' */
+ case h_matching_connection_upgrade:
+ parser->index++;
+ if (parser->index > sizeof(UPGRADE) - 1 ||
+ c != UPGRADE[parser->index]) {
+ h_state = h_matching_connection_token;
+ } else if (parser->index == sizeof(UPGRADE)-2) {
+ h_state = h_connection_upgrade;
+ }
+ break;
+
+ case h_matching_connection_token:
+ if (ch == ',') {
+ h_state = h_matching_connection_token_start;
+ parser->index = 0;
+ }
+ break;
+
+ case h_transfer_encoding_chunked:
+ if (ch != ' ') h_state = h_general;
+ break;
+
+ case h_connection_keep_alive:
+ case h_connection_close:
+ case h_connection_upgrade:
+ if (ch == ',') {
+ if (h_state == h_connection_keep_alive) {
+ parser->flags |= F_CONNECTION_KEEP_ALIVE;
+ } else if (h_state == h_connection_close) {
+ parser->flags |= F_CONNECTION_CLOSE;
+ } else if (h_state == h_connection_upgrade) {
+ parser->flags |= F_CONNECTION_UPGRADE;
+ }
+ h_state = h_matching_connection_token_start;
+ parser->index = 0;
+ } else if (ch != ' ') {
+ h_state = h_matching_connection_token;
+ }
+ break;
+
+ default:
+ UPDATE_STATE(s_header_value);
+ h_state = h_general;
+ break;
+ }
+ }
+ parser->header_state = h_state;
+
+ COUNT_HEADER_SIZE(p - start);
+
+ if (p == data + len)
+ --p;
+ break;
+ }
+
+ case s_header_almost_done:
+ {
+ if (UNLIKELY(ch != LF)) {
+ SET_ERRNO(HPE_LF_EXPECTED);
+ goto error;
+ }
+
+ UPDATE_STATE(s_header_value_lws);
+ break;
+ }
+
+ case s_header_value_lws:
+ {
+ if (ch == ' ' || ch == '\t') {
+ UPDATE_STATE(s_header_value_start);
+ REEXECUTE();
+ }
+
+ /* finished the header */
+ switch (parser->header_state) {
+ case h_connection_keep_alive:
+ parser->flags |= F_CONNECTION_KEEP_ALIVE;
+ break;
+ case h_connection_close:
+ parser->flags |= F_CONNECTION_CLOSE;
+ break;
+ case h_transfer_encoding_chunked:
+ parser->flags |= F_CHUNKED;
+ break;
+ case h_connection_upgrade:
+ parser->flags |= F_CONNECTION_UPGRADE;
+ break;
+ default:
+ break;
+ }
+
+ UPDATE_STATE(s_header_field_start);
+ REEXECUTE();
+ }
+
+ case s_header_value_discard_ws_almost_done:
+ {
+ STRICT_CHECK(ch != LF);
+ UPDATE_STATE(s_header_value_discard_lws);
+ break;
+ }
+
+ case s_header_value_discard_lws:
+ {
+ if (ch == ' ' || ch == '\t') {
+ UPDATE_STATE(s_header_value_discard_ws);
+ break;
+ } else {
+ switch (parser->header_state) {
+ case h_connection_keep_alive:
+ parser->flags |= F_CONNECTION_KEEP_ALIVE;
+ break;
+ case h_connection_close:
+ parser->flags |= F_CONNECTION_CLOSE;
+ break;
+ case h_connection_upgrade:
+ parser->flags |= F_CONNECTION_UPGRADE;
+ break;
+ case h_transfer_encoding_chunked:
+ parser->flags |= F_CHUNKED;
+ break;
+ default:
+ break;
+ }
+
+ /* header value was empty */
+ MARK(header_value);
+ UPDATE_STATE(s_header_field_start);
+ CALLBACK_DATA_NOADVANCE(header_value);
+ REEXECUTE();
+ }
+ }
+
+ case s_headers_almost_done:
+ {
+ STRICT_CHECK(ch != LF);
+
+ if (parser->flags & F_TRAILING) {
+ /* End of a chunked request */
+ UPDATE_STATE(s_message_done);
+ CALLBACK_NOTIFY_NOADVANCE(chunk_complete);
+ REEXECUTE();
+ }
+
+ /* Cannot use chunked encoding and a content-length header together
+ per the HTTP specification. */
+ if ((parser->flags & F_CHUNKED) &&
+ (parser->flags & F_CONTENTLENGTH)) {
+ SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
+ goto error;
+ }
+
+ UPDATE_STATE(s_headers_done);
+
+ /* Set this here so that on_headers_complete() callbacks can see it */
+ parser->upgrade =
+ ((parser->flags & (F_UPGRADE | F_CONNECTION_UPGRADE)) ==
+ (F_UPGRADE | F_CONNECTION_UPGRADE) ||
+ parser->method == HTTP_CONNECT);
+
+ /* Here we call the headers_complete callback. This is somewhat
+ * different than other callbacks because if the user returns 1, we
+ * will interpret that as saying that this message has no body. This
+ * is needed for the annoying case of recieving a response to a HEAD
+ * request.
+ *
+ * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so
+ * we have to simulate it by handling a change in errno below.
+ */
+ if (settings->on_headers_complete) {
+ switch (settings->on_headers_complete(parser)) {
+ case 0:
+ break;
+
+ case 2:
+ parser->upgrade = 1;
+
+ case 1:
+ parser->flags |= F_SKIPBODY;
+ break;
+
+ default:
+ SET_ERRNO(HPE_CB_headers_complete);
+ RETURN(p - data); /* Error */
+ }
+ }
+
+ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {
+ RETURN(p - data);
+ }
+
+ REEXECUTE();
+ }
+
+ case s_headers_done:
+ {
+ int hasBody;
+ STRICT_CHECK(ch != LF);
+
+ parser->nread = 0;
+
+ hasBody = parser->flags & F_CHUNKED ||
+ (parser->content_length > 0 && parser->content_length != ULLONG_MAX);
+ if (parser->upgrade && (parser->method == HTTP_CONNECT ||
+ (parser->flags & F_SKIPBODY) || !hasBody)) {
+ /* Exit, the rest of the message is in a different protocol. */
+ UPDATE_STATE(NEW_MESSAGE());
+ CALLBACK_NOTIFY(message_complete);
+ RETURN((p - data) + 1);
+ }
+
+ if (parser->flags & F_SKIPBODY) {
+ UPDATE_STATE(NEW_MESSAGE());
+ CALLBACK_NOTIFY(message_complete);
+ } else if (parser->flags & F_CHUNKED) {
+ /* chunked encoding - ignore Content-Length header */
+ UPDATE_STATE(s_chunk_size_start);
+ } else {
+ if (parser->content_length == 0) {
+ /* Content-Length header given but zero: Content-Length: 0\r\n */
+ UPDATE_STATE(NEW_MESSAGE());
+ CALLBACK_NOTIFY(message_complete);
+ } else if (parser->content_length != ULLONG_MAX) {
+ /* Content-Length header given and non-zero */
+ UPDATE_STATE(s_body_identity);
+ } else {
+ if (!http_message_needs_eof(parser)) {
+ /* Assume content-length 0 - read the next */
+ UPDATE_STATE(NEW_MESSAGE());
+ CALLBACK_NOTIFY(message_complete);
+ } else {
+ /* Read body until EOF */
+ UPDATE_STATE(s_body_identity_eof);
+ }
+ }
+ }
+
+ break;
+ }
+
+ case s_body_identity:
+ {
+ uint64_t to_read = MIN(parser->content_length,
+ (uint64_t) ((data + len) - p));
+
+ assert(parser->content_length != 0
+ && parser->content_length != ULLONG_MAX);
+
+ /* The difference between advancing content_length and p is because
+ * the latter will automaticaly advance on the next loop iteration.
+ * Further, if content_length ends up at 0, we want to see the last
+ * byte again for our message complete callback.
+ */
+ MARK(body);
+ parser->content_length -= to_read;
+ p += to_read - 1;
+
+ if (parser->content_length == 0) {
+ UPDATE_STATE(s_message_done);
+
+ /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte.
+ *
+ * The alternative to doing this is to wait for the next byte to
+ * trigger the data callback, just as in every other case. The
+ * problem with this is that this makes it difficult for the test
+ * harness to distinguish between complete-on-EOF and
+ * complete-on-length. It's not clear that this distinction is
+ * important for applications, but let's keep it for now.
+ */
+ CALLBACK_DATA_(body, p - body_mark + 1, p - data);
+ REEXECUTE();
+ }
+
+ break;
+ }
+
+ /* read until EOF */
+ case s_body_identity_eof:
+ MARK(body);
+ p = data + len - 1;
+
+ break;
+
+ case s_message_done:
+ UPDATE_STATE(NEW_MESSAGE());
+ CALLBACK_NOTIFY(message_complete);
+ if (parser->upgrade) {
+ /* Exit, the rest of the message is in a different protocol. */
+ RETURN((p - data) + 1);
+ }
+ break;
+
+ case s_chunk_size_start:
+ {
+ assert(parser->nread == 1);
+ assert(parser->flags & F_CHUNKED);
+
+ unhex_val = unhex[(unsigned char)ch];
+ if (UNLIKELY(unhex_val == -1)) {
+ SET_ERRNO(HPE_INVALID_CHUNK_SIZE);
+ goto error;
+ }
+
+ parser->content_length = unhex_val;
+ UPDATE_STATE(s_chunk_size);
+ break;
+ }
+
+ case s_chunk_size:
+ {
+ uint64_t t;
+
+ assert(parser->flags & F_CHUNKED);
+
+ if (ch == CR) {
+ UPDATE_STATE(s_chunk_size_almost_done);
+ break;
+ }
+
+ unhex_val = unhex[(unsigned char)ch];
+
+ if (unhex_val == -1) {
+ if (ch == ';' || ch == ' ') {
+ UPDATE_STATE(s_chunk_parameters);
+ break;
+ }
+
+ SET_ERRNO(HPE_INVALID_CHUNK_SIZE);
+ goto error;
+ }
+
+ t = parser->content_length;
+ t *= 16;
+ t += unhex_val;
+
+ /* Overflow? Test against a conservative limit for simplicity. */
+ if (UNLIKELY((ULLONG_MAX - 16) / 16 < parser->content_length)) {
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
+ goto error;
+ }
+
+ parser->content_length = t;
+ break;
+ }
+
+ case s_chunk_parameters:
+ {
+ assert(parser->flags & F_CHUNKED);
+ /* just ignore this shit. TODO check for overflow */
+ if (ch == CR) {
+ UPDATE_STATE(s_chunk_size_almost_done);
+ break;
+ }
+ break;
+ }
+
+ case s_chunk_size_almost_done:
+ {
+ assert(parser->flags & F_CHUNKED);
+ STRICT_CHECK(ch != LF);
+
+ parser->nread = 0;
+
+ if (parser->content_length == 0) {
+ parser->flags |= F_TRAILING;
+ UPDATE_STATE(s_header_field_start);
+ } else {
+ UPDATE_STATE(s_chunk_data);
+ }
+ CALLBACK_NOTIFY(chunk_header);
+ break;
+ }
+
+ case s_chunk_data:
+ {
+ uint64_t to_read = MIN(parser->content_length,
+ (uint64_t) ((data + len) - p));
+
+ assert(parser->flags & F_CHUNKED);
+ assert(parser->content_length != 0
+ && parser->content_length != ULLONG_MAX);
+
+ /* See the explanation in s_body_identity for why the content
+ * length and data pointers are managed this way.
+ */
+ MARK(body);
+ parser->content_length -= to_read;
+ p += to_read - 1;
+
+ if (parser->content_length == 0) {
+ UPDATE_STATE(s_chunk_data_almost_done);
+ }
+
+ break;
+ }
+
+ case s_chunk_data_almost_done:
+ assert(parser->flags & F_CHUNKED);
+ assert(parser->content_length == 0);
+ STRICT_CHECK(ch != CR);
+ UPDATE_STATE(s_chunk_data_done);
+ CALLBACK_DATA(body);
+ break;
+
+ case s_chunk_data_done:
+ assert(parser->flags & F_CHUNKED);
+ STRICT_CHECK(ch != LF);
+ parser->nread = 0;
+ UPDATE_STATE(s_chunk_size_start);
+ CALLBACK_NOTIFY(chunk_complete);
+ break;
+
+ default:
+ assert(0 && "unhandled state");
+ SET_ERRNO(HPE_INVALID_INTERNAL_STATE);
+ goto error;
+ }
+ }
+
+ /* Run callbacks for any marks that we have leftover after we ran our of
+ * bytes. There should be at most one of these set, so it's OK to invoke
+ * them in series (unset marks will not result in callbacks).
+ *
+ * We use the NOADVANCE() variety of callbacks here because 'p' has already
+ * overflowed 'data' and this allows us to correct for the off-by-one that
+ * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p'
+ * value that's in-bounds).
+ */
+
+ assert(((header_field_mark ? 1 : 0) +
+ (header_value_mark ? 1 : 0) +
+ (url_mark ? 1 : 0) +
+ (body_mark ? 1 : 0) +
+ (status_mark ? 1 : 0)) <= 1);
+
+ CALLBACK_DATA_NOADVANCE(header_field);
+ CALLBACK_DATA_NOADVANCE(header_value);
+ CALLBACK_DATA_NOADVANCE(url);
+ CALLBACK_DATA_NOADVANCE(body);
+ CALLBACK_DATA_NOADVANCE(status);
+
+ RETURN(len);
+
+error:
+ if (HTTP_PARSER_ERRNO(parser) == HPE_OK) {
+ SET_ERRNO(HPE_UNKNOWN);
+ }
+
+ RETURN(p - data);
+}
+
+
+/* Does the parser need to see an EOF to find the end of the message? */
+int
+http_message_needs_eof (const http_parser *parser)
+{
+ if (parser->type == HTTP_REQUEST) {
+ return 0;
+ }
+
+ /* See RFC 2616 section 4.4 */
+ if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */
+ parser->status_code == 204 || /* No Content */
+ parser->status_code == 304 || /* Not Modified */
+ parser->flags & F_SKIPBODY) { /* response to a HEAD request */
+ return 0;
+ }
+
+ if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {
+ return 0;
+ }
+
+ return 1;
+}
+
+
+int
+http_should_keep_alive (const http_parser *parser)
+{
+ if (parser->http_major > 0 && parser->http_minor > 0) {
+ /* HTTP/1.1 */
+ if (parser->flags & F_CONNECTION_CLOSE) {
+ return 0;
+ }
+ } else {
+ /* HTTP/1.0 or earlier */
+ if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) {
+ return 0;
+ }
+ }
+
+ return !http_message_needs_eof(parser);
+}
+
+
+const char *
+http_method_str (enum http_method m)
+{
+ return ELEM_AT(method_strings, m, "<unknown>");
+}
+
+
+void
+http_parser_init (http_parser *parser, enum http_parser_type t)
+{
+ void *data = parser->data; /* preserve application data */
+ memset(parser, 0, sizeof(*parser));
+ parser->data = data;
+ parser->type = t;
+ parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res));
+ parser->http_errno = HPE_OK;
+}
+
+void
+http_parser_settings_init(http_parser_settings *settings)
+{
+ memset(settings, 0, sizeof(*settings));
+}
+
+const char *
+http_errno_name(enum http_errno err) {
+ assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab));
+ return http_strerror_tab[err].name;
+}
+
+const char *
+http_errno_description(enum http_errno err) {
+ assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab));
+ return http_strerror_tab[err].description;
+}
+
+static enum http_host_state
+http_parse_host_char(enum http_host_state s, const char ch) {
+ switch(s) {
+ case s_http_userinfo:
+ case s_http_userinfo_start:
+ if (ch == '@') {
+ return s_http_host_start;
+ }
+
+ if (IS_USERINFO_CHAR(ch)) {
+ return s_http_userinfo;
+ }
+ break;
+
+ case s_http_host_start:
+ if (ch == '[') {
+ return s_http_host_v6_start;
+ }
+
+ if (IS_HOST_CHAR(ch)) {
+ return s_http_host;
+ }
+
+ break;
+
+ case s_http_host:
+ if (IS_HOST_CHAR(ch)) {
+ return s_http_host;
+ }
+
+ /* FALLTHROUGH */
+ case s_http_host_v6_end:
+ if (ch == ':') {
+ return s_http_host_port_start;
+ }
+
+ break;
+
+ case s_http_host_v6:
+ if (ch == ']') {
+ return s_http_host_v6_end;
+ }
+
+ /* FALLTHROUGH */
+ case s_http_host_v6_start:
+ if (IS_HEX(ch) || ch == ':' || ch == '.') {
+ return s_http_host_v6;
+ }
+
+ if (s == s_http_host_v6 && ch == '%') {
+ return s_http_host_v6_zone_start;
+ }
+ break;
+
+ case s_http_host_v6_zone:
+ if (ch == ']') {
+ return s_http_host_v6_end;
+ }
+
+ /* FALLTHROUGH */
+ case s_http_host_v6_zone_start:
+ /* RFC 6874 Zone ID consists of 1*( unreserved / pct-encoded) */
+ if (IS_ALPHANUM(ch) || ch == '%' || ch == '.' || ch == '-' || ch == '_' ||
+ ch == '~') {
+ return s_http_host_v6_zone;
+ }
+ break;
+
+ case s_http_host_port:
+ case s_http_host_port_start:
+ if (IS_NUM(ch)) {
+ return s_http_host_port;
+ }
+
+ break;
+
+ default:
+ break;
+ }
+ return s_http_host_dead;
+}
+
+static int
+http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
+ assert(u->field_set & (1 << UF_HOST));
+ enum http_host_state s;
+
+ const char *p;
+ size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len;
+
+ u->field_data[UF_HOST].len = 0;
+
+ s = found_at ? s_http_userinfo_start : s_http_host_start;
+
+ for (p = buf + u->field_data[UF_HOST].off; p < buf + buflen; p++) {
+ enum http_host_state new_s = http_parse_host_char(s, *p);
+
+ if (new_s == s_http_host_dead) {
+ return 1;
+ }
+
+ switch(new_s) {
+ case s_http_host:
+ if (s != s_http_host) {
+ u->field_data[UF_HOST].off = p - buf;
+ }
+ u->field_data[UF_HOST].len++;
+ break;
+
+ case s_http_host_v6:
+ if (s != s_http_host_v6) {
+ u->field_data[UF_HOST].off = p - buf;
+ }
+ u->field_data[UF_HOST].len++;
+ break;
+
+ case s_http_host_v6_zone_start:
+ case s_http_host_v6_zone:
+ u->field_data[UF_HOST].len++;
+ break;
+
+ case s_http_host_port:
+ if (s != s_http_host_port) {
+ u->field_data[UF_PORT].off = p - buf;
+ u->field_data[UF_PORT].len = 0;
+ u->field_set |= (1 << UF_PORT);
+ }
+ u->field_data[UF_PORT].len++;
+ break;
+
+ case s_http_userinfo:
+ if (s != s_http_userinfo) {
+ u->field_data[UF_USERINFO].off = p - buf ;
+ u->field_data[UF_USERINFO].len = 0;
+ u->field_set |= (1 << UF_USERINFO);
+ }
+ u->field_data[UF_USERINFO].len++;
+ break;
+
+ default:
+ break;
+ }
+ s = new_s;
+ }
+
+ /* Make sure we don't end somewhere unexpected */
+ switch (s) {
+ case s_http_host_start:
+ case s_http_host_v6_start:
+ case s_http_host_v6:
+ case s_http_host_v6_zone_start:
+ case s_http_host_v6_zone:
+ case s_http_host_port_start:
+ case s_http_userinfo:
+ case s_http_userinfo_start:
+ return 1;
+ default:
+ break;
+ }
+
+ return 0;
+}
+
+void
+http_parser_url_init(struct http_parser_url *u) {
+ memset(u, 0, sizeof(*u));
+}
+
+int
+http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
+ struct http_parser_url *u)
+{
+ enum state s;
+ const char *p;
+ enum http_parser_url_fields uf, old_uf;
+ int found_at = 0;
+
+ u->port = u->field_set = 0;
+ s = is_connect ? s_req_server_start : s_req_spaces_before_url;
+ old_uf = UF_MAX;
+
+ for (p = buf; p < buf + buflen; p++) {
+ s = parse_url_char(s, *p);
+
+ /* Figure out the next field that we're operating on */
+ switch (s) {
+ case s_dead:
+ return 1;
+
+ /* Skip delimeters */
+ case s_req_schema_slash:
+ case s_req_schema_slash_slash:
+ case s_req_server_start:
+ case s_req_query_string_start:
+ case s_req_fragment_start:
+ continue;
+
+ case s_req_schema:
+ uf = UF_SCHEMA;
+ break;
+
+ case s_req_server_with_at:
+ found_at = 1;
+
+ /* FALLTROUGH */
+ case s_req_server:
+ uf = UF_HOST;
+ break;
+
+ case s_req_path:
+ uf = UF_PATH;
+ break;
+
+ case s_req_query_string:
+ uf = UF_QUERY;
+ break;
+
+ case s_req_fragment:
+ uf = UF_FRAGMENT;
+ break;
+
+ default:
+ assert(!"Unexpected state");
+ return 1;
+ }
+
+ /* Nothing's changed; soldier on */
+ if (uf == old_uf) {
+ u->field_data[uf].len++;
+ continue;
+ }
+
+ u->field_data[uf].off = p - buf;
+ u->field_data[uf].len = 1;
+
+ u->field_set |= (1 << uf);
+ old_uf = uf;
+ }
+
+ /* host must be present if there is a schema */
+ /* parsing http:///toto will fail */
+ if ((u->field_set & (1 << UF_SCHEMA)) &&
+ (u->field_set & (1 << UF_HOST)) == 0) {
+ return 1;
+ }
+
+ if (u->field_set & (1 << UF_HOST)) {
+ if (http_parse_host(buf, u, found_at) != 0) {
+ return 1;
+ }
+ }
+
+ /* CONNECT requests can only contain "hostname:port" */
+ if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) {
+ return 1;
+ }
+
+ if (u->field_set & (1 << UF_PORT)) {
+ /* Don't bother with endp; we've already validated the string */
+ unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10);
+
+ /* Ports have a max value of 2^16 */
+ if (v > 0xffff) {
+ return 1;
+ }
+
+ u->port = (uint16_t) v;
+ }
+
+ return 0;
+}
+
+void
+http_parser_pause(http_parser *parser, int paused) {
+ /* Users should only be pausing/unpausing a parser that is not in an error
+ * state. In non-debug builds, there's not much that we can do about this
+ * other than ignore it.
+ */
+ if (HTTP_PARSER_ERRNO(parser) == HPE_OK ||
+ HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) {
+ SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK);
+ } else {
+ assert(0 && "Attempting to pause parser in error state");
+ }
+}
+
+int
+http_body_is_final(const struct http_parser *parser) {
+ return parser->state == s_message_done;
+}
+
+unsigned long
+http_parser_version(void) {
+ return HTTP_PARSER_VERSION_MAJOR * 0x10000 |
+ HTTP_PARSER_VERSION_MINOR * 0x00100 |
+ HTTP_PARSER_VERSION_PATCH * 0x00001;
+}
diff --git a/src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.h b/src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.h
new file mode 100644
index 000000000..105ae510a
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/nodejs-parser/http_parser.h
@@ -0,0 +1,362 @@
+/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
+ * of this software and associated documentation files (the "Software"), to
+ * deal in the Software without restriction, including without limitation the
+ * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+ * sell copies of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+#ifndef http_parser_h
+#define http_parser_h
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Also update SONAME in the Makefile whenever you change these. */
+#define HTTP_PARSER_VERSION_MAJOR 2
+#define HTTP_PARSER_VERSION_MINOR 7
+#define HTTP_PARSER_VERSION_PATCH 0
+
+#include <sys/types.h>
+#if defined(_WIN32) && !defined(__MINGW32__) && \
+ (!defined(_MSC_VER) || _MSC_VER<1600) && !defined(__WINE__)
+#include <BaseTsd.h>
+#include <stddef.h>
+typedef __int8 int8_t;
+typedef unsigned __int8 uint8_t;
+typedef __int16 int16_t;
+typedef unsigned __int16 uint16_t;
+typedef __int32 int32_t;
+typedef unsigned __int32 uint32_t;
+typedef __int64 int64_t;
+typedef unsigned __int64 uint64_t;
+#else
+#include <stdint.h>
+#endif
+
+/* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run
+ * faster
+ */
+#ifndef HTTP_PARSER_STRICT
+# define HTTP_PARSER_STRICT 1
+#endif
+
+/* Maximium header size allowed. If the macro is not defined
+ * before including this header then the default is used. To
+ * change the maximum header size, define the macro in the build
+ * environment (e.g. -DHTTP_MAX_HEADER_SIZE=<value>). To remove
+ * the effective limit on the size of the header, define the macro
+ * to a very large number (e.g. -DHTTP_MAX_HEADER_SIZE=0x7fffffff)
+ */
+#ifndef HTTP_MAX_HEADER_SIZE
+# define HTTP_MAX_HEADER_SIZE (80*1024)
+#endif
+
+typedef struct http_parser http_parser;
+typedef struct http_parser_settings http_parser_settings;
+
+
+/* Callbacks should return non-zero to indicate an error. The parser will
+ * then halt execution.
+ *
+ * The one exception is on_headers_complete. In a HTTP_RESPONSE parser
+ * returning '1' from on_headers_complete will tell the parser that it
+ * should not expect a body. This is used when receiving a response to a
+ * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding:
+ * chunked' headers that indicate the presence of a body.
+ *
+ * Returning `2` from on_headers_complete will tell parser that it should not
+ * expect neither a body nor any futher responses on this connection. This is
+ * useful for handling responses to a CONNECT request which may not contain
+ * `Upgrade` or `Connection: upgrade` headers.
+ *
+ * http_data_cb does not return data chunks. It will be called arbitrarily
+ * many times for each string. E.G. you might get 10 callbacks for "on_url"
+ * each providing just a few characters more data.
+ */
+typedef int (*http_data_cb) (http_parser*, const char *at, size_t length);
+typedef int (*http_cb) (http_parser*);
+
+
+/* Request Methods */
+#define HTTP_METHOD_MAP(XX) \
+ XX(0, DELETE, DELETE) \
+ XX(1, GET, GET) \
+ XX(2, HEAD, HEAD) \
+ XX(3, POST, POST) \
+ XX(4, PUT, PUT) \
+ /* pathological */ \
+ XX(5, CONNECT, CONNECT) \
+ XX(6, OPTIONS, OPTIONS) \
+ XX(7, TRACE, TRACE) \
+ /* WebDAV */ \
+ XX(8, COPY, COPY) \
+ XX(9, LOCK, LOCK) \
+ XX(10, MKCOL, MKCOL) \
+ XX(11, MOVE, MOVE) \
+ XX(12, PROPFIND, PROPFIND) \
+ XX(13, PROPPATCH, PROPPATCH) \
+ XX(14, SEARCH, SEARCH) \
+ XX(15, UNLOCK, UNLOCK) \
+ XX(16, BIND, BIND) \
+ XX(17, REBIND, REBIND) \
+ XX(18, UNBIND, UNBIND) \
+ XX(19, ACL, ACL) \
+ /* subversion */ \
+ XX(20, REPORT, REPORT) \
+ XX(21, MKACTIVITY, MKACTIVITY) \
+ XX(22, CHECKOUT, CHECKOUT) \
+ XX(23, MERGE, MERGE) \
+ /* upnp */ \
+ XX(24, MSEARCH, M-SEARCH) \
+ XX(25, NOTIFY, NOTIFY) \
+ XX(26, SUBSCRIBE, SUBSCRIBE) \
+ XX(27, UNSUBSCRIBE, UNSUBSCRIBE) \
+ /* RFC-5789 */ \
+ XX(28, PATCH, PATCH) \
+ XX(29, PURGE, PURGE) \
+ /* CalDAV */ \
+ XX(30, MKCALENDAR, MKCALENDAR) \
+ /* RFC-2068, section 19.6.1.2 */ \
+ XX(31, LINK, LINK) \
+ XX(32, UNLINK, UNLINK) \
+
+enum http_method
+ {
+#define XX(num, name, string) HTTP_##name = num,
+ HTTP_METHOD_MAP(XX)
+#undef XX
+ };
+
+
+enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH };
+
+
+/* Flag values for http_parser.flags field */
+enum flags
+ { F_CHUNKED = 1 << 0
+ , F_CONNECTION_KEEP_ALIVE = 1 << 1
+ , F_CONNECTION_CLOSE = 1 << 2
+ , F_CONNECTION_UPGRADE = 1 << 3
+ , F_TRAILING = 1 << 4
+ , F_UPGRADE = 1 << 5
+ , F_SKIPBODY = 1 << 6
+ , F_CONTENTLENGTH = 1 << 7
+ };
+
+
+/* Map for errno-related constants
+ *
+ * The provided argument should be a macro that takes 2 arguments.
+ */
+#define HTTP_ERRNO_MAP(XX) \
+ /* No error */ \
+ XX(OK, "success") \
+ \
+ /* Callback-related errors */ \
+ XX(CB_message_begin, "the on_message_begin callback failed") \
+ XX(CB_url, "the on_url callback failed") \
+ XX(CB_header_field, "the on_header_field callback failed") \
+ XX(CB_header_value, "the on_header_value callback failed") \
+ XX(CB_headers_complete, "the on_headers_complete callback failed") \
+ XX(CB_body, "the on_body callback failed") \
+ XX(CB_message_complete, "the on_message_complete callback failed") \
+ XX(CB_status, "the on_status callback failed") \
+ XX(CB_chunk_header, "the on_chunk_header callback failed") \
+ XX(CB_chunk_complete, "the on_chunk_complete callback failed") \
+ \
+ /* Parsing-related errors */ \
+ XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \
+ XX(HEADER_OVERFLOW, \
+ "too many header bytes seen; overflow detected") \
+ XX(CLOSED_CONNECTION, \
+ "data received after completed connection: close message") \
+ XX(INVALID_VERSION, "invalid HTTP version") \
+ XX(INVALID_STATUS, "invalid HTTP status code") \
+ XX(INVALID_METHOD, "invalid HTTP method") \
+ XX(INVALID_URL, "invalid URL") \
+ XX(INVALID_HOST, "invalid host") \
+ XX(INVALID_PORT, "invalid port") \
+ XX(INVALID_PATH, "invalid path") \
+ XX(INVALID_QUERY_STRING, "invalid query string") \
+ XX(INVALID_FRAGMENT, "invalid fragment") \
+ XX(LF_EXPECTED, "LF character expected") \
+ XX(INVALID_HEADER_TOKEN, "invalid character in header") \
+ XX(INVALID_CONTENT_LENGTH, \
+ "invalid character in content-length header") \
+ XX(UNEXPECTED_CONTENT_LENGTH, \
+ "unexpected content-length header") \
+ XX(INVALID_CHUNK_SIZE, \
+ "invalid character in chunk size header") \
+ XX(INVALID_CONSTANT, "invalid constant string") \
+ XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\
+ XX(STRICT, "strict mode assertion failed") \
+ XX(PAUSED, "parser is paused") \
+ XX(UNKNOWN, "an unknown error occurred")
+
+
+/* Define HPE_* values for each errno value above */
+#define HTTP_ERRNO_GEN(n, s) HPE_##n,
+enum http_errno {
+ HTTP_ERRNO_MAP(HTTP_ERRNO_GEN)
+};
+#undef HTTP_ERRNO_GEN
+
+
+/* Get an http_errno value from an http_parser */
+#define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno)
+
+
+struct http_parser {
+ /** PRIVATE **/
+ unsigned int type : 2; /* enum http_parser_type */
+ unsigned int flags : 8; /* F_* values from 'flags' enum; semi-public */
+ unsigned int state : 7; /* enum state from http_parser.c */
+ unsigned int header_state : 7; /* enum header_state from http_parser.c */
+ unsigned int index : 7; /* index into current matcher */
+ unsigned int lenient_http_headers : 1;
+
+ uint32_t nread; /* # bytes read in various scenarios */
+ uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */
+
+ /** READ-ONLY **/
+ unsigned short http_major;
+ unsigned short http_minor;
+ unsigned int status_code : 16; /* responses only */
+ unsigned int method : 8; /* requests only */
+ unsigned int http_errno : 7;
+
+ /* 1 = Upgrade header was present and the parser has exited because of that.
+ * 0 = No upgrade header present.
+ * Should be checked when http_parser_execute() returns in addition to
+ * error checking.
+ */
+ unsigned int upgrade : 1;
+
+ /** PUBLIC **/
+ void *data; /* A pointer to get hook to the "connection" or "socket" object */
+};
+
+
+struct http_parser_settings {
+ http_cb on_message_begin;
+ http_data_cb on_url;
+ http_data_cb on_status;
+ http_data_cb on_header_field;
+ http_data_cb on_header_value;
+ http_cb on_headers_complete;
+ http_data_cb on_body;
+ http_cb on_message_complete;
+ /* When on_chunk_header is called, the current chunk length is stored
+ * in parser->content_length.
+ */
+ http_cb on_chunk_header;
+ http_cb on_chunk_complete;
+};
+
+
+enum http_parser_url_fields
+ { UF_SCHEMA = 0
+ , UF_HOST = 1
+ , UF_PORT = 2
+ , UF_PATH = 3
+ , UF_QUERY = 4
+ , UF_FRAGMENT = 5
+ , UF_USERINFO = 6
+ , UF_MAX = 7
+ };
+
+
+/* Result structure for http_parser_parse_url().
+ *
+ * Callers should index into field_data[] with UF_* values iff field_set
+ * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and
+ * because we probably have padding left over), we convert any port to
+ * a uint16_t.
+ */
+struct http_parser_url {
+ uint16_t field_set; /* Bitmask of (1 << UF_*) values */
+ uint16_t port; /* Converted UF_PORT string */
+
+ struct {
+ uint16_t off; /* Offset into buffer in which field starts */
+ uint16_t len; /* Length of run in buffer */
+ } field_data[UF_MAX];
+};
+
+
+/* Returns the library version. Bits 16-23 contain the major version number,
+ * bits 8-15 the minor version number and bits 0-7 the patch level.
+ * Usage example:
+ *
+ * unsigned long version = http_parser_version();
+ * unsigned major = (version >> 16) & 255;
+ * unsigned minor = (version >> 8) & 255;
+ * unsigned patch = version & 255;
+ * printf("http_parser v%u.%u.%u\n", major, minor, patch);
+ */
+unsigned long http_parser_version(void);
+
+void http_parser_init(http_parser *parser, enum http_parser_type type);
+
+
+/* Initialize http_parser_settings members to 0
+ */
+void http_parser_settings_init(http_parser_settings *settings);
+
+
+/* Executes the parser. Returns number of parsed bytes. Sets
+ * `parser->http_errno` on error. */
+size_t http_parser_execute(http_parser *parser,
+ const http_parser_settings *settings,
+ const char *data,
+ size_t len);
+
+
+/* If http_should_keep_alive() in the on_headers_complete or
+ * on_message_complete callback returns 0, then this should be
+ * the last message on the connection.
+ * If you are the server, respond with the "Connection: close" header.
+ * If you are the client, close the connection.
+ */
+int http_should_keep_alive(const http_parser *parser);
+
+/* Returns a string version of the HTTP method. */
+const char *http_method_str(enum http_method m);
+
+/* Return a string name of the given error */
+const char *http_errno_name(enum http_errno err);
+
+/* Return a string description of the given error */
+const char *http_errno_description(enum http_errno err);
+
+/* Initialize all http_parser_url members to 0 */
+void http_parser_url_init(struct http_parser_url *u);
+
+/* Parse a URL; return nonzero on failure */
+int http_parser_parse_url(const char *buf, size_t buflen,
+ int is_connect,
+ struct http_parser_url *u);
+
+/* Pause or un-pause the parser; a nonzero value pauses */
+void http_parser_pause(http_parser *parser, int paused);
+
+/* Checks if this is the final chunk of the body. */
+int http_body_is_final(const http_parser *parser);
+
+#ifdef __cplusplus
+}
+#endif
+#endif
diff --git a/src/boost/libs/beast/test/bench/parser/nodejs_parser.cpp b/src/boost/libs/beast/test/bench/parser/nodejs_parser.cpp
new file mode 100644
index 000000000..cc14b9818
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/nodejs_parser.cpp
@@ -0,0 +1,31 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#if defined(__GNUC__) && (__GNUC__ >= 7)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wimplicit-fallthrough"
+#endif
+
+#include <boost/config.hpp>
+
+#ifdef BOOST_MSVC
+# pragma warning (push)
+# pragma warning (disable: 4127) // conditional expression is constant
+# pragma warning (disable: 4244) // integer conversion, possible loss of data
+#endif
+
+#include "nodejs-parser/http_parser.c"
+
+#ifdef BOOST_MSVC
+# pragma warning (pop)
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ >= 7)
+#pragma GCC diagnostic pop
+#endif
diff --git a/src/boost/libs/beast/test/bench/parser/nodejs_parser.hpp b/src/boost/libs/beast/test/bench/parser/nodejs_parser.hpp
new file mode 100644
index 000000000..68afd6f5d
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/parser/nodejs_parser.hpp
@@ -0,0 +1,640 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_HTTP_NODEJS_PARSER_HPP
+#define BOOST_BEAST_HTTP_NODEJS_PARSER_HPP
+
+#include "nodejs-parser/http_parser.h"
+
+#include <boost/beast/http/message.hpp>
+#include <boost/beast/http/rfc7230.hpp>
+#include <boost/beast/core/buffers_range.hpp>
+#include <boost/beast/core/error.hpp>
+#include <boost/asio/buffer.hpp>
+#include <boost/system/error_code.hpp>
+#include <boost/throw_exception.hpp>
+#include <cstdint>
+#include <string>
+#include <type_traits>
+#include <utility>
+
+namespace boost {
+namespace beast {
+namespace http {
+
+namespace detail {
+
+class nodejs_message_category final
+ : public boost::system::error_category
+{
+public:
+ const char*
+ name() const noexcept override
+ {
+ return "nodejs-http-error";
+ }
+
+ std::string
+ message(int ev) const override
+ {
+ return http_errno_description(
+ static_cast<http_errno>(ev));
+ }
+
+ boost::system::error_condition
+ default_error_condition(int ev) const noexcept override
+ {
+ return boost::system::error_condition{ev, *this};
+ }
+
+ bool
+ equivalent(int ev,
+ boost::system::error_condition const& condition
+ ) const noexcept override
+ {
+ return condition.value() == ev &&
+ &condition.category() == this;
+ }
+
+ bool
+ equivalent(boost::system::error_code const& error,
+ int ev) const noexcept override
+ {
+ return error.value() == ev &&
+ &error.category() == this;
+ }
+};
+
+template<class = void>
+boost::system::error_code
+make_nodejs_error(int http_errno)
+{
+ static nodejs_message_category const mc{};
+ return boost::system::error_code{http_errno, mc};
+}
+
+inline
+char const*
+method_to_string(unsigned method)
+{
+ using namespace beast;
+ switch(static_cast<http_method>(method))
+ {
+ case HTTP_DELETE: return "DELETE";
+ case HTTP_GET: return "GET";
+ case HTTP_HEAD: return "HEAD";
+ case HTTP_POST: return "POST";
+ case HTTP_PUT: return "PUT";
+
+ // pathological
+ case HTTP_CONNECT: return "CONNECT";
+ case HTTP_OPTIONS: return "OPTIONS";
+ case HTTP_TRACE: return "TRACE";
+
+ // webdav
+ case HTTP_COPY: return "COPY";
+ case HTTP_LOCK: return "LOCK";
+ case HTTP_MKCOL: return "MKCOL";
+ case HTTP_MOVE: return "MOVE";
+ case HTTP_PROPFIND: return "PROPFIND";
+ case HTTP_PROPPATCH: return "PROPPATCH";
+ case HTTP_SEARCH: return "SEARCH";
+ case HTTP_UNLOCK: return "UNLOCK";
+ case HTTP_BIND: return "BIND";
+ case HTTP_REBIND: return "REBIND";
+ case HTTP_UNBIND: return "UNBIND";
+ case HTTP_ACL: return "ACL";
+
+ // subversion
+ case HTTP_REPORT: return "REPORT";
+ case HTTP_MKACTIVITY: return "MKACTIVITY";
+ case HTTP_CHECKOUT: return "CHECKOUT";
+ case HTTP_MERGE: return "MERGE";
+
+ // upnp
+ case HTTP_MSEARCH: return "MSEARCH";
+ case HTTP_NOTIFY: return "NOTIFY";
+ case HTTP_SUBSCRIBE: return "SUBSCRIBE";
+ case HTTP_UNSUBSCRIBE: return "UNSUBSCRIBE";
+
+ // RFC-5789
+ case HTTP_PATCH: return "PATCH";
+ case HTTP_PURGE: return "PURGE";
+
+ // CalDav
+ case HTTP_MKCALENDAR: return "MKCALENDAR";
+
+ // RFC-2068, section 19.6.1.2
+ case HTTP_LINK: return "LINK";
+ case HTTP_UNLINK: return "UNLINK";
+ };
+
+ return "<unknown>";
+}
+
+} // detail
+
+template<class Derived>
+class nodejs_basic_parser
+{
+ http_parser state_;
+ boost::system::error_code* ec_;
+ bool complete_ = false;
+ std::string url_;
+ std::string status_;
+ std::string field_;
+ std::string value_;
+
+public:
+ using error_code = boost::system::error_code;
+
+ nodejs_basic_parser(nodejs_basic_parser&& other);
+
+ nodejs_basic_parser&
+ operator=(nodejs_basic_parser&& other);
+
+ nodejs_basic_parser(nodejs_basic_parser const& other);
+
+ nodejs_basic_parser& operator=(nodejs_basic_parser const& other);
+
+ explicit
+ nodejs_basic_parser(bool request) noexcept;
+
+ bool
+ complete() const noexcept
+ {
+ return complete_;
+ }
+
+ std::size_t
+ write(void const* data, std::size_t size)
+ {
+ error_code ec;
+ auto const used = write(data, size, ec);
+ if(ec)
+ BOOST_THROW_EXCEPTION(system_error{ec});
+ return used;
+ }
+
+ std::size_t
+ write(void const* data, std::size_t size,
+ error_code& ec);
+
+ template<class ConstBufferSequence>
+ std::size_t
+ write(ConstBufferSequence const& buffers)
+ {
+ error_code ec;
+ auto const used = write(buffers, ec);
+ if(ec)
+ BOOST_THROW_EXCEPTION(system_error{ec});
+ return used;
+ }
+
+ template<class ConstBufferSequence>
+ std::size_t
+ write(ConstBufferSequence const& buffers,
+ error_code& ec);
+
+ void
+ write_eof()
+ {
+ error_code ec;
+ write_eof(ec);
+ if(ec)
+ BOOST_THROW_EXCEPTION(system_error{ec});
+ }
+
+ void
+ write_eof(error_code& ec);
+
+ void
+ check_header();
+
+private:
+ Derived&
+ impl()
+ {
+ return *static_cast<Derived*>(this);
+ }
+
+ static int cb_message_start(http_parser*);
+ static int cb_url(http_parser*, char const*, std::size_t);
+ static int cb_status(http_parser*, char const*, std::size_t);
+ static int cb_header_field(http_parser*, char const*, std::size_t);
+ static int cb_header_value(http_parser*, char const*, std::size_t);
+ static int cb_headers_complete(http_parser*);
+ static int cb_body(http_parser*, char const*, std::size_t);
+ static int cb_message_complete(http_parser*);
+ static int cb_chunk_header(http_parser*);
+ static int cb_chunk_complete(http_parser*);
+
+ struct hooks_t : http_parser_settings
+ {
+ hooks_t()
+ {
+ http_parser_settings_init(this);
+ on_message_begin = &nodejs_basic_parser::cb_message_start;
+ on_url = &nodejs_basic_parser::cb_url;
+ on_status = &nodejs_basic_parser::cb_status;
+ on_header_field = &nodejs_basic_parser::cb_header_field;
+ on_header_value = &nodejs_basic_parser::cb_header_value;
+ on_headers_complete = &nodejs_basic_parser::cb_headers_complete;
+ on_body = &nodejs_basic_parser::cb_body;
+ on_message_complete = &nodejs_basic_parser::cb_message_complete;
+ on_chunk_header = &nodejs_basic_parser::cb_chunk_header;
+ on_chunk_complete = &nodejs_basic_parser::cb_chunk_complete;
+ }
+ };
+
+ static
+ http_parser_settings const*
+ hooks();
+};
+
+template<class Derived>
+template<class ConstBufferSequence>
+std::size_t
+nodejs_basic_parser<Derived>::write(
+ ConstBufferSequence const& buffers, error_code& ec)
+{
+ static_assert(net::is_const_buffer_sequence<
+ ConstBufferSequence>::value,
+ "ConstBufferSequence type requirements not met");
+ std::size_t bytes_used = 0;
+ for(auto buffer : beast::buffers_range_ref(buffers))
+ {
+ auto const n = write(
+ static_cast<void const*>(buffer.data()),
+ buffer.size(), ec);
+ if(ec)
+ return 0;
+ bytes_used += n;
+ if(complete())
+ break;
+ }
+ return bytes_used;
+}
+
+template<class Derived>
+http_parser_settings const*
+nodejs_basic_parser<Derived>::hooks()
+{
+ static hooks_t const h;
+ return &h;
+}
+
+template<class Derived>
+nodejs_basic_parser<Derived>::
+nodejs_basic_parser(nodejs_basic_parser&& other)
+{
+ state_ = other.state_;
+ state_.data = this;
+ complete_ = other.complete_;
+ url_ = std::move(other.url_);
+ status_ = std::move(other.status_);
+ field_ = std::move(other.field_);
+ value_ = std::move(other.value_);
+}
+
+template<class Derived>
+auto
+nodejs_basic_parser<Derived>::
+operator=(nodejs_basic_parser&& other) ->
+ nodejs_basic_parser&
+{
+ state_ = other.state_;
+ state_.data = this;
+ complete_ = other.complete_;
+ url_ = std::move(other.url_);
+ status_ = std::move(other.status_);
+ field_ = std::move(other.field_);
+ value_ = std::move(other.value_);
+ return *this;
+}
+
+template<class Derived>
+nodejs_basic_parser<Derived>::
+nodejs_basic_parser(nodejs_basic_parser const& other)
+{
+ state_ = other.state_;
+ state_.data = this;
+ complete_ = other.complete_;
+ url_ = other.url_;
+ status_ = other.status_;
+ field_ = other.field_;
+ value_ = other.value_;
+}
+
+template<class Derived>
+auto
+nodejs_basic_parser<Derived>::
+operator=(nodejs_basic_parser const& other) ->
+ nodejs_basic_parser&
+{
+ state_ = other.state_;
+ state_.data = this;
+ complete_ = other.complete_;
+ url_ = other.url_;
+ status_ = other.status_;
+ field_ = other.field_;
+ value_ = other.value_;
+ return *this;
+}
+
+template<class Derived>
+nodejs_basic_parser<Derived>::
+nodejs_basic_parser(bool request) noexcept
+{
+ state_.data = this;
+ http_parser_init(&state_, request
+ ? http_parser_type::HTTP_REQUEST
+ : http_parser_type::HTTP_RESPONSE);
+}
+
+template<class Derived>
+std::size_t
+nodejs_basic_parser<Derived>::
+write(void const* data,
+ std::size_t size, error_code& ec)
+{
+ ec_ = &ec;
+ auto const n = http_parser_execute(
+ &state_, hooks(),
+ static_cast<const char*>(data), size);
+ if(! ec)
+ ec = detail::make_nodejs_error(
+ static_cast<int>(state_.http_errno));
+ if(ec)
+ return 0;
+ return n;
+}
+
+template<class Derived>
+void
+nodejs_basic_parser<Derived>::
+write_eof(error_code& ec)
+{
+ ec_ = &ec;
+ http_parser_execute(&state_, hooks(), nullptr, 0);
+ if(! ec)
+ ec = detail::make_nodejs_error(
+ static_cast<int>(state_.http_errno));
+}
+
+template<class Derived>
+void
+nodejs_basic_parser<Derived>::
+check_header()
+{
+ if(! value_.empty())
+ {
+ impl().on_field(field_, value_);
+ field_.clear();
+ value_.clear();
+ }
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_message_start(http_parser* p)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.complete_ = false;
+ t.url_.clear();
+ t.status_.clear();
+ t.field_.clear();
+ t.value_.clear();
+ t.impl().on_start();
+ return 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_url(http_parser* p,
+ char const* in, std::size_t bytes)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.url_.append(in, bytes);
+ return 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_status(http_parser* p,
+ char const* in, std::size_t bytes)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.status_.append(in, bytes);
+ return 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_header_field(http_parser* p,
+ char const* in, std::size_t bytes)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.check_header();
+ t.field_.append(in, bytes);
+ return 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_header_value(http_parser* p,
+ char const* in, std::size_t bytes)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.value_.append(in, bytes);
+ return 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_headers_complete(http_parser* p)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.check_header();
+ t.impl().on_headers_complete(*t.ec_);
+ if(*t.ec_)
+ return 1;
+ bool const keep_alive =
+ http_should_keep_alive(p) != 0;
+ if(p->type == http_parser_type::HTTP_REQUEST)
+ {
+ t.impl().on_request(p->method, t.url_,
+ p->http_major, p->http_minor, keep_alive,
+ p->upgrade);
+ return 0;
+ }
+ return t.impl().on_response(p->status_code, t.status_,
+ p->http_major, p->http_minor, keep_alive,
+ p->upgrade) ? 0 : 1;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_body(http_parser* p,
+ char const* in, std::size_t bytes)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.impl().on_body(in, bytes, *t.ec_);
+ return *t.ec_ ? 1 : 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_message_complete(http_parser* p)
+{
+ auto& t = *reinterpret_cast<nodejs_basic_parser*>(p->data);
+ t.complete_ = true;
+ t.impl().on_complete();
+ return 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_chunk_header(http_parser*)
+{
+ return 0;
+}
+
+template<class Derived>
+int
+nodejs_basic_parser<Derived>::
+cb_chunk_complete(http_parser*)
+{
+ return 0;
+}
+
+//------------------------------------------------------------------------------
+
+/** A HTTP parser.
+
+ The parser may only be used once.
+*/
+template<bool isRequest, class Body, class Fields>
+class nodejs_parser
+ : public nodejs_basic_parser<nodejs_parser<isRequest, Body, Fields>>
+{
+ bool started_ = false;
+
+public:
+ nodejs_parser(nodejs_parser&&) = default;
+
+ nodejs_parser()
+ : http::nodejs_basic_parser<nodejs_parser>(isRequest)
+ {
+ }
+
+ /// Returns `true` if at least one byte has been processed
+ bool
+ started()
+ {
+ return started_;
+ }
+
+private:
+ friend class http::nodejs_basic_parser<nodejs_parser>;
+
+ void
+ on_start()
+ {
+ started_ = true;
+ }
+
+ void
+ on_field(std::string const&, std::string const&)
+ {
+ }
+
+ void
+ on_headers_complete(error_code& ec)
+ {
+ // vFALCO TODO Decode the Content-Length and
+ // Transfer-Encoding, see if we can reserve the buffer.
+ //
+ // r_.reserve(content_length)
+ ec = {};
+ }
+
+ bool
+ on_request(unsigned, std::string const&,
+ int, int, bool, bool, std::true_type)
+ {
+ return true;
+ }
+
+ bool
+ on_request(unsigned, std::string const&,
+ int, int, bool, bool, std::false_type)
+ {
+ return true;
+ }
+
+ bool
+ on_request(unsigned method, std::string const& url,
+ int major, int minor, bool keep_alive, bool upgrade)
+ {
+ return on_request(method, url,
+ major, minor, keep_alive, upgrade,
+ std::integral_constant<
+ bool, isRequest>{});
+ }
+
+ bool
+ on_response(int, std::string const&,
+ int, int, bool, bool, std::true_type)
+ {
+ return true;
+ }
+
+ bool
+ on_response(int, std::string const&, int, int, bool, bool,
+ std::false_type)
+ {
+ return true;
+ }
+
+ bool
+ on_response(int status, std::string const& reason,
+ int major, int minor, bool keep_alive, bool upgrade)
+ {
+ return on_response(
+ status, reason, major, minor, keep_alive, upgrade,
+ std::integral_constant<bool, ! isRequest>{});
+ }
+
+ void
+ on_body(void const*, std::size_t, error_code& ec)
+ {
+ ec = {};
+ }
+
+ void
+ on_complete()
+ {
+ }
+};
+
+} // http
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/bench/utf8_checker/CMakeLists.txt b/src/boost/libs/beast/test/bench/utf8_checker/CMakeLists.txt
new file mode 100644
index 000000000..6164127a6
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/utf8_checker/CMakeLists.txt
@@ -0,0 +1,25 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/bench/utf8_checker "/")
+
+add_executable (bench-utf8-checker
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ bench_utf8_checker.cpp
+)
+
+target_link_libraries(bench-utf8-checker
+ lib-asio
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET bench-utf8-checker PROPERTY FOLDER "tests-bench")
diff --git a/src/boost/libs/beast/test/bench/utf8_checker/Jamfile b/src/boost/libs/beast/test/bench/utf8_checker/Jamfile
new file mode 100644
index 000000000..1d352f381
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/utf8_checker/Jamfile
@@ -0,0 +1,19 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe bench-utf8-checker : bench_utf8_checker.cpp
+ : requirements
+ <library>/boost/beast/test//lib-test
+ ;
+
+explicit bench-utf8-checker ;
+
+alias run-tests :
+ [ compile bench_utf8_checker.cpp ]
+ ;
diff --git a/src/boost/libs/beast/test/bench/utf8_checker/bench_utf8_checker.cpp b/src/boost/libs/beast/test/bench/utf8_checker/bench_utf8_checker.cpp
new file mode 100644
index 000000000..e7f81004b
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/utf8_checker/bench_utf8_checker.cpp
@@ -0,0 +1,157 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/websocket/detail/utf8_checker.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <chrono>
+#include <random>
+
+#ifndef BEAST_USE_BOOST_LOCALE_BENCHMARK
+#define BEAST_USE_BOOST_LOCALE_BENCHMARK 0
+#endif
+
+#if BEAST_USE_BOOST_LOCALE_BENCHMARK
+#include <boost/locale.hpp>
+#endif
+
+namespace boost {
+namespace beast {
+
+class utf8_checker_test : public beast::unit_test::suite
+{
+ std::mt19937 rng_;
+
+public:
+ using size_type = std::uint64_t;
+
+ class timer
+ {
+ public:
+ using clock_type =
+ std::chrono::system_clock;
+
+ private:
+ clock_type::time_point when_;
+
+ public:
+ using duration =
+ clock_type::duration;
+
+ timer()
+ : when_(clock_type::now())
+ {
+ }
+
+ duration
+ elapsed() const
+ {
+ return clock_type::now() - when_;
+ }
+ };
+
+ template<class UInt = std::size_t>
+ UInt
+ rand(std::size_t n)
+ {
+ return static_cast<UInt>(
+ std::uniform_int_distribution<
+ std::size_t>{0, n-1}(rng_));
+ }
+
+ static
+ inline
+ size_type
+ throughput(std::chrono::duration<
+ double> const& elapsed, size_type items)
+ {
+ using namespace std::chrono;
+ return static_cast<size_type>(
+ 1 / (elapsed/items).count());
+ }
+
+ std::string
+ corpus(std::size_t n)
+ {
+ std::string s;
+ s.reserve(n);
+ while(n--)
+ s.push_back(static_cast<char>(
+ ' ' + rand(95)));
+ return s;
+ }
+
+ void
+ checkBeast(std::string const& s)
+ {
+ beast::websocket::detail::check_utf8(
+ s.data(), s.size());
+ }
+
+#if BEAST_USE_BOOST_LOCALE_BENCHMARK
+ void
+ checkLocale(std::string const& s)
+ {
+ using namespace boost::locale;
+ auto p = s.begin();
+ auto const e = s.end();
+ while(p != e)
+ {
+ auto cp = utf::utf_traits<char>::decode(p, e);
+ if(cp == utf::illegal)
+ break;
+ }
+ }
+#endif
+
+ template<class F>
+ typename timer::clock_type::duration
+ test(F const& f)
+ {
+ timer t;
+ f();
+ return t.elapsed();
+ }
+
+ void
+ run() override
+ {
+ auto const s = corpus(32 * 1024 * 1024);
+ for(int i = 0; i < 5; ++ i)
+ {
+ auto const elapsed = test([&]{
+ checkBeast(s);
+ checkBeast(s);
+ checkBeast(s);
+ checkBeast(s);
+ checkBeast(s);
+ });
+ log << "beast: " << throughput(elapsed, s.size()) << " char/s" << std::endl;
+ }
+ #if BEAST_USE_BOOST_LOCALE_BENCHMARK
+ for(int i = 0; i < 5; ++ i)
+ {
+ auto const elapsed = test([&]{
+ checkLocale(s);
+ checkLocale(s);
+ checkLocale(s);
+ checkLocale(s);
+ checkLocale(s);
+ });
+ log << "locale: " << throughput(elapsed, s.size()) << " char/s" << std::endl;
+ }
+ #endif
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,benchmarks,utf8_checker);
+
+} // beast
+} // boost
+
diff --git a/src/boost/libs/beast/test/bench/wsload/CMakeLists.txt b/src/boost/libs/beast/test/bench/wsload/CMakeLists.txt
new file mode 100644
index 000000000..7a6c58760
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/wsload/CMakeLists.txt
@@ -0,0 +1,24 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/bench/wsload "/")
+
+add_executable (bench-wsload
+ ${BOOST_BEAST_FILES}
+ Jamfile
+ wsload.cpp
+ )
+
+target_link_libraries(bench-wsload
+ lib-asio
+ lib-beast
+ )
+
+set_property(TARGET bench-wsload PROPERTY FOLDER "tests-bench")
diff --git a/src/boost/libs/beast/test/bench/wsload/Jamfile b/src/boost/libs/beast/test/bench/wsload/Jamfile
new file mode 100644
index 000000000..82706e15e
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/wsload/Jamfile
@@ -0,0 +1,18 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe wsload :
+ wsload.cpp
+ ;
+
+explicit wsload ;
+
+alias run-tests :
+ [ compile wsload.cpp : : wsload-compile ]
+ ;
diff --git a/src/boost/libs/beast/test/bench/wsload/wsload.cpp b/src/boost/libs/beast/test/bench/wsload/wsload.cpp
new file mode 100644
index 000000000..f697d9b85
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/wsload/wsload.cpp
@@ -0,0 +1,338 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+//------------------------------------------------------------------------------
+//
+// wsload
+//
+// Measure the performance of a WebSocket server
+//
+//------------------------------------------------------------------------------
+
+#include <boost/beast/core.hpp>
+#include <boost/beast/websocket.hpp>
+#include <boost/beast/_experimental/unit_test/dstream.hpp>
+#include <boost/asio.hpp>
+#include <atomic>
+#include <chrono>
+#include <cstdlib>
+#include <functional>
+#include <iostream>
+#include <memory>
+#include <mutex>
+#include <random>
+#include <thread>
+#include <vector>
+
+namespace beast = boost::beast; // from <boost/beast.hpp>
+namespace http = beast::http; // from <boost/beast/http.hpp>
+namespace websocket = beast::websocket; // from <boost/beast/websocket.hpp>
+namespace net = boost::asio; // from <boost/asio.hpp>
+using tcp = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>
+
+class test_buffer
+{
+ char data_[4096];
+ net::const_buffer b_;
+
+public:
+ using const_iterator =
+ net::const_buffer const*;
+
+ using value_type = net::const_buffer;
+
+ test_buffer()
+ : b_(data_, sizeof(data_))
+ {
+ std::mt19937_64 rng;
+ std::uniform_int_distribution<unsigned short> dist;
+ for(auto& c : data_)
+ c = static_cast<unsigned char>(dist(rng));
+ }
+
+ const_iterator
+ begin() const
+ {
+ return &b_;
+ }
+
+ const_iterator
+ end() const
+ {
+ return begin() + 1;
+ }
+};
+
+class report
+{
+ std::mutex m_;
+ std::size_t bytes_ = 0;
+ std::size_t messages_ = 0;
+
+public:
+ void
+ insert(std::size_t messages, std::size_t bytes)
+ {
+ std::lock_guard<std::mutex> lock(m_);
+ bytes_ += bytes;
+ messages_ += messages;
+ }
+
+ std::size_t
+ bytes() const
+ {
+ return bytes_;
+ }
+
+ std::size_t
+ messages() const
+ {
+ return messages_;
+ }
+};
+
+void
+fail(beast::error_code ec, char const* what)
+{
+ std::cerr << what << ": " << ec.message() << "\n";
+}
+
+class connection
+ : public std::enable_shared_from_this<connection>
+{
+ websocket::stream<tcp::socket> ws_;
+ tcp::endpoint ep_;
+ std::size_t messages_;
+ report& rep_;
+ test_buffer const& tb_;
+ net::strand<
+ net::io_context::executor_type> strand_;
+ beast::flat_buffer buffer_;
+ std::mt19937_64 rng_;
+ std::size_t count_ = 0;
+ std::size_t bytes_ = 0;
+
+public:
+ connection(
+ net::io_context& ioc,
+ tcp::endpoint const& ep,
+ std::size_t messages,
+ bool deflate,
+ report& rep,
+ test_buffer const& tb)
+ : ws_(ioc)
+ , ep_(ep)
+ , messages_(messages)
+ , rep_(rep)
+ , tb_(tb)
+ , strand_(ioc.get_executor())
+ {
+ websocket::permessage_deflate pmd;
+ pmd.client_enable = deflate;
+ ws_.set_option(pmd);
+ ws_.binary(true);
+ ws_.auto_fragment(false);
+ ws_.write_buffer_bytes(64 * 1024);
+ }
+
+ ~connection()
+ {
+ rep_.insert(count_, bytes_);
+ }
+
+ void
+ run()
+ {
+ ws_.next_layer().async_connect(ep_,
+ beast::bind_front_handler(
+ &connection::on_connect,
+ this->shared_from_this()));
+ }
+
+private:
+ void
+ on_connect(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "on_connect");
+
+ ws_.async_handshake(
+ ep_.address().to_string() + ":" + std::to_string(ep_.port()),
+ "/",
+ beast::bind_front_handler(
+ &connection::on_handshake,
+ this->shared_from_this()));
+ }
+
+ void
+ on_handshake(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "handshake");
+
+ do_write();
+ }
+
+ void
+ do_write()
+ {
+ std::geometric_distribution<std::size_t> dist{
+ double(4) / beast::buffer_bytes(tb_)};
+ ws_.async_write_some(true,
+ beast::buffers_prefix(dist(rng_), tb_),
+ beast::bind_front_handler(
+ &connection::on_write,
+ this->shared_from_this()));
+ }
+
+ void
+ on_write(beast::error_code ec, std::size_t)
+ {
+ if(ec)
+ return fail(ec, "write");
+
+ if(messages_--)
+ return do_read();
+
+ ws_.async_close({},
+ beast::bind_front_handler(
+ &connection::on_close,
+ this->shared_from_this()));
+ }
+
+ void
+ do_read()
+ {
+ ws_.async_read(buffer_,
+ beast::bind_front_handler(
+ &connection::on_read,
+ this->shared_from_this()));
+ }
+
+ void
+ on_read(beast::error_code ec, std::size_t)
+ {
+ if(ec)
+ return fail(ec, "read");
+
+ ++count_;
+ bytes_ += buffer_.size();
+ buffer_.consume(buffer_.size());
+ do_write();
+ }
+
+ void
+ on_close(beast::error_code ec)
+ {
+ if(ec)
+ return fail(ec, "close");
+ }
+};
+
+class timer
+{
+ using clock_type =
+ std::chrono::system_clock;
+
+ clock_type::time_point when_;
+
+public:
+ using duration =
+ clock_type::duration;
+
+ timer()
+ : when_(clock_type::now())
+ {
+ }
+
+ duration
+ elapsed() const
+ {
+ return clock_type::now() - when_;
+ }
+};
+
+inline
+std::uint64_t
+throughput(
+ std::chrono::duration<double> const& elapsed,
+ std::uint64_t items)
+{
+ using namespace std::chrono;
+ return static_cast<std::uint64_t>(
+ 1 / (elapsed/items).count());
+}
+
+int
+main(int argc, char** argv)
+{
+ beast::unit_test::dstream dout(std::cerr);
+
+ try
+ {
+ // Check command line arguments.
+ if(argc != 8)
+ {
+ std::cerr <<
+ "Usage: bench-wsload <address> <port> <trials> <messages> <workers> <threads> <compression:0|1>";
+ return EXIT_FAILURE;
+ }
+
+ auto const address = net::ip::make_address(argv[1]);
+ auto const port = static_cast<unsigned short>(std::atoi(argv[2]));
+ auto const trials = static_cast<std::size_t>(std::atoi(argv[3]));
+ auto const messages= static_cast<std::size_t>(std::atoi(argv[4]));
+ auto const workers = static_cast<std::size_t>(std::atoi(argv[5]));
+ auto const threads = static_cast<std::size_t>(std::atoi(argv[6]));
+ auto const deflate = std::atoi(argv[7]) != 0;
+ auto const work = (messages + workers - 1) / workers;
+ test_buffer tb;
+ for(auto i = trials; i != 0; --i)
+ {
+ report rep;
+ net::io_context ioc{1};
+ for(auto j = workers; j; --j)
+ {
+ auto sp =
+ std::make_shared<connection>(
+ ioc,
+ tcp::endpoint{address, port},
+ work,
+ deflate,
+ rep,
+ tb);
+ sp->run();
+ }
+ timer clock;
+ std::vector<std::thread> tv;
+ if(threads > 1)
+ {
+ tv.reserve(threads);
+ tv.emplace_back([&ioc]{ ioc.run(); });
+ }
+ ioc.run();
+ for(auto& t : tv)
+ t.join();
+ auto const elapsed = clock.elapsed();
+ dout <<
+ throughput(elapsed, rep.bytes()) << " bytes/s in " <<
+ (std::chrono::duration_cast<
+ std::chrono::milliseconds>(
+ elapsed).count() / 1000.) << "ms and " <<
+ rep.bytes() << " bytes" << std::endl;
+ }
+ }
+ catch(std::exception const& e)
+ {
+ std::cerr << "Error: " << e.what() << std::endl;
+ return EXIT_FAILURE;
+ }
+
+ return EXIT_SUCCESS;
+}
diff --git a/src/boost/libs/beast/test/bench/zlib/CMakeLists.txt b/src/boost/libs/beast/test/bench/zlib/CMakeLists.txt
new file mode 100644
index 000000000..a030ed93f
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/zlib/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (test/extern/zlib-1.2.11 zlib)
+GroupSources (test/bench/zlib "/")
+
+if (MSVC)
+ set_source_files_properties (${ZLIB_SOURCES} PROPERTIES COMPILE_FLAGS "/wd4127 /wd4131 /wd4244")
+endif()
+
+add_executable (bench-zlib
+ ${BOOST_BEAST_FILES}
+ ${ZLIB_SOURCES}
+ Jamfile
+ deflate_stream.cpp
+ inflate_stream.cpp
+)
+target_link_libraries(bench-zlib
+ lib-asio
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET bench-zlib PROPERTY FOLDER "tests-bench")
diff --git a/src/boost/libs/beast/test/bench/zlib/Jamfile b/src/boost/libs/beast/test/bench/zlib/Jamfile
new file mode 100644
index 000000000..6e210c29b
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/zlib/Jamfile
@@ -0,0 +1,15 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+exe bench-zlib :
+ $(ZLIB_SOURCES)
+ deflate_stream.cpp
+ inflate_stream.cpp
+ /boost/beast/test//lib-test
+ ;
diff --git a/src/boost/libs/beast/test/bench/zlib/deflate_stream.cpp b/src/boost/libs/beast/test/bench/zlib/deflate_stream.cpp
new file mode 100644
index 000000000..321fa98c0
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/zlib/deflate_stream.cpp
@@ -0,0 +1,199 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/zlib/deflate_stream.hpp>
+#include <boost/beast/test/throughput.hpp>
+#include <boost/beast/_experimental/unit_test/dstream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <iomanip>
+#include <random>
+#include <string>
+
+#include "zlib-1.2.11/zlib.h"
+
+namespace boost {
+namespace beast {
+namespace zlib {
+
+class deflate_stream_test : public beast::unit_test::suite
+{
+public:
+ // Lots of repeats, limited char range
+ static
+ std::string
+ corpus1(std::size_t n)
+ {
+ static std::string const alphabet{
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ };
+ std::string s;
+ s.reserve(n + 5);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::size_t> d0{
+ 0, alphabet.size() - 1};
+ std::uniform_int_distribution<std::size_t> d1{
+ 1, 5};
+ while(s.size() < n)
+ {
+ auto const rep = d1(g);
+ auto const ch = alphabet[d0(g)];
+ s.insert(s.end(), rep, ch);
+ }
+ s.resize(n);
+ return s;
+ }
+
+ // Random data
+ static
+ std::string
+ corpus2(std::size_t n)
+ {
+ std::string s;
+ s.reserve(n);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::uint32_t> d0{0, 255};
+ while(n--)
+ s.push_back(static_cast<char>(d0(g)));
+ return s;
+ }
+
+ std::string
+ doDeflateBeast(string_view const& in)
+ {
+ z_params zs;
+ deflate_stream ds;
+ ds.reset(
+ Z_DEFAULT_COMPRESSION,
+ 15,
+ 4,
+ Strategy::normal);
+ std::string out;
+ out.resize(deflate_upper_bound(in.size()));
+ zs.next_in = in.data();
+ zs.avail_in = in.size();
+ zs.next_out = &out[0];
+ zs.avail_out = out.size();
+ error_code ec;
+ ds.write(zs, Flush::full, ec);
+ BEAST_EXPECTS(! ec, ec.message());
+ out.resize(zs.total_out);
+ return out;
+ }
+
+ std::string
+ doDeflateZLib(string_view const& in)
+ {
+ int result;
+ z_stream zs;
+ memset(&zs, 0, sizeof(zs));
+ result = deflateInit2(
+ &zs,
+ Z_DEFAULT_COMPRESSION,
+ Z_DEFLATED,
+ -15,
+ 4,
+ Z_DEFAULT_STRATEGY
+ );
+ if(result != Z_OK)
+ throw std::logic_error("deflateInit2 failed");
+ std::string out;
+ out.resize(deflateBound(&zs,
+ static_cast<uLong>(in.size())));
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ zs.next_out = (Bytef*)&out[0];
+ zs.avail_out = static_cast<uInt>(out.size());
+ result = deflate(&zs, Z_FULL_FLUSH);
+ if(result != Z_OK)
+ throw std::logic_error("deflate failed");
+ out.resize(zs.total_out);
+ deflateEnd(&zs);
+ return out;
+ }
+
+ void
+ doCorpus(
+ std::size_t size,
+ std::size_t repeat)
+ {
+ std::size_t constexpr trials = 3;
+ auto const c1 = corpus1(size);
+ auto const c2 = corpus2(size);
+ log <<
+ std::left << std::setw(10) << (std::to_string(size) + "B") <<
+ std::right << std::setw(12) << "Beast" << " " <<
+ std::right << std::setw(12) << "ZLib" <<
+ std::endl;
+ for(std::size_t i = 0; i < trials; ++i)
+ {
+ test::timer t;
+ log << std::left << std::setw(10) << "corpus1";
+ std::string out1;
+ for(std::size_t j = 0; j < repeat; ++j)
+ out1 = doDeflateBeast(c1);
+ auto const t1 =
+ test::throughput(t.elapsed(), size * repeat);
+ log << std::right << std::setw(12) << t1 << " B/s ";
+ std::string out2;
+ for(std::size_t j = 0; j < repeat; ++j)
+ out2 = doDeflateZLib(c1);
+ BEAST_EXPECT(out1 == out2);
+ auto const t2 =
+ test::throughput(t.elapsed(), size * repeat);
+ log << std::right << std::setw(12) << t2 << " B/s";
+ log << std::right << std::setw(12) <<
+ unsigned(double(t1)*100/t2-100) << "%";
+ log << std::endl;
+ }
+ for(std::size_t i = 0; i < trials; ++i)
+ {
+ test::timer t;
+ log << std::left << std::setw(10) << "corpus2";
+ std::string out1;
+ for(std::size_t j = 0; j < repeat; ++j)
+ out1 = doDeflateBeast(c2);
+ auto const t1 =
+ test::throughput(t.elapsed(), size * repeat);
+ log << std::right << std::setw(12) << t1 << " B/s ";
+ std::string out2;
+ for(std::size_t j = 0; j < repeat; ++j)
+ out2 = doDeflateZLib(c2);
+ BEAST_EXPECT(out1 == out2);
+ auto const t2 =
+ test::throughput(t.elapsed(), size * repeat);
+ log << std::right << std::setw(12) << t2 << " B/s";
+ log << std::right << std::setw(12) <<
+ unsigned(double(t1)*100/t2-100) << "%";
+ log << std::endl;
+ }
+ log << std::endl;
+ }
+
+ void
+ doBench()
+ {
+ doCorpus( 16 * 1024, 512);
+ doCorpus( 1024 * 1024, 8);
+ doCorpus(8 * 1024 * 1024, 1);
+ }
+
+ void
+ run() override
+ {
+ doBench();
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,zlib,deflate_stream);
+
+} // zlib
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/bench/zlib/inflate_stream.cpp b/src/boost/libs/beast/test/bench/zlib/inflate_stream.cpp
new file mode 100644
index 000000000..ea8d6d982
--- /dev/null
+++ b/src/boost/libs/beast/test/bench/zlib/inflate_stream.cpp
@@ -0,0 +1,244 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#include <boost/beast/core/string.hpp>
+#include <boost/beast/zlib/inflate_stream.hpp>
+#include <boost/beast/test/throughput.hpp>
+#include <boost/beast/_experimental/unit_test/dstream.hpp>
+#include <boost/beast/_experimental/unit_test/suite.hpp>
+#include <iomanip>
+#include <random>
+#include <string>
+
+#include "zlib-1.2.11/zlib.h"
+
+namespace boost {
+namespace beast {
+namespace zlib {
+
+class inflate_stream_test : public beast::unit_test::suite
+{
+public:
+ // Lots of repeats, limited char range
+ static
+ std::string
+ corpus1(std::size_t n)
+ {
+ static std::string const alphabet{
+ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ };
+ std::string s;
+ s.reserve(n + 5);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::size_t> d0{
+ 0, alphabet.size() - 1};
+ std::uniform_int_distribution<std::size_t> d1{
+ 1, 5};
+ while(s.size() < n)
+ {
+ auto const rep = d1(g);
+ auto const ch = alphabet[d0(g)];
+ s.insert(s.end(), rep, ch);
+ }
+ s.resize(n);
+ return s;
+ }
+
+ // Random data
+ static
+ std::string
+ corpus2(std::size_t n)
+ {
+ std::string s;
+ s.reserve(n);
+ std::mt19937 g;
+ std::uniform_int_distribution<std::uint32_t> d0{0, 255};
+ while(n--)
+ s.push_back(static_cast<char>(d0(g)));
+ return s;
+ }
+
+ static
+ std::string
+ compress(string_view const& in)
+ {
+ int result;
+ z_stream zs;
+ memset(&zs, 0, sizeof(zs));
+ result = deflateInit2(
+ &zs,
+ Z_DEFAULT_COMPRESSION,
+ Z_DEFLATED,
+ -15,
+ 4,
+ Z_DEFAULT_STRATEGY);
+ if(result != Z_OK)
+ throw std::logic_error("deflateInit2 failed");
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ std::string out;
+ out.resize(deflateBound(&zs,
+ static_cast<uLong>(in.size())));
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ zs.next_out = (Bytef*)&out[0];
+ zs.avail_out = static_cast<uInt>(out.size());
+ result = deflate(&zs, Z_FULL_FLUSH);
+ if(result != Z_OK)
+ throw std::logic_error("deflate failed");
+ out.resize(zs.total_out);
+ deflateEnd(&zs);
+ return out;
+ }
+
+ std::string
+ doInflateBeast(string_view const& in)
+ {
+ z_params zs;
+ std::string out;
+ inflate_stream is;
+ zs.next_in = &in[0];
+ zs.avail_in = in.size();
+ out.resize(in.size());
+ zs.next_out = &out[0];
+ zs.avail_out = out.size();
+ for(;;)
+ {
+ error_code ec;
+ is.write(zs, Flush::sync, ec);
+ if(ec)
+ throw std::logic_error("inflate_stream failed");
+ if(zs.avail_out > 0)
+ break;
+ out.resize(2 * zs.total_out);
+ zs.next_out = &out[zs.total_out];
+ zs.avail_out = out.size() - zs.total_out;
+ }
+ out.resize(zs.total_out);
+ return out;
+ }
+
+ std::string
+ doInflateZLib(string_view const& in)
+ {
+ int result;
+ z_stream zs;
+ std::string out;
+ memset(&zs, 0, sizeof(zs));
+ result = inflateInit2(&zs, -15);
+ zs.next_in = (Bytef*)in.data();
+ zs.avail_in = static_cast<uInt>(in.size());
+ out.resize(in.size());
+ zs.next_out = (Bytef*)&out[0];
+ zs.avail_out = static_cast<uInt>(out.size());
+ for(;;)
+ {
+ result = inflate(&zs, Z_SYNC_FLUSH);
+ if( result == Z_NEED_DICT ||
+ result == Z_DATA_ERROR ||
+ result == Z_MEM_ERROR)
+ {
+ throw std::logic_error("inflate failed");
+ }
+ if(zs.avail_out > 0)
+ break;
+ if(result == Z_STREAM_END)
+ break;
+ out.resize(2 * zs.total_out);
+ zs.next_out = (Bytef*)&out[zs.total_out];
+ zs.avail_out = static_cast<uInt>(
+ out.size() - zs.total_out);
+ }
+ out.resize(zs.total_out);
+ inflateEnd(&zs);
+ return out;
+ }
+
+ void
+ doCorpus(
+ std::size_t size,
+ std::size_t repeat)
+ {
+ std::size_t constexpr trials = 3;
+ std::uint64_t constexpr scale = 16;
+ auto const c1 = corpus1(size);
+ auto const c2 = corpus2(size * scale);
+ auto const in1 = compress(c1);
+ auto const in2 = compress(c2);
+ log <<
+ std::left << std::setw(10) << (std::to_string(size) + "B") <<
+ std::right << std::setw(12) << "Beast" << " " <<
+ std::right << std::setw(12) << "ZLib" <<
+ std::endl;
+ for(std::size_t i = 0; i < trials; ++i)
+ {
+ test::timer t;
+ log << std::left << std::setw(10) << "corpus1";
+ std::string out;
+ for(std::size_t j = 0; j < repeat; ++j)
+ out = doInflateBeast(in1);
+ BEAST_EXPECT(out == c1);
+ auto const t1 =
+ test::throughput(t.elapsed(), size * repeat);
+ log << std::right << std::setw(12) << t1 << " B/s ";
+ for(std::size_t j = 0; j < repeat; ++j)
+ out = doInflateZLib(in1);
+ BEAST_EXPECT(out == c1);
+ auto const t2 =
+ test::throughput(t.elapsed(), size * repeat);
+ log << std::right << std::setw(12) << t2 << " B/s";
+ log << std::right << std::setw(12) <<
+ unsigned(double(t1)*100/t2-100) << "%";
+ log << std::endl;
+ }
+ for(std::size_t i = 0; i < trials; ++i)
+ {
+ test::timer t;
+ log << std::left << std::setw(10) << "corpus2";
+ std::string out;
+ for(std::size_t j = 0; j < repeat; ++j)
+ out = doInflateBeast(in2);
+ BEAST_EXPECT(out == c2);
+ auto const t1 =
+ test::throughput(t.elapsed(), size * scale * repeat);
+ log << std::right << std::setw(12) << t1 << " B/s ";
+ for(std::size_t j = 0; j < repeat; ++j)
+ out = doInflateZLib(in2);
+ BEAST_EXPECT(out == c2);
+ auto const t2 =
+ test::throughput(t.elapsed(), size * scale * repeat);
+ log << std::right << std::setw(12) << t2 << " B/s";
+ log << std::right << std::setw(12) <<
+ unsigned(double(t1)*100/t2-100) << "%";
+ log << std::endl;
+ }
+ log << std::endl;
+ }
+
+ void
+ doBench()
+ {
+ doCorpus( 1 * 1024 * 1024, 64);
+ doCorpus( 4 * 1024 * 1024, 16);
+ doCorpus( 16 * 1024 * 1024, 8);
+ }
+
+ void
+ run() override
+ {
+ doBench();
+ pass();
+ }
+};
+
+BEAST_DEFINE_TESTSUITE(beast,zlib,inflate_stream);
+
+} // zlib
+} // beast
+} // boost
diff --git a/src/boost/libs/beast/test/example/CMakeLists.txt b/src/boost/libs/beast/test/example/CMakeLists.txt
new file mode 100644
index 000000000..00d48e8ee
--- /dev/null
+++ b/src/boost/libs/beast/test/example/CMakeLists.txt
@@ -0,0 +1,10 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+add_subdirectory (common)
diff --git a/src/boost/libs/beast/test/example/Jamfile b/src/boost/libs/beast/test/example/Jamfile
new file mode 100644
index 000000000..b8a3d14a5
--- /dev/null
+++ b/src/boost/libs/beast/test/example/Jamfile
@@ -0,0 +1,20 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+alias run-tests :
+ common//run-tests
+ ;
+
+alias fat-tests ;
+
+explicit fat-tests ;
+
+alias run-fat-tests : common//run-tests ;
+
+explicit run-fat-tests ;
diff --git a/src/boost/libs/beast/test/example/common/CMakeLists.txt b/src/boost/libs/beast/test/example/common/CMakeLists.txt
new file mode 100644
index 000000000..a2c6dfe13
--- /dev/null
+++ b/src/boost/libs/beast/test/example/common/CMakeLists.txt
@@ -0,0 +1,31 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+GroupSources (include/boost/beast beast)
+GroupSources (example/common common)
+GroupSources (test/extras/include/boost/beast extras)
+GroupSources (test/example/common "/")
+
+add_executable (tests-example-common
+ ${BOOST_BEAST_FILES}
+ ${COMMON_FILES}
+ ${EXTRAS_FILES}
+ Jamfile
+ root_certificates.cpp
+ server_certificate.cpp
+)
+
+target_link_libraries(tests-example-common
+ lib-asio
+ lib-asio-ssl
+ lib-beast
+ lib-test
+ )
+
+set_property(TARGET tests-example-common PROPERTY FOLDER "tests") \ No newline at end of file
diff --git a/src/boost/libs/beast/test/example/common/Jamfile b/src/boost/libs/beast/test/example/common/Jamfile
new file mode 100644
index 000000000..6ae40e513
--- /dev/null
+++ b/src/boost/libs/beast/test/example/common/Jamfile
@@ -0,0 +1,27 @@
+#
+# Copyright (c) 2016-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)
+#
+# Official repository: https://github.com/boostorg/beast
+#
+
+local SOURCES =
+ root_certificates.cpp
+ server_certificate.cpp
+ ;
+
+local RUN_TESTS ;
+
+local libs =
+ /boost/beast//lib-asio-ssl
+ /boost/beast/test//lib-test
+ ;
+
+for local f in $(SOURCES)
+{
+ RUN_TESTS += [ run $(f) $(libs) ] ;
+}
+
+alias run-tests : $(RUN_TESTS) ;
diff --git a/src/boost/libs/beast/test/example/common/root_certificates.cpp b/src/boost/libs/beast/test/example/common/root_certificates.cpp
new file mode 100644
index 000000000..780d5ed66
--- /dev/null
+++ b/src/boost/libs/beast/test/example/common/root_certificates.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include "example/common/root_certificates.hpp"
diff --git a/src/boost/libs/beast/test/example/common/server_certificate.cpp b/src/boost/libs/beast/test/example/common/server_certificate.cpp
new file mode 100644
index 000000000..ffb349337
--- /dev/null
+++ b/src/boost/libs/beast/test/example/common/server_certificate.cpp
@@ -0,0 +1,11 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// Test that header file is self-contained.
+#include "example/common/server_certificate.hpp"
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/CMakeLists.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/CMakeLists.txt
new file mode 100644
index 000000000..0fe939df6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/CMakeLists.txt
@@ -0,0 +1,249 @@
+cmake_minimum_required(VERSION 2.4.4)
+set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)
+
+project(zlib C)
+
+set(VERSION "1.2.11")
+
+option(ASM686 "Enable building i686 assembly implementation")
+option(AMD64 "Enable building amd64 assembly implementation")
+
+set(INSTALL_BIN_DIR "${CMAKE_INSTALL_PREFIX}/bin" CACHE PATH "Installation directory for executables")
+set(INSTALL_LIB_DIR "${CMAKE_INSTALL_PREFIX}/lib" CACHE PATH "Installation directory for libraries")
+set(INSTALL_INC_DIR "${CMAKE_INSTALL_PREFIX}/include" CACHE PATH "Installation directory for headers")
+set(INSTALL_MAN_DIR "${CMAKE_INSTALL_PREFIX}/share/man" CACHE PATH "Installation directory for manual pages")
+set(INSTALL_PKGCONFIG_DIR "${CMAKE_INSTALL_PREFIX}/share/pkgconfig" CACHE PATH "Installation directory for pkgconfig (.pc) files")
+
+include(CheckTypeSize)
+include(CheckFunctionExists)
+include(CheckIncludeFile)
+include(CheckCSourceCompiles)
+enable_testing()
+
+check_include_file(sys/types.h HAVE_SYS_TYPES_H)
+check_include_file(stdint.h HAVE_STDINT_H)
+check_include_file(stddef.h HAVE_STDDEF_H)
+
+#
+# Check to see if we have large file support
+#
+set(CMAKE_REQUIRED_DEFINITIONS -D_LARGEFILE64_SOURCE=1)
+# We add these other definitions here because CheckTypeSize.cmake
+# in CMake 2.4.x does not automatically do so and we want
+# compatibility with CMake 2.4.x.
+if(HAVE_SYS_TYPES_H)
+ list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_SYS_TYPES_H)
+endif()
+if(HAVE_STDINT_H)
+ list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDINT_H)
+endif()
+if(HAVE_STDDEF_H)
+ list(APPEND CMAKE_REQUIRED_DEFINITIONS -DHAVE_STDDEF_H)
+endif()
+check_type_size(off64_t OFF64_T)
+if(HAVE_OFF64_T)
+ add_definitions(-D_LARGEFILE64_SOURCE=1)
+endif()
+set(CMAKE_REQUIRED_DEFINITIONS) # clear variable
+
+#
+# Check for fseeko
+#
+check_function_exists(fseeko HAVE_FSEEKO)
+if(NOT HAVE_FSEEKO)
+ add_definitions(-DNO_FSEEKO)
+endif()
+
+#
+# Check for unistd.h
+#
+check_include_file(unistd.h Z_HAVE_UNISTD_H)
+
+if(MSVC)
+ set(CMAKE_DEBUG_POSTFIX "d")
+ add_definitions(-D_CRT_SECURE_NO_DEPRECATE)
+ add_definitions(-D_CRT_NONSTDC_NO_DEPRECATE)
+ include_directories(${CMAKE_CURRENT_SOURCE_DIR})
+endif()
+
+if(NOT CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
+ # If we're doing an out of source build and the user has a zconf.h
+ # in their source tree...
+ if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h)
+ message(STATUS "Renaming")
+ message(STATUS " ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h")
+ message(STATUS "to 'zconf.h.included' because this file is included with zlib")
+ message(STATUS "but CMake generates it automatically in the build directory.")
+ file(RENAME ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.included)
+ endif()
+endif()
+
+set(ZLIB_PC ${CMAKE_CURRENT_BINARY_DIR}/zlib.pc)
+configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zlib.pc.cmakein
+ ${ZLIB_PC} @ONLY)
+configure_file( ${CMAKE_CURRENT_SOURCE_DIR}/zconf.h.cmakein
+ ${CMAKE_CURRENT_BINARY_DIR}/zconf.h @ONLY)
+include_directories(${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_SOURCE_DIR})
+
+
+#============================================================================
+# zlib
+#============================================================================
+
+set(ZLIB_PUBLIC_HDRS
+ ${CMAKE_CURRENT_BINARY_DIR}/zconf.h
+ zlib.h
+)
+set(ZLIB_PRIVATE_HDRS
+ crc32.h
+ deflate.h
+ gzguts.h
+ inffast.h
+ inffixed.h
+ inflate.h
+ inftrees.h
+ trees.h
+ zutil.h
+)
+set(ZLIB_SRCS
+ adler32.c
+ compress.c
+ crc32.c
+ deflate.c
+ gzclose.c
+ gzlib.c
+ gzread.c
+ gzwrite.c
+ inflate.c
+ infback.c
+ inftrees.c
+ inffast.c
+ trees.c
+ uncompr.c
+ zutil.c
+)
+
+if(NOT MINGW)
+ set(ZLIB_DLL_SRCS
+ win32/zlib1.rc # If present will override custom build rule below.
+ )
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCC)
+ if(ASM686)
+ set(ZLIB_ASMS contrib/asm686/match.S)
+ elseif (AMD64)
+ set(ZLIB_ASMS contrib/amd64/amd64-match.S)
+ endif ()
+
+ if(ZLIB_ASMS)
+ add_definitions(-DASMV)
+ set_source_files_properties(${ZLIB_ASMS} PROPERTIES LANGUAGE C COMPILE_FLAGS -DNO_UNDERLINE)
+ endif()
+endif()
+
+if(MSVC)
+ if(ASM686)
+ ENABLE_LANGUAGE(ASM_MASM)
+ set(ZLIB_ASMS
+ contrib/masmx86/inffas32.asm
+ contrib/masmx86/match686.asm
+ )
+ elseif (AMD64)
+ ENABLE_LANGUAGE(ASM_MASM)
+ set(ZLIB_ASMS
+ contrib/masmx64/gvmat64.asm
+ contrib/masmx64/inffasx64.asm
+ )
+ endif()
+
+ if(ZLIB_ASMS)
+ add_definitions(-DASMV -DASMINF)
+ endif()
+endif()
+
+# parse the full version number from zlib.h and include in ZLIB_FULL_VERSION
+file(READ ${CMAKE_CURRENT_SOURCE_DIR}/zlib.h _zlib_h_contents)
+string(REGEX REPLACE ".*#define[ \t]+ZLIB_VERSION[ \t]+\"([-0-9A-Za-z.]+)\".*"
+ "\\1" ZLIB_FULL_VERSION ${_zlib_h_contents})
+
+if(MINGW)
+ # This gets us DLL resource information when compiling on MinGW.
+ if(NOT CMAKE_RC_COMPILER)
+ set(CMAKE_RC_COMPILER windres.exe)
+ endif()
+
+ add_custom_command(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
+ COMMAND ${CMAKE_RC_COMPILER}
+ -D GCC_WINDRES
+ -I ${CMAKE_CURRENT_SOURCE_DIR}
+ -I ${CMAKE_CURRENT_BINARY_DIR}
+ -o ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj
+ -i ${CMAKE_CURRENT_SOURCE_DIR}/win32/zlib1.rc)
+ set(ZLIB_DLL_SRCS ${CMAKE_CURRENT_BINARY_DIR}/zlib1rc.obj)
+endif(MINGW)
+
+add_library(zlib SHARED ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_DLL_SRCS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+add_library(zlibstatic STATIC ${ZLIB_SRCS} ${ZLIB_ASMS} ${ZLIB_PUBLIC_HDRS} ${ZLIB_PRIVATE_HDRS})
+set_target_properties(zlib PROPERTIES DEFINE_SYMBOL ZLIB_DLL)
+set_target_properties(zlib PROPERTIES SOVERSION 1)
+
+if(NOT CYGWIN)
+ # This property causes shared libraries on Linux to have the full version
+ # encoded into their final filename. We disable this on Cygwin because
+ # it causes cygz-${ZLIB_FULL_VERSION}.dll to be created when cygz.dll
+ # seems to be the default.
+ #
+ # This has no effect with MSVC, on that platform the version info for
+ # the DLL comes from the resource file win32/zlib1.rc
+ set_target_properties(zlib PROPERTIES VERSION ${ZLIB_FULL_VERSION})
+endif()
+
+if(UNIX)
+ # On unix-like platforms the library is almost always called libz
+ set_target_properties(zlib zlibstatic PROPERTIES OUTPUT_NAME z)
+ if(NOT APPLE)
+ set_target_properties(zlib PROPERTIES LINK_FLAGS "-Wl,--version-script,\"${CMAKE_CURRENT_SOURCE_DIR}/zlib.map\"")
+ endif()
+elseif(BUILD_SHARED_LIBS AND WIN32)
+ # Creates zlib1.dll when building shared library version
+ set_target_properties(zlib PROPERTIES SUFFIX "1.dll")
+endif()
+
+if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL )
+ install(TARGETS zlib zlibstatic
+ RUNTIME DESTINATION "${INSTALL_BIN_DIR}"
+ ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"
+ LIBRARY DESTINATION "${INSTALL_LIB_DIR}" )
+endif()
+if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL )
+ install(FILES ${ZLIB_PUBLIC_HDRS} DESTINATION "${INSTALL_INC_DIR}")
+endif()
+if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
+ install(FILES zlib.3 DESTINATION "${INSTALL_MAN_DIR}/man3")
+endif()
+if(NOT SKIP_INSTALL_FILES AND NOT SKIP_INSTALL_ALL )
+ install(FILES ${ZLIB_PC} DESTINATION "${INSTALL_PKGCONFIG_DIR}")
+endif()
+
+#============================================================================
+# Example binaries
+#============================================================================
+
+add_executable(example test/example.c)
+target_link_libraries(example zlib)
+add_test(example example)
+
+add_executable(minigzip test/minigzip.c)
+target_link_libraries(minigzip zlib)
+
+if(HAVE_OFF64_T)
+ add_executable(example64 test/example.c)
+ target_link_libraries(example64 zlib)
+ set_target_properties(example64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+ add_test(example64 example64)
+
+ add_executable(minigzip64 test/minigzip.c)
+ target_link_libraries(minigzip64 zlib)
+ set_target_properties(minigzip64 PROPERTIES COMPILE_FLAGS "-D_FILE_OFFSET_BITS=64")
+endif()
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/ChangeLog b/src/boost/libs/beast/test/extern/zlib-1.2.11/ChangeLog
new file mode 100644
index 000000000..30199a65a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/ChangeLog
@@ -0,0 +1,1515 @@
+
+ ChangeLog file for zlib
+
+Changes in 1.2.11 (15 Jan 2017)
+- Fix deflate stored bug when pulling last block from window
+- Permit immediate deflateParams changes before any deflate input
+
+Changes in 1.2.10 (2 Jan 2017)
+- Avoid warnings on snprintf() return value
+- Fix bug in deflate_stored() for zero-length input
+- Fix bug in gzwrite.c that produced corrupt gzip files
+- Remove files to be installed before copying them in Makefile.in
+- Add warnings when compiling with assembler code
+
+Changes in 1.2.9 (31 Dec 2016)
+- Fix contrib/minizip to permit unzipping with desktop API [Zouzou]
+- Improve contrib/blast to return unused bytes
+- Assure that gzoffset() is correct when appending
+- Improve compress() and uncompress() to support large lengths
+- Fix bug in test/example.c where error code not saved
+- Remedy Coverity warning [Randers-Pehrson]
+- Improve speed of gzprintf() in transparent mode
+- Fix inflateInit2() bug when windowBits is 16 or 32
+- Change DEBUG macro to ZLIB_DEBUG
+- Avoid uninitialized access by gzclose_w()
+- Allow building zlib outside of the source directory
+- Fix bug that accepted invalid zlib header when windowBits is zero
+- Fix gzseek() problem on MinGW due to buggy _lseeki64 there
+- Loop on write() calls in gzwrite.c in case of non-blocking I/O
+- Add --warn (-w) option to ./configure for more compiler warnings
+- Reject a window size of 256 bytes if not using the zlib wrapper
+- Fix bug when level 0 used with Z_HUFFMAN or Z_RLE
+- Add --debug (-d) option to ./configure to define ZLIB_DEBUG
+- Fix bugs in creating a very large gzip header
+- Add uncompress2() function, which returns the input size used
+- Assure that deflateParams() will not switch functions mid-block
+- Dramatically speed up deflation for level 0 (storing)
+- Add gzfread(), duplicating the interface of fread()
+- Add gzfwrite(), duplicating the interface of fwrite()
+- Add deflateGetDictionary() function
+- Use snprintf() for later versions of Microsoft C
+- Fix *Init macros to use z_ prefix when requested
+- Replace as400 with os400 for OS/400 support [Monnerat]
+- Add crc32_z() and adler32_z() functions with size_t lengths
+- Update Visual Studio project files [AraHaan]
+
+Changes in 1.2.8 (28 Apr 2013)
+- Update contrib/minizip/iowin32.c for Windows RT [Vollant]
+- Do not force Z_CONST for C++
+- Clean up contrib/vstudio [Roß]
+- Correct spelling error in zlib.h
+- Fix mixed line endings in contrib/vstudio
+
+Changes in 1.2.7.3 (13 Apr 2013)
+- Fix version numbers and DLL names in contrib/vstudio/*/zlib.rc
+
+Changes in 1.2.7.2 (13 Apr 2013)
+- Change check for a four-byte type back to hexadecimal
+- Fix typo in win32/Makefile.msc
+- Add casts in gzwrite.c for pointer differences
+
+Changes in 1.2.7.1 (24 Mar 2013)
+- Replace use of unsafe string functions with snprintf if available
+- Avoid including stddef.h on Windows for Z_SOLO compile [Niessink]
+- Fix gzgetc undefine when Z_PREFIX set [Turk]
+- Eliminate use of mktemp in Makefile (not always available)
+- Fix bug in 'F' mode for gzopen()
+- Add inflateGetDictionary() function
+- Correct comment in deflate.h
+- Use _snprintf for snprintf in Microsoft C
+- On Darwin, only use /usr/bin/libtool if libtool is not Apple
+- Delete "--version" file if created by "ar --version" [Richard G.]
+- Fix configure check for veracity of compiler error return codes
+- Fix CMake compilation of static lib for MSVC2010 x64
+- Remove unused variable in infback9.c
+- Fix argument checks in gzlog_compress() and gzlog_write()
+- Clean up the usage of z_const and respect const usage within zlib
+- Clean up examples/gzlog.[ch] comparisons of different types
+- Avoid shift equal to bits in type (caused endless loop)
+- Fix uninitialized value bug in gzputc() introduced by const patches
+- Fix memory allocation error in examples/zran.c [Nor]
+- Fix bug where gzopen(), gzclose() would write an empty file
+- Fix bug in gzclose() when gzwrite() runs out of memory
+- Check for input buffer malloc failure in examples/gzappend.c
+- Add note to contrib/blast to use binary mode in stdio
+- Fix comparisons of differently signed integers in contrib/blast
+- Check for invalid code length codes in contrib/puff
+- Fix serious but very rare decompression bug in inftrees.c
+- Update inflateBack() comments, since inflate() can be faster
+- Use underscored I/O function names for WINAPI_FAMILY
+- Add _tr_flush_bits to the external symbols prefixed by --zprefix
+- Add contrib/vstudio/vc10 pre-build step for static only
+- Quote --version-script argument in CMakeLists.txt
+- Don't specify --version-script on Apple platforms in CMakeLists.txt
+- Fix casting error in contrib/testzlib/testzlib.c
+- Fix types in contrib/minizip to match result of get_crc_table()
+- Simplify contrib/vstudio/vc10 with 'd' suffix
+- Add TOP support to win32/Makefile.msc
+- Suport i686 and amd64 assembler builds in CMakeLists.txt
+- Fix typos in the use of _LARGEFILE64_SOURCE in zconf.h
+- Add vc11 and vc12 build files to contrib/vstudio
+- Add gzvprintf() as an undocumented function in zlib
+- Fix configure for Sun shell
+- Remove runtime check in configure for four-byte integer type
+- Add casts and consts to ease user conversion to C++
+- Add man pages for minizip and miniunzip
+- In Makefile uninstall, don't rm if preceding cd fails
+- Do not return Z_BUF_ERROR if deflateParam() has nothing to write
+
+Changes in 1.2.7 (2 May 2012)
+- Replace use of memmove() with a simple copy for portability
+- Test for existence of strerror
+- Restore gzgetc_ for backward compatibility with 1.2.6
+- Fix build with non-GNU make on Solaris
+- Require gcc 4.0 or later on Mac OS X to use the hidden attribute
+- Include unistd.h for Watcom C
+- Use __WATCOMC__ instead of __WATCOM__
+- Do not use the visibility attribute if NO_VIZ defined
+- Improve the detection of no hidden visibility attribute
+- Avoid using __int64 for gcc or solo compilation
+- Cast to char * in gzprintf to avoid warnings [Zinser]
+- Fix make_vms.com for VAX [Zinser]
+- Don't use library or built-in byte swaps
+- Simplify test and use of gcc hidden attribute
+- Fix bug in gzclose_w() when gzwrite() fails to allocate memory
+- Add "x" (O_EXCL) and "e" (O_CLOEXEC) modes support to gzopen()
+- Fix bug in test/minigzip.c for configure --solo
+- Fix contrib/vstudio project link errors [Mohanathas]
+- Add ability to choose the builder in make_vms.com [Schweda]
+- Add DESTDIR support to mingw32 win32/Makefile.gcc
+- Fix comments in win32/Makefile.gcc for proper usage
+- Allow overriding the default install locations for cmake
+- Generate and install the pkg-config file with cmake
+- Build both a static and a shared version of zlib with cmake
+- Include version symbols for cmake builds
+- If using cmake with MSVC, add the source directory to the includes
+- Remove unneeded EXTRA_CFLAGS from win32/Makefile.gcc [Truta]
+- Move obsolete emx makefile to old [Truta]
+- Allow the use of -Wundef when compiling or using zlib
+- Avoid the use of the -u option with mktemp
+- Improve inflate() documentation on the use of Z_FINISH
+- Recognize clang as gcc
+- Add gzopen_w() in Windows for wide character path names
+- Rename zconf.h in CMakeLists.txt to move it out of the way
+- Add source directory in CMakeLists.txt for building examples
+- Look in build directory for zlib.pc in CMakeLists.txt
+- Remove gzflags from zlibvc.def in vc9 and vc10
+- Fix contrib/minizip compilation in the MinGW environment
+- Update ./configure for Solaris, support --64 [Mooney]
+- Remove -R. from Solaris shared build (possible security issue)
+- Avoid race condition for parallel make (-j) running example
+- Fix type mismatch between get_crc_table() and crc_table
+- Fix parsing of version with "-" in CMakeLists.txt [Snider, Ziegler]
+- Fix the path to zlib.map in CMakeLists.txt
+- Force the native libtool in Mac OS X to avoid GNU libtool [Beebe]
+- Add instructions to win32/Makefile.gcc for shared install [Torri]
+
+Changes in 1.2.6.1 (12 Feb 2012)
+- Avoid the use of the Objective-C reserved name "id"
+- Include io.h in gzguts.h for Microsoft compilers
+- Fix problem with ./configure --prefix and gzgetc macro
+- Include gz_header definition when compiling zlib solo
+- Put gzflags() functionality back in zutil.c
+- Avoid library header include in crc32.c for Z_SOLO
+- Use name in GCC_CLASSIC as C compiler for coverage testing, if set
+- Minor cleanup in contrib/minizip/zip.c [Vollant]
+- Update make_vms.com [Zinser]
+- Remove unnecessary gzgetc_ function
+- Use optimized byte swap operations for Microsoft and GNU [Snyder]
+- Fix minor typo in zlib.h comments [Rzesniowiecki]
+
+Changes in 1.2.6 (29 Jan 2012)
+- Update the Pascal interface in contrib/pascal
+- Fix function numbers for gzgetc_ in zlibvc.def files
+- Fix configure.ac for contrib/minizip [Schiffer]
+- Fix large-entry detection in minizip on 64-bit systems [Schiffer]
+- Have ./configure use the compiler return code for error indication
+- Fix CMakeLists.txt for cross compilation [McClure]
+- Fix contrib/minizip/zip.c for 64-bit architectures [Dalsnes]
+- Fix compilation of contrib/minizip on FreeBSD [Marquez]
+- Correct suggested usages in win32/Makefile.msc [Shachar, Horvath]
+- Include io.h for Turbo C / Borland C on all platforms [Truta]
+- Make version explicit in contrib/minizip/configure.ac [Bosmans]
+- Avoid warning for no encryption in contrib/minizip/zip.c [Vollant]
+- Minor cleanup up contrib/minizip/unzip.c [Vollant]
+- Fix bug when compiling minizip with C++ [Vollant]
+- Protect for long name and extra fields in contrib/minizip [Vollant]
+- Avoid some warnings in contrib/minizip [Vollant]
+- Add -I../.. -L../.. to CFLAGS for minizip and miniunzip
+- Add missing libs to minizip linker command
+- Add support for VPATH builds in contrib/minizip
+- Add an --enable-demos option to contrib/minizip/configure
+- Add the generation of configure.log by ./configure
+- Exit when required parameters not provided to win32/Makefile.gcc
+- Have gzputc return the character written instead of the argument
+- Use the -m option on ldconfig for BSD systems [Tobias]
+- Correct in zlib.map when deflateResetKeep was added
+
+Changes in 1.2.5.3 (15 Jan 2012)
+- Restore gzgetc function for binary compatibility
+- Do not use _lseeki64 under Borland C++ [Truta]
+- Update win32/Makefile.msc to build test/*.c [Truta]
+- Remove old/visualc6 given CMakefile and other alternatives
+- Update AS400 build files and documentation [Monnerat]
+- Update win32/Makefile.gcc to build test/*.c [Truta]
+- Permit stronger flushes after Z_BLOCK flushes
+- Avoid extraneous empty blocks when doing empty flushes
+- Permit Z_NULL arguments to deflatePending
+- Allow deflatePrime() to insert bits in the middle of a stream
+- Remove second empty static block for Z_PARTIAL_FLUSH
+- Write out all of the available bits when using Z_BLOCK
+- Insert the first two strings in the hash table after a flush
+
+Changes in 1.2.5.2 (17 Dec 2011)
+- fix ld error: unable to find version dependency 'ZLIB_1.2.5'
+- use relative symlinks for shared libs
+- Avoid searching past window for Z_RLE strategy
+- Assure that high-water mark initialization is always applied in deflate
+- Add assertions to fill_window() in deflate.c to match comments
+- Update python link in README
+- Correct spelling error in gzread.c
+- Fix bug in gzgets() for a concatenated empty gzip stream
+- Correct error in comment for gz_make()
+- Change gzread() and related to ignore junk after gzip streams
+- Allow gzread() and related to continue after gzclearerr()
+- Allow gzrewind() and gzseek() after a premature end-of-file
+- Simplify gzseek() now that raw after gzip is ignored
+- Change gzgetc() to a macro for speed (~40% speedup in testing)
+- Fix gzclose() to return the actual error last encountered
+- Always add large file support for windows
+- Include zconf.h for windows large file support
+- Include zconf.h.cmakein for windows large file support
+- Update zconf.h.cmakein on make distclean
+- Merge vestigial vsnprintf determination from zutil.h to gzguts.h
+- Clarify how gzopen() appends in zlib.h comments
+- Correct documentation of gzdirect() since junk at end now ignored
+- Add a transparent write mode to gzopen() when 'T' is in the mode
+- Update python link in zlib man page
+- Get inffixed.h and MAKEFIXED result to match
+- Add a ./config --solo option to make zlib subset with no library use
+- Add undocumented inflateResetKeep() function for CAB file decoding
+- Add --cover option to ./configure for gcc coverage testing
+- Add #define ZLIB_CONST option to use const in the z_stream interface
+- Add comment to gzdopen() in zlib.h to use dup() when using fileno()
+- Note behavior of uncompress() to provide as much data as it can
+- Add files in contrib/minizip to aid in building libminizip
+- Split off AR options in Makefile.in and configure
+- Change ON macro to Z_ARG to avoid application conflicts
+- Facilitate compilation with Borland C++ for pragmas and vsnprintf
+- Include io.h for Turbo C / Borland C++
+- Move example.c and minigzip.c to test/
+- Simplify incomplete code table filling in inflate_table()
+- Remove code from inflate.c and infback.c that is impossible to execute
+- Test the inflate code with full coverage
+- Allow deflateSetDictionary, inflateSetDictionary at any time (in raw)
+- Add deflateResetKeep and fix inflateResetKeep to retain dictionary
+- Fix gzwrite.c to accommodate reduced memory zlib compilation
+- Have inflate() with Z_FINISH avoid the allocation of a window
+- Do not set strm->adler when doing raw inflate
+- Fix gzeof() to behave just like feof() when read is not past end of file
+- Fix bug in gzread.c when end-of-file is reached
+- Avoid use of Z_BUF_ERROR in gz* functions except for premature EOF
+- Document gzread() capability to read concurrently written files
+- Remove hard-coding of resource compiler in CMakeLists.txt [Blammo]
+
+Changes in 1.2.5.1 (10 Sep 2011)
+- Update FAQ entry on shared builds (#13)
+- Avoid symbolic argument to chmod in Makefile.in
+- Fix bug and add consts in contrib/puff [Oberhumer]
+- Update contrib/puff/zeros.raw test file to have all block types
+- Add full coverage test for puff in contrib/puff/Makefile
+- Fix static-only-build install in Makefile.in
+- Fix bug in unzGetCurrentFileInfo() in contrib/minizip [Kuno]
+- Add libz.a dependency to shared in Makefile.in for parallel builds
+- Spell out "number" (instead of "nb") in zlib.h for total_in, total_out
+- Replace $(...) with `...` in configure for non-bash sh [Bowler]
+- Add darwin* to Darwin* and solaris* to SunOS\ 5* in configure [Groffen]
+- Add solaris* to Linux* in configure to allow gcc use [Groffen]
+- Add *bsd* to Linux* case in configure [Bar-Lev]
+- Add inffast.obj to dependencies in win32/Makefile.msc
+- Correct spelling error in deflate.h [Kohler]
+- Change libzdll.a again to libz.dll.a (!) in win32/Makefile.gcc
+- Add test to configure for GNU C looking for gcc in output of $cc -v
+- Add zlib.pc generation to win32/Makefile.gcc [Weigelt]
+- Fix bug in zlib.h for _FILE_OFFSET_BITS set and _LARGEFILE64_SOURCE not
+- Add comment in zlib.h that adler32_combine with len2 < 0 makes no sense
+- Make NO_DIVIDE option in adler32.c much faster (thanks to John Reiser)
+- Make stronger test in zconf.h to include unistd.h for LFS
+- Apply Darwin patches for 64-bit file offsets to contrib/minizip [Slack]
+- Fix zlib.h LFS support when Z_PREFIX used
+- Add updated as400 support (removed from old) [Monnerat]
+- Avoid deflate sensitivity to volatile input data
+- Avoid division in adler32_combine for NO_DIVIDE
+- Clarify the use of Z_FINISH with deflateBound() amount of space
+- Set binary for output file in puff.c
+- Use u4 type for crc_table to avoid conversion warnings
+- Apply casts in zlib.h to avoid conversion warnings
+- Add OF to prototypes for adler32_combine_ and crc32_combine_ [Miller]
+- Improve inflateSync() documentation to note indeterminancy
+- Add deflatePending() function to return the amount of pending output
+- Correct the spelling of "specification" in FAQ [Randers-Pehrson]
+- Add a check in configure for stdarg.h, use for gzprintf()
+- Check that pointers fit in ints when gzprint() compiled old style
+- Add dummy name before $(SHAREDLIBV) in Makefile [Bar-Lev, Bowler]
+- Delete line in configure that adds -L. libz.a to LDFLAGS [Weigelt]
+- Add debug records in assmebler code [Londer]
+- Update RFC references to use http://tools.ietf.org/html/... [Li]
+- Add --archs option, use of libtool to configure for Mac OS X [Borstel]
+
+Changes in 1.2.5 (19 Apr 2010)
+- Disable visibility attribute in win32/Makefile.gcc [Bar-Lev]
+- Default to libdir as sharedlibdir in configure [Nieder]
+- Update copyright dates on modified source files
+- Update trees.c to be able to generate modified trees.h
+- Exit configure for MinGW, suggesting win32/Makefile.gcc
+- Check for NULL path in gz_open [Homurlu]
+
+Changes in 1.2.4.5 (18 Apr 2010)
+- Set sharedlibdir in configure [Torok]
+- Set LDFLAGS in Makefile.in [Bar-Lev]
+- Avoid mkdir objs race condition in Makefile.in [Bowler]
+- Add ZLIB_INTERNAL in front of internal inter-module functions and arrays
+- Define ZLIB_INTERNAL to hide internal functions and arrays for GNU C
+- Don't use hidden attribute when it is a warning generator (e.g. Solaris)
+
+Changes in 1.2.4.4 (18 Apr 2010)
+- Fix CROSS_PREFIX executable testing, CHOST extract, mingw* [Torok]
+- Undefine _LARGEFILE64_SOURCE in zconf.h if it is zero, but not if empty
+- Try to use bash or ksh regardless of functionality of /bin/sh
+- Fix configure incompatibility with NetBSD sh
+- Remove attempt to run under bash or ksh since have better NetBSD fix
+- Fix win32/Makefile.gcc for MinGW [Bar-Lev]
+- Add diagnostic messages when using CROSS_PREFIX in configure
+- Added --sharedlibdir option to configure [Weigelt]
+- Use hidden visibility attribute when available [Frysinger]
+
+Changes in 1.2.4.3 (10 Apr 2010)
+- Only use CROSS_PREFIX in configure for ar and ranlib if they exist
+- Use CROSS_PREFIX for nm [Bar-Lev]
+- Assume _LARGEFILE64_SOURCE defined is equivalent to true
+- Avoid use of undefined symbols in #if with && and ||
+- Make *64 prototypes in gzguts.h consistent with functions
+- Add -shared load option for MinGW in configure [Bowler]
+- Move z_off64_t to public interface, use instead of off64_t
+- Remove ! from shell test in configure (not portable to Solaris)
+- Change +0 macro tests to -0 for possibly increased portability
+
+Changes in 1.2.4.2 (9 Apr 2010)
+- Add consistent carriage returns to readme.txt's in masmx86 and masmx64
+- Really provide prototypes for *64 functions when building without LFS
+- Only define unlink() in minigzip.c if unistd.h not included
+- Update README to point to contrib/vstudio project files
+- Move projects/vc6 to old/ and remove projects/
+- Include stdlib.h in minigzip.c for setmode() definition under WinCE
+- Clean up assembler builds in win32/Makefile.msc [Rowe]
+- Include sys/types.h for Microsoft for off_t definition
+- Fix memory leak on error in gz_open()
+- Symbolize nm as $NM in configure [Weigelt]
+- Use TEST_LDSHARED instead of LDSHARED to link test programs [Weigelt]
+- Add +0 to _FILE_OFFSET_BITS and _LFS64_LARGEFILE in case not defined
+- Fix bug in gzeof() to take into account unused input data
+- Avoid initialization of structures with variables in puff.c
+- Updated win32/README-WIN32.txt [Rowe]
+
+Changes in 1.2.4.1 (28 Mar 2010)
+- Remove the use of [a-z] constructs for sed in configure [gentoo 310225]
+- Remove $(SHAREDLIB) from LIBS in Makefile.in [Creech]
+- Restore "for debugging" comment on sprintf() in gzlib.c
+- Remove fdopen for MVS from gzguts.h
+- Put new README-WIN32.txt in win32 [Rowe]
+- Add check for shell to configure and invoke another shell if needed
+- Fix big fat stinking bug in gzseek() on uncompressed files
+- Remove vestigial F_OPEN64 define in zutil.h
+- Set and check the value of _LARGEFILE_SOURCE and _LARGEFILE64_SOURCE
+- Avoid errors on non-LFS systems when applications define LFS macros
+- Set EXE to ".exe" in configure for MINGW [Kahle]
+- Match crc32() in crc32.c exactly to the prototype in zlib.h [Sherrill]
+- Add prefix for cross-compilation in win32/makefile.gcc [Bar-Lev]
+- Add DLL install in win32/makefile.gcc [Bar-Lev]
+- Allow Linux* or linux* from uname in configure [Bar-Lev]
+- Allow ldconfig to be redefined in configure and Makefile.in [Bar-Lev]
+- Add cross-compilation prefixes to configure [Bar-Lev]
+- Match type exactly in gz_load() invocation in gzread.c
+- Match type exactly of zcalloc() in zutil.c to zlib.h alloc_func
+- Provide prototypes for *64 functions when building zlib without LFS
+- Don't use -lc when linking shared library on MinGW
+- Remove errno.h check in configure and vestigial errno code in zutil.h
+
+Changes in 1.2.4 (14 Mar 2010)
+- Fix VER3 extraction in configure for no fourth subversion
+- Update zlib.3, add docs to Makefile.in to make .pdf out of it
+- Add zlib.3.pdf to distribution
+- Don't set error code in gzerror() if passed pointer is NULL
+- Apply destination directory fixes to CMakeLists.txt [Lowman]
+- Move #cmakedefine's to a new zconf.in.cmakein
+- Restore zconf.h for builds that don't use configure or cmake
+- Add distclean to dummy Makefile for convenience
+- Update and improve INDEX, README, and FAQ
+- Update CMakeLists.txt for the return of zconf.h [Lowman]
+- Update contrib/vstudio/vc9 and vc10 [Vollant]
+- Change libz.dll.a back to libzdll.a in win32/Makefile.gcc
+- Apply license and readme changes to contrib/asm686 [Raiter]
+- Check file name lengths and add -c option in minigzip.c [Li]
+- Update contrib/amd64 and contrib/masmx86/ [Vollant]
+- Avoid use of "eof" parameter in trees.c to not shadow library variable
+- Update make_vms.com for removal of zlibdefs.h [Zinser]
+- Update assembler code and vstudio projects in contrib [Vollant]
+- Remove outdated assembler code contrib/masm686 and contrib/asm586
+- Remove old vc7 and vc8 from contrib/vstudio
+- Update win32/Makefile.msc, add ZLIB_VER_SUBREVISION [Rowe]
+- Fix memory leaks in gzclose_r() and gzclose_w(), file leak in gz_open()
+- Add contrib/gcc_gvmat64 for longest_match and inflate_fast [Vollant]
+- Remove *64 functions from win32/zlib.def (they're not 64-bit yet)
+- Fix bug in void-returning vsprintf() case in gzwrite.c
+- Fix name change from inflate.h in contrib/inflate86/inffas86.c
+- Check if temporary file exists before removing in make_vms.com [Zinser]
+- Fix make install and uninstall for --static option
+- Fix usage of _MSC_VER in gzguts.h and zutil.h [Truta]
+- Update readme.txt in contrib/masmx64 and masmx86 to assemble
+
+Changes in 1.2.3.9 (21 Feb 2010)
+- Expunge gzio.c
+- Move as400 build information to old
+- Fix updates in contrib/minizip and contrib/vstudio
+- Add const to vsnprintf test in configure to avoid warnings [Weigelt]
+- Delete zconf.h (made by configure) [Weigelt]
+- Change zconf.in.h to zconf.h.in per convention [Weigelt]
+- Check for NULL buf in gzgets()
+- Return empty string for gzgets() with len == 1 (like fgets())
+- Fix description of gzgets() in zlib.h for end-of-file, NULL return
+- Update minizip to 1.1 [Vollant]
+- Avoid MSVC loss of data warnings in gzread.c, gzwrite.c
+- Note in zlib.h that gzerror() should be used to distinguish from EOF
+- Remove use of snprintf() from gzlib.c
+- Fix bug in gzseek()
+- Update contrib/vstudio, adding vc9 and vc10 [Kuno, Vollant]
+- Fix zconf.h generation in CMakeLists.txt [Lowman]
+- Improve comments in zconf.h where modified by configure
+
+Changes in 1.2.3.8 (13 Feb 2010)
+- Clean up text files (tabs, trailing whitespace, etc.) [Oberhumer]
+- Use z_off64_t in gz_zero() and gz_skip() to match state->skip
+- Avoid comparison problem when sizeof(int) == sizeof(z_off64_t)
+- Revert to Makefile.in from 1.2.3.6 (live with the clutter)
+- Fix missing error return in gzflush(), add zlib.h note
+- Add *64 functions to zlib.map [Levin]
+- Fix signed/unsigned comparison in gz_comp()
+- Use SFLAGS when testing shared linking in configure
+- Add --64 option to ./configure to use -m64 with gcc
+- Fix ./configure --help to correctly name options
+- Have make fail if a test fails [Levin]
+- Avoid buffer overrun in contrib/masmx64/gvmat64.asm [Simpson]
+- Remove assembler object files from contrib
+
+Changes in 1.2.3.7 (24 Jan 2010)
+- Always gzopen() with O_LARGEFILE if available
+- Fix gzdirect() to work immediately after gzopen() or gzdopen()
+- Make gzdirect() more precise when the state changes while reading
+- Improve zlib.h documentation in many places
+- Catch memory allocation failure in gz_open()
+- Complete close operation if seek forward in gzclose_w() fails
+- Return Z_ERRNO from gzclose_r() if close() fails
+- Return Z_STREAM_ERROR instead of EOF for gzclose() being passed NULL
+- Return zero for gzwrite() errors to match zlib.h description
+- Return -1 on gzputs() error to match zlib.h description
+- Add zconf.in.h to allow recovery from configure modification [Weigelt]
+- Fix static library permissions in Makefile.in [Weigelt]
+- Avoid warnings in configure tests that hide functionality [Weigelt]
+- Add *BSD and DragonFly to Linux case in configure [gentoo 123571]
+- Change libzdll.a to libz.dll.a in win32/Makefile.gcc [gentoo 288212]
+- Avoid access of uninitialized data for first inflateReset2 call [Gomes]
+- Keep object files in subdirectories to reduce the clutter somewhat
+- Remove default Makefile and zlibdefs.h, add dummy Makefile
+- Add new external functions to Z_PREFIX, remove duplicates, z_z_ -> z_
+- Remove zlibdefs.h completely -- modify zconf.h instead
+
+Changes in 1.2.3.6 (17 Jan 2010)
+- Avoid void * arithmetic in gzread.c and gzwrite.c
+- Make compilers happier with const char * for gz_error message
+- Avoid unused parameter warning in inflate.c
+- Avoid signed-unsigned comparison warning in inflate.c
+- Indent #pragma's for traditional C
+- Fix usage of strwinerror() in glib.c, change to gz_strwinerror()
+- Correct email address in configure for system options
+- Update make_vms.com and add make_vms.com to contrib/minizip [Zinser]
+- Update zlib.map [Brown]
+- Fix Makefile.in for Solaris 10 make of example64 and minizip64 [Torok]
+- Apply various fixes to CMakeLists.txt [Lowman]
+- Add checks on len in gzread() and gzwrite()
+- Add error message for no more room for gzungetc()
+- Remove zlib version check in gzwrite()
+- Defer compression of gzprintf() result until need to
+- Use snprintf() in gzdopen() if available
+- Remove USE_MMAP configuration determination (only used by minigzip)
+- Remove examples/pigz.c (available separately)
+- Update examples/gun.c to 1.6
+
+Changes in 1.2.3.5 (8 Jan 2010)
+- Add space after #if in zutil.h for some compilers
+- Fix relatively harmless bug in deflate_fast() [Exarevsky]
+- Fix same problem in deflate_slow()
+- Add $(SHAREDLIBV) to LIBS in Makefile.in [Brown]
+- Add deflate_rle() for faster Z_RLE strategy run-length encoding
+- Add deflate_huff() for faster Z_HUFFMAN_ONLY encoding
+- Change name of "write" variable in inffast.c to avoid library collisions
+- Fix premature EOF from gzread() in gzio.c [Brown]
+- Use zlib header window size if windowBits is 0 in inflateInit2()
+- Remove compressBound() call in deflate.c to avoid linking compress.o
+- Replace use of errno in gz* with functions, support WinCE [Alves]
+- Provide alternative to perror() in minigzip.c for WinCE [Alves]
+- Don't use _vsnprintf on later versions of MSVC [Lowman]
+- Add CMake build script and input file [Lowman]
+- Update contrib/minizip to 1.1 [Svensson, Vollant]
+- Moved nintendods directory from contrib to .
+- Replace gzio.c with a new set of routines with the same functionality
+- Add gzbuffer(), gzoffset(), gzclose_r(), gzclose_w() as part of above
+- Update contrib/minizip to 1.1b
+- Change gzeof() to return 0 on error instead of -1 to agree with zlib.h
+
+Changes in 1.2.3.4 (21 Dec 2009)
+- Use old school .SUFFIXES in Makefile.in for FreeBSD compatibility
+- Update comments in configure and Makefile.in for default --shared
+- Fix test -z's in configure [Marquess]
+- Build examplesh and minigzipsh when not testing
+- Change NULL's to Z_NULL's in deflate.c and in comments in zlib.h
+- Import LDFLAGS from the environment in configure
+- Fix configure to populate SFLAGS with discovered CFLAGS options
+- Adapt make_vms.com to the new Makefile.in [Zinser]
+- Add zlib2ansi script for C++ compilation [Marquess]
+- Add _FILE_OFFSET_BITS=64 test to make test (when applicable)
+- Add AMD64 assembler code for longest match to contrib [Teterin]
+- Include options from $SFLAGS when doing $LDSHARED
+- Simplify 64-bit file support by introducing z_off64_t type
+- Make shared object files in objs directory to work around old Sun cc
+- Use only three-part version number for Darwin shared compiles
+- Add rc option to ar in Makefile.in for when ./configure not run
+- Add -WI,-rpath,. to LDFLAGS for OSF 1 V4*
+- Set LD_LIBRARYN32_PATH for SGI IRIX shared compile
+- Protect against _FILE_OFFSET_BITS being defined when compiling zlib
+- Rename Makefile.in targets allstatic to static and allshared to shared
+- Fix static and shared Makefile.in targets to be independent
+- Correct error return bug in gz_open() by setting state [Brown]
+- Put spaces before ;;'s in configure for better sh compatibility
+- Add pigz.c (parallel implementation of gzip) to examples/
+- Correct constant in crc32.c to UL [Leventhal]
+- Reject negative lengths in crc32_combine()
+- Add inflateReset2() function to work like inflateEnd()/inflateInit2()
+- Include sys/types.h for _LARGEFILE64_SOURCE [Brown]
+- Correct typo in doc/algorithm.txt [Janik]
+- Fix bug in adler32_combine() [Zhu]
+- Catch missing-end-of-block-code error in all inflates and in puff
+ Assures that random input to inflate eventually results in an error
+- Added enough.c (calculation of ENOUGH for inftrees.h) to examples/
+- Update ENOUGH and its usage to reflect discovered bounds
+- Fix gzerror() error report on empty input file [Brown]
+- Add ush casts in trees.c to avoid pedantic runtime errors
+- Fix typo in zlib.h uncompress() description [Reiss]
+- Correct inflate() comments with regard to automatic header detection
+- Remove deprecation comment on Z_PARTIAL_FLUSH (it stays)
+- Put new version of gzlog (2.0) in examples with interruption recovery
+- Add puff compile option to permit invalid distance-too-far streams
+- Add puff TEST command options, ability to read piped input
+- Prototype the *64 functions in zlib.h when _FILE_OFFSET_BITS == 64, but
+ _LARGEFILE64_SOURCE not defined
+- Fix Z_FULL_FLUSH to truly erase the past by resetting s->strstart
+- Fix deflateSetDictionary() to use all 32K for output consistency
+- Remove extraneous #define MIN_LOOKAHEAD in deflate.c (in deflate.h)
+- Clear bytes after deflate lookahead to avoid use of uninitialized data
+- Change a limit in inftrees.c to be more transparent to Coverity Prevent
+- Update win32/zlib.def with exported symbols from zlib.h
+- Correct spelling errors in zlib.h [Willem, Sobrado]
+- Allow Z_BLOCK for deflate() to force a new block
+- Allow negative bits in inflatePrime() to delete existing bit buffer
+- Add Z_TREES flush option to inflate() to return at end of trees
+- Add inflateMark() to return current state information for random access
+- Add Makefile for NintendoDS to contrib [Costa]
+- Add -w in configure compile tests to avoid spurious warnings [Beucler]
+- Fix typos in zlib.h comments for deflateSetDictionary()
+- Fix EOF detection in transparent gzread() [Maier]
+
+Changes in 1.2.3.3 (2 October 2006)
+- Make --shared the default for configure, add a --static option
+- Add compile option to permit invalid distance-too-far streams
+- Add inflateUndermine() function which is required to enable above
+- Remove use of "this" variable name for C++ compatibility [Marquess]
+- Add testing of shared library in make test, if shared library built
+- Use ftello() and fseeko() if available instead of ftell() and fseek()
+- Provide two versions of all functions that use the z_off_t type for
+ binary compatibility -- a normal version and a 64-bit offset version,
+ per the Large File Support Extension when _LARGEFILE64_SOURCE is
+ defined; use the 64-bit versions by default when _FILE_OFFSET_BITS
+ is defined to be 64
+- Add a --uname= option to configure to perhaps help with cross-compiling
+
+Changes in 1.2.3.2 (3 September 2006)
+- Turn off silly Borland warnings [Hay]
+- Use off64_t and define _LARGEFILE64_SOURCE when present
+- Fix missing dependency on inffixed.h in Makefile.in
+- Rig configure --shared to build both shared and static [Teredesai, Truta]
+- Remove zconf.in.h and instead create a new zlibdefs.h file
+- Fix contrib/minizip/unzip.c non-encrypted after encrypted [Vollant]
+- Add treebuild.xml (see http://treebuild.metux.de/) [Weigelt]
+
+Changes in 1.2.3.1 (16 August 2006)
+- Add watcom directory with OpenWatcom make files [Daniel]
+- Remove #undef of FAR in zconf.in.h for MVS [Fedtke]
+- Update make_vms.com [Zinser]
+- Use -fPIC for shared build in configure [Teredesai, Nicholson]
+- Use only major version number for libz.so on IRIX and OSF1 [Reinholdtsen]
+- Use fdopen() (not _fdopen()) for Interix in zutil.h [Bäck]
+- Add some FAQ entries about the contrib directory
+- Update the MVS question in the FAQ
+- Avoid extraneous reads after EOF in gzio.c [Brown]
+- Correct spelling of "successfully" in gzio.c [Randers-Pehrson]
+- Add comments to zlib.h about gzerror() usage [Brown]
+- Set extra flags in gzip header in gzopen() like deflate() does
+- Make configure options more compatible with double-dash conventions
+ [Weigelt]
+- Clean up compilation under Solaris SunStudio cc [Rowe, Reinholdtsen]
+- Fix uninstall target in Makefile.in [Truta]
+- Add pkgconfig support [Weigelt]
+- Use $(DESTDIR) macro in Makefile.in [Reinholdtsen, Weigelt]
+- Replace set_data_type() with a more accurate detect_data_type() in
+ trees.c, according to the txtvsbin.txt document [Truta]
+- Swap the order of #include <stdio.h> and #include "zlib.h" in
+ gzio.c, example.c and minigzip.c [Truta]
+- Shut up annoying VS2005 warnings about standard C deprecation [Rowe,
+ Truta] (where?)
+- Fix target "clean" from win32/Makefile.bor [Truta]
+- Create .pdb and .manifest files in win32/makefile.msc [Ziegler, Rowe]
+- Update zlib www home address in win32/DLL_FAQ.txt [Truta]
+- Update contrib/masmx86/inffas32.asm for VS2005 [Vollant, Van Wassenhove]
+- Enable browse info in the "Debug" and "ASM Debug" configurations in
+ the Visual C++ 6 project, and set (non-ASM) "Debug" as default [Truta]
+- Add pkgconfig support [Weigelt]
+- Add ZLIB_VER_MAJOR, ZLIB_VER_MINOR and ZLIB_VER_REVISION in zlib.h,
+ for use in win32/zlib1.rc [Polushin, Rowe, Truta]
+- Add a document that explains the new text detection scheme to
+ doc/txtvsbin.txt [Truta]
+- Add rfc1950.txt, rfc1951.txt and rfc1952.txt to doc/ [Truta]
+- Move algorithm.txt into doc/ [Truta]
+- Synchronize FAQ with website
+- Fix compressBound(), was low for some pathological cases [Fearnley]
+- Take into account wrapper variations in deflateBound()
+- Set examples/zpipe.c input and output to binary mode for Windows
+- Update examples/zlib_how.html with new zpipe.c (also web site)
+- Fix some warnings in examples/gzlog.c and examples/zran.c (it seems
+ that gcc became pickier in 4.0)
+- Add zlib.map for Linux: "All symbols from zlib-1.1.4 remain
+ un-versioned, the patch adds versioning only for symbols introduced in
+ zlib-1.2.0 or later. It also declares as local those symbols which are
+ not designed to be exported." [Levin]
+- Update Z_PREFIX list in zconf.in.h, add --zprefix option to configure
+- Do not initialize global static by default in trees.c, add a response
+ NO_INIT_GLOBAL_POINTERS to initialize them if needed [Marquess]
+- Don't use strerror() in gzio.c under WinCE [Yakimov]
+- Don't use errno.h in zutil.h under WinCE [Yakimov]
+- Move arguments for AR to its usage to allow replacing ar [Marot]
+- Add HAVE_VISIBILITY_PRAGMA in zconf.in.h for Mozilla [Randers-Pehrson]
+- Improve inflateInit() and inflateInit2() documentation
+- Fix structure size comment in inflate.h
+- Change configure help option from --h* to --help [Santos]
+
+Changes in 1.2.3 (18 July 2005)
+- Apply security vulnerability fixes to contrib/infback9 as well
+- Clean up some text files (carriage returns, trailing space)
+- Update testzlib, vstudio, masmx64, and masmx86 in contrib [Vollant]
+
+Changes in 1.2.2.4 (11 July 2005)
+- Add inflatePrime() function for starting inflation at bit boundary
+- Avoid some Visual C warnings in deflate.c
+- Avoid more silly Visual C warnings in inflate.c and inftrees.c for 64-bit
+ compile
+- Fix some spelling errors in comments [Betts]
+- Correct inflateInit2() error return documentation in zlib.h
+- Add zran.c example of compressed data random access to examples
+ directory, shows use of inflatePrime()
+- Fix cast for assignments to strm->state in inflate.c and infback.c
+- Fix zlibCompileFlags() in zutil.c to use 1L for long shifts [Oberhumer]
+- Move declarations of gf2 functions to right place in crc32.c [Oberhumer]
+- Add cast in trees.c t avoid a warning [Oberhumer]
+- Avoid some warnings in fitblk.c, gun.c, gzjoin.c in examples [Oberhumer]
+- Update make_vms.com [Zinser]
+- Initialize state->write in inflateReset() since copied in inflate_fast()
+- Be more strict on incomplete code sets in inflate_table() and increase
+ ENOUGH and MAXD -- this repairs a possible security vulnerability for
+ invalid inflate input. Thanks to Tavis Ormandy and Markus Oberhumer for
+ discovering the vulnerability and providing test cases.
+- Add ia64 support to configure for HP-UX [Smith]
+- Add error return to gzread() for format or i/o error [Levin]
+- Use malloc.h for OS/2 [Necasek]
+
+Changes in 1.2.2.3 (27 May 2005)
+- Replace 1U constants in inflate.c and inftrees.c for 64-bit compile
+- Typecast fread() return values in gzio.c [Vollant]
+- Remove trailing space in minigzip.c outmode (VC++ can't deal with it)
+- Fix crc check bug in gzread() after gzungetc() [Heiner]
+- Add the deflateTune() function to adjust internal compression parameters
+- Add a fast gzip decompressor, gun.c, to examples (use of inflateBack)
+- Remove an incorrect assertion in examples/zpipe.c
+- Add C++ wrapper in infback9.h [Donais]
+- Fix bug in inflateCopy() when decoding fixed codes
+- Note in zlib.h how much deflateSetDictionary() actually uses
+- Remove USE_DICT_HEAD in deflate.c (would mess up inflate if used)
+- Add _WIN32_WCE to define WIN32 in zconf.in.h [Spencer]
+- Don't include stderr.h or errno.h for _WIN32_WCE in zutil.h [Spencer]
+- Add gzdirect() function to indicate transparent reads
+- Update contrib/minizip [Vollant]
+- Fix compilation of deflate.c when both ASMV and FASTEST [Oberhumer]
+- Add casts in crc32.c to avoid warnings [Oberhumer]
+- Add contrib/masmx64 [Vollant]
+- Update contrib/asm586, asm686, masmx86, testzlib, vstudio [Vollant]
+
+Changes in 1.2.2.2 (30 December 2004)
+- Replace structure assignments in deflate.c and inflate.c with zmemcpy to
+ avoid implicit memcpy calls (portability for no-library compilation)
+- Increase sprintf() buffer size in gzdopen() to allow for large numbers
+- Add INFLATE_STRICT to check distances against zlib header
+- Improve WinCE errno handling and comments [Chang]
+- Remove comment about no gzip header processing in FAQ
+- Add Z_FIXED strategy option to deflateInit2() to force fixed trees
+- Add updated make_vms.com [Coghlan], update README
+- Create a new "examples" directory, move gzappend.c there, add zpipe.c,
+ fitblk.c, gzlog.[ch], gzjoin.c, and zlib_how.html.
+- Add FAQ entry and comments in deflate.c on uninitialized memory access
+- Add Solaris 9 make options in configure [Gilbert]
+- Allow strerror() usage in gzio.c for STDC
+- Fix DecompressBuf in contrib/delphi/ZLib.pas [ManChesTer]
+- Update contrib/masmx86/inffas32.asm and gvmat32.asm [Vollant]
+- Use z_off_t for adler32_combine() and crc32_combine() lengths
+- Make adler32() much faster for small len
+- Use OS_CODE in deflate() default gzip header
+
+Changes in 1.2.2.1 (31 October 2004)
+- Allow inflateSetDictionary() call for raw inflate
+- Fix inflate header crc check bug for file names and comments
+- Add deflateSetHeader() and gz_header structure for custom gzip headers
+- Add inflateGetheader() to retrieve gzip headers
+- Add crc32_combine() and adler32_combine() functions
+- Add alloc_func, free_func, in_func, out_func to Z_PREFIX list
+- Use zstreamp consistently in zlib.h (inflate_back functions)
+- Remove GUNZIP condition from definition of inflate_mode in inflate.h
+ and in contrib/inflate86/inffast.S [Truta, Anderson]
+- Add support for AMD64 in contrib/inflate86/inffas86.c [Anderson]
+- Update projects/README.projects and projects/visualc6 [Truta]
+- Update win32/DLL_FAQ.txt [Truta]
+- Avoid warning under NO_GZCOMPRESS in gzio.c; fix typo [Truta]
+- Deprecate Z_ASCII; use Z_TEXT instead [Truta]
+- Use a new algorithm for setting strm->data_type in trees.c [Truta]
+- Do not define an exit() prototype in zutil.c unless DEBUG defined
+- Remove prototype of exit() from zutil.c, example.c, minigzip.c [Truta]
+- Add comment in zlib.h for Z_NO_FLUSH parameter to deflate()
+- Fix Darwin build version identification [Peterson]
+
+Changes in 1.2.2 (3 October 2004)
+- Update zlib.h comments on gzip in-memory processing
+- Set adler to 1 in inflateReset() to support Java test suite [Walles]
+- Add contrib/dotzlib [Ravn]
+- Update win32/DLL_FAQ.txt [Truta]
+- Update contrib/minizip [Vollant]
+- Move contrib/visual-basic.txt to old/ [Truta]
+- Fix assembler builds in projects/visualc6/ [Truta]
+
+Changes in 1.2.1.2 (9 September 2004)
+- Update INDEX file
+- Fix trees.c to update strm->data_type (no one ever noticed!)
+- Fix bug in error case in inflate.c, infback.c, and infback9.c [Brown]
+- Add "volatile" to crc table flag declaration (for DYNAMIC_CRC_TABLE)
+- Add limited multitasking protection to DYNAMIC_CRC_TABLE
+- Add NO_vsnprintf for VMS in zutil.h [Mozilla]
+- Don't declare strerror() under VMS [Mozilla]
+- Add comment to DYNAMIC_CRC_TABLE to use get_crc_table() to initialize
+- Update contrib/ada [Anisimkov]
+- Update contrib/minizip [Vollant]
+- Fix configure to not hardcode directories for Darwin [Peterson]
+- Fix gzio.c to not return error on empty files [Brown]
+- Fix indentation; update version in contrib/delphi/ZLib.pas and
+ contrib/pascal/zlibpas.pas [Truta]
+- Update mkasm.bat in contrib/masmx86 [Truta]
+- Update contrib/untgz [Truta]
+- Add projects/README.projects [Truta]
+- Add project for MS Visual C++ 6.0 in projects/visualc6 [Cadieux, Truta]
+- Update win32/DLL_FAQ.txt [Truta]
+- Update list of Z_PREFIX symbols in zconf.h [Randers-Pehrson, Truta]
+- Remove an unnecessary assignment to curr in inftrees.c [Truta]
+- Add OS/2 to exe builds in configure [Poltorak]
+- Remove err dummy parameter in zlib.h [Kientzle]
+
+Changes in 1.2.1.1 (9 January 2004)
+- Update email address in README
+- Several FAQ updates
+- Fix a big fat bug in inftrees.c that prevented decoding valid
+ dynamic blocks with only literals and no distance codes --
+ Thanks to "Hot Emu" for the bug report and sample file
+- Add a note to puff.c on no distance codes case.
+
+Changes in 1.2.1 (17 November 2003)
+- Remove a tab in contrib/gzappend/gzappend.c
+- Update some interfaces in contrib for new zlib functions
+- Update zlib version number in some contrib entries
+- Add Windows CE definition for ptrdiff_t in zutil.h [Mai, Truta]
+- Support shared libraries on Hurd and KFreeBSD [Brown]
+- Fix error in NO_DIVIDE option of adler32.c
+
+Changes in 1.2.0.8 (4 November 2003)
+- Update version in contrib/delphi/ZLib.pas and contrib/pascal/zlibpas.pas
+- Add experimental NO_DIVIDE #define in adler32.c
+ - Possibly faster on some processors (let me know if it is)
+- Correct Z_BLOCK to not return on first inflate call if no wrap
+- Fix strm->data_type on inflate() return to correctly indicate EOB
+- Add deflatePrime() function for appending in the middle of a byte
+- Add contrib/gzappend for an example of appending to a stream
+- Update win32/DLL_FAQ.txt [Truta]
+- Delete Turbo C comment in README [Truta]
+- Improve some indentation in zconf.h [Truta]
+- Fix infinite loop on bad input in configure script [Church]
+- Fix gzeof() for concatenated gzip files [Johnson]
+- Add example to contrib/visual-basic.txt [Michael B.]
+- Add -p to mkdir's in Makefile.in [vda]
+- Fix configure to properly detect presence or lack of printf functions
+- Add AS400 support [Monnerat]
+- Add a little Cygwin support [Wilson]
+
+Changes in 1.2.0.7 (21 September 2003)
+- Correct some debug formats in contrib/infback9
+- Cast a type in a debug statement in trees.c
+- Change search and replace delimiter in configure from % to # [Beebe]
+- Update contrib/untgz to 0.2 with various fixes [Truta]
+- Add build support for Amiga [Nikl]
+- Remove some directories in old that have been updated to 1.2
+- Add dylib building for Mac OS X in configure and Makefile.in
+- Remove old distribution stuff from Makefile
+- Update README to point to DLL_FAQ.txt, and add comment on Mac OS X
+- Update links in README
+
+Changes in 1.2.0.6 (13 September 2003)
+- Minor FAQ updates
+- Update contrib/minizip to 1.00 [Vollant]
+- Remove test of gz functions in example.c when GZ_COMPRESS defined [Truta]
+- Update POSTINC comment for 68060 [Nikl]
+- Add contrib/infback9 with deflate64 decoding (unsupported)
+- For MVS define NO_vsnprintf and undefine FAR [van Burik]
+- Add pragma for fdopen on MVS [van Burik]
+
+Changes in 1.2.0.5 (8 September 2003)
+- Add OF to inflateBackEnd() declaration in zlib.h
+- Remember start when using gzdopen in the middle of a file
+- Use internal off_t counters in gz* functions to properly handle seeks
+- Perform more rigorous check for distance-too-far in inffast.c
+- Add Z_BLOCK flush option to return from inflate at block boundary
+- Set strm->data_type on return from inflate
+ - Indicate bits unused, if at block boundary, and if in last block
+- Replace size_t with ptrdiff_t in crc32.c, and check for correct size
+- Add condition so old NO_DEFLATE define still works for compatibility
+- FAQ update regarding the Windows DLL [Truta]
+- INDEX update: add qnx entry, remove aix entry [Truta]
+- Install zlib.3 into mandir [Wilson]
+- Move contrib/zlib_dll_FAQ.txt to win32/DLL_FAQ.txt; update [Truta]
+- Adapt the zlib interface to the new DLL convention guidelines [Truta]
+- Introduce ZLIB_WINAPI macro to allow the export of functions using
+ the WINAPI calling convention, for Visual Basic [Vollant, Truta]
+- Update msdos and win32 scripts and makefiles [Truta]
+- Export symbols by name, not by ordinal, in win32/zlib.def [Truta]
+- Add contrib/ada [Anisimkov]
+- Move asm files from contrib/vstudio/vc70_32 to contrib/asm386 [Truta]
+- Rename contrib/asm386 to contrib/masmx86 [Truta, Vollant]
+- Add contrib/masm686 [Truta]
+- Fix offsets in contrib/inflate86 and contrib/masmx86/inffas32.asm
+ [Truta, Vollant]
+- Update contrib/delphi; rename to contrib/pascal; add example [Truta]
+- Remove contrib/delphi2; add a new contrib/delphi [Truta]
+- Avoid inclusion of the nonstandard <memory.h> in contrib/iostream,
+ and fix some method prototypes [Truta]
+- Fix the ZCR_SEED2 constant to avoid warnings in contrib/minizip
+ [Truta]
+- Avoid the use of backslash (\) in contrib/minizip [Vollant]
+- Fix file time handling in contrib/untgz; update makefiles [Truta]
+- Update contrib/vstudio/vc70_32 to comply with the new DLL guidelines
+ [Vollant]
+- Remove contrib/vstudio/vc15_16 [Vollant]
+- Rename contrib/vstudio/vc70_32 to contrib/vstudio/vc7 [Truta]
+- Update README.contrib [Truta]
+- Invert the assignment order of match_head and s->prev[...] in
+ INSERT_STRING [Truta]
+- Compare TOO_FAR with 32767 instead of 32768, to avoid 16-bit warnings
+ [Truta]
+- Compare function pointers with 0, not with NULL or Z_NULL [Truta]
+- Fix prototype of syncsearch in inflate.c [Truta]
+- Introduce ASMINF macro to be enabled when using an ASM implementation
+ of inflate_fast [Truta]
+- Change NO_DEFLATE to NO_GZCOMPRESS [Truta]
+- Modify test_gzio in example.c to take a single file name as a
+ parameter [Truta]
+- Exit the example.c program if gzopen fails [Truta]
+- Add type casts around strlen in example.c [Truta]
+- Remove casting to sizeof in minigzip.c; give a proper type
+ to the variable compared with SUFFIX_LEN [Truta]
+- Update definitions of STDC and STDC99 in zconf.h [Truta]
+- Synchronize zconf.h with the new Windows DLL interface [Truta]
+- Use SYS16BIT instead of __32BIT__ to distinguish between
+ 16- and 32-bit platforms [Truta]
+- Use far memory allocators in small 16-bit memory models for
+ Turbo C [Truta]
+- Add info about the use of ASMV, ASMINF and ZLIB_WINAPI in
+ zlibCompileFlags [Truta]
+- Cygwin has vsnprintf [Wilson]
+- In Windows16, OS_CODE is 0, as in MSDOS [Truta]
+- In Cygwin, OS_CODE is 3 (Unix), not 11 (Windows32) [Wilson]
+
+Changes in 1.2.0.4 (10 August 2003)
+- Minor FAQ updates
+- Be more strict when checking inflateInit2's windowBits parameter
+- Change NO_GUNZIP compile option to NO_GZIP to cover deflate as well
+- Add gzip wrapper option to deflateInit2 using windowBits
+- Add updated QNX rule in configure and qnx directory [Bonnefoy]
+- Make inflate distance-too-far checks more rigorous
+- Clean up FAR usage in inflate
+- Add casting to sizeof() in gzio.c and minigzip.c
+
+Changes in 1.2.0.3 (19 July 2003)
+- Fix silly error in gzungetc() implementation [Vollant]
+- Update contrib/minizip and contrib/vstudio [Vollant]
+- Fix printf format in example.c
+- Correct cdecl support in zconf.in.h [Anisimkov]
+- Minor FAQ updates
+
+Changes in 1.2.0.2 (13 July 2003)
+- Add ZLIB_VERNUM in zlib.h for numerical preprocessor comparisons
+- Attempt to avoid warnings in crc32.c for pointer-int conversion
+- Add AIX to configure, remove aix directory [Bakker]
+- Add some casts to minigzip.c
+- Improve checking after insecure sprintf() or vsprintf() calls
+- Remove #elif's from crc32.c
+- Change leave label to inf_leave in inflate.c and infback.c to avoid
+ library conflicts
+- Remove inflate gzip decoding by default--only enable gzip decoding by
+ special request for stricter backward compatibility
+- Add zlibCompileFlags() function to return compilation information
+- More typecasting in deflate.c to avoid warnings
+- Remove leading underscore from _Capital #defines [Truta]
+- Fix configure to link shared library when testing
+- Add some Windows CE target adjustments [Mai]
+- Remove #define ZLIB_DLL in zconf.h [Vollant]
+- Add zlib.3 [Rodgers]
+- Update RFC URL in deflate.c and algorithm.txt [Mai]
+- Add zlib_dll_FAQ.txt to contrib [Truta]
+- Add UL to some constants [Truta]
+- Update minizip and vstudio [Vollant]
+- Remove vestigial NEED_DUMMY_RETURN from zconf.in.h
+- Expand use of NO_DUMMY_DECL to avoid all dummy structures
+- Added iostream3 to contrib [Schwardt]
+- Replace rewind() with fseek() for WinCE [Truta]
+- Improve setting of zlib format compression level flags
+ - Report 0 for huffman and rle strategies and for level == 0 or 1
+ - Report 2 only for level == 6
+- Only deal with 64K limit when necessary at compile time [Truta]
+- Allow TOO_FAR check to be turned off at compile time [Truta]
+- Add gzclearerr() function [Souza]
+- Add gzungetc() function
+
+Changes in 1.2.0.1 (17 March 2003)
+- Add Z_RLE strategy for run-length encoding [Truta]
+ - When Z_RLE requested, restrict matches to distance one
+ - Update zlib.h, minigzip.c, gzopen(), gzdopen() for Z_RLE
+- Correct FASTEST compilation to allow level == 0
+- Clean up what gets compiled for FASTEST
+- Incorporate changes to zconf.in.h [Vollant]
+ - Refine detection of Turbo C need for dummy returns
+ - Refine ZLIB_DLL compilation
+ - Include additional header file on VMS for off_t typedef
+- Try to use _vsnprintf where it supplants vsprintf [Vollant]
+- Add some casts in inffast.c
+- Enchance comments in zlib.h on what happens if gzprintf() tries to
+ write more than 4095 bytes before compression
+- Remove unused state from inflateBackEnd()
+- Remove exit(0) from minigzip.c, example.c
+- Get rid of all those darn tabs
+- Add "check" target to Makefile.in that does the same thing as "test"
+- Add "mostlyclean" and "maintainer-clean" targets to Makefile.in
+- Update contrib/inflate86 [Anderson]
+- Update contrib/testzlib, contrib/vstudio, contrib/minizip [Vollant]
+- Add msdos and win32 directories with makefiles [Truta]
+- More additions and improvements to the FAQ
+
+Changes in 1.2.0 (9 March 2003)
+- New and improved inflate code
+ - About 20% faster
+ - Does not allocate 32K window unless and until needed
+ - Automatically detects and decompresses gzip streams
+ - Raw inflate no longer needs an extra dummy byte at end
+ - Added inflateBack functions using a callback interface--even faster
+ than inflate, useful for file utilities (gzip, zip)
+ - Added inflateCopy() function to record state for random access on
+ externally generated deflate streams (e.g. in gzip files)
+ - More readable code (I hope)
+- New and improved crc32()
+ - About 50% faster, thanks to suggestions from Rodney Brown
+- Add deflateBound() and compressBound() functions
+- Fix memory leak in deflateInit2()
+- Permit setting dictionary for raw deflate (for parallel deflate)
+- Fix const declaration for gzwrite()
+- Check for some malloc() failures in gzio.c
+- Fix bug in gzopen() on single-byte file 0x1f
+- Fix bug in gzread() on concatenated file with 0x1f at end of buffer
+ and next buffer doesn't start with 0x8b
+- Fix uncompress() to return Z_DATA_ERROR on truncated input
+- Free memory at end of example.c
+- Remove MAX #define in trees.c (conflicted with some libraries)
+- Fix static const's in deflate.c, gzio.c, and zutil.[ch]
+- Declare malloc() and free() in gzio.c if STDC not defined
+- Use malloc() instead of calloc() in zutil.c if int big enough
+- Define STDC for AIX
+- Add aix/ with approach for compiling shared library on AIX
+- Add HP-UX support for shared libraries in configure
+- Add OpenUNIX support for shared libraries in configure
+- Use $cc instead of gcc to build shared library
+- Make prefix directory if needed when installing
+- Correct Macintosh avoidance of typedef Byte in zconf.h
+- Correct Turbo C memory allocation when under Linux
+- Use libz.a instead of -lz in Makefile (assure use of compiled library)
+- Update configure to check for snprintf or vsnprintf functions and their
+ return value, warn during make if using an insecure function
+- Fix configure problem with compile-time knowledge of HAVE_UNISTD_H that
+ is lost when library is used--resolution is to build new zconf.h
+- Documentation improvements (in zlib.h):
+ - Document raw deflate and inflate
+ - Update RFCs URL
+ - Point out that zlib and gzip formats are different
+ - Note that Z_BUF_ERROR is not fatal
+ - Document string limit for gzprintf() and possible buffer overflow
+ - Note requirement on avail_out when flushing
+ - Note permitted values of flush parameter of inflate()
+- Add some FAQs (and even answers) to the FAQ
+- Add contrib/inflate86/ for x86 faster inflate
+- Add contrib/blast/ for PKWare Data Compression Library decompression
+- Add contrib/puff/ simple inflate for deflate format description
+
+Changes in 1.1.4 (11 March 2002)
+- ZFREE was repeated on same allocation on some error conditions.
+ This creates a security problem described in
+ http://www.zlib.org/advisory-2002-03-11.txt
+- Returned incorrect error (Z_MEM_ERROR) on some invalid data
+- Avoid accesses before window for invalid distances with inflate window
+ less than 32K.
+- force windowBits > 8 to avoid a bug in the encoder for a window size
+ of 256 bytes. (A complete fix will be available in 1.1.5).
+
+Changes in 1.1.3 (9 July 1998)
+- fix "an inflate input buffer bug that shows up on rare but persistent
+ occasions" (Mark)
+- fix gzread and gztell for concatenated .gz files (Didier Le Botlan)
+- fix gzseek(..., SEEK_SET) in write mode
+- fix crc check after a gzeek (Frank Faubert)
+- fix miniunzip when the last entry in a zip file is itself a zip file
+ (J Lillge)
+- add contrib/asm586 and contrib/asm686 (Brian Raiter)
+ See http://www.muppetlabs.com/~breadbox/software/assembly.html
+- add support for Delphi 3 in contrib/delphi (Bob Dellaca)
+- add support for C++Builder 3 and Delphi 3 in contrib/delphi2 (Davide Moretti)
+- do not exit prematurely in untgz if 0 at start of block (Magnus Holmgren)
+- use macro EXTERN instead of extern to support DLL for BeOS (Sander Stoks)
+- added a FAQ file
+
+- Support gzdopen on Mac with Metrowerks (Jason Linhart)
+- Do not redefine Byte on Mac (Brad Pettit & Jason Linhart)
+- define SEEK_END too if SEEK_SET is not defined (Albert Chin-A-Young)
+- avoid some warnings with Borland C (Tom Tanner)
+- fix a problem in contrib/minizip/zip.c for 16-bit MSDOS (Gilles Vollant)
+- emulate utime() for WIN32 in contrib/untgz (Gilles Vollant)
+- allow several arguments to configure (Tim Mooney, Frodo Looijaard)
+- use libdir and includedir in Makefile.in (Tim Mooney)
+- support shared libraries on OSF1 V4 (Tim Mooney)
+- remove so_locations in "make clean" (Tim Mooney)
+- fix maketree.c compilation error (Glenn, Mark)
+- Python interface to zlib now in Python 1.5 (Jeremy Hylton)
+- new Makefile.riscos (Rich Walker)
+- initialize static descriptors in trees.c for embedded targets (Nick Smith)
+- use "foo-gz" in example.c for RISCOS and VMS (Nick Smith)
+- add the OS/2 files in Makefile.in too (Andrew Zabolotny)
+- fix fdopen and halloc macros for Microsoft C 6.0 (Tom Lane)
+- fix maketree.c to allow clean compilation of inffixed.h (Mark)
+- fix parameter check in deflateCopy (Gunther Nikl)
+- cleanup trees.c, use compressed_len only in debug mode (Christian Spieler)
+- Many portability patches by Christian Spieler:
+ . zutil.c, zutil.h: added "const" for zmem*
+ . Make_vms.com: fixed some typos
+ . Make_vms.com: msdos/Makefile.*: removed zutil.h from some dependency lists
+ . msdos/Makefile.msc: remove "default rtl link library" info from obj files
+ . msdos/Makefile.*: use model-dependent name for the built zlib library
+ . msdos/Makefile.emx, nt/Makefile.emx, nt/Makefile.gcc:
+ new makefiles, for emx (DOS/OS2), emx&rsxnt and mingw32 (Windows 9x / NT)
+- use define instead of typedef for Bytef also for MSC small/medium (Tom Lane)
+- replace __far with _far for better portability (Christian Spieler, Tom Lane)
+- fix test for errno.h in configure (Tim Newsham)
+
+Changes in 1.1.2 (19 March 98)
+- added contrib/minzip, mini zip and unzip based on zlib (Gilles Vollant)
+ See http://www.winimage.com/zLibDll/unzip.html
+- preinitialize the inflate tables for fixed codes, to make the code
+ completely thread safe (Mark)
+- some simplifications and slight speed-up to the inflate code (Mark)
+- fix gzeof on non-compressed files (Allan Schrum)
+- add -std1 option in configure for OSF1 to fix gzprintf (Martin Mokrejs)
+- use default value of 4K for Z_BUFSIZE for 16-bit MSDOS (Tim Wegner + Glenn)
+- added os2/Makefile.def and os2/zlib.def (Andrew Zabolotny)
+- add shared lib support for UNIX_SV4.2MP (MATSUURA Takanori)
+- do not wrap extern "C" around system includes (Tom Lane)
+- mention zlib binding for TCL in README (Andreas Kupries)
+- added amiga/Makefile.pup for Amiga powerUP SAS/C PPC (Andreas Kleinert)
+- allow "make install prefix=..." even after configure (Glenn Randers-Pehrson)
+- allow "configure --prefix $HOME" (Tim Mooney)
+- remove warnings in example.c and gzio.c (Glenn Randers-Pehrson)
+- move Makefile.sas to amiga/Makefile.sas
+
+Changes in 1.1.1 (27 Feb 98)
+- fix macros _tr_tally_* in deflate.h for debug mode (Glenn Randers-Pehrson)
+- remove block truncation heuristic which had very marginal effect for zlib
+ (smaller lit_bufsize than in gzip 1.2.4) and degraded a little the
+ compression ratio on some files. This also allows inlining _tr_tally for
+ matches in deflate_slow.
+- added msdos/Makefile.w32 for WIN32 Microsoft Visual C++ (Bob Frazier)
+
+Changes in 1.1.0 (24 Feb 98)
+- do not return STREAM_END prematurely in inflate (John Bowler)
+- revert to the zlib 1.0.8 inflate to avoid the gcc 2.8.0 bug (Jeremy Buhler)
+- compile with -DFASTEST to get compression code optimized for speed only
+- in minigzip, try mmap'ing the input file first (Miguel Albrecht)
+- increase size of I/O buffers in minigzip.c and gzio.c (not a big gain
+ on Sun but significant on HP)
+
+- add a pointer to experimental unzip library in README (Gilles Vollant)
+- initialize variable gcc in configure (Chris Herborth)
+
+Changes in 1.0.9 (17 Feb 1998)
+- added gzputs and gzgets functions
+- do not clear eof flag in gzseek (Mark Diekhans)
+- fix gzseek for files in transparent mode (Mark Diekhans)
+- do not assume that vsprintf returns the number of bytes written (Jens Krinke)
+- replace EXPORT with ZEXPORT to avoid conflict with other programs
+- added compress2 in zconf.h, zlib.def, zlib.dnt
+- new asm code from Gilles Vollant in contrib/asm386
+- simplify the inflate code (Mark):
+ . Replace ZALLOC's in huft_build() with single ZALLOC in inflate_blocks_new()
+ . ZALLOC the length list in inflate_trees_fixed() instead of using stack
+ . ZALLOC the value area for huft_build() instead of using stack
+ . Simplify Z_FINISH check in inflate()
+
+- Avoid gcc 2.8.0 comparison bug a little differently than zlib 1.0.8
+- in inftrees.c, avoid cc -O bug on HP (Farshid Elahi)
+- in zconf.h move the ZLIB_DLL stuff earlier to avoid problems with
+ the declaration of FAR (Gilles VOllant)
+- install libz.so* with mode 755 (executable) instead of 644 (Marc Lehmann)
+- read_buf buf parameter of type Bytef* instead of charf*
+- zmemcpy parameters are of type Bytef*, not charf* (Joseph Strout)
+- do not redeclare unlink in minigzip.c for WIN32 (John Bowler)
+- fix check for presence of directories in "make install" (Ian Willis)
+
+Changes in 1.0.8 (27 Jan 1998)
+- fixed offsets in contrib/asm386/gvmat32.asm (Gilles Vollant)
+- fix gzgetc and gzputc for big endian systems (Markus Oberhumer)
+- added compress2() to allow setting the compression level
+- include sys/types.h to get off_t on some systems (Marc Lehmann & QingLong)
+- use constant arrays for the static trees in trees.c instead of computing
+ them at run time (thanks to Ken Raeburn for this suggestion). To create
+ trees.h, compile with GEN_TREES_H and run "make test".
+- check return code of example in "make test" and display result
+- pass minigzip command line options to file_compress
+- simplifying code of inflateSync to avoid gcc 2.8 bug
+
+- support CC="gcc -Wall" in configure -s (QingLong)
+- avoid a flush caused by ftell in gzopen for write mode (Ken Raeburn)
+- fix test for shared library support to avoid compiler warnings
+- zlib.lib -> zlib.dll in msdos/zlib.rc (Gilles Vollant)
+- check for TARGET_OS_MAC in addition to MACOS (Brad Pettit)
+- do not use fdopen for Metrowerks on Mac (Brad Pettit))
+- add checks for gzputc and gzputc in example.c
+- avoid warnings in gzio.c and deflate.c (Andreas Kleinert)
+- use const for the CRC table (Ken Raeburn)
+- fixed "make uninstall" for shared libraries
+- use Tracev instead of Trace in infblock.c
+- in example.c use correct compressed length for test_sync
+- suppress +vnocompatwarnings in configure for HPUX (not always supported)
+
+Changes in 1.0.7 (20 Jan 1998)
+- fix gzseek which was broken in write mode
+- return error for gzseek to negative absolute position
+- fix configure for Linux (Chun-Chung Chen)
+- increase stack space for MSC (Tim Wegner)
+- get_crc_table and inflateSyncPoint are EXPORTed (Gilles Vollant)
+- define EXPORTVA for gzprintf (Gilles Vollant)
+- added man page zlib.3 (Rick Rodgers)
+- for contrib/untgz, fix makedir() and improve Makefile
+
+- check gzseek in write mode in example.c
+- allocate extra buffer for seeks only if gzseek is actually called
+- avoid signed/unsigned comparisons (Tim Wegner, Gilles Vollant)
+- add inflateSyncPoint in zconf.h
+- fix list of exported functions in nt/zlib.dnt and mdsos/zlib.def
+
+Changes in 1.0.6 (19 Jan 1998)
+- add functions gzprintf, gzputc, gzgetc, gztell, gzeof, gzseek, gzrewind and
+ gzsetparams (thanks to Roland Giersig and Kevin Ruland for some of this code)
+- Fix a deflate bug occurring only with compression level 0 (thanks to
+ Andy Buckler for finding this one).
+- In minigzip, pass transparently also the first byte for .Z files.
+- return Z_BUF_ERROR instead of Z_OK if output buffer full in uncompress()
+- check Z_FINISH in inflate (thanks to Marc Schluper)
+- Implement deflateCopy (thanks to Adam Costello)
+- make static libraries by default in configure, add --shared option.
+- move MSDOS or Windows specific files to directory msdos
+- suppress the notion of partial flush to simplify the interface
+ (but the symbol Z_PARTIAL_FLUSH is kept for compatibility with 1.0.4)
+- suppress history buffer provided by application to simplify the interface
+ (this feature was not implemented anyway in 1.0.4)
+- next_in and avail_in must be initialized before calling inflateInit or
+ inflateInit2
+- add EXPORT in all exported functions (for Windows DLL)
+- added Makefile.nt (thanks to Stephen Williams)
+- added the unsupported "contrib" directory:
+ contrib/asm386/ by Gilles Vollant <info@winimage.com>
+ 386 asm code replacing longest_match().
+ contrib/iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
+ A C++ I/O streams interface to the zlib gz* functions
+ contrib/iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
+ Another C++ I/O streams interface
+ contrib/untgz/ by "Pedro A. Aranda Guti\irrez" <paag@tid.es>
+ A very simple tar.gz file extractor using zlib
+ contrib/visual-basic.txt by Carlos Rios <c_rios@sonda.cl>
+ How to use compress(), uncompress() and the gz* functions from VB.
+- pass params -f (filtered data), -h (huffman only), -1 to -9 (compression
+ level) in minigzip (thanks to Tom Lane)
+
+- use const for rommable constants in deflate
+- added test for gzseek and gztell in example.c
+- add undocumented function inflateSyncPoint() (hack for Paul Mackerras)
+- add undocumented function zError to convert error code to string
+ (for Tim Smithers)
+- Allow compilation of gzio with -DNO_DEFLATE to avoid the compression code.
+- Use default memcpy for Symantec MSDOS compiler.
+- Add EXPORT keyword for check_func (needed for Windows DLL)
+- add current directory to LD_LIBRARY_PATH for "make test"
+- create also a link for libz.so.1
+- added support for FUJITSU UXP/DS (thanks to Toshiaki Nomura)
+- use $(SHAREDLIB) instead of libz.so in Makefile.in (for HPUX)
+- added -soname for Linux in configure (Chun-Chung Chen,
+- assign numbers to the exported functions in zlib.def (for Windows DLL)
+- add advice in zlib.h for best usage of deflateSetDictionary
+- work around compiler bug on Atari (cast Z_NULL in call of s->checkfn)
+- allow compilation with ANSI keywords only enabled for TurboC in large model
+- avoid "versionString"[0] (Borland bug)
+- add NEED_DUMMY_RETURN for Borland
+- use variable z_verbose for tracing in debug mode (L. Peter Deutsch).
+- allow compilation with CC
+- defined STDC for OS/2 (David Charlap)
+- limit external names to 8 chars for MVS (Thomas Lund)
+- in minigzip.c, use static buffers only for 16-bit systems
+- fix suffix check for "minigzip -d foo.gz"
+- do not return an error for the 2nd of two consecutive gzflush() (Felix Lee)
+- use _fdopen instead of fdopen for MSC >= 6.0 (Thomas Fanslau)
+- added makelcc.bat for lcc-win32 (Tom St Denis)
+- in Makefile.dj2, use copy and del instead of install and rm (Frank Donahoe)
+- Avoid expanded $Id$. Use "rcs -kb" or "cvs admin -kb" to avoid Id expansion.
+- check for unistd.h in configure (for off_t)
+- remove useless check parameter in inflate_blocks_free
+- avoid useless assignment of s->check to itself in inflate_blocks_new
+- do not flush twice in gzclose (thanks to Ken Raeburn)
+- rename FOPEN as F_OPEN to avoid clash with /usr/include/sys/file.h
+- use NO_ERRNO_H instead of enumeration of operating systems with errno.h
+- work around buggy fclose on pipes for HP/UX
+- support zlib DLL with BORLAND C++ 5.0 (thanks to Glenn Randers-Pehrson)
+- fix configure if CC is already equal to gcc
+
+Changes in 1.0.5 (3 Jan 98)
+- Fix inflate to terminate gracefully when fed corrupted or invalid data
+- Use const for rommable constants in inflate
+- Eliminate memory leaks on error conditions in inflate
+- Removed some vestigial code in inflate
+- Update web address in README
+
+Changes in 1.0.4 (24 Jul 96)
+- In very rare conditions, deflate(s, Z_FINISH) could fail to produce an EOF
+ bit, so the decompressor could decompress all the correct data but went
+ on to attempt decompressing extra garbage data. This affected minigzip too.
+- zlibVersion and gzerror return const char* (needed for DLL)
+- port to RISCOS (no fdopen, no multiple dots, no unlink, no fileno)
+- use z_error only for DEBUG (avoid problem with DLLs)
+
+Changes in 1.0.3 (2 Jul 96)
+- use z_streamp instead of z_stream *, which is now a far pointer in MSDOS
+ small and medium models; this makes the library incompatible with previous
+ versions for these models. (No effect in large model or on other systems.)
+- return OK instead of BUF_ERROR if previous deflate call returned with
+ avail_out as zero but there is nothing to do
+- added memcmp for non STDC compilers
+- define NO_DUMMY_DECL for more Mac compilers (.h files merged incorrectly)
+- define __32BIT__ if __386__ or i386 is defined (pb. with Watcom and SCO)
+- better check for 16-bit mode MSC (avoids problem with Symantec)
+
+Changes in 1.0.2 (23 May 96)
+- added Windows DLL support
+- added a function zlibVersion (for the DLL support)
+- fixed declarations using Bytef in infutil.c (pb with MSDOS medium model)
+- Bytef is define's instead of typedef'd only for Borland C
+- avoid reading uninitialized memory in example.c
+- mention in README that the zlib format is now RFC1950
+- updated Makefile.dj2
+- added algorithm.doc
+
+Changes in 1.0.1 (20 May 96) [1.0 skipped to avoid confusion]
+- fix array overlay in deflate.c which sometimes caused bad compressed data
+- fix inflate bug with empty stored block
+- fix MSDOS medium model which was broken in 0.99
+- fix deflateParams() which could generate bad compressed data.
+- Bytef is define'd instead of typedef'ed (work around Borland bug)
+- added an INDEX file
+- new makefiles for DJGPP (Makefile.dj2), 32-bit Borland (Makefile.b32),
+ Watcom (Makefile.wat), Amiga SAS/C (Makefile.sas)
+- speed up adler32 for modern machines without auto-increment
+- added -ansi for IRIX in configure
+- static_init_done in trees.c is an int
+- define unlink as delete for VMS
+- fix configure for QNX
+- add configure branch for SCO and HPUX
+- avoid many warnings (unused variables, dead assignments, etc...)
+- no fdopen for BeOS
+- fix the Watcom fix for 32 bit mode (define FAR as empty)
+- removed redefinition of Byte for MKWERKS
+- work around an MWKERKS bug (incorrect merge of all .h files)
+
+Changes in 0.99 (27 Jan 96)
+- allow preset dictionary shared between compressor and decompressor
+- allow compression level 0 (no compression)
+- add deflateParams in zlib.h: allow dynamic change of compression level
+ and compression strategy.
+- test large buffers and deflateParams in example.c
+- add optional "configure" to build zlib as a shared library
+- suppress Makefile.qnx, use configure instead
+- fixed deflate for 64-bit systems (detected on Cray)
+- fixed inflate_blocks for 64-bit systems (detected on Alpha)
+- declare Z_DEFLATED in zlib.h (possible parameter for deflateInit2)
+- always return Z_BUF_ERROR when deflate() has nothing to do
+- deflateInit and inflateInit are now macros to allow version checking
+- prefix all global functions and types with z_ with -DZ_PREFIX
+- make falloc completely reentrant (inftrees.c)
+- fixed very unlikely race condition in ct_static_init
+- free in reverse order of allocation to help memory manager
+- use zlib-1.0/* instead of zlib/* inside the tar.gz
+- make zlib warning-free with "gcc -O3 -Wall -Wwrite-strings -Wpointer-arith
+ -Wconversion -Wstrict-prototypes -Wmissing-prototypes"
+- allow gzread on concatenated .gz files
+- deflateEnd now returns Z_DATA_ERROR if it was premature
+- deflate is finally (?) fully deterministic (no matches beyond end of input)
+- Document Z_SYNC_FLUSH
+- add uninstall in Makefile
+- Check for __cpluplus in zlib.h
+- Better test in ct_align for partial flush
+- avoid harmless warnings for Borland C++
+- initialize hash_head in deflate.c
+- avoid warning on fdopen (gzio.c) for HP cc -Aa
+- include stdlib.h for STDC compilers
+- include errno.h for Cray
+- ignore error if ranlib doesn't exist
+- call ranlib twice for NeXTSTEP
+- use exec_prefix instead of prefix for libz.a
+- renamed ct_* as _tr_* to avoid conflict with applications
+- clear z->msg in inflateInit2 before any error return
+- initialize opaque in example.c, gzio.c, deflate.c and inflate.c
+- fixed typo in zconf.h (_GNUC__ => __GNUC__)
+- check for WIN32 in zconf.h and zutil.c (avoid farmalloc in 32-bit mode)
+- fix typo in Make_vms.com (f$trnlnm -> f$getsyi)
+- in fcalloc, normalize pointer if size > 65520 bytes
+- don't use special fcalloc for 32 bit Borland C++
+- use STDC instead of __GO32__ to avoid redeclaring exit, calloc, etc...
+- use Z_BINARY instead of BINARY
+- document that gzclose after gzdopen will close the file
+- allow "a" as mode in gzopen.
+- fix error checking in gzread
+- allow skipping .gz extra-field on pipes
+- added reference to Perl interface in README
+- put the crc table in FAR data (I dislike more and more the medium model :)
+- added get_crc_table
+- added a dimension to all arrays (Borland C can't count).
+- workaround Borland C bug in declaration of inflate_codes_new & inflate_fast
+- guard against multiple inclusion of *.h (for precompiled header on Mac)
+- Watcom C pretends to be Microsoft C small model even in 32 bit mode.
+- don't use unsized arrays to avoid silly warnings by Visual C++:
+ warning C4746: 'inflate_mask' : unsized array treated as '__far'
+ (what's wrong with far data in far model?).
+- define enum out of inflate_blocks_state to allow compilation with C++
+
+Changes in 0.95 (16 Aug 95)
+- fix MSDOS small and medium model (now easier to adapt to any compiler)
+- inlined send_bits
+- fix the final (:-) bug for deflate with flush (output was correct but
+ not completely flushed in rare occasions).
+- default window size is same for compression and decompression
+ (it's now sufficient to set MAX_WBITS in zconf.h).
+- voidp -> voidpf and voidnp -> voidp (for consistency with other
+ typedefs and because voidnp was not near in large model).
+
+Changes in 0.94 (13 Aug 95)
+- support MSDOS medium model
+- fix deflate with flush (could sometimes generate bad output)
+- fix deflateReset (zlib header was incorrectly suppressed)
+- added support for VMS
+- allow a compression level in gzopen()
+- gzflush now calls fflush
+- For deflate with flush, flush even if no more input is provided.
+- rename libgz.a as libz.a
+- avoid complex expression in infcodes.c triggering Turbo C bug
+- work around a problem with gcc on Alpha (in INSERT_STRING)
+- don't use inline functions (problem with some gcc versions)
+- allow renaming of Byte, uInt, etc... with #define.
+- avoid warning about (unused) pointer before start of array in deflate.c
+- avoid various warnings in gzio.c, example.c, infblock.c, adler32.c, zutil.c
+- avoid reserved word 'new' in trees.c
+
+Changes in 0.93 (25 June 95)
+- temporarily disable inline functions
+- make deflate deterministic
+- give enough lookahead for PARTIAL_FLUSH
+- Set binary mode for stdin/stdout in minigzip.c for OS/2
+- don't even use signed char in inflate (not portable enough)
+- fix inflate memory leak for segmented architectures
+
+Changes in 0.92 (3 May 95)
+- don't assume that char is signed (problem on SGI)
+- Clear bit buffer when starting a stored block
+- no memcpy on Pyramid
+- suppressed inftest.c
+- optimized fill_window, put longest_match inline for gcc
+- optimized inflate on stored blocks.
+- untabify all sources to simplify patches
+
+Changes in 0.91 (2 May 95)
+- Default MEM_LEVEL is 8 (not 9 for Unix) as documented in zlib.h
+- Document the memory requirements in zconf.h
+- added "make install"
+- fix sync search logic in inflateSync
+- deflate(Z_FULL_FLUSH) now works even if output buffer too short
+- after inflateSync, don't scare people with just "lo world"
+- added support for DJGPP
+
+Changes in 0.9 (1 May 95)
+- don't assume that zalloc clears the allocated memory (the TurboC bug
+ was Mark's bug after all :)
+- let again gzread copy uncompressed data unchanged (was working in 0.71)
+- deflate(Z_FULL_FLUSH), inflateReset and inflateSync are now fully implemented
+- added a test of inflateSync in example.c
+- moved MAX_WBITS to zconf.h because users might want to change that.
+- document explicitly that zalloc(64K) on MSDOS must return a normalized
+ pointer (zero offset)
+- added Makefiles for Microsoft C, Turbo C, Borland C++
+- faster crc32()
+
+Changes in 0.8 (29 April 95)
+- added fast inflate (inffast.c)
+- deflate(Z_FINISH) now returns Z_STREAM_END when done. Warning: this
+ is incompatible with previous versions of zlib which returned Z_OK.
+- work around a TurboC compiler bug (bad code for b << 0, see infutil.h)
+ (actually that was not a compiler bug, see 0.81 above)
+- gzread no longer reads one extra byte in certain cases
+- In gzio destroy(), don't reference a freed structure
+- avoid many warnings for MSDOS
+- avoid the ERROR symbol which is used by MS Windows
+
+Changes in 0.71 (14 April 95)
+- Fixed more MSDOS compilation problems :( There is still a bug with
+ TurboC large model.
+
+Changes in 0.7 (14 April 95)
+- Added full inflate support.
+- Simplified the crc32() interface. The pre- and post-conditioning
+ (one's complement) is now done inside crc32(). WARNING: this is
+ incompatible with previous versions; see zlib.h for the new usage.
+
+Changes in 0.61 (12 April 95)
+- workaround for a bug in TurboC. example and minigzip now work on MSDOS.
+
+Changes in 0.6 (11 April 95)
+- added minigzip.c
+- added gzdopen to reopen a file descriptor as gzFile
+- added transparent reading of non-gziped files in gzread.
+- fixed bug in gzread (don't read crc as data)
+- fixed bug in destroy (gzio.c) (don't return Z_STREAM_END for gzclose).
+- don't allocate big arrays in the stack (for MSDOS)
+- fix some MSDOS compilation problems
+
+Changes in 0.5:
+- do real compression in deflate.c. Z_PARTIAL_FLUSH is supported but
+ not yet Z_FULL_FLUSH.
+- support decompression but only in a single step (forced Z_FINISH)
+- added opaque object for zalloc and zfree.
+- added deflateReset and inflateReset
+- added a variable zlib_version for consistency checking.
+- renamed the 'filter' parameter of deflateInit2 as 'strategy'.
+ Added Z_FILTERED and Z_HUFFMAN_ONLY constants.
+
+Changes in 0.4:
+- avoid "zip" everywhere, use zlib instead of ziplib.
+- suppress Z_BLOCK_FLUSH, interpret Z_PARTIAL_FLUSH as block flush
+ if compression method == 8.
+- added adler32 and crc32
+- renamed deflateOptions as deflateInit2, call one or the other but not both
+- added the method parameter for deflateInit2.
+- added inflateInit2
+- simplied considerably deflateInit and inflateInit by not supporting
+ user-provided history buffer. This is supported only in deflateInit2
+ and inflateInit2.
+
+Changes in 0.3:
+- prefix all macro names with Z_
+- use Z_FINISH instead of deflateEnd to finish compression.
+- added Z_HUFFMAN_ONLY
+- added gzerror()
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/FAQ b/src/boost/libs/beast/test/extern/zlib-1.2.11/FAQ
new file mode 100644
index 000000000..99b7cf92e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/FAQ
@@ -0,0 +1,368 @@
+
+ Frequently Asked Questions about zlib
+
+
+If your question is not there, please check the zlib home page
+http://zlib.net/ which may have more recent information.
+The lastest zlib FAQ is at http://zlib.net/zlib_faq.html
+
+
+ 1. Is zlib Y2K-compliant?
+
+ Yes. zlib doesn't handle dates.
+
+ 2. Where can I get a Windows DLL version?
+
+ The zlib sources can be compiled without change to produce a DLL. See the
+ file win32/DLL_FAQ.txt in the zlib distribution. Pointers to the
+ precompiled DLL are found in the zlib web site at http://zlib.net/ .
+
+ 3. Where can I get a Visual Basic interface to zlib?
+
+ See
+ * http://marknelson.us/1997/01/01/zlib-engine/
+ * win32/DLL_FAQ.txt in the zlib distribution
+
+ 4. compress() returns Z_BUF_ERROR.
+
+ Make sure that before the call of compress(), the length of the compressed
+ buffer is equal to the available size of the compressed buffer and not
+ zero. For Visual Basic, check that this parameter is passed by reference
+ ("as any"), not by value ("as long").
+
+ 5. deflate() or inflate() returns Z_BUF_ERROR.
+
+ Before making the call, make sure that avail_in and avail_out are not zero.
+ When setting the parameter flush equal to Z_FINISH, also make sure that
+ avail_out is big enough to allow processing all pending input. Note that a
+ Z_BUF_ERROR is not fatal--another call to deflate() or inflate() can be
+ made with more input or output space. A Z_BUF_ERROR may in fact be
+ unavoidable depending on how the functions are used, since it is not
+ possible to tell whether or not there is more output pending when
+ strm.avail_out returns with zero. See http://zlib.net/zlib_how.html for a
+ heavily annotated example.
+
+ 6. Where's the zlib documentation (man pages, etc.)?
+
+ It's in zlib.h . Examples of zlib usage are in the files test/example.c
+ and test/minigzip.c, with more in examples/ .
+
+ 7. Why don't you use GNU autoconf or libtool or ...?
+
+ Because we would like to keep zlib as a very small and simple package.
+ zlib is rather portable and doesn't need much configuration.
+
+ 8. I found a bug in zlib.
+
+ Most of the time, such problems are due to an incorrect usage of zlib.
+ Please try to reproduce the problem with a small program and send the
+ corresponding source to us at zlib@gzip.org . Do not send multi-megabyte
+ data files without prior agreement.
+
+ 9. Why do I get "undefined reference to gzputc"?
+
+ If "make test" produces something like
+
+ example.o(.text+0x154): undefined reference to `gzputc'
+
+ check that you don't have old files libz.* in /usr/lib, /usr/local/lib or
+ /usr/X11R6/lib. Remove any old versions, then do "make install".
+
+10. I need a Delphi interface to zlib.
+
+ See the contrib/delphi directory in the zlib distribution.
+
+11. Can zlib handle .zip archives?
+
+ Not by itself, no. See the directory contrib/minizip in the zlib
+ distribution.
+
+12. Can zlib handle .Z files?
+
+ No, sorry. You have to spawn an uncompress or gunzip subprocess, or adapt
+ the code of uncompress on your own.
+
+13. How can I make a Unix shared library?
+
+ By default a shared (and a static) library is built for Unix. So:
+
+ make distclean
+ ./configure
+ make
+
+14. How do I install a shared zlib library on Unix?
+
+ After the above, then:
+
+ make install
+
+ However, many flavors of Unix come with a shared zlib already installed.
+ Before going to the trouble of compiling a shared version of zlib and
+ trying to install it, you may want to check if it's already there! If you
+ can #include <zlib.h>, it's there. The -lz option will probably link to
+ it. You can check the version at the top of zlib.h or with the
+ ZLIB_VERSION symbol defined in zlib.h .
+
+15. I have a question about OttoPDF.
+
+ We are not the authors of OttoPDF. The real author is on the OttoPDF web
+ site: Joel Hainley, jhainley@myndkryme.com.
+
+16. Can zlib decode Flate data in an Adobe PDF file?
+
+ Yes. See http://www.pdflib.com/ . To modify PDF forms, see
+ http://sourceforge.net/projects/acroformtool/ .
+
+17. Why am I getting this "register_frame_info not found" error on Solaris?
+
+ After installing zlib 1.1.4 on Solaris 2.6, running applications using zlib
+ generates an error such as:
+
+ ld.so.1: rpm: fatal: relocation error: file /usr/local/lib/libz.so:
+ symbol __register_frame_info: referenced symbol not found
+
+ The symbol __register_frame_info is not part of zlib, it is generated by
+ the C compiler (cc or gcc). You must recompile applications using zlib
+ which have this problem. This problem is specific to Solaris. See
+ http://www.sunfreeware.com for Solaris versions of zlib and applications
+ using zlib.
+
+18. Why does gzip give an error on a file I make with compress/deflate?
+
+ The compress and deflate functions produce data in the zlib format, which
+ is different and incompatible with the gzip format. The gz* functions in
+ zlib on the other hand use the gzip format. Both the zlib and gzip formats
+ use the same compressed data format internally, but have different headers
+ and trailers around the compressed data.
+
+19. Ok, so why are there two different formats?
+
+ The gzip format was designed to retain the directory information about a
+ single file, such as the name and last modification date. The zlib format
+ on the other hand was designed for in-memory and communication channel
+ applications, and has a much more compact header and trailer and uses a
+ faster integrity check than gzip.
+
+20. Well that's nice, but how do I make a gzip file in memory?
+
+ You can request that deflate write the gzip format instead of the zlib
+ format using deflateInit2(). You can also request that inflate decode the
+ gzip format using inflateInit2(). Read zlib.h for more details.
+
+21. Is zlib thread-safe?
+
+ Yes. However any library routines that zlib uses and any application-
+ provided memory allocation routines must also be thread-safe. zlib's gz*
+ functions use stdio library routines, and most of zlib's functions use the
+ library memory allocation routines by default. zlib's *Init* functions
+ allow for the application to provide custom memory allocation routines.
+
+ Of course, you should only operate on any given zlib or gzip stream from a
+ single thread at a time.
+
+22. Can I use zlib in my commercial application?
+
+ Yes. Please read the license in zlib.h.
+
+23. Is zlib under the GNU license?
+
+ No. Please read the license in zlib.h.
+
+24. The license says that altered source versions must be "plainly marked". So
+ what exactly do I need to do to meet that requirement?
+
+ You need to change the ZLIB_VERSION and ZLIB_VERNUM #defines in zlib.h. In
+ particular, the final version number needs to be changed to "f", and an
+ identification string should be appended to ZLIB_VERSION. Version numbers
+ x.x.x.f are reserved for modifications to zlib by others than the zlib
+ maintainers. For example, if the version of the base zlib you are altering
+ is "1.2.3.4", then in zlib.h you should change ZLIB_VERNUM to 0x123f, and
+ ZLIB_VERSION to something like "1.2.3.f-zachary-mods-v3". You can also
+ update the version strings in deflate.c and inftrees.c.
+
+ For altered source distributions, you should also note the origin and
+ nature of the changes in zlib.h, as well as in ChangeLog and README, along
+ with the dates of the alterations. The origin should include at least your
+ name (or your company's name), and an email address to contact for help or
+ issues with the library.
+
+ Note that distributing a compiled zlib library along with zlib.h and
+ zconf.h is also a source distribution, and so you should change
+ ZLIB_VERSION and ZLIB_VERNUM and note the origin and nature of the changes
+ in zlib.h as you would for a full source distribution.
+
+25. Will zlib work on a big-endian or little-endian architecture, and can I
+ exchange compressed data between them?
+
+ Yes and yes.
+
+26. Will zlib work on a 64-bit machine?
+
+ Yes. It has been tested on 64-bit machines, and has no dependence on any
+ data types being limited to 32-bits in length. If you have any
+ difficulties, please provide a complete problem report to zlib@gzip.org
+
+27. Will zlib decompress data from the PKWare Data Compression Library?
+
+ No. The PKWare DCL uses a completely different compressed data format than
+ does PKZIP and zlib. However, you can look in zlib's contrib/blast
+ directory for a possible solution to your problem.
+
+28. Can I access data randomly in a compressed stream?
+
+ No, not without some preparation. If when compressing you periodically use
+ Z_FULL_FLUSH, carefully write all the pending data at those points, and
+ keep an index of those locations, then you can start decompression at those
+ points. You have to be careful to not use Z_FULL_FLUSH too often, since it
+ can significantly degrade compression. Alternatively, you can scan a
+ deflate stream once to generate an index, and then use that index for
+ random access. See examples/zran.c .
+
+29. Does zlib work on MVS, OS/390, CICS, etc.?
+
+ It has in the past, but we have not heard of any recent evidence. There
+ were working ports of zlib 1.1.4 to MVS, but those links no longer work.
+ If you know of recent, successful applications of zlib on these operating
+ systems, please let us know. Thanks.
+
+30. Is there some simpler, easier to read version of inflate I can look at to
+ understand the deflate format?
+
+ First off, you should read RFC 1951. Second, yes. Look in zlib's
+ contrib/puff directory.
+
+31. Does zlib infringe on any patents?
+
+ As far as we know, no. In fact, that was originally the whole point behind
+ zlib. Look here for some more information:
+
+ http://www.gzip.org/#faq11
+
+32. Can zlib work with greater than 4 GB of data?
+
+ Yes. inflate() and deflate() will process any amount of data correctly.
+ Each call of inflate() or deflate() is limited to input and output chunks
+ of the maximum value that can be stored in the compiler's "unsigned int"
+ type, but there is no limit to the number of chunks. Note however that the
+ strm.total_in and strm_total_out counters may be limited to 4 GB. These
+ counters are provided as a convenience and are not used internally by
+ inflate() or deflate(). The application can easily set up its own counters
+ updated after each call of inflate() or deflate() to count beyond 4 GB.
+ compress() and uncompress() may be limited to 4 GB, since they operate in a
+ single call. gzseek() and gztell() may be limited to 4 GB depending on how
+ zlib is compiled. See the zlibCompileFlags() function in zlib.h.
+
+ The word "may" appears several times above since there is a 4 GB limit only
+ if the compiler's "long" type is 32 bits. If the compiler's "long" type is
+ 64 bits, then the limit is 16 exabytes.
+
+33. Does zlib have any security vulnerabilities?
+
+ The only one that we are aware of is potentially in gzprintf(). If zlib is
+ compiled to use sprintf() or vsprintf(), then there is no protection
+ against a buffer overflow of an 8K string space (or other value as set by
+ gzbuffer()), other than the caller of gzprintf() assuring that the output
+ will not exceed 8K. On the other hand, if zlib is compiled to use
+ snprintf() or vsnprintf(), which should normally be the case, then there is
+ no vulnerability. The ./configure script will display warnings if an
+ insecure variation of sprintf() will be used by gzprintf(). Also the
+ zlibCompileFlags() function will return information on what variant of
+ sprintf() is used by gzprintf().
+
+ If you don't have snprintf() or vsnprintf() and would like one, you can
+ find a portable implementation here:
+
+ http://www.ijs.si/software/snprintf/
+
+ Note that you should be using the most recent version of zlib. Versions
+ 1.1.3 and before were subject to a double-free vulnerability, and versions
+ 1.2.1 and 1.2.2 were subject to an access exception when decompressing
+ invalid compressed data.
+
+34. Is there a Java version of zlib?
+
+ Probably what you want is to use zlib in Java. zlib is already included
+ as part of the Java SDK in the java.util.zip package. If you really want
+ a version of zlib written in the Java language, look on the zlib home
+ page for links: http://zlib.net/ .
+
+35. I get this or that compiler or source-code scanner warning when I crank it
+ up to maximally-pedantic. Can't you guys write proper code?
+
+ Many years ago, we gave up attempting to avoid warnings on every compiler
+ in the universe. It just got to be a waste of time, and some compilers
+ were downright silly as well as contradicted each other. So now, we simply
+ make sure that the code always works.
+
+36. Valgrind (or some similar memory access checker) says that deflate is
+ performing a conditional jump that depends on an uninitialized value.
+ Isn't that a bug?
+
+ No. That is intentional for performance reasons, and the output of deflate
+ is not affected. This only started showing up recently since zlib 1.2.x
+ uses malloc() by default for allocations, whereas earlier versions used
+ calloc(), which zeros out the allocated memory. Even though the code was
+ correct, versions 1.2.4 and later was changed to not stimulate these
+ checkers.
+
+37. Will zlib read the (insert any ancient or arcane format here) compressed
+ data format?
+
+ Probably not. Look in the comp.compression FAQ for pointers to various
+ formats and associated software.
+
+38. How can I encrypt/decrypt zip files with zlib?
+
+ zlib doesn't support encryption. The original PKZIP encryption is very
+ weak and can be broken with freely available programs. To get strong
+ encryption, use GnuPG, http://www.gnupg.org/ , which already includes zlib
+ compression. For PKZIP compatible "encryption", look at
+ http://www.info-zip.org/
+
+39. What's the difference between the "gzip" and "deflate" HTTP 1.1 encodings?
+
+ "gzip" is the gzip format, and "deflate" is the zlib format. They should
+ probably have called the second one "zlib" instead to avoid confusion with
+ the raw deflate compressed data format. While the HTTP 1.1 RFC 2616
+ correctly points to the zlib specification in RFC 1950 for the "deflate"
+ transfer encoding, there have been reports of servers and browsers that
+ incorrectly produce or expect raw deflate data per the deflate
+ specification in RFC 1951, most notably Microsoft. So even though the
+ "deflate" transfer encoding using the zlib format would be the more
+ efficient approach (and in fact exactly what the zlib format was designed
+ for), using the "gzip" transfer encoding is probably more reliable due to
+ an unfortunate choice of name on the part of the HTTP 1.1 authors.
+
+ Bottom line: use the gzip format for HTTP 1.1 encoding.
+
+40. Does zlib support the new "Deflate64" format introduced by PKWare?
+
+ No. PKWare has apparently decided to keep that format proprietary, since
+ they have not documented it as they have previous compression formats. In
+ any case, the compression improvements are so modest compared to other more
+ modern approaches, that it's not worth the effort to implement.
+
+41. I'm having a problem with the zip functions in zlib, can you help?
+
+ There are no zip functions in zlib. You are probably using minizip by
+ Giles Vollant, which is found in the contrib directory of zlib. It is not
+ part of zlib. In fact none of the stuff in contrib is part of zlib. The
+ files in there are not supported by the zlib authors. You need to contact
+ the authors of the respective contribution for help.
+
+42. The match.asm code in contrib is under the GNU General Public License.
+ Since it's part of zlib, doesn't that mean that all of zlib falls under the
+ GNU GPL?
+
+ No. The files in contrib are not part of zlib. They were contributed by
+ other authors and are provided as a convenience to the user within the zlib
+ distribution. Each item in contrib has its own license.
+
+43. Is zlib subject to export controls? What is its ECCN?
+
+ zlib is not subject to export controls, and so is classified as EAR99.
+
+44. Can you please sign these lengthy legal documents and fax them back to us
+ so that we can use your software in our product?
+
+ No. Go away. Shoo.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/INDEX b/src/boost/libs/beast/test/extern/zlib-1.2.11/INDEX
new file mode 100644
index 000000000..2ba064120
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/INDEX
@@ -0,0 +1,68 @@
+CMakeLists.txt cmake build file
+ChangeLog history of changes
+FAQ Frequently Asked Questions about zlib
+INDEX this file
+Makefile dummy Makefile that tells you to ./configure
+Makefile.in template for Unix Makefile
+README guess what
+configure configure script for Unix
+make_vms.com makefile for VMS
+test/example.c zlib usages examples for build testing
+test/minigzip.c minimal gzip-like functionality for build testing
+test/infcover.c inf*.c code coverage for build coverage testing
+treebuild.xml XML description of source file dependencies
+zconf.h.cmakein zconf.h template for cmake
+zconf.h.in zconf.h template for configure
+zlib.3 Man page for zlib
+zlib.3.pdf Man page in PDF format
+zlib.map Linux symbol information
+zlib.pc.in Template for pkg-config descriptor
+zlib.pc.cmakein zlib.pc template for cmake
+zlib2ansi perl script to convert source files for C++ compilation
+
+amiga/ makefiles for Amiga SAS C
+as400/ makefiles for AS/400
+doc/ documentation for formats and algorithms
+msdos/ makefiles for MSDOS
+nintendods/ makefile for Nintendo DS
+old/ makefiles for various architectures and zlib documentation
+ files that have not yet been updated for zlib 1.2.x
+qnx/ makefiles for QNX
+watcom/ makefiles for OpenWatcom
+win32/ makefiles for Windows
+
+ zlib public header files (required for library use):
+zconf.h
+zlib.h
+
+ private source files used to build the zlib library:
+adler32.c
+compress.c
+crc32.c
+crc32.h
+deflate.c
+deflate.h
+gzclose.c
+gzguts.h
+gzlib.c
+gzread.c
+gzwrite.c
+infback.c
+inffast.c
+inffast.h
+inffixed.h
+inflate.c
+inflate.h
+inftrees.c
+inftrees.h
+trees.c
+trees.h
+uncompr.c
+zutil.c
+zutil.h
+
+ source files for sample programs
+See examples/README.examples
+
+ unsupported contributions by third parties
+See contrib/README.contrib
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile b/src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile
new file mode 100644
index 000000000..6bba86c73
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile
@@ -0,0 +1,5 @@
+all:
+ -@echo "Please use ./configure first. Thank you."
+
+distclean:
+ make -f Makefile.in distclean
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile.in b/src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile.in
new file mode 100644
index 000000000..5a77949ff
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/Makefile.in
@@ -0,0 +1,410 @@
+# Makefile for zlib
+# Copyright (C) 1995-2017 Jean-loup Gailly, Mark Adler
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile and test, type:
+# ./configure; make test
+# Normally configure builds both a static and a shared library.
+# If you want to build just a static library, use: ./configure --static
+
+# To use the asm code, type:
+# cp contrib/asm?86/match.S ./match.S
+# make LOC=-DASMV OBJA=match.o
+
+# To install /usr/local/lib/libz.* and /usr/local/include/zlib.h, type:
+# make install
+# To install in $HOME instead of /usr/local, use:
+# make install prefix=$HOME
+
+CC=cc
+
+CFLAGS=-O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-g -DZLIB_DEBUG
+#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+# -Wstrict-prototypes -Wmissing-prototypes
+
+SFLAGS=-O
+LDFLAGS=
+TEST_LDFLAGS=-L. libz.a
+LDSHARED=$(CC)
+CPP=$(CC) -E
+
+STATICLIB=libz.a
+SHAREDLIB=libz.so
+SHAREDLIBV=libz.so.1.2.11
+SHAREDLIBM=libz.so.1
+LIBS=$(STATICLIB) $(SHAREDLIBV)
+
+AR=ar
+ARFLAGS=rc
+RANLIB=ranlib
+LDCONFIG=ldconfig
+LDSHAREDLIBC=-lc
+TAR=tar
+SHELL=/bin/sh
+EXE=
+
+prefix = /usr/local
+exec_prefix = ${prefix}
+libdir = ${exec_prefix}/lib
+sharedlibdir = ${libdir}
+includedir = ${prefix}/include
+mandir = ${prefix}/share/man
+man3dir = ${mandir}/man3
+pkgconfigdir = ${libdir}/pkgconfig
+SRCDIR=
+ZINC=
+ZINCOUT=-I.
+
+OBJZ = adler32.o crc32.o deflate.o infback.o inffast.o inflate.o inftrees.o trees.o zutil.o
+OBJG = compress.o uncompr.o gzclose.o gzlib.o gzread.o gzwrite.o
+OBJC = $(OBJZ) $(OBJG)
+
+PIC_OBJZ = adler32.lo crc32.lo deflate.lo infback.lo inffast.lo inflate.lo inftrees.lo trees.lo zutil.lo
+PIC_OBJG = compress.lo uncompr.lo gzclose.lo gzlib.lo gzread.lo gzwrite.lo
+PIC_OBJC = $(PIC_OBJZ) $(PIC_OBJG)
+
+# to use the asm code: make OBJA=match.o, PIC_OBJA=match.lo
+OBJA =
+PIC_OBJA =
+
+OBJS = $(OBJC) $(OBJA)
+
+PIC_OBJS = $(PIC_OBJC) $(PIC_OBJA)
+
+all: static shared
+
+static: example$(EXE) minigzip$(EXE)
+
+shared: examplesh$(EXE) minigzipsh$(EXE)
+
+all64: example64$(EXE) minigzip64$(EXE)
+
+check: test
+
+test: all teststatic testshared
+
+teststatic: static
+ @TMPST=tmpst_$$; \
+ if echo hello world | ./minigzip | ./minigzip -d && ./example $$TMPST ; then \
+ echo ' *** zlib test OK ***'; \
+ else \
+ echo ' *** zlib test FAILED ***'; false; \
+ fi; \
+ rm -f $$TMPST
+
+testshared: shared
+ @LD_LIBRARY_PATH=`pwd`:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
+ LD_LIBRARYN32_PATH=`pwd`:$(LD_LIBRARYN32_PATH) ; export LD_LIBRARYN32_PATH; \
+ DYLD_LIBRARY_PATH=`pwd`:$(DYLD_LIBRARY_PATH) ; export DYLD_LIBRARY_PATH; \
+ SHLIB_PATH=`pwd`:$(SHLIB_PATH) ; export SHLIB_PATH; \
+ TMPSH=tmpsh_$$; \
+ if echo hello world | ./minigzipsh | ./minigzipsh -d && ./examplesh $$TMPSH; then \
+ echo ' *** zlib shared test OK ***'; \
+ else \
+ echo ' *** zlib shared test FAILED ***'; false; \
+ fi; \
+ rm -f $$TMPSH
+
+test64: all64
+ @TMP64=tmp64_$$; \
+ if echo hello world | ./minigzip64 | ./minigzip64 -d && ./example64 $$TMP64; then \
+ echo ' *** zlib 64-bit test OK ***'; \
+ else \
+ echo ' *** zlib 64-bit test FAILED ***'; false; \
+ fi; \
+ rm -f $$TMP64
+
+infcover.o: $(SRCDIR)test/infcover.c $(SRCDIR)zlib.h zconf.h
+ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/infcover.c
+
+infcover: infcover.o libz.a
+ $(CC) $(CFLAGS) -o $@ infcover.o libz.a
+
+cover: infcover
+ rm -f *.gcda
+ ./infcover
+ gcov inf*.c
+
+libz.a: $(OBJS)
+ $(AR) $(ARFLAGS) $@ $(OBJS)
+ -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
+
+match.o: match.S
+ $(CPP) match.S > _match.s
+ $(CC) -c _match.s
+ mv _match.o match.o
+ rm -f _match.s
+
+match.lo: match.S
+ $(CPP) match.S > _match.s
+ $(CC) -c -fPIC _match.s
+ mv _match.o match.lo
+ rm -f _match.s
+
+example.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h
+ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/example.c
+
+minigzip.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h
+ $(CC) $(CFLAGS) $(ZINCOUT) -c -o $@ $(SRCDIR)test/minigzip.c
+
+example64.o: $(SRCDIR)test/example.c $(SRCDIR)zlib.h zconf.h
+ $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/example.c
+
+minigzip64.o: $(SRCDIR)test/minigzip.c $(SRCDIR)zlib.h zconf.h
+ $(CC) $(CFLAGS) $(ZINCOUT) -D_FILE_OFFSET_BITS=64 -c -o $@ $(SRCDIR)test/minigzip.c
+
+
+adler32.o: $(SRCDIR)adler32.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)adler32.c
+
+crc32.o: $(SRCDIR)crc32.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)crc32.c
+
+deflate.o: $(SRCDIR)deflate.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)deflate.c
+
+infback.o: $(SRCDIR)infback.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)infback.c
+
+inffast.o: $(SRCDIR)inffast.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inffast.c
+
+inflate.o: $(SRCDIR)inflate.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inflate.c
+
+inftrees.o: $(SRCDIR)inftrees.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)inftrees.c
+
+trees.o: $(SRCDIR)trees.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)trees.c
+
+zutil.o: $(SRCDIR)zutil.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)zutil.c
+
+compress.o: $(SRCDIR)compress.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)compress.c
+
+uncompr.o: $(SRCDIR)uncompr.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)uncompr.c
+
+gzclose.o: $(SRCDIR)gzclose.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzclose.c
+
+gzlib.o: $(SRCDIR)gzlib.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzlib.c
+
+gzread.o: $(SRCDIR)gzread.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzread.c
+
+gzwrite.o: $(SRCDIR)gzwrite.c
+ $(CC) $(CFLAGS) $(ZINC) -c -o $@ $(SRCDIR)gzwrite.c
+
+
+adler32.lo: $(SRCDIR)adler32.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/adler32.o $(SRCDIR)adler32.c
+ -@mv objs/adler32.o $@
+
+crc32.lo: $(SRCDIR)crc32.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/crc32.o $(SRCDIR)crc32.c
+ -@mv objs/crc32.o $@
+
+deflate.lo: $(SRCDIR)deflate.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/deflate.o $(SRCDIR)deflate.c
+ -@mv objs/deflate.o $@
+
+infback.lo: $(SRCDIR)infback.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/infback.o $(SRCDIR)infback.c
+ -@mv objs/infback.o $@
+
+inffast.lo: $(SRCDIR)inffast.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inffast.o $(SRCDIR)inffast.c
+ -@mv objs/inffast.o $@
+
+inflate.lo: $(SRCDIR)inflate.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inflate.o $(SRCDIR)inflate.c
+ -@mv objs/inflate.o $@
+
+inftrees.lo: $(SRCDIR)inftrees.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/inftrees.o $(SRCDIR)inftrees.c
+ -@mv objs/inftrees.o $@
+
+trees.lo: $(SRCDIR)trees.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/trees.o $(SRCDIR)trees.c
+ -@mv objs/trees.o $@
+
+zutil.lo: $(SRCDIR)zutil.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/zutil.o $(SRCDIR)zutil.c
+ -@mv objs/zutil.o $@
+
+compress.lo: $(SRCDIR)compress.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/compress.o $(SRCDIR)compress.c
+ -@mv objs/compress.o $@
+
+uncompr.lo: $(SRCDIR)uncompr.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/uncompr.o $(SRCDIR)uncompr.c
+ -@mv objs/uncompr.o $@
+
+gzclose.lo: $(SRCDIR)gzclose.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzclose.o $(SRCDIR)gzclose.c
+ -@mv objs/gzclose.o $@
+
+gzlib.lo: $(SRCDIR)gzlib.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzlib.o $(SRCDIR)gzlib.c
+ -@mv objs/gzlib.o $@
+
+gzread.lo: $(SRCDIR)gzread.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzread.o $(SRCDIR)gzread.c
+ -@mv objs/gzread.o $@
+
+gzwrite.lo: $(SRCDIR)gzwrite.c
+ -@mkdir objs 2>/dev/null || test -d objs
+ $(CC) $(SFLAGS) $(ZINC) -DPIC -c -o objs/gzwrite.o $(SRCDIR)gzwrite.c
+ -@mv objs/gzwrite.o $@
+
+
+placebo $(SHAREDLIBV): $(PIC_OBJS) libz.a
+ $(LDSHARED) $(SFLAGS) -o $@ $(PIC_OBJS) $(LDSHAREDLIBC) $(LDFLAGS)
+ rm -f $(SHAREDLIB) $(SHAREDLIBM)
+ ln -s $@ $(SHAREDLIB)
+ ln -s $@ $(SHAREDLIBM)
+ -@rmdir objs
+
+example$(EXE): example.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ example.o $(TEST_LDFLAGS)
+
+minigzip$(EXE): minigzip.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ minigzip.o $(TEST_LDFLAGS)
+
+examplesh$(EXE): example.o $(SHAREDLIBV)
+ $(CC) $(CFLAGS) -o $@ example.o -L. $(SHAREDLIBV)
+
+minigzipsh$(EXE): minigzip.o $(SHAREDLIBV)
+ $(CC) $(CFLAGS) -o $@ minigzip.o -L. $(SHAREDLIBV)
+
+example64$(EXE): example64.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ example64.o $(TEST_LDFLAGS)
+
+minigzip64$(EXE): minigzip64.o $(STATICLIB)
+ $(CC) $(CFLAGS) -o $@ minigzip64.o $(TEST_LDFLAGS)
+
+install-libs: $(LIBS)
+ -@if [ ! -d $(DESTDIR)$(exec_prefix) ]; then mkdir -p $(DESTDIR)$(exec_prefix); fi
+ -@if [ ! -d $(DESTDIR)$(libdir) ]; then mkdir -p $(DESTDIR)$(libdir); fi
+ -@if [ ! -d $(DESTDIR)$(sharedlibdir) ]; then mkdir -p $(DESTDIR)$(sharedlibdir); fi
+ -@if [ ! -d $(DESTDIR)$(man3dir) ]; then mkdir -p $(DESTDIR)$(man3dir); fi
+ -@if [ ! -d $(DESTDIR)$(pkgconfigdir) ]; then mkdir -p $(DESTDIR)$(pkgconfigdir); fi
+ rm -f $(DESTDIR)$(libdir)/$(STATICLIB)
+ cp $(STATICLIB) $(DESTDIR)$(libdir)
+ chmod 644 $(DESTDIR)$(libdir)/$(STATICLIB)
+ -@($(RANLIB) $(DESTDIR)$(libdir)/libz.a || true) >/dev/null 2>&1
+ -@if test -n "$(SHAREDLIBV)"; then \
+ rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \
+ cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir); \
+ echo "cp $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)"; \
+ chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV); \
+ echo "chmod 755 $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBV)"; \
+ rm -f $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \
+ ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIB); \
+ ln -s $(SHAREDLIBV) $(DESTDIR)$(sharedlibdir)/$(SHAREDLIBM); \
+ ($(LDCONFIG) || true) >/dev/null 2>&1; \
+ fi
+ rm -f $(DESTDIR)$(man3dir)/zlib.3
+ cp $(SRCDIR)zlib.3 $(DESTDIR)$(man3dir)
+ chmod 644 $(DESTDIR)$(man3dir)/zlib.3
+ rm -f $(DESTDIR)$(pkgconfigdir)/zlib.pc
+ cp zlib.pc $(DESTDIR)$(pkgconfigdir)
+ chmod 644 $(DESTDIR)$(pkgconfigdir)/zlib.pc
+# The ranlib in install is needed on NeXTSTEP which checks file times
+# ldconfig is for Linux
+
+install: install-libs
+ -@if [ ! -d $(DESTDIR)$(includedir) ]; then mkdir -p $(DESTDIR)$(includedir); fi
+ rm -f $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
+ cp $(SRCDIR)zlib.h zconf.h $(DESTDIR)$(includedir)
+ chmod 644 $(DESTDIR)$(includedir)/zlib.h $(DESTDIR)$(includedir)/zconf.h
+
+uninstall:
+ cd $(DESTDIR)$(includedir) && rm -f zlib.h zconf.h
+ cd $(DESTDIR)$(libdir) && rm -f libz.a; \
+ if test -n "$(SHAREDLIBV)" -a -f $(SHAREDLIBV); then \
+ rm -f $(SHAREDLIBV) $(SHAREDLIB) $(SHAREDLIBM); \
+ fi
+ cd $(DESTDIR)$(man3dir) && rm -f zlib.3
+ cd $(DESTDIR)$(pkgconfigdir) && rm -f zlib.pc
+
+docs: zlib.3.pdf
+
+zlib.3.pdf: $(SRCDIR)zlib.3
+ groff -mandoc -f H -T ps $(SRCDIR)zlib.3 | ps2pdf - $@
+
+zconf.h.cmakein: $(SRCDIR)zconf.h.in
+ -@ TEMPFILE=zconfh_$$; \
+ echo "/#define ZCONF_H/ a\\\\\n#cmakedefine Z_PREFIX\\\\\n#cmakedefine Z_HAVE_UNISTD_H\n" >> $$TEMPFILE &&\
+ sed -f $$TEMPFILE $(SRCDIR)zconf.h.in > $@ &&\
+ touch -r $(SRCDIR)zconf.h.in $@ &&\
+ rm $$TEMPFILE
+
+zconf: $(SRCDIR)zconf.h.in
+ cp -p $(SRCDIR)zconf.h.in zconf.h
+
+mostlyclean: clean
+clean:
+ rm -f *.o *.lo *~ \
+ example$(EXE) minigzip$(EXE) examplesh$(EXE) minigzipsh$(EXE) \
+ example64$(EXE) minigzip64$(EXE) \
+ infcover \
+ libz.* foo.gz so_locations \
+ _match.s maketree contrib/infback9/*.o
+ rm -rf objs
+ rm -f *.gcda *.gcno *.gcov
+ rm -f contrib/infback9/*.gcda contrib/infback9/*.gcno contrib/infback9/*.gcov
+
+maintainer-clean: distclean
+distclean: clean zconf zconf.h.cmakein docs
+ rm -f Makefile zlib.pc configure.log
+ -@rm -f .DS_Store
+ @if [ -f Makefile.in ]; then \
+ printf 'all:\n\t-@echo "Please use ./configure first. Thank you."\n' > Makefile ; \
+ printf '\ndistclean:\n\tmake -f Makefile.in distclean\n' >> Makefile ; \
+ touch -r $(SRCDIR)Makefile.in Makefile ; fi
+ @if [ ! -f zconf.h.in ]; then rm -f zconf.h zconf.h.cmakein ; fi
+ @if [ ! -f zlib.3 ]; then rm -f zlib.3.pdf ; fi
+
+tags:
+ etags $(SRCDIR)*.[ch]
+
+adler32.o zutil.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
+gzclose.o gzlib.o gzread.o gzwrite.o: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h
+compress.o example.o minigzip.o uncompr.o: $(SRCDIR)zlib.h zconf.h
+crc32.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h
+deflate.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
+infback.o inflate.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h
+inffast.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h
+inftrees.o: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h
+trees.o: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h
+
+adler32.lo zutil.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
+gzclose.lo gzlib.lo gzread.lo gzwrite.lo: $(SRCDIR)zlib.h zconf.h $(SRCDIR)gzguts.h
+compress.lo example.lo minigzip.lo uncompr.lo: $(SRCDIR)zlib.h zconf.h
+crc32.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)crc32.h
+deflate.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h
+infback.lo inflate.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h $(SRCDIR)inffixed.h
+inffast.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h $(SRCDIR)inflate.h $(SRCDIR)inffast.h
+inftrees.lo: $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)inftrees.h
+trees.lo: $(SRCDIR)deflate.h $(SRCDIR)zutil.h $(SRCDIR)zlib.h zconf.h $(SRCDIR)trees.h
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/README b/src/boost/libs/beast/test/extern/zlib-1.2.11/README
new file mode 100644
index 000000000..51106de47
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/README
@@ -0,0 +1,115 @@
+ZLIB DATA COMPRESSION LIBRARY
+
+zlib 1.2.11 is a general purpose data compression library. All the code is
+thread safe. The data format used by the zlib library is described by RFCs
+(Request for Comments) 1950 to 1952 in the files
+http://tools.ietf.org/html/rfc1950 (zlib format), rfc1951 (deflate format) and
+rfc1952 (gzip format).
+
+All functions of the compression library are documented in the file zlib.h
+(volunteer to write man pages welcome, contact zlib@gzip.org). A usage example
+of the library is given in the file test/example.c which also tests that
+the library is working correctly. Another example is given in the file
+test/minigzip.c. The compression library itself is composed of all source
+files in the root directory.
+
+To compile all files and run the test program, follow the instructions given at
+the top of Makefile.in. In short "./configure; make test", and if that goes
+well, "make install" should work for most flavors of Unix. For Windows, use
+one of the special makefiles in win32/ or contrib/vstudio/ . For VMS, use
+make_vms.com.
+
+Questions about zlib should be sent to <zlib@gzip.org>, or to Gilles Vollant
+<info@winimage.com> for the Windows DLL version. The zlib home page is
+http://zlib.net/ . Before reporting a problem, please check this site to
+verify that you have the latest version of zlib; otherwise get the latest
+version and check whether the problem still exists or not.
+
+PLEASE read the zlib FAQ http://zlib.net/zlib_faq.html before asking for help.
+
+Mark Nelson <markn@ieee.org> wrote an article about zlib for the Jan. 1997
+issue of Dr. Dobb's Journal; a copy of the article is available at
+http://marknelson.us/1997/01/01/zlib-engine/ .
+
+The changes made in version 1.2.11 are documented in the file ChangeLog.
+
+Unsupported third party contributions are provided in directory contrib/ .
+
+zlib is available in Java using the java.util.zip package, documented at
+http://java.sun.com/developer/technicalArticles/Programming/compression/ .
+
+A Perl interface to zlib written by Paul Marquess <pmqs@cpan.org> is available
+at CPAN (Comprehensive Perl Archive Network) sites, including
+http://search.cpan.org/~pmqs/IO-Compress-Zlib/ .
+
+A Python interface to zlib written by A.M. Kuchling <amk@amk.ca> is
+available in Python 1.5 and later versions, see
+http://docs.python.org/library/zlib.html .
+
+zlib is built into tcl: http://wiki.tcl.tk/4610 .
+
+An experimental package to read and write files in .zip format, written on top
+of zlib by Gilles Vollant <info@winimage.com>, is available in the
+contrib/minizip directory of zlib.
+
+
+Notes for some targets:
+
+- For Windows DLL versions, please see win32/DLL_FAQ.txt
+
+- For 64-bit Irix, deflate.c must be compiled without any optimization. With
+ -O, one libpng test fails. The test works in 32 bit mode (with the -n32
+ compiler flag). The compiler bug has been reported to SGI.
+
+- zlib doesn't work with gcc 2.6.3 on a DEC 3000/300LX under OSF/1 2.1 it works
+ when compiled with cc.
+
+- On Digital Unix 4.0D (formely OSF/1) on AlphaServer, the cc option -std1 is
+ necessary to get gzprintf working correctly. This is done by configure.
+
+- zlib doesn't work on HP-UX 9.05 with some versions of /bin/cc. It works with
+ other compilers. Use "make test" to check your compiler.
+
+- gzdopen is not supported on RISCOS or BEOS.
+
+- For PalmOs, see http://palmzlib.sourceforge.net/
+
+
+Acknowledgments:
+
+ The deflate format used by zlib was defined by Phil Katz. The deflate and
+ zlib specifications were written by L. Peter Deutsch. Thanks to all the
+ people who reported problems and suggested various improvements in zlib; they
+ are too numerous to cite here.
+
+Copyright notice:
+
+ (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+If you use the zlib library in a product, we would appreciate *not* receiving
+lengthy legal documents to sign. The sources are provided for free but without
+warranty of any kind. The library has been entirely written by Jean-loup
+Gailly and Mark Adler; it does not include third-party code.
+
+If you redistribute modified sources, we would appreciate that you include in
+the file ChangeLog history information documenting your changes. Please read
+the FAQ for more information on the distribution of modified source versions.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/adler32.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/adler32.c
new file mode 100644
index 000000000..d0be4380a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/adler32.c
@@ -0,0 +1,186 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream
+ * Copyright (C) 1995-2011, 2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+
+local uLong adler32_combine_ OF((uLong adler1, uLong adler2, z_off64_t len2));
+
+#define BASE 65521U /* largest prime smaller than 65536 */
+#define NMAX 5552
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+
+#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
+#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf) DO8(buf,0); DO8(buf,8);
+
+/* use NO_DIVIDE if your processor does not do division in hardware --
+ try it both ways to see which is faster */
+#ifdef NO_DIVIDE
+/* note that this assumes BASE is 65521, where 65536 % 65521 == 15
+ (thank you to John Reiser for pointing this out) */
+# define CHOP(a) \
+ do { \
+ unsigned long tmp = a >> 16; \
+ a &= 0xffffUL; \
+ a += (tmp << 4) - tmp; \
+ } while (0)
+# define MOD28(a) \
+ do { \
+ CHOP(a); \
+ if (a >= BASE) a -= BASE; \
+ } while (0)
+# define MOD(a) \
+ do { \
+ CHOP(a); \
+ MOD28(a); \
+ } while (0)
+# define MOD63(a) \
+ do { /* this assumes a is not negative */ \
+ z_off64_t tmp = a >> 32; \
+ a &= 0xffffffffL; \
+ a += (tmp << 8) - (tmp << 5) + tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
+ tmp = a >> 16; \
+ a &= 0xffffL; \
+ a += (tmp << 4) - tmp; \
+ if (a >= BASE) a -= BASE; \
+ } while (0)
+#else
+# define MOD(a) a %= BASE
+# define MOD28(a) a %= BASE
+# define MOD63(a) a %= BASE
+#endif
+
+/* ========================================================================= */
+uLong ZEXPORT adler32_z(adler, buf, len)
+ uLong adler;
+ const Bytef *buf;
+ z_size_t len;
+{
+ unsigned long sum2;
+ unsigned n;
+
+ /* split Adler-32 into component sums */
+ sum2 = (adler >> 16) & 0xffff;
+ adler &= 0xffff;
+
+ /* in case user likes doing a byte at a time, keep it fast */
+ if (len == 1) {
+ adler += buf[0];
+ if (adler >= BASE)
+ adler -= BASE;
+ sum2 += adler;
+ if (sum2 >= BASE)
+ sum2 -= BASE;
+ return adler | (sum2 << 16);
+ }
+
+ /* initial Adler-32 value (deferred check for len == 1 speed) */
+ if (buf == Z_NULL)
+ return 1L;
+
+ /* in case short lengths are provided, keep it somewhat fast */
+ if (len < 16) {
+ while (len--) {
+ adler += *buf++;
+ sum2 += adler;
+ }
+ if (adler >= BASE)
+ adler -= BASE;
+ MOD28(sum2); /* only added so many BASE's */
+ return adler | (sum2 << 16);
+ }
+
+ /* do length NMAX blocks -- requires just one modulo operation */
+ while (len >= NMAX) {
+ len -= NMAX;
+ n = NMAX / 16; /* NMAX is divisible by 16 */
+ do {
+ DO16(buf); /* 16 sums unrolled */
+ buf += 16;
+ } while (--n);
+ MOD(adler);
+ MOD(sum2);
+ }
+
+ /* do remaining bytes (less than NMAX, still just one modulo) */
+ if (len) { /* avoid modulos if none remaining */
+ while (len >= 16) {
+ len -= 16;
+ DO16(buf);
+ buf += 16;
+ }
+ while (len--) {
+ adler += *buf++;
+ sum2 += adler;
+ }
+ MOD(adler);
+ MOD(sum2);
+ }
+
+ /* return recombined sums */
+ return adler | (sum2 << 16);
+}
+
+/* ========================================================================= */
+uLong ZEXPORT adler32(adler, buf, len)
+ uLong adler;
+ const Bytef *buf;
+ uInt len;
+{
+ return adler32_z(adler, buf, len);
+}
+
+/* ========================================================================= */
+local uLong adler32_combine_(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off64_t len2;
+{
+ unsigned long sum1;
+ unsigned long sum2;
+ unsigned rem;
+
+ /* for negative len, return invalid adler32 as a clue for debugging */
+ if (len2 < 0)
+ return 0xffffffffUL;
+
+ /* the derivation of this formula is left as an exercise for the reader */
+ MOD63(len2); /* assumes len2 >= 0 */
+ rem = (unsigned)len2;
+ sum1 = adler1 & 0xffff;
+ sum2 = rem * sum1;
+ MOD(sum2);
+ sum1 += (adler2 & 0xffff) + BASE - 1;
+ sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum1 >= BASE) sum1 -= BASE;
+ if (sum2 >= ((unsigned long)BASE << 1)) sum2 -= ((unsigned long)BASE << 1);
+ if (sum2 >= BASE) sum2 -= BASE;
+ return sum1 | (sum2 << 16);
+}
+
+/* ========================================================================= */
+uLong ZEXPORT adler32_combine(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off_t len2;
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
+
+uLong ZEXPORT adler32_combine64(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off64_t len2;
+{
+ return adler32_combine_(adler1, adler2, len2);
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.pup b/src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.pup
new file mode 100644
index 000000000..8940c120f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.pup
@@ -0,0 +1,69 @@
+# Amiga powerUP (TM) Makefile
+# makefile for libpng and SAS C V6.58/7.00 PPC compiler
+# Copyright (C) 1998 by Andreas R. Kleinert
+
+LIBNAME = libzip.a
+
+CC = scppc
+CFLAGS = NOSTKCHK NOSINT OPTIMIZE OPTGO OPTPEEP OPTINLOCAL OPTINL \
+ OPTLOOP OPTRDEP=8 OPTDEP=8 OPTCOMP=8 NOVER
+AR = ppc-amigaos-ar cr
+RANLIB = ppc-amigaos-ranlib
+LD = ppc-amigaos-ld -r
+LDFLAGS = -o
+LDLIBS = LIB:scppc.a LIB:end.o
+RM = delete quiet
+
+OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \
+ uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example minigzip
+
+check: test
+test: all
+ example
+ echo hello world | minigzip | minigzip -d
+
+$(LIBNAME): $(OBJS)
+ $(AR) $@ $(OBJS)
+ -$(RANLIB) $@
+
+example: example.o $(LIBNAME)
+ $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS)
+
+minigzip: minigzip.o $(LIBNAME)
+ $(LD) $(LDFLAGS) $@ LIB:c_ppc.o $@.o $(LIBNAME) $(LDLIBS)
+
+mostlyclean: clean
+clean:
+ $(RM) *.o example minigzip $(LIBNAME) foo.gz
+
+zip:
+ zip -ul9 zlib README ChangeLog Makefile Make????.??? Makefile.?? \
+ descrip.mms *.[ch]
+
+tgz:
+ cd ..; tar cfz zlib/zlib.tgz zlib/README zlib/ChangeLog zlib/Makefile \
+ zlib/Make????.??? zlib/Makefile.?? zlib/descrip.mms zlib/*.[ch]
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+adler32.o: zlib.h zconf.h
+compress.o: zlib.h zconf.h
+crc32.o: crc32.h zlib.h zconf.h
+deflate.o: deflate.h zutil.h zlib.h zconf.h
+example.o: zlib.h zconf.h
+gzclose.o: zlib.h zconf.h gzguts.h
+gzlib.o: zlib.h zconf.h gzguts.h
+gzread.o: zlib.h zconf.h gzguts.h
+gzwrite.o: zlib.h zconf.h gzguts.h
+inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
+inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
+infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
+inftrees.o: zutil.h zlib.h zconf.h inftrees.h
+minigzip.o: zlib.h zconf.h
+trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
+uncompr.o: zlib.h zconf.h
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.sas b/src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.sas
new file mode 100644
index 000000000..749e29152
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/amiga/Makefile.sas
@@ -0,0 +1,68 @@
+# SMakefile for zlib
+# Modified from the standard UNIX Makefile Copyright Jean-loup Gailly
+# Osma Ahvenlampi <Osma.Ahvenlampi@hut.fi>
+# Amiga, SAS/C 6.56 & Smake
+
+CC=sc
+CFLAGS=OPT
+#CFLAGS=OPT CPU=68030
+#CFLAGS=DEBUG=LINE
+LDFLAGS=LIB z.lib
+
+SCOPTIONS=OPTSCHED OPTINLINE OPTALIAS OPTTIME OPTINLOCAL STRMERGE \
+ NOICONS PARMS=BOTH NOSTACKCHECK UTILLIB NOVERSION ERRORREXX \
+ DEF=POSTINC
+
+OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \
+ uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: SCOPTIONS example minigzip
+
+check: test
+test: all
+ example
+ echo hello world | minigzip | minigzip -d
+
+install: z.lib
+ copy clone zlib.h zconf.h INCLUDE:
+ copy clone z.lib LIB:
+
+z.lib: $(OBJS)
+ oml z.lib r $(OBJS)
+
+example: example.o z.lib
+ $(CC) $(CFLAGS) LINK TO $@ example.o $(LDFLAGS)
+
+minigzip: minigzip.o z.lib
+ $(CC) $(CFLAGS) LINK TO $@ minigzip.o $(LDFLAGS)
+
+mostlyclean: clean
+clean:
+ -delete force quiet example minigzip *.o z.lib foo.gz *.lnk SCOPTIONS
+
+SCOPTIONS: Makefile.sas
+ copy to $@ <from <
+$(SCOPTIONS)
+<
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+adler32.o: zlib.h zconf.h
+compress.o: zlib.h zconf.h
+crc32.o: crc32.h zlib.h zconf.h
+deflate.o: deflate.h zutil.h zlib.h zconf.h
+example.o: zlib.h zconf.h
+gzclose.o: zlib.h zconf.h gzguts.h
+gzlib.o: zlib.h zconf.h gzguts.h
+gzread.o: zlib.h zconf.h gzguts.h
+gzwrite.o: zlib.h zconf.h gzguts.h
+inffast.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
+inflate.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
+infback.o: zutil.h zlib.h zconf.h inftrees.h inflate.h inffast.h
+inftrees.o: zutil.h zlib.h zconf.h inftrees.h
+minigzip.o: zlib.h zconf.h
+trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
+uncompr.o: zlib.h zconf.h
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/compress.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/compress.c
new file mode 100644
index 000000000..e2db404ab
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/compress.c
@@ -0,0 +1,86 @@
+/* compress.c -- compress a memory buffer
+ * Copyright (C) 1995-2005, 2014, 2016 Jean-loup Gailly, Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+/* ===========================================================================
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least 0.1% larger than sourceLen plus
+ 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+int ZEXPORT compress2 (dest, destLen, source, sourceLen, level)
+ Bytef *dest;
+ uLongf *destLen;
+ const Bytef *source;
+ uLong sourceLen;
+ int level;
+{
+ z_stream stream;
+ int err;
+ const uInt max = (uInt)-1;
+ uLong left;
+
+ left = *destLen;
+ *destLen = 0;
+
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+ stream.opaque = (voidpf)0;
+
+ err = deflateInit(&stream, level);
+ if (err != Z_OK) return err;
+
+ stream.next_out = dest;
+ stream.avail_out = 0;
+ stream.next_in = (z_const Bytef *)source;
+ stream.avail_in = 0;
+
+ do {
+ if (stream.avail_out == 0) {
+ stream.avail_out = left > (uLong)max ? max : (uInt)left;
+ left -= stream.avail_out;
+ }
+ if (stream.avail_in == 0) {
+ stream.avail_in = sourceLen > (uLong)max ? max : (uInt)sourceLen;
+ sourceLen -= stream.avail_in;
+ }
+ err = deflate(&stream, sourceLen ? Z_NO_FLUSH : Z_FINISH);
+ } while (err == Z_OK);
+
+ *destLen = stream.total_out;
+ deflateEnd(&stream);
+ return err == Z_STREAM_END ? Z_OK : err;
+}
+
+/* ===========================================================================
+ */
+int ZEXPORT compress (dest, destLen, source, sourceLen)
+ Bytef *dest;
+ uLongf *destLen;
+ const Bytef *source;
+ uLong sourceLen;
+{
+ return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
+}
+
+/* ===========================================================================
+ If the default memLevel or windowBits for deflateInit() is changed, then
+ this function needs to be updated.
+ */
+uLong ZEXPORT compressBound (sourceLen)
+ uLong sourceLen;
+{
+ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/configure b/src/boost/libs/beast/test/extern/zlib-1.2.11/configure
new file mode 100644
index 000000000..e974d1fd7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/configure
@@ -0,0 +1,921 @@
+#!/bin/sh
+# configure script for zlib.
+#
+# Normally configure builds both a static and a shared library.
+# If you want to build just a static library, use: ./configure --static
+#
+# To impose specific compiler or flags or install directory, use for example:
+# prefix=$HOME CC=cc CFLAGS="-O4" ./configure
+# or for csh/tcsh users:
+# (setenv prefix $HOME; setenv CC cc; setenv CFLAGS "-O4"; ./configure)
+
+# Incorrect settings of CC or CFLAGS may prevent creating a shared library.
+# If you have problems, try without defining CC and CFLAGS before reporting
+# an error.
+
+# start off configure.log
+echo -------------------- >> configure.log
+echo $0 $* >> configure.log
+date >> configure.log
+
+# get source directory
+SRCDIR=`dirname $0`
+if test $SRCDIR = "."; then
+ ZINC=""
+ ZINCOUT="-I."
+ SRCDIR=""
+else
+ ZINC='-include zconf.h'
+ ZINCOUT='-I. -I$(SRCDIR)'
+ SRCDIR="$SRCDIR/"
+fi
+
+# set command prefix for cross-compilation
+if [ -n "${CHOST}" ]; then
+ uname="`echo "${CHOST}" | sed -e 's/^[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)$/\1/' -e 's/^[^-]*-[^-]*-\([^-]*\)-.*$/\1/'`"
+ CROSS_PREFIX="${CHOST}-"
+fi
+
+# destination name for static library
+STATICLIB=libz.a
+
+# extract zlib version numbers from zlib.h
+VER=`sed -n -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < ${SRCDIR}zlib.h`
+VER3=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\\.[0-9]*\).*/\1/p' < ${SRCDIR}zlib.h`
+VER2=`sed -n -e '/VERSION "/s/.*"\([0-9]*\\.[0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h`
+VER1=`sed -n -e '/VERSION "/s/.*"\([0-9]*\)\\..*/\1/p' < ${SRCDIR}zlib.h`
+
+# establish commands for library building
+if "${CROSS_PREFIX}ar" --version >/dev/null 2>/dev/null || test $? -lt 126; then
+ AR=${AR-"${CROSS_PREFIX}ar"}
+ test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log
+else
+ AR=${AR-"ar"}
+ test -n "${CROSS_PREFIX}" && echo Using ${AR} | tee -a configure.log
+fi
+ARFLAGS=${ARFLAGS-"rc"}
+if "${CROSS_PREFIX}ranlib" --version >/dev/null 2>/dev/null || test $? -lt 126; then
+ RANLIB=${RANLIB-"${CROSS_PREFIX}ranlib"}
+ test -n "${CROSS_PREFIX}" && echo Using ${RANLIB} | tee -a configure.log
+else
+ RANLIB=${RANLIB-"ranlib"}
+fi
+if "${CROSS_PREFIX}nm" --version >/dev/null 2>/dev/null || test $? -lt 126; then
+ NM=${NM-"${CROSS_PREFIX}nm"}
+ test -n "${CROSS_PREFIX}" && echo Using ${NM} | tee -a configure.log
+else
+ NM=${NM-"nm"}
+fi
+
+# set defaults before processing command line options
+LDCONFIG=${LDCONFIG-"ldconfig"}
+LDSHAREDLIBC="${LDSHAREDLIBC--lc}"
+ARCHS=
+prefix=${prefix-/usr/local}
+exec_prefix=${exec_prefix-'${prefix}'}
+libdir=${libdir-'${exec_prefix}/lib'}
+sharedlibdir=${sharedlibdir-'${libdir}'}
+includedir=${includedir-'${prefix}/include'}
+mandir=${mandir-'${prefix}/share/man'}
+shared_ext='.so'
+shared=1
+solo=0
+cover=0
+zprefix=0
+zconst=0
+build64=0
+gcc=0
+warn=0
+debug=0
+old_cc="$CC"
+old_cflags="$CFLAGS"
+OBJC='$(OBJZ) $(OBJG)'
+PIC_OBJC='$(PIC_OBJZ) $(PIC_OBJG)'
+
+# leave this script, optionally in a bad way
+leave()
+{
+ if test "$*" != "0"; then
+ echo "** $0 aborting." | tee -a configure.log
+ fi
+ rm -f $test.[co] $test $test$shared_ext $test.gcno ./--version
+ echo -------------------- >> configure.log
+ echo >> configure.log
+ echo >> configure.log
+ exit $1
+}
+
+# process command line options
+while test $# -ge 1
+do
+case "$1" in
+ -h* | --help)
+ echo 'usage:' | tee -a configure.log
+ echo ' configure [--const] [--zprefix] [--prefix=PREFIX] [--eprefix=EXPREFIX]' | tee -a configure.log
+ echo ' [--static] [--64] [--libdir=LIBDIR] [--sharedlibdir=LIBDIR]' | tee -a configure.log
+ echo ' [--includedir=INCLUDEDIR] [--archs="-arch i386 -arch x86_64"]' | tee -a configure.log
+ exit 0 ;;
+ -p*=* | --prefix=*) prefix=`echo $1 | sed 's/.*=//'`; shift ;;
+ -e*=* | --eprefix=*) exec_prefix=`echo $1 | sed 's/.*=//'`; shift ;;
+ -l*=* | --libdir=*) libdir=`echo $1 | sed 's/.*=//'`; shift ;;
+ --sharedlibdir=*) sharedlibdir=`echo $1 | sed 's/.*=//'`; shift ;;
+ -i*=* | --includedir=*) includedir=`echo $1 | sed 's/.*=//'`;shift ;;
+ -u*=* | --uname=*) uname=`echo $1 | sed 's/.*=//'`;shift ;;
+ -p* | --prefix) prefix="$2"; shift; shift ;;
+ -e* | --eprefix) exec_prefix="$2"; shift; shift ;;
+ -l* | --libdir) libdir="$2"; shift; shift ;;
+ -i* | --includedir) includedir="$2"; shift; shift ;;
+ -s* | --shared | --enable-shared) shared=1; shift ;;
+ -t | --static) shared=0; shift ;;
+ --solo) solo=1; shift ;;
+ --cover) cover=1; shift ;;
+ -z* | --zprefix) zprefix=1; shift ;;
+ -6* | --64) build64=1; shift ;;
+ -a*=* | --archs=*) ARCHS=`echo $1 | sed 's/.*=//'`; shift ;;
+ --sysconfdir=*) echo "ignored option: --sysconfdir" | tee -a configure.log; shift ;;
+ --localstatedir=*) echo "ignored option: --localstatedir" | tee -a configure.log; shift ;;
+ -c* | --const) zconst=1; shift ;;
+ -w* | --warn) warn=1; shift ;;
+ -d* | --debug) debug=1; shift ;;
+ *)
+ echo "unknown option: $1" | tee -a configure.log
+ echo "$0 --help for help" | tee -a configure.log
+ leave 1;;
+ esac
+done
+
+# temporary file name
+test=ztest$$
+
+# put arguments in log, also put test file in log if used in arguments
+show()
+{
+ case "$*" in
+ *$test.c*)
+ echo === $test.c === >> configure.log
+ cat $test.c >> configure.log
+ echo === >> configure.log;;
+ esac
+ echo $* >> configure.log
+}
+
+# check for gcc vs. cc and set compile and link flags based on the system identified by uname
+cat > $test.c <<EOF
+extern int getchar();
+int hello() {return getchar();}
+EOF
+
+test -z "$CC" && echo Checking for ${CROSS_PREFIX}gcc... | tee -a configure.log
+cc=${CC-${CROSS_PREFIX}gcc}
+cflags=${CFLAGS-"-O3"}
+# to force the asm version use: CFLAGS="-O3 -DASMV" ./configure
+case "$cc" in
+ *gcc*) gcc=1 ;;
+ *clang*) gcc=1 ;;
+esac
+case `$cc -v 2>&1` in
+ *gcc*) gcc=1 ;;
+ *clang*) gcc=1 ;;
+esac
+
+show $cc -c $test.c
+if test "$gcc" -eq 1 && ($cc -c $test.c) >> configure.log 2>&1; then
+ echo ... using gcc >> configure.log
+ CC="$cc"
+ CFLAGS="${CFLAGS--O3}"
+ SFLAGS="${CFLAGS--O3} -fPIC"
+ if test "$ARCHS"; then
+ CFLAGS="${CFLAGS} ${ARCHS}"
+ LDFLAGS="${LDFLAGS} ${ARCHS}"
+ fi
+ if test $build64 -eq 1; then
+ CFLAGS="${CFLAGS} -m64"
+ SFLAGS="${SFLAGS} -m64"
+ fi
+ if test "$warn" -eq 1; then
+ if test "$zconst" -eq 1; then
+ CFLAGS="${CFLAGS} -Wall -Wextra -Wcast-qual -pedantic -DZLIB_CONST"
+ else
+ CFLAGS="${CFLAGS} -Wall -Wextra -pedantic"
+ fi
+ fi
+ if test $debug -eq 1; then
+ CFLAGS="${CFLAGS} -DZLIB_DEBUG"
+ SFLAGS="${SFLAGS} -DZLIB_DEBUG"
+ fi
+ if test -z "$uname"; then
+ uname=`(uname -s || echo unknown) 2>/dev/null`
+ fi
+ case "$uname" in
+ Linux* | linux* | GNU | GNU/* | solaris*)
+ LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"} ;;
+ *BSD | *bsd* | DragonFly)
+ LDSHARED=${LDSHARED-"$cc -shared -Wl,-soname,libz.so.1,--version-script,${SRCDIR}zlib.map"}
+ LDCONFIG="ldconfig -m" ;;
+ CYGWIN* | Cygwin* | cygwin* | OS/2*)
+ EXE='.exe' ;;
+ MINGW* | mingw*)
+# temporary bypass
+ rm -f $test.[co] $test $test$shared_ext
+ echo "Please use win32/Makefile.gcc instead." | tee -a configure.log
+ leave 1
+ LDSHARED=${LDSHARED-"$cc -shared"}
+ LDSHAREDLIBC=""
+ EXE='.exe' ;;
+ QNX*) # This is for QNX6. I suppose that the QNX rule below is for QNX2,QNX4
+ # (alain.bonnefoy@icbt.com)
+ LDSHARED=${LDSHARED-"$cc -shared -Wl,-hlibz.so.1"} ;;
+ HP-UX*)
+ LDSHARED=${LDSHARED-"$cc -shared $SFLAGS"}
+ case `(uname -m || echo unknown) 2>/dev/null` in
+ ia64)
+ shared_ext='.so'
+ SHAREDLIB='libz.so' ;;
+ *)
+ shared_ext='.sl'
+ SHAREDLIB='libz.sl' ;;
+ esac ;;
+ Darwin* | darwin*)
+ shared_ext='.dylib'
+ SHAREDLIB=libz$shared_ext
+ SHAREDLIBV=libz.$VER$shared_ext
+ SHAREDLIBM=libz.$VER1$shared_ext
+ LDSHARED=${LDSHARED-"$cc -dynamiclib -install_name $libdir/$SHAREDLIBM -compatibility_version $VER1 -current_version $VER3"}
+ if libtool -V 2>&1 | grep Apple > /dev/null; then
+ AR="libtool"
+ else
+ AR="/usr/bin/libtool"
+ fi
+ ARFLAGS="-o" ;;
+ *) LDSHARED=${LDSHARED-"$cc -shared"} ;;
+ esac
+else
+ # find system name and corresponding cc options
+ CC=${CC-cc}
+ gcc=0
+ echo ... using $CC >> configure.log
+ if test -z "$uname"; then
+ uname=`(uname -sr || echo unknown) 2>/dev/null`
+ fi
+ case "$uname" in
+ HP-UX*) SFLAGS=${CFLAGS-"-O +z"}
+ CFLAGS=${CFLAGS-"-O"}
+# LDSHARED=${LDSHARED-"ld -b +vnocompatwarnings"}
+ LDSHARED=${LDSHARED-"ld -b"}
+ case `(uname -m || echo unknown) 2>/dev/null` in
+ ia64)
+ shared_ext='.so'
+ SHAREDLIB='libz.so' ;;
+ *)
+ shared_ext='.sl'
+ SHAREDLIB='libz.sl' ;;
+ esac ;;
+ IRIX*) SFLAGS=${CFLAGS-"-ansi -O2 -rpath ."}
+ CFLAGS=${CFLAGS-"-ansi -O2"}
+ LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;
+ OSF1\ V4*) SFLAGS=${CFLAGS-"-O -std1"}
+ CFLAGS=${CFLAGS-"-O -std1"}
+ LDFLAGS="${LDFLAGS} -Wl,-rpath,."
+ LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so -Wl,-msym -Wl,-rpath,$(libdir) -Wl,-set_version,${VER}:1.0"} ;;
+ OSF1*) SFLAGS=${CFLAGS-"-O -std1"}
+ CFLAGS=${CFLAGS-"-O -std1"}
+ LDSHARED=${LDSHARED-"cc -shared -Wl,-soname,libz.so.1"} ;;
+ QNX*) SFLAGS=${CFLAGS-"-4 -O"}
+ CFLAGS=${CFLAGS-"-4 -O"}
+ LDSHARED=${LDSHARED-"cc"}
+ RANLIB=${RANLIB-"true"}
+ AR="cc"
+ ARFLAGS="-A" ;;
+ SCO_SV\ 3.2*) SFLAGS=${CFLAGS-"-O3 -dy -KPIC "}
+ CFLAGS=${CFLAGS-"-O3"}
+ LDSHARED=${LDSHARED-"cc -dy -KPIC -G"} ;;
+ SunOS\ 5* | solaris*)
+ LDSHARED=${LDSHARED-"cc -G -h libz$shared_ext.$VER1"}
+ SFLAGS=${CFLAGS-"-fast -KPIC"}
+ CFLAGS=${CFLAGS-"-fast"}
+ if test $build64 -eq 1; then
+ # old versions of SunPRO/Workshop/Studio don't support -m64,
+ # but newer ones do. Check for it.
+ flag64=`$CC -flags | egrep -- '^-m64'`
+ if test x"$flag64" != x"" ; then
+ CFLAGS="${CFLAGS} -m64"
+ SFLAGS="${SFLAGS} -m64"
+ else
+ case `(uname -m || echo unknown) 2>/dev/null` in
+ i86*)
+ SFLAGS="$SFLAGS -xarch=amd64"
+ CFLAGS="$CFLAGS -xarch=amd64" ;;
+ *)
+ SFLAGS="$SFLAGS -xarch=v9"
+ CFLAGS="$CFLAGS -xarch=v9" ;;
+ esac
+ fi
+ fi
+ if test -n "$ZINC"; then
+ ZINC='-I- -I. -I$(SRCDIR)'
+ fi
+ ;;
+ SunOS\ 4*) SFLAGS=${CFLAGS-"-O2 -PIC"}
+ CFLAGS=${CFLAGS-"-O2"}
+ LDSHARED=${LDSHARED-"ld"} ;;
+ SunStudio\ 9*) SFLAGS=${CFLAGS-"-fast -xcode=pic32 -xtarget=ultra3 -xarch=v9b"}
+ CFLAGS=${CFLAGS-"-fast -xtarget=ultra3 -xarch=v9b"}
+ LDSHARED=${LDSHARED-"cc -xarch=v9b"} ;;
+ UNIX_System_V\ 4.2.0)
+ SFLAGS=${CFLAGS-"-KPIC -O"}
+ CFLAGS=${CFLAGS-"-O"}
+ LDSHARED=${LDSHARED-"cc -G"} ;;
+ UNIX_SV\ 4.2MP)
+ SFLAGS=${CFLAGS-"-Kconform_pic -O"}
+ CFLAGS=${CFLAGS-"-O"}
+ LDSHARED=${LDSHARED-"cc -G"} ;;
+ OpenUNIX\ 5)
+ SFLAGS=${CFLAGS-"-KPIC -O"}
+ CFLAGS=${CFLAGS-"-O"}
+ LDSHARED=${LDSHARED-"cc -G"} ;;
+ AIX*) # Courtesy of dbakker@arrayasolutions.com
+ SFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
+ CFLAGS=${CFLAGS-"-O -qmaxmem=8192"}
+ LDSHARED=${LDSHARED-"xlc -G"} ;;
+ # send working options for other systems to zlib@gzip.org
+ *) SFLAGS=${CFLAGS-"-O"}
+ CFLAGS=${CFLAGS-"-O"}
+ LDSHARED=${LDSHARED-"cc -shared"} ;;
+ esac
+fi
+
+# destination names for shared library if not defined above
+SHAREDLIB=${SHAREDLIB-"libz$shared_ext"}
+SHAREDLIBV=${SHAREDLIBV-"libz$shared_ext.$VER"}
+SHAREDLIBM=${SHAREDLIBM-"libz$shared_ext.$VER1"}
+
+echo >> configure.log
+
+# define functions for testing compiler and library characteristics and logging the results
+
+cat > $test.c <<EOF
+#error error
+EOF
+if ($CC -c $CFLAGS $test.c) 2>/dev/null; then
+ try()
+ {
+ show $*
+ test "`( $* ) 2>&1 | tee -a configure.log`" = ""
+ }
+ echo - using any output from compiler to indicate an error >> configure.log
+else
+ try()
+ {
+ show $*
+ ( $* ) >> configure.log 2>&1
+ ret=$?
+ if test $ret -ne 0; then
+ echo "(exit code "$ret")" >> configure.log
+ fi
+ return $ret
+ }
+fi
+
+tryboth()
+{
+ show $*
+ got=`( $* ) 2>&1`
+ ret=$?
+ printf %s "$got" >> configure.log
+ if test $ret -ne 0; then
+ return $ret
+ fi
+ test "$got" = ""
+}
+
+cat > $test.c << EOF
+int foo() { return 0; }
+EOF
+echo "Checking for obsessive-compulsive compiler options..." >> configure.log
+if try $CC -c $CFLAGS $test.c; then
+ :
+else
+ echo "Compiler error reporting is too harsh for $0 (perhaps remove -Werror)." | tee -a configure.log
+ leave 1
+fi
+
+echo >> configure.log
+
+# see if shared library build supported
+cat > $test.c <<EOF
+extern int getchar();
+int hello() {return getchar();}
+EOF
+if test $shared -eq 1; then
+ echo Checking for shared library support... | tee -a configure.log
+ # we must test in two steps (cc then ld), required at least on SunOS 4.x
+ if try $CC -w -c $SFLAGS $test.c &&
+ try $LDSHARED $SFLAGS -o $test$shared_ext $test.o; then
+ echo Building shared library $SHAREDLIBV with $CC. | tee -a configure.log
+ elif test -z "$old_cc" -a -z "$old_cflags"; then
+ echo No shared library support. | tee -a configure.log
+ shared=0;
+ else
+ echo 'No shared library support; try without defining CC and CFLAGS' | tee -a configure.log
+ shared=0;
+ fi
+fi
+if test $shared -eq 0; then
+ LDSHARED="$CC"
+ ALL="static"
+ TEST="all teststatic"
+ SHAREDLIB=""
+ SHAREDLIBV=""
+ SHAREDLIBM=""
+ echo Building static library $STATICLIB version $VER with $CC. | tee -a configure.log
+else
+ ALL="static shared"
+ TEST="all teststatic testshared"
+fi
+
+# check for underscores in external names for use by assembler code
+CPP=${CPP-"$CC -E"}
+case $CFLAGS in
+ *ASMV*)
+ echo >> configure.log
+ show "$NM $test.o | grep _hello"
+ if test "`$NM $test.o | grep _hello | tee -a configure.log`" = ""; then
+ CPP="$CPP -DNO_UNDERLINE"
+ echo Checking for underline in external names... No. | tee -a configure.log
+ else
+ echo Checking for underline in external names... Yes. | tee -a configure.log
+ fi ;;
+esac
+
+echo >> configure.log
+
+# check for size_t
+cat > $test.c <<EOF
+#include <stdio.h>
+#include <stdlib.h>
+size_t dummy = 0;
+EOF
+if try $CC -c $CFLAGS $test.c; then
+ echo "Checking for size_t... Yes." | tee -a configure.log
+ need_sizet=0
+else
+ echo "Checking for size_t... No." | tee -a configure.log
+ need_sizet=1
+fi
+
+echo >> configure.log
+
+# find the size_t integer type, if needed
+if test $need_sizet -eq 1; then
+ cat > $test.c <<EOF
+long long dummy = 0;
+EOF
+ if try $CC -c $CFLAGS $test.c; then
+ echo "Checking for long long... Yes." | tee -a configure.log
+ cat > $test.c <<EOF
+#include <stdio.h>
+int main(void) {
+ if (sizeof(void *) <= sizeof(int)) puts("int");
+ else if (sizeof(void *) <= sizeof(long)) puts("long");
+ else puts("z_longlong");
+ return 0;
+}
+EOF
+ else
+ echo "Checking for long long... No." | tee -a configure.log
+ cat > $test.c <<EOF
+#include <stdio.h>
+int main(void) {
+ if (sizeof(void *) <= sizeof(int)) puts("int");
+ else puts("long");
+ return 0;
+}
+EOF
+ fi
+ if try $CC $CFLAGS -o $test $test.c; then
+ sizet=`./$test`
+ echo "Checking for a pointer-size integer type..." $sizet"." | tee -a configure.log
+ else
+ echo "Failed to find a pointer-size integer type." | tee -a configure.log
+ leave 1
+ fi
+fi
+
+if test $need_sizet -eq 1; then
+ CFLAGS="${CFLAGS} -DNO_SIZE_T=${sizet}"
+ SFLAGS="${SFLAGS} -DNO_SIZE_T=${sizet}"
+fi
+
+echo >> configure.log
+
+# check for large file support, and if none, check for fseeko()
+cat > $test.c <<EOF
+#include <sys/types.h>
+off64_t dummy = 0;
+EOF
+if try $CC -c $CFLAGS -D_LARGEFILE64_SOURCE=1 $test.c; then
+ CFLAGS="${CFLAGS} -D_LARGEFILE64_SOURCE=1"
+ SFLAGS="${SFLAGS} -D_LARGEFILE64_SOURCE=1"
+ ALL="${ALL} all64"
+ TEST="${TEST} test64"
+ echo "Checking for off64_t... Yes." | tee -a configure.log
+ echo "Checking for fseeko... Yes." | tee -a configure.log
+else
+ echo "Checking for off64_t... No." | tee -a configure.log
+ echo >> configure.log
+ cat > $test.c <<EOF
+#include <stdio.h>
+int main(void) {
+ fseeko(NULL, 0, 0);
+ return 0;
+}
+EOF
+ if try $CC $CFLAGS -o $test $test.c; then
+ echo "Checking for fseeko... Yes." | tee -a configure.log
+ else
+ CFLAGS="${CFLAGS} -DNO_FSEEKO"
+ SFLAGS="${SFLAGS} -DNO_FSEEKO"
+ echo "Checking for fseeko... No." | tee -a configure.log
+ fi
+fi
+
+echo >> configure.log
+
+# check for strerror() for use by gz* functions
+cat > $test.c <<EOF
+#include <string.h>
+#include <errno.h>
+int main() { return strlen(strerror(errno)); }
+EOF
+if try $CC $CFLAGS -o $test $test.c; then
+ echo "Checking for strerror... Yes." | tee -a configure.log
+else
+ CFLAGS="${CFLAGS} -DNO_STRERROR"
+ SFLAGS="${SFLAGS} -DNO_STRERROR"
+ echo "Checking for strerror... No." | tee -a configure.log
+fi
+
+# copy clean zconf.h for subsequent edits
+cp -p ${SRCDIR}zconf.h.in zconf.h
+
+echo >> configure.log
+
+# check for unistd.h and save result in zconf.h
+cat > $test.c <<EOF
+#include <unistd.h>
+int main() { return 0; }
+EOF
+if try $CC -c $CFLAGS $test.c; then
+ sed < zconf.h "/^#ifdef HAVE_UNISTD_H.* may be/s/def HAVE_UNISTD_H\(.*\) may be/ 1\1 was/" > zconf.temp.h
+ mv zconf.temp.h zconf.h
+ echo "Checking for unistd.h... Yes." | tee -a configure.log
+else
+ echo "Checking for unistd.h... No." | tee -a configure.log
+fi
+
+echo >> configure.log
+
+# check for stdarg.h and save result in zconf.h
+cat > $test.c <<EOF
+#include <stdarg.h>
+int main() { return 0; }
+EOF
+if try $CC -c $CFLAGS $test.c; then
+ sed < zconf.h "/^#ifdef HAVE_STDARG_H.* may be/s/def HAVE_STDARG_H\(.*\) may be/ 1\1 was/" > zconf.temp.h
+ mv zconf.temp.h zconf.h
+ echo "Checking for stdarg.h... Yes." | tee -a configure.log
+else
+ echo "Checking for stdarg.h... No." | tee -a configure.log
+fi
+
+# if the z_ prefix was requested, save that in zconf.h
+if test $zprefix -eq 1; then
+ sed < zconf.h "/#ifdef Z_PREFIX.* may be/s/def Z_PREFIX\(.*\) may be/ 1\1 was/" > zconf.temp.h
+ mv zconf.temp.h zconf.h
+ echo >> configure.log
+ echo "Using z_ prefix on all symbols." | tee -a configure.log
+fi
+
+# if --solo compilation was requested, save that in zconf.h and remove gz stuff from object lists
+if test $solo -eq 1; then
+ sed '/#define ZCONF_H/a\
+#define Z_SOLO
+
+' < zconf.h > zconf.temp.h
+ mv zconf.temp.h zconf.h
+OBJC='$(OBJZ)'
+PIC_OBJC='$(PIC_OBJZ)'
+fi
+
+# if code coverage testing was requested, use older gcc if defined, e.g. "gcc-4.2" on Mac OS X
+if test $cover -eq 1; then
+ CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage"
+ if test -n "$GCC_CLASSIC"; then
+ CC=$GCC_CLASSIC
+ fi
+fi
+
+echo >> configure.log
+
+# conduct a series of tests to resolve eight possible cases of using "vs" or "s" printf functions
+# (using stdarg or not), with or without "n" (proving size of buffer), and with or without a
+# return value. The most secure result is vsnprintf() with a return value. snprintf() with a
+# return value is secure as well, but then gzprintf() will be limited to 20 arguments.
+cat > $test.c <<EOF
+#include <stdio.h>
+#include <stdarg.h>
+#include "zconf.h"
+int main()
+{
+#ifndef STDC
+ choke me
+#endif
+ return 0;
+}
+EOF
+if try $CC -c $CFLAGS $test.c; then
+ echo "Checking whether to use vs[n]printf() or s[n]printf()... using vs[n]printf()." | tee -a configure.log
+
+ echo >> configure.log
+ cat > $test.c <<EOF
+#include <stdio.h>
+#include <stdarg.h>
+int mytest(const char *fmt, ...)
+{
+ char buf[20];
+ va_list ap;
+ va_start(ap, fmt);
+ vsnprintf(buf, sizeof(buf), fmt, ap);
+ va_end(ap);
+ return 0;
+}
+int main()
+{
+ return (mytest("Hello%d\n", 1));
+}
+EOF
+ if try $CC $CFLAGS -o $test $test.c; then
+ echo "Checking for vsnprintf() in stdio.h... Yes." | tee -a configure.log
+
+ echo >> configure.log
+ cat >$test.c <<EOF
+#include <stdio.h>
+#include <stdarg.h>
+int mytest(const char *fmt, ...)
+{
+ int n;
+ char buf[20];
+ va_list ap;
+ va_start(ap, fmt);
+ n = vsnprintf(buf, sizeof(buf), fmt, ap);
+ va_end(ap);
+ return n;
+}
+int main()
+{
+ return (mytest("Hello%d\n", 1));
+}
+EOF
+
+ if try $CC -c $CFLAGS $test.c; then
+ echo "Checking for return value of vsnprintf()... Yes." | tee -a configure.log
+ else
+ CFLAGS="$CFLAGS -DHAS_vsnprintf_void"
+ SFLAGS="$SFLAGS -DHAS_vsnprintf_void"
+ echo "Checking for return value of vsnprintf()... No." | tee -a configure.log
+ echo " WARNING: apparently vsnprintf() does not return a value. zlib" | tee -a configure.log
+ echo " can build but will be open to possible string-format security" | tee -a configure.log
+ echo " vulnerabilities." | tee -a configure.log
+ fi
+ else
+ CFLAGS="$CFLAGS -DNO_vsnprintf"
+ SFLAGS="$SFLAGS -DNO_vsnprintf"
+ echo "Checking for vsnprintf() in stdio.h... No." | tee -a configure.log
+ echo " WARNING: vsnprintf() not found, falling back to vsprintf(). zlib" | tee -a configure.log
+ echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log
+ echo " vulnerabilities." | tee -a configure.log
+
+ echo >> configure.log
+ cat >$test.c <<EOF
+#include <stdio.h>
+#include <stdarg.h>
+int mytest(const char *fmt, ...)
+{
+ int n;
+ char buf[20];
+ va_list ap;
+ va_start(ap, fmt);
+ n = vsprintf(buf, fmt, ap);
+ va_end(ap);
+ return n;
+}
+int main()
+{
+ return (mytest("Hello%d\n", 1));
+}
+EOF
+
+ if try $CC -c $CFLAGS $test.c; then
+ echo "Checking for return value of vsprintf()... Yes." | tee -a configure.log
+ else
+ CFLAGS="$CFLAGS -DHAS_vsprintf_void"
+ SFLAGS="$SFLAGS -DHAS_vsprintf_void"
+ echo "Checking for return value of vsprintf()... No." | tee -a configure.log
+ echo " WARNING: apparently vsprintf() does not return a value. zlib" | tee -a configure.log
+ echo " can build but will be open to possible string-format security" | tee -a configure.log
+ echo " vulnerabilities." | tee -a configure.log
+ fi
+ fi
+else
+ echo "Checking whether to use vs[n]printf() or s[n]printf()... using s[n]printf()." | tee -a configure.log
+
+ echo >> configure.log
+ cat >$test.c <<EOF
+#include <stdio.h>
+int mytest()
+{
+ char buf[20];
+ snprintf(buf, sizeof(buf), "%s", "foo");
+ return 0;
+}
+int main()
+{
+ return (mytest());
+}
+EOF
+
+ if try $CC $CFLAGS -o $test $test.c; then
+ echo "Checking for snprintf() in stdio.h... Yes." | tee -a configure.log
+
+ echo >> configure.log
+ cat >$test.c <<EOF
+#include <stdio.h>
+int mytest()
+{
+ char buf[20];
+ return snprintf(buf, sizeof(buf), "%s", "foo");
+}
+int main()
+{
+ return (mytest());
+}
+EOF
+
+ if try $CC -c $CFLAGS $test.c; then
+ echo "Checking for return value of snprintf()... Yes." | tee -a configure.log
+ else
+ CFLAGS="$CFLAGS -DHAS_snprintf_void"
+ SFLAGS="$SFLAGS -DHAS_snprintf_void"
+ echo "Checking for return value of snprintf()... No." | tee -a configure.log
+ echo " WARNING: apparently snprintf() does not return a value. zlib" | tee -a configure.log
+ echo " can build but will be open to possible string-format security" | tee -a configure.log
+ echo " vulnerabilities." | tee -a configure.log
+ fi
+ else
+ CFLAGS="$CFLAGS -DNO_snprintf"
+ SFLAGS="$SFLAGS -DNO_snprintf"
+ echo "Checking for snprintf() in stdio.h... No." | tee -a configure.log
+ echo " WARNING: snprintf() not found, falling back to sprintf(). zlib" | tee -a configure.log
+ echo " can build but will be open to possible buffer-overflow security" | tee -a configure.log
+ echo " vulnerabilities." | tee -a configure.log
+
+ echo >> configure.log
+ cat >$test.c <<EOF
+#include <stdio.h>
+int mytest()
+{
+ char buf[20];
+ return sprintf(buf, "%s", "foo");
+}
+int main()
+{
+ return (mytest());
+}
+EOF
+
+ if try $CC -c $CFLAGS $test.c; then
+ echo "Checking for return value of sprintf()... Yes." | tee -a configure.log
+ else
+ CFLAGS="$CFLAGS -DHAS_sprintf_void"
+ SFLAGS="$SFLAGS -DHAS_sprintf_void"
+ echo "Checking for return value of sprintf()... No." | tee -a configure.log
+ echo " WARNING: apparently sprintf() does not return a value. zlib" | tee -a configure.log
+ echo " can build but will be open to possible string-format security" | tee -a configure.log
+ echo " vulnerabilities." | tee -a configure.log
+ fi
+ fi
+fi
+
+# see if we can hide zlib internal symbols that are linked between separate source files
+if test "$gcc" -eq 1; then
+ echo >> configure.log
+ cat > $test.c <<EOF
+#define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+int ZLIB_INTERNAL foo;
+int main()
+{
+ return 0;
+}
+EOF
+ if tryboth $CC -c $CFLAGS $test.c; then
+ CFLAGS="$CFLAGS -DHAVE_HIDDEN"
+ SFLAGS="$SFLAGS -DHAVE_HIDDEN"
+ echo "Checking for attribute(visibility) support... Yes." | tee -a configure.log
+ else
+ echo "Checking for attribute(visibility) support... No." | tee -a configure.log
+ fi
+fi
+
+# show the results in the log
+echo >> configure.log
+echo ALL = $ALL >> configure.log
+echo AR = $AR >> configure.log
+echo ARFLAGS = $ARFLAGS >> configure.log
+echo CC = $CC >> configure.log
+echo CFLAGS = $CFLAGS >> configure.log
+echo CPP = $CPP >> configure.log
+echo EXE = $EXE >> configure.log
+echo LDCONFIG = $LDCONFIG >> configure.log
+echo LDFLAGS = $LDFLAGS >> configure.log
+echo LDSHARED = $LDSHARED >> configure.log
+echo LDSHAREDLIBC = $LDSHAREDLIBC >> configure.log
+echo OBJC = $OBJC >> configure.log
+echo PIC_OBJC = $PIC_OBJC >> configure.log
+echo RANLIB = $RANLIB >> configure.log
+echo SFLAGS = $SFLAGS >> configure.log
+echo SHAREDLIB = $SHAREDLIB >> configure.log
+echo SHAREDLIBM = $SHAREDLIBM >> configure.log
+echo SHAREDLIBV = $SHAREDLIBV >> configure.log
+echo STATICLIB = $STATICLIB >> configure.log
+echo TEST = $TEST >> configure.log
+echo VER = $VER >> configure.log
+echo Z_U4 = $Z_U4 >> configure.log
+echo SRCDIR = $SRCDIR >> configure.log
+echo exec_prefix = $exec_prefix >> configure.log
+echo includedir = $includedir >> configure.log
+echo libdir = $libdir >> configure.log
+echo mandir = $mandir >> configure.log
+echo prefix = $prefix >> configure.log
+echo sharedlibdir = $sharedlibdir >> configure.log
+echo uname = $uname >> configure.log
+
+# udpate Makefile with the configure results
+sed < ${SRCDIR}Makefile.in "
+/^CC *=/s#=.*#=$CC#
+/^CFLAGS *=/s#=.*#=$CFLAGS#
+/^SFLAGS *=/s#=.*#=$SFLAGS#
+/^LDFLAGS *=/s#=.*#=$LDFLAGS#
+/^LDSHARED *=/s#=.*#=$LDSHARED#
+/^CPP *=/s#=.*#=$CPP#
+/^STATICLIB *=/s#=.*#=$STATICLIB#
+/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
+/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
+/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
+/^AR *=/s#=.*#=$AR#
+/^ARFLAGS *=/s#=.*#=$ARFLAGS#
+/^RANLIB *=/s#=.*#=$RANLIB#
+/^LDCONFIG *=/s#=.*#=$LDCONFIG#
+/^LDSHAREDLIBC *=/s#=.*#=$LDSHAREDLIBC#
+/^EXE *=/s#=.*#=$EXE#
+/^SRCDIR *=/s#=.*#=$SRCDIR#
+/^ZINC *=/s#=.*#=$ZINC#
+/^ZINCOUT *=/s#=.*#=$ZINCOUT#
+/^prefix *=/s#=.*#=$prefix#
+/^exec_prefix *=/s#=.*#=$exec_prefix#
+/^libdir *=/s#=.*#=$libdir#
+/^sharedlibdir *=/s#=.*#=$sharedlibdir#
+/^includedir *=/s#=.*#=$includedir#
+/^mandir *=/s#=.*#=$mandir#
+/^OBJC *=/s#=.*#= $OBJC#
+/^PIC_OBJC *=/s#=.*#= $PIC_OBJC#
+/^all: */s#:.*#: $ALL#
+/^test: */s#:.*#: $TEST#
+" > Makefile
+
+# create zlib.pc with the configure results
+sed < ${SRCDIR}zlib.pc.in "
+/^CC *=/s#=.*#=$CC#
+/^CFLAGS *=/s#=.*#=$CFLAGS#
+/^CPP *=/s#=.*#=$CPP#
+/^LDSHARED *=/s#=.*#=$LDSHARED#
+/^STATICLIB *=/s#=.*#=$STATICLIB#
+/^SHAREDLIB *=/s#=.*#=$SHAREDLIB#
+/^SHAREDLIBV *=/s#=.*#=$SHAREDLIBV#
+/^SHAREDLIBM *=/s#=.*#=$SHAREDLIBM#
+/^AR *=/s#=.*#=$AR#
+/^ARFLAGS *=/s#=.*#=$ARFLAGS#
+/^RANLIB *=/s#=.*#=$RANLIB#
+/^EXE *=/s#=.*#=$EXE#
+/^prefix *=/s#=.*#=$prefix#
+/^exec_prefix *=/s#=.*#=$exec_prefix#
+/^libdir *=/s#=.*#=$libdir#
+/^sharedlibdir *=/s#=.*#=$sharedlibdir#
+/^includedir *=/s#=.*#=$includedir#
+/^mandir *=/s#=.*#=$mandir#
+/^LDFLAGS *=/s#=.*#=$LDFLAGS#
+" | sed -e "
+s/\@VERSION\@/$VER/g;
+" > zlib.pc
+
+# done
+leave 0
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/README.contrib b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/README.contrib
new file mode 100644
index 000000000..a411d5c39
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/README.contrib
@@ -0,0 +1,78 @@
+All files under this contrib directory are UNSUPPORTED. There were
+provided by users of zlib and were not tested by the authors of zlib.
+Use at your own risk. Please contact the authors of the contributions
+for help about these, not the zlib authors. Thanks.
+
+
+ada/ by Dmitriy Anisimkov <anisimkov@yahoo.com>
+ Support for Ada
+ See http://zlib-ada.sourceforge.net/
+
+amd64/ by Mikhail Teterin <mi@ALDAN.algebra.com>
+ asm code for AMD64
+ See patch at http://www.freebsd.org/cgi/query-pr.cgi?pr=bin/96393
+
+asm686/ by Brian Raiter <breadbox@muppetlabs.com>
+ asm code for Pentium and PPro/PII, using the AT&T (GNU as) syntax
+ See http://www.muppetlabs.com/~breadbox/software/assembly.html
+
+blast/ by Mark Adler <madler@alumni.caltech.edu>
+ Decompressor for output of PKWare Data Compression Library (DCL)
+
+delphi/ by Cosmin Truta <cosmint@cs.ubbcluj.ro>
+ Support for Delphi and C++ Builder
+
+dotzlib/ by Henrik Ravn <henrik@ravn.com>
+ Support for Microsoft .Net and Visual C++ .Net
+
+gcc_gvmat64/by Gilles Vollant <info@winimage.com>
+ GCC Version of x86 64-bit (AMD64 and Intel EM64t) code for x64
+ assembler to replace longest_match() and inflate_fast()
+
+infback9/ by Mark Adler <madler@alumni.caltech.edu>
+ Unsupported diffs to infback to decode the deflate64 format
+
+inflate86/ by Chris Anderson <christop@charm.net>
+ Tuned x86 gcc asm code to replace inflate_fast()
+
+iostream/ by Kevin Ruland <kevin@rodin.wustl.edu>
+ A C++ I/O streams interface to the zlib gz* functions
+
+iostream2/ by Tyge Løvset <Tyge.Lovset@cmr.no>
+ Another C++ I/O streams interface
+
+iostream3/ by Ludwig Schwardt <schwardt@sun.ac.za>
+ and Kevin Ruland <kevin@rodin.wustl.edu>
+ Yet another C++ I/O streams interface
+
+masmx64/ by Gilles Vollant <info@winimage.com>
+ x86 64-bit (AMD64 and Intel EM64t) code for x64 assembler to
+ replace longest_match() and inflate_fast(), also masm x86
+ 64-bits translation of Chris Anderson inflate_fast()
+
+masmx86/ by Gilles Vollant <info@winimage.com>
+ x86 asm code to replace longest_match() and inflate_fast(),
+ for Visual C++ and MASM (32 bits).
+ Based on Brian Raiter (asm686) and Chris Anderson (inflate86)
+
+minizip/ by Gilles Vollant <info@winimage.com>
+ Mini zip and unzip based on zlib
+ Includes Zip64 support by Mathias Svensson <mathias@result42.com>
+ See http://www.winimage.com/zLibDll/minizip.html
+
+pascal/ by Bob Dellaca <bobdl@xtra.co.nz> et al.
+ Support for Pascal
+
+puff/ by Mark Adler <madler@alumni.caltech.edu>
+ Small, low memory usage inflate. Also serves to provide an
+ unambiguous description of the deflate format.
+
+testzlib/ by Gilles Vollant <info@winimage.com>
+ Example of the use of zlib
+
+untgz/ by Pedro A. Aranda Gutierrez <paag@tid.es>
+ A very simple tar.gz file extractor using zlib
+
+vstudio/ by Gilles Vollant <info@winimage.com>
+ Building a minizip-enhanced zlib with Microsoft Visual Studio
+ Includes vc11 from kreuzerkrieg and vc12 from davispuh
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/buffer_demo.adb b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/buffer_demo.adb
new file mode 100644
index 000000000..46b863810
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/buffer_demo.adb
@@ -0,0 +1,106 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+--
+-- $Id: buffer_demo.adb,v 1.3 2004/09/06 06:55:35 vagul Exp $
+
+-- This demo program provided by Dr Steve Sangwine <sjs@essex.ac.uk>
+--
+-- Demonstration of a problem with Zlib-Ada (already fixed) when a buffer
+-- of exactly the correct size is used for decompressed data, and the last
+-- few bytes passed in to Zlib are checksum bytes.
+
+-- This program compresses a string of text, and then decompresses the
+-- compressed text into a buffer of the same size as the original text.
+
+with Ada.Streams; use Ada.Streams;
+with Ada.Text_IO;
+
+with ZLib; use ZLib;
+
+procedure Buffer_Demo is
+ EOL : Character renames ASCII.LF;
+ Text : constant String
+ := "Four score and seven years ago our fathers brought forth," & EOL &
+ "upon this continent, a new nation, conceived in liberty," & EOL &
+ "and dedicated to the proposition that `all men are created equal'.";
+
+ Source : Stream_Element_Array (1 .. Text'Length);
+ for Source'Address use Text'Address;
+
+begin
+ Ada.Text_IO.Put (Text);
+ Ada.Text_IO.New_Line;
+ Ada.Text_IO.Put_Line
+ ("Uncompressed size : " & Positive'Image (Text'Length) & " bytes");
+
+ declare
+ Compressed_Data : Stream_Element_Array (1 .. Text'Length);
+ L : Stream_Element_Offset;
+ begin
+ Compress : declare
+ Compressor : Filter_Type;
+ I : Stream_Element_Offset;
+ begin
+ Deflate_Init (Compressor);
+
+ -- Compress the whole of T at once.
+
+ Translate (Compressor, Source, I, Compressed_Data, L, Finish);
+ pragma Assert (I = Source'Last);
+
+ Close (Compressor);
+
+ Ada.Text_IO.Put_Line
+ ("Compressed size : "
+ & Stream_Element_Offset'Image (L) & " bytes");
+ end Compress;
+
+ -- Now we decompress the data, passing short blocks of data to Zlib
+ -- (because this demonstrates the problem - the last block passed will
+ -- contain checksum information and there will be no output, only a
+ -- check inside Zlib that the checksum is correct).
+
+ Decompress : declare
+ Decompressor : Filter_Type;
+
+ Uncompressed_Data : Stream_Element_Array (1 .. Text'Length);
+
+ Block_Size : constant := 4;
+ -- This makes sure that the last block contains
+ -- only Adler checksum data.
+
+ P : Stream_Element_Offset := Compressed_Data'First - 1;
+ O : Stream_Element_Offset;
+ begin
+ Inflate_Init (Decompressor);
+
+ loop
+ Translate
+ (Decompressor,
+ Compressed_Data
+ (P + 1 .. Stream_Element_Offset'Min (P + Block_Size, L)),
+ P,
+ Uncompressed_Data
+ (Total_Out (Decompressor) + 1 .. Uncompressed_Data'Last),
+ O,
+ No_Flush);
+
+ Ada.Text_IO.Put_Line
+ ("Total in : " & Count'Image (Total_In (Decompressor)) &
+ ", out : " & Count'Image (Total_Out (Decompressor)));
+
+ exit when P = L;
+ end loop;
+
+ Ada.Text_IO.New_Line;
+ Ada.Text_IO.Put_Line
+ ("Decompressed text matches original text : "
+ & Boolean'Image (Uncompressed_Data = Source));
+ end Decompress;
+ end;
+end Buffer_Demo;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/mtest.adb b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/mtest.adb
new file mode 100644
index 000000000..c4dfd080f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/mtest.adb
@@ -0,0 +1,156 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+-- Continuous test for ZLib multithreading. If the test would fail
+-- we should provide thread safe allocation routines for the Z_Stream.
+--
+-- $Id: mtest.adb,v 1.4 2004/07/23 07:49:54 vagul Exp $
+
+with ZLib;
+with Ada.Streams;
+with Ada.Numerics.Discrete_Random;
+with Ada.Text_IO;
+with Ada.Exceptions;
+with Ada.Task_Identification;
+
+procedure MTest is
+ use Ada.Streams;
+ use ZLib;
+
+ Stop : Boolean := False;
+
+ pragma Atomic (Stop);
+
+ subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
+
+ package Random_Elements is
+ new Ada.Numerics.Discrete_Random (Visible_Symbols);
+
+ task type Test_Task;
+
+ task body Test_Task is
+ Buffer : Stream_Element_Array (1 .. 100_000);
+ Gen : Random_Elements.Generator;
+
+ Buffer_First : Stream_Element_Offset;
+ Compare_First : Stream_Element_Offset;
+
+ Deflate : Filter_Type;
+ Inflate : Filter_Type;
+
+ procedure Further (Item : in Stream_Element_Array);
+
+ procedure Read_Buffer
+ (Item : out Ada.Streams.Stream_Element_Array;
+ Last : out Ada.Streams.Stream_Element_Offset);
+
+ -------------
+ -- Further --
+ -------------
+
+ procedure Further (Item : in Stream_Element_Array) is
+
+ procedure Compare (Item : in Stream_Element_Array);
+
+ -------------
+ -- Compare --
+ -------------
+
+ procedure Compare (Item : in Stream_Element_Array) is
+ Next_First : Stream_Element_Offset := Compare_First + Item'Length;
+ begin
+ if Buffer (Compare_First .. Next_First - 1) /= Item then
+ raise Program_Error;
+ end if;
+
+ Compare_First := Next_First;
+ end Compare;
+
+ procedure Compare_Write is new ZLib.Write (Write => Compare);
+ begin
+ Compare_Write (Inflate, Item, No_Flush);
+ end Further;
+
+ -----------------
+ -- Read_Buffer --
+ -----------------
+
+ procedure Read_Buffer
+ (Item : out Ada.Streams.Stream_Element_Array;
+ Last : out Ada.Streams.Stream_Element_Offset)
+ is
+ Buff_Diff : Stream_Element_Offset := Buffer'Last - Buffer_First;
+ Next_First : Stream_Element_Offset;
+ begin
+ if Item'Length <= Buff_Diff then
+ Last := Item'Last;
+
+ Next_First := Buffer_First + Item'Length;
+
+ Item := Buffer (Buffer_First .. Next_First - 1);
+
+ Buffer_First := Next_First;
+ else
+ Last := Item'First + Buff_Diff;
+ Item (Item'First .. Last) := Buffer (Buffer_First .. Buffer'Last);
+ Buffer_First := Buffer'Last + 1;
+ end if;
+ end Read_Buffer;
+
+ procedure Translate is new Generic_Translate
+ (Data_In => Read_Buffer,
+ Data_Out => Further);
+
+ begin
+ Random_Elements.Reset (Gen);
+
+ Buffer := (others => 20);
+
+ Main : loop
+ for J in Buffer'Range loop
+ Buffer (J) := Random_Elements.Random (Gen);
+
+ Deflate_Init (Deflate);
+ Inflate_Init (Inflate);
+
+ Buffer_First := Buffer'First;
+ Compare_First := Buffer'First;
+
+ Translate (Deflate);
+
+ if Compare_First /= Buffer'Last + 1 then
+ raise Program_Error;
+ end if;
+
+ Ada.Text_IO.Put_Line
+ (Ada.Task_Identification.Image
+ (Ada.Task_Identification.Current_Task)
+ & Stream_Element_Offset'Image (J)
+ & ZLib.Count'Image (Total_Out (Deflate)));
+
+ Close (Deflate);
+ Close (Inflate);
+
+ exit Main when Stop;
+ end loop;
+ end loop Main;
+ exception
+ when E : others =>
+ Ada.Text_IO.Put_Line (Ada.Exceptions.Exception_Information (E));
+ Stop := True;
+ end Test_Task;
+
+ Test : array (1 .. 4) of Test_Task;
+
+ pragma Unreferenced (Test);
+
+ Dummy : Character;
+
+begin
+ Ada.Text_IO.Get_Immediate (Dummy);
+ Stop := True;
+end MTest;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/read.adb b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/read.adb
new file mode 100644
index 000000000..1f2efbfeb
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/read.adb
@@ -0,0 +1,156 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+
+-- $Id: read.adb,v 1.8 2004/05/31 10:53:40 vagul Exp $
+
+-- Test/demo program for the generic read interface.
+
+with Ada.Numerics.Discrete_Random;
+with Ada.Streams;
+with Ada.Text_IO;
+
+with ZLib;
+
+procedure Read is
+
+ use Ada.Streams;
+
+ ------------------------------------
+ -- Test configuration parameters --
+ ------------------------------------
+
+ File_Size : Stream_Element_Offset := 100_000;
+
+ Continuous : constant Boolean := False;
+ -- If this constant is True, the test would be repeated again and again,
+ -- with increment File_Size for every iteration.
+
+ Header : constant ZLib.Header_Type := ZLib.Default;
+ -- Do not use Header other than Default in ZLib versions 1.1.4 and older.
+
+ Init_Random : constant := 8;
+ -- We are using the same random sequence, in case of we catch bug,
+ -- so we would be able to reproduce it.
+
+ -- End --
+
+ Pack_Size : Stream_Element_Offset;
+ Offset : Stream_Element_Offset;
+
+ Filter : ZLib.Filter_Type;
+
+ subtype Visible_Symbols
+ is Stream_Element range 16#20# .. 16#7E#;
+
+ package Random_Elements is new
+ Ada.Numerics.Discrete_Random (Visible_Symbols);
+
+ Gen : Random_Elements.Generator;
+ Period : constant Stream_Element_Offset := 200;
+ -- Period constant variable for random generator not to be very random.
+ -- Bigger period, harder random.
+
+ Read_Buffer : Stream_Element_Array (1 .. 2048);
+ Read_First : Stream_Element_Offset;
+ Read_Last : Stream_Element_Offset;
+
+ procedure Reset;
+
+ procedure Read
+ (Item : out Stream_Element_Array;
+ Last : out Stream_Element_Offset);
+ -- this procedure is for generic instantiation of
+ -- ZLib.Read
+ -- reading data from the File_In.
+
+ procedure Read is new ZLib.Read
+ (Read,
+ Read_Buffer,
+ Rest_First => Read_First,
+ Rest_Last => Read_Last);
+
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Item : out Stream_Element_Array;
+ Last : out Stream_Element_Offset) is
+ begin
+ Last := Stream_Element_Offset'Min
+ (Item'Last,
+ Item'First + File_Size - Offset);
+
+ for J in Item'First .. Last loop
+ if J < Item'First + Period then
+ Item (J) := Random_Elements.Random (Gen);
+ else
+ Item (J) := Item (J - Period);
+ end if;
+
+ Offset := Offset + 1;
+ end loop;
+ end Read;
+
+ -----------
+ -- Reset --
+ -----------
+
+ procedure Reset is
+ begin
+ Random_Elements.Reset (Gen, Init_Random);
+ Pack_Size := 0;
+ Offset := 1;
+ Read_First := Read_Buffer'Last + 1;
+ Read_Last := Read_Buffer'Last;
+ end Reset;
+
+begin
+ Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
+
+ loop
+ for Level in ZLib.Compression_Level'Range loop
+
+ Ada.Text_IO.Put ("Level ="
+ & ZLib.Compression_Level'Image (Level));
+
+ -- Deflate using generic instantiation.
+
+ ZLib.Deflate_Init
+ (Filter,
+ Level,
+ Header => Header);
+
+ Reset;
+
+ Ada.Text_IO.Put
+ (Stream_Element_Offset'Image (File_Size) & " ->");
+
+ loop
+ declare
+ Buffer : Stream_Element_Array (1 .. 1024);
+ Last : Stream_Element_Offset;
+ begin
+ Read (Filter, Buffer, Last);
+
+ Pack_Size := Pack_Size + Last - Buffer'First + 1;
+
+ exit when Last < Buffer'Last;
+ end;
+ end loop;
+
+ Ada.Text_IO.Put_Line (Stream_Element_Offset'Image (Pack_Size));
+
+ ZLib.Close (Filter);
+ end loop;
+
+ exit when not Continuous;
+
+ File_Size := File_Size + 1;
+ end loop;
+end Read;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/readme.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/readme.txt
new file mode 100644
index 000000000..ce4d2cadf
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/readme.txt
@@ -0,0 +1,65 @@
+ ZLib for Ada thick binding (ZLib.Ada)
+ Release 1.3
+
+ZLib.Ada is a thick binding interface to the popular ZLib data
+compression library, available at http://www.gzip.org/zlib/.
+It provides Ada-style access to the ZLib C library.
+
+
+ Here are the main changes since ZLib.Ada 1.2:
+
+- Attension: ZLib.Read generic routine have a initialization requirement
+ for Read_Last parameter now. It is a bit incompartible with previous version,
+ but extends functionality, we could use new parameters Allow_Read_Some and
+ Flush now.
+
+- Added Is_Open routines to ZLib and ZLib.Streams packages.
+
+- Add pragma Assert to check Stream_Element is 8 bit.
+
+- Fix extraction to buffer with exact known decompressed size. Error reported by
+ Steve Sangwine.
+
+- Fix definition of ULong (changed to unsigned_long), fix regression on 64 bits
+ computers. Patch provided by Pascal Obry.
+
+- Add Status_Error exception definition.
+
+- Add pragma Assertion that Ada.Streams.Stream_Element size is 8 bit.
+
+
+ How to build ZLib.Ada under GNAT
+
+You should have the ZLib library already build on your computer, before
+building ZLib.Ada. Make the directory of ZLib.Ada sources current and
+issue the command:
+
+ gnatmake test -largs -L<directory where libz.a is> -lz
+
+Or use the GNAT project file build for GNAT 3.15 or later:
+
+ gnatmake -Pzlib.gpr -L<directory where libz.a is>
+
+
+ How to build ZLib.Ada under Aonix ObjectAda for Win32 7.2.2
+
+1. Make a project with all *.ads and *.adb files from the distribution.
+2. Build the libz.a library from the ZLib C sources.
+3. Rename libz.a to z.lib.
+4. Add the library z.lib to the project.
+5. Add the libc.lib library from the ObjectAda distribution to the project.
+6. Build the executable using test.adb as a main procedure.
+
+
+ How to use ZLib.Ada
+
+The source files test.adb and read.adb are small demo programs that show
+the main functionality of ZLib.Ada.
+
+The routines from the package specifications are commented.
+
+
+Homepage: http://zlib-ada.sourceforge.net/
+Author: Dmitriy Anisimkov <anisimkov@yahoo.com>
+
+Contributors: Pascal Obry <pascal@obry.org>, Steve Sangwine <sjs@essex.ac.uk>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/test.adb b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/test.adb
new file mode 100644
index 000000000..90773acfa
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/test.adb
@@ -0,0 +1,463 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+
+-- $Id: test.adb,v 1.17 2003/08/12 12:13:30 vagul Exp $
+
+-- The program has a few aims.
+-- 1. Test ZLib.Ada95 thick binding functionality.
+-- 2. Show the example of use main functionality of the ZLib.Ada95 binding.
+-- 3. Build this program automatically compile all ZLib.Ada95 packages under
+-- GNAT Ada95 compiler.
+
+with ZLib.Streams;
+with Ada.Streams.Stream_IO;
+with Ada.Numerics.Discrete_Random;
+
+with Ada.Text_IO;
+
+with Ada.Calendar;
+
+procedure Test is
+
+ use Ada.Streams;
+ use Stream_IO;
+
+ ------------------------------------
+ -- Test configuration parameters --
+ ------------------------------------
+
+ File_Size : Count := 100_000;
+ Continuous : constant Boolean := False;
+
+ Header : constant ZLib.Header_Type := ZLib.Default;
+ -- ZLib.None;
+ -- ZLib.Auto;
+ -- ZLib.GZip;
+ -- Do not use Header other then Default in ZLib versions 1.1.4
+ -- and older.
+
+ Strategy : constant ZLib.Strategy_Type := ZLib.Default_Strategy;
+ Init_Random : constant := 10;
+
+ -- End --
+
+ In_File_Name : constant String := "testzlib.in";
+ -- Name of the input file
+
+ Z_File_Name : constant String := "testzlib.zlb";
+ -- Name of the compressed file.
+
+ Out_File_Name : constant String := "testzlib.out";
+ -- Name of the decompressed file.
+
+ File_In : File_Type;
+ File_Out : File_Type;
+ File_Back : File_Type;
+ File_Z : ZLib.Streams.Stream_Type;
+
+ Filter : ZLib.Filter_Type;
+
+ Time_Stamp : Ada.Calendar.Time;
+
+ procedure Generate_File;
+ -- Generate file of spetsified size with some random data.
+ -- The random data is repeatable, for the good compression.
+
+ procedure Compare_Streams
+ (Left, Right : in out Root_Stream_Type'Class);
+ -- The procedure compearing data in 2 streams.
+ -- It is for compare data before and after compression/decompression.
+
+ procedure Compare_Files (Left, Right : String);
+ -- Compare files. Based on the Compare_Streams.
+
+ procedure Copy_Streams
+ (Source, Target : in out Root_Stream_Type'Class;
+ Buffer_Size : in Stream_Element_Offset := 1024);
+ -- Copying data from one stream to another. It is for test stream
+ -- interface of the library.
+
+ procedure Data_In
+ (Item : out Stream_Element_Array;
+ Last : out Stream_Element_Offset);
+ -- this procedure is for generic instantiation of
+ -- ZLib.Generic_Translate.
+ -- reading data from the File_In.
+
+ procedure Data_Out (Item : in Stream_Element_Array);
+ -- this procedure is for generic instantiation of
+ -- ZLib.Generic_Translate.
+ -- writing data to the File_Out.
+
+ procedure Stamp;
+ -- Store the timestamp to the local variable.
+
+ procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count);
+ -- Print the time statistic with the message.
+
+ procedure Translate is new ZLib.Generic_Translate
+ (Data_In => Data_In,
+ Data_Out => Data_Out);
+ -- This procedure is moving data from File_In to File_Out
+ -- with compression or decompression, depend on initialization of
+ -- Filter parameter.
+
+ -------------------
+ -- Compare_Files --
+ -------------------
+
+ procedure Compare_Files (Left, Right : String) is
+ Left_File, Right_File : File_Type;
+ begin
+ Open (Left_File, In_File, Left);
+ Open (Right_File, In_File, Right);
+ Compare_Streams (Stream (Left_File).all, Stream (Right_File).all);
+ Close (Left_File);
+ Close (Right_File);
+ end Compare_Files;
+
+ ---------------------
+ -- Compare_Streams --
+ ---------------------
+
+ procedure Compare_Streams
+ (Left, Right : in out Ada.Streams.Root_Stream_Type'Class)
+ is
+ Left_Buffer, Right_Buffer : Stream_Element_Array (0 .. 16#FFF#);
+ Left_Last, Right_Last : Stream_Element_Offset;
+ begin
+ loop
+ Read (Left, Left_Buffer, Left_Last);
+ Read (Right, Right_Buffer, Right_Last);
+
+ if Left_Last /= Right_Last then
+ Ada.Text_IO.Put_Line ("Compare error :"
+ & Stream_Element_Offset'Image (Left_Last)
+ & " /= "
+ & Stream_Element_Offset'Image (Right_Last));
+
+ raise Constraint_Error;
+
+ elsif Left_Buffer (0 .. Left_Last)
+ /= Right_Buffer (0 .. Right_Last)
+ then
+ Ada.Text_IO.Put_Line ("ERROR: IN and OUT files is not equal.");
+ raise Constraint_Error;
+
+ end if;
+
+ exit when Left_Last < Left_Buffer'Last;
+ end loop;
+ end Compare_Streams;
+
+ ------------------
+ -- Copy_Streams --
+ ------------------
+
+ procedure Copy_Streams
+ (Source, Target : in out Ada.Streams.Root_Stream_Type'Class;
+ Buffer_Size : in Stream_Element_Offset := 1024)
+ is
+ Buffer : Stream_Element_Array (1 .. Buffer_Size);
+ Last : Stream_Element_Offset;
+ begin
+ loop
+ Read (Source, Buffer, Last);
+ Write (Target, Buffer (1 .. Last));
+
+ exit when Last < Buffer'Last;
+ end loop;
+ end Copy_Streams;
+
+ -------------
+ -- Data_In --
+ -------------
+
+ procedure Data_In
+ (Item : out Stream_Element_Array;
+ Last : out Stream_Element_Offset) is
+ begin
+ Read (File_In, Item, Last);
+ end Data_In;
+
+ --------------
+ -- Data_Out --
+ --------------
+
+ procedure Data_Out (Item : in Stream_Element_Array) is
+ begin
+ Write (File_Out, Item);
+ end Data_Out;
+
+ -------------------
+ -- Generate_File --
+ -------------------
+
+ procedure Generate_File is
+ subtype Visible_Symbols is Stream_Element range 16#20# .. 16#7E#;
+
+ package Random_Elements is
+ new Ada.Numerics.Discrete_Random (Visible_Symbols);
+
+ Gen : Random_Elements.Generator;
+ Buffer : Stream_Element_Array := (1 .. 77 => 16#20#) & 10;
+
+ Buffer_Count : constant Count := File_Size / Buffer'Length;
+ -- Number of same buffers in the packet.
+
+ Density : constant Count := 30; -- from 0 to Buffer'Length - 2;
+
+ procedure Fill_Buffer (J, D : in Count);
+ -- Change the part of the buffer.
+
+ -----------------
+ -- Fill_Buffer --
+ -----------------
+
+ procedure Fill_Buffer (J, D : in Count) is
+ begin
+ for K in 0 .. D loop
+ Buffer
+ (Stream_Element_Offset ((J + K) mod (Buffer'Length - 1) + 1))
+ := Random_Elements.Random (Gen);
+
+ end loop;
+ end Fill_Buffer;
+
+ begin
+ Random_Elements.Reset (Gen, Init_Random);
+
+ Create (File_In, Out_File, In_File_Name);
+
+ Fill_Buffer (1, Buffer'Length - 2);
+
+ for J in 1 .. Buffer_Count loop
+ Write (File_In, Buffer);
+
+ Fill_Buffer (J, Density);
+ end loop;
+
+ -- fill remain size.
+
+ Write
+ (File_In,
+ Buffer
+ (1 .. Stream_Element_Offset
+ (File_Size - Buffer'Length * Buffer_Count)));
+
+ Flush (File_In);
+ Close (File_In);
+ end Generate_File;
+
+ ---------------------
+ -- Print_Statistic --
+ ---------------------
+
+ procedure Print_Statistic (Msg : String; Data_Size : ZLib.Count) is
+ use Ada.Calendar;
+ use Ada.Text_IO;
+
+ package Count_IO is new Integer_IO (ZLib.Count);
+
+ Curr_Dur : Duration := Clock - Time_Stamp;
+ begin
+ Put (Msg);
+
+ Set_Col (20);
+ Ada.Text_IO.Put ("size =");
+
+ Count_IO.Put
+ (Data_Size,
+ Width => Stream_IO.Count'Image (File_Size)'Length);
+
+ Put_Line (" duration =" & Duration'Image (Curr_Dur));
+ end Print_Statistic;
+
+ -----------
+ -- Stamp --
+ -----------
+
+ procedure Stamp is
+ begin
+ Time_Stamp := Ada.Calendar.Clock;
+ end Stamp;
+
+begin
+ Ada.Text_IO.Put_Line ("ZLib " & ZLib.Version);
+
+ loop
+ Generate_File;
+
+ for Level in ZLib.Compression_Level'Range loop
+
+ Ada.Text_IO.Put_Line ("Level ="
+ & ZLib.Compression_Level'Image (Level));
+
+ -- Test generic interface.
+ Open (File_In, In_File, In_File_Name);
+ Create (File_Out, Out_File, Z_File_Name);
+
+ Stamp;
+
+ -- Deflate using generic instantiation.
+
+ ZLib.Deflate_Init
+ (Filter => Filter,
+ Level => Level,
+ Strategy => Strategy,
+ Header => Header);
+
+ Translate (Filter);
+ Print_Statistic ("Generic compress", ZLib.Total_Out (Filter));
+ ZLib.Close (Filter);
+
+ Close (File_In);
+ Close (File_Out);
+
+ Open (File_In, In_File, Z_File_Name);
+ Create (File_Out, Out_File, Out_File_Name);
+
+ Stamp;
+
+ -- Inflate using generic instantiation.
+
+ ZLib.Inflate_Init (Filter, Header => Header);
+
+ Translate (Filter);
+ Print_Statistic ("Generic decompress", ZLib.Total_Out (Filter));
+
+ ZLib.Close (Filter);
+
+ Close (File_In);
+ Close (File_Out);
+
+ Compare_Files (In_File_Name, Out_File_Name);
+
+ -- Test stream interface.
+
+ -- Compress to the back stream.
+
+ Open (File_In, In_File, In_File_Name);
+ Create (File_Back, Out_File, Z_File_Name);
+
+ Stamp;
+
+ ZLib.Streams.Create
+ (Stream => File_Z,
+ Mode => ZLib.Streams.Out_Stream,
+ Back => ZLib.Streams.Stream_Access
+ (Stream (File_Back)),
+ Back_Compressed => True,
+ Level => Level,
+ Strategy => Strategy,
+ Header => Header);
+
+ Copy_Streams
+ (Source => Stream (File_In).all,
+ Target => File_Z);
+
+ -- Flushing internal buffers to the back stream.
+
+ ZLib.Streams.Flush (File_Z, ZLib.Finish);
+
+ Print_Statistic ("Write compress",
+ ZLib.Streams.Write_Total_Out (File_Z));
+
+ ZLib.Streams.Close (File_Z);
+
+ Close (File_In);
+ Close (File_Back);
+
+ -- Compare reading from original file and from
+ -- decompression stream.
+
+ Open (File_In, In_File, In_File_Name);
+ Open (File_Back, In_File, Z_File_Name);
+
+ ZLib.Streams.Create
+ (Stream => File_Z,
+ Mode => ZLib.Streams.In_Stream,
+ Back => ZLib.Streams.Stream_Access
+ (Stream (File_Back)),
+ Back_Compressed => True,
+ Header => Header);
+
+ Stamp;
+ Compare_Streams (Stream (File_In).all, File_Z);
+
+ Print_Statistic ("Read decompress",
+ ZLib.Streams.Read_Total_Out (File_Z));
+
+ ZLib.Streams.Close (File_Z);
+ Close (File_In);
+ Close (File_Back);
+
+ -- Compress by reading from compression stream.
+
+ Open (File_Back, In_File, In_File_Name);
+ Create (File_Out, Out_File, Z_File_Name);
+
+ ZLib.Streams.Create
+ (Stream => File_Z,
+ Mode => ZLib.Streams.In_Stream,
+ Back => ZLib.Streams.Stream_Access
+ (Stream (File_Back)),
+ Back_Compressed => False,
+ Level => Level,
+ Strategy => Strategy,
+ Header => Header);
+
+ Stamp;
+ Copy_Streams
+ (Source => File_Z,
+ Target => Stream (File_Out).all);
+
+ Print_Statistic ("Read compress",
+ ZLib.Streams.Read_Total_Out (File_Z));
+
+ ZLib.Streams.Close (File_Z);
+
+ Close (File_Out);
+ Close (File_Back);
+
+ -- Decompress to decompression stream.
+
+ Open (File_In, In_File, Z_File_Name);
+ Create (File_Back, Out_File, Out_File_Name);
+
+ ZLib.Streams.Create
+ (Stream => File_Z,
+ Mode => ZLib.Streams.Out_Stream,
+ Back => ZLib.Streams.Stream_Access
+ (Stream (File_Back)),
+ Back_Compressed => False,
+ Header => Header);
+
+ Stamp;
+
+ Copy_Streams
+ (Source => Stream (File_In).all,
+ Target => File_Z);
+
+ Print_Statistic ("Write decompress",
+ ZLib.Streams.Write_Total_Out (File_Z));
+
+ ZLib.Streams.Close (File_Z);
+ Close (File_In);
+ Close (File_Back);
+
+ Compare_Files (In_File_Name, Out_File_Name);
+ end loop;
+
+ Ada.Text_IO.Put_Line (Count'Image (File_Size) & " Ok.");
+
+ exit when not Continuous;
+
+ File_Size := File_Size + 1;
+ end loop;
+end Test;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.adb b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.adb
new file mode 100644
index 000000000..b6497bae2
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.adb
@@ -0,0 +1,225 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+
+-- $Id: zlib-streams.adb,v 1.10 2004/05/31 10:53:40 vagul Exp $
+
+with Ada.Unchecked_Deallocation;
+
+package body ZLib.Streams is
+
+ -----------
+ -- Close --
+ -----------
+
+ procedure Close (Stream : in out Stream_Type) is
+ procedure Free is new Ada.Unchecked_Deallocation
+ (Stream_Element_Array, Buffer_Access);
+ begin
+ if Stream.Mode = Out_Stream or Stream.Mode = Duplex then
+ -- We should flush the data written by the writer.
+
+ Flush (Stream, Finish);
+
+ Close (Stream.Writer);
+ end if;
+
+ if Stream.Mode = In_Stream or Stream.Mode = Duplex then
+ Close (Stream.Reader);
+ Free (Stream.Buffer);
+ end if;
+ end Close;
+
+ ------------
+ -- Create --
+ ------------
+
+ procedure Create
+ (Stream : out Stream_Type;
+ Mode : in Stream_Mode;
+ Back : in Stream_Access;
+ Back_Compressed : in Boolean;
+ Level : in Compression_Level := Default_Compression;
+ Strategy : in Strategy_Type := Default_Strategy;
+ Header : in Header_Type := Default;
+ Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset
+ := Default_Buffer_Size;
+ Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
+ := Default_Buffer_Size)
+ is
+
+ subtype Buffer_Subtype is Stream_Element_Array (1 .. Read_Buffer_Size);
+
+ procedure Init_Filter
+ (Filter : in out Filter_Type;
+ Compress : in Boolean);
+
+ -----------------
+ -- Init_Filter --
+ -----------------
+
+ procedure Init_Filter
+ (Filter : in out Filter_Type;
+ Compress : in Boolean) is
+ begin
+ if Compress then
+ Deflate_Init
+ (Filter, Level, Strategy, Header => Header);
+ else
+ Inflate_Init (Filter, Header => Header);
+ end if;
+ end Init_Filter;
+
+ begin
+ Stream.Back := Back;
+ Stream.Mode := Mode;
+
+ if Mode = Out_Stream or Mode = Duplex then
+ Init_Filter (Stream.Writer, Back_Compressed);
+ Stream.Buffer_Size := Write_Buffer_Size;
+ else
+ Stream.Buffer_Size := 0;
+ end if;
+
+ if Mode = In_Stream or Mode = Duplex then
+ Init_Filter (Stream.Reader, not Back_Compressed);
+
+ Stream.Buffer := new Buffer_Subtype;
+ Stream.Rest_First := Stream.Buffer'Last + 1;
+ Stream.Rest_Last := Stream.Buffer'Last;
+ end if;
+ end Create;
+
+ -----------
+ -- Flush --
+ -----------
+
+ procedure Flush
+ (Stream : in out Stream_Type;
+ Mode : in Flush_Mode := Sync_Flush)
+ is
+ Buffer : Stream_Element_Array (1 .. Stream.Buffer_Size);
+ Last : Stream_Element_Offset;
+ begin
+ loop
+ Flush (Stream.Writer, Buffer, Last, Mode);
+
+ Ada.Streams.Write (Stream.Back.all, Buffer (1 .. Last));
+
+ exit when Last < Buffer'Last;
+ end loop;
+ end Flush;
+
+ -------------
+ -- Is_Open --
+ -------------
+
+ function Is_Open (Stream : Stream_Type) return Boolean is
+ begin
+ return Is_Open (Stream.Reader) or else Is_Open (Stream.Writer);
+ end Is_Open;
+
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Stream : in out Stream_Type;
+ Item : out Stream_Element_Array;
+ Last : out Stream_Element_Offset)
+ is
+
+ procedure Read
+ (Item : out Stream_Element_Array;
+ Last : out Stream_Element_Offset);
+
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Item : out Stream_Element_Array;
+ Last : out Stream_Element_Offset) is
+ begin
+ Ada.Streams.Read (Stream.Back.all, Item, Last);
+ end Read;
+
+ procedure Read is new ZLib.Read
+ (Read => Read,
+ Buffer => Stream.Buffer.all,
+ Rest_First => Stream.Rest_First,
+ Rest_Last => Stream.Rest_Last);
+
+ begin
+ Read (Stream.Reader, Item, Last);
+ end Read;
+
+ -------------------
+ -- Read_Total_In --
+ -------------------
+
+ function Read_Total_In (Stream : in Stream_Type) return Count is
+ begin
+ return Total_In (Stream.Reader);
+ end Read_Total_In;
+
+ --------------------
+ -- Read_Total_Out --
+ --------------------
+
+ function Read_Total_Out (Stream : in Stream_Type) return Count is
+ begin
+ return Total_Out (Stream.Reader);
+ end Read_Total_Out;
+
+ -----------
+ -- Write --
+ -----------
+
+ procedure Write
+ (Stream : in out Stream_Type;
+ Item : in Stream_Element_Array)
+ is
+
+ procedure Write (Item : in Stream_Element_Array);
+
+ -----------
+ -- Write --
+ -----------
+
+ procedure Write (Item : in Stream_Element_Array) is
+ begin
+ Ada.Streams.Write (Stream.Back.all, Item);
+ end Write;
+
+ procedure Write is new ZLib.Write
+ (Write => Write,
+ Buffer_Size => Stream.Buffer_Size);
+
+ begin
+ Write (Stream.Writer, Item, No_Flush);
+ end Write;
+
+ --------------------
+ -- Write_Total_In --
+ --------------------
+
+ function Write_Total_In (Stream : in Stream_Type) return Count is
+ begin
+ return Total_In (Stream.Writer);
+ end Write_Total_In;
+
+ ---------------------
+ -- Write_Total_Out --
+ ---------------------
+
+ function Write_Total_Out (Stream : in Stream_Type) return Count is
+ begin
+ return Total_Out (Stream.Writer);
+ end Write_Total_Out;
+
+end ZLib.Streams;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.ads b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.ads
new file mode 100644
index 000000000..8e26cd450
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-streams.ads
@@ -0,0 +1,114 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+
+-- $Id: zlib-streams.ads,v 1.12 2004/05/31 10:53:40 vagul Exp $
+
+package ZLib.Streams is
+
+ type Stream_Mode is (In_Stream, Out_Stream, Duplex);
+
+ type Stream_Access is access all Ada.Streams.Root_Stream_Type'Class;
+
+ type Stream_Type is
+ new Ada.Streams.Root_Stream_Type with private;
+
+ procedure Read
+ (Stream : in out Stream_Type;
+ Item : out Ada.Streams.Stream_Element_Array;
+ Last : out Ada.Streams.Stream_Element_Offset);
+
+ procedure Write
+ (Stream : in out Stream_Type;
+ Item : in Ada.Streams.Stream_Element_Array);
+
+ procedure Flush
+ (Stream : in out Stream_Type;
+ Mode : in Flush_Mode := Sync_Flush);
+ -- Flush the written data to the back stream,
+ -- all data placed to the compressor is flushing to the Back stream.
+ -- Should not be used until necessary, because it is decreasing
+ -- compression.
+
+ function Read_Total_In (Stream : in Stream_Type) return Count;
+ pragma Inline (Read_Total_In);
+ -- Return total number of bytes read from back stream so far.
+
+ function Read_Total_Out (Stream : in Stream_Type) return Count;
+ pragma Inline (Read_Total_Out);
+ -- Return total number of bytes read so far.
+
+ function Write_Total_In (Stream : in Stream_Type) return Count;
+ pragma Inline (Write_Total_In);
+ -- Return total number of bytes written so far.
+
+ function Write_Total_Out (Stream : in Stream_Type) return Count;
+ pragma Inline (Write_Total_Out);
+ -- Return total number of bytes written to the back stream.
+
+ procedure Create
+ (Stream : out Stream_Type;
+ Mode : in Stream_Mode;
+ Back : in Stream_Access;
+ Back_Compressed : in Boolean;
+ Level : in Compression_Level := Default_Compression;
+ Strategy : in Strategy_Type := Default_Strategy;
+ Header : in Header_Type := Default;
+ Read_Buffer_Size : in Ada.Streams.Stream_Element_Offset
+ := Default_Buffer_Size;
+ Write_Buffer_Size : in Ada.Streams.Stream_Element_Offset
+ := Default_Buffer_Size);
+ -- Create the Comression/Decompression stream.
+ -- If mode is In_Stream then Write operation is disabled.
+ -- If mode is Out_Stream then Read operation is disabled.
+
+ -- If Back_Compressed is true then
+ -- Data written to the Stream is compressing to the Back stream
+ -- and data read from the Stream is decompressed data from the Back stream.
+
+ -- If Back_Compressed is false then
+ -- Data written to the Stream is decompressing to the Back stream
+ -- and data read from the Stream is compressed data from the Back stream.
+
+ -- !!! When the Need_Header is False ZLib-Ada is using undocumented
+ -- ZLib 1.1.4 functionality to do not create/wait for ZLib headers.
+
+ function Is_Open (Stream : Stream_Type) return Boolean;
+
+ procedure Close (Stream : in out Stream_Type);
+
+private
+
+ use Ada.Streams;
+
+ type Buffer_Access is access all Stream_Element_Array;
+
+ type Stream_Type
+ is new Root_Stream_Type with
+ record
+ Mode : Stream_Mode;
+
+ Buffer : Buffer_Access;
+ Rest_First : Stream_Element_Offset;
+ Rest_Last : Stream_Element_Offset;
+ -- Buffer for Read operation.
+ -- We need to have this buffer in the record
+ -- because not all read data from back stream
+ -- could be processed during the read operation.
+
+ Buffer_Size : Stream_Element_Offset;
+ -- Buffer size for write operation.
+ -- We do not need to have this buffer
+ -- in the record because all data could be
+ -- processed in the write operation.
+
+ Back : Stream_Access;
+ Reader : Filter_Type;
+ Writer : Filter_Type;
+ end record;
+
+end ZLib.Streams;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.adb b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.adb
new file mode 100644
index 000000000..0ca4a7120
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.adb
@@ -0,0 +1,141 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+
+-- $Id: zlib-thin.adb,v 1.8 2003/12/14 18:27:31 vagul Exp $
+
+package body ZLib.Thin is
+
+ ZLIB_VERSION : constant Chars_Ptr := zlibVersion;
+
+ Z_Stream_Size : constant Int := Z_Stream'Size / System.Storage_Unit;
+
+ --------------
+ -- Avail_In --
+ --------------
+
+ function Avail_In (Strm : in Z_Stream) return UInt is
+ begin
+ return Strm.Avail_In;
+ end Avail_In;
+
+ ---------------
+ -- Avail_Out --
+ ---------------
+
+ function Avail_Out (Strm : in Z_Stream) return UInt is
+ begin
+ return Strm.Avail_Out;
+ end Avail_Out;
+
+ ------------------
+ -- Deflate_Init --
+ ------------------
+
+ function Deflate_Init
+ (strm : Z_Streamp;
+ level : Int;
+ method : Int;
+ windowBits : Int;
+ memLevel : Int;
+ strategy : Int)
+ return Int is
+ begin
+ return deflateInit2
+ (strm,
+ level,
+ method,
+ windowBits,
+ memLevel,
+ strategy,
+ ZLIB_VERSION,
+ Z_Stream_Size);
+ end Deflate_Init;
+
+ ------------------
+ -- Inflate_Init --
+ ------------------
+
+ function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int is
+ begin
+ return inflateInit2 (strm, windowBits, ZLIB_VERSION, Z_Stream_Size);
+ end Inflate_Init;
+
+ ------------------------
+ -- Last_Error_Message --
+ ------------------------
+
+ function Last_Error_Message (Strm : in Z_Stream) return String is
+ use Interfaces.C.Strings;
+ begin
+ if Strm.msg = Null_Ptr then
+ return "";
+ else
+ return Value (Strm.msg);
+ end if;
+ end Last_Error_Message;
+
+ ------------
+ -- Set_In --
+ ------------
+
+ procedure Set_In
+ (Strm : in out Z_Stream;
+ Buffer : in Voidp;
+ Size : in UInt) is
+ begin
+ Strm.Next_In := Buffer;
+ Strm.Avail_In := Size;
+ end Set_In;
+
+ ------------------
+ -- Set_Mem_Func --
+ ------------------
+
+ procedure Set_Mem_Func
+ (Strm : in out Z_Stream;
+ Opaque : in Voidp;
+ Alloc : in alloc_func;
+ Free : in free_func) is
+ begin
+ Strm.opaque := Opaque;
+ Strm.zalloc := Alloc;
+ Strm.zfree := Free;
+ end Set_Mem_Func;
+
+ -------------
+ -- Set_Out --
+ -------------
+
+ procedure Set_Out
+ (Strm : in out Z_Stream;
+ Buffer : in Voidp;
+ Size : in UInt) is
+ begin
+ Strm.Next_Out := Buffer;
+ Strm.Avail_Out := Size;
+ end Set_Out;
+
+ --------------
+ -- Total_In --
+ --------------
+
+ function Total_In (Strm : in Z_Stream) return ULong is
+ begin
+ return Strm.Total_In;
+ end Total_In;
+
+ ---------------
+ -- Total_Out --
+ ---------------
+
+ function Total_Out (Strm : in Z_Stream) return ULong is
+ begin
+ return Strm.Total_Out;
+ end Total_Out;
+
+end ZLib.Thin;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.ads b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.ads
new file mode 100644
index 000000000..810173cff
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib-thin.ads
@@ -0,0 +1,450 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2003 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+
+-- $Id: zlib-thin.ads,v 1.11 2004/07/23 06:33:11 vagul Exp $
+
+with Interfaces.C.Strings;
+
+with System;
+
+private package ZLib.Thin is
+
+ -- From zconf.h
+
+ MAX_MEM_LEVEL : constant := 9; -- zconf.h:105
+ -- zconf.h:105
+ MAX_WBITS : constant := 15; -- zconf.h:115
+ -- 32K LZ77 window
+ -- zconf.h:115
+ SEEK_SET : constant := 8#0000#; -- zconf.h:244
+ -- Seek from beginning of file.
+ -- zconf.h:244
+ SEEK_CUR : constant := 1; -- zconf.h:245
+ -- Seek from current position.
+ -- zconf.h:245
+ SEEK_END : constant := 2; -- zconf.h:246
+ -- Set file pointer to EOF plus "offset"
+ -- zconf.h:246
+
+ type Byte is new Interfaces.C.unsigned_char; -- 8 bits
+ -- zconf.h:214
+ type UInt is new Interfaces.C.unsigned; -- 16 bits or more
+ -- zconf.h:216
+ type Int is new Interfaces.C.int;
+
+ type ULong is new Interfaces.C.unsigned_long; -- 32 bits or more
+ -- zconf.h:217
+ subtype Chars_Ptr is Interfaces.C.Strings.chars_ptr;
+
+ type ULong_Access is access ULong;
+ type Int_Access is access Int;
+
+ subtype Voidp is System.Address; -- zconf.h:232
+
+ subtype Byte_Access is Voidp;
+
+ Nul : constant Voidp := System.Null_Address;
+ -- end from zconf
+
+ Z_NO_FLUSH : constant := 8#0000#; -- zlib.h:125
+ -- zlib.h:125
+ Z_PARTIAL_FLUSH : constant := 1; -- zlib.h:126
+ -- will be removed, use
+ -- Z_SYNC_FLUSH instead
+ -- zlib.h:126
+ Z_SYNC_FLUSH : constant := 2; -- zlib.h:127
+ -- zlib.h:127
+ Z_FULL_FLUSH : constant := 3; -- zlib.h:128
+ -- zlib.h:128
+ Z_FINISH : constant := 4; -- zlib.h:129
+ -- zlib.h:129
+ Z_OK : constant := 8#0000#; -- zlib.h:132
+ -- zlib.h:132
+ Z_STREAM_END : constant := 1; -- zlib.h:133
+ -- zlib.h:133
+ Z_NEED_DICT : constant := 2; -- zlib.h:134
+ -- zlib.h:134
+ Z_ERRNO : constant := -1; -- zlib.h:135
+ -- zlib.h:135
+ Z_STREAM_ERROR : constant := -2; -- zlib.h:136
+ -- zlib.h:136
+ Z_DATA_ERROR : constant := -3; -- zlib.h:137
+ -- zlib.h:137
+ Z_MEM_ERROR : constant := -4; -- zlib.h:138
+ -- zlib.h:138
+ Z_BUF_ERROR : constant := -5; -- zlib.h:139
+ -- zlib.h:139
+ Z_VERSION_ERROR : constant := -6; -- zlib.h:140
+ -- zlib.h:140
+ Z_NO_COMPRESSION : constant := 8#0000#; -- zlib.h:145
+ -- zlib.h:145
+ Z_BEST_SPEED : constant := 1; -- zlib.h:146
+ -- zlib.h:146
+ Z_BEST_COMPRESSION : constant := 9; -- zlib.h:147
+ -- zlib.h:147
+ Z_DEFAULT_COMPRESSION : constant := -1; -- zlib.h:148
+ -- zlib.h:148
+ Z_FILTERED : constant := 1; -- zlib.h:151
+ -- zlib.h:151
+ Z_HUFFMAN_ONLY : constant := 2; -- zlib.h:152
+ -- zlib.h:152
+ Z_DEFAULT_STRATEGY : constant := 8#0000#; -- zlib.h:153
+ -- zlib.h:153
+ Z_BINARY : constant := 8#0000#; -- zlib.h:156
+ -- zlib.h:156
+ Z_ASCII : constant := 1; -- zlib.h:157
+ -- zlib.h:157
+ Z_UNKNOWN : constant := 2; -- zlib.h:158
+ -- zlib.h:158
+ Z_DEFLATED : constant := 8; -- zlib.h:161
+ -- zlib.h:161
+ Z_NULL : constant := 8#0000#; -- zlib.h:164
+ -- for initializing zalloc, zfree, opaque
+ -- zlib.h:164
+ type gzFile is new Voidp; -- zlib.h:646
+
+ type Z_Stream is private;
+
+ type Z_Streamp is access all Z_Stream; -- zlib.h:89
+
+ type alloc_func is access function
+ (Opaque : Voidp;
+ Items : UInt;
+ Size : UInt)
+ return Voidp; -- zlib.h:63
+
+ type free_func is access procedure (opaque : Voidp; address : Voidp);
+
+ function zlibVersion return Chars_Ptr;
+
+ function Deflate (strm : Z_Streamp; flush : Int) return Int;
+
+ function DeflateEnd (strm : Z_Streamp) return Int;
+
+ function Inflate (strm : Z_Streamp; flush : Int) return Int;
+
+ function InflateEnd (strm : Z_Streamp) return Int;
+
+ function deflateSetDictionary
+ (strm : Z_Streamp;
+ dictionary : Byte_Access;
+ dictLength : UInt)
+ return Int;
+
+ function deflateCopy (dest : Z_Streamp; source : Z_Streamp) return Int;
+ -- zlib.h:478
+
+ function deflateReset (strm : Z_Streamp) return Int; -- zlib.h:495
+
+ function deflateParams
+ (strm : Z_Streamp;
+ level : Int;
+ strategy : Int)
+ return Int; -- zlib.h:506
+
+ function inflateSetDictionary
+ (strm : Z_Streamp;
+ dictionary : Byte_Access;
+ dictLength : UInt)
+ return Int; -- zlib.h:548
+
+ function inflateSync (strm : Z_Streamp) return Int; -- zlib.h:565
+
+ function inflateReset (strm : Z_Streamp) return Int; -- zlib.h:580
+
+ function compress
+ (dest : Byte_Access;
+ destLen : ULong_Access;
+ source : Byte_Access;
+ sourceLen : ULong)
+ return Int; -- zlib.h:601
+
+ function compress2
+ (dest : Byte_Access;
+ destLen : ULong_Access;
+ source : Byte_Access;
+ sourceLen : ULong;
+ level : Int)
+ return Int; -- zlib.h:615
+
+ function uncompress
+ (dest : Byte_Access;
+ destLen : ULong_Access;
+ source : Byte_Access;
+ sourceLen : ULong)
+ return Int;
+
+ function gzopen (path : Chars_Ptr; mode : Chars_Ptr) return gzFile;
+
+ function gzdopen (fd : Int; mode : Chars_Ptr) return gzFile;
+
+ function gzsetparams
+ (file : gzFile;
+ level : Int;
+ strategy : Int)
+ return Int;
+
+ function gzread
+ (file : gzFile;
+ buf : Voidp;
+ len : UInt)
+ return Int;
+
+ function gzwrite
+ (file : in gzFile;
+ buf : in Voidp;
+ len : in UInt)
+ return Int;
+
+ function gzprintf (file : in gzFile; format : in Chars_Ptr) return Int;
+
+ function gzputs (file : in gzFile; s : in Chars_Ptr) return Int;
+
+ function gzgets
+ (file : gzFile;
+ buf : Chars_Ptr;
+ len : Int)
+ return Chars_Ptr;
+
+ function gzputc (file : gzFile; char : Int) return Int;
+
+ function gzgetc (file : gzFile) return Int;
+
+ function gzflush (file : gzFile; flush : Int) return Int;
+
+ function gzseek
+ (file : gzFile;
+ offset : Int;
+ whence : Int)
+ return Int;
+
+ function gzrewind (file : gzFile) return Int;
+
+ function gztell (file : gzFile) return Int;
+
+ function gzeof (file : gzFile) return Int;
+
+ function gzclose (file : gzFile) return Int;
+
+ function gzerror (file : gzFile; errnum : Int_Access) return Chars_Ptr;
+
+ function adler32
+ (adler : ULong;
+ buf : Byte_Access;
+ len : UInt)
+ return ULong;
+
+ function crc32
+ (crc : ULong;
+ buf : Byte_Access;
+ len : UInt)
+ return ULong;
+
+ function deflateInit
+ (strm : Z_Streamp;
+ level : Int;
+ version : Chars_Ptr;
+ stream_size : Int)
+ return Int;
+
+ function deflateInit2
+ (strm : Z_Streamp;
+ level : Int;
+ method : Int;
+ windowBits : Int;
+ memLevel : Int;
+ strategy : Int;
+ version : Chars_Ptr;
+ stream_size : Int)
+ return Int;
+
+ function Deflate_Init
+ (strm : Z_Streamp;
+ level : Int;
+ method : Int;
+ windowBits : Int;
+ memLevel : Int;
+ strategy : Int)
+ return Int;
+ pragma Inline (Deflate_Init);
+
+ function inflateInit
+ (strm : Z_Streamp;
+ version : Chars_Ptr;
+ stream_size : Int)
+ return Int;
+
+ function inflateInit2
+ (strm : in Z_Streamp;
+ windowBits : in Int;
+ version : in Chars_Ptr;
+ stream_size : in Int)
+ return Int;
+
+ function inflateBackInit
+ (strm : in Z_Streamp;
+ windowBits : in Int;
+ window : in Byte_Access;
+ version : in Chars_Ptr;
+ stream_size : in Int)
+ return Int;
+ -- Size of window have to be 2**windowBits.
+
+ function Inflate_Init (strm : Z_Streamp; windowBits : Int) return Int;
+ pragma Inline (Inflate_Init);
+
+ function zError (err : Int) return Chars_Ptr;
+
+ function inflateSyncPoint (z : Z_Streamp) return Int;
+
+ function get_crc_table return ULong_Access;
+
+ -- Interface to the available fields of the z_stream structure.
+ -- The application must update next_in and avail_in when avail_in has
+ -- dropped to zero. It must update next_out and avail_out when avail_out
+ -- has dropped to zero. The application must initialize zalloc, zfree and
+ -- opaque before calling the init function.
+
+ procedure Set_In
+ (Strm : in out Z_Stream;
+ Buffer : in Voidp;
+ Size : in UInt);
+ pragma Inline (Set_In);
+
+ procedure Set_Out
+ (Strm : in out Z_Stream;
+ Buffer : in Voidp;
+ Size : in UInt);
+ pragma Inline (Set_Out);
+
+ procedure Set_Mem_Func
+ (Strm : in out Z_Stream;
+ Opaque : in Voidp;
+ Alloc : in alloc_func;
+ Free : in free_func);
+ pragma Inline (Set_Mem_Func);
+
+ function Last_Error_Message (Strm : in Z_Stream) return String;
+ pragma Inline (Last_Error_Message);
+
+ function Avail_Out (Strm : in Z_Stream) return UInt;
+ pragma Inline (Avail_Out);
+
+ function Avail_In (Strm : in Z_Stream) return UInt;
+ pragma Inline (Avail_In);
+
+ function Total_In (Strm : in Z_Stream) return ULong;
+ pragma Inline (Total_In);
+
+ function Total_Out (Strm : in Z_Stream) return ULong;
+ pragma Inline (Total_Out);
+
+ function inflateCopy
+ (dest : in Z_Streamp;
+ Source : in Z_Streamp)
+ return Int;
+
+ function compressBound (Source_Len : in ULong) return ULong;
+
+ function deflateBound
+ (Strm : in Z_Streamp;
+ Source_Len : in ULong)
+ return ULong;
+
+ function gzungetc (C : in Int; File : in gzFile) return Int;
+
+ function zlibCompileFlags return ULong;
+
+private
+
+ type Z_Stream is record -- zlib.h:68
+ Next_In : Voidp := Nul; -- next input byte
+ Avail_In : UInt := 0; -- number of bytes available at next_in
+ Total_In : ULong := 0; -- total nb of input bytes read so far
+ Next_Out : Voidp := Nul; -- next output byte should be put there
+ Avail_Out : UInt := 0; -- remaining free space at next_out
+ Total_Out : ULong := 0; -- total nb of bytes output so far
+ msg : Chars_Ptr; -- last error message, NULL if no error
+ state : Voidp; -- not visible by applications
+ zalloc : alloc_func := null; -- used to allocate the internal state
+ zfree : free_func := null; -- used to free the internal state
+ opaque : Voidp; -- private data object passed to
+ -- zalloc and zfree
+ data_type : Int; -- best guess about the data type:
+ -- ascii or binary
+ adler : ULong; -- adler32 value of the uncompressed
+ -- data
+ reserved : ULong; -- reserved for future use
+ end record;
+
+ pragma Convention (C, Z_Stream);
+
+ pragma Import (C, zlibVersion, "zlibVersion");
+ pragma Import (C, Deflate, "deflate");
+ pragma Import (C, DeflateEnd, "deflateEnd");
+ pragma Import (C, Inflate, "inflate");
+ pragma Import (C, InflateEnd, "inflateEnd");
+ pragma Import (C, deflateSetDictionary, "deflateSetDictionary");
+ pragma Import (C, deflateCopy, "deflateCopy");
+ pragma Import (C, deflateReset, "deflateReset");
+ pragma Import (C, deflateParams, "deflateParams");
+ pragma Import (C, inflateSetDictionary, "inflateSetDictionary");
+ pragma Import (C, inflateSync, "inflateSync");
+ pragma Import (C, inflateReset, "inflateReset");
+ pragma Import (C, compress, "compress");
+ pragma Import (C, compress2, "compress2");
+ pragma Import (C, uncompress, "uncompress");
+ pragma Import (C, gzopen, "gzopen");
+ pragma Import (C, gzdopen, "gzdopen");
+ pragma Import (C, gzsetparams, "gzsetparams");
+ pragma Import (C, gzread, "gzread");
+ pragma Import (C, gzwrite, "gzwrite");
+ pragma Import (C, gzprintf, "gzprintf");
+ pragma Import (C, gzputs, "gzputs");
+ pragma Import (C, gzgets, "gzgets");
+ pragma Import (C, gzputc, "gzputc");
+ pragma Import (C, gzgetc, "gzgetc");
+ pragma Import (C, gzflush, "gzflush");
+ pragma Import (C, gzseek, "gzseek");
+ pragma Import (C, gzrewind, "gzrewind");
+ pragma Import (C, gztell, "gztell");
+ pragma Import (C, gzeof, "gzeof");
+ pragma Import (C, gzclose, "gzclose");
+ pragma Import (C, gzerror, "gzerror");
+ pragma Import (C, adler32, "adler32");
+ pragma Import (C, crc32, "crc32");
+ pragma Import (C, deflateInit, "deflateInit_");
+ pragma Import (C, inflateInit, "inflateInit_");
+ pragma Import (C, deflateInit2, "deflateInit2_");
+ pragma Import (C, inflateInit2, "inflateInit2_");
+ pragma Import (C, zError, "zError");
+ pragma Import (C, inflateSyncPoint, "inflateSyncPoint");
+ pragma Import (C, get_crc_table, "get_crc_table");
+
+ -- since zlib 1.2.0:
+
+ pragma Import (C, inflateCopy, "inflateCopy");
+ pragma Import (C, compressBound, "compressBound");
+ pragma Import (C, deflateBound, "deflateBound");
+ pragma Import (C, gzungetc, "gzungetc");
+ pragma Import (C, zlibCompileFlags, "zlibCompileFlags");
+
+ pragma Import (C, inflateBackInit, "inflateBackInit_");
+
+ -- I stopped binding the inflateBack routines, because realize that
+ -- it does not support zlib and gzip headers for now, and have no
+ -- symmetric deflateBack routines.
+ -- ZLib-Ada is symmetric regarding deflate/inflate data transformation
+ -- and has a similar generic callback interface for the
+ -- deflate/inflate transformation based on the regular Deflate/Inflate
+ -- routines.
+
+ -- pragma Import (C, inflateBack, "inflateBack");
+ -- pragma Import (C, inflateBackEnd, "inflateBackEnd");
+
+end ZLib.Thin;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.adb b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.adb
new file mode 100644
index 000000000..8b6fd686a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.adb
@@ -0,0 +1,701 @@
+----------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
+-- --
+-- Open source license information is in the zlib.ads file. --
+----------------------------------------------------------------
+
+-- $Id: zlib.adb,v 1.31 2004/09/06 06:53:19 vagul Exp $
+
+with Ada.Exceptions;
+with Ada.Unchecked_Conversion;
+with Ada.Unchecked_Deallocation;
+
+with Interfaces.C.Strings;
+
+with ZLib.Thin;
+
+package body ZLib is
+
+ use type Thin.Int;
+
+ type Z_Stream is new Thin.Z_Stream;
+
+ type Return_Code_Enum is
+ (OK,
+ STREAM_END,
+ NEED_DICT,
+ ERRNO,
+ STREAM_ERROR,
+ DATA_ERROR,
+ MEM_ERROR,
+ BUF_ERROR,
+ VERSION_ERROR);
+
+ type Flate_Step_Function is access
+ function (Strm : in Thin.Z_Streamp; Flush : in Thin.Int) return Thin.Int;
+ pragma Convention (C, Flate_Step_Function);
+
+ type Flate_End_Function is access
+ function (Ctrm : in Thin.Z_Streamp) return Thin.Int;
+ pragma Convention (C, Flate_End_Function);
+
+ type Flate_Type is record
+ Step : Flate_Step_Function;
+ Done : Flate_End_Function;
+ end record;
+
+ subtype Footer_Array is Stream_Element_Array (1 .. 8);
+
+ Simple_GZip_Header : constant Stream_Element_Array (1 .. 10)
+ := (16#1f#, 16#8b#, -- Magic header
+ 16#08#, -- Z_DEFLATED
+ 16#00#, -- Flags
+ 16#00#, 16#00#, 16#00#, 16#00#, -- Time
+ 16#00#, -- XFlags
+ 16#03# -- OS code
+ );
+ -- The simplest gzip header is not for informational, but just for
+ -- gzip format compatibility.
+ -- Note that some code below is using assumption
+ -- Simple_GZip_Header'Last > Footer_Array'Last, so do not make
+ -- Simple_GZip_Header'Last <= Footer_Array'Last.
+
+ Return_Code : constant array (Thin.Int range <>) of Return_Code_Enum
+ := (0 => OK,
+ 1 => STREAM_END,
+ 2 => NEED_DICT,
+ -1 => ERRNO,
+ -2 => STREAM_ERROR,
+ -3 => DATA_ERROR,
+ -4 => MEM_ERROR,
+ -5 => BUF_ERROR,
+ -6 => VERSION_ERROR);
+
+ Flate : constant array (Boolean) of Flate_Type
+ := (True => (Step => Thin.Deflate'Access,
+ Done => Thin.DeflateEnd'Access),
+ False => (Step => Thin.Inflate'Access,
+ Done => Thin.InflateEnd'Access));
+
+ Flush_Finish : constant array (Boolean) of Flush_Mode
+ := (True => Finish, False => No_Flush);
+
+ procedure Raise_Error (Stream : in Z_Stream);
+ pragma Inline (Raise_Error);
+
+ procedure Raise_Error (Message : in String);
+ pragma Inline (Raise_Error);
+
+ procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int);
+
+ procedure Free is new Ada.Unchecked_Deallocation
+ (Z_Stream, Z_Stream_Access);
+
+ function To_Thin_Access is new Ada.Unchecked_Conversion
+ (Z_Stream_Access, Thin.Z_Streamp);
+
+ procedure Translate_GZip
+ (Filter : in out Filter_Type;
+ In_Data : in Ada.Streams.Stream_Element_Array;
+ In_Last : out Ada.Streams.Stream_Element_Offset;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode);
+ -- Separate translate routine for make gzip header.
+
+ procedure Translate_Auto
+ (Filter : in out Filter_Type;
+ In_Data : in Ada.Streams.Stream_Element_Array;
+ In_Last : out Ada.Streams.Stream_Element_Offset;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode);
+ -- translate routine without additional headers.
+
+ -----------------
+ -- Check_Error --
+ -----------------
+
+ procedure Check_Error (Stream : in Z_Stream; Code : in Thin.Int) is
+ use type Thin.Int;
+ begin
+ if Code /= Thin.Z_OK then
+ Raise_Error
+ (Return_Code_Enum'Image (Return_Code (Code))
+ & ": " & Last_Error_Message (Stream));
+ end if;
+ end Check_Error;
+
+ -----------
+ -- Close --
+ -----------
+
+ procedure Close
+ (Filter : in out Filter_Type;
+ Ignore_Error : in Boolean := False)
+ is
+ Code : Thin.Int;
+ begin
+ if not Ignore_Error and then not Is_Open (Filter) then
+ raise Status_Error;
+ end if;
+
+ Code := Flate (Filter.Compression).Done (To_Thin_Access (Filter.Strm));
+
+ if Ignore_Error or else Code = Thin.Z_OK then
+ Free (Filter.Strm);
+ else
+ declare
+ Error_Message : constant String
+ := Last_Error_Message (Filter.Strm.all);
+ begin
+ Free (Filter.Strm);
+ Ada.Exceptions.Raise_Exception
+ (ZLib_Error'Identity,
+ Return_Code_Enum'Image (Return_Code (Code))
+ & ": " & Error_Message);
+ end;
+ end if;
+ end Close;
+
+ -----------
+ -- CRC32 --
+ -----------
+
+ function CRC32
+ (CRC : in Unsigned_32;
+ Data : in Ada.Streams.Stream_Element_Array)
+ return Unsigned_32
+ is
+ use Thin;
+ begin
+ return Unsigned_32 (crc32 (ULong (CRC),
+ Data'Address,
+ Data'Length));
+ end CRC32;
+
+ procedure CRC32
+ (CRC : in out Unsigned_32;
+ Data : in Ada.Streams.Stream_Element_Array) is
+ begin
+ CRC := CRC32 (CRC, Data);
+ end CRC32;
+
+ ------------------
+ -- Deflate_Init --
+ ------------------
+
+ procedure Deflate_Init
+ (Filter : in out Filter_Type;
+ Level : in Compression_Level := Default_Compression;
+ Strategy : in Strategy_Type := Default_Strategy;
+ Method : in Compression_Method := Deflated;
+ Window_Bits : in Window_Bits_Type := Default_Window_Bits;
+ Memory_Level : in Memory_Level_Type := Default_Memory_Level;
+ Header : in Header_Type := Default)
+ is
+ use type Thin.Int;
+ Win_Bits : Thin.Int := Thin.Int (Window_Bits);
+ begin
+ if Is_Open (Filter) then
+ raise Status_Error;
+ end if;
+
+ -- We allow ZLib to make header only in case of default header type.
+ -- Otherwise we would either do header by ourselfs, or do not do
+ -- header at all.
+
+ if Header = None or else Header = GZip then
+ Win_Bits := -Win_Bits;
+ end if;
+
+ -- For the GZip CRC calculation and make headers.
+
+ if Header = GZip then
+ Filter.CRC := 0;
+ Filter.Offset := Simple_GZip_Header'First;
+ else
+ Filter.Offset := Simple_GZip_Header'Last + 1;
+ end if;
+
+ Filter.Strm := new Z_Stream;
+ Filter.Compression := True;
+ Filter.Stream_End := False;
+ Filter.Header := Header;
+
+ if Thin.Deflate_Init
+ (To_Thin_Access (Filter.Strm),
+ Level => Thin.Int (Level),
+ method => Thin.Int (Method),
+ windowBits => Win_Bits,
+ memLevel => Thin.Int (Memory_Level),
+ strategy => Thin.Int (Strategy)) /= Thin.Z_OK
+ then
+ Raise_Error (Filter.Strm.all);
+ end if;
+ end Deflate_Init;
+
+ -----------
+ -- Flush --
+ -----------
+
+ procedure Flush
+ (Filter : in out Filter_Type;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode)
+ is
+ No_Data : Stream_Element_Array := (1 .. 0 => 0);
+ Last : Stream_Element_Offset;
+ begin
+ Translate (Filter, No_Data, Last, Out_Data, Out_Last, Flush);
+ end Flush;
+
+ -----------------------
+ -- Generic_Translate --
+ -----------------------
+
+ procedure Generic_Translate
+ (Filter : in out ZLib.Filter_Type;
+ In_Buffer_Size : in Integer := Default_Buffer_Size;
+ Out_Buffer_Size : in Integer := Default_Buffer_Size)
+ is
+ In_Buffer : Stream_Element_Array
+ (1 .. Stream_Element_Offset (In_Buffer_Size));
+ Out_Buffer : Stream_Element_Array
+ (1 .. Stream_Element_Offset (Out_Buffer_Size));
+ Last : Stream_Element_Offset;
+ In_Last : Stream_Element_Offset;
+ In_First : Stream_Element_Offset;
+ Out_Last : Stream_Element_Offset;
+ begin
+ Main : loop
+ Data_In (In_Buffer, Last);
+
+ In_First := In_Buffer'First;
+
+ loop
+ Translate
+ (Filter => Filter,
+ In_Data => In_Buffer (In_First .. Last),
+ In_Last => In_Last,
+ Out_Data => Out_Buffer,
+ Out_Last => Out_Last,
+ Flush => Flush_Finish (Last < In_Buffer'First));
+
+ if Out_Buffer'First <= Out_Last then
+ Data_Out (Out_Buffer (Out_Buffer'First .. Out_Last));
+ end if;
+
+ exit Main when Stream_End (Filter);
+
+ -- The end of in buffer.
+
+ exit when In_Last = Last;
+
+ In_First := In_Last + 1;
+ end loop;
+ end loop Main;
+
+ end Generic_Translate;
+
+ ------------------
+ -- Inflate_Init --
+ ------------------
+
+ procedure Inflate_Init
+ (Filter : in out Filter_Type;
+ Window_Bits : in Window_Bits_Type := Default_Window_Bits;
+ Header : in Header_Type := Default)
+ is
+ use type Thin.Int;
+ Win_Bits : Thin.Int := Thin.Int (Window_Bits);
+
+ procedure Check_Version;
+ -- Check the latest header types compatibility.
+
+ procedure Check_Version is
+ begin
+ if Version <= "1.1.4" then
+ Raise_Error
+ ("Inflate header type " & Header_Type'Image (Header)
+ & " incompatible with ZLib version " & Version);
+ end if;
+ end Check_Version;
+
+ begin
+ if Is_Open (Filter) then
+ raise Status_Error;
+ end if;
+
+ case Header is
+ when None =>
+ Check_Version;
+
+ -- Inflate data without headers determined
+ -- by negative Win_Bits.
+
+ Win_Bits := -Win_Bits;
+ when GZip =>
+ Check_Version;
+
+ -- Inflate gzip data defined by flag 16.
+
+ Win_Bits := Win_Bits + 16;
+ when Auto =>
+ Check_Version;
+
+ -- Inflate with automatic detection
+ -- of gzip or native header defined by flag 32.
+
+ Win_Bits := Win_Bits + 32;
+ when Default => null;
+ end case;
+
+ Filter.Strm := new Z_Stream;
+ Filter.Compression := False;
+ Filter.Stream_End := False;
+ Filter.Header := Header;
+
+ if Thin.Inflate_Init
+ (To_Thin_Access (Filter.Strm), Win_Bits) /= Thin.Z_OK
+ then
+ Raise_Error (Filter.Strm.all);
+ end if;
+ end Inflate_Init;
+
+ -------------
+ -- Is_Open --
+ -------------
+
+ function Is_Open (Filter : in Filter_Type) return Boolean is
+ begin
+ return Filter.Strm /= null;
+ end Is_Open;
+
+ -----------------
+ -- Raise_Error --
+ -----------------
+
+ procedure Raise_Error (Message : in String) is
+ begin
+ Ada.Exceptions.Raise_Exception (ZLib_Error'Identity, Message);
+ end Raise_Error;
+
+ procedure Raise_Error (Stream : in Z_Stream) is
+ begin
+ Raise_Error (Last_Error_Message (Stream));
+ end Raise_Error;
+
+ ----------
+ -- Read --
+ ----------
+
+ procedure Read
+ (Filter : in out Filter_Type;
+ Item : out Ada.Streams.Stream_Element_Array;
+ Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode := No_Flush)
+ is
+ In_Last : Stream_Element_Offset;
+ Item_First : Ada.Streams.Stream_Element_Offset := Item'First;
+ V_Flush : Flush_Mode := Flush;
+
+ begin
+ pragma Assert (Rest_First in Buffer'First .. Buffer'Last + 1);
+ pragma Assert (Rest_Last in Buffer'First - 1 .. Buffer'Last);
+
+ loop
+ if Rest_Last = Buffer'First - 1 then
+ V_Flush := Finish;
+
+ elsif Rest_First > Rest_Last then
+ Read (Buffer, Rest_Last);
+ Rest_First := Buffer'First;
+
+ if Rest_Last < Buffer'First then
+ V_Flush := Finish;
+ end if;
+ end if;
+
+ Translate
+ (Filter => Filter,
+ In_Data => Buffer (Rest_First .. Rest_Last),
+ In_Last => In_Last,
+ Out_Data => Item (Item_First .. Item'Last),
+ Out_Last => Last,
+ Flush => V_Flush);
+
+ Rest_First := In_Last + 1;
+
+ exit when Stream_End (Filter)
+ or else Last = Item'Last
+ or else (Last >= Item'First and then Allow_Read_Some);
+
+ Item_First := Last + 1;
+ end loop;
+ end Read;
+
+ ----------------
+ -- Stream_End --
+ ----------------
+
+ function Stream_End (Filter : in Filter_Type) return Boolean is
+ begin
+ if Filter.Header = GZip and Filter.Compression then
+ return Filter.Stream_End
+ and then Filter.Offset = Footer_Array'Last + 1;
+ else
+ return Filter.Stream_End;
+ end if;
+ end Stream_End;
+
+ --------------
+ -- Total_In --
+ --------------
+
+ function Total_In (Filter : in Filter_Type) return Count is
+ begin
+ return Count (Thin.Total_In (To_Thin_Access (Filter.Strm).all));
+ end Total_In;
+
+ ---------------
+ -- Total_Out --
+ ---------------
+
+ function Total_Out (Filter : in Filter_Type) return Count is
+ begin
+ return Count (Thin.Total_Out (To_Thin_Access (Filter.Strm).all));
+ end Total_Out;
+
+ ---------------
+ -- Translate --
+ ---------------
+
+ procedure Translate
+ (Filter : in out Filter_Type;
+ In_Data : in Ada.Streams.Stream_Element_Array;
+ In_Last : out Ada.Streams.Stream_Element_Offset;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode) is
+ begin
+ if Filter.Header = GZip and then Filter.Compression then
+ Translate_GZip
+ (Filter => Filter,
+ In_Data => In_Data,
+ In_Last => In_Last,
+ Out_Data => Out_Data,
+ Out_Last => Out_Last,
+ Flush => Flush);
+ else
+ Translate_Auto
+ (Filter => Filter,
+ In_Data => In_Data,
+ In_Last => In_Last,
+ Out_Data => Out_Data,
+ Out_Last => Out_Last,
+ Flush => Flush);
+ end if;
+ end Translate;
+
+ --------------------
+ -- Translate_Auto --
+ --------------------
+
+ procedure Translate_Auto
+ (Filter : in out Filter_Type;
+ In_Data : in Ada.Streams.Stream_Element_Array;
+ In_Last : out Ada.Streams.Stream_Element_Offset;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode)
+ is
+ use type Thin.Int;
+ Code : Thin.Int;
+
+ begin
+ if not Is_Open (Filter) then
+ raise Status_Error;
+ end if;
+
+ if Out_Data'Length = 0 and then In_Data'Length = 0 then
+ raise Constraint_Error;
+ end if;
+
+ Set_Out (Filter.Strm.all, Out_Data'Address, Out_Data'Length);
+ Set_In (Filter.Strm.all, In_Data'Address, In_Data'Length);
+
+ Code := Flate (Filter.Compression).Step
+ (To_Thin_Access (Filter.Strm),
+ Thin.Int (Flush));
+
+ if Code = Thin.Z_STREAM_END then
+ Filter.Stream_End := True;
+ else
+ Check_Error (Filter.Strm.all, Code);
+ end if;
+
+ In_Last := In_Data'Last
+ - Stream_Element_Offset (Avail_In (Filter.Strm.all));
+ Out_Last := Out_Data'Last
+ - Stream_Element_Offset (Avail_Out (Filter.Strm.all));
+ end Translate_Auto;
+
+ --------------------
+ -- Translate_GZip --
+ --------------------
+
+ procedure Translate_GZip
+ (Filter : in out Filter_Type;
+ In_Data : in Ada.Streams.Stream_Element_Array;
+ In_Last : out Ada.Streams.Stream_Element_Offset;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode)
+ is
+ Out_First : Stream_Element_Offset;
+
+ procedure Add_Data (Data : in Stream_Element_Array);
+ -- Add data to stream from the Filter.Offset till necessary,
+ -- used for add gzip headr/footer.
+
+ procedure Put_32
+ (Item : in out Stream_Element_Array;
+ Data : in Unsigned_32);
+ pragma Inline (Put_32);
+
+ --------------
+ -- Add_Data --
+ --------------
+
+ procedure Add_Data (Data : in Stream_Element_Array) is
+ Data_First : Stream_Element_Offset renames Filter.Offset;
+ Data_Last : Stream_Element_Offset;
+ Data_Len : Stream_Element_Offset; -- -1
+ Out_Len : Stream_Element_Offset; -- -1
+ begin
+ Out_First := Out_Last + 1;
+
+ if Data_First > Data'Last then
+ return;
+ end if;
+
+ Data_Len := Data'Last - Data_First;
+ Out_Len := Out_Data'Last - Out_First;
+
+ if Data_Len <= Out_Len then
+ Out_Last := Out_First + Data_Len;
+ Data_Last := Data'Last;
+ else
+ Out_Last := Out_Data'Last;
+ Data_Last := Data_First + Out_Len;
+ end if;
+
+ Out_Data (Out_First .. Out_Last) := Data (Data_First .. Data_Last);
+
+ Data_First := Data_Last + 1;
+ Out_First := Out_Last + 1;
+ end Add_Data;
+
+ ------------
+ -- Put_32 --
+ ------------
+
+ procedure Put_32
+ (Item : in out Stream_Element_Array;
+ Data : in Unsigned_32)
+ is
+ D : Unsigned_32 := Data;
+ begin
+ for J in Item'First .. Item'First + 3 loop
+ Item (J) := Stream_Element (D and 16#FF#);
+ D := Shift_Right (D, 8);
+ end loop;
+ end Put_32;
+
+ begin
+ Out_Last := Out_Data'First - 1;
+
+ if not Filter.Stream_End then
+ Add_Data (Simple_GZip_Header);
+
+ Translate_Auto
+ (Filter => Filter,
+ In_Data => In_Data,
+ In_Last => In_Last,
+ Out_Data => Out_Data (Out_First .. Out_Data'Last),
+ Out_Last => Out_Last,
+ Flush => Flush);
+
+ CRC32 (Filter.CRC, In_Data (In_Data'First .. In_Last));
+ end if;
+
+ if Filter.Stream_End and then Out_Last <= Out_Data'Last then
+ -- This detection method would work only when
+ -- Simple_GZip_Header'Last > Footer_Array'Last
+
+ if Filter.Offset = Simple_GZip_Header'Last + 1 then
+ Filter.Offset := Footer_Array'First;
+ end if;
+
+ declare
+ Footer : Footer_Array;
+ begin
+ Put_32 (Footer, Filter.CRC);
+ Put_32 (Footer (Footer'First + 4 .. Footer'Last),
+ Unsigned_32 (Total_In (Filter)));
+ Add_Data (Footer);
+ end;
+ end if;
+ end Translate_GZip;
+
+ -------------
+ -- Version --
+ -------------
+
+ function Version return String is
+ begin
+ return Interfaces.C.Strings.Value (Thin.zlibVersion);
+ end Version;
+
+ -----------
+ -- Write --
+ -----------
+
+ procedure Write
+ (Filter : in out Filter_Type;
+ Item : in Ada.Streams.Stream_Element_Array;
+ Flush : in Flush_Mode := No_Flush)
+ is
+ Buffer : Stream_Element_Array (1 .. Buffer_Size);
+ In_Last : Stream_Element_Offset;
+ Out_Last : Stream_Element_Offset;
+ In_First : Stream_Element_Offset := Item'First;
+ begin
+ if Item'Length = 0 and Flush = No_Flush then
+ return;
+ end if;
+
+ loop
+ Translate
+ (Filter => Filter,
+ In_Data => Item (In_First .. Item'Last),
+ In_Last => In_Last,
+ Out_Data => Buffer,
+ Out_Last => Out_Last,
+ Flush => Flush);
+
+ if Out_Last >= Buffer'First then
+ Write (Buffer (1 .. Out_Last));
+ end if;
+
+ exit when In_Last = Item'Last or Stream_End (Filter);
+
+ In_First := In_Last + 1;
+ end loop;
+ end Write;
+
+end ZLib;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.ads b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.ads
new file mode 100644
index 000000000..79ffc4095
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.ads
@@ -0,0 +1,328 @@
+------------------------------------------------------------------------------
+-- ZLib for Ada thick binding. --
+-- --
+-- Copyright (C) 2002-2004 Dmitriy Anisimkov --
+-- --
+-- This library is free software; you can redistribute it and/or modify --
+-- it under the terms of the GNU General Public License as published by --
+-- the Free Software Foundation; either version 2 of the License, or (at --
+-- your option) any later version. --
+-- --
+-- This library is distributed in the hope that it will be useful, but --
+-- WITHOUT ANY WARRANTY; without even the implied warranty of --
+-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
+-- General Public License for more details. --
+-- --
+-- You should have received a copy of the GNU General Public License --
+-- along with this library; if not, write to the Free Software Foundation, --
+-- Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
+-- --
+-- As a special exception, if other files instantiate generics from this --
+-- unit, or you link this unit with other files to produce an executable, --
+-- this unit does not by itself cause the resulting executable to be --
+-- covered by the GNU General Public License. This exception does not --
+-- however invalidate any other reasons why the executable file might be --
+-- covered by the GNU Public License. --
+------------------------------------------------------------------------------
+
+-- $Id: zlib.ads,v 1.26 2004/09/06 06:53:19 vagul Exp $
+
+with Ada.Streams;
+
+with Interfaces;
+
+package ZLib is
+
+ ZLib_Error : exception;
+ Status_Error : exception;
+
+ type Compression_Level is new Integer range -1 .. 9;
+
+ type Flush_Mode is private;
+
+ type Compression_Method is private;
+
+ type Window_Bits_Type is new Integer range 8 .. 15;
+
+ type Memory_Level_Type is new Integer range 1 .. 9;
+
+ type Unsigned_32 is new Interfaces.Unsigned_32;
+
+ type Strategy_Type is private;
+
+ type Header_Type is (None, Auto, Default, GZip);
+ -- Header type usage have a some limitation for inflate.
+ -- See comment for Inflate_Init.
+
+ subtype Count is Ada.Streams.Stream_Element_Count;
+
+ Default_Memory_Level : constant Memory_Level_Type := 8;
+ Default_Window_Bits : constant Window_Bits_Type := 15;
+
+ ----------------------------------
+ -- Compression method constants --
+ ----------------------------------
+
+ Deflated : constant Compression_Method;
+ -- Only one method allowed in this ZLib version
+
+ ---------------------------------
+ -- Compression level constants --
+ ---------------------------------
+
+ No_Compression : constant Compression_Level := 0;
+ Best_Speed : constant Compression_Level := 1;
+ Best_Compression : constant Compression_Level := 9;
+ Default_Compression : constant Compression_Level := -1;
+
+ --------------------------
+ -- Flush mode constants --
+ --------------------------
+
+ No_Flush : constant Flush_Mode;
+ -- Regular way for compression, no flush
+
+ Partial_Flush : constant Flush_Mode;
+ -- Will be removed, use Z_SYNC_FLUSH instead
+
+ Sync_Flush : constant Flush_Mode;
+ -- All pending output is flushed to the output buffer and the output
+ -- is aligned on a byte boundary, so that the decompressor can get all
+ -- input data available so far. (In particular avail_in is zero after the
+ -- call if enough output space has been provided before the call.)
+ -- Flushing may degrade compression for some compression algorithms and so
+ -- it should be used only when necessary.
+
+ Block_Flush : constant Flush_Mode;
+ -- Z_BLOCK requests that inflate() stop
+ -- if and when it get to the next deflate block boundary. When decoding the
+ -- zlib or gzip format, this will cause inflate() to return immediately
+ -- after the header and before the first block. When doing a raw inflate,
+ -- inflate() will go ahead and process the first block, and will return
+ -- when it gets to the end of that block, or when it runs out of data.
+
+ Full_Flush : constant Flush_Mode;
+ -- All output is flushed as with SYNC_FLUSH, and the compression state
+ -- is reset so that decompression can restart from this point if previous
+ -- compressed data has been damaged or if random access is desired. Using
+ -- Full_Flush too often can seriously degrade the compression.
+
+ Finish : constant Flush_Mode;
+ -- Just for tell the compressor that input data is complete.
+
+ ------------------------------------
+ -- Compression strategy constants --
+ ------------------------------------
+
+ -- RLE stategy could be used only in version 1.2.0 and later.
+
+ Filtered : constant Strategy_Type;
+ Huffman_Only : constant Strategy_Type;
+ RLE : constant Strategy_Type;
+ Default_Strategy : constant Strategy_Type;
+
+ Default_Buffer_Size : constant := 4096;
+
+ type Filter_Type is tagged limited private;
+ -- The filter is for compression and for decompression.
+ -- The usage of the type is depend of its initialization.
+
+ function Version return String;
+ pragma Inline (Version);
+ -- Return string representation of the ZLib version.
+
+ procedure Deflate_Init
+ (Filter : in out Filter_Type;
+ Level : in Compression_Level := Default_Compression;
+ Strategy : in Strategy_Type := Default_Strategy;
+ Method : in Compression_Method := Deflated;
+ Window_Bits : in Window_Bits_Type := Default_Window_Bits;
+ Memory_Level : in Memory_Level_Type := Default_Memory_Level;
+ Header : in Header_Type := Default);
+ -- Compressor initialization.
+ -- When Header parameter is Auto or Default, then default zlib header
+ -- would be provided for compressed data.
+ -- When Header is GZip, then gzip header would be set instead of
+ -- default header.
+ -- When Header is None, no header would be set for compressed data.
+
+ procedure Inflate_Init
+ (Filter : in out Filter_Type;
+ Window_Bits : in Window_Bits_Type := Default_Window_Bits;
+ Header : in Header_Type := Default);
+ -- Decompressor initialization.
+ -- Default header type mean that ZLib default header is expecting in the
+ -- input compressed stream.
+ -- Header type None mean that no header is expecting in the input stream.
+ -- GZip header type mean that GZip header is expecting in the
+ -- input compressed stream.
+ -- Auto header type mean that header type (GZip or Native) would be
+ -- detected automatically in the input stream.
+ -- Note that header types parameter values None, GZip and Auto are
+ -- supported for inflate routine only in ZLib versions 1.2.0.2 and later.
+ -- Deflate_Init is supporting all header types.
+
+ function Is_Open (Filter : in Filter_Type) return Boolean;
+ pragma Inline (Is_Open);
+ -- Is the filter opened for compression or decompression.
+
+ procedure Close
+ (Filter : in out Filter_Type;
+ Ignore_Error : in Boolean := False);
+ -- Closing the compression or decompressor.
+ -- If stream is closing before the complete and Ignore_Error is False,
+ -- The exception would be raised.
+
+ generic
+ with procedure Data_In
+ (Item : out Ada.Streams.Stream_Element_Array;
+ Last : out Ada.Streams.Stream_Element_Offset);
+ with procedure Data_Out
+ (Item : in Ada.Streams.Stream_Element_Array);
+ procedure Generic_Translate
+ (Filter : in out Filter_Type;
+ In_Buffer_Size : in Integer := Default_Buffer_Size;
+ Out_Buffer_Size : in Integer := Default_Buffer_Size);
+ -- Compress/decompress data fetch from Data_In routine and pass the result
+ -- to the Data_Out routine. User should provide Data_In and Data_Out
+ -- for compression/decompression data flow.
+ -- Compression or decompression depend on Filter initialization.
+
+ function Total_In (Filter : in Filter_Type) return Count;
+ pragma Inline (Total_In);
+ -- Returns total number of input bytes read so far
+
+ function Total_Out (Filter : in Filter_Type) return Count;
+ pragma Inline (Total_Out);
+ -- Returns total number of bytes output so far
+
+ function CRC32
+ (CRC : in Unsigned_32;
+ Data : in Ada.Streams.Stream_Element_Array)
+ return Unsigned_32;
+ pragma Inline (CRC32);
+ -- Compute CRC32, it could be necessary for make gzip format
+
+ procedure CRC32
+ (CRC : in out Unsigned_32;
+ Data : in Ada.Streams.Stream_Element_Array);
+ pragma Inline (CRC32);
+ -- Compute CRC32, it could be necessary for make gzip format
+
+ -------------------------------------------------
+ -- Below is more complex low level routines. --
+ -------------------------------------------------
+
+ procedure Translate
+ (Filter : in out Filter_Type;
+ In_Data : in Ada.Streams.Stream_Element_Array;
+ In_Last : out Ada.Streams.Stream_Element_Offset;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode);
+ -- Compress/decompress the In_Data buffer and place the result into
+ -- Out_Data. In_Last is the index of last element from In_Data accepted by
+ -- the Filter. Out_Last is the last element of the received data from
+ -- Filter. To tell the filter that incoming data are complete put the
+ -- Flush parameter to Finish.
+
+ function Stream_End (Filter : in Filter_Type) return Boolean;
+ pragma Inline (Stream_End);
+ -- Return the true when the stream is complete.
+
+ procedure Flush
+ (Filter : in out Filter_Type;
+ Out_Data : out Ada.Streams.Stream_Element_Array;
+ Out_Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode);
+ pragma Inline (Flush);
+ -- Flushing the data from the compressor.
+
+ generic
+ with procedure Write
+ (Item : in Ada.Streams.Stream_Element_Array);
+ -- User should provide this routine for accept
+ -- compressed/decompressed data.
+
+ Buffer_Size : in Ada.Streams.Stream_Element_Offset
+ := Default_Buffer_Size;
+ -- Buffer size for Write user routine.
+
+ procedure Write
+ (Filter : in out Filter_Type;
+ Item : in Ada.Streams.Stream_Element_Array;
+ Flush : in Flush_Mode := No_Flush);
+ -- Compress/Decompress data from Item to the generic parameter procedure
+ -- Write. Output buffer size could be set in Buffer_Size generic parameter.
+
+ generic
+ with procedure Read
+ (Item : out Ada.Streams.Stream_Element_Array;
+ Last : out Ada.Streams.Stream_Element_Offset);
+ -- User should provide data for compression/decompression
+ -- thru this routine.
+
+ Buffer : in out Ada.Streams.Stream_Element_Array;
+ -- Buffer for keep remaining data from the previous
+ -- back read.
+
+ Rest_First, Rest_Last : in out Ada.Streams.Stream_Element_Offset;
+ -- Rest_First have to be initialized to Buffer'Last + 1
+ -- Rest_Last have to be initialized to Buffer'Last
+ -- before usage.
+
+ Allow_Read_Some : in Boolean := False;
+ -- Is it allowed to return Last < Item'Last before end of data.
+
+ procedure Read
+ (Filter : in out Filter_Type;
+ Item : out Ada.Streams.Stream_Element_Array;
+ Last : out Ada.Streams.Stream_Element_Offset;
+ Flush : in Flush_Mode := No_Flush);
+ -- Compress/Decompress data from generic parameter procedure Read to the
+ -- Item. User should provide Buffer and initialized Rest_First, Rest_Last
+ -- indicators. If Allow_Read_Some is True, Read routines could return
+ -- Last < Item'Last only at end of stream.
+
+private
+
+ use Ada.Streams;
+
+ pragma Assert (Ada.Streams.Stream_Element'Size = 8);
+ pragma Assert (Ada.Streams.Stream_Element'Modulus = 2**8);
+
+ type Flush_Mode is new Integer range 0 .. 5;
+
+ type Compression_Method is new Integer range 8 .. 8;
+
+ type Strategy_Type is new Integer range 0 .. 3;
+
+ No_Flush : constant Flush_Mode := 0;
+ Partial_Flush : constant Flush_Mode := 1;
+ Sync_Flush : constant Flush_Mode := 2;
+ Full_Flush : constant Flush_Mode := 3;
+ Finish : constant Flush_Mode := 4;
+ Block_Flush : constant Flush_Mode := 5;
+
+ Filtered : constant Strategy_Type := 1;
+ Huffman_Only : constant Strategy_Type := 2;
+ RLE : constant Strategy_Type := 3;
+ Default_Strategy : constant Strategy_Type := 0;
+
+ Deflated : constant Compression_Method := 8;
+
+ type Z_Stream;
+
+ type Z_Stream_Access is access all Z_Stream;
+
+ type Filter_Type is tagged limited record
+ Strm : Z_Stream_Access;
+ Compression : Boolean;
+ Stream_End : Boolean;
+ Header : Header_Type;
+ CRC : Unsigned_32;
+ Offset : Stream_Element_Offset;
+ -- Offset for gzip header/footer output.
+ end record;
+
+end ZLib;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.gpr b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.gpr
new file mode 100644
index 000000000..296b22aa9
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/ada/zlib.gpr
@@ -0,0 +1,20 @@
+project Zlib is
+
+ for Languages use ("Ada");
+ for Source_Dirs use (".");
+ for Object_Dir use ".";
+ for Main use ("test.adb", "mtest.adb", "read.adb", "buffer_demo");
+
+ package Compiler is
+ for Default_Switches ("ada") use ("-gnatwcfilopru", "-gnatVcdfimorst", "-gnatyabcefhiklmnoprst");
+ end Compiler;
+
+ package Linker is
+ for Default_Switches ("ada") use ("-lz");
+ end Linker;
+
+ package Builder is
+ for Default_Switches ("ada") use ("-s", "-gnatQ");
+ end Builder;
+
+end Zlib;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/amd64/amd64-match.S b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/amd64/amd64-match.S
new file mode 100644
index 000000000..81d4a1c94
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/amd64/amd64-match.S
@@ -0,0 +1,452 @@
+/*
+ * match.S -- optimized version of longest_match()
+ * based on the similar work by Gilles Vollant, and Brian Raiter, written 1998
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the BSD License. Use by owners of Che Guevarra
+ * parafernalia is prohibited, where possible, and highly discouraged
+ * elsewhere.
+ */
+
+#ifndef NO_UNDERLINE
+# define match_init _match_init
+# define longest_match _longest_match
+#endif
+
+#define scanend ebx
+#define scanendw bx
+#define chainlenwmask edx /* high word: current chain len low word: s->wmask */
+#define curmatch rsi
+#define curmatchd esi
+#define windowbestlen r8
+#define scanalign r9
+#define scanalignd r9d
+#define window r10
+#define bestlen r11
+#define bestlend r11d
+#define scanstart r12d
+#define scanstartw r12w
+#define scan r13
+#define nicematch r14d
+#define limit r15
+#define limitd r15d
+#define prev rcx
+
+/*
+ * The 258 is a "magic number, not a parameter -- changing it
+ * breaks the hell loose
+ */
+#define MAX_MATCH (258)
+#define MIN_MATCH (3)
+#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
+#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
+
+/* stack frame offsets */
+#define LocalVarsSize (112)
+#define _chainlenwmask ( 8-LocalVarsSize)(%rsp)
+#define _windowbestlen (16-LocalVarsSize)(%rsp)
+#define save_r14 (24-LocalVarsSize)(%rsp)
+#define save_rsi (32-LocalVarsSize)(%rsp)
+#define save_rbx (40-LocalVarsSize)(%rsp)
+#define save_r12 (56-LocalVarsSize)(%rsp)
+#define save_r13 (64-LocalVarsSize)(%rsp)
+#define save_r15 (80-LocalVarsSize)(%rsp)
+
+
+.globl match_init, longest_match
+
+/*
+ * On AMD64 the first argument of a function (in our case -- the pointer to
+ * deflate_state structure) is passed in %rdi, hence our offsets below are
+ * all off of that.
+ */
+
+/* you can check the structure offset by running
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "deflate.h"
+
+void print_depl()
+{
+deflate_state ds;
+deflate_state *s=&ds;
+printf("size pointer=%u\n",(int)sizeof(void*));
+
+printf("#define dsWSize (%3u)(%%rdi)\n",(int)(((char*)&(s->w_size))-((char*)s)));
+printf("#define dsWMask (%3u)(%%rdi)\n",(int)(((char*)&(s->w_mask))-((char*)s)));
+printf("#define dsWindow (%3u)(%%rdi)\n",(int)(((char*)&(s->window))-((char*)s)));
+printf("#define dsPrev (%3u)(%%rdi)\n",(int)(((char*)&(s->prev))-((char*)s)));
+printf("#define dsMatchLen (%3u)(%%rdi)\n",(int)(((char*)&(s->match_length))-((char*)s)));
+printf("#define dsPrevMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_match))-((char*)s)));
+printf("#define dsStrStart (%3u)(%%rdi)\n",(int)(((char*)&(s->strstart))-((char*)s)));
+printf("#define dsMatchStart (%3u)(%%rdi)\n",(int)(((char*)&(s->match_start))-((char*)s)));
+printf("#define dsLookahead (%3u)(%%rdi)\n",(int)(((char*)&(s->lookahead))-((char*)s)));
+printf("#define dsPrevLen (%3u)(%%rdi)\n",(int)(((char*)&(s->prev_length))-((char*)s)));
+printf("#define dsMaxChainLen (%3u)(%%rdi)\n",(int)(((char*)&(s->max_chain_length))-((char*)s)));
+printf("#define dsGoodMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->good_match))-((char*)s)));
+printf("#define dsNiceMatch (%3u)(%%rdi)\n",(int)(((char*)&(s->nice_match))-((char*)s)));
+}
+
+*/
+
+
+/*
+ to compile for XCode 3.2 on MacOSX x86_64
+ - run "gcc -g -c -DXCODE_MAC_X64_STRUCTURE amd64-match.S"
+ */
+
+
+#ifndef CURRENT_LINX_XCODE_MAC_X64_STRUCTURE
+#define dsWSize ( 68)(%rdi)
+#define dsWMask ( 76)(%rdi)
+#define dsWindow ( 80)(%rdi)
+#define dsPrev ( 96)(%rdi)
+#define dsMatchLen (144)(%rdi)
+#define dsPrevMatch (148)(%rdi)
+#define dsStrStart (156)(%rdi)
+#define dsMatchStart (160)(%rdi)
+#define dsLookahead (164)(%rdi)
+#define dsPrevLen (168)(%rdi)
+#define dsMaxChainLen (172)(%rdi)
+#define dsGoodMatch (188)(%rdi)
+#define dsNiceMatch (192)(%rdi)
+
+#else
+
+#ifndef STRUCT_OFFSET
+# define STRUCT_OFFSET (0)
+#endif
+
+
+#define dsWSize ( 56 + STRUCT_OFFSET)(%rdi)
+#define dsWMask ( 64 + STRUCT_OFFSET)(%rdi)
+#define dsWindow ( 72 + STRUCT_OFFSET)(%rdi)
+#define dsPrev ( 88 + STRUCT_OFFSET)(%rdi)
+#define dsMatchLen (136 + STRUCT_OFFSET)(%rdi)
+#define dsPrevMatch (140 + STRUCT_OFFSET)(%rdi)
+#define dsStrStart (148 + STRUCT_OFFSET)(%rdi)
+#define dsMatchStart (152 + STRUCT_OFFSET)(%rdi)
+#define dsLookahead (156 + STRUCT_OFFSET)(%rdi)
+#define dsPrevLen (160 + STRUCT_OFFSET)(%rdi)
+#define dsMaxChainLen (164 + STRUCT_OFFSET)(%rdi)
+#define dsGoodMatch (180 + STRUCT_OFFSET)(%rdi)
+#define dsNiceMatch (184 + STRUCT_OFFSET)(%rdi)
+
+#endif
+
+
+
+
+.text
+
+/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
+
+longest_match:
+/*
+ * Retrieve the function arguments. %curmatch will hold cur_match
+ * throughout the entire function (passed via rsi on amd64).
+ * rdi will hold the pointer to the deflate_state (first arg on amd64)
+ */
+ mov %rsi, save_rsi
+ mov %rbx, save_rbx
+ mov %r12, save_r12
+ mov %r13, save_r13
+ mov %r14, save_r14
+ mov %r15, save_r15
+
+/* uInt wmask = s->w_mask; */
+/* unsigned chain_length = s->max_chain_length; */
+/* if (s->prev_length >= s->good_match) { */
+/* chain_length >>= 2; */
+/* } */
+
+ movl dsPrevLen, %eax
+ movl dsGoodMatch, %ebx
+ cmpl %ebx, %eax
+ movl dsWMask, %eax
+ movl dsMaxChainLen, %chainlenwmask
+ jl LastMatchGood
+ shrl $2, %chainlenwmask
+LastMatchGood:
+
+/* chainlen is decremented once beforehand so that the function can */
+/* use the sign flag instead of the zero flag for the exit test. */
+/* It is then shifted into the high word, to make room for the wmask */
+/* value, which it will always accompany. */
+
+ decl %chainlenwmask
+ shll $16, %chainlenwmask
+ orl %eax, %chainlenwmask
+
+/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
+
+ movl dsNiceMatch, %eax
+ movl dsLookahead, %ebx
+ cmpl %eax, %ebx
+ jl LookaheadLess
+ movl %eax, %ebx
+LookaheadLess: movl %ebx, %nicematch
+
+/* register Bytef *scan = s->window + s->strstart; */
+
+ mov dsWindow, %window
+ movl dsStrStart, %limitd
+ lea (%limit, %window), %scan
+
+/* Determine how many bytes the scan ptr is off from being */
+/* dword-aligned. */
+
+ mov %scan, %scanalign
+ negl %scanalignd
+ andl $3, %scanalignd
+
+/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
+/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
+
+ movl dsWSize, %eax
+ subl $MIN_LOOKAHEAD, %eax
+ xorl %ecx, %ecx
+ subl %eax, %limitd
+ cmovng %ecx, %limitd
+
+/* int best_len = s->prev_length; */
+
+ movl dsPrevLen, %bestlend
+
+/* Store the sum of s->window + best_len in %windowbestlen locally, and in memory. */
+
+ lea (%window, %bestlen), %windowbestlen
+ mov %windowbestlen, _windowbestlen
+
+/* register ush scan_start = *(ushf*)scan; */
+/* register ush scan_end = *(ushf*)(scan+best_len-1); */
+/* Posf *prev = s->prev; */
+
+ movzwl (%scan), %scanstart
+ movzwl -1(%scan, %bestlen), %scanend
+ mov dsPrev, %prev
+
+/* Jump into the main loop. */
+
+ movl %chainlenwmask, _chainlenwmask
+ jmp LoopEntry
+
+.balign 16
+
+/* do {
+ * match = s->window + cur_match;
+ * if (*(ushf*)(match+best_len-1) != scan_end ||
+ * *(ushf*)match != scan_start) continue;
+ * [...]
+ * } while ((cur_match = prev[cur_match & wmask]) > limit
+ * && --chain_length != 0);
+ *
+ * Here is the inner loop of the function. The function will spend the
+ * majority of its time in this loop, and majority of that time will
+ * be spent in the first ten instructions.
+ */
+LookupLoop:
+ andl %chainlenwmask, %curmatchd
+ movzwl (%prev, %curmatch, 2), %curmatchd
+ cmpl %limitd, %curmatchd
+ jbe LeaveNow
+ subl $0x00010000, %chainlenwmask
+ js LeaveNow
+LoopEntry: cmpw -1(%windowbestlen, %curmatch), %scanendw
+ jne LookupLoop
+ cmpw %scanstartw, (%window, %curmatch)
+ jne LookupLoop
+
+/* Store the current value of chainlen. */
+ movl %chainlenwmask, _chainlenwmask
+
+/* %scan is the string under scrutiny, and %prev to the string we */
+/* are hoping to match it up with. In actuality, %esi and %edi are */
+/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
+/* initialized to -(MAX_MATCH_8 - scanalign). */
+
+ mov $(-MAX_MATCH_8), %rdx
+ lea (%curmatch, %window), %windowbestlen
+ lea MAX_MATCH_8(%windowbestlen, %scanalign), %windowbestlen
+ lea MAX_MATCH_8(%scan, %scanalign), %prev
+
+/* the prefetching below makes very little difference... */
+ prefetcht1 (%windowbestlen, %rdx)
+ prefetcht1 (%prev, %rdx)
+
+/*
+ * Test the strings for equality, 8 bytes at a time. At the end,
+ * adjust %rdx so that it is offset to the exact byte that mismatched.
+ *
+ * It should be confessed that this loop usually does not represent
+ * much of the total running time. Replacing it with a more
+ * straightforward "rep cmpsb" would not drastically degrade
+ * performance -- unrolling it, for example, makes no difference.
+ */
+
+#undef USE_SSE /* works, but is 6-7% slower, than non-SSE... */
+
+LoopCmps:
+#ifdef USE_SSE
+ /* Preload the SSE registers */
+ movdqu (%windowbestlen, %rdx), %xmm1
+ movdqu (%prev, %rdx), %xmm2
+ pcmpeqb %xmm2, %xmm1
+ movdqu 16(%windowbestlen, %rdx), %xmm3
+ movdqu 16(%prev, %rdx), %xmm4
+ pcmpeqb %xmm4, %xmm3
+ movdqu 32(%windowbestlen, %rdx), %xmm5
+ movdqu 32(%prev, %rdx), %xmm6
+ pcmpeqb %xmm6, %xmm5
+ movdqu 48(%windowbestlen, %rdx), %xmm7
+ movdqu 48(%prev, %rdx), %xmm8
+ pcmpeqb %xmm8, %xmm7
+
+ /* Check the comparisions' results */
+ pmovmskb %xmm1, %rax
+ notw %ax
+ bsfw %ax, %ax
+ jnz LeaveLoopCmps
+
+ /* this is the only iteration of the loop with a possibility of having
+ incremented rdx by 0x108 (each loop iteration add 16*4 = 0x40
+ and (0x40*4)+8=0x108 */
+ add $8, %rdx
+ jz LenMaximum
+ add $8, %rdx
+
+
+ pmovmskb %xmm3, %rax
+ notw %ax
+ bsfw %ax, %ax
+ jnz LeaveLoopCmps
+
+
+ add $16, %rdx
+
+
+ pmovmskb %xmm5, %rax
+ notw %ax
+ bsfw %ax, %ax
+ jnz LeaveLoopCmps
+
+ add $16, %rdx
+
+
+ pmovmskb %xmm7, %rax
+ notw %ax
+ bsfw %ax, %ax
+ jnz LeaveLoopCmps
+
+ add $16, %rdx
+
+ jmp LoopCmps
+LeaveLoopCmps: add %rax, %rdx
+#else
+ mov (%windowbestlen, %rdx), %rax
+ xor (%prev, %rdx), %rax
+ jnz LeaveLoopCmps
+
+ mov 8(%windowbestlen, %rdx), %rax
+ xor 8(%prev, %rdx), %rax
+ jnz LeaveLoopCmps8
+
+ mov 16(%windowbestlen, %rdx), %rax
+ xor 16(%prev, %rdx), %rax
+ jnz LeaveLoopCmps16
+
+ add $24, %rdx
+ jnz LoopCmps
+ jmp LenMaximum
+# if 0
+/*
+ * This three-liner is tantalizingly simple, but bsf is a slow instruction,
+ * and the complicated alternative down below is quite a bit faster. Sad...
+ */
+
+LeaveLoopCmps: bsf %rax, %rax /* find the first non-zero bit */
+ shrl $3, %eax /* divide by 8 to get the byte */
+ add %rax, %rdx
+# else
+LeaveLoopCmps16:
+ add $8, %rdx
+LeaveLoopCmps8:
+ add $8, %rdx
+LeaveLoopCmps: testl $0xFFFFFFFF, %eax /* Check the first 4 bytes */
+ jnz Check16
+ add $4, %rdx
+ shr $32, %rax
+Check16: testw $0xFFFF, %ax
+ jnz LenLower
+ add $2, %rdx
+ shrl $16, %eax
+LenLower: subb $1, %al
+ adc $0, %rdx
+# endif
+#endif
+
+/* Calculate the length of the match. If it is longer than MAX_MATCH, */
+/* then automatically accept it as the best possible match and leave. */
+
+ lea (%prev, %rdx), %rax
+ sub %scan, %rax
+ cmpl $MAX_MATCH, %eax
+ jge LenMaximum
+
+/* If the length of the match is not longer than the best match we */
+/* have so far, then forget it and return to the lookup loop. */
+
+ cmpl %bestlend, %eax
+ jg LongerMatch
+ mov _windowbestlen, %windowbestlen
+ mov dsPrev, %prev
+ movl _chainlenwmask, %edx
+ jmp LookupLoop
+
+/* s->match_start = cur_match; */
+/* best_len = len; */
+/* if (len >= nice_match) break; */
+/* scan_end = *(ushf*)(scan+best_len-1); */
+
+LongerMatch:
+ movl %eax, %bestlend
+ movl %curmatchd, dsMatchStart
+ cmpl %nicematch, %eax
+ jge LeaveNow
+
+ lea (%window, %bestlen), %windowbestlen
+ mov %windowbestlen, _windowbestlen
+
+ movzwl -1(%scan, %rax), %scanend
+ mov dsPrev, %prev
+ movl _chainlenwmask, %chainlenwmask
+ jmp LookupLoop
+
+/* Accept the current string, with the maximum possible length. */
+
+LenMaximum:
+ movl $MAX_MATCH, %bestlend
+ movl %curmatchd, dsMatchStart
+
+/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
+/* return s->lookahead; */
+
+LeaveNow:
+ movl dsLookahead, %eax
+ cmpl %eax, %bestlend
+ cmovngl %bestlend, %eax
+LookaheadRet:
+
+/* Restore the registers and return from whence we came. */
+
+ mov save_rsi, %rsi
+ mov save_rbx, %rbx
+ mov save_r12, %r12
+ mov save_r13, %r13
+ mov save_r14, %r14
+ mov save_r15, %r15
+
+ ret
+
+match_init: ret
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/README.686 b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/README.686
new file mode 100644
index 000000000..a0bf3bea4
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/README.686
@@ -0,0 +1,51 @@
+This is a patched version of zlib, modified to use
+Pentium-Pro-optimized assembly code in the deflation algorithm. The
+files changed/added by this patch are:
+
+README.686
+match.S
+
+The speedup that this patch provides varies, depending on whether the
+compiler used to build the original version of zlib falls afoul of the
+PPro's speed traps. My own tests show a speedup of around 10-20% at
+the default compression level, and 20-30% using -9, against a version
+compiled using gcc 2.7.2.3. Your mileage may vary.
+
+Note that this code has been tailored for the PPro/PII in particular,
+and will not perform particuarly well on a Pentium.
+
+If you are using an assembler other than GNU as, you will have to
+translate match.S to use your assembler's syntax. (Have fun.)
+
+Brian Raiter
+breadbox@muppetlabs.com
+April, 1998
+
+
+Added for zlib 1.1.3:
+
+The patches come from
+http://www.muppetlabs.com/~breadbox/software/assembly.html
+
+To compile zlib with this asm file, copy match.S to the zlib directory
+then do:
+
+CFLAGS="-O3 -DASMV" ./configure
+make OBJA=match.o
+
+
+Update:
+
+I've been ignoring these assembly routines for years, believing that
+gcc's generated code had caught up with it sometime around gcc 2.95
+and the major rearchitecting of the Pentium 4. However, I recently
+learned that, despite what I believed, this code still has some life
+in it. On the Pentium 4 and AMD64 chips, it continues to run about 8%
+faster than the code produced by gcc 4.1.
+
+In acknowledgement of its continuing usefulness, I've altered the
+license to match that of the rest of zlib. Share and Enjoy!
+
+Brian Raiter
+breadbox@muppetlabs.com
+April, 2007
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/match.S b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/match.S
new file mode 100644
index 000000000..fa4210927
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/asm686/match.S
@@ -0,0 +1,357 @@
+/* match.S -- x86 assembly version of the zlib longest_match() function.
+ * Optimized for the Intel 686 chips (PPro and later).
+ *
+ * Copyright (C) 1998, 2007 Brian Raiter <breadbox@muppetlabs.com>
+ *
+ * This software is provided 'as-is', without any express or implied
+ * warranty. In no event will the author be held liable for any damages
+ * arising from the use of this software.
+ *
+ * Permission is granted to anyone to use this software for any purpose,
+ * including commercial applications, and to alter it and redistribute it
+ * freely, subject to the following restrictions:
+ *
+ * 1. The origin of this software must not be misrepresented; you must not
+ * claim that you wrote the original software. If you use this software
+ * in a product, an acknowledgment in the product documentation would be
+ * appreciated but is not required.
+ * 2. Altered source versions must be plainly marked as such, and must not be
+ * misrepresented as being the original software.
+ * 3. This notice may not be removed or altered from any source distribution.
+ */
+
+#ifndef NO_UNDERLINE
+#define match_init _match_init
+#define longest_match _longest_match
+#endif
+
+#define MAX_MATCH (258)
+#define MIN_MATCH (3)
+#define MIN_LOOKAHEAD (MAX_MATCH + MIN_MATCH + 1)
+#define MAX_MATCH_8 ((MAX_MATCH + 7) & ~7)
+
+/* stack frame offsets */
+
+#define chainlenwmask 0 /* high word: current chain len */
+ /* low word: s->wmask */
+#define window 4 /* local copy of s->window */
+#define windowbestlen 8 /* s->window + bestlen */
+#define scanstart 16 /* first two bytes of string */
+#define scanend 12 /* last two bytes of string */
+#define scanalign 20 /* dword-misalignment of string */
+#define nicematch 24 /* a good enough match size */
+#define bestlen 28 /* size of best match so far */
+#define scan 32 /* ptr to string wanting match */
+
+#define LocalVarsSize (36)
+/* saved ebx 36 */
+/* saved edi 40 */
+/* saved esi 44 */
+/* saved ebp 48 */
+/* return address 52 */
+#define deflatestate 56 /* the function arguments */
+#define curmatch 60
+
+/* All the +zlib1222add offsets are due to the addition of fields
+ * in zlib in the deflate_state structure since the asm code was first written
+ * (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
+ * (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
+ * if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
+ */
+
+#define zlib1222add (8)
+
+#define dsWSize (36+zlib1222add)
+#define dsWMask (44+zlib1222add)
+#define dsWindow (48+zlib1222add)
+#define dsPrev (56+zlib1222add)
+#define dsMatchLen (88+zlib1222add)
+#define dsPrevMatch (92+zlib1222add)
+#define dsStrStart (100+zlib1222add)
+#define dsMatchStart (104+zlib1222add)
+#define dsLookahead (108+zlib1222add)
+#define dsPrevLen (112+zlib1222add)
+#define dsMaxChainLen (116+zlib1222add)
+#define dsGoodMatch (132+zlib1222add)
+#define dsNiceMatch (136+zlib1222add)
+
+
+.file "match.S"
+
+.globl match_init, longest_match
+
+.text
+
+/* uInt longest_match(deflate_state *deflatestate, IPos curmatch) */
+.cfi_sections .debug_frame
+
+longest_match:
+
+.cfi_startproc
+/* Save registers that the compiler may be using, and adjust %esp to */
+/* make room for our stack frame. */
+
+ pushl %ebp
+ .cfi_def_cfa_offset 8
+ .cfi_offset ebp, -8
+ pushl %edi
+ .cfi_def_cfa_offset 12
+ pushl %esi
+ .cfi_def_cfa_offset 16
+ pushl %ebx
+ .cfi_def_cfa_offset 20
+ subl $LocalVarsSize, %esp
+ .cfi_def_cfa_offset LocalVarsSize+20
+
+/* Retrieve the function arguments. %ecx will hold cur_match */
+/* throughout the entire function. %edx will hold the pointer to the */
+/* deflate_state structure during the function's setup (before */
+/* entering the main loop). */
+
+ movl deflatestate(%esp), %edx
+ movl curmatch(%esp), %ecx
+
+/* uInt wmask = s->w_mask; */
+/* unsigned chain_length = s->max_chain_length; */
+/* if (s->prev_length >= s->good_match) { */
+/* chain_length >>= 2; */
+/* } */
+
+ movl dsPrevLen(%edx), %eax
+ movl dsGoodMatch(%edx), %ebx
+ cmpl %ebx, %eax
+ movl dsWMask(%edx), %eax
+ movl dsMaxChainLen(%edx), %ebx
+ jl LastMatchGood
+ shrl $2, %ebx
+LastMatchGood:
+
+/* chainlen is decremented once beforehand so that the function can */
+/* use the sign flag instead of the zero flag for the exit test. */
+/* It is then shifted into the high word, to make room for the wmask */
+/* value, which it will always accompany. */
+
+ decl %ebx
+ shll $16, %ebx
+ orl %eax, %ebx
+ movl %ebx, chainlenwmask(%esp)
+
+/* if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead; */
+
+ movl dsNiceMatch(%edx), %eax
+ movl dsLookahead(%edx), %ebx
+ cmpl %eax, %ebx
+ jl LookaheadLess
+ movl %eax, %ebx
+LookaheadLess: movl %ebx, nicematch(%esp)
+
+/* register Bytef *scan = s->window + s->strstart; */
+
+ movl dsWindow(%edx), %esi
+ movl %esi, window(%esp)
+ movl dsStrStart(%edx), %ebp
+ lea (%esi,%ebp), %edi
+ movl %edi, scan(%esp)
+
+/* Determine how many bytes the scan ptr is off from being */
+/* dword-aligned. */
+
+ movl %edi, %eax
+ negl %eax
+ andl $3, %eax
+ movl %eax, scanalign(%esp)
+
+/* IPos limit = s->strstart > (IPos)MAX_DIST(s) ? */
+/* s->strstart - (IPos)MAX_DIST(s) : NIL; */
+
+ movl dsWSize(%edx), %eax
+ subl $MIN_LOOKAHEAD, %eax
+ subl %eax, %ebp
+ jg LimitPositive
+ xorl %ebp, %ebp
+LimitPositive:
+
+/* int best_len = s->prev_length; */
+
+ movl dsPrevLen(%edx), %eax
+ movl %eax, bestlen(%esp)
+
+/* Store the sum of s->window + best_len in %esi locally, and in %esi. */
+
+ addl %eax, %esi
+ movl %esi, windowbestlen(%esp)
+
+/* register ush scan_start = *(ushf*)scan; */
+/* register ush scan_end = *(ushf*)(scan+best_len-1); */
+/* Posf *prev = s->prev; */
+
+ movzwl (%edi), %ebx
+ movl %ebx, scanstart(%esp)
+ movzwl -1(%edi,%eax), %ebx
+ movl %ebx, scanend(%esp)
+ movl dsPrev(%edx), %edi
+
+/* Jump into the main loop. */
+
+ movl chainlenwmask(%esp), %edx
+ jmp LoopEntry
+
+.balign 16
+
+/* do {
+ * match = s->window + cur_match;
+ * if (*(ushf*)(match+best_len-1) != scan_end ||
+ * *(ushf*)match != scan_start) continue;
+ * [...]
+ * } while ((cur_match = prev[cur_match & wmask]) > limit
+ * && --chain_length != 0);
+ *
+ * Here is the inner loop of the function. The function will spend the
+ * majority of its time in this loop, and majority of that time will
+ * be spent in the first ten instructions.
+ *
+ * Within this loop:
+ * %ebx = scanend
+ * %ecx = curmatch
+ * %edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
+ * %esi = windowbestlen - i.e., (window + bestlen)
+ * %edi = prev
+ * %ebp = limit
+ */
+LookupLoop:
+ andl %edx, %ecx
+ movzwl (%edi,%ecx,2), %ecx
+ cmpl %ebp, %ecx
+ jbe LeaveNow
+ subl $0x00010000, %edx
+ js LeaveNow
+LoopEntry: movzwl -1(%esi,%ecx), %eax
+ cmpl %ebx, %eax
+ jnz LookupLoop
+ movl window(%esp), %eax
+ movzwl (%eax,%ecx), %eax
+ cmpl scanstart(%esp), %eax
+ jnz LookupLoop
+
+/* Store the current value of chainlen. */
+
+ movl %edx, chainlenwmask(%esp)
+
+/* Point %edi to the string under scrutiny, and %esi to the string we */
+/* are hoping to match it up with. In actuality, %esi and %edi are */
+/* both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and %edx is */
+/* initialized to -(MAX_MATCH_8 - scanalign). */
+
+ movl window(%esp), %esi
+ movl scan(%esp), %edi
+ addl %ecx, %esi
+ movl scanalign(%esp), %eax
+ movl $(-MAX_MATCH_8), %edx
+ lea MAX_MATCH_8(%edi,%eax), %edi
+ lea MAX_MATCH_8(%esi,%eax), %esi
+
+/* Test the strings for equality, 8 bytes at a time. At the end,
+ * adjust %edx so that it is offset to the exact byte that mismatched.
+ *
+ * We already know at this point that the first three bytes of the
+ * strings match each other, and they can be safely passed over before
+ * starting the compare loop. So what this code does is skip over 0-3
+ * bytes, as much as necessary in order to dword-align the %edi
+ * pointer. (%esi will still be misaligned three times out of four.)
+ *
+ * It should be confessed that this loop usually does not represent
+ * much of the total running time. Replacing it with a more
+ * straightforward "rep cmpsb" would not drastically degrade
+ * performance.
+ */
+LoopCmps:
+ movl (%esi,%edx), %eax
+ xorl (%edi,%edx), %eax
+ jnz LeaveLoopCmps
+ movl 4(%esi,%edx), %eax
+ xorl 4(%edi,%edx), %eax
+ jnz LeaveLoopCmps4
+ addl $8, %edx
+ jnz LoopCmps
+ jmp LenMaximum
+LeaveLoopCmps4: addl $4, %edx
+LeaveLoopCmps: testl $0x0000FFFF, %eax
+ jnz LenLower
+ addl $2, %edx
+ shrl $16, %eax
+LenLower: subb $1, %al
+ adcl $0, %edx
+
+/* Calculate the length of the match. If it is longer than MAX_MATCH, */
+/* then automatically accept it as the best possible match and leave. */
+
+ lea (%edi,%edx), %eax
+ movl scan(%esp), %edi
+ subl %edi, %eax
+ cmpl $MAX_MATCH, %eax
+ jge LenMaximum
+
+/* If the length of the match is not longer than the best match we */
+/* have so far, then forget it and return to the lookup loop. */
+
+ movl deflatestate(%esp), %edx
+ movl bestlen(%esp), %ebx
+ cmpl %ebx, %eax
+ jg LongerMatch
+ movl windowbestlen(%esp), %esi
+ movl dsPrev(%edx), %edi
+ movl scanend(%esp), %ebx
+ movl chainlenwmask(%esp), %edx
+ jmp LookupLoop
+
+/* s->match_start = cur_match; */
+/* best_len = len; */
+/* if (len >= nice_match) break; */
+/* scan_end = *(ushf*)(scan+best_len-1); */
+
+LongerMatch: movl nicematch(%esp), %ebx
+ movl %eax, bestlen(%esp)
+ movl %ecx, dsMatchStart(%edx)
+ cmpl %ebx, %eax
+ jge LeaveNow
+ movl window(%esp), %esi
+ addl %eax, %esi
+ movl %esi, windowbestlen(%esp)
+ movzwl -1(%edi,%eax), %ebx
+ movl dsPrev(%edx), %edi
+ movl %ebx, scanend(%esp)
+ movl chainlenwmask(%esp), %edx
+ jmp LookupLoop
+
+/* Accept the current string, with the maximum possible length. */
+
+LenMaximum: movl deflatestate(%esp), %edx
+ movl $MAX_MATCH, bestlen(%esp)
+ movl %ecx, dsMatchStart(%edx)
+
+/* if ((uInt)best_len <= s->lookahead) return (uInt)best_len; */
+/* return s->lookahead; */
+
+LeaveNow:
+ movl deflatestate(%esp), %edx
+ movl bestlen(%esp), %ebx
+ movl dsLookahead(%edx), %eax
+ cmpl %eax, %ebx
+ jg LookaheadRet
+ movl %ebx, %eax
+LookaheadRet:
+
+/* Restore the stack and return from whence we came. */
+
+ addl $LocalVarsSize, %esp
+ .cfi_def_cfa_offset 20
+ popl %ebx
+ .cfi_def_cfa_offset 16
+ popl %esi
+ .cfi_def_cfa_offset 12
+ popl %edi
+ .cfi_def_cfa_offset 8
+ popl %ebp
+ .cfi_def_cfa_offset 4
+.cfi_endproc
+match_init: ret
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/Makefile b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/Makefile
new file mode 100644
index 000000000..9be80bafe
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/Makefile
@@ -0,0 +1,8 @@
+blast: blast.c blast.h
+ cc -DTEST -o blast blast.c
+
+test: blast
+ blast < test.pk | cmp - test.txt
+
+clean:
+ rm -f blast blast.o
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/README b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/README
new file mode 100644
index 000000000..e3a60b3f5
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/README
@@ -0,0 +1,4 @@
+Read blast.h for purpose and usage.
+
+Mark Adler
+madler@alumni.caltech.edu
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.c
new file mode 100644
index 000000000..e6e659073
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.c
@@ -0,0 +1,466 @@
+/* blast.c
+ * Copyright (C) 2003, 2012, 2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in blast.h
+ * version 1.3, 24 Aug 2013
+ *
+ * blast.c decompresses data compressed by the PKWare Compression Library.
+ * This function provides functionality similar to the explode() function of
+ * the PKWare library, hence the name "blast".
+ *
+ * This decompressor is based on the excellent format description provided by
+ * Ben Rudiak-Gould in comp.compression on August 13, 2001. Interestingly, the
+ * example Ben provided in the post is incorrect. The distance 110001 should
+ * instead be 111000. When corrected, the example byte stream becomes:
+ *
+ * 00 04 82 24 25 8f 80 7f
+ *
+ * which decompresses to "AIAIAIAIAIAIA" (without the quotes).
+ */
+
+/*
+ * Change history:
+ *
+ * 1.0 12 Feb 2003 - First version
+ * 1.1 16 Feb 2003 - Fixed distance check for > 4 GB uncompressed data
+ * 1.2 24 Oct 2012 - Add note about using binary mode in stdio
+ * - Fix comparisons of differently signed integers
+ * 1.3 24 Aug 2013 - Return unused input from blast()
+ * - Fix test code to correctly report unused input
+ * - Enable the provision of initial input to blast()
+ */
+
+#include <stddef.h> /* for NULL */
+#include <setjmp.h> /* for setjmp(), longjmp(), and jmp_buf */
+#include "blast.h" /* prototype for blast() */
+
+#define local static /* for local function definitions */
+#define MAXBITS 13 /* maximum code length */
+#define MAXWIN 4096 /* maximum window size */
+
+/* input and output state */
+struct state {
+ /* input state */
+ blast_in infun; /* input function provided by user */
+ void *inhow; /* opaque information passed to infun() */
+ unsigned char *in; /* next input location */
+ unsigned left; /* available input at in */
+ int bitbuf; /* bit buffer */
+ int bitcnt; /* number of bits in bit buffer */
+
+ /* input limit error return state for bits() and decode() */
+ jmp_buf env;
+
+ /* output state */
+ blast_out outfun; /* output function provided by user */
+ void *outhow; /* opaque information passed to outfun() */
+ unsigned next; /* index of next write location in out[] */
+ int first; /* true to check distances (for first 4K) */
+ unsigned char out[MAXWIN]; /* output buffer and sliding window */
+};
+
+/*
+ * Return need bits from the input stream. This always leaves less than
+ * eight bits in the buffer. bits() works properly for need == 0.
+ *
+ * Format notes:
+ *
+ * - Bits are stored in bytes from the least significant bit to the most
+ * significant bit. Therefore bits are dropped from the bottom of the bit
+ * buffer, using shift right, and new bytes are appended to the top of the
+ * bit buffer, using shift left.
+ */
+local int bits(struct state *s, int need)
+{
+ int val; /* bit accumulator */
+
+ /* load at least need bits into val */
+ val = s->bitbuf;
+ while (s->bitcnt < need) {
+ if (s->left == 0) {
+ s->left = s->infun(s->inhow, &(s->in));
+ if (s->left == 0) longjmp(s->env, 1); /* out of input */
+ }
+ val |= (int)(*(s->in)++) << s->bitcnt; /* load eight bits */
+ s->left--;
+ s->bitcnt += 8;
+ }
+
+ /* drop need bits and update buffer, always zero to seven bits left */
+ s->bitbuf = val >> need;
+ s->bitcnt -= need;
+
+ /* return need bits, zeroing the bits above that */
+ return val & ((1 << need) - 1);
+}
+
+/*
+ * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of
+ * each length, which for a canonical code are stepped through in order.
+ * symbol[] are the symbol values in canonical order, where the number of
+ * entries is the sum of the counts in count[]. The decoding process can be
+ * seen in the function decode() below.
+ */
+struct huffman {
+ short *count; /* number of symbols of each length */
+ short *symbol; /* canonically ordered symbols */
+};
+
+/*
+ * Decode a code from the stream s using huffman table h. Return the symbol or
+ * a negative value if there is an error. If all of the lengths are zero, i.e.
+ * an empty code, or if the code is incomplete and an invalid code is received,
+ * then -9 is returned after reading MAXBITS bits.
+ *
+ * Format notes:
+ *
+ * - The codes as stored in the compressed data are bit-reversed relative to
+ * a simple integer ordering of codes of the same lengths. Hence below the
+ * bits are pulled from the compressed data one at a time and used to
+ * build the code value reversed from what is in the stream in order to
+ * permit simple integer comparisons for decoding.
+ *
+ * - The first code for the shortest length is all ones. Subsequent codes of
+ * the same length are simply integer decrements of the previous code. When
+ * moving up a length, a one bit is appended to the code. For a complete
+ * code, the last code of the longest length will be all zeros. To support
+ * this ordering, the bits pulled during decoding are inverted to apply the
+ * more "natural" ordering starting with all zeros and incrementing.
+ */
+local int decode(struct state *s, struct huffman *h)
+{
+ int len; /* current number of bits in code */
+ int code; /* len bits being decoded */
+ int first; /* first code of length len */
+ int count; /* number of codes of length len */
+ int index; /* index of first code of length len in symbol table */
+ int bitbuf; /* bits from stream */
+ int left; /* bits left in next or left to process */
+ short *next; /* next number of codes */
+
+ bitbuf = s->bitbuf;
+ left = s->bitcnt;
+ code = first = index = 0;
+ len = 1;
+ next = h->count + 1;
+ while (1) {
+ while (left--) {
+ code |= (bitbuf & 1) ^ 1; /* invert code */
+ bitbuf >>= 1;
+ count = *next++;
+ if (code < first + count) { /* if length len, return symbol */
+ s->bitbuf = bitbuf;
+ s->bitcnt = (s->bitcnt - len) & 7;
+ return h->symbol[index + (code - first)];
+ }
+ index += count; /* else update for next length */
+ first += count;
+ first <<= 1;
+ code <<= 1;
+ len++;
+ }
+ left = (MAXBITS+1) - len;
+ if (left == 0) break;
+ if (s->left == 0) {
+ s->left = s->infun(s->inhow, &(s->in));
+ if (s->left == 0) longjmp(s->env, 1); /* out of input */
+ }
+ bitbuf = *(s->in)++;
+ s->left--;
+ if (left > 8) left = 8;
+ }
+ return -9; /* ran out of codes */
+}
+
+/*
+ * Given a list of repeated code lengths rep[0..n-1], where each byte is a
+ * count (high four bits + 1) and a code length (low four bits), generate the
+ * list of code lengths. This compaction reduces the size of the object code.
+ * Then given the list of code lengths length[0..n-1] representing a canonical
+ * Huffman code for n symbols, construct the tables required to decode those
+ * codes. Those tables are the number of codes of each length, and the symbols
+ * sorted by length, retaining their original order within each length. The
+ * return value is zero for a complete code set, negative for an over-
+ * subscribed code set, and positive for an incomplete code set. The tables
+ * can be used if the return value is zero or positive, but they cannot be used
+ * if the return value is negative. If the return value is zero, it is not
+ * possible for decode() using that table to return an error--any stream of
+ * enough bits will resolve to a symbol. If the return value is positive, then
+ * it is possible for decode() using that table to return an error for received
+ * codes past the end of the incomplete lengths.
+ */
+local int construct(struct huffman *h, const unsigned char *rep, int n)
+{
+ int symbol; /* current symbol when stepping through length[] */
+ int len; /* current length when stepping through h->count[] */
+ int left; /* number of possible codes left of current length */
+ short offs[MAXBITS+1]; /* offsets in symbol table for each length */
+ short length[256]; /* code lengths */
+
+ /* convert compact repeat counts into symbol bit length list */
+ symbol = 0;
+ do {
+ len = *rep++;
+ left = (len >> 4) + 1;
+ len &= 15;
+ do {
+ length[symbol++] = len;
+ } while (--left);
+ } while (--n);
+ n = symbol;
+
+ /* count number of codes of each length */
+ for (len = 0; len <= MAXBITS; len++)
+ h->count[len] = 0;
+ for (symbol = 0; symbol < n; symbol++)
+ (h->count[length[symbol]])++; /* assumes lengths are within bounds */
+ if (h->count[0] == n) /* no codes! */
+ return 0; /* complete, but decode() will fail */
+
+ /* check for an over-subscribed or incomplete set of lengths */
+ left = 1; /* one possible code of zero length */
+ for (len = 1; len <= MAXBITS; len++) {
+ left <<= 1; /* one more bit, double codes left */
+ left -= h->count[len]; /* deduct count from possible codes */
+ if (left < 0) return left; /* over-subscribed--return negative */
+ } /* left > 0 means incomplete */
+
+ /* generate offsets into symbol table for each length for sorting */
+ offs[1] = 0;
+ for (len = 1; len < MAXBITS; len++)
+ offs[len + 1] = offs[len] + h->count[len];
+
+ /*
+ * put symbols in table sorted by length, by symbol order within each
+ * length
+ */
+ for (symbol = 0; symbol < n; symbol++)
+ if (length[symbol] != 0)
+ h->symbol[offs[length[symbol]]++] = symbol;
+
+ /* return zero for complete set, positive for incomplete set */
+ return left;
+}
+
+/*
+ * Decode PKWare Compression Library stream.
+ *
+ * Format notes:
+ *
+ * - First byte is 0 if literals are uncoded or 1 if they are coded. Second
+ * byte is 4, 5, or 6 for the number of extra bits in the distance code.
+ * This is the base-2 logarithm of the dictionary size minus six.
+ *
+ * - Compressed data is a combination of literals and length/distance pairs
+ * terminated by an end code. Literals are either Huffman coded or
+ * uncoded bytes. A length/distance pair is a coded length followed by a
+ * coded distance to represent a string that occurs earlier in the
+ * uncompressed data that occurs again at the current location.
+ *
+ * - A bit preceding a literal or length/distance pair indicates which comes
+ * next, 0 for literals, 1 for length/distance.
+ *
+ * - If literals are uncoded, then the next eight bits are the literal, in the
+ * normal bit order in the stream, i.e. no bit-reversal is needed. Similarly,
+ * no bit reversal is needed for either the length extra bits or the distance
+ * extra bits.
+ *
+ * - Literal bytes are simply written to the output. A length/distance pair is
+ * an instruction to copy previously uncompressed bytes to the output. The
+ * copy is from distance bytes back in the output stream, copying for length
+ * bytes.
+ *
+ * - Distances pointing before the beginning of the output data are not
+ * permitted.
+ *
+ * - Overlapped copies, where the length is greater than the distance, are
+ * allowed and common. For example, a distance of one and a length of 518
+ * simply copies the last byte 518 times. A distance of four and a length of
+ * twelve copies the last four bytes three times. A simple forward copy
+ * ignoring whether the length is greater than the distance or not implements
+ * this correctly.
+ */
+local int decomp(struct state *s)
+{
+ int lit; /* true if literals are coded */
+ int dict; /* log2(dictionary size) - 6 */
+ int symbol; /* decoded symbol, extra bits for distance */
+ int len; /* length for copy */
+ unsigned dist; /* distance for copy */
+ int copy; /* copy counter */
+ unsigned char *from, *to; /* copy pointers */
+ static int virgin = 1; /* build tables once */
+ static short litcnt[MAXBITS+1], litsym[256]; /* litcode memory */
+ static short lencnt[MAXBITS+1], lensym[16]; /* lencode memory */
+ static short distcnt[MAXBITS+1], distsym[64]; /* distcode memory */
+ static struct huffman litcode = {litcnt, litsym}; /* length code */
+ static struct huffman lencode = {lencnt, lensym}; /* length code */
+ static struct huffman distcode = {distcnt, distsym};/* distance code */
+ /* bit lengths of literal codes */
+ static const unsigned char litlen[] = {
+ 11, 124, 8, 7, 28, 7, 188, 13, 76, 4, 10, 8, 12, 10, 12, 10, 8, 23, 8,
+ 9, 7, 6, 7, 8, 7, 6, 55, 8, 23, 24, 12, 11, 7, 9, 11, 12, 6, 7, 22, 5,
+ 7, 24, 6, 11, 9, 6, 7, 22, 7, 11, 38, 7, 9, 8, 25, 11, 8, 11, 9, 12,
+ 8, 12, 5, 38, 5, 38, 5, 11, 7, 5, 6, 21, 6, 10, 53, 8, 7, 24, 10, 27,
+ 44, 253, 253, 253, 252, 252, 252, 13, 12, 45, 12, 45, 12, 61, 12, 45,
+ 44, 173};
+ /* bit lengths of length codes 0..15 */
+ static const unsigned char lenlen[] = {2, 35, 36, 53, 38, 23};
+ /* bit lengths of distance codes 0..63 */
+ static const unsigned char distlen[] = {2, 20, 53, 230, 247, 151, 248};
+ static const short base[16] = { /* base for length codes */
+ 3, 2, 4, 5, 6, 7, 8, 9, 10, 12, 16, 24, 40, 72, 136, 264};
+ static const char extra[16] = { /* extra bits for length codes */
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8};
+
+ /* set up decoding tables (once--might not be thread-safe) */
+ if (virgin) {
+ construct(&litcode, litlen, sizeof(litlen));
+ construct(&lencode, lenlen, sizeof(lenlen));
+ construct(&distcode, distlen, sizeof(distlen));
+ virgin = 0;
+ }
+
+ /* read header */
+ lit = bits(s, 8);
+ if (lit > 1) return -1;
+ dict = bits(s, 8);
+ if (dict < 4 || dict > 6) return -2;
+
+ /* decode literals and length/distance pairs */
+ do {
+ if (bits(s, 1)) {
+ /* get length */
+ symbol = decode(s, &lencode);
+ len = base[symbol] + bits(s, extra[symbol]);
+ if (len == 519) break; /* end code */
+
+ /* get distance */
+ symbol = len == 2 ? 2 : dict;
+ dist = decode(s, &distcode) << symbol;
+ dist += bits(s, symbol);
+ dist++;
+ if (s->first && dist > s->next)
+ return -3; /* distance too far back */
+
+ /* copy length bytes from distance bytes back */
+ do {
+ to = s->out + s->next;
+ from = to - dist;
+ copy = MAXWIN;
+ if (s->next < dist) {
+ from += copy;
+ copy = dist;
+ }
+ copy -= s->next;
+ if (copy > len) copy = len;
+ len -= copy;
+ s->next += copy;
+ do {
+ *to++ = *from++;
+ } while (--copy);
+ if (s->next == MAXWIN) {
+ if (s->outfun(s->outhow, s->out, s->next)) return 1;
+ s->next = 0;
+ s->first = 0;
+ }
+ } while (len != 0);
+ }
+ else {
+ /* get literal and write it */
+ symbol = lit ? decode(s, &litcode) : bits(s, 8);
+ s->out[s->next++] = symbol;
+ if (s->next == MAXWIN) {
+ if (s->outfun(s->outhow, s->out, s->next)) return 1;
+ s->next = 0;
+ s->first = 0;
+ }
+ }
+ } while (1);
+ return 0;
+}
+
+/* See comments in blast.h */
+int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
+ unsigned *left, unsigned char **in)
+{
+ struct state s; /* input/output state */
+ int err; /* return value */
+
+ /* initialize input state */
+ s.infun = infun;
+ s.inhow = inhow;
+ if (left != NULL && *left) {
+ s.left = *left;
+ s.in = *in;
+ }
+ else
+ s.left = 0;
+ s.bitbuf = 0;
+ s.bitcnt = 0;
+
+ /* initialize output state */
+ s.outfun = outfun;
+ s.outhow = outhow;
+ s.next = 0;
+ s.first = 1;
+
+ /* return if bits() or decode() tries to read past available input */
+ if (setjmp(s.env) != 0) /* if came back here via longjmp(), */
+ err = 2; /* then skip decomp(), return error */
+ else
+ err = decomp(&s); /* decompress */
+
+ /* return unused input */
+ if (left != NULL)
+ *left = s.left;
+ if (in != NULL)
+ *in = s.left ? s.in : NULL;
+
+ /* write any leftover output and update the error code if needed */
+ if (err != 1 && s.next && s.outfun(s.outhow, s.out, s.next) && err == 0)
+ err = 1;
+ return err;
+}
+
+#ifdef TEST
+/* Example of how to use blast() */
+#include <stdio.h>
+#include <stdlib.h>
+
+#define CHUNK 16384
+
+local unsigned inf(void *how, unsigned char **buf)
+{
+ static unsigned char hold[CHUNK];
+
+ *buf = hold;
+ return fread(hold, 1, CHUNK, (FILE *)how);
+}
+
+local int outf(void *how, unsigned char *buf, unsigned len)
+{
+ return fwrite(buf, 1, len, (FILE *)how) != len;
+}
+
+/* Decompress a PKWare Compression Library stream from stdin to stdout */
+int main(void)
+{
+ int ret;
+ unsigned left;
+
+ /* decompress to stdout */
+ left = 0;
+ ret = blast(inf, stdin, outf, stdout, &left, NULL);
+ if (ret != 0)
+ fprintf(stderr, "blast error: %d\n", ret);
+
+ /* count any leftover bytes */
+ while (getchar() != EOF)
+ left++;
+ if (left)
+ fprintf(stderr, "blast warning: %u unused bytes of input\n", left);
+
+ /* return blast() error code */
+ return ret;
+}
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.h
new file mode 100644
index 000000000..6cf65eda1
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/blast.h
@@ -0,0 +1,83 @@
+/* blast.h -- interface for blast.c
+ Copyright (C) 2003, 2012, 2013 Mark Adler
+ version 1.3, 24 Aug 2013
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Mark Adler madler@alumni.caltech.edu
+ */
+
+
+/*
+ * blast() decompresses the PKWare Data Compression Library (DCL) compressed
+ * format. It provides the same functionality as the explode() function in
+ * that library. (Note: PKWare overused the "implode" verb, and the format
+ * used by their library implode() function is completely different and
+ * incompatible with the implode compression method supported by PKZIP.)
+ *
+ * The binary mode for stdio functions should be used to assure that the
+ * compressed data is not corrupted when read or written. For example:
+ * fopen(..., "rb") and fopen(..., "wb").
+ */
+
+
+typedef unsigned (*blast_in)(void *how, unsigned char **buf);
+typedef int (*blast_out)(void *how, unsigned char *buf, unsigned len);
+/* Definitions for input/output functions passed to blast(). See below for
+ * what the provided functions need to do.
+ */
+
+
+int blast(blast_in infun, void *inhow, blast_out outfun, void *outhow,
+ unsigned *left, unsigned char **in);
+/* Decompress input to output using the provided infun() and outfun() calls.
+ * On success, the return value of blast() is zero. If there is an error in
+ * the source data, i.e. it is not in the proper format, then a negative value
+ * is returned. If there is not enough input available or there is not enough
+ * output space, then a positive error is returned.
+ *
+ * The input function is invoked: len = infun(how, &buf), where buf is set by
+ * infun() to point to the input buffer, and infun() returns the number of
+ * available bytes there. If infun() returns zero, then blast() returns with
+ * an input error. (blast() only asks for input if it needs it.) inhow is for
+ * use by the application to pass an input descriptor to infun(), if desired.
+ *
+ * If left and in are not NULL and *left is not zero when blast() is called,
+ * then the *left bytes are *in are consumed for input before infun() is used.
+ *
+ * The output function is invoked: err = outfun(how, buf, len), where the bytes
+ * to be written are buf[0..len-1]. If err is not zero, then blast() returns
+ * with an output error. outfun() is always called with len <= 4096. outhow
+ * is for use by the application to pass an output descriptor to outfun(), if
+ * desired.
+ *
+ * If there is any unused input, *left is set to the number of bytes that were
+ * read and *in points to them. Otherwise *left is set to zero and *in is set
+ * to NULL. If left or in are NULL, then they are not set.
+ *
+ * The return codes are:
+ *
+ * 2: ran out of input before completing decompression
+ * 1: output error before completing decompression
+ * 0: successful decompression
+ * -1: literal flag not zero or one
+ * -2: dictionary size not in 4..6
+ * -3: distance is too far back
+ *
+ * At the bottom of blast.c is an example program that uses blast() that can be
+ * compiled to produce a command-line decompression filter by defining TEST.
+ */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.pk b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.pk
new file mode 100644
index 000000000..be10b2bbb
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.pk
Binary files differ
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.txt
new file mode 100644
index 000000000..bfdf1c5dc
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/blast/test.txt
@@ -0,0 +1 @@
+AIAIAIAIAIAIA \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLib.pas b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLib.pas
new file mode 100644
index 000000000..060e19911
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLib.pas
@@ -0,0 +1,557 @@
+{*******************************************************}
+{ }
+{ Borland Delphi Supplemental Components }
+{ ZLIB Data Compression Interface Unit }
+{ }
+{ Copyright (c) 1997,99 Borland Corporation }
+{ }
+{*******************************************************}
+
+{ Updated for zlib 1.2.x by Cosmin Truta <cosmint@cs.ubbcluj.ro> }
+
+unit ZLib;
+
+interface
+
+uses SysUtils, Classes;
+
+type
+ TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
+ TFree = procedure (AppData, Block: Pointer); cdecl;
+
+ // Internal structure. Ignore.
+ TZStreamRec = packed record
+ next_in: PChar; // next input byte
+ avail_in: Integer; // number of bytes available at next_in
+ total_in: Longint; // total nb of input bytes read so far
+
+ next_out: PChar; // next output byte should be put here
+ avail_out: Integer; // remaining free space at next_out
+ total_out: Longint; // total nb of bytes output so far
+
+ msg: PChar; // last error message, NULL if no error
+ internal: Pointer; // not visible by applications
+
+ zalloc: TAlloc; // used to allocate the internal state
+ zfree: TFree; // used to free the internal state
+ AppData: Pointer; // private data object passed to zalloc and zfree
+
+ data_type: Integer; // best guess about the data type: ascii or binary
+ adler: Longint; // adler32 value of the uncompressed data
+ reserved: Longint; // reserved for future use
+ end;
+
+ // Abstract ancestor class
+ TCustomZlibStream = class(TStream)
+ private
+ FStrm: TStream;
+ FStrmPos: Integer;
+ FOnProgress: TNotifyEvent;
+ FZRec: TZStreamRec;
+ FBuffer: array [Word] of Char;
+ protected
+ procedure Progress(Sender: TObject); dynamic;
+ property OnProgress: TNotifyEvent read FOnProgress write FOnProgress;
+ constructor Create(Strm: TStream);
+ end;
+
+{ TCompressionStream compresses data on the fly as data is written to it, and
+ stores the compressed data to another stream.
+
+ TCompressionStream is write-only and strictly sequential. Reading from the
+ stream will raise an exception. Using Seek to move the stream pointer
+ will raise an exception.
+
+ Output data is cached internally, written to the output stream only when
+ the internal output buffer is full. All pending output data is flushed
+ when the stream is destroyed.
+
+ The Position property returns the number of uncompressed bytes of
+ data that have been written to the stream so far.
+
+ CompressionRate returns the on-the-fly percentage by which the original
+ data has been compressed: (1 - (CompressedBytes / UncompressedBytes)) * 100
+ If raw data size = 100 and compressed data size = 25, the CompressionRate
+ is 75%
+
+ The OnProgress event is called each time the output buffer is filled and
+ written to the output stream. This is useful for updating a progress
+ indicator when you are writing a large chunk of data to the compression
+ stream in a single call.}
+
+
+ TCompressionLevel = (clNone, clFastest, clDefault, clMax);
+
+ TCompressionStream = class(TCustomZlibStream)
+ private
+ function GetCompressionRate: Single;
+ public
+ constructor Create(CompressionLevel: TCompressionLevel; Dest: TStream);
+ destructor Destroy; override;
+ function Read(var Buffer; Count: Longint): Longint; override;
+ function Write(const Buffer; Count: Longint): Longint; override;
+ function Seek(Offset: Longint; Origin: Word): Longint; override;
+ property CompressionRate: Single read GetCompressionRate;
+ property OnProgress;
+ end;
+
+{ TDecompressionStream decompresses data on the fly as data is read from it.
+
+ Compressed data comes from a separate source stream. TDecompressionStream
+ is read-only and unidirectional; you can seek forward in the stream, but not
+ backwards. The special case of setting the stream position to zero is
+ allowed. Seeking forward decompresses data until the requested position in
+ the uncompressed data has been reached. Seeking backwards, seeking relative
+ to the end of the stream, requesting the size of the stream, and writing to
+ the stream will raise an exception.
+
+ The Position property returns the number of bytes of uncompressed data that
+ have been read from the stream so far.
+
+ The OnProgress event is called each time the internal input buffer of
+ compressed data is exhausted and the next block is read from the input stream.
+ This is useful for updating a progress indicator when you are reading a
+ large chunk of data from the decompression stream in a single call.}
+
+ TDecompressionStream = class(TCustomZlibStream)
+ public
+ constructor Create(Source: TStream);
+ destructor Destroy; override;
+ function Read(var Buffer; Count: Longint): Longint; override;
+ function Write(const Buffer; Count: Longint): Longint; override;
+ function Seek(Offset: Longint; Origin: Word): Longint; override;
+ property OnProgress;
+ end;
+
+
+
+{ CompressBuf compresses data, buffer to buffer, in one call.
+ In: InBuf = ptr to compressed data
+ InBytes = number of bytes in InBuf
+ Out: OutBuf = ptr to newly allocated buffer containing decompressed data
+ OutBytes = number of bytes in OutBuf }
+procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
+ out OutBuf: Pointer; out OutBytes: Integer);
+
+
+{ DecompressBuf decompresses data, buffer to buffer, in one call.
+ In: InBuf = ptr to compressed data
+ InBytes = number of bytes in InBuf
+ OutEstimate = zero, or est. size of the decompressed data
+ Out: OutBuf = ptr to newly allocated buffer containing decompressed data
+ OutBytes = number of bytes in OutBuf }
+procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
+ OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
+
+{ DecompressToUserBuf decompresses data, buffer to buffer, in one call.
+ In: InBuf = ptr to compressed data
+ InBytes = number of bytes in InBuf
+ Out: OutBuf = ptr to user-allocated buffer to contain decompressed data
+ BufSize = number of bytes in OutBuf }
+procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
+ const OutBuf: Pointer; BufSize: Integer);
+
+const
+ zlib_version = '1.2.11';
+
+type
+ EZlibError = class(Exception);
+ ECompressionError = class(EZlibError);
+ EDecompressionError = class(EZlibError);
+
+implementation
+
+uses ZLibConst;
+
+const
+ Z_NO_FLUSH = 0;
+ Z_PARTIAL_FLUSH = 1;
+ Z_SYNC_FLUSH = 2;
+ Z_FULL_FLUSH = 3;
+ Z_FINISH = 4;
+
+ Z_OK = 0;
+ Z_STREAM_END = 1;
+ Z_NEED_DICT = 2;
+ Z_ERRNO = (-1);
+ Z_STREAM_ERROR = (-2);
+ Z_DATA_ERROR = (-3);
+ Z_MEM_ERROR = (-4);
+ Z_BUF_ERROR = (-5);
+ Z_VERSION_ERROR = (-6);
+
+ Z_NO_COMPRESSION = 0;
+ Z_BEST_SPEED = 1;
+ Z_BEST_COMPRESSION = 9;
+ Z_DEFAULT_COMPRESSION = (-1);
+
+ Z_FILTERED = 1;
+ Z_HUFFMAN_ONLY = 2;
+ Z_RLE = 3;
+ Z_DEFAULT_STRATEGY = 0;
+
+ Z_BINARY = 0;
+ Z_ASCII = 1;
+ Z_UNKNOWN = 2;
+
+ Z_DEFLATED = 8;
+
+
+{$L adler32.obj}
+{$L compress.obj}
+{$L crc32.obj}
+{$L deflate.obj}
+{$L infback.obj}
+{$L inffast.obj}
+{$L inflate.obj}
+{$L inftrees.obj}
+{$L trees.obj}
+{$L uncompr.obj}
+{$L zutil.obj}
+
+procedure adler32; external;
+procedure compressBound; external;
+procedure crc32; external;
+procedure deflateInit2_; external;
+procedure deflateParams; external;
+
+function _malloc(Size: Integer): Pointer; cdecl;
+begin
+ Result := AllocMem(Size);
+end;
+
+procedure _free(Block: Pointer); cdecl;
+begin
+ FreeMem(Block);
+end;
+
+procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
+begin
+ FillChar(P^, count, B);
+end;
+
+procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
+begin
+ Move(source^, dest^, count);
+end;
+
+
+
+// deflate compresses data
+function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar;
+ recsize: Integer): Integer; external;
+function deflate(var strm: TZStreamRec; flush: Integer): Integer; external;
+function deflateEnd(var strm: TZStreamRec): Integer; external;
+
+// inflate decompresses data
+function inflateInit_(var strm: TZStreamRec; version: PChar;
+ recsize: Integer): Integer; external;
+function inflate(var strm: TZStreamRec; flush: Integer): Integer; external;
+function inflateEnd(var strm: TZStreamRec): Integer; external;
+function inflateReset(var strm: TZStreamRec): Integer; external;
+
+
+function zlibAllocMem(AppData: Pointer; Items, Size: Integer): Pointer; cdecl;
+begin
+// GetMem(Result, Items*Size);
+ Result := AllocMem(Items * Size);
+end;
+
+procedure zlibFreeMem(AppData, Block: Pointer); cdecl;
+begin
+ FreeMem(Block);
+end;
+
+{function zlibCheck(code: Integer): Integer;
+begin
+ Result := code;
+ if code < 0 then
+ raise EZlibError.Create('error'); //!!
+end;}
+
+function CCheck(code: Integer): Integer;
+begin
+ Result := code;
+ if code < 0 then
+ raise ECompressionError.Create('error'); //!!
+end;
+
+function DCheck(code: Integer): Integer;
+begin
+ Result := code;
+ if code < 0 then
+ raise EDecompressionError.Create('error'); //!!
+end;
+
+procedure CompressBuf(const InBuf: Pointer; InBytes: Integer;
+ out OutBuf: Pointer; out OutBytes: Integer);
+var
+ strm: TZStreamRec;
+ P: Pointer;
+begin
+ FillChar(strm, sizeof(strm), 0);
+ strm.zalloc := zlibAllocMem;
+ strm.zfree := zlibFreeMem;
+ OutBytes := ((InBytes + (InBytes div 10) + 12) + 255) and not 255;
+ GetMem(OutBuf, OutBytes);
+ try
+ strm.next_in := InBuf;
+ strm.avail_in := InBytes;
+ strm.next_out := OutBuf;
+ strm.avail_out := OutBytes;
+ CCheck(deflateInit_(strm, Z_BEST_COMPRESSION, zlib_version, sizeof(strm)));
+ try
+ while CCheck(deflate(strm, Z_FINISH)) <> Z_STREAM_END do
+ begin
+ P := OutBuf;
+ Inc(OutBytes, 256);
+ ReallocMem(OutBuf, OutBytes);
+ strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
+ strm.avail_out := 256;
+ end;
+ finally
+ CCheck(deflateEnd(strm));
+ end;
+ ReallocMem(OutBuf, strm.total_out);
+ OutBytes := strm.total_out;
+ except
+ FreeMem(OutBuf);
+ raise
+ end;
+end;
+
+
+procedure DecompressBuf(const InBuf: Pointer; InBytes: Integer;
+ OutEstimate: Integer; out OutBuf: Pointer; out OutBytes: Integer);
+var
+ strm: TZStreamRec;
+ P: Pointer;
+ BufInc: Integer;
+begin
+ FillChar(strm, sizeof(strm), 0);
+ strm.zalloc := zlibAllocMem;
+ strm.zfree := zlibFreeMem;
+ BufInc := (InBytes + 255) and not 255;
+ if OutEstimate = 0 then
+ OutBytes := BufInc
+ else
+ OutBytes := OutEstimate;
+ GetMem(OutBuf, OutBytes);
+ try
+ strm.next_in := InBuf;
+ strm.avail_in := InBytes;
+ strm.next_out := OutBuf;
+ strm.avail_out := OutBytes;
+ DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
+ try
+ while DCheck(inflate(strm, Z_NO_FLUSH)) <> Z_STREAM_END do
+ begin
+ P := OutBuf;
+ Inc(OutBytes, BufInc);
+ ReallocMem(OutBuf, OutBytes);
+ strm.next_out := PChar(Integer(OutBuf) + (Integer(strm.next_out) - Integer(P)));
+ strm.avail_out := BufInc;
+ end;
+ finally
+ DCheck(inflateEnd(strm));
+ end;
+ ReallocMem(OutBuf, strm.total_out);
+ OutBytes := strm.total_out;
+ except
+ FreeMem(OutBuf);
+ raise
+ end;
+end;
+
+procedure DecompressToUserBuf(const InBuf: Pointer; InBytes: Integer;
+ const OutBuf: Pointer; BufSize: Integer);
+var
+ strm: TZStreamRec;
+begin
+ FillChar(strm, sizeof(strm), 0);
+ strm.zalloc := zlibAllocMem;
+ strm.zfree := zlibFreeMem;
+ strm.next_in := InBuf;
+ strm.avail_in := InBytes;
+ strm.next_out := OutBuf;
+ strm.avail_out := BufSize;
+ DCheck(inflateInit_(strm, zlib_version, sizeof(strm)));
+ try
+ if DCheck(inflate(strm, Z_FINISH)) <> Z_STREAM_END then
+ raise EZlibError.CreateRes(@sTargetBufferTooSmall);
+ finally
+ DCheck(inflateEnd(strm));
+ end;
+end;
+
+// TCustomZlibStream
+
+constructor TCustomZLibStream.Create(Strm: TStream);
+begin
+ inherited Create;
+ FStrm := Strm;
+ FStrmPos := Strm.Position;
+ FZRec.zalloc := zlibAllocMem;
+ FZRec.zfree := zlibFreeMem;
+end;
+
+procedure TCustomZLibStream.Progress(Sender: TObject);
+begin
+ if Assigned(FOnProgress) then FOnProgress(Sender);
+end;
+
+
+// TCompressionStream
+
+constructor TCompressionStream.Create(CompressionLevel: TCompressionLevel;
+ Dest: TStream);
+const
+ Levels: array [TCompressionLevel] of ShortInt =
+ (Z_NO_COMPRESSION, Z_BEST_SPEED, Z_DEFAULT_COMPRESSION, Z_BEST_COMPRESSION);
+begin
+ inherited Create(Dest);
+ FZRec.next_out := FBuffer;
+ FZRec.avail_out := sizeof(FBuffer);
+ CCheck(deflateInit_(FZRec, Levels[CompressionLevel], zlib_version, sizeof(FZRec)));
+end;
+
+destructor TCompressionStream.Destroy;
+begin
+ FZRec.next_in := nil;
+ FZRec.avail_in := 0;
+ try
+ if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
+ while (CCheck(deflate(FZRec, Z_FINISH)) <> Z_STREAM_END)
+ and (FZRec.avail_out = 0) do
+ begin
+ FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
+ FZRec.next_out := FBuffer;
+ FZRec.avail_out := sizeof(FBuffer);
+ end;
+ if FZRec.avail_out < sizeof(FBuffer) then
+ FStrm.WriteBuffer(FBuffer, sizeof(FBuffer) - FZRec.avail_out);
+ finally
+ deflateEnd(FZRec);
+ end;
+ inherited Destroy;
+end;
+
+function TCompressionStream.Read(var Buffer; Count: Longint): Longint;
+begin
+ raise ECompressionError.CreateRes(@sInvalidStreamOp);
+end;
+
+function TCompressionStream.Write(const Buffer; Count: Longint): Longint;
+begin
+ FZRec.next_in := @Buffer;
+ FZRec.avail_in := Count;
+ if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
+ while (FZRec.avail_in > 0) do
+ begin
+ CCheck(deflate(FZRec, 0));
+ if FZRec.avail_out = 0 then
+ begin
+ FStrm.WriteBuffer(FBuffer, sizeof(FBuffer));
+ FZRec.next_out := FBuffer;
+ FZRec.avail_out := sizeof(FBuffer);
+ FStrmPos := FStrm.Position;
+ Progress(Self);
+ end;
+ end;
+ Result := Count;
+end;
+
+function TCompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
+begin
+ if (Offset = 0) and (Origin = soFromCurrent) then
+ Result := FZRec.total_in
+ else
+ raise ECompressionError.CreateRes(@sInvalidStreamOp);
+end;
+
+function TCompressionStream.GetCompressionRate: Single;
+begin
+ if FZRec.total_in = 0 then
+ Result := 0
+ else
+ Result := (1.0 - (FZRec.total_out / FZRec.total_in)) * 100.0;
+end;
+
+
+// TDecompressionStream
+
+constructor TDecompressionStream.Create(Source: TStream);
+begin
+ inherited Create(Source);
+ FZRec.next_in := FBuffer;
+ FZRec.avail_in := 0;
+ DCheck(inflateInit_(FZRec, zlib_version, sizeof(FZRec)));
+end;
+
+destructor TDecompressionStream.Destroy;
+begin
+ FStrm.Seek(-FZRec.avail_in, 1);
+ inflateEnd(FZRec);
+ inherited Destroy;
+end;
+
+function TDecompressionStream.Read(var Buffer; Count: Longint): Longint;
+begin
+ FZRec.next_out := @Buffer;
+ FZRec.avail_out := Count;
+ if FStrm.Position <> FStrmPos then FStrm.Position := FStrmPos;
+ while (FZRec.avail_out > 0) do
+ begin
+ if FZRec.avail_in = 0 then
+ begin
+ FZRec.avail_in := FStrm.Read(FBuffer, sizeof(FBuffer));
+ if FZRec.avail_in = 0 then
+ begin
+ Result := Count - FZRec.avail_out;
+ Exit;
+ end;
+ FZRec.next_in := FBuffer;
+ FStrmPos := FStrm.Position;
+ Progress(Self);
+ end;
+ CCheck(inflate(FZRec, 0));
+ end;
+ Result := Count;
+end;
+
+function TDecompressionStream.Write(const Buffer; Count: Longint): Longint;
+begin
+ raise EDecompressionError.CreateRes(@sInvalidStreamOp);
+end;
+
+function TDecompressionStream.Seek(Offset: Longint; Origin: Word): Longint;
+var
+ I: Integer;
+ Buf: array [0..4095] of Char;
+begin
+ if (Offset = 0) and (Origin = soFromBeginning) then
+ begin
+ DCheck(inflateReset(FZRec));
+ FZRec.next_in := FBuffer;
+ FZRec.avail_in := 0;
+ FStrm.Position := 0;
+ FStrmPos := 0;
+ end
+ else if ( (Offset >= 0) and (Origin = soFromCurrent)) or
+ ( ((Offset - FZRec.total_out) > 0) and (Origin = soFromBeginning)) then
+ begin
+ if Origin = soFromBeginning then Dec(Offset, FZRec.total_out);
+ if Offset > 0 then
+ begin
+ for I := 1 to Offset div sizeof(Buf) do
+ ReadBuffer(Buf, sizeof(Buf));
+ ReadBuffer(Buf, Offset mod sizeof(Buf));
+ end;
+ end
+ else
+ raise EDecompressionError.CreateRes(@sInvalidStreamOp);
+ Result := FZRec.total_out;
+end;
+
+
+end.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLibConst.pas b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLibConst.pas
new file mode 100644
index 000000000..cdfe13671
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/ZLibConst.pas
@@ -0,0 +1,11 @@
+unit ZLibConst;
+
+interface
+
+resourcestring
+ sTargetBufferTooSmall = 'ZLib error: target buffer may be too small';
+ sInvalidStreamOp = 'Invalid stream operation';
+
+implementation
+
+end.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/readme.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/readme.txt
new file mode 100644
index 000000000..2dc9a8bba
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/readme.txt
@@ -0,0 +1,76 @@
+
+Overview
+========
+
+This directory contains an update to the ZLib interface unit,
+distributed by Borland as a Delphi supplemental component.
+
+The original ZLib unit is Copyright (c) 1997,99 Borland Corp.,
+and is based on zlib version 1.0.4. There are a series of bugs
+and security problems associated with that old zlib version, and
+we recommend the users to update their ZLib unit.
+
+
+Summary of modifications
+========================
+
+- Improved makefile, adapted to zlib version 1.2.1.
+
+- Some field types from TZStreamRec are changed from Integer to
+ Longint, for consistency with the zlib.h header, and for 64-bit
+ readiness.
+
+- The zlib_version constant is updated.
+
+- The new Z_RLE strategy has its corresponding symbolic constant.
+
+- The allocation and deallocation functions and function types
+ (TAlloc, TFree, zlibAllocMem and zlibFreeMem) are now cdecl,
+ and _malloc and _free are added as C RTL stubs. As a result,
+ the original C sources of zlib can be compiled out of the box,
+ and linked to the ZLib unit.
+
+
+Suggestions for improvements
+============================
+
+Currently, the ZLib unit provides only a limited wrapper around
+the zlib library, and much of the original zlib functionality is
+missing. Handling compressed file formats like ZIP/GZIP or PNG
+cannot be implemented without having this functionality.
+Applications that handle these formats are either using their own,
+duplicated code, or not using the ZLib unit at all.
+
+Here are a few suggestions:
+
+- Checksum class wrappers around adler32() and crc32(), similar
+ to the Java classes that implement the java.util.zip.Checksum
+ interface.
+
+- The ability to read and write raw deflate streams, without the
+ zlib stream header and trailer. Raw deflate streams are used
+ in the ZIP file format.
+
+- The ability to read and write gzip streams, used in the GZIP
+ file format, and normally produced by the gzip program.
+
+- The ability to select a different compression strategy, useful
+ to PNG and MNG image compression, and to multimedia compression
+ in general. Besides the compression level
+
+ TCompressionLevel = (clNone, clFastest, clDefault, clMax);
+
+ which, in fact, could have used the 'z' prefix and avoided
+ TColor-like symbols
+
+ TCompressionLevel = (zcNone, zcFastest, zcDefault, zcMax);
+
+ there could be a compression strategy
+
+ TCompressionStrategy = (zsDefault, zsFiltered, zsHuffmanOnly, zsRle);
+
+- ZIP and GZIP stream handling via TStreams.
+
+
+--
+Cosmin Truta <cosmint@cs.ubbcluj.ro>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/zlibd32.mak b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/zlibd32.mak
new file mode 100644
index 000000000..9bb00b7cc
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/delphi/zlibd32.mak
@@ -0,0 +1,99 @@
+# Makefile for zlib
+# For use with Delphi and C++ Builder under Win32
+# Updated for zlib 1.2.x by Cosmin Truta
+
+# ------------ Borland C++ ------------
+
+# This project uses the Delphi (fastcall/register) calling convention:
+LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl
+
+CC = bcc32
+LD = bcc32
+AR = tlib
+# do not use "-pr" in CFLAGS
+CFLAGS = -a -d -k- -O2 $(LOC)
+LDFLAGS =
+
+
+# variables
+ZLIB_LIB = zlib.lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj
+OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj
+OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
+
+
+# targets
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+ $(CC) -c $(CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h
+
+gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h
+
+gzread.obj: gzread.c zlib.h zconf.h gzguts.h
+
+gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: test/example.c zlib.h zconf.h
+
+minigzip.obj: test/minigzip.c zlib.h zconf.h
+
+
+# For the sake of the old Borland make,
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ -del $(ZLIB_LIB)
+ $(AR) $(ZLIB_LIB) $(OBJP1)
+ $(AR) $(ZLIB_LIB) $(OBJP2)
+
+
+# testing
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
+
+
+# cleanup
+clean:
+ -del *.obj
+ -del *.exe
+ -del *.lib
+ -del *.tds
+ -del zlib.bak
+ -del foo.gz
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.build b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.build
new file mode 100644
index 000000000..e69630cec
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.build
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<project name="DotZLib" default="build" basedir="./DotZLib">
+ <description>A .Net wrapper library around ZLib1.dll</description>
+
+ <property name="nunit.location" value="c:/program files/NUnit V2.1/bin" />
+ <property name="build.root" value="bin" />
+
+ <property name="debug" value="true" />
+ <property name="nunit" value="true" />
+
+ <property name="build.folder" value="${build.root}/debug/" if="${debug}" />
+ <property name="build.folder" value="${build.root}/release/" unless="${debug}" />
+
+ <target name="clean" description="Remove all generated files">
+ <delete dir="${build.root}" failonerror="false" />
+ </target>
+
+ <target name="build" description="compiles the source code">
+
+ <mkdir dir="${build.folder}" />
+ <csc target="library" output="${build.folder}DotZLib.dll" debug="${debug}">
+ <references basedir="${nunit.location}">
+ <includes if="${nunit}" name="nunit.framework.dll" />
+ </references>
+ <sources>
+ <includes name="*.cs" />
+ <excludes name="UnitTests.cs" unless="${nunit}" />
+ </sources>
+ <arg value="/d:nunit" if="${nunit}" />
+ </csc>
+ </target>
+
+</project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.chm b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.chm
new file mode 100644
index 000000000..f214a444a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.chm
Binary files differ
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.sln b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.sln
new file mode 100644
index 000000000..ac45ca048
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib.sln
@@ -0,0 +1,21 @@
+Microsoft Visual Studio Solution File, Format Version 8.00
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DotZLib", "DotZLib\DotZLib.csproj", "{BB1EE0B1-1808-46CB-B786-949D91117FC5}"
+ ProjectSection(ProjectDependencies) = postProject
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfiguration) = preSolution
+ Debug = Debug
+ Release = Release
+ EndGlobalSection
+ GlobalSection(ProjectConfiguration) = postSolution
+ {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.ActiveCfg = Debug|.NET
+ {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Debug.Build.0 = Debug|.NET
+ {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.ActiveCfg = Release|.NET
+ {BB1EE0B1-1808-46CB-B786-949D91117FC5}.Release.Build.0 = Release|.NET
+ EndGlobalSection
+ GlobalSection(ExtensibilityGlobals) = postSolution
+ EndGlobalSection
+ GlobalSection(ExtensibilityAddIns) = postSolution
+ EndGlobalSection
+EndGlobal
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/AssemblyInfo.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/AssemblyInfo.cs
new file mode 100644
index 000000000..724c5347f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/AssemblyInfo.cs
@@ -0,0 +1,58 @@
+using System.Reflection;
+using System.Runtime.CompilerServices;
+
+//
+// General Information about an assembly is controlled through the following
+// set of attributes. Change these attribute values to modify the information
+// associated with an assembly.
+//
+[assembly: AssemblyTitle("DotZLib")]
+[assembly: AssemblyDescription(".Net bindings for ZLib compression dll 1.2.x")]
+[assembly: AssemblyConfiguration("")]
+[assembly: AssemblyCompany("Henrik Ravn")]
+[assembly: AssemblyProduct("")]
+[assembly: AssemblyCopyright("(c) 2004 by Henrik Ravn")]
+[assembly: AssemblyTrademark("")]
+[assembly: AssemblyCulture("")]
+
+//
+// Version information for an assembly consists of the following four values:
+//
+// Major Version
+// Minor Version
+// Build Number
+// Revision
+//
+// You can specify all the values or you can default the Revision and Build Numbers
+// by using the '*' as shown below:
+
+[assembly: AssemblyVersion("1.0.*")]
+
+//
+// In order to sign your assembly you must specify a key to use. Refer to the
+// Microsoft .NET Framework documentation for more information on assembly signing.
+//
+// Use the attributes below to control which key is used for signing.
+//
+// Notes:
+// (*) If no key is specified, the assembly is not signed.
+// (*) KeyName refers to a key that has been installed in the Crypto Service
+// Provider (CSP) on your machine. KeyFile refers to a file which contains
+// a key.
+// (*) If the KeyFile and the KeyName values are both specified, the
+// following processing occurs:
+// (1) If the KeyName can be found in the CSP, that key is used.
+// (2) If the KeyName does not exist and the KeyFile does exist, the key
+// in the KeyFile is installed into the CSP and used.
+// (*) In order to create a KeyFile, you can use the sn.exe (Strong Name) utility.
+// When specifying the KeyFile, the location of the KeyFile should be
+// relative to the project output directory which is
+// %Project Directory%\obj\<configuration>. For example, if your KeyFile is
+// located in the project directory, you would specify the AssemblyKeyFile
+// attribute as [assembly: AssemblyKeyFile("..\\..\\mykey.snk")]
+// (*) Delay Signing is an advanced option - see the Microsoft .NET Framework
+// documentation for more information on this.
+//
+[assembly: AssemblyDelaySign(false)]
+[assembly: AssemblyKeyFile("")]
+[assembly: AssemblyKeyName("")]
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/ChecksumImpl.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/ChecksumImpl.cs
new file mode 100644
index 000000000..b110dae6a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/ChecksumImpl.cs
@@ -0,0 +1,202 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.Runtime.InteropServices;
+using System.Text;
+
+
+namespace DotZLib
+{
+ #region ChecksumGeneratorBase
+ /// <summary>
+ /// Implements the common functionality needed for all <see cref="ChecksumGenerator"/>s
+ /// </summary>
+ /// <example></example>
+ public abstract class ChecksumGeneratorBase : ChecksumGenerator
+ {
+ /// <summary>
+ /// The value of the current checksum
+ /// </summary>
+ protected uint _current;
+
+ /// <summary>
+ /// Initializes a new instance of the checksum generator base - the current checksum is
+ /// set to zero
+ /// </summary>
+ public ChecksumGeneratorBase()
+ {
+ _current = 0;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the checksum generator basewith a specified value
+ /// </summary>
+ /// <param name="initialValue">The value to set the current checksum to</param>
+ public ChecksumGeneratorBase(uint initialValue)
+ {
+ _current = initialValue;
+ }
+
+ /// <summary>
+ /// Resets the current checksum to zero
+ /// </summary>
+ public void Reset() { _current = 0; }
+
+ /// <summary>
+ /// Gets the current checksum value
+ /// </summary>
+ public uint Value { get { return _current; } }
+
+ /// <summary>
+ /// Updates the current checksum with part of an array of bytes
+ /// </summary>
+ /// <param name="data">The data to update the checksum with</param>
+ /// <param name="offset">Where in <c>data</c> to start updating</param>
+ /// <param name="count">The number of bytes from <c>data</c> to use</param>
+ /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
+ /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
+ /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
+ /// <remarks>All the other <c>Update</c> methods are implmeneted in terms of this one.
+ /// This is therefore the only method a derived class has to implement</remarks>
+ public abstract void Update(byte[] data, int offset, int count);
+
+ /// <summary>
+ /// Updates the current checksum with an array of bytes.
+ /// </summary>
+ /// <param name="data">The data to update the checksum with</param>
+ public void Update(byte[] data)
+ {
+ Update(data, 0, data.Length);
+ }
+
+ /// <summary>
+ /// Updates the current checksum with the data from a string
+ /// </summary>
+ /// <param name="data">The string to update the checksum with</param>
+ /// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
+ public void Update(string data)
+ {
+ Update(Encoding.UTF8.GetBytes(data));
+ }
+
+ /// <summary>
+ /// Updates the current checksum with the data from a string, using a specific encoding
+ /// </summary>
+ /// <param name="data">The string to update the checksum with</param>
+ /// <param name="encoding">The encoding to use</param>
+ public void Update(string data, Encoding encoding)
+ {
+ Update(encoding.GetBytes(data));
+ }
+
+ }
+ #endregion
+
+ #region CRC32
+ /// <summary>
+ /// Implements a CRC32 checksum generator
+ /// </summary>
+ public sealed class CRC32Checksum : ChecksumGeneratorBase
+ {
+ #region DLL imports
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern uint crc32(uint crc, int data, uint length);
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the CRC32 checksum generator
+ /// </summary>
+ public CRC32Checksum() : base() {}
+
+ /// <summary>
+ /// Initializes a new instance of the CRC32 checksum generator with a specified value
+ /// </summary>
+ /// <param name="initialValue">The value to set the current checksum to</param>
+ public CRC32Checksum(uint initialValue) : base(initialValue) {}
+
+ /// <summary>
+ /// Updates the current checksum with part of an array of bytes
+ /// </summary>
+ /// <param name="data">The data to update the checksum with</param>
+ /// <param name="offset">Where in <c>data</c> to start updating</param>
+ /// <param name="count">The number of bytes from <c>data</c> to use</param>
+ /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
+ /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
+ /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
+ public override void Update(byte[] data, int offset, int count)
+ {
+ if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
+ if ((offset+count) > data.Length) throw new ArgumentException();
+ GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned);
+ try
+ {
+ _current = crc32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count);
+ }
+ finally
+ {
+ hData.Free();
+ }
+ }
+
+ }
+ #endregion
+
+ #region Adler
+ /// <summary>
+ /// Implements a checksum generator that computes the Adler checksum on data
+ /// </summary>
+ public sealed class AdlerChecksum : ChecksumGeneratorBase
+ {
+ #region DLL imports
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern uint adler32(uint adler, int data, uint length);
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the Adler checksum generator
+ /// </summary>
+ public AdlerChecksum() : base() {}
+
+ /// <summary>
+ /// Initializes a new instance of the Adler checksum generator with a specified value
+ /// </summary>
+ /// <param name="initialValue">The value to set the current checksum to</param>
+ public AdlerChecksum(uint initialValue) : base(initialValue) {}
+
+ /// <summary>
+ /// Updates the current checksum with part of an array of bytes
+ /// </summary>
+ /// <param name="data">The data to update the checksum with</param>
+ /// <param name="offset">Where in <c>data</c> to start updating</param>
+ /// <param name="count">The number of bytes from <c>data</c> to use</param>
+ /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
+ /// <exception cref="NullReferenceException"><c>data</c> is a null reference</exception>
+ /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
+ public override void Update(byte[] data, int offset, int count)
+ {
+ if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
+ if ((offset+count) > data.Length) throw new ArgumentException();
+ GCHandle hData = GCHandle.Alloc(data, GCHandleType.Pinned);
+ try
+ {
+ _current = adler32(_current, hData.AddrOfPinnedObject().ToInt32()+offset, (uint)count);
+ }
+ finally
+ {
+ hData.Free();
+ }
+ }
+
+ }
+ #endregion
+
+} \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CircularBuffer.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CircularBuffer.cs
new file mode 100644
index 000000000..9c8d60195
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CircularBuffer.cs
@@ -0,0 +1,83 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.Diagnostics;
+
+namespace DotZLib
+{
+
+ /// <summary>
+ /// This class implements a circular buffer
+ /// </summary>
+ internal class CircularBuffer
+ {
+ #region Private data
+ private int _capacity;
+ private int _head;
+ private int _tail;
+ private int _size;
+ private byte[] _buffer;
+ #endregion
+
+ public CircularBuffer(int capacity)
+ {
+ Debug.Assert( capacity > 0 );
+ _buffer = new byte[capacity];
+ _capacity = capacity;
+ _head = 0;
+ _tail = 0;
+ _size = 0;
+ }
+
+ public int Size { get { return _size; } }
+
+ public int Put(byte[] source, int offset, int count)
+ {
+ Debug.Assert( count > 0 );
+ int trueCount = Math.Min(count, _capacity - Size);
+ for (int i = 0; i < trueCount; ++i)
+ _buffer[(_tail+i) % _capacity] = source[offset+i];
+ _tail += trueCount;
+ _tail %= _capacity;
+ _size += trueCount;
+ return trueCount;
+ }
+
+ public bool Put(byte b)
+ {
+ if (Size == _capacity) // no room
+ return false;
+ _buffer[_tail++] = b;
+ _tail %= _capacity;
+ ++_size;
+ return true;
+ }
+
+ public int Get(byte[] destination, int offset, int count)
+ {
+ int trueCount = Math.Min(count,Size);
+ for (int i = 0; i < trueCount; ++i)
+ destination[offset + i] = _buffer[(_head+i) % _capacity];
+ _head += trueCount;
+ _head %= _capacity;
+ _size -= trueCount;
+ return trueCount;
+ }
+
+ public int Get()
+ {
+ if (Size == 0)
+ return -1;
+
+ int result = (int)_buffer[_head++ % _capacity];
+ --_size;
+ return result;
+ }
+
+ }
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CodecBase.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CodecBase.cs
new file mode 100644
index 000000000..b0eb78a02
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/CodecBase.cs
@@ -0,0 +1,198 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.Runtime.InteropServices;
+
+namespace DotZLib
+{
+ /// <summary>
+ /// Implements the common functionality needed for all <see cref="Codec"/>s
+ /// </summary>
+ public abstract class CodecBase : Codec, IDisposable
+ {
+
+ #region Data members
+
+ /// <summary>
+ /// Instance of the internal zlib buffer structure that is
+ /// passed to all functions in the zlib dll
+ /// </summary>
+ internal ZStream _ztream = new ZStream();
+
+ /// <summary>
+ /// True if the object instance has been disposed, false otherwise
+ /// </summary>
+ protected bool _isDisposed = false;
+
+ /// <summary>
+ /// The size of the internal buffers
+ /// </summary>
+ protected const int kBufferSize = 16384;
+
+ private byte[] _outBuffer = new byte[kBufferSize];
+ private byte[] _inBuffer = new byte[kBufferSize];
+
+ private GCHandle _hInput;
+ private GCHandle _hOutput;
+
+ private uint _checksum = 0;
+
+ #endregion
+
+ /// <summary>
+ /// Initializes a new instance of the <c>CodeBase</c> class.
+ /// </summary>
+ public CodecBase()
+ {
+ try
+ {
+ _hInput = GCHandle.Alloc(_inBuffer, GCHandleType.Pinned);
+ _hOutput = GCHandle.Alloc(_outBuffer, GCHandleType.Pinned);
+ }
+ catch (Exception)
+ {
+ CleanUp(false);
+ throw;
+ }
+ }
+
+
+ #region Codec Members
+
+ /// <summary>
+ /// Occurs when more processed data are available.
+ /// </summary>
+ public event DataAvailableHandler DataAvailable;
+
+ /// <summary>
+ /// Fires the <see cref="DataAvailable"/> event
+ /// </summary>
+ protected void OnDataAvailable()
+ {
+ if (_ztream.total_out > 0)
+ {
+ if (DataAvailable != null)
+ DataAvailable( _outBuffer, 0, (int)_ztream.total_out);
+ resetOutput();
+ }
+ }
+
+ /// <summary>
+ /// Adds more data to the codec to be processed.
+ /// </summary>
+ /// <param name="data">Byte array containing the data to be added to the codec</param>
+ /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
+ public void Add(byte[] data)
+ {
+ Add(data,0,data.Length);
+ }
+
+ /// <summary>
+ /// Adds more data to the codec to be processed.
+ /// </summary>
+ /// <param name="data">Byte array containing the data to be added to the codec</param>
+ /// <param name="offset">The index of the first byte to add from <c>data</c></param>
+ /// <param name="count">The number of bytes to add</param>
+ /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
+ /// <remarks>This must be implemented by a derived class</remarks>
+ public abstract void Add(byte[] data, int offset, int count);
+
+ /// <summary>
+ /// Finishes up any pending data that needs to be processed and handled.
+ /// </summary>
+ /// <remarks>This must be implemented by a derived class</remarks>
+ public abstract void Finish();
+
+ /// <summary>
+ /// Gets the checksum of the data that has been added so far
+ /// </summary>
+ public uint Checksum { get { return _checksum; } }
+
+ #endregion
+
+ #region Destructor & IDisposable stuff
+
+ /// <summary>
+ /// Destroys this instance
+ /// </summary>
+ ~CodecBase()
+ {
+ CleanUp(false);
+ }
+
+ /// <summary>
+ /// Releases any unmanaged resources and calls the <see cref="CleanUp()"/> method of the derived class
+ /// </summary>
+ public void Dispose()
+ {
+ CleanUp(true);
+ }
+
+ /// <summary>
+ /// Performs any codec specific cleanup
+ /// </summary>
+ /// <remarks>This must be implemented by a derived class</remarks>
+ protected abstract void CleanUp();
+
+ // performs the release of the handles and calls the dereived CleanUp()
+ private void CleanUp(bool isDisposing)
+ {
+ if (!_isDisposed)
+ {
+ CleanUp();
+ if (_hInput.IsAllocated)
+ _hInput.Free();
+ if (_hOutput.IsAllocated)
+ _hOutput.Free();
+
+ _isDisposed = true;
+ }
+ }
+
+
+ #endregion
+
+ #region Helper methods
+
+ /// <summary>
+ /// Copies a number of bytes to the internal codec buffer - ready for proccesing
+ /// </summary>
+ /// <param name="data">The byte array that contains the data to copy</param>
+ /// <param name="startIndex">The index of the first byte to copy</param>
+ /// <param name="count">The number of bytes to copy from <c>data</c></param>
+ protected void copyInput(byte[] data, int startIndex, int count)
+ {
+ Array.Copy(data, startIndex, _inBuffer,0, count);
+ _ztream.next_in = _hInput.AddrOfPinnedObject();
+ _ztream.total_in = 0;
+ _ztream.avail_in = (uint)count;
+
+ }
+
+ /// <summary>
+ /// Resets the internal output buffers to a known state - ready for processing
+ /// </summary>
+ protected void resetOutput()
+ {
+ _ztream.total_out = 0;
+ _ztream.avail_out = kBufferSize;
+ _ztream.next_out = _hOutput.AddrOfPinnedObject();
+ }
+
+ /// <summary>
+ /// Updates the running checksum property
+ /// </summary>
+ /// <param name="newSum">The new checksum value</param>
+ protected void setChecksum(uint newSum)
+ {
+ _checksum = newSum;
+ }
+ #endregion
+
+ }
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Deflater.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Deflater.cs
new file mode 100644
index 000000000..9039f41f6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Deflater.cs
@@ -0,0 +1,106 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+namespace DotZLib
+{
+
+ /// <summary>
+ /// Implements a data compressor, using the deflate algorithm in the ZLib dll
+ /// </summary>
+ public sealed class Deflater : CodecBase
+ {
+ #region Dll imports
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
+ private static extern int deflateInit_(ref ZStream sz, int level, string vs, int size);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int deflate(ref ZStream sz, int flush);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int deflateReset(ref ZStream sz);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int deflateEnd(ref ZStream sz);
+ #endregion
+
+ /// <summary>
+ /// Constructs an new instance of the <c>Deflater</c>
+ /// </summary>
+ /// <param name="level">The compression level to use for this <c>Deflater</c></param>
+ public Deflater(CompressLevel level) : base()
+ {
+ int retval = deflateInit_(ref _ztream, (int)level, Info.Version, Marshal.SizeOf(_ztream));
+ if (retval != 0)
+ throw new ZLibException(retval, "Could not initialize deflater");
+
+ resetOutput();
+ }
+
+ /// <summary>
+ /// Adds more data to the codec to be processed.
+ /// </summary>
+ /// <param name="data">Byte array containing the data to be added to the codec</param>
+ /// <param name="offset">The index of the first byte to add from <c>data</c></param>
+ /// <param name="count">The number of bytes to add</param>
+ /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
+ public override void Add(byte[] data, int offset, int count)
+ {
+ if (data == null) throw new ArgumentNullException();
+ if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
+ if ((offset+count) > data.Length) throw new ArgumentException();
+
+ int total = count;
+ int inputIndex = offset;
+ int err = 0;
+
+ while (err >= 0 && inputIndex < total)
+ {
+ copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize));
+ while (err >= 0 && _ztream.avail_in > 0)
+ {
+ err = deflate(ref _ztream, (int)FlushTypes.None);
+ if (err == 0)
+ while (_ztream.avail_out == 0)
+ {
+ OnDataAvailable();
+ err = deflate(ref _ztream, (int)FlushTypes.None);
+ }
+ inputIndex += (int)_ztream.total_in;
+ }
+ }
+ setChecksum( _ztream.adler );
+ }
+
+
+ /// <summary>
+ /// Finishes up any pending data that needs to be processed and handled.
+ /// </summary>
+ public override void Finish()
+ {
+ int err;
+ do
+ {
+ err = deflate(ref _ztream, (int)FlushTypes.Finish);
+ OnDataAvailable();
+ }
+ while (err == 0);
+ setChecksum( _ztream.adler );
+ deflateReset(ref _ztream);
+ resetOutput();
+ }
+
+ /// <summary>
+ /// Closes the internal zlib deflate stream
+ /// </summary>
+ protected override void CleanUp() { deflateEnd(ref _ztream); }
+
+ }
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.cs
new file mode 100644
index 000000000..90c7c3b38
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.cs
@@ -0,0 +1,288 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using System.Text;
+
+
+namespace DotZLib
+{
+
+ #region Internal types
+
+ /// <summary>
+ /// Defines constants for the various flush types used with zlib
+ /// </summary>
+ internal enum FlushTypes
+ {
+ None, Partial, Sync, Full, Finish, Block
+ }
+
+ #region ZStream structure
+ // internal mapping of the zlib zstream structure for marshalling
+ [StructLayoutAttribute(LayoutKind.Sequential, Pack=4, Size=0, CharSet=CharSet.Ansi)]
+ internal struct ZStream
+ {
+ public IntPtr next_in;
+ public uint avail_in;
+ public uint total_in;
+
+ public IntPtr next_out;
+ public uint avail_out;
+ public uint total_out;
+
+ [MarshalAs(UnmanagedType.LPStr)]
+ string msg;
+ uint state;
+
+ uint zalloc;
+ uint zfree;
+ uint opaque;
+
+ int data_type;
+ public uint adler;
+ uint reserved;
+ }
+
+ #endregion
+
+ #endregion
+
+ #region Public enums
+ /// <summary>
+ /// Defines constants for the available compression levels in zlib
+ /// </summary>
+ public enum CompressLevel : int
+ {
+ /// <summary>
+ /// The default compression level with a reasonable compromise between compression and speed
+ /// </summary>
+ Default = -1,
+ /// <summary>
+ /// No compression at all. The data are passed straight through.
+ /// </summary>
+ None = 0,
+ /// <summary>
+ /// The maximum compression rate available.
+ /// </summary>
+ Best = 9,
+ /// <summary>
+ /// The fastest available compression level.
+ /// </summary>
+ Fastest = 1
+ }
+ #endregion
+
+ #region Exception classes
+ /// <summary>
+ /// The exception that is thrown when an error occurs on the zlib dll
+ /// </summary>
+ public class ZLibException : ApplicationException
+ {
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
+ /// error message and error code
+ /// </summary>
+ /// <param name="errorCode">The zlib error code that caused the exception</param>
+ /// <param name="msg">A message that (hopefully) describes the error</param>
+ public ZLibException(int errorCode, string msg) : base(String.Format("ZLib error {0} {1}", errorCode, msg))
+ {
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ZLibException"/> class with a specified
+ /// error code
+ /// </summary>
+ /// <param name="errorCode">The zlib error code that caused the exception</param>
+ public ZLibException(int errorCode) : base(String.Format("ZLib error {0}", errorCode))
+ {
+ }
+ }
+ #endregion
+
+ #region Interfaces
+
+ /// <summary>
+ /// Declares methods and properties that enables a running checksum to be calculated
+ /// </summary>
+ public interface ChecksumGenerator
+ {
+ /// <summary>
+ /// Gets the current value of the checksum
+ /// </summary>
+ uint Value { get; }
+
+ /// <summary>
+ /// Clears the current checksum to 0
+ /// </summary>
+ void Reset();
+
+ /// <summary>
+ /// Updates the current checksum with an array of bytes
+ /// </summary>
+ /// <param name="data">The data to update the checksum with</param>
+ void Update(byte[] data);
+
+ /// <summary>
+ /// Updates the current checksum with part of an array of bytes
+ /// </summary>
+ /// <param name="data">The data to update the checksum with</param>
+ /// <param name="offset">Where in <c>data</c> to start updating</param>
+ /// <param name="count">The number of bytes from <c>data</c> to use</param>
+ /// <exception cref="ArgumentException">The sum of offset and count is larger than the length of <c>data</c></exception>
+ /// <exception cref="ArgumentNullException"><c>data</c> is a null reference</exception>
+ /// <exception cref="ArgumentOutOfRangeException">Offset or count is negative.</exception>
+ void Update(byte[] data, int offset, int count);
+
+ /// <summary>
+ /// Updates the current checksum with the data from a string
+ /// </summary>
+ /// <param name="data">The string to update the checksum with</param>
+ /// <remarks>The characters in the string are converted by the UTF-8 encoding</remarks>
+ void Update(string data);
+
+ /// <summary>
+ /// Updates the current checksum with the data from a string, using a specific encoding
+ /// </summary>
+ /// <param name="data">The string to update the checksum with</param>
+ /// <param name="encoding">The encoding to use</param>
+ void Update(string data, Encoding encoding);
+ }
+
+
+ /// <summary>
+ /// Represents the method that will be called from a codec when new data
+ /// are available.
+ /// </summary>
+ /// <paramref name="data">The byte array containing the processed data</paramref>
+ /// <paramref name="startIndex">The index of the first processed byte in <c>data</c></paramref>
+ /// <paramref name="count">The number of processed bytes available</paramref>
+ /// <remarks>On return from this method, the data may be overwritten, so grab it while you can.
+ /// You cannot assume that startIndex will be zero.
+ /// </remarks>
+ public delegate void DataAvailableHandler(byte[] data, int startIndex, int count);
+
+ /// <summary>
+ /// Declares methods and events for implementing compressors/decompressors
+ /// </summary>
+ public interface Codec
+ {
+ /// <summary>
+ /// Occurs when more processed data are available.
+ /// </summary>
+ event DataAvailableHandler DataAvailable;
+
+ /// <summary>
+ /// Adds more data to the codec to be processed.
+ /// </summary>
+ /// <param name="data">Byte array containing the data to be added to the codec</param>
+ /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
+ void Add(byte[] data);
+
+ /// <summary>
+ /// Adds more data to the codec to be processed.
+ /// </summary>
+ /// <param name="data">Byte array containing the data to be added to the codec</param>
+ /// <param name="offset">The index of the first byte to add from <c>data</c></param>
+ /// <param name="count">The number of bytes to add</param>
+ /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
+ void Add(byte[] data, int offset, int count);
+
+ /// <summary>
+ /// Finishes up any pending data that needs to be processed and handled.
+ /// </summary>
+ void Finish();
+
+ /// <summary>
+ /// Gets the checksum of the data that has been added so far
+ /// </summary>
+ uint Checksum { get; }
+
+
+ }
+
+ #endregion
+
+ #region Classes
+ /// <summary>
+ /// Encapsulates general information about the ZLib library
+ /// </summary>
+ public class Info
+ {
+ #region DLL imports
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern uint zlibCompileFlags();
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern string zlibVersion();
+ #endregion
+
+ #region Private stuff
+ private uint _flags;
+
+ // helper function that unpacks a bitsize mask
+ private static int bitSize(uint bits)
+ {
+ switch (bits)
+ {
+ case 0: return 16;
+ case 1: return 32;
+ case 2: return 64;
+ }
+ return -1;
+ }
+ #endregion
+
+ /// <summary>
+ /// Constructs an instance of the <c>Info</c> class.
+ /// </summary>
+ public Info()
+ {
+ _flags = zlibCompileFlags();
+ }
+
+ /// <summary>
+ /// True if the library is compiled with debug info
+ /// </summary>
+ public bool HasDebugInfo { get { return 0 != (_flags & 0x100); } }
+
+ /// <summary>
+ /// True if the library is compiled with assembly optimizations
+ /// </summary>
+ public bool UsesAssemblyCode { get { return 0 != (_flags & 0x200); } }
+
+ /// <summary>
+ /// Gets the size of the unsigned int that was compiled into Zlib
+ /// </summary>
+ public int SizeOfUInt { get { return bitSize(_flags & 3); } }
+
+ /// <summary>
+ /// Gets the size of the unsigned long that was compiled into Zlib
+ /// </summary>
+ public int SizeOfULong { get { return bitSize((_flags >> 2) & 3); } }
+
+ /// <summary>
+ /// Gets the size of the pointers that were compiled into Zlib
+ /// </summary>
+ public int SizeOfPointer { get { return bitSize((_flags >> 4) & 3); } }
+
+ /// <summary>
+ /// Gets the size of the z_off_t type that was compiled into Zlib
+ /// </summary>
+ public int SizeOfOffset { get { return bitSize((_flags >> 6) & 3); } }
+
+ /// <summary>
+ /// Gets the version of ZLib as a string, e.g. "1.2.1"
+ /// </summary>
+ public static string Version { get { return zlibVersion(); } }
+ }
+
+ #endregion
+
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.csproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.csproj
new file mode 100644
index 000000000..dea7fb16a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/DotZLib.csproj
@@ -0,0 +1,141 @@
+<VisualStudioProject>
+ <CSHARP
+ ProjectType = "Local"
+ ProductVersion = "7.10.3077"
+ SchemaVersion = "2.0"
+ ProjectGuid = "{BB1EE0B1-1808-46CB-B786-949D91117FC5}"
+ >
+ <Build>
+ <Settings
+ ApplicationIcon = ""
+ AssemblyKeyContainerName = ""
+ AssemblyName = "DotZLib"
+ AssemblyOriginatorKeyFile = ""
+ DefaultClientScript = "JScript"
+ DefaultHTMLPageLayout = "Grid"
+ DefaultTargetSchema = "IE50"
+ DelaySign = "false"
+ OutputType = "Library"
+ PreBuildEvent = ""
+ PostBuildEvent = ""
+ RootNamespace = "DotZLib"
+ RunPostBuildEvent = "OnBuildSuccess"
+ StartupObject = ""
+ >
+ <Config
+ Name = "Debug"
+ AllowUnsafeBlocks = "false"
+ BaseAddress = "285212672"
+ CheckForOverflowUnderflow = "false"
+ ConfigurationOverrideFile = ""
+ DefineConstants = "DEBUG;TRACE"
+ DocumentationFile = "docs\DotZLib.xml"
+ DebugSymbols = "true"
+ FileAlignment = "4096"
+ IncrementalBuild = "false"
+ NoStdLib = "false"
+ NoWarn = "1591"
+ Optimize = "false"
+ OutputPath = "bin\Debug\"
+ RegisterForComInterop = "false"
+ RemoveIntegerChecks = "false"
+ TreatWarningsAsErrors = "false"
+ WarningLevel = "4"
+ />
+ <Config
+ Name = "Release"
+ AllowUnsafeBlocks = "false"
+ BaseAddress = "285212672"
+ CheckForOverflowUnderflow = "false"
+ ConfigurationOverrideFile = ""
+ DefineConstants = "TRACE"
+ DocumentationFile = "docs\DotZLib.xml"
+ DebugSymbols = "false"
+ FileAlignment = "4096"
+ IncrementalBuild = "false"
+ NoStdLib = "false"
+ NoWarn = ""
+ Optimize = "true"
+ OutputPath = "bin\Release\"
+ RegisterForComInterop = "false"
+ RemoveIntegerChecks = "false"
+ TreatWarningsAsErrors = "false"
+ WarningLevel = "4"
+ />
+ </Settings>
+ <References>
+ <Reference
+ Name = "System"
+ AssemblyName = "System"
+ HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.dll"
+ />
+ <Reference
+ Name = "System.Data"
+ AssemblyName = "System.Data"
+ HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.Data.dll"
+ />
+ <Reference
+ Name = "System.XML"
+ AssemblyName = "System.Xml"
+ HintPath = "C:\WINNT\Microsoft.NET\Framework\v1.1.4322\System.XML.dll"
+ />
+ <Reference
+ Name = "nunit.framework"
+ AssemblyName = "nunit.framework"
+ HintPath = "E:\apps\NUnit V2.1\\bin\nunit.framework.dll"
+ AssemblyFolderKey = "hklm\dn\nunit.framework"
+ />
+ </References>
+ </Build>
+ <Files>
+ <Include>
+ <File
+ RelPath = "AssemblyInfo.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "ChecksumImpl.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "CircularBuffer.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "CodecBase.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "Deflater.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "DotZLib.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "GZipStream.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "Inflater.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ <File
+ RelPath = "UnitTests.cs"
+ SubType = "Code"
+ BuildAction = "Compile"
+ />
+ </Include>
+ </Files>
+ </CSHARP>
+</VisualStudioProject>
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/GZipStream.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/GZipStream.cs
new file mode 100644
index 000000000..f0eada1d2
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/GZipStream.cs
@@ -0,0 +1,301 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+
+namespace DotZLib
+{
+ /// <summary>
+ /// Implements a compressed <see cref="Stream"/>, in GZip (.gz) format.
+ /// </summary>
+ public class GZipStream : Stream, IDisposable
+ {
+ #region Dll Imports
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
+ private static extern IntPtr gzopen(string name, string mode);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int gzclose(IntPtr gzFile);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int gzwrite(IntPtr gzFile, int data, int length);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int gzread(IntPtr gzFile, int data, int length);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int gzgetc(IntPtr gzFile);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int gzputc(IntPtr gzFile, int c);
+
+ #endregion
+
+ #region Private data
+ private IntPtr _gzFile;
+ private bool _isDisposed = false;
+ private bool _isWriting;
+ #endregion
+
+ #region Constructors
+ /// <summary>
+ /// Creates a new file as a writeable GZipStream
+ /// </summary>
+ /// <param name="fileName">The name of the compressed file to create</param>
+ /// <param name="level">The compression level to use when adding data</param>
+ /// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>
+ public GZipStream(string fileName, CompressLevel level)
+ {
+ _isWriting = true;
+ _gzFile = gzopen(fileName, String.Format("wb{0}", (int)level));
+ if (_gzFile == IntPtr.Zero)
+ throw new ZLibException(-1, "Could not open " + fileName);
+ }
+
+ /// <summary>
+ /// Opens an existing file as a readable GZipStream
+ /// </summary>
+ /// <param name="fileName">The name of the file to open</param>
+ /// <exception cref="ZLibException">If an error occurred in the internal zlib function</exception>
+ public GZipStream(string fileName)
+ {
+ _isWriting = false;
+ _gzFile = gzopen(fileName, "rb");
+ if (_gzFile == IntPtr.Zero)
+ throw new ZLibException(-1, "Could not open " + fileName);
+
+ }
+ #endregion
+
+ #region Access properties
+ /// <summary>
+ /// Returns true of this stream can be read from, false otherwise
+ /// </summary>
+ public override bool CanRead
+ {
+ get
+ {
+ return !_isWriting;
+ }
+ }
+
+
+ /// <summary>
+ /// Returns false.
+ /// </summary>
+ public override bool CanSeek
+ {
+ get
+ {
+ return false;
+ }
+ }
+
+ /// <summary>
+ /// Returns true if this tsream is writeable, false otherwise
+ /// </summary>
+ public override bool CanWrite
+ {
+ get
+ {
+ return _isWriting;
+ }
+ }
+ #endregion
+
+ #region Destructor & IDispose stuff
+
+ /// <summary>
+ /// Destroys this instance
+ /// </summary>
+ ~GZipStream()
+ {
+ cleanUp(false);
+ }
+
+ /// <summary>
+ /// Closes the external file handle
+ /// </summary>
+ public void Dispose()
+ {
+ cleanUp(true);
+ }
+
+ // Does the actual closing of the file handle.
+ private void cleanUp(bool isDisposing)
+ {
+ if (!_isDisposed)
+ {
+ gzclose(_gzFile);
+ _isDisposed = true;
+ }
+ }
+ #endregion
+
+ #region Basic reading and writing
+ /// <summary>
+ /// Attempts to read a number of bytes from the stream.
+ /// </summary>
+ /// <param name="buffer">The destination data buffer</param>
+ /// <param name="offset">The index of the first destination byte in <c>buffer</c></param>
+ /// <param name="count">The number of bytes requested</param>
+ /// <returns>The number of bytes read</returns>
+ /// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>
+ /// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>
+ /// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is &gt; buffer.Length</exception>
+ /// <exception cref="NotSupportedException">If this stream is not readable.</exception>
+ /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
+ public override int Read(byte[] buffer, int offset, int count)
+ {
+ if (!CanRead) throw new NotSupportedException();
+ if (buffer == null) throw new ArgumentNullException();
+ if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
+ if ((offset+count) > buffer.Length) throw new ArgumentException();
+ if (_isDisposed) throw new ObjectDisposedException("GZipStream");
+
+ GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned);
+ int result;
+ try
+ {
+ result = gzread(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count);
+ if (result < 0)
+ throw new IOException();
+ }
+ finally
+ {
+ h.Free();
+ }
+ return result;
+ }
+
+ /// <summary>
+ /// Attempts to read a single byte from the stream.
+ /// </summary>
+ /// <returns>The byte that was read, or -1 in case of error or End-Of-File</returns>
+ public override int ReadByte()
+ {
+ if (!CanRead) throw new NotSupportedException();
+ if (_isDisposed) throw new ObjectDisposedException("GZipStream");
+ return gzgetc(_gzFile);
+ }
+
+ /// <summary>
+ /// Writes a number of bytes to the stream
+ /// </summary>
+ /// <param name="buffer"></param>
+ /// <param name="offset"></param>
+ /// <param name="count"></param>
+ /// <exception cref="ArgumentNullException">If <c>buffer</c> is null</exception>
+ /// <exception cref="ArgumentOutOfRangeException">If <c>count</c> or <c>offset</c> are negative</exception>
+ /// <exception cref="ArgumentException">If <c>offset</c> + <c>count</c> is &gt; buffer.Length</exception>
+ /// <exception cref="NotSupportedException">If this stream is not writeable.</exception>
+ /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
+ public override void Write(byte[] buffer, int offset, int count)
+ {
+ if (!CanWrite) throw new NotSupportedException();
+ if (buffer == null) throw new ArgumentNullException();
+ if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
+ if ((offset+count) > buffer.Length) throw new ArgumentException();
+ if (_isDisposed) throw new ObjectDisposedException("GZipStream");
+
+ GCHandle h = GCHandle.Alloc(buffer, GCHandleType.Pinned);
+ try
+ {
+ int result = gzwrite(_gzFile, h.AddrOfPinnedObject().ToInt32() + offset, count);
+ if (result < 0)
+ throw new IOException();
+ }
+ finally
+ {
+ h.Free();
+ }
+ }
+
+ /// <summary>
+ /// Writes a single byte to the stream
+ /// </summary>
+ /// <param name="value">The byte to add to the stream.</param>
+ /// <exception cref="NotSupportedException">If this stream is not writeable.</exception>
+ /// <exception cref="ObjectDisposedException">If this stream has been disposed.</exception>
+ public override void WriteByte(byte value)
+ {
+ if (!CanWrite) throw new NotSupportedException();
+ if (_isDisposed) throw new ObjectDisposedException("GZipStream");
+
+ int result = gzputc(_gzFile, (int)value);
+ if (result < 0)
+ throw new IOException();
+ }
+ #endregion
+
+ #region Position & length stuff
+ /// <summary>
+ /// Not supported.
+ /// </summary>
+ /// <param name="value"></param>
+ /// <exception cref="NotSupportedException">Always thrown</exception>
+ public override void SetLength(long value)
+ {
+ throw new NotSupportedException();
+ }
+
+ /// <summary>
+ /// Not suppported.
+ /// </summary>
+ /// <param name="offset"></param>
+ /// <param name="origin"></param>
+ /// <returns></returns>
+ /// <exception cref="NotSupportedException">Always thrown</exception>
+ public override long Seek(long offset, SeekOrigin origin)
+ {
+ throw new NotSupportedException();
+ }
+
+ /// <summary>
+ /// Flushes the <c>GZipStream</c>.
+ /// </summary>
+ /// <remarks>In this implementation, this method does nothing. This is because excessive
+ /// flushing may degrade the achievable compression rates.</remarks>
+ public override void Flush()
+ {
+ // left empty on purpose
+ }
+
+ /// <summary>
+ /// Gets/sets the current position in the <c>GZipStream</c>. Not suppported.
+ /// </summary>
+ /// <remarks>In this implementation this property is not supported</remarks>
+ /// <exception cref="NotSupportedException">Always thrown</exception>
+ public override long Position
+ {
+ get
+ {
+ throw new NotSupportedException();
+ }
+ set
+ {
+ throw new NotSupportedException();
+ }
+ }
+
+ /// <summary>
+ /// Gets the size of the stream. Not suppported.
+ /// </summary>
+ /// <remarks>In this implementation this property is not supported</remarks>
+ /// <exception cref="NotSupportedException">Always thrown</exception>
+ public override long Length
+ {
+ get
+ {
+ throw new NotSupportedException();
+ }
+ }
+ #endregion
+ }
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Inflater.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Inflater.cs
new file mode 100644
index 000000000..d295f2680
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/Inflater.cs
@@ -0,0 +1,105 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.Diagnostics;
+using System.Runtime.InteropServices;
+
+namespace DotZLib
+{
+
+ /// <summary>
+ /// Implements a data decompressor, using the inflate algorithm in the ZLib dll
+ /// </summary>
+ public class Inflater : CodecBase
+ {
+ #region Dll imports
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl, CharSet=CharSet.Ansi)]
+ private static extern int inflateInit_(ref ZStream sz, string vs, int size);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int inflate(ref ZStream sz, int flush);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int inflateReset(ref ZStream sz);
+
+ [DllImport("ZLIB1.dll", CallingConvention=CallingConvention.Cdecl)]
+ private static extern int inflateEnd(ref ZStream sz);
+ #endregion
+
+ /// <summary>
+ /// Constructs an new instance of the <c>Inflater</c>
+ /// </summary>
+ public Inflater() : base()
+ {
+ int retval = inflateInit_(ref _ztream, Info.Version, Marshal.SizeOf(_ztream));
+ if (retval != 0)
+ throw new ZLibException(retval, "Could not initialize inflater");
+
+ resetOutput();
+ }
+
+
+ /// <summary>
+ /// Adds more data to the codec to be processed.
+ /// </summary>
+ /// <param name="data">Byte array containing the data to be added to the codec</param>
+ /// <param name="offset">The index of the first byte to add from <c>data</c></param>
+ /// <param name="count">The number of bytes to add</param>
+ /// <remarks>Adding data may, or may not, raise the <c>DataAvailable</c> event</remarks>
+ public override void Add(byte[] data, int offset, int count)
+ {
+ if (data == null) throw new ArgumentNullException();
+ if (offset < 0 || count < 0) throw new ArgumentOutOfRangeException();
+ if ((offset+count) > data.Length) throw new ArgumentException();
+
+ int total = count;
+ int inputIndex = offset;
+ int err = 0;
+
+ while (err >= 0 && inputIndex < total)
+ {
+ copyInput(data, inputIndex, Math.Min(total - inputIndex, kBufferSize));
+ err = inflate(ref _ztream, (int)FlushTypes.None);
+ if (err == 0)
+ while (_ztream.avail_out == 0)
+ {
+ OnDataAvailable();
+ err = inflate(ref _ztream, (int)FlushTypes.None);
+ }
+
+ inputIndex += (int)_ztream.total_in;
+ }
+ setChecksum( _ztream.adler );
+ }
+
+
+ /// <summary>
+ /// Finishes up any pending data that needs to be processed and handled.
+ /// </summary>
+ public override void Finish()
+ {
+ int err;
+ do
+ {
+ err = inflate(ref _ztream, (int)FlushTypes.Finish);
+ OnDataAvailable();
+ }
+ while (err == 0);
+ setChecksum( _ztream.adler );
+ inflateReset(ref _ztream);
+ resetOutput();
+ }
+
+ /// <summary>
+ /// Closes the internal zlib inflate stream
+ /// </summary>
+ protected override void CleanUp() { inflateEnd(ref _ztream); }
+
+
+ }
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/UnitTests.cs b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/UnitTests.cs
new file mode 100644
index 000000000..6d8aebb79
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/DotZLib/UnitTests.cs
@@ -0,0 +1,274 @@
+//
+// © Copyright Henrik Ravn 2004
+//
+// Use, modification and distribution are subject to 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)
+//
+
+using System;
+using System.Collections;
+using System.IO;
+
+// uncomment the define below to include unit tests
+//#define nunit
+#if nunit
+using NUnit.Framework;
+
+// Unit tests for the DotZLib class library
+// ----------------------------------------
+//
+// Use this with NUnit 2 from http://www.nunit.org
+//
+
+namespace DotZLibTests
+{
+ using DotZLib;
+
+ // helper methods
+ internal class Utils
+ {
+ public static bool byteArrEqual( byte[] lhs, byte[] rhs )
+ {
+ if (lhs.Length != rhs.Length)
+ return false;
+ for (int i = lhs.Length-1; i >= 0; --i)
+ if (lhs[i] != rhs[i])
+ return false;
+ return true;
+ }
+
+ }
+
+
+ [TestFixture]
+ public class CircBufferTests
+ {
+ #region Circular buffer tests
+ [Test]
+ public void SinglePutGet()
+ {
+ CircularBuffer buf = new CircularBuffer(10);
+ Assert.AreEqual( 0, buf.Size );
+ Assert.AreEqual( -1, buf.Get() );
+
+ Assert.IsTrue(buf.Put( 1 ));
+ Assert.AreEqual( 1, buf.Size );
+ Assert.AreEqual( 1, buf.Get() );
+ Assert.AreEqual( 0, buf.Size );
+ Assert.AreEqual( -1, buf.Get() );
+ }
+
+ [Test]
+ public void BlockPutGet()
+ {
+ CircularBuffer buf = new CircularBuffer(10);
+ byte[] arr = {1,2,3,4,5,6,7,8,9,10};
+ Assert.AreEqual( 10, buf.Put(arr,0,10) );
+ Assert.AreEqual( 10, buf.Size );
+ Assert.IsFalse( buf.Put(11) );
+ Assert.AreEqual( 1, buf.Get() );
+ Assert.IsTrue( buf.Put(11) );
+
+ byte[] arr2 = (byte[])arr.Clone();
+ Assert.AreEqual( 9, buf.Get(arr2,1,9) );
+ Assert.IsTrue( Utils.byteArrEqual(arr,arr2) );
+ }
+
+ #endregion
+ }
+
+ [TestFixture]
+ public class ChecksumTests
+ {
+ #region CRC32 Tests
+ [Test]
+ public void CRC32_Null()
+ {
+ CRC32Checksum crc32 = new CRC32Checksum();
+ Assert.AreEqual( 0, crc32.Value );
+
+ crc32 = new CRC32Checksum(1);
+ Assert.AreEqual( 1, crc32.Value );
+
+ crc32 = new CRC32Checksum(556);
+ Assert.AreEqual( 556, crc32.Value );
+ }
+
+ [Test]
+ public void CRC32_Data()
+ {
+ CRC32Checksum crc32 = new CRC32Checksum();
+ byte[] data = { 1,2,3,4,5,6,7 };
+ crc32.Update(data);
+ Assert.AreEqual( 0x70e46888, crc32.Value );
+
+ crc32 = new CRC32Checksum();
+ crc32.Update("penguin");
+ Assert.AreEqual( 0x0e5c1a120, crc32.Value );
+
+ crc32 = new CRC32Checksum(1);
+ crc32.Update("penguin");
+ Assert.AreEqual(0x43b6aa94, crc32.Value);
+
+ }
+ #endregion
+
+ #region Adler tests
+
+ [Test]
+ public void Adler_Null()
+ {
+ AdlerChecksum adler = new AdlerChecksum();
+ Assert.AreEqual(0, adler.Value);
+
+ adler = new AdlerChecksum(1);
+ Assert.AreEqual( 1, adler.Value );
+
+ adler = new AdlerChecksum(556);
+ Assert.AreEqual( 556, adler.Value );
+ }
+
+ [Test]
+ public void Adler_Data()
+ {
+ AdlerChecksum adler = new AdlerChecksum(1);
+ byte[] data = { 1,2,3,4,5,6,7 };
+ adler.Update(data);
+ Assert.AreEqual( 0x5b001d, adler.Value );
+
+ adler = new AdlerChecksum();
+ adler.Update("penguin");
+ Assert.AreEqual(0x0bcf02f6, adler.Value );
+
+ adler = new AdlerChecksum(1);
+ adler.Update("penguin");
+ Assert.AreEqual(0x0bd602f7, adler.Value);
+
+ }
+ #endregion
+ }
+
+ [TestFixture]
+ public class InfoTests
+ {
+ #region Info tests
+ [Test]
+ public void Info_Version()
+ {
+ Info info = new Info();
+ Assert.AreEqual("1.2.11", Info.Version);
+ Assert.AreEqual(32, info.SizeOfUInt);
+ Assert.AreEqual(32, info.SizeOfULong);
+ Assert.AreEqual(32, info.SizeOfPointer);
+ Assert.AreEqual(32, info.SizeOfOffset);
+ }
+ #endregion
+ }
+
+ [TestFixture]
+ public class DeflateInflateTests
+ {
+ #region Deflate tests
+ [Test]
+ public void Deflate_Init()
+ {
+ using (Deflater def = new Deflater(CompressLevel.Default))
+ {
+ }
+ }
+
+ private ArrayList compressedData = new ArrayList();
+ private uint adler1;
+
+ private ArrayList uncompressedData = new ArrayList();
+ private uint adler2;
+
+ public void CDataAvail(byte[] data, int startIndex, int count)
+ {
+ for (int i = 0; i < count; ++i)
+ compressedData.Add(data[i+startIndex]);
+ }
+
+ [Test]
+ public void Deflate_Compress()
+ {
+ compressedData.Clear();
+
+ byte[] testData = new byte[35000];
+ for (int i = 0; i < testData.Length; ++i)
+ testData[i] = 5;
+
+ using (Deflater def = new Deflater((CompressLevel)5))
+ {
+ def.DataAvailable += new DataAvailableHandler(CDataAvail);
+ def.Add(testData);
+ def.Finish();
+ adler1 = def.Checksum;
+ }
+ }
+ #endregion
+
+ #region Inflate tests
+ [Test]
+ public void Inflate_Init()
+ {
+ using (Inflater inf = new Inflater())
+ {
+ }
+ }
+
+ private void DDataAvail(byte[] data, int startIndex, int count)
+ {
+ for (int i = 0; i < count; ++i)
+ uncompressedData.Add(data[i+startIndex]);
+ }
+
+ [Test]
+ public void Inflate_Expand()
+ {
+ uncompressedData.Clear();
+
+ using (Inflater inf = new Inflater())
+ {
+ inf.DataAvailable += new DataAvailableHandler(DDataAvail);
+ inf.Add((byte[])compressedData.ToArray(typeof(byte)));
+ inf.Finish();
+ adler2 = inf.Checksum;
+ }
+ Assert.AreEqual( adler1, adler2 );
+ }
+ #endregion
+ }
+
+ [TestFixture]
+ public class GZipStreamTests
+ {
+ #region GZipStream test
+ [Test]
+ public void GZipStream_WriteRead()
+ {
+ using (GZipStream gzOut = new GZipStream("gzstream.gz", CompressLevel.Best))
+ {
+ BinaryWriter writer = new BinaryWriter(gzOut);
+ writer.Write("hi there");
+ writer.Write(Math.PI);
+ writer.Write(42);
+ }
+
+ using (GZipStream gzIn = new GZipStream("gzstream.gz"))
+ {
+ BinaryReader reader = new BinaryReader(gzIn);
+ string s = reader.ReadString();
+ Assert.AreEqual("hi there",s);
+ double d = reader.ReadDouble();
+ Assert.AreEqual(Math.PI, d);
+ int i = reader.ReadInt32();
+ Assert.AreEqual(42,i);
+ }
+
+ }
+ #endregion
+ }
+}
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/LICENSE_1_0.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/LICENSE_1_0.txt
new file mode 100644
index 000000000..127a5bc39
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/LICENSE_1_0.txt
@@ -0,0 +1,23 @@
+Boost Software License - Version 1.0 - August 17th, 2003
+
+Permission is hereby granted, free of charge, to any person or organization
+obtaining a copy of the software and accompanying documentation covered by
+this license (the "Software") to use, reproduce, display, distribute,
+execute, and transmit the Software, and to prepare derivative works of the
+Software, and to permit third-parties to whom the Software is furnished to
+do so, all subject to the following:
+
+The copyright notices in the Software and this entire statement, including
+the above license grant, this restriction and the following disclaimer,
+must be included in all copies of the Software, in whole or in part, and
+all derivative works of the Software, unless such copies or derivative
+works are solely in the form of machine-executable object code generated by
+a source language processor.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
+SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
+FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
+ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+DEALINGS IN THE SOFTWARE. \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/readme.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/readme.txt
new file mode 100644
index 000000000..4d8c2dd93
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/dotzlib/readme.txt
@@ -0,0 +1,58 @@
+This directory contains a .Net wrapper class library for the ZLib1.dll
+
+The wrapper includes support for inflating/deflating memory buffers,
+.Net streaming wrappers for the gz streams part of zlib, and wrappers
+for the checksum parts of zlib. See DotZLib/UnitTests.cs for examples.
+
+Directory structure:
+--------------------
+
+LICENSE_1_0.txt - License file.
+readme.txt - This file.
+DotZLib.chm - Class library documentation
+DotZLib.build - NAnt build file
+DotZLib.sln - Microsoft Visual Studio 2003 solution file
+
+DotZLib\*.cs - Source files for the class library
+
+Unit tests:
+-----------
+The file DotZLib/UnitTests.cs contains unit tests for use with NUnit 2.1 or higher.
+To include unit tests in the build, define nunit before building.
+
+
+Build instructions:
+-------------------
+
+1. Using Visual Studio.Net 2003:
+ Open DotZLib.sln in VS.Net and build from there. Output file (DotZLib.dll)
+ will be found ./DotZLib/bin/release or ./DotZLib/bin/debug, depending on
+ you are building the release or debug version of the library. Check
+ DotZLib/UnitTests.cs for instructions on how to include unit tests in the
+ build.
+
+2. Using NAnt:
+ Open a command prompt with access to the build environment and run nant
+ in the same directory as the DotZLib.build file.
+ You can define 2 properties on the nant command-line to control the build:
+ debug={true|false} to toggle between release/debug builds (default=true).
+ nunit={true|false} to include or esclude unit tests (default=true).
+ Also the target clean will remove binaries.
+ Output file (DotZLib.dll) will be found in either ./DotZLib/bin/release
+ or ./DotZLib/bin/debug, depending on whether you are building the release
+ or debug version of the library.
+
+ Examples:
+ nant -D:debug=false -D:nunit=false
+ will build a release mode version of the library without unit tests.
+ nant
+ will build a debug version of the library with unit tests
+ nant clean
+ will remove all previously built files.
+
+
+---------------------------------
+Copyright (c) Henrik Ravn 2004
+
+Use, modification and distribution are subject to 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)
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/gcc_gvmat64/gvmat64.S b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/gcc_gvmat64/gvmat64.S
new file mode 100644
index 000000000..23309fa28
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/gcc_gvmat64/gvmat64.S
@@ -0,0 +1,574 @@
+/*
+;uInt longest_match_x64(
+; deflate_state *s,
+; IPos cur_match); // current match
+
+; gvmat64.S -- Asm portion of the optimized longest_match for 32 bits x86_64
+; (AMD64 on Athlon 64, Opteron, Phenom
+; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7)
+; this file is translation from gvmat64.asm to GCC 4.x (for Linux, Mac XCode)
+; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
+;
+; File written by Gilles Vollant, by converting to assembly the longest_match
+; from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
+; and by taking inspiration on asm686 with masm, optimised assembly code
+; from Brian Raiter, written 1998
+;
+; This software is provided 'as-is', without any express or implied
+; warranty. In no event will the authors be held liable for any damages
+; arising from the use of this software.
+;
+; Permission is granted to anyone to use this software for any purpose,
+; including commercial applications, and to alter it and redistribute it
+; freely, subject to the following restrictions:
+;
+; 1. The origin of this software must not be misrepresented; you must not
+; claim that you wrote the original software. If you use this software
+; in a product, an acknowledgment in the product documentation would be
+; appreciated but is not required.
+; 2. Altered source versions must be plainly marked as such, and must not be
+; misrepresented as being the original software
+; 3. This notice may not be removed or altered from any source distribution.
+;
+; http://www.zlib.net
+; http://www.winimage.com/zLibDll
+; http://www.muppetlabs.com/~breadbox/software/assembly.html
+;
+; to compile this file for zLib, I use option:
+; gcc -c -arch x86_64 gvmat64.S
+
+
+;uInt longest_match(s, cur_match)
+; deflate_state *s;
+; IPos cur_match; // current match /
+;
+; with XCode for Mac, I had strange error with some jump on intel syntax
+; this is why BEFORE_JMP and AFTER_JMP are used
+ */
+
+
+#define BEFORE_JMP .att_syntax
+#define AFTER_JMP .intel_syntax noprefix
+
+#ifndef NO_UNDERLINE
+# define match_init _match_init
+# define longest_match _longest_match
+#endif
+
+.intel_syntax noprefix
+
+.globl match_init, longest_match
+.text
+longest_match:
+
+
+
+#define LocalVarsSize 96
+/*
+; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12
+; free register : r14,r15
+; register can be saved : rsp
+*/
+
+#define chainlenwmask (rsp + 8 - LocalVarsSize)
+#define nicematch (rsp + 16 - LocalVarsSize)
+
+#define save_rdi (rsp + 24 - LocalVarsSize)
+#define save_rsi (rsp + 32 - LocalVarsSize)
+#define save_rbx (rsp + 40 - LocalVarsSize)
+#define save_rbp (rsp + 48 - LocalVarsSize)
+#define save_r12 (rsp + 56 - LocalVarsSize)
+#define save_r13 (rsp + 64 - LocalVarsSize)
+#define save_r14 (rsp + 72 - LocalVarsSize)
+#define save_r15 (rsp + 80 - LocalVarsSize)
+
+
+/*
+; all the +4 offsets are due to the addition of pending_buf_size (in zlib
+; in the deflate_state structure since the asm code was first written
+; (if you compile with zlib 1.0.4 or older, remove the +4).
+; Note : these value are good with a 8 bytes boundary pack structure
+*/
+
+#define MAX_MATCH 258
+#define MIN_MATCH 3
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+
+/*
+;;; Offsets for fields in the deflate_state structure. These numbers
+;;; are calculated from the definition of deflate_state, with the
+;;; assumption that the compiler will dword-align the fields. (Thus,
+;;; changing the definition of deflate_state could easily cause this
+;;; program to crash horribly, without so much as a warning at
+;;; compile time. Sigh.)
+
+; all the +zlib1222add offsets are due to the addition of fields
+; in zlib in the deflate_state structure since the asm code was first written
+; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
+; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
+; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
+*/
+
+
+
+/* you can check the structure offset by running
+
+#include <stdlib.h>
+#include <stdio.h>
+#include "deflate.h"
+
+void print_depl()
+{
+deflate_state ds;
+deflate_state *s=&ds;
+printf("size pointer=%u\n",(int)sizeof(void*));
+
+printf("#define dsWSize %u\n",(int)(((char*)&(s->w_size))-((char*)s)));
+printf("#define dsWMask %u\n",(int)(((char*)&(s->w_mask))-((char*)s)));
+printf("#define dsWindow %u\n",(int)(((char*)&(s->window))-((char*)s)));
+printf("#define dsPrev %u\n",(int)(((char*)&(s->prev))-((char*)s)));
+printf("#define dsMatchLen %u\n",(int)(((char*)&(s->match_length))-((char*)s)));
+printf("#define dsPrevMatch %u\n",(int)(((char*)&(s->prev_match))-((char*)s)));
+printf("#define dsStrStart %u\n",(int)(((char*)&(s->strstart))-((char*)s)));
+printf("#define dsMatchStart %u\n",(int)(((char*)&(s->match_start))-((char*)s)));
+printf("#define dsLookahead %u\n",(int)(((char*)&(s->lookahead))-((char*)s)));
+printf("#define dsPrevLen %u\n",(int)(((char*)&(s->prev_length))-((char*)s)));
+printf("#define dsMaxChainLen %u\n",(int)(((char*)&(s->max_chain_length))-((char*)s)));
+printf("#define dsGoodMatch %u\n",(int)(((char*)&(s->good_match))-((char*)s)));
+printf("#define dsNiceMatch %u\n",(int)(((char*)&(s->nice_match))-((char*)s)));
+}
+*/
+
+#define dsWSize 68
+#define dsWMask 76
+#define dsWindow 80
+#define dsPrev 96
+#define dsMatchLen 144
+#define dsPrevMatch 148
+#define dsStrStart 156
+#define dsMatchStart 160
+#define dsLookahead 164
+#define dsPrevLen 168
+#define dsMaxChainLen 172
+#define dsGoodMatch 188
+#define dsNiceMatch 192
+
+#define window_size [ rcx + dsWSize]
+#define WMask [ rcx + dsWMask]
+#define window_ad [ rcx + dsWindow]
+#define prev_ad [ rcx + dsPrev]
+#define strstart [ rcx + dsStrStart]
+#define match_start [ rcx + dsMatchStart]
+#define Lookahead [ rcx + dsLookahead] //; 0ffffffffh on infozip
+#define prev_length [ rcx + dsPrevLen]
+#define max_chain_length [ rcx + dsMaxChainLen]
+#define good_match [ rcx + dsGoodMatch]
+#define nice_match [ rcx + dsNiceMatch]
+
+/*
+; windows:
+; parameter 1 in rcx(deflate state s), param 2 in rdx (cur match)
+
+; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
+; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
+;
+; All registers must be preserved across the call, except for
+; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch.
+
+;
+; gcc on macosx-linux:
+; see http://www.x86-64.org/documentation/abi-0.99.pdf
+; param 1 in rdi, param 2 in rsi
+; rbx, rsp, rbp, r12 to r15 must be preserved
+
+;;; Save registers that the compiler may be using, and adjust esp to
+;;; make room for our stack frame.
+
+
+;;; Retrieve the function arguments. r8d will hold cur_match
+;;; throughout the entire function. edx will hold the pointer to the
+;;; deflate_state structure during the function's setup (before
+;;; entering the main loop.
+
+; ms: parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match)
+; mac: param 1 in rdi, param 2 rsi
+; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
+*/
+ mov [save_rbx],rbx
+ mov [save_rbp],rbp
+
+
+ mov rcx,rdi
+
+ mov r8d,esi
+
+
+ mov [save_r12],r12
+ mov [save_r13],r13
+ mov [save_r14],r14
+ mov [save_r15],r15
+
+
+//;;; uInt wmask = s->w_mask;
+//;;; unsigned chain_length = s->max_chain_length;
+//;;; if (s->prev_length >= s->good_match) {
+//;;; chain_length >>= 2;
+//;;; }
+
+
+ mov edi, prev_length
+ mov esi, good_match
+ mov eax, WMask
+ mov ebx, max_chain_length
+ cmp edi, esi
+ jl LastMatchGood
+ shr ebx, 2
+LastMatchGood:
+
+//;;; chainlen is decremented once beforehand so that the function can
+//;;; use the sign flag instead of the zero flag for the exit test.
+//;;; It is then shifted into the high word, to make room for the wmask
+//;;; value, which it will always accompany.
+
+ dec ebx
+ shl ebx, 16
+ or ebx, eax
+
+//;;; on zlib only
+//;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+
+
+ mov eax, nice_match
+ mov [chainlenwmask], ebx
+ mov r10d, Lookahead
+ cmp r10d, eax
+ cmovnl r10d, eax
+ mov [nicematch],r10d
+
+
+
+//;;; register Bytef *scan = s->window + s->strstart;
+ mov r10, window_ad
+ mov ebp, strstart
+ lea r13, [r10 + rbp]
+
+//;;; Determine how many bytes the scan ptr is off from being
+//;;; dword-aligned.
+
+ mov r9,r13
+ neg r13
+ and r13,3
+
+//;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+//;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
+
+
+ mov eax, window_size
+ sub eax, MIN_LOOKAHEAD
+
+
+ xor edi,edi
+ sub ebp, eax
+
+ mov r11d, prev_length
+
+ cmovng ebp,edi
+
+//;;; int best_len = s->prev_length;
+
+
+//;;; Store the sum of s->window + best_len in esi locally, and in esi.
+
+ lea rsi,[r10+r11]
+
+//;;; register ush scan_start = *(ushf*)scan;
+//;;; register ush scan_end = *(ushf*)(scan+best_len-1);
+//;;; Posf *prev = s->prev;
+
+ movzx r12d,word ptr [r9]
+ movzx ebx, word ptr [r9 + r11 - 1]
+
+ mov rdi, prev_ad
+
+//;;; Jump into the main loop.
+
+ mov edx, [chainlenwmask]
+
+ cmp bx,word ptr [rsi + r8 - 1]
+ jz LookupLoopIsZero
+
+
+
+LookupLoop1:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ jbe LeaveNow
+
+
+
+ sub edx, 0x00010000
+ BEFORE_JMP
+ js LeaveNow
+ AFTER_JMP
+
+LoopEntry1:
+ cmp bx,word ptr [rsi + r8 - 1]
+ BEFORE_JMP
+ jz LookupLoopIsZero
+ AFTER_JMP
+
+LookupLoop2:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ BEFORE_JMP
+ jbe LeaveNow
+ AFTER_JMP
+ sub edx, 0x00010000
+ BEFORE_JMP
+ js LeaveNow
+ AFTER_JMP
+
+LoopEntry2:
+ cmp bx,word ptr [rsi + r8 - 1]
+ BEFORE_JMP
+ jz LookupLoopIsZero
+ AFTER_JMP
+
+LookupLoop4:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ BEFORE_JMP
+ jbe LeaveNow
+ AFTER_JMP
+ sub edx, 0x00010000
+ BEFORE_JMP
+ js LeaveNow
+ AFTER_JMP
+
+LoopEntry4:
+
+ cmp bx,word ptr [rsi + r8 - 1]
+ BEFORE_JMP
+ jnz LookupLoop1
+ jmp LookupLoopIsZero
+ AFTER_JMP
+/*
+;;; do {
+;;; match = s->window + cur_match;
+;;; if (*(ushf*)(match+best_len-1) != scan_end ||
+;;; *(ushf*)match != scan_start) continue;
+;;; [...]
+;;; } while ((cur_match = prev[cur_match & wmask]) > limit
+;;; && --chain_length != 0);
+;;;
+;;; Here is the inner loop of the function. The function will spend the
+;;; majority of its time in this loop, and majority of that time will
+;;; be spent in the first ten instructions.
+;;;
+;;; Within this loop:
+;;; ebx = scanend
+;;; r8d = curmatch
+;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
+;;; esi = windowbestlen - i.e., (window + bestlen)
+;;; edi = prev
+;;; ebp = limit
+*/
+.balign 16
+LookupLoop:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ BEFORE_JMP
+ jbe LeaveNow
+ AFTER_JMP
+ sub edx, 0x00010000
+ BEFORE_JMP
+ js LeaveNow
+ AFTER_JMP
+
+LoopEntry:
+
+ cmp bx,word ptr [rsi + r8 - 1]
+ BEFORE_JMP
+ jnz LookupLoop1
+ AFTER_JMP
+LookupLoopIsZero:
+ cmp r12w, word ptr [r10 + r8]
+ BEFORE_JMP
+ jnz LookupLoop1
+ AFTER_JMP
+
+
+//;;; Store the current value of chainlen.
+ mov [chainlenwmask], edx
+/*
+;;; Point edi to the string under scrutiny, and esi to the string we
+;;; are hoping to match it up with. In actuality, esi and edi are
+;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
+;;; initialized to -(MAX_MATCH_8 - scanalign).
+*/
+ lea rsi,[r8+r10]
+ mov rdx, 0xfffffffffffffef8 //; -(MAX_MATCH_8)
+ lea rsi, [rsi + r13 + 0x0108] //;MAX_MATCH_8]
+ lea rdi, [r9 + r13 + 0x0108] //;MAX_MATCH_8]
+
+ prefetcht1 [rsi+rdx]
+ prefetcht1 [rdi+rdx]
+
+/*
+;;; Test the strings for equality, 8 bytes at a time. At the end,
+;;; adjust rdx so that it is offset to the exact byte that mismatched.
+;;;
+;;; We already know at this point that the first three bytes of the
+;;; strings match each other, and they can be safely passed over before
+;;; starting the compare loop. So what this code does is skip over 0-3
+;;; bytes, as much as necessary in order to dword-align the edi
+;;; pointer. (rsi will still be misaligned three times out of four.)
+;;;
+;;; It should be confessed that this loop usually does not represent
+;;; much of the total running time. Replacing it with a more
+;;; straightforward "rep cmpsb" would not drastically degrade
+;;; performance.
+*/
+
+LoopCmps:
+ mov rax, [rsi + rdx]
+ xor rax, [rdi + rdx]
+ jnz LeaveLoopCmps
+
+ mov rax, [rsi + rdx + 8]
+ xor rax, [rdi + rdx + 8]
+ jnz LeaveLoopCmps8
+
+
+ mov rax, [rsi + rdx + 8+8]
+ xor rax, [rdi + rdx + 8+8]
+ jnz LeaveLoopCmps16
+
+ add rdx,8+8+8
+
+ BEFORE_JMP
+ jnz LoopCmps
+ jmp LenMaximum
+ AFTER_JMP
+
+LeaveLoopCmps16: add rdx,8
+LeaveLoopCmps8: add rdx,8
+LeaveLoopCmps:
+
+ test eax, 0x0000FFFF
+ jnz LenLower
+
+ test eax,0xffffffff
+
+ jnz LenLower32
+
+ add rdx,4
+ shr rax,32
+ or ax,ax
+ BEFORE_JMP
+ jnz LenLower
+ AFTER_JMP
+
+LenLower32:
+ shr eax,16
+ add rdx,2
+
+LenLower:
+ sub al, 1
+ adc rdx, 0
+//;;; Calculate the length of the match. If it is longer than MAX_MATCH,
+//;;; then automatically accept it as the best possible match and leave.
+
+ lea rax, [rdi + rdx]
+ sub rax, r9
+ cmp eax, MAX_MATCH
+ BEFORE_JMP
+ jge LenMaximum
+ AFTER_JMP
+/*
+;;; If the length of the match is not longer than the best match we
+;;; have so far, then forget it and return to the lookup loop.
+;///////////////////////////////////
+*/
+ cmp eax, r11d
+ jg LongerMatch
+
+ lea rsi,[r10+r11]
+
+ mov rdi, prev_ad
+ mov edx, [chainlenwmask]
+ BEFORE_JMP
+ jmp LookupLoop
+ AFTER_JMP
+/*
+;;; s->match_start = cur_match;
+;;; best_len = len;
+;;; if (len >= nice_match) break;
+;;; scan_end = *(ushf*)(scan+best_len-1);
+*/
+LongerMatch:
+ mov r11d, eax
+ mov match_start, r8d
+ cmp eax, [nicematch]
+ BEFORE_JMP
+ jge LeaveNow
+ AFTER_JMP
+
+ lea rsi,[r10+rax]
+
+ movzx ebx, word ptr [r9 + rax - 1]
+ mov rdi, prev_ad
+ mov edx, [chainlenwmask]
+ BEFORE_JMP
+ jmp LookupLoop
+ AFTER_JMP
+
+//;;; Accept the current string, with the maximum possible length.
+
+LenMaximum:
+ mov r11d,MAX_MATCH
+ mov match_start, r8d
+
+//;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+//;;; return s->lookahead;
+
+LeaveNow:
+ mov eax, Lookahead
+ cmp r11d, eax
+ cmovng eax, r11d
+
+
+
+//;;; Restore the stack and return from whence we came.
+
+
+// mov rsi,[save_rsi]
+// mov rdi,[save_rdi]
+ mov rbx,[save_rbx]
+ mov rbp,[save_rbp]
+ mov r12,[save_r12]
+ mov r13,[save_r13]
+ mov r14,[save_r14]
+ mov r15,[save_r15]
+
+
+ ret 0
+//; please don't remove this string !
+//; Your can freely use gvmat64 in any free or commercial app
+//; but it is far better don't remove the string in the binary!
+ // db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0
+
+
+match_init:
+ ret 0
+
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/README b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/README
new file mode 100644
index 000000000..e75ed1329
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/README
@@ -0,0 +1 @@
+See infback9.h for what this is and how to use it.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.c
new file mode 100644
index 000000000..05fb3e338
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.c
@@ -0,0 +1,615 @@
+/* infback9.c -- inflate deflate64 data using a call-back interface
+ * Copyright (C) 1995-2008 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "infback9.h"
+#include "inftree9.h"
+#include "inflate9.h"
+
+#define WSIZE 65536UL
+
+/*
+ strm provides memory allocation functions in zalloc and zfree, or
+ Z_NULL to use the library memory allocation functions.
+
+ window is a user-supplied window and output buffer that is 64K bytes.
+ */
+int ZEXPORT inflateBack9Init_(strm, window, version, stream_size)
+z_stream FAR *strm;
+unsigned char FAR *window;
+const char *version;
+int stream_size;
+{
+ struct inflate_state FAR *state;
+
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+ stream_size != (int)(sizeof(z_stream)))
+ return Z_VERSION_ERROR;
+ if (strm == Z_NULL || window == Z_NULL)
+ return Z_STREAM_ERROR;
+ strm->msg = Z_NULL; /* in case we return an error */
+ if (strm->zalloc == (alloc_func)0) {
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+ }
+ if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+ state = (struct inflate_state FAR *)ZALLOC(strm, 1,
+ sizeof(struct inflate_state));
+ if (state == Z_NULL) return Z_MEM_ERROR;
+ Tracev((stderr, "inflate: allocated\n"));
+ strm->state = (voidpf)state;
+ state->window = window;
+ return Z_OK;
+}
+
+/*
+ Build and output length and distance decoding tables for fixed code
+ decoding.
+ */
+#ifdef MAKEFIXED
+#include <stdio.h>
+
+void makefixed9(void)
+{
+ unsigned sym, bits, low, size;
+ code *next, *lenfix, *distfix;
+ struct inflate_state state;
+ code fixed[544];
+
+ /* literal/length table */
+ sym = 0;
+ while (sym < 144) state.lens[sym++] = 8;
+ while (sym < 256) state.lens[sym++] = 9;
+ while (sym < 280) state.lens[sym++] = 7;
+ while (sym < 288) state.lens[sym++] = 8;
+ next = fixed;
+ lenfix = next;
+ bits = 9;
+ inflate_table9(LENS, state.lens, 288, &(next), &(bits), state.work);
+
+ /* distance table */
+ sym = 0;
+ while (sym < 32) state.lens[sym++] = 5;
+ distfix = next;
+ bits = 5;
+ inflate_table9(DISTS, state.lens, 32, &(next), &(bits), state.work);
+
+ /* write tables */
+ puts(" /* inffix9.h -- table for decoding deflate64 fixed codes");
+ puts(" * Generated automatically by makefixed9().");
+ puts(" */");
+ puts("");
+ puts(" /* WARNING: this file should *not* be used by applications.");
+ puts(" It is part of the implementation of this library and is");
+ puts(" subject to change. Applications should only use zlib.h.");
+ puts(" */");
+ puts("");
+ size = 1U << 9;
+ printf(" static const code lenfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 6) == 0) printf("\n ");
+ printf("{%u,%u,%d}", lenfix[low].op, lenfix[low].bits,
+ lenfix[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+ size = 1U << 5;
+ printf("\n static const code distfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 5) == 0) printf("\n ");
+ printf("{%u,%u,%d}", distfix[low].op, distfix[low].bits,
+ distfix[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+}
+#endif /* MAKEFIXED */
+
+/* Macros for inflateBack(): */
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+ do { \
+ hold = 0; \
+ bits = 0; \
+ } while (0)
+
+/* Assure that some input is available. If input is requested, but denied,
+ then return a Z_BUF_ERROR from inflateBack(). */
+#define PULL() \
+ do { \
+ if (have == 0) { \
+ have = in(in_desc, &next); \
+ if (have == 0) { \
+ next = Z_NULL; \
+ ret = Z_BUF_ERROR; \
+ goto inf_leave; \
+ } \
+ } \
+ } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflateBack()
+ with an error if there is no input available. */
+#define PULLBYTE() \
+ do { \
+ PULL(); \
+ have--; \
+ hold += (unsigned long)(*next++) << bits; \
+ bits += 8; \
+ } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator. If there is
+ not enough available input to do that, then return from inflateBack() with
+ an error. */
+#define NEEDBITS(n) \
+ do { \
+ while (bits < (unsigned)(n)) \
+ PULLBYTE(); \
+ } while (0)
+
+/* Return the low n bits of the bit accumulator (n <= 16) */
+#define BITS(n) \
+ ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+ do { \
+ hold >>= (n); \
+ bits -= (unsigned)(n); \
+ } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+ do { \
+ hold >>= bits & 7; \
+ bits -= bits & 7; \
+ } while (0)
+
+/* Assure that some output space is available, by writing out the window
+ if it's full. If the write fails, return from inflateBack() with a
+ Z_BUF_ERROR. */
+#define ROOM() \
+ do { \
+ if (left == 0) { \
+ put = window; \
+ left = WSIZE; \
+ wrap = 1; \
+ if (out(out_desc, put, (unsigned)left)) { \
+ ret = Z_BUF_ERROR; \
+ goto inf_leave; \
+ } \
+ } \
+ } while (0)
+
+/*
+ strm provides the memory allocation functions and window buffer on input,
+ and provides information on the unused input on return. For Z_DATA_ERROR
+ returns, strm will also provide an error message.
+
+ in() and out() are the call-back input and output functions. When
+ inflateBack() needs more input, it calls in(). When inflateBack() has
+ filled the window with output, or when it completes with data in the
+ window, it calls out() to write out the data. The application must not
+ change the provided input until in() is called again or inflateBack()
+ returns. The application must not change the window/output buffer until
+ inflateBack() returns.
+
+ in() and out() are called with a descriptor parameter provided in the
+ inflateBack() call. This parameter can be a structure that provides the
+ information required to do the read or write, as well as accumulated
+ information on the input and output such as totals and check values.
+
+ in() should return zero on failure. out() should return non-zero on
+ failure. If either in() or out() fails, than inflateBack() returns a
+ Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
+ was in() or out() that caused in the error. Otherwise, inflateBack()
+ returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
+ error, or Z_MEM_ERROR if it could not allocate memory for the state.
+ inflateBack() can also return Z_STREAM_ERROR if the input parameters
+ are not correct, i.e. strm is Z_NULL or the state was not initialized.
+ */
+int ZEXPORT inflateBack9(strm, in, in_desc, out, out_desc)
+z_stream FAR *strm;
+in_func in;
+void FAR *in_desc;
+out_func out;
+void FAR *out_desc;
+{
+ struct inflate_state FAR *state;
+ z_const unsigned char FAR *next; /* next input */
+ unsigned char FAR *put; /* next output */
+ unsigned have; /* available input */
+ unsigned long left; /* available output */
+ inflate_mode mode; /* current inflate mode */
+ int lastblock; /* true if processing last block */
+ int wrap; /* true if the window has wrapped */
+ unsigned char FAR *window; /* allocated sliding window, if needed */
+ unsigned long hold; /* bit buffer */
+ unsigned bits; /* bits in bit buffer */
+ unsigned extra; /* extra bits needed */
+ unsigned long length; /* literal or length of data to copy */
+ unsigned long offset; /* distance back to copy string from */
+ unsigned long copy; /* number of stored or match bytes to copy */
+ unsigned char FAR *from; /* where to copy match bytes from */
+ code const FAR *lencode; /* starting table for length/literal codes */
+ code const FAR *distcode; /* starting table for distance codes */
+ unsigned lenbits; /* index bits for lencode */
+ unsigned distbits; /* index bits for distcode */
+ code here; /* current decoding table entry */
+ code last; /* parent table entry */
+ unsigned len; /* length to copy for repeats, bits to drop */
+ int ret; /* return code */
+ static const unsigned short order[19] = /* permutation of code lengths */
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+#include "inffix9.h"
+
+ /* Check that the strm exists and that the state was initialized */
+ if (strm == Z_NULL || strm->state == Z_NULL)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* Reset the state */
+ strm->msg = Z_NULL;
+ mode = TYPE;
+ lastblock = 0;
+ wrap = 0;
+ window = state->window;
+ next = strm->next_in;
+ have = next != Z_NULL ? strm->avail_in : 0;
+ hold = 0;
+ bits = 0;
+ put = window;
+ left = WSIZE;
+ lencode = Z_NULL;
+ distcode = Z_NULL;
+
+ /* Inflate until end of block marked as last */
+ for (;;)
+ switch (mode) {
+ case TYPE:
+ /* determine and dispatch block type */
+ if (lastblock) {
+ BYTEBITS();
+ mode = DONE;
+ break;
+ }
+ NEEDBITS(3);
+ lastblock = BITS(1);
+ DROPBITS(1);
+ switch (BITS(2)) {
+ case 0: /* stored block */
+ Tracev((stderr, "inflate: stored block%s\n",
+ lastblock ? " (last)" : ""));
+ mode = STORED;
+ break;
+ case 1: /* fixed block */
+ lencode = lenfix;
+ lenbits = 9;
+ distcode = distfix;
+ distbits = 5;
+ Tracev((stderr, "inflate: fixed codes block%s\n",
+ lastblock ? " (last)" : ""));
+ mode = LEN; /* decode codes */
+ break;
+ case 2: /* dynamic block */
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
+ lastblock ? " (last)" : ""));
+ mode = TABLE;
+ break;
+ case 3:
+ strm->msg = (char *)"invalid block type";
+ mode = BAD;
+ }
+ DROPBITS(2);
+ break;
+
+ case STORED:
+ /* get and verify stored block length */
+ BYTEBITS(); /* go to byte boundary */
+ NEEDBITS(32);
+ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+ strm->msg = (char *)"invalid stored block lengths";
+ mode = BAD;
+ break;
+ }
+ length = (unsigned)hold & 0xffff;
+ Tracev((stderr, "inflate: stored length %lu\n",
+ length));
+ INITBITS();
+
+ /* copy stored block from input to output */
+ while (length != 0) {
+ copy = length;
+ PULL();
+ ROOM();
+ if (copy > have) copy = have;
+ if (copy > left) copy = left;
+ zmemcpy(put, next, copy);
+ have -= copy;
+ next += copy;
+ left -= copy;
+ put += copy;
+ length -= copy;
+ }
+ Tracev((stderr, "inflate: stored end\n"));
+ mode = TYPE;
+ break;
+
+ case TABLE:
+ /* get dynamic table entries descriptor */
+ NEEDBITS(14);
+ state->nlen = BITS(5) + 257;
+ DROPBITS(5);
+ state->ndist = BITS(5) + 1;
+ DROPBITS(5);
+ state->ncode = BITS(4) + 4;
+ DROPBITS(4);
+ if (state->nlen > 286) {
+ strm->msg = (char *)"too many length symbols";
+ mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: table sizes ok\n"));
+
+ /* get code length code lengths (not a typo) */
+ state->have = 0;
+ while (state->have < state->ncode) {
+ NEEDBITS(3);
+ state->lens[order[state->have++]] = (unsigned short)BITS(3);
+ DROPBITS(3);
+ }
+ while (state->have < 19)
+ state->lens[order[state->have++]] = 0;
+ state->next = state->codes;
+ lencode = (code const FAR *)(state->next);
+ lenbits = 7;
+ ret = inflate_table9(CODES, state->lens, 19, &(state->next),
+ &(lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid code lengths set";
+ mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: code lengths ok\n"));
+
+ /* get length and distance code code lengths */
+ state->have = 0;
+ while (state->have < state->nlen + state->ndist) {
+ for (;;) {
+ here = lencode[BITS(lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.val < 16) {
+ NEEDBITS(here.bits);
+ DROPBITS(here.bits);
+ state->lens[state->have++] = here.val;
+ }
+ else {
+ if (here.val == 16) {
+ NEEDBITS(here.bits + 2);
+ DROPBITS(here.bits);
+ if (state->have == 0) {
+ strm->msg = (char *)"invalid bit length repeat";
+ mode = BAD;
+ break;
+ }
+ len = (unsigned)(state->lens[state->have - 1]);
+ copy = 3 + BITS(2);
+ DROPBITS(2);
+ }
+ else if (here.val == 17) {
+ NEEDBITS(here.bits + 3);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 3 + BITS(3);
+ DROPBITS(3);
+ }
+ else {
+ NEEDBITS(here.bits + 7);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 11 + BITS(7);
+ DROPBITS(7);
+ }
+ if (state->have + copy > state->nlen + state->ndist) {
+ strm->msg = (char *)"invalid bit length repeat";
+ mode = BAD;
+ break;
+ }
+ while (copy--)
+ state->lens[state->have++] = (unsigned short)len;
+ }
+ }
+
+ /* handle error breaks in while */
+ if (mode == BAD) break;
+
+ /* check for end-of-block code (better have one) */
+ if (state->lens[256] == 0) {
+ strm->msg = (char *)"invalid code -- missing end-of-block";
+ mode = BAD;
+ break;
+ }
+
+ /* build code tables -- note: do not change the lenbits or distbits
+ values here (9 and 6) without reading the comments in inftree9.h
+ concerning the ENOUGH constants, which depend on those values */
+ state->next = state->codes;
+ lencode = (code const FAR *)(state->next);
+ lenbits = 9;
+ ret = inflate_table9(LENS, state->lens, state->nlen,
+ &(state->next), &(lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid literal/lengths set";
+ mode = BAD;
+ break;
+ }
+ distcode = (code const FAR *)(state->next);
+ distbits = 6;
+ ret = inflate_table9(DISTS, state->lens + state->nlen,
+ state->ndist, &(state->next), &(distbits),
+ state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid distances set";
+ mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: codes ok\n"));
+ mode = LEN;
+
+ case LEN:
+ /* get a literal, length, or end-of-block code */
+ for (;;) {
+ here = lencode[BITS(lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.op && (here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = lencode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(here.bits);
+ length = (unsigned)here.val;
+
+ /* process literal */
+ if (here.op == 0) {
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", here.val));
+ ROOM();
+ *put++ = (unsigned char)(length);
+ left--;
+ mode = LEN;
+ break;
+ }
+
+ /* process end of block */
+ if (here.op & 32) {
+ Tracevv((stderr, "inflate: end of block\n"));
+ mode = TYPE;
+ break;
+ }
+
+ /* invalid code */
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid literal/length code";
+ mode = BAD;
+ break;
+ }
+
+ /* length code -- get extra bits, if any */
+ extra = (unsigned)(here.op) & 31;
+ if (extra != 0) {
+ NEEDBITS(extra);
+ length += BITS(extra);
+ DROPBITS(extra);
+ }
+ Tracevv((stderr, "inflate: length %lu\n", length));
+
+ /* get distance code */
+ for (;;) {
+ here = distcode[BITS(distbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if ((here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = distcode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(here.bits);
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid distance code";
+ mode = BAD;
+ break;
+ }
+ offset = (unsigned)here.val;
+
+ /* get distance extra bits, if any */
+ extra = (unsigned)(here.op) & 15;
+ if (extra != 0) {
+ NEEDBITS(extra);
+ offset += BITS(extra);
+ DROPBITS(extra);
+ }
+ if (offset > WSIZE - (wrap ? 0: left)) {
+ strm->msg = (char *)"invalid distance too far back";
+ mode = BAD;
+ break;
+ }
+ Tracevv((stderr, "inflate: distance %lu\n", offset));
+
+ /* copy match from window to output */
+ do {
+ ROOM();
+ copy = WSIZE - offset;
+ if (copy < left) {
+ from = put + copy;
+ copy = left - copy;
+ }
+ else {
+ from = put - offset;
+ copy = left;
+ }
+ if (copy > length) copy = length;
+ length -= copy;
+ left -= copy;
+ do {
+ *put++ = *from++;
+ } while (--copy);
+ } while (length != 0);
+ break;
+
+ case DONE:
+ /* inflate stream terminated properly -- write leftover output */
+ ret = Z_STREAM_END;
+ if (left < WSIZE) {
+ if (out(out_desc, window, (unsigned)(WSIZE - left)))
+ ret = Z_BUF_ERROR;
+ }
+ goto inf_leave;
+
+ case BAD:
+ ret = Z_DATA_ERROR;
+ goto inf_leave;
+
+ default: /* can't happen, but makes compilers happy */
+ ret = Z_STREAM_ERROR;
+ goto inf_leave;
+ }
+
+ /* Return unused input */
+ inf_leave:
+ strm->next_in = next;
+ strm->avail_in = have;
+ return ret;
+}
+
+int ZEXPORT inflateBack9End(strm)
+z_stream FAR *strm;
+{
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+ return Z_STREAM_ERROR;
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+ Tracev((stderr, "inflate: end\n"));
+ return Z_OK;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.h
new file mode 100644
index 000000000..1073c0a38
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/infback9.h
@@ -0,0 +1,37 @@
+/* infback9.h -- header for using inflateBack9 functions
+ * Copyright (C) 2003 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * This header file and associated patches provide a decoder for PKWare's
+ * undocumented deflate64 compression method (method 9). Use with infback9.c,
+ * inftree9.h, inftree9.c, and inffix9.h. These patches are not supported.
+ * This should be compiled with zlib, since it uses zutil.h and zutil.o.
+ * This code has not yet been tested on 16-bit architectures. See the
+ * comments in zlib.h for inflateBack() usage. These functions are used
+ * identically, except that there is no windowBits parameter, and a 64K
+ * window must be provided. Also if int's are 16 bits, then a zero for
+ * the third parameter of the "out" function actually means 65536UL.
+ * zlib.h must be included before this header file.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ZEXTERN int ZEXPORT inflateBack9 OF((z_stream FAR *strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+ZEXTERN int ZEXPORT inflateBack9End OF((z_stream FAR *strm));
+ZEXTERN int ZEXPORT inflateBack9Init_ OF((z_stream FAR *strm,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#define inflateBack9Init(strm, window) \
+ inflateBack9Init_((strm), (window), \
+ ZLIB_VERSION, sizeof(z_stream))
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inffix9.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inffix9.h
new file mode 100644
index 000000000..ee5671d2d
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inffix9.h
@@ -0,0 +1,107 @@
+ /* inffix9.h -- table for decoding deflate64 fixed codes
+ * Generated automatically by makefixed9().
+ */
+
+ /* WARNING: this file should *not* be used by applications.
+ It is part of the implementation of this library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+ static const code lenfix[512] = {
+ {96,7,0},{0,8,80},{0,8,16},{132,8,115},{130,7,31},{0,8,112},
+ {0,8,48},{0,9,192},{128,7,10},{0,8,96},{0,8,32},{0,9,160},
+ {0,8,0},{0,8,128},{0,8,64},{0,9,224},{128,7,6},{0,8,88},
+ {0,8,24},{0,9,144},{131,7,59},{0,8,120},{0,8,56},{0,9,208},
+ {129,7,17},{0,8,104},{0,8,40},{0,9,176},{0,8,8},{0,8,136},
+ {0,8,72},{0,9,240},{128,7,4},{0,8,84},{0,8,20},{133,8,227},
+ {131,7,43},{0,8,116},{0,8,52},{0,9,200},{129,7,13},{0,8,100},
+ {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},
+ {128,7,8},{0,8,92},{0,8,28},{0,9,152},{132,7,83},{0,8,124},
+ {0,8,60},{0,9,216},{130,7,23},{0,8,108},{0,8,44},{0,9,184},
+ {0,8,12},{0,8,140},{0,8,76},{0,9,248},{128,7,3},{0,8,82},
+ {0,8,18},{133,8,163},{131,7,35},{0,8,114},{0,8,50},{0,9,196},
+ {129,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},{0,8,130},
+ {0,8,66},{0,9,228},{128,7,7},{0,8,90},{0,8,26},{0,9,148},
+ {132,7,67},{0,8,122},{0,8,58},{0,9,212},{130,7,19},{0,8,106},
+ {0,8,42},{0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},
+ {128,7,5},{0,8,86},{0,8,22},{65,8,0},{131,7,51},{0,8,118},
+ {0,8,54},{0,9,204},{129,7,15},{0,8,102},{0,8,38},{0,9,172},
+ {0,8,6},{0,8,134},{0,8,70},{0,9,236},{128,7,9},{0,8,94},
+ {0,8,30},{0,9,156},{132,7,99},{0,8,126},{0,8,62},{0,9,220},
+ {130,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
+ {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{133,8,131},
+ {130,7,31},{0,8,113},{0,8,49},{0,9,194},{128,7,10},{0,8,97},
+ {0,8,33},{0,9,162},{0,8,1},{0,8,129},{0,8,65},{0,9,226},
+ {128,7,6},{0,8,89},{0,8,25},{0,9,146},{131,7,59},{0,8,121},
+ {0,8,57},{0,9,210},{129,7,17},{0,8,105},{0,8,41},{0,9,178},
+ {0,8,9},{0,8,137},{0,8,73},{0,9,242},{128,7,4},{0,8,85},
+ {0,8,21},{144,8,3},{131,7,43},{0,8,117},{0,8,53},{0,9,202},
+ {129,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},
+ {0,8,69},{0,9,234},{128,7,8},{0,8,93},{0,8,29},{0,9,154},
+ {132,7,83},{0,8,125},{0,8,61},{0,9,218},{130,7,23},{0,8,109},
+ {0,8,45},{0,9,186},{0,8,13},{0,8,141},{0,8,77},{0,9,250},
+ {128,7,3},{0,8,83},{0,8,19},{133,8,195},{131,7,35},{0,8,115},
+ {0,8,51},{0,9,198},{129,7,11},{0,8,99},{0,8,35},{0,9,166},
+ {0,8,3},{0,8,131},{0,8,67},{0,9,230},{128,7,7},{0,8,91},
+ {0,8,27},{0,9,150},{132,7,67},{0,8,123},{0,8,59},{0,9,214},
+ {130,7,19},{0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},
+ {0,8,75},{0,9,246},{128,7,5},{0,8,87},{0,8,23},{77,8,0},
+ {131,7,51},{0,8,119},{0,8,55},{0,9,206},{129,7,15},{0,8,103},
+ {0,8,39},{0,9,174},{0,8,7},{0,8,135},{0,8,71},{0,9,238},
+ {128,7,9},{0,8,95},{0,8,31},{0,9,158},{132,7,99},{0,8,127},
+ {0,8,63},{0,9,222},{130,7,27},{0,8,111},{0,8,47},{0,9,190},
+ {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},
+ {0,8,16},{132,8,115},{130,7,31},{0,8,112},{0,8,48},{0,9,193},
+ {128,7,10},{0,8,96},{0,8,32},{0,9,161},{0,8,0},{0,8,128},
+ {0,8,64},{0,9,225},{128,7,6},{0,8,88},{0,8,24},{0,9,145},
+ {131,7,59},{0,8,120},{0,8,56},{0,9,209},{129,7,17},{0,8,104},
+ {0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},{0,9,241},
+ {128,7,4},{0,8,84},{0,8,20},{133,8,227},{131,7,43},{0,8,116},
+ {0,8,52},{0,9,201},{129,7,13},{0,8,100},{0,8,36},{0,9,169},
+ {0,8,4},{0,8,132},{0,8,68},{0,9,233},{128,7,8},{0,8,92},
+ {0,8,28},{0,9,153},{132,7,83},{0,8,124},{0,8,60},{0,9,217},
+ {130,7,23},{0,8,108},{0,8,44},{0,9,185},{0,8,12},{0,8,140},
+ {0,8,76},{0,9,249},{128,7,3},{0,8,82},{0,8,18},{133,8,163},
+ {131,7,35},{0,8,114},{0,8,50},{0,9,197},{129,7,11},{0,8,98},
+ {0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
+ {128,7,7},{0,8,90},{0,8,26},{0,9,149},{132,7,67},{0,8,122},
+ {0,8,58},{0,9,213},{130,7,19},{0,8,106},{0,8,42},{0,9,181},
+ {0,8,10},{0,8,138},{0,8,74},{0,9,245},{128,7,5},{0,8,86},
+ {0,8,22},{65,8,0},{131,7,51},{0,8,118},{0,8,54},{0,9,205},
+ {129,7,15},{0,8,102},{0,8,38},{0,9,173},{0,8,6},{0,8,134},
+ {0,8,70},{0,9,237},{128,7,9},{0,8,94},{0,8,30},{0,9,157},
+ {132,7,99},{0,8,126},{0,8,62},{0,9,221},{130,7,27},{0,8,110},
+ {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},
+ {96,7,0},{0,8,81},{0,8,17},{133,8,131},{130,7,31},{0,8,113},
+ {0,8,49},{0,9,195},{128,7,10},{0,8,97},{0,8,33},{0,9,163},
+ {0,8,1},{0,8,129},{0,8,65},{0,9,227},{128,7,6},{0,8,89},
+ {0,8,25},{0,9,147},{131,7,59},{0,8,121},{0,8,57},{0,9,211},
+ {129,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},{0,8,137},
+ {0,8,73},{0,9,243},{128,7,4},{0,8,85},{0,8,21},{144,8,3},
+ {131,7,43},{0,8,117},{0,8,53},{0,9,203},{129,7,13},{0,8,101},
+ {0,8,37},{0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},
+ {128,7,8},{0,8,93},{0,8,29},{0,9,155},{132,7,83},{0,8,125},
+ {0,8,61},{0,9,219},{130,7,23},{0,8,109},{0,8,45},{0,9,187},
+ {0,8,13},{0,8,141},{0,8,77},{0,9,251},{128,7,3},{0,8,83},
+ {0,8,19},{133,8,195},{131,7,35},{0,8,115},{0,8,51},{0,9,199},
+ {129,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
+ {0,8,67},{0,9,231},{128,7,7},{0,8,91},{0,8,27},{0,9,151},
+ {132,7,67},{0,8,123},{0,8,59},{0,9,215},{130,7,19},{0,8,107},
+ {0,8,43},{0,9,183},{0,8,11},{0,8,139},{0,8,75},{0,9,247},
+ {128,7,5},{0,8,87},{0,8,23},{77,8,0},{131,7,51},{0,8,119},
+ {0,8,55},{0,9,207},{129,7,15},{0,8,103},{0,8,39},{0,9,175},
+ {0,8,7},{0,8,135},{0,8,71},{0,9,239},{128,7,9},{0,8,95},
+ {0,8,31},{0,9,159},{132,7,99},{0,8,127},{0,8,63},{0,9,223},
+ {130,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},
+ {0,8,79},{0,9,255}
+ };
+
+ static const code distfix[32] = {
+ {128,5,1},{135,5,257},{131,5,17},{139,5,4097},{129,5,5},
+ {137,5,1025},{133,5,65},{141,5,16385},{128,5,3},{136,5,513},
+ {132,5,33},{140,5,8193},{130,5,9},{138,5,2049},{134,5,129},
+ {142,5,32769},{128,5,2},{135,5,385},{131,5,25},{139,5,6145},
+ {129,5,7},{137,5,1537},{133,5,97},{141,5,24577},{128,5,4},
+ {136,5,769},{132,5,49},{140,5,12289},{130,5,13},{138,5,3073},
+ {134,5,193},{142,5,49153}
+ };
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inflate9.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inflate9.h
new file mode 100644
index 000000000..ee9a79394
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inflate9.h
@@ -0,0 +1,47 @@
+/* inflate9.h -- internal inflate state definition
+ * Copyright (C) 1995-2003 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* Possible inflate modes between inflate() calls */
+typedef enum {
+ TYPE, /* i: waiting for type bits, including last-flag bit */
+ STORED, /* i: waiting for stored size (length and complement) */
+ TABLE, /* i: waiting for dynamic block table lengths */
+ LEN, /* i: waiting for length/lit code */
+ DONE, /* finished check, done -- remain here until reset */
+ BAD /* got a data error -- remain here until reset */
+} inflate_mode;
+
+/*
+ State transitions between above modes -
+
+ (most modes can go to the BAD mode -- not shown for clarity)
+
+ Read deflate blocks:
+ TYPE -> STORED or TABLE or LEN or DONE
+ STORED -> TYPE
+ TABLE -> LENLENS -> CODELENS -> LEN
+ Read deflate codes:
+ LEN -> LEN or TYPE
+ */
+
+/* state maintained between inflate() calls. Approximately 7K bytes. */
+struct inflate_state {
+ /* sliding window */
+ unsigned char FAR *window; /* allocated sliding window, if needed */
+ /* dynamic table building */
+ unsigned ncode; /* number of code length code lengths */
+ unsigned nlen; /* number of length code lengths */
+ unsigned ndist; /* number of distance code lengths */
+ unsigned have; /* number of code lengths in lens[] */
+ code FAR *next; /* next available space in codes[] */
+ unsigned short lens[320]; /* temporary storage for code lengths */
+ unsigned short work[288]; /* work area for code table building */
+ code codes[ENOUGH]; /* space for code tables */
+};
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.c
new file mode 100644
index 000000000..5f4a76798
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.c
@@ -0,0 +1,324 @@
+/* inftree9.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-2017 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftree9.h"
+
+#define MAXBITS 15
+
+const char inflate9_copyright[] =
+ " inflate9 1.2.11 Copyright 1995-2017 Mark Adler ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/*
+ Build a set of tables to decode the provided canonical Huffman code.
+ The code lengths are lens[0..codes-1]. The result starts at *table,
+ whose indices are 0..2^bits-1. work is a writable array of at least
+ lens shorts, which is used as a work area. type is the type of code
+ to be generated, CODES, LENS, or DISTS. On return, zero is success,
+ -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
+ on return points to the next available entry's address. bits is the
+ requested root table index bits, and on return it is the actual root
+ table index bits. It will differ if the request is greater than the
+ longest code or if it is less than the shortest code.
+ */
+int inflate_table9(type, lens, codes, table, bits, work)
+codetype type;
+unsigned short FAR *lens;
+unsigned codes;
+code FAR * FAR *table;
+unsigned FAR *bits;
+unsigned short FAR *work;
+{
+ unsigned len; /* a code's length in bits */
+ unsigned sym; /* index of code symbols */
+ unsigned min, max; /* minimum and maximum code lengths */
+ unsigned root; /* number of index bits for root table */
+ unsigned curr; /* number of index bits for current table */
+ unsigned drop; /* code bits to drop for sub-table */
+ int left; /* number of prefix codes available */
+ unsigned used; /* code entries in table used */
+ unsigned huff; /* Huffman code */
+ unsigned incr; /* for incrementing code, index */
+ unsigned fill; /* index for replicating entries */
+ unsigned low; /* low bits for current root entry */
+ unsigned mask; /* mask for low root bits */
+ code this; /* table entry for duplication */
+ code FAR *next; /* next available space in table */
+ const unsigned short FAR *base; /* base value table to use */
+ const unsigned short FAR *extra; /* extra bits table to use */
+ int end; /* use base and extra for symbol > end */
+ unsigned short count[MAXBITS+1]; /* number of codes of each length */
+ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
+ static const unsigned short lbase[31] = { /* Length codes 257..285 base */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17,
+ 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115,
+ 131, 163, 195, 227, 3, 0, 0};
+ static const unsigned short lext[31] = { /* Length codes 257..285 extra */
+ 128, 128, 128, 128, 128, 128, 128, 128, 129, 129, 129, 129,
+ 130, 130, 130, 130, 131, 131, 131, 131, 132, 132, 132, 132,
+ 133, 133, 133, 133, 144, 77, 202};
+ static const unsigned short dbase[32] = { /* Distance codes 0..31 base */
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49,
+ 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073,
+ 4097, 6145, 8193, 12289, 16385, 24577, 32769, 49153};
+ static const unsigned short dext[32] = { /* Distance codes 0..31 extra */
+ 128, 128, 128, 128, 129, 129, 130, 130, 131, 131, 132, 132,
+ 133, 133, 134, 134, 135, 135, 136, 136, 137, 137, 138, 138,
+ 139, 139, 140, 140, 141, 141, 142, 142};
+
+ /*
+ Process a set of code lengths to create a canonical Huffman code. The
+ code lengths are lens[0..codes-1]. Each length corresponds to the
+ symbols 0..codes-1. The Huffman code is generated by first sorting the
+ symbols by length from short to long, and retaining the symbol order
+ for codes with equal lengths. Then the code starts with all zero bits
+ for the first code of the shortest length, and the codes are integer
+ increments for the same length, and zeros are appended as the length
+ increases. For the deflate format, these bits are stored backwards
+ from their more natural integer increment ordering, and so when the
+ decoding tables are built in the large loop below, the integer codes
+ are incremented backwards.
+
+ This routine assumes, but does not check, that all of the entries in
+ lens[] are in the range 0..MAXBITS. The caller must assure this.
+ 1..MAXBITS is interpreted as that code length. zero means that that
+ symbol does not occur in this code.
+
+ The codes are sorted by computing a count of codes for each length,
+ creating from that a table of starting indices for each length in the
+ sorted table, and then entering the symbols in order in the sorted
+ table. The sorted table is work[], with that space being provided by
+ the caller.
+
+ The length counts are used for other purposes as well, i.e. finding
+ the minimum and maximum length codes, determining if there are any
+ codes at all, checking for a valid set of lengths, and looking ahead
+ at length counts to determine sub-table sizes when building the
+ decoding tables.
+ */
+
+ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+ for (len = 0; len <= MAXBITS; len++)
+ count[len] = 0;
+ for (sym = 0; sym < codes; sym++)
+ count[lens[sym]]++;
+
+ /* bound code lengths, force root to be within code lengths */
+ root = *bits;
+ for (max = MAXBITS; max >= 1; max--)
+ if (count[max] != 0) break;
+ if (root > max) root = max;
+ if (max == 0) return -1; /* no codes! */
+ for (min = 1; min <= MAXBITS; min++)
+ if (count[min] != 0) break;
+ if (root < min) root = min;
+
+ /* check for an over-subscribed or incomplete set of lengths */
+ left = 1;
+ for (len = 1; len <= MAXBITS; len++) {
+ left <<= 1;
+ left -= count[len];
+ if (left < 0) return -1; /* over-subscribed */
+ }
+ if (left > 0 && (type == CODES || max != 1))
+ return -1; /* incomplete set */
+
+ /* generate offsets into symbol table for each length for sorting */
+ offs[1] = 0;
+ for (len = 1; len < MAXBITS; len++)
+ offs[len + 1] = offs[len] + count[len];
+
+ /* sort symbols by length, by symbol order within each length */
+ for (sym = 0; sym < codes; sym++)
+ if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
+
+ /*
+ Create and fill in decoding tables. In this loop, the table being
+ filled is at next and has curr index bits. The code being used is huff
+ with length len. That code is converted to an index by dropping drop
+ bits off of the bottom. For codes where len is less than drop + curr,
+ those top drop + curr - len bits are incremented through all values to
+ fill the table with replicated entries.
+
+ root is the number of index bits for the root table. When len exceeds
+ root, sub-tables are created pointed to by the root entry with an index
+ of the low root bits of huff. This is saved in low to check for when a
+ new sub-table should be started. drop is zero when the root table is
+ being filled, and drop is root when sub-tables are being filled.
+
+ When a new sub-table is needed, it is necessary to look ahead in the
+ code lengths to determine what size sub-table is needed. The length
+ counts are used for this, and so count[] is decremented as codes are
+ entered in the tables.
+
+ used keeps track of how many table entries have been allocated from the
+ provided *table space. It is checked for LENS and DIST tables against
+ the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+ the initial root table size constants. See the comments in inftree9.h
+ for more information.
+
+ sym increments through all symbols, and the loop terminates when
+ all codes of length max, i.e. all codes, have been processed. This
+ routine permits incomplete codes, so another loop after this one fills
+ in the rest of the decoding tables with invalid code markers.
+ */
+
+ /* set up for code type */
+ switch (type) {
+ case CODES:
+ base = extra = work; /* dummy value--not used */
+ end = 19;
+ break;
+ case LENS:
+ base = lbase;
+ base -= 257;
+ extra = lext;
+ extra -= 257;
+ end = 256;
+ break;
+ default: /* DISTS */
+ base = dbase;
+ extra = dext;
+ end = -1;
+ }
+
+ /* initialize state for loop */
+ huff = 0; /* starting code */
+ sym = 0; /* starting code symbol */
+ len = min; /* starting code length */
+ next = *table; /* current table to fill in */
+ curr = root; /* current table index bits */
+ drop = 0; /* current bits to drop from code for index */
+ low = (unsigned)(-1); /* trigger new sub-table when len > root */
+ used = 1U << root; /* use root table entries */
+ mask = used - 1; /* mask for comparing low */
+
+ /* check available table space */
+ if ((type == LENS && used >= ENOUGH_LENS) ||
+ (type == DISTS && used >= ENOUGH_DISTS))
+ return 1;
+
+ /* process all codes and make table entries */
+ for (;;) {
+ /* create table entry */
+ this.bits = (unsigned char)(len - drop);
+ if ((int)(work[sym]) < end) {
+ this.op = (unsigned char)0;
+ this.val = work[sym];
+ }
+ else if ((int)(work[sym]) > end) {
+ this.op = (unsigned char)(extra[work[sym]]);
+ this.val = base[work[sym]];
+ }
+ else {
+ this.op = (unsigned char)(32 + 64); /* end of block */
+ this.val = 0;
+ }
+
+ /* replicate for those indices with low len bits equal to huff */
+ incr = 1U << (len - drop);
+ fill = 1U << curr;
+ do {
+ fill -= incr;
+ next[(huff >> drop) + fill] = this;
+ } while (fill != 0);
+
+ /* backwards increment the len-bit code huff */
+ incr = 1U << (len - 1);
+ while (huff & incr)
+ incr >>= 1;
+ if (incr != 0) {
+ huff &= incr - 1;
+ huff += incr;
+ }
+ else
+ huff = 0;
+
+ /* go to next symbol, update count, len */
+ sym++;
+ if (--(count[len]) == 0) {
+ if (len == max) break;
+ len = lens[work[sym]];
+ }
+
+ /* create new sub-table if needed */
+ if (len > root && (huff & mask) != low) {
+ /* if first time, transition to sub-tables */
+ if (drop == 0)
+ drop = root;
+
+ /* increment past last table */
+ next += 1U << curr;
+
+ /* determine length of next table */
+ curr = len - drop;
+ left = (int)(1 << curr);
+ while (curr + drop < max) {
+ left -= count[curr + drop];
+ if (left <= 0) break;
+ curr++;
+ left <<= 1;
+ }
+
+ /* check for enough space */
+ used += 1U << curr;
+ if ((type == LENS && used >= ENOUGH_LENS) ||
+ (type == DISTS && used >= ENOUGH_DISTS))
+ return 1;
+
+ /* point entry in root table to sub-table */
+ low = huff & mask;
+ (*table)[low].op = (unsigned char)curr;
+ (*table)[low].bits = (unsigned char)root;
+ (*table)[low].val = (unsigned short)(next - *table);
+ }
+ }
+
+ /*
+ Fill in rest of table for incomplete codes. This loop is similar to the
+ loop above in incrementing huff for table indices. It is assumed that
+ len is equal to curr + drop, so there is no loop needed to increment
+ through high index bits. When the current sub-table is filled, the loop
+ drops back to the root table to fill in any remaining entries there.
+ */
+ this.op = (unsigned char)64; /* invalid code marker */
+ this.bits = (unsigned char)(len - drop);
+ this.val = (unsigned short)0;
+ while (huff != 0) {
+ /* when done with sub-table, drop back to root table */
+ if (drop != 0 && (huff & mask) != low) {
+ drop = 0;
+ len = root;
+ next = *table;
+ curr = root;
+ this.bits = (unsigned char)len;
+ }
+
+ /* put invalid code marker in table */
+ next[huff >> drop] = this;
+
+ /* backwards increment the len-bit code huff */
+ incr = 1U << (len - 1);
+ while (huff & incr)
+ incr >>= 1;
+ if (incr != 0) {
+ huff &= incr - 1;
+ huff += incr;
+ }
+ else
+ huff = 0;
+ }
+
+ /* set return parameters */
+ *table += used;
+ *bits = root;
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.h
new file mode 100644
index 000000000..5ab21f0c6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/infback9/inftree9.h
@@ -0,0 +1,61 @@
+/* inftree9.h -- header to use inftree9.c
+ * Copyright (C) 1995-2008 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* Structure for decoding tables. Each entry provides either the
+ information needed to do the operation requested by the code that
+ indexed that table entry, or it provides a pointer to another
+ table that indexes more bits of the code. op indicates whether
+ the entry is a pointer to another table, a literal, a length or
+ distance, an end-of-block, or an invalid code. For a table
+ pointer, the low four bits of op is the number of index bits of
+ that table. For a length or distance, the low four bits of op
+ is the number of extra bits to get after the code. bits is
+ the number of bits in this code or part of the code to drop off
+ of the bit buffer. val is the actual byte to output in the case
+ of a literal, the base length or distance, or the offset from
+ the current table to the next table. Each entry is four bytes. */
+typedef struct {
+ unsigned char op; /* operation, extra bits, table bits */
+ unsigned char bits; /* bits in this part of the code */
+ unsigned short val; /* offset in table or code value */
+} code;
+
+/* op values as set by inflate_table():
+ 00000000 - literal
+ 0000tttt - table link, tttt != 0 is the number of table index bits
+ 100eeeee - length or distance, eeee is the number of extra bits
+ 01100000 - end of block
+ 01000000 - invalid code
+ */
+
+/* Maximum size of the dynamic table. The maximum number of code structures is
+ 1446, which is the sum of 852 for literal/length codes and 594 for distance
+ codes. These values were found by exhaustive searches using the program
+ examples/enough.c found in the zlib distribtution. The arguments to that
+ program are the number of symbols, the initial root table size, and the
+ maximum bit length of a code. "enough 286 9 15" for literal/length codes
+ returns returns 852, and "enough 32 6 15" for distance codes returns 594.
+ The initial root table size (9 or 6) is found in the fifth argument of the
+ inflate_table() calls in infback9.c. If the root table size is changed,
+ then these maximum sizes would be need to be recalculated and updated. */
+#define ENOUGH_LENS 852
+#define ENOUGH_DISTS 594
+#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
+
+/* Type of code to build for inflate_table9() */
+typedef enum {
+ CODES,
+ LENS,
+ DISTS
+} codetype;
+
+extern int inflate_table9 OF((codetype type, unsigned short FAR *lens,
+ unsigned codes, code FAR * FAR *table,
+ unsigned FAR *bits, unsigned short FAR *work));
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffas86.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffas86.c
new file mode 100644
index 000000000..7292f67b7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffas86.c
@@ -0,0 +1,1157 @@
+/* inffas86.c is a hand tuned assembler version of
+ *
+ * inffast.c -- fast decoding
+ * Copyright (C) 1995-2003 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Copyright (C) 2003 Chris Anderson <christop@charm.net>
+ * Please use the copyright conditions above.
+ *
+ * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also
+ * slightly quicker on x86 systems because, instead of using rep movsb to copy
+ * data, it uses rep movsw, which moves data in 2-byte chunks instead of single
+ * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates
+ * from http://fedora.linux.duke.edu/fc1_x86_64
+ * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with
+ * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version,
+ * when decompressing mozilla-source-1.3.tar.gz.
+ *
+ * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
+ * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at
+ * the moment. I have successfully compiled and tested this code with gcc2.96,
+ * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S
+ * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
+ * enabled. I will attempt to merge the MMX code into this version. Newer
+ * versions of this and inffast.S can be found at
+ * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+/* Mark Adler's comments from inffast.c: */
+
+/*
+ Decode literal, length, and distance codes and write out the resulting
+ literal and match bytes until either not enough input or output is
+ available, an end-of-block is encountered, or a data error is encountered.
+ When large enough input and output buffers are supplied to inflate(), for
+ example, a 16K input buffer and a 64K output buffer, more than 95% of the
+ inflate execution time is spent in this routine.
+
+ Entry assumptions:
+
+ state->mode == LEN
+ strm->avail_in >= 6
+ strm->avail_out >= 258
+ start >= strm->avail_out
+ state->bits < 8
+
+ On return, state->mode is one of:
+
+ LEN -- ran out of enough output space or enough available input
+ TYPE -- reached end of block code, inflate() to interpret next block
+ BAD -- error in block data
+
+ Notes:
+
+ - The maximum input bits used by a length/distance pair is 15 bits for the
+ length code, 5 bits for the length extra, 15 bits for the distance code,
+ and 13 bits for the distance extra. This totals 48 bits, or six bytes.
+ Therefore if strm->avail_in >= 6, then there is enough input to avoid
+ checking for available input while decoding.
+
+ - The maximum bytes that a single length/distance pair can output is 258
+ bytes, which is the maximum length that can be coded. inflate_fast()
+ requires strm->avail_out >= 258 for each loop to avoid checking for
+ output space.
+ */
+void inflate_fast(strm, start)
+z_streamp strm;
+unsigned start; /* inflate()'s starting value for strm->avail_out */
+{
+ struct inflate_state FAR *state;
+ struct inffast_ar {
+/* 64 32 x86 x86_64 */
+/* ar offset register */
+/* 0 0 */ void *esp; /* esp save */
+/* 8 4 */ void *ebp; /* ebp save */
+/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */
+/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */
+/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */
+/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */
+/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */
+/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */
+/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */
+/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */
+/* 80 40 */ unsigned long hold; /* edx rdx local strm->hold */
+/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */
+/* 92 48 */ unsigned wsize; /* window size */
+/* 96 52 */ unsigned write; /* window write index */
+/*100 56 */ unsigned lmask; /* r12 mask for lcode */
+/*104 60 */ unsigned dmask; /* r13 mask for dcode */
+/*108 64 */ unsigned len; /* r14 match length */
+/*112 68 */ unsigned dist; /* r15 match distance */
+/*116 72 */ unsigned status; /* set when state chng*/
+ } ar;
+
+#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )
+#define PAD_AVAIL_IN 6
+#define PAD_AVAIL_OUT 258
+#else
+#define PAD_AVAIL_IN 5
+#define PAD_AVAIL_OUT 257
+#endif
+
+ /* copy state to local variables */
+ state = (struct inflate_state FAR *)strm->state;
+ ar.in = strm->next_in;
+ ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
+ ar.out = strm->next_out;
+ ar.beg = ar.out - (start - strm->avail_out);
+ ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
+ ar.wsize = state->wsize;
+ ar.write = state->wnext;
+ ar.window = state->window;
+ ar.hold = state->hold;
+ ar.bits = state->bits;
+ ar.lcode = state->lencode;
+ ar.dcode = state->distcode;
+ ar.lmask = (1U << state->lenbits) - 1;
+ ar.dmask = (1U << state->distbits) - 1;
+
+ /* decode literals and length/distances until end-of-block or not enough
+ input data or output space */
+
+ /* align in on 1/2 hold size boundary */
+ while (((unsigned long)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) {
+ ar.hold += (unsigned long)*ar.in++ << ar.bits;
+ ar.bits += 8;
+ }
+
+#if defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )
+ __asm__ __volatile__ (
+" leaq %0, %%rax\n"
+" movq %%rbp, 8(%%rax)\n" /* save regs rbp and rsp */
+" movq %%rsp, (%%rax)\n"
+" movq %%rax, %%rsp\n" /* make rsp point to &ar */
+" movq 16(%%rsp), %%rsi\n" /* rsi = in */
+" movq 32(%%rsp), %%rdi\n" /* rdi = out */
+" movq 24(%%rsp), %%r9\n" /* r9 = last */
+" movq 48(%%rsp), %%r10\n" /* r10 = end */
+" movq 64(%%rsp), %%rbp\n" /* rbp = lcode */
+" movq 72(%%rsp), %%r11\n" /* r11 = dcode */
+" movq 80(%%rsp), %%rdx\n" /* rdx = hold */
+" movl 88(%%rsp), %%ebx\n" /* ebx = bits */
+" movl 100(%%rsp), %%r12d\n" /* r12d = lmask */
+" movl 104(%%rsp), %%r13d\n" /* r13d = dmask */
+ /* r14d = len */
+ /* r15d = dist */
+" cld\n"
+" cmpq %%rdi, %%r10\n"
+" je .L_one_time\n" /* if only one decode left */
+" cmpq %%rsi, %%r9\n"
+" je .L_one_time\n"
+" jmp .L_do_loop\n"
+
+".L_one_time:\n"
+" movq %%r12, %%r8\n" /* r8 = lmask */
+" cmpb $32, %%bl\n"
+" ja .L_get_length_code_one_time\n"
+
+" lodsl\n" /* eax = *(uint *)in++ */
+" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */
+" addb $32, %%bl\n" /* bits += 32 */
+" shlq %%cl, %%rax\n"
+" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */
+" jmp .L_get_length_code_one_time\n"
+
+".align 32,0x90\n"
+".L_while_test:\n"
+" cmpq %%rdi, %%r10\n"
+" jbe .L_break_loop\n"
+" cmpq %%rsi, %%r9\n"
+" jbe .L_break_loop\n"
+
+".L_do_loop:\n"
+" movq %%r12, %%r8\n" /* r8 = lmask */
+" cmpb $32, %%bl\n"
+" ja .L_get_length_code\n" /* if (32 < bits) */
+
+" lodsl\n" /* eax = *(uint *)in++ */
+" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */
+" addb $32, %%bl\n" /* bits += 32 */
+" shlq %%cl, %%rax\n"
+" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */
+
+".L_get_length_code:\n"
+" andq %%rdx, %%r8\n" /* r8 &= hold */
+" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */
+
+" movb %%ah, %%cl\n" /* cl = this.bits */
+" subb %%ah, %%bl\n" /* bits -= this.bits */
+" shrq %%cl, %%rdx\n" /* hold >>= this.bits */
+
+" testb %%al, %%al\n"
+" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */
+
+" movq %%r12, %%r8\n" /* r8 = lmask */
+" shrl $16, %%eax\n" /* output this.val char */
+" stosb\n"
+
+".L_get_length_code_one_time:\n"
+" andq %%rdx, %%r8\n" /* r8 &= hold */
+" movl (%%rbp,%%r8,4), %%eax\n" /* eax = lcode[hold & lmask] */
+
+".L_dolen:\n"
+" movb %%ah, %%cl\n" /* cl = this.bits */
+" subb %%ah, %%bl\n" /* bits -= this.bits */
+" shrq %%cl, %%rdx\n" /* hold >>= this.bits */
+
+" testb %%al, %%al\n"
+" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */
+
+" shrl $16, %%eax\n" /* output this.val char */
+" stosb\n"
+" jmp .L_while_test\n"
+
+".align 32,0x90\n"
+".L_test_for_length_base:\n"
+" movl %%eax, %%r14d\n" /* len = this */
+" shrl $16, %%r14d\n" /* len = this.val */
+" movb %%al, %%cl\n"
+
+" testb $16, %%al\n"
+" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */
+" andb $15, %%cl\n" /* op &= 15 */
+" jz .L_decode_distance\n" /* if (!op) */
+
+".L_add_bits_to_len:\n"
+" subb %%cl, %%bl\n"
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n"
+" andl %%edx, %%eax\n" /* eax &= hold */
+" shrq %%cl, %%rdx\n"
+" addl %%eax, %%r14d\n" /* len += hold & mask[op] */
+
+".L_decode_distance:\n"
+" movq %%r13, %%r8\n" /* r8 = dmask */
+" cmpb $32, %%bl\n"
+" ja .L_get_distance_code\n" /* if (32 < bits) */
+
+" lodsl\n" /* eax = *(uint *)in++ */
+" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */
+" addb $32, %%bl\n" /* bits += 32 */
+" shlq %%cl, %%rax\n"
+" orq %%rax, %%rdx\n" /* hold |= *((uint *)in)++ << bits */
+
+".L_get_distance_code:\n"
+" andq %%rdx, %%r8\n" /* r8 &= hold */
+" movl (%%r11,%%r8,4), %%eax\n" /* eax = dcode[hold & dmask] */
+
+".L_dodist:\n"
+" movl %%eax, %%r15d\n" /* dist = this */
+" shrl $16, %%r15d\n" /* dist = this.val */
+" movb %%ah, %%cl\n"
+" subb %%ah, %%bl\n" /* bits -= this.bits */
+" shrq %%cl, %%rdx\n" /* hold >>= this.bits */
+" movb %%al, %%cl\n" /* cl = this.op */
+
+" testb $16, %%al\n" /* if ((op & 16) == 0) */
+" jz .L_test_for_second_level_dist\n"
+" andb $15, %%cl\n" /* op &= 15 */
+" jz .L_check_dist_one\n"
+
+".L_add_bits_to_dist:\n"
+" subb %%cl, %%bl\n"
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n" /* (1 << op) - 1 */
+" andl %%edx, %%eax\n" /* eax &= hold */
+" shrq %%cl, %%rdx\n"
+" addl %%eax, %%r15d\n" /* dist += hold & ((1 << op) - 1) */
+
+".L_check_window:\n"
+" movq %%rsi, %%r8\n" /* save in so from can use it's reg */
+" movq %%rdi, %%rax\n"
+" subq 40(%%rsp), %%rax\n" /* nbytes = out - beg */
+
+" cmpl %%r15d, %%eax\n"
+" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */
+
+" movl %%r14d, %%ecx\n" /* ecx = len */
+" movq %%rdi, %%rsi\n"
+" subq %%r15, %%rsi\n" /* from = out - dist */
+
+" sarl %%ecx\n"
+" jnc .L_copy_two\n" /* if len % 2 == 0 */
+
+" rep movsw\n"
+" movb (%%rsi), %%al\n"
+" movb %%al, (%%rdi)\n"
+" incq %%rdi\n"
+
+" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */
+" jmp .L_while_test\n"
+
+".L_copy_two:\n"
+" rep movsw\n"
+" movq %%r8, %%rsi\n" /* move in back to %rsi, toss from */
+" jmp .L_while_test\n"
+
+".align 32,0x90\n"
+".L_check_dist_one:\n"
+" cmpl $1, %%r15d\n" /* if dist 1, is a memset */
+" jne .L_check_window\n"
+" cmpq %%rdi, 40(%%rsp)\n" /* if out == beg, outside window */
+" je .L_check_window\n"
+
+" movl %%r14d, %%ecx\n" /* ecx = len */
+" movb -1(%%rdi), %%al\n"
+" movb %%al, %%ah\n"
+
+" sarl %%ecx\n"
+" jnc .L_set_two\n"
+" movb %%al, (%%rdi)\n"
+" incq %%rdi\n"
+
+".L_set_two:\n"
+" rep stosw\n"
+" jmp .L_while_test\n"
+
+".align 32,0x90\n"
+".L_test_for_second_level_length:\n"
+" testb $64, %%al\n"
+" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */
+
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n"
+" andl %%edx, %%eax\n" /* eax &= hold */
+" addl %%r14d, %%eax\n" /* eax += len */
+" movl (%%rbp,%%rax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/
+" jmp .L_dolen\n"
+
+".align 32,0x90\n"
+".L_test_for_second_level_dist:\n"
+" testb $64, %%al\n"
+" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */
+
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n"
+" andl %%edx, %%eax\n" /* eax &= hold */
+" addl %%r15d, %%eax\n" /* eax += dist */
+" movl (%%r11,%%rax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/
+" jmp .L_dodist\n"
+
+".align 32,0x90\n"
+".L_clip_window:\n"
+" movl %%eax, %%ecx\n" /* ecx = nbytes */
+" movl 92(%%rsp), %%eax\n" /* eax = wsize, prepare for dist cmp */
+" negl %%ecx\n" /* nbytes = -nbytes */
+
+" cmpl %%r15d, %%eax\n"
+" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */
+
+" addl %%r15d, %%ecx\n" /* nbytes = dist - nbytes */
+" cmpl $0, 96(%%rsp)\n"
+" jne .L_wrap_around_window\n" /* if (write != 0) */
+
+" movq 56(%%rsp), %%rsi\n" /* from = window */
+" subl %%ecx, %%eax\n" /* eax -= nbytes */
+" addq %%rax, %%rsi\n" /* from += wsize - nbytes */
+
+" movl %%r14d, %%eax\n" /* eax = len */
+" cmpl %%ecx, %%r14d\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* eax -= nbytes */
+" rep movsb\n"
+" movq %%rdi, %%rsi\n"
+" subq %%r15, %%rsi\n" /* from = &out[ -dist ] */
+" jmp .L_do_copy\n"
+
+".align 32,0x90\n"
+".L_wrap_around_window:\n"
+" movl 96(%%rsp), %%eax\n" /* eax = write */
+" cmpl %%eax, %%ecx\n"
+" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */
+
+" movl 92(%%rsp), %%esi\n" /* from = wsize */
+" addq 56(%%rsp), %%rsi\n" /* from += window */
+" addq %%rax, %%rsi\n" /* from += write */
+" subq %%rcx, %%rsi\n" /* from -= nbytes */
+" subl %%eax, %%ecx\n" /* nbytes -= write */
+
+" movl %%r14d, %%eax\n" /* eax = len */
+" cmpl %%ecx, %%eax\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* len -= nbytes */
+" rep movsb\n"
+" movq 56(%%rsp), %%rsi\n" /* from = window */
+" movl 96(%%rsp), %%ecx\n" /* nbytes = write */
+" cmpl %%ecx, %%eax\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* len -= nbytes */
+" rep movsb\n"
+" movq %%rdi, %%rsi\n"
+" subq %%r15, %%rsi\n" /* from = out - dist */
+" jmp .L_do_copy\n"
+
+".align 32,0x90\n"
+".L_contiguous_in_window:\n"
+" movq 56(%%rsp), %%rsi\n" /* rsi = window */
+" addq %%rax, %%rsi\n"
+" subq %%rcx, %%rsi\n" /* from += write - nbytes */
+
+" movl %%r14d, %%eax\n" /* eax = len */
+" cmpl %%ecx, %%eax\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* len -= nbytes */
+" rep movsb\n"
+" movq %%rdi, %%rsi\n"
+" subq %%r15, %%rsi\n" /* from = out - dist */
+" jmp .L_do_copy\n" /* if (nbytes >= len) */
+
+".align 32,0x90\n"
+".L_do_copy:\n"
+" movl %%eax, %%ecx\n" /* ecx = len */
+" rep movsb\n"
+
+" movq %%r8, %%rsi\n" /* move in back to %esi, toss from */
+" jmp .L_while_test\n"
+
+".L_test_for_end_of_block:\n"
+" testb $32, %%al\n"
+" jz .L_invalid_literal_length_code\n"
+" movl $1, 116(%%rsp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_invalid_literal_length_code:\n"
+" movl $2, 116(%%rsp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_invalid_distance_code:\n"
+" movl $3, 116(%%rsp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_invalid_distance_too_far:\n"
+" movl $4, 116(%%rsp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_break_loop:\n"
+" movl $0, 116(%%rsp)\n"
+
+".L_break_loop_with_status:\n"
+/* put in, out, bits, and hold back into ar and pop esp */
+" movq %%rsi, 16(%%rsp)\n" /* in */
+" movq %%rdi, 32(%%rsp)\n" /* out */
+" movl %%ebx, 88(%%rsp)\n" /* bits */
+" movq %%rdx, 80(%%rsp)\n" /* hold */
+" movq (%%rsp), %%rax\n" /* restore rbp and rsp */
+" movq 8(%%rsp), %%rbp\n"
+" movq %%rax, %%rsp\n"
+ :
+ : "m" (ar)
+ : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi",
+ "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
+ );
+#elif ( defined( __GNUC__ ) || defined( __ICC ) ) && defined( __i386 )
+ __asm__ __volatile__ (
+" leal %0, %%eax\n"
+" movl %%esp, (%%eax)\n" /* save esp, ebp */
+" movl %%ebp, 4(%%eax)\n"
+" movl %%eax, %%esp\n"
+" movl 8(%%esp), %%esi\n" /* esi = in */
+" movl 16(%%esp), %%edi\n" /* edi = out */
+" movl 40(%%esp), %%edx\n" /* edx = hold */
+" movl 44(%%esp), %%ebx\n" /* ebx = bits */
+" movl 32(%%esp), %%ebp\n" /* ebp = lcode */
+
+" cld\n"
+" jmp .L_do_loop\n"
+
+".align 32,0x90\n"
+".L_while_test:\n"
+" cmpl %%edi, 24(%%esp)\n" /* out < end */
+" jbe .L_break_loop\n"
+" cmpl %%esi, 12(%%esp)\n" /* in < last */
+" jbe .L_break_loop\n"
+
+".L_do_loop:\n"
+" cmpb $15, %%bl\n"
+" ja .L_get_length_code\n" /* if (15 < bits) */
+
+" xorl %%eax, %%eax\n"
+" lodsw\n" /* al = *(ushort *)in++ */
+" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */
+" addb $16, %%bl\n" /* bits += 16 */
+" shll %%cl, %%eax\n"
+" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */
+
+".L_get_length_code:\n"
+" movl 56(%%esp), %%eax\n" /* eax = lmask */
+" andl %%edx, %%eax\n" /* eax &= hold */
+" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[hold & lmask] */
+
+".L_dolen:\n"
+" movb %%ah, %%cl\n" /* cl = this.bits */
+" subb %%ah, %%bl\n" /* bits -= this.bits */
+" shrl %%cl, %%edx\n" /* hold >>= this.bits */
+
+" testb %%al, %%al\n"
+" jnz .L_test_for_length_base\n" /* if (op != 0) 45.7% */
+
+" shrl $16, %%eax\n" /* output this.val char */
+" stosb\n"
+" jmp .L_while_test\n"
+
+".align 32,0x90\n"
+".L_test_for_length_base:\n"
+" movl %%eax, %%ecx\n" /* len = this */
+" shrl $16, %%ecx\n" /* len = this.val */
+" movl %%ecx, 64(%%esp)\n" /* save len */
+" movb %%al, %%cl\n"
+
+" testb $16, %%al\n"
+" jz .L_test_for_second_level_length\n" /* if ((op & 16) == 0) 8% */
+" andb $15, %%cl\n" /* op &= 15 */
+" jz .L_decode_distance\n" /* if (!op) */
+" cmpb %%cl, %%bl\n"
+" jae .L_add_bits_to_len\n" /* if (op <= bits) */
+
+" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */
+" xorl %%eax, %%eax\n"
+" lodsw\n" /* al = *(ushort *)in++ */
+" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */
+" addb $16, %%bl\n" /* bits += 16 */
+" shll %%cl, %%eax\n"
+" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */
+" movb %%ch, %%cl\n" /* move op back to ecx */
+
+".L_add_bits_to_len:\n"
+" subb %%cl, %%bl\n"
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n"
+" andl %%edx, %%eax\n" /* eax &= hold */
+" shrl %%cl, %%edx\n"
+" addl %%eax, 64(%%esp)\n" /* len += hold & mask[op] */
+
+".L_decode_distance:\n"
+" cmpb $15, %%bl\n"
+" ja .L_get_distance_code\n" /* if (15 < bits) */
+
+" xorl %%eax, %%eax\n"
+" lodsw\n" /* al = *(ushort *)in++ */
+" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */
+" addb $16, %%bl\n" /* bits += 16 */
+" shll %%cl, %%eax\n"
+" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */
+
+".L_get_distance_code:\n"
+" movl 60(%%esp), %%eax\n" /* eax = dmask */
+" movl 36(%%esp), %%ecx\n" /* ecx = dcode */
+" andl %%edx, %%eax\n" /* eax &= hold */
+" movl (%%ecx,%%eax,4), %%eax\n"/* eax = dcode[hold & dmask] */
+
+".L_dodist:\n"
+" movl %%eax, %%ebp\n" /* dist = this */
+" shrl $16, %%ebp\n" /* dist = this.val */
+" movb %%ah, %%cl\n"
+" subb %%ah, %%bl\n" /* bits -= this.bits */
+" shrl %%cl, %%edx\n" /* hold >>= this.bits */
+" movb %%al, %%cl\n" /* cl = this.op */
+
+" testb $16, %%al\n" /* if ((op & 16) == 0) */
+" jz .L_test_for_second_level_dist\n"
+" andb $15, %%cl\n" /* op &= 15 */
+" jz .L_check_dist_one\n"
+" cmpb %%cl, %%bl\n"
+" jae .L_add_bits_to_dist\n" /* if (op <= bits) 97.6% */
+
+" movb %%cl, %%ch\n" /* stash op in ch, freeing cl */
+" xorl %%eax, %%eax\n"
+" lodsw\n" /* al = *(ushort *)in++ */
+" movb %%bl, %%cl\n" /* cl = bits, needs it for shifting */
+" addb $16, %%bl\n" /* bits += 16 */
+" shll %%cl, %%eax\n"
+" orl %%eax, %%edx\n" /* hold |= *((ushort *)in)++ << bits */
+" movb %%ch, %%cl\n" /* move op back to ecx */
+
+".L_add_bits_to_dist:\n"
+" subb %%cl, %%bl\n"
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n" /* (1 << op) - 1 */
+" andl %%edx, %%eax\n" /* eax &= hold */
+" shrl %%cl, %%edx\n"
+" addl %%eax, %%ebp\n" /* dist += hold & ((1 << op) - 1) */
+
+".L_check_window:\n"
+" movl %%esi, 8(%%esp)\n" /* save in so from can use it's reg */
+" movl %%edi, %%eax\n"
+" subl 20(%%esp), %%eax\n" /* nbytes = out - beg */
+
+" cmpl %%ebp, %%eax\n"
+" jb .L_clip_window\n" /* if (dist > nbytes) 4.2% */
+
+" movl 64(%%esp), %%ecx\n" /* ecx = len */
+" movl %%edi, %%esi\n"
+" subl %%ebp, %%esi\n" /* from = out - dist */
+
+" sarl %%ecx\n"
+" jnc .L_copy_two\n" /* if len % 2 == 0 */
+
+" rep movsw\n"
+" movb (%%esi), %%al\n"
+" movb %%al, (%%edi)\n"
+" incl %%edi\n"
+
+" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */
+" movl 32(%%esp), %%ebp\n" /* ebp = lcode */
+" jmp .L_while_test\n"
+
+".L_copy_two:\n"
+" rep movsw\n"
+" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */
+" movl 32(%%esp), %%ebp\n" /* ebp = lcode */
+" jmp .L_while_test\n"
+
+".align 32,0x90\n"
+".L_check_dist_one:\n"
+" cmpl $1, %%ebp\n" /* if dist 1, is a memset */
+" jne .L_check_window\n"
+" cmpl %%edi, 20(%%esp)\n"
+" je .L_check_window\n" /* out == beg, if outside window */
+
+" movl 64(%%esp), %%ecx\n" /* ecx = len */
+" movb -1(%%edi), %%al\n"
+" movb %%al, %%ah\n"
+
+" sarl %%ecx\n"
+" jnc .L_set_two\n"
+" movb %%al, (%%edi)\n"
+" incl %%edi\n"
+
+".L_set_two:\n"
+" rep stosw\n"
+" movl 32(%%esp), %%ebp\n" /* ebp = lcode */
+" jmp .L_while_test\n"
+
+".align 32,0x90\n"
+".L_test_for_second_level_length:\n"
+" testb $64, %%al\n"
+" jnz .L_test_for_end_of_block\n" /* if ((op & 64) != 0) */
+
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n"
+" andl %%edx, %%eax\n" /* eax &= hold */
+" addl 64(%%esp), %%eax\n" /* eax += len */
+" movl (%%ebp,%%eax,4), %%eax\n" /* eax = lcode[val+(hold&mask[op])]*/
+" jmp .L_dolen\n"
+
+".align 32,0x90\n"
+".L_test_for_second_level_dist:\n"
+" testb $64, %%al\n"
+" jnz .L_invalid_distance_code\n" /* if ((op & 64) != 0) */
+
+" xorl %%eax, %%eax\n"
+" incl %%eax\n"
+" shll %%cl, %%eax\n"
+" decl %%eax\n"
+" andl %%edx, %%eax\n" /* eax &= hold */
+" addl %%ebp, %%eax\n" /* eax += dist */
+" movl 36(%%esp), %%ecx\n" /* ecx = dcode */
+" movl (%%ecx,%%eax,4), %%eax\n" /* eax = dcode[val+(hold&mask[op])]*/
+" jmp .L_dodist\n"
+
+".align 32,0x90\n"
+".L_clip_window:\n"
+" movl %%eax, %%ecx\n"
+" movl 48(%%esp), %%eax\n" /* eax = wsize */
+" negl %%ecx\n" /* nbytes = -nbytes */
+" movl 28(%%esp), %%esi\n" /* from = window */
+
+" cmpl %%ebp, %%eax\n"
+" jb .L_invalid_distance_too_far\n" /* if (dist > wsize) */
+
+" addl %%ebp, %%ecx\n" /* nbytes = dist - nbytes */
+" cmpl $0, 52(%%esp)\n"
+" jne .L_wrap_around_window\n" /* if (write != 0) */
+
+" subl %%ecx, %%eax\n"
+" addl %%eax, %%esi\n" /* from += wsize - nbytes */
+
+" movl 64(%%esp), %%eax\n" /* eax = len */
+" cmpl %%ecx, %%eax\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* len -= nbytes */
+" rep movsb\n"
+" movl %%edi, %%esi\n"
+" subl %%ebp, %%esi\n" /* from = out - dist */
+" jmp .L_do_copy\n"
+
+".align 32,0x90\n"
+".L_wrap_around_window:\n"
+" movl 52(%%esp), %%eax\n" /* eax = write */
+" cmpl %%eax, %%ecx\n"
+" jbe .L_contiguous_in_window\n" /* if (write >= nbytes) */
+
+" addl 48(%%esp), %%esi\n" /* from += wsize */
+" addl %%eax, %%esi\n" /* from += write */
+" subl %%ecx, %%esi\n" /* from -= nbytes */
+" subl %%eax, %%ecx\n" /* nbytes -= write */
+
+" movl 64(%%esp), %%eax\n" /* eax = len */
+" cmpl %%ecx, %%eax\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* len -= nbytes */
+" rep movsb\n"
+" movl 28(%%esp), %%esi\n" /* from = window */
+" movl 52(%%esp), %%ecx\n" /* nbytes = write */
+" cmpl %%ecx, %%eax\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* len -= nbytes */
+" rep movsb\n"
+" movl %%edi, %%esi\n"
+" subl %%ebp, %%esi\n" /* from = out - dist */
+" jmp .L_do_copy\n"
+
+".align 32,0x90\n"
+".L_contiguous_in_window:\n"
+" addl %%eax, %%esi\n"
+" subl %%ecx, %%esi\n" /* from += write - nbytes */
+
+" movl 64(%%esp), %%eax\n" /* eax = len */
+" cmpl %%ecx, %%eax\n"
+" jbe .L_do_copy\n" /* if (nbytes >= len) */
+
+" subl %%ecx, %%eax\n" /* len -= nbytes */
+" rep movsb\n"
+" movl %%edi, %%esi\n"
+" subl %%ebp, %%esi\n" /* from = out - dist */
+" jmp .L_do_copy\n" /* if (nbytes >= len) */
+
+".align 32,0x90\n"
+".L_do_copy:\n"
+" movl %%eax, %%ecx\n"
+" rep movsb\n"
+
+" movl 8(%%esp), %%esi\n" /* move in back to %esi, toss from */
+" movl 32(%%esp), %%ebp\n" /* ebp = lcode */
+" jmp .L_while_test\n"
+
+".L_test_for_end_of_block:\n"
+" testb $32, %%al\n"
+" jz .L_invalid_literal_length_code\n"
+" movl $1, 72(%%esp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_invalid_literal_length_code:\n"
+" movl $2, 72(%%esp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_invalid_distance_code:\n"
+" movl $3, 72(%%esp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_invalid_distance_too_far:\n"
+" movl 8(%%esp), %%esi\n"
+" movl $4, 72(%%esp)\n"
+" jmp .L_break_loop_with_status\n"
+
+".L_break_loop:\n"
+" movl $0, 72(%%esp)\n"
+
+".L_break_loop_with_status:\n"
+/* put in, out, bits, and hold back into ar and pop esp */
+" movl %%esi, 8(%%esp)\n" /* save in */
+" movl %%edi, 16(%%esp)\n" /* save out */
+" movl %%ebx, 44(%%esp)\n" /* save bits */
+" movl %%edx, 40(%%esp)\n" /* save hold */
+" movl 4(%%esp), %%ebp\n" /* restore esp, ebp */
+" movl (%%esp), %%esp\n"
+ :
+ : "m" (ar)
+ : "memory", "%eax", "%ebx", "%ecx", "%edx", "%esi", "%edi"
+ );
+#elif defined( _MSC_VER ) && ! defined( _M_AMD64 )
+ __asm {
+ lea eax, ar
+ mov [eax], esp /* save esp, ebp */
+ mov [eax+4], ebp
+ mov esp, eax
+ mov esi, [esp+8] /* esi = in */
+ mov edi, [esp+16] /* edi = out */
+ mov edx, [esp+40] /* edx = hold */
+ mov ebx, [esp+44] /* ebx = bits */
+ mov ebp, [esp+32] /* ebp = lcode */
+
+ cld
+ jmp L_do_loop
+
+ALIGN 4
+L_while_test:
+ cmp [esp+24], edi
+ jbe L_break_loop
+ cmp [esp+12], esi
+ jbe L_break_loop
+
+L_do_loop:
+ cmp bl, 15
+ ja L_get_length_code /* if (15 < bits) */
+
+ xor eax, eax
+ lodsw /* al = *(ushort *)in++ */
+ mov cl, bl /* cl = bits, needs it for shifting */
+ add bl, 16 /* bits += 16 */
+ shl eax, cl
+ or edx, eax /* hold |= *((ushort *)in)++ << bits */
+
+L_get_length_code:
+ mov eax, [esp+56] /* eax = lmask */
+ and eax, edx /* eax &= hold */
+ mov eax, [ebp+eax*4] /* eax = lcode[hold & lmask] */
+
+L_dolen:
+ mov cl, ah /* cl = this.bits */
+ sub bl, ah /* bits -= this.bits */
+ shr edx, cl /* hold >>= this.bits */
+
+ test al, al
+ jnz L_test_for_length_base /* if (op != 0) 45.7% */
+
+ shr eax, 16 /* output this.val char */
+ stosb
+ jmp L_while_test
+
+ALIGN 4
+L_test_for_length_base:
+ mov ecx, eax /* len = this */
+ shr ecx, 16 /* len = this.val */
+ mov [esp+64], ecx /* save len */
+ mov cl, al
+
+ test al, 16
+ jz L_test_for_second_level_length /* if ((op & 16) == 0) 8% */
+ and cl, 15 /* op &= 15 */
+ jz L_decode_distance /* if (!op) */
+ cmp bl, cl
+ jae L_add_bits_to_len /* if (op <= bits) */
+
+ mov ch, cl /* stash op in ch, freeing cl */
+ xor eax, eax
+ lodsw /* al = *(ushort *)in++ */
+ mov cl, bl /* cl = bits, needs it for shifting */
+ add bl, 16 /* bits += 16 */
+ shl eax, cl
+ or edx, eax /* hold |= *((ushort *)in)++ << bits */
+ mov cl, ch /* move op back to ecx */
+
+L_add_bits_to_len:
+ sub bl, cl
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax
+ and eax, edx /* eax &= hold */
+ shr edx, cl
+ add [esp+64], eax /* len += hold & mask[op] */
+
+L_decode_distance:
+ cmp bl, 15
+ ja L_get_distance_code /* if (15 < bits) */
+
+ xor eax, eax
+ lodsw /* al = *(ushort *)in++ */
+ mov cl, bl /* cl = bits, needs it for shifting */
+ add bl, 16 /* bits += 16 */
+ shl eax, cl
+ or edx, eax /* hold |= *((ushort *)in)++ << bits */
+
+L_get_distance_code:
+ mov eax, [esp+60] /* eax = dmask */
+ mov ecx, [esp+36] /* ecx = dcode */
+ and eax, edx /* eax &= hold */
+ mov eax, [ecx+eax*4]/* eax = dcode[hold & dmask] */
+
+L_dodist:
+ mov ebp, eax /* dist = this */
+ shr ebp, 16 /* dist = this.val */
+ mov cl, ah
+ sub bl, ah /* bits -= this.bits */
+ shr edx, cl /* hold >>= this.bits */
+ mov cl, al /* cl = this.op */
+
+ test al, 16 /* if ((op & 16) == 0) */
+ jz L_test_for_second_level_dist
+ and cl, 15 /* op &= 15 */
+ jz L_check_dist_one
+ cmp bl, cl
+ jae L_add_bits_to_dist /* if (op <= bits) 97.6% */
+
+ mov ch, cl /* stash op in ch, freeing cl */
+ xor eax, eax
+ lodsw /* al = *(ushort *)in++ */
+ mov cl, bl /* cl = bits, needs it for shifting */
+ add bl, 16 /* bits += 16 */
+ shl eax, cl
+ or edx, eax /* hold |= *((ushort *)in)++ << bits */
+ mov cl, ch /* move op back to ecx */
+
+L_add_bits_to_dist:
+ sub bl, cl
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax /* (1 << op) - 1 */
+ and eax, edx /* eax &= hold */
+ shr edx, cl
+ add ebp, eax /* dist += hold & ((1 << op) - 1) */
+
+L_check_window:
+ mov [esp+8], esi /* save in so from can use it's reg */
+ mov eax, edi
+ sub eax, [esp+20] /* nbytes = out - beg */
+
+ cmp eax, ebp
+ jb L_clip_window /* if (dist > nbytes) 4.2% */
+
+ mov ecx, [esp+64] /* ecx = len */
+ mov esi, edi
+ sub esi, ebp /* from = out - dist */
+
+ sar ecx, 1
+ jnc L_copy_two
+
+ rep movsw
+ mov al, [esi]
+ mov [edi], al
+ inc edi
+
+ mov esi, [esp+8] /* move in back to %esi, toss from */
+ mov ebp, [esp+32] /* ebp = lcode */
+ jmp L_while_test
+
+L_copy_two:
+ rep movsw
+ mov esi, [esp+8] /* move in back to %esi, toss from */
+ mov ebp, [esp+32] /* ebp = lcode */
+ jmp L_while_test
+
+ALIGN 4
+L_check_dist_one:
+ cmp ebp, 1 /* if dist 1, is a memset */
+ jne L_check_window
+ cmp [esp+20], edi
+ je L_check_window /* out == beg, if outside window */
+
+ mov ecx, [esp+64] /* ecx = len */
+ mov al, [edi-1]
+ mov ah, al
+
+ sar ecx, 1
+ jnc L_set_two
+ mov [edi], al /* memset out with from[-1] */
+ inc edi
+
+L_set_two:
+ rep stosw
+ mov ebp, [esp+32] /* ebp = lcode */
+ jmp L_while_test
+
+ALIGN 4
+L_test_for_second_level_length:
+ test al, 64
+ jnz L_test_for_end_of_block /* if ((op & 64) != 0) */
+
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax
+ and eax, edx /* eax &= hold */
+ add eax, [esp+64] /* eax += len */
+ mov eax, [ebp+eax*4] /* eax = lcode[val+(hold&mask[op])]*/
+ jmp L_dolen
+
+ALIGN 4
+L_test_for_second_level_dist:
+ test al, 64
+ jnz L_invalid_distance_code /* if ((op & 64) != 0) */
+
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax
+ and eax, edx /* eax &= hold */
+ add eax, ebp /* eax += dist */
+ mov ecx, [esp+36] /* ecx = dcode */
+ mov eax, [ecx+eax*4] /* eax = dcode[val+(hold&mask[op])]*/
+ jmp L_dodist
+
+ALIGN 4
+L_clip_window:
+ mov ecx, eax
+ mov eax, [esp+48] /* eax = wsize */
+ neg ecx /* nbytes = -nbytes */
+ mov esi, [esp+28] /* from = window */
+
+ cmp eax, ebp
+ jb L_invalid_distance_too_far /* if (dist > wsize) */
+
+ add ecx, ebp /* nbytes = dist - nbytes */
+ cmp dword ptr [esp+52], 0
+ jne L_wrap_around_window /* if (write != 0) */
+
+ sub eax, ecx
+ add esi, eax /* from += wsize - nbytes */
+
+ mov eax, [esp+64] /* eax = len */
+ cmp eax, ecx
+ jbe L_do_copy /* if (nbytes >= len) */
+
+ sub eax, ecx /* len -= nbytes */
+ rep movsb
+ mov esi, edi
+ sub esi, ebp /* from = out - dist */
+ jmp L_do_copy
+
+ALIGN 4
+L_wrap_around_window:
+ mov eax, [esp+52] /* eax = write */
+ cmp ecx, eax
+ jbe L_contiguous_in_window /* if (write >= nbytes) */
+
+ add esi, [esp+48] /* from += wsize */
+ add esi, eax /* from += write */
+ sub esi, ecx /* from -= nbytes */
+ sub ecx, eax /* nbytes -= write */
+
+ mov eax, [esp+64] /* eax = len */
+ cmp eax, ecx
+ jbe L_do_copy /* if (nbytes >= len) */
+
+ sub eax, ecx /* len -= nbytes */
+ rep movsb
+ mov esi, [esp+28] /* from = window */
+ mov ecx, [esp+52] /* nbytes = write */
+ cmp eax, ecx
+ jbe L_do_copy /* if (nbytes >= len) */
+
+ sub eax, ecx /* len -= nbytes */
+ rep movsb
+ mov esi, edi
+ sub esi, ebp /* from = out - dist */
+ jmp L_do_copy
+
+ALIGN 4
+L_contiguous_in_window:
+ add esi, eax
+ sub esi, ecx /* from += write - nbytes */
+
+ mov eax, [esp+64] /* eax = len */
+ cmp eax, ecx
+ jbe L_do_copy /* if (nbytes >= len) */
+
+ sub eax, ecx /* len -= nbytes */
+ rep movsb
+ mov esi, edi
+ sub esi, ebp /* from = out - dist */
+ jmp L_do_copy
+
+ALIGN 4
+L_do_copy:
+ mov ecx, eax
+ rep movsb
+
+ mov esi, [esp+8] /* move in back to %esi, toss from */
+ mov ebp, [esp+32] /* ebp = lcode */
+ jmp L_while_test
+
+L_test_for_end_of_block:
+ test al, 32
+ jz L_invalid_literal_length_code
+ mov dword ptr [esp+72], 1
+ jmp L_break_loop_with_status
+
+L_invalid_literal_length_code:
+ mov dword ptr [esp+72], 2
+ jmp L_break_loop_with_status
+
+L_invalid_distance_code:
+ mov dword ptr [esp+72], 3
+ jmp L_break_loop_with_status
+
+L_invalid_distance_too_far:
+ mov esi, [esp+4]
+ mov dword ptr [esp+72], 4
+ jmp L_break_loop_with_status
+
+L_break_loop:
+ mov dword ptr [esp+72], 0
+
+L_break_loop_with_status:
+/* put in, out, bits, and hold back into ar and pop esp */
+ mov [esp+8], esi /* save in */
+ mov [esp+16], edi /* save out */
+ mov [esp+44], ebx /* save bits */
+ mov [esp+40], edx /* save hold */
+ mov ebp, [esp+4] /* restore esp, ebp */
+ mov esp, [esp]
+ }
+#else
+#error "x86 architecture not defined"
+#endif
+
+ if (ar.status > 1) {
+ if (ar.status == 2)
+ strm->msg = "invalid literal/length code";
+ else if (ar.status == 3)
+ strm->msg = "invalid distance code";
+ else
+ strm->msg = "invalid distance too far back";
+ state->mode = BAD;
+ }
+ else if ( ar.status == 1 ) {
+ state->mode = TYPE;
+ }
+
+ /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+ ar.len = ar.bits >> 3;
+ ar.in -= ar.len;
+ ar.bits -= ar.len << 3;
+ ar.hold &= (1U << ar.bits) - 1;
+
+ /* update state and return */
+ strm->next_in = ar.in;
+ strm->next_out = ar.out;
+ strm->avail_in = (unsigned)(ar.in < ar.last ?
+ PAD_AVAIL_IN + (ar.last - ar.in) :
+ PAD_AVAIL_IN - (ar.in - ar.last));
+ strm->avail_out = (unsigned)(ar.out < ar.end ?
+ PAD_AVAIL_OUT + (ar.end - ar.out) :
+ PAD_AVAIL_OUT - (ar.out - ar.end));
+ state->hold = ar.hold;
+ state->bits = ar.bits;
+ return;
+}
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffast.S b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffast.S
new file mode 100644
index 000000000..2245a2905
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/inflate86/inffast.S
@@ -0,0 +1,1368 @@
+/*
+ * inffast.S is a hand tuned assembler version of:
+ *
+ * inffast.c -- fast decoding
+ * Copyright (C) 1995-2003 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Copyright (C) 2003 Chris Anderson <christop@charm.net>
+ * Please use the copyright conditions above.
+ *
+ * This version (Jan-23-2003) of inflate_fast was coded and tested under
+ * GNU/Linux on a pentium 3, using the gcc-3.2 compiler distribution. On that
+ * machine, I found that gzip style archives decompressed about 20% faster than
+ * the gcc-3.2 -O3 -fomit-frame-pointer compiled version. Your results will
+ * depend on how large of a buffer is used for z_stream.next_in & next_out
+ * (8K-32K worked best for my 256K cpu cache) and how much overhead there is in
+ * stream processing I/O and crc32/addler32. In my case, this routine used
+ * 70% of the cpu time and crc32 used 20%.
+ *
+ * I am confident that this version will work in the general case, but I have
+ * not tested a wide variety of datasets or a wide variety of platforms.
+ *
+ * Jan-24-2003 -- Added -DUSE_MMX define for slightly faster inflating.
+ * It should be a runtime flag instead of compile time flag...
+ *
+ * Jan-26-2003 -- Added runtime check for MMX support with cpuid instruction.
+ * With -DUSE_MMX, only MMX code is compiled. With -DNO_MMX, only non-MMX code
+ * is compiled. Without either option, runtime detection is enabled. Runtime
+ * detection should work on all modern cpus and the recomended algorithm (flip
+ * ID bit on eflags and then use the cpuid instruction) is used in many
+ * multimedia applications. Tested under win2k with gcc-2.95 and gas-2.12
+ * distributed with cygwin3. Compiling with gcc-2.95 -c inffast.S -o
+ * inffast.obj generates a COFF object which can then be linked with MSVC++
+ * compiled code. Tested under FreeBSD 4.7 with gcc-2.95.
+ *
+ * Jan-28-2003 -- Tested Athlon XP... MMX mode is slower than no MMX (and
+ * slower than compiler generated code). Adjusted cpuid check to use the MMX
+ * code only for Pentiums < P4 until I have more data on the P4. Speed
+ * improvment is only about 15% on the Athlon when compared with code generated
+ * with MSVC++. Not sure yet, but I think the P4 will also be slower using the
+ * MMX mode because many of it's x86 ALU instructions execute in .5 cycles and
+ * have less latency than MMX ops. Added code to buffer the last 11 bytes of
+ * the input stream since the MMX code grabs bits in chunks of 32, which
+ * differs from the inffast.c algorithm. I don't think there would have been
+ * read overruns where a page boundary was crossed (a segfault), but there
+ * could have been overruns when next_in ends on unaligned memory (unintialized
+ * memory read).
+ *
+ * Mar-13-2003 -- P4 MMX is slightly slower than P4 NO_MMX. I created a C
+ * version of the non-MMX code so that it doesn't depend on zstrm and zstate
+ * structure offsets which are hard coded in this file. This was last tested
+ * with zlib-1.2.0 which is currently in beta testing, newer versions of this
+ * and inffas86.c can be found at http://www.eetbeetee.com/zlib/ and
+ * http://www.charm.net/~christop/zlib/
+ */
+
+
+/*
+ * if you have underscore linking problems (_inflate_fast undefined), try
+ * using -DGAS_COFF
+ */
+#if ! defined( GAS_COFF ) && ! defined( GAS_ELF )
+
+#if defined( WIN32 ) || defined( __CYGWIN__ )
+#define GAS_COFF /* windows object format */
+#else
+#define GAS_ELF
+#endif
+
+#endif /* ! GAS_COFF && ! GAS_ELF */
+
+
+#if defined( GAS_COFF )
+
+/* coff externals have underscores */
+#define inflate_fast _inflate_fast
+#define inflate_fast_use_mmx _inflate_fast_use_mmx
+
+#endif /* GAS_COFF */
+
+
+.file "inffast.S"
+
+.globl inflate_fast
+
+.text
+.align 4,0
+.L_invalid_literal_length_code_msg:
+.string "invalid literal/length code"
+
+.align 4,0
+.L_invalid_distance_code_msg:
+.string "invalid distance code"
+
+.align 4,0
+.L_invalid_distance_too_far_msg:
+.string "invalid distance too far back"
+
+#if ! defined( NO_MMX )
+.align 4,0
+.L_mask: /* mask[N] = ( 1 << N ) - 1 */
+.long 0
+.long 1
+.long 3
+.long 7
+.long 15
+.long 31
+.long 63
+.long 127
+.long 255
+.long 511
+.long 1023
+.long 2047
+.long 4095
+.long 8191
+.long 16383
+.long 32767
+.long 65535
+.long 131071
+.long 262143
+.long 524287
+.long 1048575
+.long 2097151
+.long 4194303
+.long 8388607
+.long 16777215
+.long 33554431
+.long 67108863
+.long 134217727
+.long 268435455
+.long 536870911
+.long 1073741823
+.long 2147483647
+.long 4294967295
+#endif /* NO_MMX */
+
+.text
+
+/*
+ * struct z_stream offsets, in zlib.h
+ */
+#define next_in_strm 0 /* strm->next_in */
+#define avail_in_strm 4 /* strm->avail_in */
+#define next_out_strm 12 /* strm->next_out */
+#define avail_out_strm 16 /* strm->avail_out */
+#define msg_strm 24 /* strm->msg */
+#define state_strm 28 /* strm->state */
+
+/*
+ * struct inflate_state offsets, in inflate.h
+ */
+#define mode_state 0 /* state->mode */
+#define wsize_state 32 /* state->wsize */
+#define write_state 40 /* state->write */
+#define window_state 44 /* state->window */
+#define hold_state 48 /* state->hold */
+#define bits_state 52 /* state->bits */
+#define lencode_state 68 /* state->lencode */
+#define distcode_state 72 /* state->distcode */
+#define lenbits_state 76 /* state->lenbits */
+#define distbits_state 80 /* state->distbits */
+
+/*
+ * inflate_fast's activation record
+ */
+#define local_var_size 64 /* how much local space for vars */
+#define strm_sp 88 /* first arg: z_stream * (local_var_size + 24) */
+#define start_sp 92 /* second arg: unsigned int (local_var_size + 28) */
+
+/*
+ * offsets for local vars on stack
+ */
+#define out 60 /* unsigned char* */
+#define window 56 /* unsigned char* */
+#define wsize 52 /* unsigned int */
+#define write 48 /* unsigned int */
+#define in 44 /* unsigned char* */
+#define beg 40 /* unsigned char* */
+#define buf 28 /* char[ 12 ] */
+#define len 24 /* unsigned int */
+#define last 20 /* unsigned char* */
+#define end 16 /* unsigned char* */
+#define dcode 12 /* code* */
+#define lcode 8 /* code* */
+#define dmask 4 /* unsigned int */
+#define lmask 0 /* unsigned int */
+
+/*
+ * typedef enum inflate_mode consts, in inflate.h
+ */
+#define INFLATE_MODE_TYPE 11 /* state->mode flags enum-ed in inflate.h */
+#define INFLATE_MODE_BAD 26
+
+
+#if ! defined( USE_MMX ) && ! defined( NO_MMX )
+
+#define RUN_TIME_MMX
+
+#define CHECK_MMX 1
+#define DO_USE_MMX 2
+#define DONT_USE_MMX 3
+
+.globl inflate_fast_use_mmx
+
+.data
+
+.align 4,0
+inflate_fast_use_mmx: /* integer flag for run time control 1=check,2=mmx,3=no */
+.long CHECK_MMX
+
+#if defined( GAS_ELF )
+/* elf info */
+.type inflate_fast_use_mmx,@object
+.size inflate_fast_use_mmx,4
+#endif
+
+#endif /* RUN_TIME_MMX */
+
+#if defined( GAS_COFF )
+/* coff info: scl 2 = extern, type 32 = function */
+.def inflate_fast; .scl 2; .type 32; .endef
+#endif
+
+.text
+
+.align 32,0x90
+inflate_fast:
+ pushl %edi
+ pushl %esi
+ pushl %ebp
+ pushl %ebx
+ pushf /* save eflags (strm_sp, state_sp assumes this is 32 bits) */
+ subl $local_var_size, %esp
+ cld
+
+#define strm_r %esi
+#define state_r %edi
+
+ movl strm_sp(%esp), strm_r
+ movl state_strm(strm_r), state_r
+
+ /* in = strm->next_in;
+ * out = strm->next_out;
+ * last = in + strm->avail_in - 11;
+ * beg = out - (start - strm->avail_out);
+ * end = out + (strm->avail_out - 257);
+ */
+ movl avail_in_strm(strm_r), %edx
+ movl next_in_strm(strm_r), %eax
+
+ addl %eax, %edx /* avail_in += next_in */
+ subl $11, %edx /* avail_in -= 11 */
+
+ movl %eax, in(%esp)
+ movl %edx, last(%esp)
+
+ movl start_sp(%esp), %ebp
+ movl avail_out_strm(strm_r), %ecx
+ movl next_out_strm(strm_r), %ebx
+
+ subl %ecx, %ebp /* start -= avail_out */
+ negl %ebp /* start = -start */
+ addl %ebx, %ebp /* start += next_out */
+
+ subl $257, %ecx /* avail_out -= 257 */
+ addl %ebx, %ecx /* avail_out += out */
+
+ movl %ebx, out(%esp)
+ movl %ebp, beg(%esp)
+ movl %ecx, end(%esp)
+
+ /* wsize = state->wsize;
+ * write = state->write;
+ * window = state->window;
+ * hold = state->hold;
+ * bits = state->bits;
+ * lcode = state->lencode;
+ * dcode = state->distcode;
+ * lmask = ( 1 << state->lenbits ) - 1;
+ * dmask = ( 1 << state->distbits ) - 1;
+ */
+
+ movl lencode_state(state_r), %eax
+ movl distcode_state(state_r), %ecx
+
+ movl %eax, lcode(%esp)
+ movl %ecx, dcode(%esp)
+
+ movl $1, %eax
+ movl lenbits_state(state_r), %ecx
+ shll %cl, %eax
+ decl %eax
+ movl %eax, lmask(%esp)
+
+ movl $1, %eax
+ movl distbits_state(state_r), %ecx
+ shll %cl, %eax
+ decl %eax
+ movl %eax, dmask(%esp)
+
+ movl wsize_state(state_r), %eax
+ movl write_state(state_r), %ecx
+ movl window_state(state_r), %edx
+
+ movl %eax, wsize(%esp)
+ movl %ecx, write(%esp)
+ movl %edx, window(%esp)
+
+ movl hold_state(state_r), %ebp
+ movl bits_state(state_r), %ebx
+
+#undef strm_r
+#undef state_r
+
+#define in_r %esi
+#define from_r %esi
+#define out_r %edi
+
+ movl in(%esp), in_r
+ movl last(%esp), %ecx
+ cmpl in_r, %ecx
+ ja .L_align_long /* if in < last */
+
+ addl $11, %ecx /* ecx = &in[ avail_in ] */
+ subl in_r, %ecx /* ecx = avail_in */
+ movl $12, %eax
+ subl %ecx, %eax /* eax = 12 - avail_in */
+ leal buf(%esp), %edi
+ rep movsb /* memcpy( buf, in, avail_in ) */
+ movl %eax, %ecx
+ xorl %eax, %eax
+ rep stosb /* memset( &buf[ avail_in ], 0, 12 - avail_in ) */
+ leal buf(%esp), in_r /* in = buf */
+ movl in_r, last(%esp) /* last = in, do just one iteration */
+ jmp .L_is_aligned
+
+ /* align in_r on long boundary */
+.L_align_long:
+ testl $3, in_r
+ jz .L_is_aligned
+ xorl %eax, %eax
+ movb (in_r), %al
+ incl in_r
+ movl %ebx, %ecx
+ addl $8, %ebx
+ shll %cl, %eax
+ orl %eax, %ebp
+ jmp .L_align_long
+
+.L_is_aligned:
+ movl out(%esp), out_r
+
+#if defined( NO_MMX )
+ jmp .L_do_loop
+#endif
+
+#if defined( USE_MMX )
+ jmp .L_init_mmx
+#endif
+
+/*** Runtime MMX check ***/
+
+#if defined( RUN_TIME_MMX )
+.L_check_mmx:
+ cmpl $DO_USE_MMX, inflate_fast_use_mmx
+ je .L_init_mmx
+ ja .L_do_loop /* > 2 */
+
+ pushl %eax
+ pushl %ebx
+ pushl %ecx
+ pushl %edx
+ pushf
+ movl (%esp), %eax /* copy eflags to eax */
+ xorl $0x200000, (%esp) /* try toggling ID bit of eflags (bit 21)
+ * to see if cpu supports cpuid...
+ * ID bit method not supported by NexGen but
+ * bios may load a cpuid instruction and
+ * cpuid may be disabled on Cyrix 5-6x86 */
+ popf
+ pushf
+ popl %edx /* copy new eflags to edx */
+ xorl %eax, %edx /* test if ID bit is flipped */
+ jz .L_dont_use_mmx /* not flipped if zero */
+ xorl %eax, %eax
+ cpuid
+ cmpl $0x756e6547, %ebx /* check for GenuineIntel in ebx,ecx,edx */
+ jne .L_dont_use_mmx
+ cmpl $0x6c65746e, %ecx
+ jne .L_dont_use_mmx
+ cmpl $0x49656e69, %edx
+ jne .L_dont_use_mmx
+ movl $1, %eax
+ cpuid /* get cpu features */
+ shrl $8, %eax
+ andl $15, %eax
+ cmpl $6, %eax /* check for Pentium family, is 0xf for P4 */
+ jne .L_dont_use_mmx
+ testl $0x800000, %edx /* test if MMX feature is set (bit 23) */
+ jnz .L_use_mmx
+ jmp .L_dont_use_mmx
+.L_use_mmx:
+ movl $DO_USE_MMX, inflate_fast_use_mmx
+ jmp .L_check_mmx_pop
+.L_dont_use_mmx:
+ movl $DONT_USE_MMX, inflate_fast_use_mmx
+.L_check_mmx_pop:
+ popl %edx
+ popl %ecx
+ popl %ebx
+ popl %eax
+ jmp .L_check_mmx
+#endif
+
+
+/*** Non-MMX code ***/
+
+#if defined ( NO_MMX ) || defined( RUN_TIME_MMX )
+
+#define hold_r %ebp
+#define bits_r %bl
+#define bitslong_r %ebx
+
+.align 32,0x90
+.L_while_test:
+ /* while (in < last && out < end)
+ */
+ cmpl out_r, end(%esp)
+ jbe .L_break_loop /* if (out >= end) */
+
+ cmpl in_r, last(%esp)
+ jbe .L_break_loop
+
+.L_do_loop:
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out
+ *
+ * do {
+ * if (bits < 15) {
+ * hold |= *((unsigned short *)in)++ << bits;
+ * bits += 16
+ * }
+ * this = lcode[hold & lmask]
+ */
+ cmpb $15, bits_r
+ ja .L_get_length_code /* if (15 < bits) */
+
+ xorl %eax, %eax
+ lodsw /* al = *(ushort *)in++ */
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
+ addb $16, bits_r /* bits += 16 */
+ shll %cl, %eax
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
+
+.L_get_length_code:
+ movl lmask(%esp), %edx /* edx = lmask */
+ movl lcode(%esp), %ecx /* ecx = lcode */
+ andl hold_r, %edx /* edx &= hold */
+ movl (%ecx,%edx,4), %eax /* eax = lcode[hold & lmask] */
+
+.L_dolen:
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out
+ *
+ * dolen:
+ * bits -= this.bits;
+ * hold >>= this.bits
+ */
+ movb %ah, %cl /* cl = this.bits */
+ subb %ah, bits_r /* bits -= this.bits */
+ shrl %cl, hold_r /* hold >>= this.bits */
+
+ /* check if op is a literal
+ * if (op == 0) {
+ * PUP(out) = this.val;
+ * }
+ */
+ testb %al, %al
+ jnz .L_test_for_length_base /* if (op != 0) 45.7% */
+
+ shrl $16, %eax /* output this.val char */
+ stosb
+ jmp .L_while_test
+
+.L_test_for_length_base:
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = len
+ *
+ * else if (op & 16) {
+ * len = this.val
+ * op &= 15
+ * if (op) {
+ * if (op > bits) {
+ * hold |= *((unsigned short *)in)++ << bits;
+ * bits += 16
+ * }
+ * len += hold & mask[op];
+ * bits -= op;
+ * hold >>= op;
+ * }
+ */
+#define len_r %edx
+ movl %eax, len_r /* len = this */
+ shrl $16, len_r /* len = this.val */
+ movb %al, %cl
+
+ testb $16, %al
+ jz .L_test_for_second_level_length /* if ((op & 16) == 0) 8% */
+ andb $15, %cl /* op &= 15 */
+ jz .L_save_len /* if (!op) */
+ cmpb %cl, bits_r
+ jae .L_add_bits_to_len /* if (op <= bits) */
+
+ movb %cl, %ch /* stash op in ch, freeing cl */
+ xorl %eax, %eax
+ lodsw /* al = *(ushort *)in++ */
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
+ addb $16, bits_r /* bits += 16 */
+ shll %cl, %eax
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
+ movb %ch, %cl /* move op back to ecx */
+
+.L_add_bits_to_len:
+ movl $1, %eax
+ shll %cl, %eax
+ decl %eax
+ subb %cl, bits_r
+ andl hold_r, %eax /* eax &= hold */
+ shrl %cl, hold_r
+ addl %eax, len_r /* len += hold & mask[op] */
+
+.L_save_len:
+ movl len_r, len(%esp) /* save len */
+#undef len_r
+
+.L_decode_distance:
+ /* regs: %esi = in, %ebp = hold, %bl = bits, %edi = out, %edx = dist
+ *
+ * if (bits < 15) {
+ * hold |= *((unsigned short *)in)++ << bits;
+ * bits += 16
+ * }
+ * this = dcode[hold & dmask];
+ * dodist:
+ * bits -= this.bits;
+ * hold >>= this.bits;
+ * op = this.op;
+ */
+
+ cmpb $15, bits_r
+ ja .L_get_distance_code /* if (15 < bits) */
+
+ xorl %eax, %eax
+ lodsw /* al = *(ushort *)in++ */
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
+ addb $16, bits_r /* bits += 16 */
+ shll %cl, %eax
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
+
+.L_get_distance_code:
+ movl dmask(%esp), %edx /* edx = dmask */
+ movl dcode(%esp), %ecx /* ecx = dcode */
+ andl hold_r, %edx /* edx &= hold */
+ movl (%ecx,%edx,4), %eax /* eax = dcode[hold & dmask] */
+
+#define dist_r %edx
+.L_dodist:
+ movl %eax, dist_r /* dist = this */
+ shrl $16, dist_r /* dist = this.val */
+ movb %ah, %cl
+ subb %ah, bits_r /* bits -= this.bits */
+ shrl %cl, hold_r /* hold >>= this.bits */
+
+ /* if (op & 16) {
+ * dist = this.val
+ * op &= 15
+ * if (op > bits) {
+ * hold |= *((unsigned short *)in)++ << bits;
+ * bits += 16
+ * }
+ * dist += hold & mask[op];
+ * bits -= op;
+ * hold >>= op;
+ */
+ movb %al, %cl /* cl = this.op */
+
+ testb $16, %al /* if ((op & 16) == 0) */
+ jz .L_test_for_second_level_dist
+ andb $15, %cl /* op &= 15 */
+ jz .L_check_dist_one
+ cmpb %cl, bits_r
+ jae .L_add_bits_to_dist /* if (op <= bits) 97.6% */
+
+ movb %cl, %ch /* stash op in ch, freeing cl */
+ xorl %eax, %eax
+ lodsw /* al = *(ushort *)in++ */
+ movb bits_r, %cl /* cl = bits, needs it for shifting */
+ addb $16, bits_r /* bits += 16 */
+ shll %cl, %eax
+ orl %eax, hold_r /* hold |= *((ushort *)in)++ << bits */
+ movb %ch, %cl /* move op back to ecx */
+
+.L_add_bits_to_dist:
+ movl $1, %eax
+ shll %cl, %eax
+ decl %eax /* (1 << op) - 1 */
+ subb %cl, bits_r
+ andl hold_r, %eax /* eax &= hold */
+ shrl %cl, hold_r
+ addl %eax, dist_r /* dist += hold & ((1 << op) - 1) */
+ jmp .L_check_window
+
+.L_check_window:
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
+ * %ecx = nbytes
+ *
+ * nbytes = out - beg;
+ * if (dist <= nbytes) {
+ * from = out - dist;
+ * do {
+ * PUP(out) = PUP(from);
+ * } while (--len > 0) {
+ * }
+ */
+
+ movl in_r, in(%esp) /* save in so from can use it's reg */
+ movl out_r, %eax
+ subl beg(%esp), %eax /* nbytes = out - beg */
+
+ cmpl dist_r, %eax
+ jb .L_clip_window /* if (dist > nbytes) 4.2% */
+
+ movl len(%esp), %ecx
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+
+ subl $3, %ecx
+ movb (from_r), %al
+ movb %al, (out_r)
+ movb 1(from_r), %al
+ movb 2(from_r), %dl
+ addl $3, from_r
+ movb %al, 1(out_r)
+ movb %dl, 2(out_r)
+ addl $3, out_r
+ rep movsb
+
+ movl in(%esp), in_r /* move in back to %esi, toss from */
+ jmp .L_while_test
+
+.align 16,0x90
+.L_check_dist_one:
+ cmpl $1, dist_r
+ jne .L_check_window
+ cmpl out_r, beg(%esp)
+ je .L_check_window
+
+ decl out_r
+ movl len(%esp), %ecx
+ movb (out_r), %al
+ subl $3, %ecx
+
+ movb %al, 1(out_r)
+ movb %al, 2(out_r)
+ movb %al, 3(out_r)
+ addl $4, out_r
+ rep stosb
+
+ jmp .L_while_test
+
+.align 16,0x90
+.L_test_for_second_level_length:
+ /* else if ((op & 64) == 0) {
+ * this = lcode[this.val + (hold & mask[op])];
+ * }
+ */
+ testb $64, %al
+ jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */
+
+ movl $1, %eax
+ shll %cl, %eax
+ decl %eax
+ andl hold_r, %eax /* eax &= hold */
+ addl %edx, %eax /* eax += this.val */
+ movl lcode(%esp), %edx /* edx = lcode */
+ movl (%edx,%eax,4), %eax /* eax = lcode[val + (hold&mask[op])] */
+ jmp .L_dolen
+
+.align 16,0x90
+.L_test_for_second_level_dist:
+ /* else if ((op & 64) == 0) {
+ * this = dcode[this.val + (hold & mask[op])];
+ * }
+ */
+ testb $64, %al
+ jnz .L_invalid_distance_code /* if ((op & 64) != 0) */
+
+ movl $1, %eax
+ shll %cl, %eax
+ decl %eax
+ andl hold_r, %eax /* eax &= hold */
+ addl %edx, %eax /* eax += this.val */
+ movl dcode(%esp), %edx /* edx = dcode */
+ movl (%edx,%eax,4), %eax /* eax = dcode[val + (hold&mask[op])] */
+ jmp .L_dodist
+
+.align 16,0x90
+.L_clip_window:
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
+ * %ecx = nbytes
+ *
+ * else {
+ * if (dist > wsize) {
+ * invalid distance
+ * }
+ * from = window;
+ * nbytes = dist - nbytes;
+ * if (write == 0) {
+ * from += wsize - nbytes;
+ */
+#define nbytes_r %ecx
+ movl %eax, nbytes_r
+ movl wsize(%esp), %eax /* prepare for dist compare */
+ negl nbytes_r /* nbytes = -nbytes */
+ movl window(%esp), from_r /* from = window */
+
+ cmpl dist_r, %eax
+ jb .L_invalid_distance_too_far /* if (dist > wsize) */
+
+ addl dist_r, nbytes_r /* nbytes = dist - nbytes */
+ cmpl $0, write(%esp)
+ jne .L_wrap_around_window /* if (write != 0) */
+
+ subl nbytes_r, %eax
+ addl %eax, from_r /* from += wsize - nbytes */
+
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
+ * %ecx = nbytes, %eax = len
+ *
+ * if (nbytes < len) {
+ * len -= nbytes;
+ * do {
+ * PUP(out) = PUP(from);
+ * } while (--nbytes);
+ * from = out - dist;
+ * }
+ * }
+ */
+#define len_r %eax
+ movl len(%esp), len_r
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1 /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+ jmp .L_do_copy1
+
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1 /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+ jmp .L_do_copy1
+
+.L_wrap_around_window:
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
+ * %ecx = nbytes, %eax = write, %eax = len
+ *
+ * else if (write < nbytes) {
+ * from += wsize + write - nbytes;
+ * nbytes -= write;
+ * if (nbytes < len) {
+ * len -= nbytes;
+ * do {
+ * PUP(out) = PUP(from);
+ * } while (--nbytes);
+ * from = window;
+ * nbytes = write;
+ * if (nbytes < len) {
+ * len -= nbytes;
+ * do {
+ * PUP(out) = PUP(from);
+ * } while(--nbytes);
+ * from = out - dist;
+ * }
+ * }
+ * }
+ */
+#define write_r %eax
+ movl write(%esp), write_r
+ cmpl write_r, nbytes_r
+ jbe .L_contiguous_in_window /* if (write >= nbytes) */
+
+ addl wsize(%esp), from_r
+ addl write_r, from_r
+ subl nbytes_r, from_r /* from += wsize + write - nbytes */
+ subl write_r, nbytes_r /* nbytes -= write */
+#undef write_r
+
+ movl len(%esp), len_r
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1 /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl window(%esp), from_r /* from = window */
+ movl write(%esp), nbytes_r /* nbytes = write */
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1 /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+ jmp .L_do_copy1
+
+.L_contiguous_in_window:
+ /* regs: %esi = from, %ebp = hold, %bl = bits, %edi = out, %edx = dist
+ * %ecx = nbytes, %eax = write, %eax = len
+ *
+ * else {
+ * from += write - nbytes;
+ * if (nbytes < len) {
+ * len -= nbytes;
+ * do {
+ * PUP(out) = PUP(from);
+ * } while (--nbytes);
+ * from = out - dist;
+ * }
+ * }
+ */
+#define write_r %eax
+ addl write_r, from_r
+ subl nbytes_r, from_r /* from += write - nbytes */
+#undef write_r
+
+ movl len(%esp), len_r
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1 /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+
+.L_do_copy1:
+ /* regs: %esi = from, %esi = in, %ebp = hold, %bl = bits, %edi = out
+ * %eax = len
+ *
+ * while (len > 0) {
+ * PUP(out) = PUP(from);
+ * len--;
+ * }
+ * }
+ * } while (in < last && out < end);
+ */
+#undef nbytes_r
+#define in_r %esi
+ movl len_r, %ecx
+ rep movsb
+
+ movl in(%esp), in_r /* move in back to %esi, toss from */
+ jmp .L_while_test
+
+#undef len_r
+#undef dist_r
+
+#endif /* NO_MMX || RUN_TIME_MMX */
+
+
+/*** MMX code ***/
+
+#if defined( USE_MMX ) || defined( RUN_TIME_MMX )
+
+.align 32,0x90
+.L_init_mmx:
+ emms
+
+#undef bits_r
+#undef bitslong_r
+#define bitslong_r %ebp
+#define hold_mm %mm0
+ movd %ebp, hold_mm
+ movl %ebx, bitslong_r
+
+#define used_mm %mm1
+#define dmask2_mm %mm2
+#define lmask2_mm %mm3
+#define lmask_mm %mm4
+#define dmask_mm %mm5
+#define tmp_mm %mm6
+
+ movd lmask(%esp), lmask_mm
+ movq lmask_mm, lmask2_mm
+ movd dmask(%esp), dmask_mm
+ movq dmask_mm, dmask2_mm
+ pxor used_mm, used_mm
+ movl lcode(%esp), %ebx /* ebx = lcode */
+ jmp .L_do_loop_mmx
+
+.align 32,0x90
+.L_while_test_mmx:
+ /* while (in < last && out < end)
+ */
+ cmpl out_r, end(%esp)
+ jbe .L_break_loop /* if (out >= end) */
+
+ cmpl in_r, last(%esp)
+ jbe .L_break_loop
+
+.L_do_loop_mmx:
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
+
+ cmpl $32, bitslong_r
+ ja .L_get_length_code_mmx /* if (32 < bits) */
+
+ movd bitslong_r, tmp_mm
+ movd (in_r), %mm7
+ addl $4, in_r
+ psllq tmp_mm, %mm7
+ addl $32, bitslong_r
+ por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */
+
+.L_get_length_code_mmx:
+ pand hold_mm, lmask_mm
+ movd lmask_mm, %eax
+ movq lmask2_mm, lmask_mm
+ movl (%ebx,%eax,4), %eax /* eax = lcode[hold & lmask] */
+
+.L_dolen_mmx:
+ movzbl %ah, %ecx /* ecx = this.bits */
+ movd %ecx, used_mm
+ subl %ecx, bitslong_r /* bits -= this.bits */
+
+ testb %al, %al
+ jnz .L_test_for_length_base_mmx /* if (op != 0) 45.7% */
+
+ shrl $16, %eax /* output this.val char */
+ stosb
+ jmp .L_while_test_mmx
+
+.L_test_for_length_base_mmx:
+#define len_r %edx
+ movl %eax, len_r /* len = this */
+ shrl $16, len_r /* len = this.val */
+
+ testb $16, %al
+ jz .L_test_for_second_level_length_mmx /* if ((op & 16) == 0) 8% */
+ andl $15, %eax /* op &= 15 */
+ jz .L_decode_distance_mmx /* if (!op) */
+
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
+ movd %eax, used_mm
+ movd hold_mm, %ecx
+ subl %eax, bitslong_r
+ andl .L_mask(,%eax,4), %ecx
+ addl %ecx, len_r /* len += hold & mask[op] */
+
+.L_decode_distance_mmx:
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
+
+ cmpl $32, bitslong_r
+ ja .L_get_dist_code_mmx /* if (32 < bits) */
+
+ movd bitslong_r, tmp_mm
+ movd (in_r), %mm7
+ addl $4, in_r
+ psllq tmp_mm, %mm7
+ addl $32, bitslong_r
+ por %mm7, hold_mm /* hold_mm |= *((uint *)in)++ << bits */
+
+.L_get_dist_code_mmx:
+ movl dcode(%esp), %ebx /* ebx = dcode */
+ pand hold_mm, dmask_mm
+ movd dmask_mm, %eax
+ movq dmask2_mm, dmask_mm
+ movl (%ebx,%eax,4), %eax /* eax = dcode[hold & lmask] */
+
+.L_dodist_mmx:
+#define dist_r %ebx
+ movzbl %ah, %ecx /* ecx = this.bits */
+ movl %eax, dist_r
+ shrl $16, dist_r /* dist = this.val */
+ subl %ecx, bitslong_r /* bits -= this.bits */
+ movd %ecx, used_mm
+
+ testb $16, %al /* if ((op & 16) == 0) */
+ jz .L_test_for_second_level_dist_mmx
+ andl $15, %eax /* op &= 15 */
+ jz .L_check_dist_one_mmx
+
+.L_add_bits_to_dist_mmx:
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
+ movd %eax, used_mm /* save bit length of current op */
+ movd hold_mm, %ecx /* get the next bits on input stream */
+ subl %eax, bitslong_r /* bits -= op bits */
+ andl .L_mask(,%eax,4), %ecx /* ecx = hold & mask[op] */
+ addl %ecx, dist_r /* dist += hold & mask[op] */
+
+.L_check_window_mmx:
+ movl in_r, in(%esp) /* save in so from can use it's reg */
+ movl out_r, %eax
+ subl beg(%esp), %eax /* nbytes = out - beg */
+
+ cmpl dist_r, %eax
+ jb .L_clip_window_mmx /* if (dist > nbytes) 4.2% */
+
+ movl len_r, %ecx
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+
+ subl $3, %ecx
+ movb (from_r), %al
+ movb %al, (out_r)
+ movb 1(from_r), %al
+ movb 2(from_r), %dl
+ addl $3, from_r
+ movb %al, 1(out_r)
+ movb %dl, 2(out_r)
+ addl $3, out_r
+ rep movsb
+
+ movl in(%esp), in_r /* move in back to %esi, toss from */
+ movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */
+ jmp .L_while_test_mmx
+
+.align 16,0x90
+.L_check_dist_one_mmx:
+ cmpl $1, dist_r
+ jne .L_check_window_mmx
+ cmpl out_r, beg(%esp)
+ je .L_check_window_mmx
+
+ decl out_r
+ movl len_r, %ecx
+ movb (out_r), %al
+ subl $3, %ecx
+
+ movb %al, 1(out_r)
+ movb %al, 2(out_r)
+ movb %al, 3(out_r)
+ addl $4, out_r
+ rep stosb
+
+ movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */
+ jmp .L_while_test_mmx
+
+.align 16,0x90
+.L_test_for_second_level_length_mmx:
+ testb $64, %al
+ jnz .L_test_for_end_of_block /* if ((op & 64) != 0) */
+
+ andl $15, %eax
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
+ movd hold_mm, %ecx
+ andl .L_mask(,%eax,4), %ecx
+ addl len_r, %ecx
+ movl (%ebx,%ecx,4), %eax /* eax = lcode[hold & lmask] */
+ jmp .L_dolen_mmx
+
+.align 16,0x90
+.L_test_for_second_level_dist_mmx:
+ testb $64, %al
+ jnz .L_invalid_distance_code /* if ((op & 64) != 0) */
+
+ andl $15, %eax
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
+ movd hold_mm, %ecx
+ andl .L_mask(,%eax,4), %ecx
+ movl dcode(%esp), %eax /* ecx = dcode */
+ addl dist_r, %ecx
+ movl (%eax,%ecx,4), %eax /* eax = lcode[hold & lmask] */
+ jmp .L_dodist_mmx
+
+.align 16,0x90
+.L_clip_window_mmx:
+#define nbytes_r %ecx
+ movl %eax, nbytes_r
+ movl wsize(%esp), %eax /* prepare for dist compare */
+ negl nbytes_r /* nbytes = -nbytes */
+ movl window(%esp), from_r /* from = window */
+
+ cmpl dist_r, %eax
+ jb .L_invalid_distance_too_far /* if (dist > wsize) */
+
+ addl dist_r, nbytes_r /* nbytes = dist - nbytes */
+ cmpl $0, write(%esp)
+ jne .L_wrap_around_window_mmx /* if (write != 0) */
+
+ subl nbytes_r, %eax
+ addl %eax, from_r /* from += wsize - nbytes */
+
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+ jmp .L_do_copy1_mmx
+
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+ jmp .L_do_copy1_mmx
+
+.L_wrap_around_window_mmx:
+#define write_r %eax
+ movl write(%esp), write_r
+ cmpl write_r, nbytes_r
+ jbe .L_contiguous_in_window_mmx /* if (write >= nbytes) */
+
+ addl wsize(%esp), from_r
+ addl write_r, from_r
+ subl nbytes_r, from_r /* from += wsize + write - nbytes */
+ subl write_r, nbytes_r /* nbytes -= write */
+#undef write_r
+
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl window(%esp), from_r /* from = window */
+ movl write(%esp), nbytes_r /* nbytes = write */
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+ jmp .L_do_copy1_mmx
+
+.L_contiguous_in_window_mmx:
+#define write_r %eax
+ addl write_r, from_r
+ subl nbytes_r, from_r /* from += write - nbytes */
+#undef write_r
+
+ cmpl nbytes_r, len_r
+ jbe .L_do_copy1_mmx /* if (nbytes >= len) */
+
+ subl nbytes_r, len_r /* len -= nbytes */
+ rep movsb
+ movl out_r, from_r
+ subl dist_r, from_r /* from = out - dist */
+
+.L_do_copy1_mmx:
+#undef nbytes_r
+#define in_r %esi
+ movl len_r, %ecx
+ rep movsb
+
+ movl in(%esp), in_r /* move in back to %esi, toss from */
+ movl lcode(%esp), %ebx /* move lcode back to %ebx, toss dist */
+ jmp .L_while_test_mmx
+
+#undef hold_r
+#undef bitslong_r
+
+#endif /* USE_MMX || RUN_TIME_MMX */
+
+
+/*** USE_MMX, NO_MMX, and RUNTIME_MMX from here on ***/
+
+.L_invalid_distance_code:
+ /* else {
+ * strm->msg = "invalid distance code";
+ * state->mode = BAD;
+ * }
+ */
+ movl $.L_invalid_distance_code_msg, %ecx
+ movl $INFLATE_MODE_BAD, %edx
+ jmp .L_update_stream_state
+
+.L_test_for_end_of_block:
+ /* else if (op & 32) {
+ * state->mode = TYPE;
+ * break;
+ * }
+ */
+ testb $32, %al
+ jz .L_invalid_literal_length_code /* if ((op & 32) == 0) */
+
+ movl $0, %ecx
+ movl $INFLATE_MODE_TYPE, %edx
+ jmp .L_update_stream_state
+
+.L_invalid_literal_length_code:
+ /* else {
+ * strm->msg = "invalid literal/length code";
+ * state->mode = BAD;
+ * }
+ */
+ movl $.L_invalid_literal_length_code_msg, %ecx
+ movl $INFLATE_MODE_BAD, %edx
+ jmp .L_update_stream_state
+
+.L_invalid_distance_too_far:
+ /* strm->msg = "invalid distance too far back";
+ * state->mode = BAD;
+ */
+ movl in(%esp), in_r /* from_r has in's reg, put in back */
+ movl $.L_invalid_distance_too_far_msg, %ecx
+ movl $INFLATE_MODE_BAD, %edx
+ jmp .L_update_stream_state
+
+.L_update_stream_state:
+ /* set strm->msg = %ecx, strm->state->mode = %edx */
+ movl strm_sp(%esp), %eax
+ testl %ecx, %ecx /* if (msg != NULL) */
+ jz .L_skip_msg
+ movl %ecx, msg_strm(%eax) /* strm->msg = msg */
+.L_skip_msg:
+ movl state_strm(%eax), %eax /* state = strm->state */
+ movl %edx, mode_state(%eax) /* state->mode = edx (BAD | TYPE) */
+ jmp .L_break_loop
+
+.align 32,0x90
+.L_break_loop:
+
+/*
+ * Regs:
+ *
+ * bits = %ebp when mmx, and in %ebx when non-mmx
+ * hold = %hold_mm when mmx, and in %ebp when non-mmx
+ * in = %esi
+ * out = %edi
+ */
+
+#if defined( USE_MMX ) || defined( RUN_TIME_MMX )
+
+#if defined( RUN_TIME_MMX )
+
+ cmpl $DO_USE_MMX, inflate_fast_use_mmx
+ jne .L_update_next_in
+
+#endif /* RUN_TIME_MMX */
+
+ movl %ebp, %ebx
+
+.L_update_next_in:
+
+#endif
+
+#define strm_r %eax
+#define state_r %edx
+
+ /* len = bits >> 3;
+ * in -= len;
+ * bits -= len << 3;
+ * hold &= (1U << bits) - 1;
+ * state->hold = hold;
+ * state->bits = bits;
+ * strm->next_in = in;
+ * strm->next_out = out;
+ */
+ movl strm_sp(%esp), strm_r
+ movl %ebx, %ecx
+ movl state_strm(strm_r), state_r
+ shrl $3, %ecx
+ subl %ecx, in_r
+ shll $3, %ecx
+ subl %ecx, %ebx
+ movl out_r, next_out_strm(strm_r)
+ movl %ebx, bits_state(state_r)
+ movl %ebx, %ecx
+
+ leal buf(%esp), %ebx
+ cmpl %ebx, last(%esp)
+ jne .L_buf_not_used /* if buf != last */
+
+ subl %ebx, in_r /* in -= buf */
+ movl next_in_strm(strm_r), %ebx
+ movl %ebx, last(%esp) /* last = strm->next_in */
+ addl %ebx, in_r /* in += strm->next_in */
+ movl avail_in_strm(strm_r), %ebx
+ subl $11, %ebx
+ addl %ebx, last(%esp) /* last = &strm->next_in[ avail_in - 11 ] */
+
+.L_buf_not_used:
+ movl in_r, next_in_strm(strm_r)
+
+ movl $1, %ebx
+ shll %cl, %ebx
+ decl %ebx
+
+#if defined( USE_MMX ) || defined( RUN_TIME_MMX )
+
+#if defined( RUN_TIME_MMX )
+
+ cmpl $DO_USE_MMX, inflate_fast_use_mmx
+ jne .L_update_hold
+
+#endif /* RUN_TIME_MMX */
+
+ psrlq used_mm, hold_mm /* hold_mm >>= last bit length */
+ movd hold_mm, %ebp
+
+ emms
+
+.L_update_hold:
+
+#endif /* USE_MMX || RUN_TIME_MMX */
+
+ andl %ebx, %ebp
+ movl %ebp, hold_state(state_r)
+
+#define last_r %ebx
+
+ /* strm->avail_in = in < last ? 11 + (last - in) : 11 - (in - last) */
+ movl last(%esp), last_r
+ cmpl in_r, last_r
+ jbe .L_last_is_smaller /* if (in >= last) */
+
+ subl in_r, last_r /* last -= in */
+ addl $11, last_r /* last += 11 */
+ movl last_r, avail_in_strm(strm_r)
+ jmp .L_fixup_out
+.L_last_is_smaller:
+ subl last_r, in_r /* in -= last */
+ negl in_r /* in = -in */
+ addl $11, in_r /* in += 11 */
+ movl in_r, avail_in_strm(strm_r)
+
+#undef last_r
+#define end_r %ebx
+
+.L_fixup_out:
+ /* strm->avail_out = out < end ? 257 + (end - out) : 257 - (out - end)*/
+ movl end(%esp), end_r
+ cmpl out_r, end_r
+ jbe .L_end_is_smaller /* if (out >= end) */
+
+ subl out_r, end_r /* end -= out */
+ addl $257, end_r /* end += 257 */
+ movl end_r, avail_out_strm(strm_r)
+ jmp .L_done
+.L_end_is_smaller:
+ subl end_r, out_r /* out -= end */
+ negl out_r /* out = -out */
+ addl $257, out_r /* out += 257 */
+ movl out_r, avail_out_strm(strm_r)
+
+#undef end_r
+#undef strm_r
+#undef state_r
+
+.L_done:
+ addl $local_var_size, %esp
+ popf
+ popl %ebx
+ popl %ebp
+ popl %esi
+ popl %edi
+ ret
+
+#if defined( GAS_ELF )
+/* elf info */
+.type inflate_fast,@function
+.size inflate_fast,.-inflate_fast
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/test.cpp b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/test.cpp
new file mode 100644
index 000000000..7d265b3b5
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/test.cpp
@@ -0,0 +1,24 @@
+
+#include "zfstream.h"
+
+int main() {
+
+ // Construct a stream object with this filebuffer. Anything sent
+ // to this stream will go to standard out.
+ gzofstream os( 1, ios::out );
+
+ // This text is getting compressed and sent to stdout.
+ // To prove this, run 'test | zcat'.
+ os << "Hello, Mommy" << endl;
+
+ os << setcompressionlevel( Z_NO_COMPRESSION );
+ os << "hello, hello, hi, ho!" << endl;
+
+ setcompressionlevel( os, Z_DEFAULT_COMPRESSION )
+ << "I'm compressing again" << endl;
+
+ os.close();
+
+ return 0;
+
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.cpp b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.cpp
new file mode 100644
index 000000000..d0cd85faa
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.cpp
@@ -0,0 +1,329 @@
+
+#include "zfstream.h"
+
+gzfilebuf::gzfilebuf() :
+ file(NULL),
+ mode(0),
+ own_file_descriptor(0)
+{ }
+
+gzfilebuf::~gzfilebuf() {
+
+ sync();
+ if ( own_file_descriptor )
+ close();
+
+}
+
+gzfilebuf *gzfilebuf::open( const char *name,
+ int io_mode ) {
+
+ if ( is_open() )
+ return NULL;
+
+ char char_mode[10];
+ char *p = char_mode;
+
+ if ( io_mode & ios::in ) {
+ mode = ios::in;
+ *p++ = 'r';
+ } else if ( io_mode & ios::app ) {
+ mode = ios::app;
+ *p++ = 'a';
+ } else {
+ mode = ios::out;
+ *p++ = 'w';
+ }
+
+ if ( io_mode & ios::binary ) {
+ mode |= ios::binary;
+ *p++ = 'b';
+ }
+
+ // Hard code the compression level
+ if ( io_mode & (ios::out|ios::app )) {
+ *p++ = '9';
+ }
+
+ // Put the end-of-string indicator
+ *p = '\0';
+
+ if ( (file = gzopen(name, char_mode)) == NULL )
+ return NULL;
+
+ own_file_descriptor = 1;
+
+ return this;
+
+}
+
+gzfilebuf *gzfilebuf::attach( int file_descriptor,
+ int io_mode ) {
+
+ if ( is_open() )
+ return NULL;
+
+ char char_mode[10];
+ char *p = char_mode;
+
+ if ( io_mode & ios::in ) {
+ mode = ios::in;
+ *p++ = 'r';
+ } else if ( io_mode & ios::app ) {
+ mode = ios::app;
+ *p++ = 'a';
+ } else {
+ mode = ios::out;
+ *p++ = 'w';
+ }
+
+ if ( io_mode & ios::binary ) {
+ mode |= ios::binary;
+ *p++ = 'b';
+ }
+
+ // Hard code the compression level
+ if ( io_mode & (ios::out|ios::app )) {
+ *p++ = '9';
+ }
+
+ // Put the end-of-string indicator
+ *p = '\0';
+
+ if ( (file = gzdopen(file_descriptor, char_mode)) == NULL )
+ return NULL;
+
+ own_file_descriptor = 0;
+
+ return this;
+
+}
+
+gzfilebuf *gzfilebuf::close() {
+
+ if ( is_open() ) {
+
+ sync();
+ gzclose( file );
+ file = NULL;
+
+ }
+
+ return this;
+
+}
+
+int gzfilebuf::setcompressionlevel( int comp_level ) {
+
+ return gzsetparams(file, comp_level, -2);
+
+}
+
+int gzfilebuf::setcompressionstrategy( int comp_strategy ) {
+
+ return gzsetparams(file, -2, comp_strategy);
+
+}
+
+
+streampos gzfilebuf::seekoff( streamoff off, ios::seek_dir dir, int which ) {
+
+ return streampos(EOF);
+
+}
+
+int gzfilebuf::underflow() {
+
+ // If the file hasn't been opened for reading, error.
+ if ( !is_open() || !(mode & ios::in) )
+ return EOF;
+
+ // if a buffer doesn't exists, allocate one.
+ if ( !base() ) {
+
+ if ( (allocate()) == EOF )
+ return EOF;
+ setp(0,0);
+
+ } else {
+
+ if ( in_avail() )
+ return (unsigned char) *gptr();
+
+ if ( out_waiting() ) {
+ if ( flushbuf() == EOF )
+ return EOF;
+ }
+
+ }
+
+ // Attempt to fill the buffer.
+
+ int result = fillbuf();
+ if ( result == EOF ) {
+ // disable get area
+ setg(0,0,0);
+ return EOF;
+ }
+
+ return (unsigned char) *gptr();
+
+}
+
+int gzfilebuf::overflow( int c ) {
+
+ if ( !is_open() || !(mode & ios::out) )
+ return EOF;
+
+ if ( !base() ) {
+ if ( allocate() == EOF )
+ return EOF;
+ setg(0,0,0);
+ } else {
+ if (in_avail()) {
+ return EOF;
+ }
+ if (out_waiting()) {
+ if (flushbuf() == EOF)
+ return EOF;
+ }
+ }
+
+ int bl = blen();
+ setp( base(), base() + bl);
+
+ if ( c != EOF ) {
+
+ *pptr() = c;
+ pbump(1);
+
+ }
+
+ return 0;
+
+}
+
+int gzfilebuf::sync() {
+
+ if ( !is_open() )
+ return EOF;
+
+ if ( out_waiting() )
+ return flushbuf();
+
+ return 0;
+
+}
+
+int gzfilebuf::flushbuf() {
+
+ int n;
+ char *q;
+
+ q = pbase();
+ n = pptr() - q;
+
+ if ( gzwrite( file, q, n) < n )
+ return EOF;
+
+ setp(0,0);
+
+ return 0;
+
+}
+
+int gzfilebuf::fillbuf() {
+
+ int required;
+ char *p;
+
+ p = base();
+
+ required = blen();
+
+ int t = gzread( file, p, required );
+
+ if ( t <= 0) return EOF;
+
+ setg( base(), base(), base()+t);
+
+ return t;
+
+}
+
+gzfilestream_common::gzfilestream_common() :
+ ios( gzfilestream_common::rdbuf() )
+{ }
+
+gzfilestream_common::~gzfilestream_common()
+{ }
+
+void gzfilestream_common::attach( int fd, int io_mode ) {
+
+ if ( !buffer.attach( fd, io_mode) )
+ clear( ios::failbit | ios::badbit );
+ else
+ clear();
+
+}
+
+void gzfilestream_common::open( const char *name, int io_mode ) {
+
+ if ( !buffer.open( name, io_mode ) )
+ clear( ios::failbit | ios::badbit );
+ else
+ clear();
+
+}
+
+void gzfilestream_common::close() {
+
+ if ( !buffer.close() )
+ clear( ios::failbit | ios::badbit );
+
+}
+
+gzfilebuf *gzfilestream_common::rdbuf()
+{
+ return &buffer;
+}
+
+gzifstream::gzifstream() :
+ ios( gzfilestream_common::rdbuf() )
+{
+ clear( ios::badbit );
+}
+
+gzifstream::gzifstream( const char *name, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::open( name, io_mode );
+}
+
+gzifstream::gzifstream( int fd, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::attach( fd, io_mode );
+}
+
+gzifstream::~gzifstream() { }
+
+gzofstream::gzofstream() :
+ ios( gzfilestream_common::rdbuf() )
+{
+ clear( ios::badbit );
+}
+
+gzofstream::gzofstream( const char *name, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::open( name, io_mode );
+}
+
+gzofstream::gzofstream( int fd, int io_mode ) :
+ ios( gzfilestream_common::rdbuf() )
+{
+ gzfilestream_common::attach( fd, io_mode );
+}
+
+gzofstream::~gzofstream() { }
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.h
new file mode 100644
index 000000000..ed79098a3
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream/zfstream.h
@@ -0,0 +1,128 @@
+
+#ifndef zfstream_h
+#define zfstream_h
+
+#include <fstream.h>
+#include "zlib.h"
+
+class gzfilebuf : public streambuf {
+
+public:
+
+ gzfilebuf( );
+ virtual ~gzfilebuf();
+
+ gzfilebuf *open( const char *name, int io_mode );
+ gzfilebuf *attach( int file_descriptor, int io_mode );
+ gzfilebuf *close();
+
+ int setcompressionlevel( int comp_level );
+ int setcompressionstrategy( int comp_strategy );
+
+ inline int is_open() const { return (file !=NULL); }
+
+ virtual streampos seekoff( streamoff, ios::seek_dir, int );
+
+ virtual int sync();
+
+protected:
+
+ virtual int underflow();
+ virtual int overflow( int = EOF );
+
+private:
+
+ gzFile file;
+ short mode;
+ short own_file_descriptor;
+
+ int flushbuf();
+ int fillbuf();
+
+};
+
+class gzfilestream_common : virtual public ios {
+
+ friend class gzifstream;
+ friend class gzofstream;
+ friend gzofstream &setcompressionlevel( gzofstream &, int );
+ friend gzofstream &setcompressionstrategy( gzofstream &, int );
+
+public:
+ virtual ~gzfilestream_common();
+
+ void attach( int fd, int io_mode );
+ void open( const char *name, int io_mode );
+ void close();
+
+protected:
+ gzfilestream_common();
+
+private:
+ gzfilebuf *rdbuf();
+
+ gzfilebuf buffer;
+
+};
+
+class gzifstream : public gzfilestream_common, public istream {
+
+public:
+
+ gzifstream();
+ gzifstream( const char *name, int io_mode = ios::in );
+ gzifstream( int fd, int io_mode = ios::in );
+
+ virtual ~gzifstream();
+
+};
+
+class gzofstream : public gzfilestream_common, public ostream {
+
+public:
+
+ gzofstream();
+ gzofstream( const char *name, int io_mode = ios::out );
+ gzofstream( int fd, int io_mode = ios::out );
+
+ virtual ~gzofstream();
+
+};
+
+template<class T> class gzomanip {
+ friend gzofstream &operator<<(gzofstream &, const gzomanip<T> &);
+public:
+ gzomanip(gzofstream &(*f)(gzofstream &, T), T v) : func(f), val(v) { }
+private:
+ gzofstream &(*func)(gzofstream &, T);
+ T val;
+};
+
+template<class T> gzofstream &operator<<(gzofstream &s, const gzomanip<T> &m)
+{
+ return (*m.func)(s, m.val);
+}
+
+inline gzofstream &setcompressionlevel( gzofstream &s, int l )
+{
+ (s.rdbuf())->setcompressionlevel(l);
+ return s;
+}
+
+inline gzofstream &setcompressionstrategy( gzofstream &s, int l )
+{
+ (s.rdbuf())->setcompressionstrategy(l);
+ return s;
+}
+
+inline gzomanip<int> setcompressionlevel(int l)
+{
+ return gzomanip<int>(&setcompressionlevel,l);
+}
+
+inline gzomanip<int> setcompressionstrategy(int l)
+{
+ return gzomanip<int>(&setcompressionstrategy,l);
+}
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream.h
new file mode 100644
index 000000000..43d2332b7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream.h
@@ -0,0 +1,307 @@
+/*
+ *
+ * Copyright (c) 1997
+ * Christian Michelsen Research AS
+ * Advanced Computing
+ * Fantoftvegen 38, 5036 BERGEN, Norway
+ * http://www.cmr.no
+ *
+ * Permission to use, copy, modify, distribute and sell this software
+ * and its documentation for any purpose is hereby granted without fee,
+ * provided that the above copyright notice appear in all copies and
+ * that both that copyright notice and this permission notice appear
+ * in supporting documentation. Christian Michelsen Research AS makes no
+ * representations about the suitability of this software for any
+ * purpose. It is provided "as is" without express or implied warranty.
+ *
+ */
+
+#ifndef ZSTREAM__H
+#define ZSTREAM__H
+
+/*
+ * zstream.h - C++ interface to the 'zlib' general purpose compression library
+ * $Id: zstream.h 1.1 1997-06-25 12:00:56+02 tyge Exp tyge $
+ */
+
+#include <strstream.h>
+#include <string.h>
+#include <stdio.h>
+#include "zlib.h"
+
+#if defined(_WIN32)
+# include <fcntl.h>
+# include <io.h>
+# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+
+class zstringlen {
+public:
+ zstringlen(class izstream&);
+ zstringlen(class ozstream&, const char*);
+ size_t value() const { return val.word; }
+private:
+ struct Val { unsigned char byte; size_t word; } val;
+};
+
+// ----------------------------- izstream -----------------------------
+
+class izstream
+{
+ public:
+ izstream() : m_fp(0) {}
+ izstream(FILE* fp) : m_fp(0) { open(fp); }
+ izstream(const char* name) : m_fp(0) { open(name); }
+ ~izstream() { close(); }
+
+ /* Opens a gzip (.gz) file for reading.
+ * open() can be used to read a file which is not in gzip format;
+ * in this case read() will directly read from the file without
+ * decompression. errno can be checked to distinguish two error
+ * cases (if errno is zero, the zlib error is Z_MEM_ERROR).
+ */
+ void open(const char* name) {
+ if (m_fp) close();
+ m_fp = ::gzopen(name, "rb");
+ }
+
+ void open(FILE* fp) {
+ SET_BINARY_MODE(fp);
+ if (m_fp) close();
+ m_fp = ::gzdopen(fileno(fp), "rb");
+ }
+
+ /* Flushes all pending input if necessary, closes the compressed file
+ * and deallocates all the (de)compression state. The return value is
+ * the zlib error number (see function error() below).
+ */
+ int close() {
+ int r = ::gzclose(m_fp);
+ m_fp = 0; return r;
+ }
+
+ /* Binary read the given number of bytes from the compressed file.
+ */
+ int read(void* buf, size_t len) {
+ return ::gzread(m_fp, buf, len);
+ }
+
+ /* Returns the error message for the last error which occurred on the
+ * given compressed file. errnum is set to zlib error number. If an
+ * error occurred in the file system and not in the compression library,
+ * errnum is set to Z_ERRNO and the application may consult errno
+ * to get the exact error code.
+ */
+ const char* error(int* errnum) {
+ return ::gzerror(m_fp, errnum);
+ }
+
+ gzFile fp() { return m_fp; }
+
+ private:
+ gzFile m_fp;
+};
+
+/*
+ * Binary read the given (array of) object(s) from the compressed file.
+ * If the input file was not in gzip format, read() copies the objects number
+ * of bytes into the buffer.
+ * returns the number of uncompressed bytes actually read
+ * (0 for end of file, -1 for error).
+ */
+template <class T, class Items>
+inline int read(izstream& zs, T* x, Items items) {
+ return ::gzread(zs.fp(), x, items*sizeof(T));
+}
+
+/*
+ * Binary input with the '>' operator.
+ */
+template <class T>
+inline izstream& operator>(izstream& zs, T& x) {
+ ::gzread(zs.fp(), &x, sizeof(T));
+ return zs;
+}
+
+
+inline zstringlen::zstringlen(izstream& zs) {
+ zs > val.byte;
+ if (val.byte == 255) zs > val.word;
+ else val.word = val.byte;
+}
+
+/*
+ * Read length of string + the string with the '>' operator.
+ */
+inline izstream& operator>(izstream& zs, char* x) {
+ zstringlen len(zs);
+ ::gzread(zs.fp(), x, len.value());
+ x[len.value()] = '\0';
+ return zs;
+}
+
+inline char* read_string(izstream& zs) {
+ zstringlen len(zs);
+ char* x = new char[len.value()+1];
+ ::gzread(zs.fp(), x, len.value());
+ x[len.value()] = '\0';
+ return x;
+}
+
+// ----------------------------- ozstream -----------------------------
+
+class ozstream
+{
+ public:
+ ozstream() : m_fp(0), m_os(0) {
+ }
+ ozstream(FILE* fp, int level = Z_DEFAULT_COMPRESSION)
+ : m_fp(0), m_os(0) {
+ open(fp, level);
+ }
+ ozstream(const char* name, int level = Z_DEFAULT_COMPRESSION)
+ : m_fp(0), m_os(0) {
+ open(name, level);
+ }
+ ~ozstream() {
+ close();
+ }
+
+ /* Opens a gzip (.gz) file for writing.
+ * The compression level parameter should be in 0..9
+ * errno can be checked to distinguish two error cases
+ * (if errno is zero, the zlib error is Z_MEM_ERROR).
+ */
+ void open(const char* name, int level = Z_DEFAULT_COMPRESSION) {
+ char mode[4] = "wb\0";
+ if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
+ if (m_fp) close();
+ m_fp = ::gzopen(name, mode);
+ }
+
+ /* open from a FILE pointer.
+ */
+ void open(FILE* fp, int level = Z_DEFAULT_COMPRESSION) {
+ SET_BINARY_MODE(fp);
+ char mode[4] = "wb\0";
+ if (level != Z_DEFAULT_COMPRESSION) mode[2] = '0'+level;
+ if (m_fp) close();
+ m_fp = ::gzdopen(fileno(fp), mode);
+ }
+
+ /* Flushes all pending output if necessary, closes the compressed file
+ * and deallocates all the (de)compression state. The return value is
+ * the zlib error number (see function error() below).
+ */
+ int close() {
+ if (m_os) {
+ ::gzwrite(m_fp, m_os->str(), m_os->pcount());
+ delete[] m_os->str(); delete m_os; m_os = 0;
+ }
+ int r = ::gzclose(m_fp); m_fp = 0; return r;
+ }
+
+ /* Binary write the given number of bytes into the compressed file.
+ */
+ int write(const void* buf, size_t len) {
+ return ::gzwrite(m_fp, (voidp) buf, len);
+ }
+
+ /* Flushes all pending output into the compressed file. The parameter
+ * _flush is as in the deflate() function. The return value is the zlib
+ * error number (see function gzerror below). flush() returns Z_OK if
+ * the flush_ parameter is Z_FINISH and all output could be flushed.
+ * flush() should be called only when strictly necessary because it can
+ * degrade compression.
+ */
+ int flush(int _flush) {
+ os_flush();
+ return ::gzflush(m_fp, _flush);
+ }
+
+ /* Returns the error message for the last error which occurred on the
+ * given compressed file. errnum is set to zlib error number. If an
+ * error occurred in the file system and not in the compression library,
+ * errnum is set to Z_ERRNO and the application may consult errno
+ * to get the exact error code.
+ */
+ const char* error(int* errnum) {
+ return ::gzerror(m_fp, errnum);
+ }
+
+ gzFile fp() { return m_fp; }
+
+ ostream& os() {
+ if (m_os == 0) m_os = new ostrstream;
+ return *m_os;
+ }
+
+ void os_flush() {
+ if (m_os && m_os->pcount()>0) {
+ ostrstream* oss = new ostrstream;
+ oss->fill(m_os->fill());
+ oss->flags(m_os->flags());
+ oss->precision(m_os->precision());
+ oss->width(m_os->width());
+ ::gzwrite(m_fp, m_os->str(), m_os->pcount());
+ delete[] m_os->str(); delete m_os; m_os = oss;
+ }
+ }
+
+ private:
+ gzFile m_fp;
+ ostrstream* m_os;
+};
+
+/*
+ * Binary write the given (array of) object(s) into the compressed file.
+ * returns the number of uncompressed bytes actually written
+ * (0 in case of error).
+ */
+template <class T, class Items>
+inline int write(ozstream& zs, const T* x, Items items) {
+ return ::gzwrite(zs.fp(), (voidp) x, items*sizeof(T));
+}
+
+/*
+ * Binary output with the '<' operator.
+ */
+template <class T>
+inline ozstream& operator<(ozstream& zs, const T& x) {
+ ::gzwrite(zs.fp(), (voidp) &x, sizeof(T));
+ return zs;
+}
+
+inline zstringlen::zstringlen(ozstream& zs, const char* x) {
+ val.byte = 255; val.word = ::strlen(x);
+ if (val.word < 255) zs < (val.byte = val.word);
+ else zs < val;
+}
+
+/*
+ * Write length of string + the string with the '<' operator.
+ */
+inline ozstream& operator<(ozstream& zs, const char* x) {
+ zstringlen len(zs, x);
+ ::gzwrite(zs.fp(), (voidp) x, len.value());
+ return zs;
+}
+
+#ifdef _MSC_VER
+inline ozstream& operator<(ozstream& zs, char* const& x) {
+ return zs < (const char*) x;
+}
+#endif
+
+/*
+ * Ascii write with the << operator;
+ */
+template <class T>
+inline ostream& operator<<(ozstream& zs, const T& x) {
+ zs.os_flush();
+ return zs.os() << x;
+}
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream_test.cpp b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream_test.cpp
new file mode 100644
index 000000000..6273f62d6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream2/zstream_test.cpp
@@ -0,0 +1,25 @@
+#include "zstream.h"
+#include <math.h>
+#include <stdlib.h>
+#include <iomanip.h>
+
+void main() {
+ char h[256] = "Hello";
+ char* g = "Goodbye";
+ ozstream out("temp.gz");
+ out < "This works well" < h < g;
+ out.close();
+
+ izstream in("temp.gz"); // read it back
+ char *x = read_string(in), *y = new char[256], z[256];
+ in > y > z;
+ in.close();
+ cout << x << endl << y << endl << z << endl;
+
+ out.open("temp.gz"); // try ascii output; zcat temp.gz to see the results
+ out << setw(50) << setfill('#') << setprecision(20) << x << endl << y << endl << z << endl;
+ out << z << endl << y << endl << x << endl;
+ out << 1.1234567890123456789 << endl;
+
+ delete[] x; delete[] y;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/README b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/README
new file mode 100644
index 000000000..f7b319ab9
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/README
@@ -0,0 +1,35 @@
+These classes provide a C++ stream interface to the zlib library. It allows you
+to do things like:
+
+ gzofstream outf("blah.gz");
+ outf << "These go into the gzip file " << 123 << endl;
+
+It does this by deriving a specialized stream buffer for gzipped files, which is
+the way Stroustrup would have done it. :->
+
+The gzifstream and gzofstream classes were originally written by Kevin Ruland
+and made available in the zlib contrib/iostream directory. The older version still
+compiles under gcc 2.xx, but not under gcc 3.xx, which sparked the development of
+this version.
+
+The new classes are as standard-compliant as possible, closely following the
+approach of the standard library's fstream classes. It compiles under gcc versions
+3.2 and 3.3, but not under gcc 2.xx. This is mainly due to changes in the standard
+library naming scheme. The new version of gzifstream/gzofstream/gzfilebuf differs
+from the previous one in the following respects:
+- added showmanyc
+- added setbuf, with support for unbuffered output via setbuf(0,0)
+- a few bug fixes of stream behavior
+- gzipped output file opened with default compression level instead of maximum level
+- setcompressionlevel()/strategy() members replaced by single setcompression()
+
+The code is provided "as is", with the permission to use, copy, modify, distribute
+and sell it for any purpose without fee.
+
+Ludwig Schwardt
+<schwardt@sun.ac.za>
+
+DSP Lab
+Electrical & Electronic Engineering Department
+University of Stellenbosch
+South Africa
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/TODO b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/TODO
new file mode 100644
index 000000000..7032f97be
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/TODO
@@ -0,0 +1,17 @@
+Possible upgrades to gzfilebuf:
+
+- The ability to do putback (e.g. putbackfail)
+
+- The ability to seek (zlib supports this, but could be slow/tricky)
+
+- Simultaneous read/write access (does it make sense?)
+
+- Support for ios_base::ate open mode
+
+- Locale support?
+
+- Check public interface to see which calls give problems
+ (due to dependence on library internals)
+
+- Override operator<<(ostream&, gzfilebuf*) to allow direct copying
+ of stream buffer to stream ( i.e. os << is.rdbuf(); )
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/test.cc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/test.cc
new file mode 100644
index 000000000..94235334f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/test.cc
@@ -0,0 +1,50 @@
+/*
+ * Test program for gzifstream and gzofstream
+ *
+ * by Ludwig Schwardt <schwardt@sun.ac.za>
+ * original version by Kevin Ruland <kevin@rodin.wustl.edu>
+ */
+
+#include "zfstream.h"
+#include <iostream> // for cout
+
+int main() {
+
+ gzofstream outf;
+ gzifstream inf;
+ char buf[80];
+
+ outf.open("test1.txt.gz");
+ outf << "The quick brown fox sidestepped the lazy canine\n"
+ << 1.3 << "\nPlan " << 9 << std::endl;
+ outf.close();
+ std::cout << "Wrote the following message to 'test1.txt.gz' (check with zcat or zless):\n"
+ << "The quick brown fox sidestepped the lazy canine\n"
+ << 1.3 << "\nPlan " << 9 << std::endl;
+
+ std::cout << "\nReading 'test1.txt.gz' (buffered) produces:\n";
+ inf.open("test1.txt.gz");
+ while (inf.getline(buf,80,'\n')) {
+ std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n";
+ }
+ inf.close();
+
+ outf.rdbuf()->pubsetbuf(0,0);
+ outf.open("test2.txt.gz");
+ outf << setcompression(Z_NO_COMPRESSION)
+ << "The quick brown fox sidestepped the lazy canine\n"
+ << 1.3 << "\nPlan " << 9 << std::endl;
+ outf.close();
+ std::cout << "\nWrote the same message to 'test2.txt.gz' in uncompressed form";
+
+ std::cout << "\nReading 'test2.txt.gz' (unbuffered) produces:\n";
+ inf.rdbuf()->pubsetbuf(0,0);
+ inf.open("test2.txt.gz");
+ while (inf.getline(buf,80,'\n')) {
+ std::cout << buf << "\t(" << inf.rdbuf()->in_avail() << " chars left in buffer)\n";
+ }
+ inf.close();
+
+ return 0;
+
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.cc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.cc
new file mode 100644
index 000000000..94eb93344
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.cc
@@ -0,0 +1,479 @@
+/*
+ * A C++ I/O streams interface to the zlib gz* functions
+ *
+ * by Ludwig Schwardt <schwardt@sun.ac.za>
+ * original version by Kevin Ruland <kevin@rodin.wustl.edu>
+ *
+ * This version is standard-compliant and compatible with gcc 3.x.
+ */
+
+#include "zfstream.h"
+#include <cstring> // for strcpy, strcat, strlen (mode strings)
+#include <cstdio> // for BUFSIZ
+
+// Internal buffer sizes (default and "unbuffered" versions)
+#define BIGBUFSIZE BUFSIZ
+#define SMALLBUFSIZE 1
+
+/*****************************************************************************/
+
+// Default constructor
+gzfilebuf::gzfilebuf()
+: file(NULL), io_mode(std::ios_base::openmode(0)), own_fd(false),
+ buffer(NULL), buffer_size(BIGBUFSIZE), own_buffer(true)
+{
+ // No buffers to start with
+ this->disable_buffer();
+}
+
+// Destructor
+gzfilebuf::~gzfilebuf()
+{
+ // Sync output buffer and close only if responsible for file
+ // (i.e. attached streams should be left open at this stage)
+ this->sync();
+ if (own_fd)
+ this->close();
+ // Make sure internal buffer is deallocated
+ this->disable_buffer();
+}
+
+// Set compression level and strategy
+int
+gzfilebuf::setcompression(int comp_level,
+ int comp_strategy)
+{
+ return gzsetparams(file, comp_level, comp_strategy);
+}
+
+// Open gzipped file
+gzfilebuf*
+gzfilebuf::open(const char *name,
+ std::ios_base::openmode mode)
+{
+ // Fail if file already open
+ if (this->is_open())
+ return NULL;
+ // Don't support simultaneous read/write access (yet)
+ if ((mode & std::ios_base::in) && (mode & std::ios_base::out))
+ return NULL;
+
+ // Build mode string for gzopen and check it [27.8.1.3.2]
+ char char_mode[6] = "\0\0\0\0\0";
+ if (!this->open_mode(mode, char_mode))
+ return NULL;
+
+ // Attempt to open file
+ if ((file = gzopen(name, char_mode)) == NULL)
+ return NULL;
+
+ // On success, allocate internal buffer and set flags
+ this->enable_buffer();
+ io_mode = mode;
+ own_fd = true;
+ return this;
+}
+
+// Attach to gzipped file
+gzfilebuf*
+gzfilebuf::attach(int fd,
+ std::ios_base::openmode mode)
+{
+ // Fail if file already open
+ if (this->is_open())
+ return NULL;
+ // Don't support simultaneous read/write access (yet)
+ if ((mode & std::ios_base::in) && (mode & std::ios_base::out))
+ return NULL;
+
+ // Build mode string for gzdopen and check it [27.8.1.3.2]
+ char char_mode[6] = "\0\0\0\0\0";
+ if (!this->open_mode(mode, char_mode))
+ return NULL;
+
+ // Attempt to attach to file
+ if ((file = gzdopen(fd, char_mode)) == NULL)
+ return NULL;
+
+ // On success, allocate internal buffer and set flags
+ this->enable_buffer();
+ io_mode = mode;
+ own_fd = false;
+ return this;
+}
+
+// Close gzipped file
+gzfilebuf*
+gzfilebuf::close()
+{
+ // Fail immediately if no file is open
+ if (!this->is_open())
+ return NULL;
+ // Assume success
+ gzfilebuf* retval = this;
+ // Attempt to sync and close gzipped file
+ if (this->sync() == -1)
+ retval = NULL;
+ if (gzclose(file) < 0)
+ retval = NULL;
+ // File is now gone anyway (postcondition [27.8.1.3.8])
+ file = NULL;
+ own_fd = false;
+ // Destroy internal buffer if it exists
+ this->disable_buffer();
+ return retval;
+}
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+// Convert int open mode to mode string
+bool
+gzfilebuf::open_mode(std::ios_base::openmode mode,
+ char* c_mode) const
+{
+ bool testb = mode & std::ios_base::binary;
+ bool testi = mode & std::ios_base::in;
+ bool testo = mode & std::ios_base::out;
+ bool testt = mode & std::ios_base::trunc;
+ bool testa = mode & std::ios_base::app;
+
+ // Check for valid flag combinations - see [27.8.1.3.2] (Table 92)
+ // Original zfstream hardcoded the compression level to maximum here...
+ // Double the time for less than 1% size improvement seems
+ // excessive though - keeping it at the default level
+ // To change back, just append "9" to the next three mode strings
+ if (!testi && testo && !testt && !testa)
+ strcpy(c_mode, "w");
+ if (!testi && testo && !testt && testa)
+ strcpy(c_mode, "a");
+ if (!testi && testo && testt && !testa)
+ strcpy(c_mode, "w");
+ if (testi && !testo && !testt && !testa)
+ strcpy(c_mode, "r");
+ // No read/write mode yet
+// if (testi && testo && !testt && !testa)
+// strcpy(c_mode, "r+");
+// if (testi && testo && testt && !testa)
+// strcpy(c_mode, "w+");
+
+ // Mode string should be empty for invalid combination of flags
+ if (strlen(c_mode) == 0)
+ return false;
+ if (testb)
+ strcat(c_mode, "b");
+ return true;
+}
+
+// Determine number of characters in internal get buffer
+std::streamsize
+gzfilebuf::showmanyc()
+{
+ // Calls to underflow will fail if file not opened for reading
+ if (!this->is_open() || !(io_mode & std::ios_base::in))
+ return -1;
+ // Make sure get area is in use
+ if (this->gptr() && (this->gptr() < this->egptr()))
+ return std::streamsize(this->egptr() - this->gptr());
+ else
+ return 0;
+}
+
+// Fill get area from gzipped file
+gzfilebuf::int_type
+gzfilebuf::underflow()
+{
+ // If something is left in the get area by chance, return it
+ // (this shouldn't normally happen, as underflow is only supposed
+ // to be called when gptr >= egptr, but it serves as error check)
+ if (this->gptr() && (this->gptr() < this->egptr()))
+ return traits_type::to_int_type(*(this->gptr()));
+
+ // If the file hasn't been opened for reading, produce error
+ if (!this->is_open() || !(io_mode & std::ios_base::in))
+ return traits_type::eof();
+
+ // Attempt to fill internal buffer from gzipped file
+ // (buffer must be guaranteed to exist...)
+ int bytes_read = gzread(file, buffer, buffer_size);
+ // Indicates error or EOF
+ if (bytes_read <= 0)
+ {
+ // Reset get area
+ this->setg(buffer, buffer, buffer);
+ return traits_type::eof();
+ }
+ // Make all bytes read from file available as get area
+ this->setg(buffer, buffer, buffer + bytes_read);
+
+ // Return next character in get area
+ return traits_type::to_int_type(*(this->gptr()));
+}
+
+// Write put area to gzipped file
+gzfilebuf::int_type
+gzfilebuf::overflow(int_type c)
+{
+ // Determine whether put area is in use
+ if (this->pbase())
+ {
+ // Double-check pointer range
+ if (this->pptr() > this->epptr() || this->pptr() < this->pbase())
+ return traits_type::eof();
+ // Add extra character to buffer if not EOF
+ if (!traits_type::eq_int_type(c, traits_type::eof()))
+ {
+ *(this->pptr()) = traits_type::to_char_type(c);
+ this->pbump(1);
+ }
+ // Number of characters to write to file
+ int bytes_to_write = this->pptr() - this->pbase();
+ // Overflow doesn't fail if nothing is to be written
+ if (bytes_to_write > 0)
+ {
+ // If the file hasn't been opened for writing, produce error
+ if (!this->is_open() || !(io_mode & std::ios_base::out))
+ return traits_type::eof();
+ // If gzipped file won't accept all bytes written to it, fail
+ if (gzwrite(file, this->pbase(), bytes_to_write) != bytes_to_write)
+ return traits_type::eof();
+ // Reset next pointer to point to pbase on success
+ this->pbump(-bytes_to_write);
+ }
+ }
+ // Write extra character to file if not EOF
+ else if (!traits_type::eq_int_type(c, traits_type::eof()))
+ {
+ // If the file hasn't been opened for writing, produce error
+ if (!this->is_open() || !(io_mode & std::ios_base::out))
+ return traits_type::eof();
+ // Impromptu char buffer (allows "unbuffered" output)
+ char_type last_char = traits_type::to_char_type(c);
+ // If gzipped file won't accept this character, fail
+ if (gzwrite(file, &last_char, 1) != 1)
+ return traits_type::eof();
+ }
+
+ // If you got here, you have succeeded (even if c was EOF)
+ // The return value should therefore be non-EOF
+ if (traits_type::eq_int_type(c, traits_type::eof()))
+ return traits_type::not_eof(c);
+ else
+ return c;
+}
+
+// Assign new buffer
+std::streambuf*
+gzfilebuf::setbuf(char_type* p,
+ std::streamsize n)
+{
+ // First make sure stuff is sync'ed, for safety
+ if (this->sync() == -1)
+ return NULL;
+ // If buffering is turned off on purpose via setbuf(0,0), still allocate one...
+ // "Unbuffered" only really refers to put [27.8.1.4.10], while get needs at
+ // least a buffer of size 1 (very inefficient though, therefore make it bigger?)
+ // This follows from [27.5.2.4.3]/12 (gptr needs to point at something, it seems)
+ if (!p || !n)
+ {
+ // Replace existing buffer (if any) with small internal buffer
+ this->disable_buffer();
+ buffer = NULL;
+ buffer_size = 0;
+ own_buffer = true;
+ this->enable_buffer();
+ }
+ else
+ {
+ // Replace existing buffer (if any) with external buffer
+ this->disable_buffer();
+ buffer = p;
+ buffer_size = n;
+ own_buffer = false;
+ this->enable_buffer();
+ }
+ return this;
+}
+
+// Write put area to gzipped file (i.e. ensures that put area is empty)
+int
+gzfilebuf::sync()
+{
+ return traits_type::eq_int_type(this->overflow(), traits_type::eof()) ? -1 : 0;
+}
+
+/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+// Allocate internal buffer
+void
+gzfilebuf::enable_buffer()
+{
+ // If internal buffer required, allocate one
+ if (own_buffer && !buffer)
+ {
+ // Check for buffered vs. "unbuffered"
+ if (buffer_size > 0)
+ {
+ // Allocate internal buffer
+ buffer = new char_type[buffer_size];
+ // Get area starts empty and will be expanded by underflow as need arises
+ this->setg(buffer, buffer, buffer);
+ // Setup entire internal buffer as put area.
+ // The one-past-end pointer actually points to the last element of the buffer,
+ // so that overflow(c) can safely add the extra character c to the sequence.
+ // These pointers remain in place for the duration of the buffer
+ this->setp(buffer, buffer + buffer_size - 1);
+ }
+ else
+ {
+ // Even in "unbuffered" case, (small?) get buffer is still required
+ buffer_size = SMALLBUFSIZE;
+ buffer = new char_type[buffer_size];
+ this->setg(buffer, buffer, buffer);
+ // "Unbuffered" means no put buffer
+ this->setp(0, 0);
+ }
+ }
+ else
+ {
+ // If buffer already allocated, reset buffer pointers just to make sure no
+ // stale chars are lying around
+ this->setg(buffer, buffer, buffer);
+ this->setp(buffer, buffer + buffer_size - 1);
+ }
+}
+
+// Destroy internal buffer
+void
+gzfilebuf::disable_buffer()
+{
+ // If internal buffer exists, deallocate it
+ if (own_buffer && buffer)
+ {
+ // Preserve unbuffered status by zeroing size
+ if (!this->pbase())
+ buffer_size = 0;
+ delete[] buffer;
+ buffer = NULL;
+ this->setg(0, 0, 0);
+ this->setp(0, 0);
+ }
+ else
+ {
+ // Reset buffer pointers to initial state if external buffer exists
+ this->setg(buffer, buffer, buffer);
+ if (buffer)
+ this->setp(buffer, buffer + buffer_size - 1);
+ else
+ this->setp(0, 0);
+ }
+}
+
+/*****************************************************************************/
+
+// Default constructor initializes stream buffer
+gzifstream::gzifstream()
+: std::istream(NULL), sb()
+{ this->init(&sb); }
+
+// Initialize stream buffer and open file
+gzifstream::gzifstream(const char* name,
+ std::ios_base::openmode mode)
+: std::istream(NULL), sb()
+{
+ this->init(&sb);
+ this->open(name, mode);
+}
+
+// Initialize stream buffer and attach to file
+gzifstream::gzifstream(int fd,
+ std::ios_base::openmode mode)
+: std::istream(NULL), sb()
+{
+ this->init(&sb);
+ this->attach(fd, mode);
+}
+
+// Open file and go into fail() state if unsuccessful
+void
+gzifstream::open(const char* name,
+ std::ios_base::openmode mode)
+{
+ if (!sb.open(name, mode | std::ios_base::in))
+ this->setstate(std::ios_base::failbit);
+ else
+ this->clear();
+}
+
+// Attach to file and go into fail() state if unsuccessful
+void
+gzifstream::attach(int fd,
+ std::ios_base::openmode mode)
+{
+ if (!sb.attach(fd, mode | std::ios_base::in))
+ this->setstate(std::ios_base::failbit);
+ else
+ this->clear();
+}
+
+// Close file
+void
+gzifstream::close()
+{
+ if (!sb.close())
+ this->setstate(std::ios_base::failbit);
+}
+
+/*****************************************************************************/
+
+// Default constructor initializes stream buffer
+gzofstream::gzofstream()
+: std::ostream(NULL), sb()
+{ this->init(&sb); }
+
+// Initialize stream buffer and open file
+gzofstream::gzofstream(const char* name,
+ std::ios_base::openmode mode)
+: std::ostream(NULL), sb()
+{
+ this->init(&sb);
+ this->open(name, mode);
+}
+
+// Initialize stream buffer and attach to file
+gzofstream::gzofstream(int fd,
+ std::ios_base::openmode mode)
+: std::ostream(NULL), sb()
+{
+ this->init(&sb);
+ this->attach(fd, mode);
+}
+
+// Open file and go into fail() state if unsuccessful
+void
+gzofstream::open(const char* name,
+ std::ios_base::openmode mode)
+{
+ if (!sb.open(name, mode | std::ios_base::out))
+ this->setstate(std::ios_base::failbit);
+ else
+ this->clear();
+}
+
+// Attach to file and go into fail() state if unsuccessful
+void
+gzofstream::attach(int fd,
+ std::ios_base::openmode mode)
+{
+ if (!sb.attach(fd, mode | std::ios_base::out))
+ this->setstate(std::ios_base::failbit);
+ else
+ this->clear();
+}
+
+// Close file
+void
+gzofstream::close()
+{
+ if (!sb.close())
+ this->setstate(std::ios_base::failbit);
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.h
new file mode 100644
index 000000000..8574479ae
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/iostream3/zfstream.h
@@ -0,0 +1,466 @@
+/*
+ * A C++ I/O streams interface to the zlib gz* functions
+ *
+ * by Ludwig Schwardt <schwardt@sun.ac.za>
+ * original version by Kevin Ruland <kevin@rodin.wustl.edu>
+ *
+ * This version is standard-compliant and compatible with gcc 3.x.
+ */
+
+#ifndef ZFSTREAM_H
+#define ZFSTREAM_H
+
+#include <istream> // not iostream, since we don't need cin/cout
+#include <ostream>
+#include "zlib.h"
+
+/*****************************************************************************/
+
+/**
+ * @brief Gzipped file stream buffer class.
+ *
+ * This class implements basic_filebuf for gzipped files. It doesn't yet support
+ * seeking (allowed by zlib but slow/limited), putback and read/write access
+ * (tricky). Otherwise, it attempts to be a drop-in replacement for the standard
+ * file streambuf.
+*/
+class gzfilebuf : public std::streambuf
+{
+public:
+ // Default constructor.
+ gzfilebuf();
+
+ // Destructor.
+ virtual
+ ~gzfilebuf();
+
+ /**
+ * @brief Set compression level and strategy on the fly.
+ * @param comp_level Compression level (see zlib.h for allowed values)
+ * @param comp_strategy Compression strategy (see zlib.h for allowed values)
+ * @return Z_OK on success, Z_STREAM_ERROR otherwise.
+ *
+ * Unfortunately, these parameters cannot be modified separately, as the
+ * previous zfstream version assumed. Since the strategy is seldom changed,
+ * it can default and setcompression(level) then becomes like the old
+ * setcompressionlevel(level).
+ */
+ int
+ setcompression(int comp_level,
+ int comp_strategy = Z_DEFAULT_STRATEGY);
+
+ /**
+ * @brief Check if file is open.
+ * @return True if file is open.
+ */
+ bool
+ is_open() const { return (file != NULL); }
+
+ /**
+ * @brief Open gzipped file.
+ * @param name File name.
+ * @param mode Open mode flags.
+ * @return @c this on success, NULL on failure.
+ */
+ gzfilebuf*
+ open(const char* name,
+ std::ios_base::openmode mode);
+
+ /**
+ * @brief Attach to already open gzipped file.
+ * @param fd File descriptor.
+ * @param mode Open mode flags.
+ * @return @c this on success, NULL on failure.
+ */
+ gzfilebuf*
+ attach(int fd,
+ std::ios_base::openmode mode);
+
+ /**
+ * @brief Close gzipped file.
+ * @return @c this on success, NULL on failure.
+ */
+ gzfilebuf*
+ close();
+
+protected:
+ /**
+ * @brief Convert ios open mode int to mode string used by zlib.
+ * @return True if valid mode flag combination.
+ */
+ bool
+ open_mode(std::ios_base::openmode mode,
+ char* c_mode) const;
+
+ /**
+ * @brief Number of characters available in stream buffer.
+ * @return Number of characters.
+ *
+ * This indicates number of characters in get area of stream buffer.
+ * These characters can be read without accessing the gzipped file.
+ */
+ virtual std::streamsize
+ showmanyc();
+
+ /**
+ * @brief Fill get area from gzipped file.
+ * @return First character in get area on success, EOF on error.
+ *
+ * This actually reads characters from gzipped file to stream
+ * buffer. Always buffered.
+ */
+ virtual int_type
+ underflow();
+
+ /**
+ * @brief Write put area to gzipped file.
+ * @param c Extra character to add to buffer contents.
+ * @return Non-EOF on success, EOF on error.
+ *
+ * This actually writes characters in stream buffer to
+ * gzipped file. With unbuffered output this is done one
+ * character at a time.
+ */
+ virtual int_type
+ overflow(int_type c = traits_type::eof());
+
+ /**
+ * @brief Installs external stream buffer.
+ * @param p Pointer to char buffer.
+ * @param n Size of external buffer.
+ * @return @c this on success, NULL on failure.
+ *
+ * Call setbuf(0,0) to enable unbuffered output.
+ */
+ virtual std::streambuf*
+ setbuf(char_type* p,
+ std::streamsize n);
+
+ /**
+ * @brief Flush stream buffer to file.
+ * @return 0 on success, -1 on error.
+ *
+ * This calls underflow(EOF) to do the job.
+ */
+ virtual int
+ sync();
+
+//
+// Some future enhancements
+//
+// virtual int_type uflow();
+// virtual int_type pbackfail(int_type c = traits_type::eof());
+// virtual pos_type
+// seekoff(off_type off,
+// std::ios_base::seekdir way,
+// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
+// virtual pos_type
+// seekpos(pos_type sp,
+// std::ios_base::openmode mode = std::ios_base::in|std::ios_base::out);
+
+private:
+ /**
+ * @brief Allocate internal buffer.
+ *
+ * This function is safe to call multiple times. It will ensure
+ * that a proper internal buffer exists if it is required. If the
+ * buffer already exists or is external, the buffer pointers will be
+ * reset to their original state.
+ */
+ void
+ enable_buffer();
+
+ /**
+ * @brief Destroy internal buffer.
+ *
+ * This function is safe to call multiple times. It will ensure
+ * that the internal buffer is deallocated if it exists. In any
+ * case, it will also reset the buffer pointers.
+ */
+ void
+ disable_buffer();
+
+ /**
+ * Underlying file pointer.
+ */
+ gzFile file;
+
+ /**
+ * Mode in which file was opened.
+ */
+ std::ios_base::openmode io_mode;
+
+ /**
+ * @brief True if this object owns file descriptor.
+ *
+ * This makes the class responsible for closing the file
+ * upon destruction.
+ */
+ bool own_fd;
+
+ /**
+ * @brief Stream buffer.
+ *
+ * For simplicity this remains allocated on the free store for the
+ * entire life span of the gzfilebuf object, unless replaced by setbuf.
+ */
+ char_type* buffer;
+
+ /**
+ * @brief Stream buffer size.
+ *
+ * Defaults to system default buffer size (typically 8192 bytes).
+ * Modified by setbuf.
+ */
+ std::streamsize buffer_size;
+
+ /**
+ * @brief True if this object owns stream buffer.
+ *
+ * This makes the class responsible for deleting the buffer
+ * upon destruction.
+ */
+ bool own_buffer;
+};
+
+/*****************************************************************************/
+
+/**
+ * @brief Gzipped file input stream class.
+ *
+ * This class implements ifstream for gzipped files. Seeking and putback
+ * is not supported yet.
+*/
+class gzifstream : public std::istream
+{
+public:
+ // Default constructor
+ gzifstream();
+
+ /**
+ * @brief Construct stream on gzipped file to be opened.
+ * @param name File name.
+ * @param mode Open mode flags (forced to contain ios::in).
+ */
+ explicit
+ gzifstream(const char* name,
+ std::ios_base::openmode mode = std::ios_base::in);
+
+ /**
+ * @brief Construct stream on already open gzipped file.
+ * @param fd File descriptor.
+ * @param mode Open mode flags (forced to contain ios::in).
+ */
+ explicit
+ gzifstream(int fd,
+ std::ios_base::openmode mode = std::ios_base::in);
+
+ /**
+ * Obtain underlying stream buffer.
+ */
+ gzfilebuf*
+ rdbuf() const
+ { return const_cast<gzfilebuf*>(&sb); }
+
+ /**
+ * @brief Check if file is open.
+ * @return True if file is open.
+ */
+ bool
+ is_open() { return sb.is_open(); }
+
+ /**
+ * @brief Open gzipped file.
+ * @param name File name.
+ * @param mode Open mode flags (forced to contain ios::in).
+ *
+ * Stream will be in state good() if file opens successfully;
+ * otherwise in state fail(). This differs from the behavior of
+ * ifstream, which never sets the state to good() and therefore
+ * won't allow you to reuse the stream for a second file unless
+ * you manually clear() the state. The choice is a matter of
+ * convenience.
+ */
+ void
+ open(const char* name,
+ std::ios_base::openmode mode = std::ios_base::in);
+
+ /**
+ * @brief Attach to already open gzipped file.
+ * @param fd File descriptor.
+ * @param mode Open mode flags (forced to contain ios::in).
+ *
+ * Stream will be in state good() if attach succeeded; otherwise
+ * in state fail().
+ */
+ void
+ attach(int fd,
+ std::ios_base::openmode mode = std::ios_base::in);
+
+ /**
+ * @brief Close gzipped file.
+ *
+ * Stream will be in state fail() if close failed.
+ */
+ void
+ close();
+
+private:
+ /**
+ * Underlying stream buffer.
+ */
+ gzfilebuf sb;
+};
+
+/*****************************************************************************/
+
+/**
+ * @brief Gzipped file output stream class.
+ *
+ * This class implements ofstream for gzipped files. Seeking and putback
+ * is not supported yet.
+*/
+class gzofstream : public std::ostream
+{
+public:
+ // Default constructor
+ gzofstream();
+
+ /**
+ * @brief Construct stream on gzipped file to be opened.
+ * @param name File name.
+ * @param mode Open mode flags (forced to contain ios::out).
+ */
+ explicit
+ gzofstream(const char* name,
+ std::ios_base::openmode mode = std::ios_base::out);
+
+ /**
+ * @brief Construct stream on already open gzipped file.
+ * @param fd File descriptor.
+ * @param mode Open mode flags (forced to contain ios::out).
+ */
+ explicit
+ gzofstream(int fd,
+ std::ios_base::openmode mode = std::ios_base::out);
+
+ /**
+ * Obtain underlying stream buffer.
+ */
+ gzfilebuf*
+ rdbuf() const
+ { return const_cast<gzfilebuf*>(&sb); }
+
+ /**
+ * @brief Check if file is open.
+ * @return True if file is open.
+ */
+ bool
+ is_open() { return sb.is_open(); }
+
+ /**
+ * @brief Open gzipped file.
+ * @param name File name.
+ * @param mode Open mode flags (forced to contain ios::out).
+ *
+ * Stream will be in state good() if file opens successfully;
+ * otherwise in state fail(). This differs from the behavior of
+ * ofstream, which never sets the state to good() and therefore
+ * won't allow you to reuse the stream for a second file unless
+ * you manually clear() the state. The choice is a matter of
+ * convenience.
+ */
+ void
+ open(const char* name,
+ std::ios_base::openmode mode = std::ios_base::out);
+
+ /**
+ * @brief Attach to already open gzipped file.
+ * @param fd File descriptor.
+ * @param mode Open mode flags (forced to contain ios::out).
+ *
+ * Stream will be in state good() if attach succeeded; otherwise
+ * in state fail().
+ */
+ void
+ attach(int fd,
+ std::ios_base::openmode mode = std::ios_base::out);
+
+ /**
+ * @brief Close gzipped file.
+ *
+ * Stream will be in state fail() if close failed.
+ */
+ void
+ close();
+
+private:
+ /**
+ * Underlying stream buffer.
+ */
+ gzfilebuf sb;
+};
+
+/*****************************************************************************/
+
+/**
+ * @brief Gzipped file output stream manipulator class.
+ *
+ * This class defines a two-argument manipulator for gzofstream. It is used
+ * as base for the setcompression(int,int) manipulator.
+*/
+template<typename T1, typename T2>
+ class gzomanip2
+ {
+ public:
+ // Allows insertor to peek at internals
+ template <typename Ta, typename Tb>
+ friend gzofstream&
+ operator<<(gzofstream&,
+ const gzomanip2<Ta,Tb>&);
+
+ // Constructor
+ gzomanip2(gzofstream& (*f)(gzofstream&, T1, T2),
+ T1 v1,
+ T2 v2);
+ private:
+ // Underlying manipulator function
+ gzofstream&
+ (*func)(gzofstream&, T1, T2);
+
+ // Arguments for manipulator function
+ T1 val1;
+ T2 val2;
+ };
+
+/*****************************************************************************/
+
+// Manipulator function thunks through to stream buffer
+inline gzofstream&
+setcompression(gzofstream &gzs, int l, int s = Z_DEFAULT_STRATEGY)
+{
+ (gzs.rdbuf())->setcompression(l, s);
+ return gzs;
+}
+
+// Manipulator constructor stores arguments
+template<typename T1, typename T2>
+ inline
+ gzomanip2<T1,T2>::gzomanip2(gzofstream &(*f)(gzofstream &, T1, T2),
+ T1 v1,
+ T2 v2)
+ : func(f), val1(v1), val2(v2)
+ { }
+
+// Insertor applies underlying manipulator function to stream
+template<typename T1, typename T2>
+ inline gzofstream&
+ operator<<(gzofstream& s, const gzomanip2<T1,T2>& m)
+ { return (*m.func)(s, m.val1, m.val2); }
+
+// Insert this onto stream to simplify setting of compression level
+inline gzomanip2<int,int>
+setcompression(int l, int s = Z_DEFAULT_STRATEGY)
+{ return gzomanip2<int,int>(&setcompression, l, s); }
+
+#endif // ZFSTREAM_H
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/bld_ml64.bat b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/bld_ml64.bat
new file mode 100644
index 000000000..f74bcef5b
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/bld_ml64.bat
@@ -0,0 +1,2 @@
+ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
+ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/gvmat64.asm b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/gvmat64.asm
new file mode 100644
index 000000000..c1817f1be
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/gvmat64.asm
@@ -0,0 +1,553 @@
+;uInt longest_match_x64(
+; deflate_state *s,
+; IPos cur_match); /* current match */
+
+; gvmat64.asm -- Asm portion of the optimized longest_match for 32 bits x86_64
+; (AMD64 on Athlon 64, Opteron, Phenom
+; and Intel EM64T on Pentium 4 with EM64T, Pentium D, Core 2 Duo, Core I5/I7)
+; Copyright (C) 1995-2010 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
+;
+; File written by Gilles Vollant, by converting to assembly the longest_match
+; from Jean-loup Gailly in deflate.c of zLib and infoZip zip.
+;
+; and by taking inspiration on asm686 with masm, optimised assembly code
+; from Brian Raiter, written 1998
+;
+; This software is provided 'as-is', without any express or implied
+; warranty. In no event will the authors be held liable for any damages
+; arising from the use of this software.
+;
+; Permission is granted to anyone to use this software for any purpose,
+; including commercial applications, and to alter it and redistribute it
+; freely, subject to the following restrictions:
+;
+; 1. The origin of this software must not be misrepresented; you must not
+; claim that you wrote the original software. If you use this software
+; in a product, an acknowledgment in the product documentation would be
+; appreciated but is not required.
+; 2. Altered source versions must be plainly marked as such, and must not be
+; misrepresented as being the original software
+; 3. This notice may not be removed or altered from any source distribution.
+;
+;
+;
+; http://www.zlib.net
+; http://www.winimage.com/zLibDll
+; http://www.muppetlabs.com/~breadbox/software/assembly.html
+;
+; to compile this file for infozip Zip, I use option:
+; ml64.exe /Flgvmat64 /c /Zi /DINFOZIP gvmat64.asm
+;
+; to compile this file for zLib, I use option:
+; ml64.exe /Flgvmat64 /c /Zi gvmat64.asm
+; Be carrefull to adapt zlib1222add below to your version of zLib
+; (if you use a version of zLib before 1.0.4 or after 1.2.2.2, change
+; value of zlib1222add later)
+;
+; This file compile with Microsoft Macro Assembler (x64) for AMD64
+;
+; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
+;
+; (you can get Windows WDK with ml64 for AMD64 from
+; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
+;
+
+
+;uInt longest_match(s, cur_match)
+; deflate_state *s;
+; IPos cur_match; /* current match */
+.code
+longest_match PROC
+
+
+;LocalVarsSize equ 88
+ LocalVarsSize equ 72
+
+; register used : rax,rbx,rcx,rdx,rsi,rdi,r8,r9,r10,r11,r12
+; free register : r14,r15
+; register can be saved : rsp
+
+ chainlenwmask equ rsp + 8 - LocalVarsSize ; high word: current chain len
+ ; low word: s->wmask
+;window equ rsp + xx - LocalVarsSize ; local copy of s->window ; stored in r10
+;windowbestlen equ rsp + xx - LocalVarsSize ; s->window + bestlen , use r10+r11
+;scanstart equ rsp + xx - LocalVarsSize ; first two bytes of string ; stored in r12w
+;scanend equ rsp + xx - LocalVarsSize ; last two bytes of string use ebx
+;scanalign equ rsp + xx - LocalVarsSize ; dword-misalignment of string r13
+;bestlen equ rsp + xx - LocalVarsSize ; size of best match so far -> r11d
+;scan equ rsp + xx - LocalVarsSize ; ptr to string wanting match -> r9
+IFDEF INFOZIP
+ELSE
+ nicematch equ (rsp + 16 - LocalVarsSize) ; a good enough match size
+ENDIF
+
+save_rdi equ rsp + 24 - LocalVarsSize
+save_rsi equ rsp + 32 - LocalVarsSize
+save_rbx equ rsp + 40 - LocalVarsSize
+save_rbp equ rsp + 48 - LocalVarsSize
+save_r12 equ rsp + 56 - LocalVarsSize
+save_r13 equ rsp + 64 - LocalVarsSize
+;save_r14 equ rsp + 72 - LocalVarsSize
+;save_r15 equ rsp + 80 - LocalVarsSize
+
+
+; summary of register usage
+; scanend ebx
+; scanendw bx
+; chainlenwmask edx
+; curmatch rsi
+; curmatchd esi
+; windowbestlen r8
+; scanalign r9
+; scanalignd r9d
+; window r10
+; bestlen r11
+; bestlend r11d
+; scanstart r12d
+; scanstartw r12w
+; scan r13
+; nicematch r14d
+; limit r15
+; limitd r15d
+; prev rcx
+
+; all the +4 offsets are due to the addition of pending_buf_size (in zlib
+; in the deflate_state structure since the asm code was first written
+; (if you compile with zlib 1.0.4 or older, remove the +4).
+; Note : these value are good with a 8 bytes boundary pack structure
+
+
+ MAX_MATCH equ 258
+ MIN_MATCH equ 3
+ MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
+
+
+;;; Offsets for fields in the deflate_state structure. These numbers
+;;; are calculated from the definition of deflate_state, with the
+;;; assumption that the compiler will dword-align the fields. (Thus,
+;;; changing the definition of deflate_state could easily cause this
+;;; program to crash horribly, without so much as a warning at
+;;; compile time. Sigh.)
+
+; all the +zlib1222add offsets are due to the addition of fields
+; in zlib in the deflate_state structure since the asm code was first written
+; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
+; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
+; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
+
+
+IFDEF INFOZIP
+
+_DATA SEGMENT
+COMM window_size:DWORD
+; WMask ; 7fff
+COMM window:BYTE:010040H
+COMM prev:WORD:08000H
+; MatchLen : unused
+; PrevMatch : unused
+COMM strstart:DWORD
+COMM match_start:DWORD
+; Lookahead : ignore
+COMM prev_length:DWORD ; PrevLen
+COMM max_chain_length:DWORD
+COMM good_match:DWORD
+COMM nice_match:DWORD
+prev_ad equ OFFSET prev
+window_ad equ OFFSET window
+nicematch equ nice_match
+_DATA ENDS
+WMask equ 07fffh
+
+ELSE
+
+ IFNDEF zlib1222add
+ zlib1222add equ 8
+ ENDIF
+dsWSize equ 56+zlib1222add+(zlib1222add/2)
+dsWMask equ 64+zlib1222add+(zlib1222add/2)
+dsWindow equ 72+zlib1222add
+dsPrev equ 88+zlib1222add
+dsMatchLen equ 128+zlib1222add
+dsPrevMatch equ 132+zlib1222add
+dsStrStart equ 140+zlib1222add
+dsMatchStart equ 144+zlib1222add
+dsLookahead equ 148+zlib1222add
+dsPrevLen equ 152+zlib1222add
+dsMaxChainLen equ 156+zlib1222add
+dsGoodMatch equ 172+zlib1222add
+dsNiceMatch equ 176+zlib1222add
+
+window_size equ [ rcx + dsWSize]
+WMask equ [ rcx + dsWMask]
+window_ad equ [ rcx + dsWindow]
+prev_ad equ [ rcx + dsPrev]
+strstart equ [ rcx + dsStrStart]
+match_start equ [ rcx + dsMatchStart]
+Lookahead equ [ rcx + dsLookahead] ; 0ffffffffh on infozip
+prev_length equ [ rcx + dsPrevLen]
+max_chain_length equ [ rcx + dsMaxChainLen]
+good_match equ [ rcx + dsGoodMatch]
+nice_match equ [ rcx + dsNiceMatch]
+ENDIF
+
+; parameter 1 in r8(deflate state s), param 2 in rdx (cur match)
+
+; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
+; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
+;
+; All registers must be preserved across the call, except for
+; rax, rcx, rdx, r8, r9, r10, and r11, which are scratch.
+
+
+
+;;; Save registers that the compiler may be using, and adjust esp to
+;;; make room for our stack frame.
+
+
+;;; Retrieve the function arguments. r8d will hold cur_match
+;;; throughout the entire function. edx will hold the pointer to the
+;;; deflate_state structure during the function's setup (before
+;;; entering the main loop.
+
+; parameter 1 in rcx (deflate_state* s), param 2 in edx -> r8 (cur match)
+
+; this clear high 32 bits of r8, which can be garbage in both r8 and rdx
+
+ mov [save_rdi],rdi
+ mov [save_rsi],rsi
+ mov [save_rbx],rbx
+ mov [save_rbp],rbp
+IFDEF INFOZIP
+ mov r8d,ecx
+ELSE
+ mov r8d,edx
+ENDIF
+ mov [save_r12],r12
+ mov [save_r13],r13
+; mov [save_r14],r14
+; mov [save_r15],r15
+
+
+;;; uInt wmask = s->w_mask;
+;;; unsigned chain_length = s->max_chain_length;
+;;; if (s->prev_length >= s->good_match) {
+;;; chain_length >>= 2;
+;;; }
+
+ mov edi, prev_length
+ mov esi, good_match
+ mov eax, WMask
+ mov ebx, max_chain_length
+ cmp edi, esi
+ jl LastMatchGood
+ shr ebx, 2
+LastMatchGood:
+
+;;; chainlen is decremented once beforehand so that the function can
+;;; use the sign flag instead of the zero flag for the exit test.
+;;; It is then shifted into the high word, to make room for the wmask
+;;; value, which it will always accompany.
+
+ dec ebx
+ shl ebx, 16
+ or ebx, eax
+
+;;; on zlib only
+;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+IFDEF INFOZIP
+ mov [chainlenwmask], ebx
+; on infozip nice_match = [nice_match]
+ELSE
+ mov eax, nice_match
+ mov [chainlenwmask], ebx
+ mov r10d, Lookahead
+ cmp r10d, eax
+ cmovnl r10d, eax
+ mov [nicematch],r10d
+ENDIF
+
+;;; register Bytef *scan = s->window + s->strstart;
+ mov r10, window_ad
+ mov ebp, strstart
+ lea r13, [r10 + rbp]
+
+;;; Determine how many bytes the scan ptr is off from being
+;;; dword-aligned.
+
+ mov r9,r13
+ neg r13
+ and r13,3
+
+;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
+IFDEF INFOZIP
+ mov eax,07efah ; MAX_DIST = (WSIZE-MIN_LOOKAHEAD) (0x8000-(3+8+1))
+ELSE
+ mov eax, window_size
+ sub eax, MIN_LOOKAHEAD
+ENDIF
+ xor edi,edi
+ sub ebp, eax
+
+ mov r11d, prev_length
+
+ cmovng ebp,edi
+
+;;; int best_len = s->prev_length;
+
+
+;;; Store the sum of s->window + best_len in esi locally, and in esi.
+
+ lea rsi,[r10+r11]
+
+;;; register ush scan_start = *(ushf*)scan;
+;;; register ush scan_end = *(ushf*)(scan+best_len-1);
+;;; Posf *prev = s->prev;
+
+ movzx r12d,word ptr [r9]
+ movzx ebx, word ptr [r9 + r11 - 1]
+
+ mov rdi, prev_ad
+
+;;; Jump into the main loop.
+
+ mov edx, [chainlenwmask]
+
+ cmp bx,word ptr [rsi + r8 - 1]
+ jz LookupLoopIsZero
+
+LookupLoop1:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ jbe LeaveNow
+ sub edx, 00010000h
+ js LeaveNow
+
+LoopEntry1:
+ cmp bx,word ptr [rsi + r8 - 1]
+ jz LookupLoopIsZero
+
+LookupLoop2:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ jbe LeaveNow
+ sub edx, 00010000h
+ js LeaveNow
+
+LoopEntry2:
+ cmp bx,word ptr [rsi + r8 - 1]
+ jz LookupLoopIsZero
+
+LookupLoop4:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ jbe LeaveNow
+ sub edx, 00010000h
+ js LeaveNow
+
+LoopEntry4:
+
+ cmp bx,word ptr [rsi + r8 - 1]
+ jnz LookupLoop1
+ jmp LookupLoopIsZero
+
+
+;;; do {
+;;; match = s->window + cur_match;
+;;; if (*(ushf*)(match+best_len-1) != scan_end ||
+;;; *(ushf*)match != scan_start) continue;
+;;; [...]
+;;; } while ((cur_match = prev[cur_match & wmask]) > limit
+;;; && --chain_length != 0);
+;;;
+;;; Here is the inner loop of the function. The function will spend the
+;;; majority of its time in this loop, and majority of that time will
+;;; be spent in the first ten instructions.
+;;;
+;;; Within this loop:
+;;; ebx = scanend
+;;; r8d = curmatch
+;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
+;;; esi = windowbestlen - i.e., (window + bestlen)
+;;; edi = prev
+;;; ebp = limit
+
+LookupLoop:
+ and r8d, edx
+
+ movzx r8d, word ptr [rdi + r8*2]
+ cmp r8d, ebp
+ jbe LeaveNow
+ sub edx, 00010000h
+ js LeaveNow
+
+LoopEntry:
+
+ cmp bx,word ptr [rsi + r8 - 1]
+ jnz LookupLoop1
+LookupLoopIsZero:
+ cmp r12w, word ptr [r10 + r8]
+ jnz LookupLoop1
+
+
+;;; Store the current value of chainlen.
+ mov [chainlenwmask], edx
+
+;;; Point edi to the string under scrutiny, and esi to the string we
+;;; are hoping to match it up with. In actuality, esi and edi are
+;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
+;;; initialized to -(MAX_MATCH_8 - scanalign).
+
+ lea rsi,[r8+r10]
+ mov rdx, 0fffffffffffffef8h; -(MAX_MATCH_8)
+ lea rsi, [rsi + r13 + 0108h] ;MAX_MATCH_8]
+ lea rdi, [r9 + r13 + 0108h] ;MAX_MATCH_8]
+
+ prefetcht1 [rsi+rdx]
+ prefetcht1 [rdi+rdx]
+
+
+;;; Test the strings for equality, 8 bytes at a time. At the end,
+;;; adjust rdx so that it is offset to the exact byte that mismatched.
+;;;
+;;; We already know at this point that the first three bytes of the
+;;; strings match each other, and they can be safely passed over before
+;;; starting the compare loop. So what this code does is skip over 0-3
+;;; bytes, as much as necessary in order to dword-align the edi
+;;; pointer. (rsi will still be misaligned three times out of four.)
+;;;
+;;; It should be confessed that this loop usually does not represent
+;;; much of the total running time. Replacing it with a more
+;;; straightforward "rep cmpsb" would not drastically degrade
+;;; performance.
+
+
+LoopCmps:
+ mov rax, [rsi + rdx]
+ xor rax, [rdi + rdx]
+ jnz LeaveLoopCmps
+
+ mov rax, [rsi + rdx + 8]
+ xor rax, [rdi + rdx + 8]
+ jnz LeaveLoopCmps8
+
+
+ mov rax, [rsi + rdx + 8+8]
+ xor rax, [rdi + rdx + 8+8]
+ jnz LeaveLoopCmps16
+
+ add rdx,8+8+8
+
+ jnz short LoopCmps
+ jmp short LenMaximum
+LeaveLoopCmps16: add rdx,8
+LeaveLoopCmps8: add rdx,8
+LeaveLoopCmps:
+
+ test eax, 0000FFFFh
+ jnz LenLower
+
+ test eax,0ffffffffh
+
+ jnz LenLower32
+
+ add rdx,4
+ shr rax,32
+ or ax,ax
+ jnz LenLower
+
+LenLower32:
+ shr eax,16
+ add rdx,2
+LenLower: sub al, 1
+ adc rdx, 0
+;;; Calculate the length of the match. If it is longer than MAX_MATCH,
+;;; then automatically accept it as the best possible match and leave.
+
+ lea rax, [rdi + rdx]
+ sub rax, r9
+ cmp eax, MAX_MATCH
+ jge LenMaximum
+
+;;; If the length of the match is not longer than the best match we
+;;; have so far, then forget it and return to the lookup loop.
+;///////////////////////////////////
+
+ cmp eax, r11d
+ jg LongerMatch
+
+ lea rsi,[r10+r11]
+
+ mov rdi, prev_ad
+ mov edx, [chainlenwmask]
+ jmp LookupLoop
+
+;;; s->match_start = cur_match;
+;;; best_len = len;
+;;; if (len >= nice_match) break;
+;;; scan_end = *(ushf*)(scan+best_len-1);
+
+LongerMatch:
+ mov r11d, eax
+ mov match_start, r8d
+ cmp eax, [nicematch]
+ jge LeaveNow
+
+ lea rsi,[r10+rax]
+
+ movzx ebx, word ptr [r9 + rax - 1]
+ mov rdi, prev_ad
+ mov edx, [chainlenwmask]
+ jmp LookupLoop
+
+;;; Accept the current string, with the maximum possible length.
+
+LenMaximum:
+ mov r11d,MAX_MATCH
+ mov match_start, r8d
+
+;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+;;; return s->lookahead;
+
+LeaveNow:
+IFDEF INFOZIP
+ mov eax,r11d
+ELSE
+ mov eax, Lookahead
+ cmp r11d, eax
+ cmovng eax, r11d
+ENDIF
+
+;;; Restore the stack and return from whence we came.
+
+
+ mov rsi,[save_rsi]
+ mov rdi,[save_rdi]
+ mov rbx,[save_rbx]
+ mov rbp,[save_rbp]
+ mov r12,[save_r12]
+ mov r13,[save_r13]
+; mov r14,[save_r14]
+; mov r15,[save_r15]
+
+
+ ret 0
+; please don't remove this string !
+; Your can freely use gvmat64 in any free or commercial app
+; but it is far better don't remove the string in the binary!
+ db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998, converted to amd 64 by Gilles Vollant 2005",0dh,0ah,0
+longest_match ENDP
+
+match_init PROC
+ ret 0
+match_init ENDP
+
+
+END
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffas8664.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffas8664.c
new file mode 100644
index 000000000..aa861a333
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffas8664.c
@@ -0,0 +1,186 @@
+/* inffas8664.c is a hand tuned assembler version of inffast.c - fast decoding
+ * version for AMD64 on Windows using Microsoft C compiler
+ *
+ * Copyright (C) 1995-2003 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Copyright (C) 2003 Chris Anderson <christop@charm.net>
+ * Please use the copyright conditions above.
+ *
+ * 2005 - Adaptation to Microsoft C Compiler for AMD64 by Gilles Vollant
+ *
+ * inffas8664.c call function inffas8664fnc in inffasx64.asm
+ * inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
+ *
+ * Dec-29-2003 -- I added AMD64 inflate asm support. This version is also
+ * slightly quicker on x86 systems because, instead of using rep movsb to copy
+ * data, it uses rep movsw, which moves data in 2-byte chunks instead of single
+ * bytes. I've tested the AMD64 code on a Fedora Core 1 + the x86_64 updates
+ * from http://fedora.linux.duke.edu/fc1_x86_64
+ * which is running on an Athlon 64 3000+ / Gigabyte GA-K8VT800M system with
+ * 1GB ram. The 64-bit version is about 4% faster than the 32-bit version,
+ * when decompressing mozilla-source-1.3.tar.gz.
+ *
+ * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
+ * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at
+ * the moment. I have successfully compiled and tested this code with gcc2.96,
+ * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S
+ * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
+ * enabled. I will attempt to merge the MMX code into this version. Newer
+ * versions of this and inffast.S can be found at
+ * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
+ *
+ */
+
+#include <stdio.h>
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+/* Mark Adler's comments from inffast.c: */
+
+/*
+ Decode literal, length, and distance codes and write out the resulting
+ literal and match bytes until either not enough input or output is
+ available, an end-of-block is encountered, or a data error is encountered.
+ When large enough input and output buffers are supplied to inflate(), for
+ example, a 16K input buffer and a 64K output buffer, more than 95% of the
+ inflate execution time is spent in this routine.
+
+ Entry assumptions:
+
+ state->mode == LEN
+ strm->avail_in >= 6
+ strm->avail_out >= 258
+ start >= strm->avail_out
+ state->bits < 8
+
+ On return, state->mode is one of:
+
+ LEN -- ran out of enough output space or enough available input
+ TYPE -- reached end of block code, inflate() to interpret next block
+ BAD -- error in block data
+
+ Notes:
+
+ - The maximum input bits used by a length/distance pair is 15 bits for the
+ length code, 5 bits for the length extra, 15 bits for the distance code,
+ and 13 bits for the distance extra. This totals 48 bits, or six bytes.
+ Therefore if strm->avail_in >= 6, then there is enough input to avoid
+ checking for available input while decoding.
+
+ - The maximum bytes that a single length/distance pair can output is 258
+ bytes, which is the maximum length that can be coded. inflate_fast()
+ requires strm->avail_out >= 258 for each loop to avoid checking for
+ output space.
+ */
+
+
+
+ typedef struct inffast_ar {
+/* 64 32 x86 x86_64 */
+/* ar offset register */
+/* 0 0 */ void *esp; /* esp save */
+/* 8 4 */ void *ebp; /* ebp save */
+/* 16 8 */ unsigned char FAR *in; /* esi rsi local strm->next_in */
+/* 24 12 */ unsigned char FAR *last; /* r9 while in < last */
+/* 32 16 */ unsigned char FAR *out; /* edi rdi local strm->next_out */
+/* 40 20 */ unsigned char FAR *beg; /* inflate()'s init next_out */
+/* 48 24 */ unsigned char FAR *end; /* r10 while out < end */
+/* 56 28 */ unsigned char FAR *window;/* size of window, wsize!=0 */
+/* 64 32 */ code const FAR *lcode; /* ebp rbp local strm->lencode */
+/* 72 36 */ code const FAR *dcode; /* r11 local strm->distcode */
+/* 80 40 */ size_t /*unsigned long */hold; /* edx rdx local strm->hold */
+/* 88 44 */ unsigned bits; /* ebx rbx local strm->bits */
+/* 92 48 */ unsigned wsize; /* window size */
+/* 96 52 */ unsigned write; /* window write index */
+/*100 56 */ unsigned lmask; /* r12 mask for lcode */
+/*104 60 */ unsigned dmask; /* r13 mask for dcode */
+/*108 64 */ unsigned len; /* r14 match length */
+/*112 68 */ unsigned dist; /* r15 match distance */
+/*116 72 */ unsigned status; /* set when state chng*/
+ } type_ar;
+#ifdef ASMINF
+
+void inflate_fast(strm, start)
+z_streamp strm;
+unsigned start; /* inflate()'s starting value for strm->avail_out */
+{
+ struct inflate_state FAR *state;
+ type_ar ar;
+ void inffas8664fnc(struct inffast_ar * par);
+
+
+
+#if (defined( __GNUC__ ) && defined( __amd64__ ) && ! defined( __i386 )) || (defined(_MSC_VER) && defined(_M_AMD64))
+#define PAD_AVAIL_IN 6
+#define PAD_AVAIL_OUT 258
+#else
+#define PAD_AVAIL_IN 5
+#define PAD_AVAIL_OUT 257
+#endif
+
+ /* copy state to local variables */
+ state = (struct inflate_state FAR *)strm->state;
+
+ ar.in = strm->next_in;
+ ar.last = ar.in + (strm->avail_in - PAD_AVAIL_IN);
+ ar.out = strm->next_out;
+ ar.beg = ar.out - (start - strm->avail_out);
+ ar.end = ar.out + (strm->avail_out - PAD_AVAIL_OUT);
+ ar.wsize = state->wsize;
+ ar.write = state->wnext;
+ ar.window = state->window;
+ ar.hold = state->hold;
+ ar.bits = state->bits;
+ ar.lcode = state->lencode;
+ ar.dcode = state->distcode;
+ ar.lmask = (1U << state->lenbits) - 1;
+ ar.dmask = (1U << state->distbits) - 1;
+
+ /* decode literals and length/distances until end-of-block or not enough
+ input data or output space */
+
+ /* align in on 1/2 hold size boundary */
+ while (((size_t)(void *)ar.in & (sizeof(ar.hold) / 2 - 1)) != 0) {
+ ar.hold += (unsigned long)*ar.in++ << ar.bits;
+ ar.bits += 8;
+ }
+
+ inffas8664fnc(&ar);
+
+ if (ar.status > 1) {
+ if (ar.status == 2)
+ strm->msg = "invalid literal/length code";
+ else if (ar.status == 3)
+ strm->msg = "invalid distance code";
+ else
+ strm->msg = "invalid distance too far back";
+ state->mode = BAD;
+ }
+ else if ( ar.status == 1 ) {
+ state->mode = TYPE;
+ }
+
+ /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+ ar.len = ar.bits >> 3;
+ ar.in -= ar.len;
+ ar.bits -= ar.len << 3;
+ ar.hold &= (1U << ar.bits) - 1;
+
+ /* update state and return */
+ strm->next_in = ar.in;
+ strm->next_out = ar.out;
+ strm->avail_in = (unsigned)(ar.in < ar.last ?
+ PAD_AVAIL_IN + (ar.last - ar.in) :
+ PAD_AVAIL_IN - (ar.in - ar.last));
+ strm->avail_out = (unsigned)(ar.out < ar.end ?
+ PAD_AVAIL_OUT + (ar.end - ar.out) :
+ PAD_AVAIL_OUT - (ar.out - ar.end));
+ state->hold = (unsigned long)ar.hold;
+ state->bits = ar.bits;
+ return;
+}
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffasx64.asm b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffasx64.asm
new file mode 100644
index 000000000..41ec82392
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/inffasx64.asm
@@ -0,0 +1,396 @@
+; inffasx64.asm is a hand tuned assembler version of inffast.c - fast decoding
+; version for AMD64 on Windows using Microsoft C compiler
+;
+; inffasx64.asm is automatically convert from AMD64 portion of inffas86.c
+; inffasx64.asm is called by inffas8664.c, which contain more info.
+
+
+; to compile this file, I use option
+; ml64.exe /Flinffasx64 /c /Zi inffasx64.asm
+; with Microsoft Macro Assembler (x64) for AMD64
+;
+
+; This file compile with Microsoft Macro Assembler (x64) for AMD64
+;
+; ml64.exe is given with Visual Studio 2005/2008/2010 and Windows WDK
+;
+; (you can get Windows WDK with ml64 for AMD64 from
+; http://www.microsoft.com/whdc/Devtools/wdk/default.mspx for low price)
+;
+
+
+.code
+inffas8664fnc PROC
+
+; see http://weblogs.asp.net/oldnewthing/archive/2004/01/14/58579.aspx and
+; http://msdn.microsoft.com/library/en-us/kmarch/hh/kmarch/64bitAMD_8e951dd2-ee77-4728-8702-55ce4b5dd24a.xml.asp
+;
+; All registers must be preserved across the call, except for
+; rax, rcx, rdx, r8, r-9, r10, and r11, which are scratch.
+
+
+ mov [rsp-8],rsi
+ mov [rsp-16],rdi
+ mov [rsp-24],r12
+ mov [rsp-32],r13
+ mov [rsp-40],r14
+ mov [rsp-48],r15
+ mov [rsp-56],rbx
+
+ mov rax,rcx
+
+ mov [rax+8], rbp ; /* save regs rbp and rsp */
+ mov [rax], rsp
+
+ mov rsp, rax ; /* make rsp point to &ar */
+
+ mov rsi, [rsp+16] ; /* rsi = in */
+ mov rdi, [rsp+32] ; /* rdi = out */
+ mov r9, [rsp+24] ; /* r9 = last */
+ mov r10, [rsp+48] ; /* r10 = end */
+ mov rbp, [rsp+64] ; /* rbp = lcode */
+ mov r11, [rsp+72] ; /* r11 = dcode */
+ mov rdx, [rsp+80] ; /* rdx = hold */
+ mov ebx, [rsp+88] ; /* ebx = bits */
+ mov r12d, [rsp+100] ; /* r12d = lmask */
+ mov r13d, [rsp+104] ; /* r13d = dmask */
+ ; /* r14d = len */
+ ; /* r15d = dist */
+
+
+ cld
+ cmp r10, rdi
+ je L_one_time ; /* if only one decode left */
+ cmp r9, rsi
+
+ jne L_do_loop
+
+
+L_one_time:
+ mov r8, r12 ; /* r8 = lmask */
+ cmp bl, 32
+ ja L_get_length_code_one_time
+
+ lodsd ; /* eax = *(uint *)in++ */
+ mov cl, bl ; /* cl = bits, needs it for shifting */
+ add bl, 32 ; /* bits += 32 */
+ shl rax, cl
+ or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
+ jmp L_get_length_code_one_time
+
+ALIGN 4
+L_while_test:
+ cmp r10, rdi
+ jbe L_break_loop
+ cmp r9, rsi
+ jbe L_break_loop
+
+L_do_loop:
+ mov r8, r12 ; /* r8 = lmask */
+ cmp bl, 32
+ ja L_get_length_code ; /* if (32 < bits) */
+
+ lodsd ; /* eax = *(uint *)in++ */
+ mov cl, bl ; /* cl = bits, needs it for shifting */
+ add bl, 32 ; /* bits += 32 */
+ shl rax, cl
+ or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
+
+L_get_length_code:
+ and r8, rdx ; /* r8 &= hold */
+ mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */
+
+ mov cl, ah ; /* cl = this.bits */
+ sub bl, ah ; /* bits -= this.bits */
+ shr rdx, cl ; /* hold >>= this.bits */
+
+ test al, al
+ jnz L_test_for_length_base ; /* if (op != 0) 45.7% */
+
+ mov r8, r12 ; /* r8 = lmask */
+ shr eax, 16 ; /* output this.val char */
+ stosb
+
+L_get_length_code_one_time:
+ and r8, rdx ; /* r8 &= hold */
+ mov eax, [rbp+r8*4] ; /* eax = lcode[hold & lmask] */
+
+L_dolen:
+ mov cl, ah ; /* cl = this.bits */
+ sub bl, ah ; /* bits -= this.bits */
+ shr rdx, cl ; /* hold >>= this.bits */
+
+ test al, al
+ jnz L_test_for_length_base ; /* if (op != 0) 45.7% */
+
+ shr eax, 16 ; /* output this.val char */
+ stosb
+ jmp L_while_test
+
+ALIGN 4
+L_test_for_length_base:
+ mov r14d, eax ; /* len = this */
+ shr r14d, 16 ; /* len = this.val */
+ mov cl, al
+
+ test al, 16
+ jz L_test_for_second_level_length ; /* if ((op & 16) == 0) 8% */
+ and cl, 15 ; /* op &= 15 */
+ jz L_decode_distance ; /* if (!op) */
+
+L_add_bits_to_len:
+ sub bl, cl
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax
+ and eax, edx ; /* eax &= hold */
+ shr rdx, cl
+ add r14d, eax ; /* len += hold & mask[op] */
+
+L_decode_distance:
+ mov r8, r13 ; /* r8 = dmask */
+ cmp bl, 32
+ ja L_get_distance_code ; /* if (32 < bits) */
+
+ lodsd ; /* eax = *(uint *)in++ */
+ mov cl, bl ; /* cl = bits, needs it for shifting */
+ add bl, 32 ; /* bits += 32 */
+ shl rax, cl
+ or rdx, rax ; /* hold |= *((uint *)in)++ << bits */
+
+L_get_distance_code:
+ and r8, rdx ; /* r8 &= hold */
+ mov eax, [r11+r8*4] ; /* eax = dcode[hold & dmask] */
+
+L_dodist:
+ mov r15d, eax ; /* dist = this */
+ shr r15d, 16 ; /* dist = this.val */
+ mov cl, ah
+ sub bl, ah ; /* bits -= this.bits */
+ shr rdx, cl ; /* hold >>= this.bits */
+ mov cl, al ; /* cl = this.op */
+
+ test al, 16 ; /* if ((op & 16) == 0) */
+ jz L_test_for_second_level_dist
+ and cl, 15 ; /* op &= 15 */
+ jz L_check_dist_one
+
+L_add_bits_to_dist:
+ sub bl, cl
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax ; /* (1 << op) - 1 */
+ and eax, edx ; /* eax &= hold */
+ shr rdx, cl
+ add r15d, eax ; /* dist += hold & ((1 << op) - 1) */
+
+L_check_window:
+ mov r8, rsi ; /* save in so from can use it's reg */
+ mov rax, rdi
+ sub rax, [rsp+40] ; /* nbytes = out - beg */
+
+ cmp eax, r15d
+ jb L_clip_window ; /* if (dist > nbytes) 4.2% */
+
+ mov ecx, r14d ; /* ecx = len */
+ mov rsi, rdi
+ sub rsi, r15 ; /* from = out - dist */
+
+ sar ecx, 1
+ jnc L_copy_two ; /* if len % 2 == 0 */
+
+ rep movsw
+ mov al, [rsi]
+ mov [rdi], al
+ inc rdi
+
+ mov rsi, r8 ; /* move in back to %rsi, toss from */
+ jmp L_while_test
+
+L_copy_two:
+ rep movsw
+ mov rsi, r8 ; /* move in back to %rsi, toss from */
+ jmp L_while_test
+
+ALIGN 4
+L_check_dist_one:
+ cmp r15d, 1 ; /* if dist 1, is a memset */
+ jne L_check_window
+ cmp [rsp+40], rdi ; /* if out == beg, outside window */
+ je L_check_window
+
+ mov ecx, r14d ; /* ecx = len */
+ mov al, [rdi-1]
+ mov ah, al
+
+ sar ecx, 1
+ jnc L_set_two
+ mov [rdi], al
+ inc rdi
+
+L_set_two:
+ rep stosw
+ jmp L_while_test
+
+ALIGN 4
+L_test_for_second_level_length:
+ test al, 64
+ jnz L_test_for_end_of_block ; /* if ((op & 64) != 0) */
+
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax
+ and eax, edx ; /* eax &= hold */
+ add eax, r14d ; /* eax += len */
+ mov eax, [rbp+rax*4] ; /* eax = lcode[val+(hold&mask[op])]*/
+ jmp L_dolen
+
+ALIGN 4
+L_test_for_second_level_dist:
+ test al, 64
+ jnz L_invalid_distance_code ; /* if ((op & 64) != 0) */
+
+ xor eax, eax
+ inc eax
+ shl eax, cl
+ dec eax
+ and eax, edx ; /* eax &= hold */
+ add eax, r15d ; /* eax += dist */
+ mov eax, [r11+rax*4] ; /* eax = dcode[val+(hold&mask[op])]*/
+ jmp L_dodist
+
+ALIGN 4
+L_clip_window:
+ mov ecx, eax ; /* ecx = nbytes */
+ mov eax, [rsp+92] ; /* eax = wsize, prepare for dist cmp */
+ neg ecx ; /* nbytes = -nbytes */
+
+ cmp eax, r15d
+ jb L_invalid_distance_too_far ; /* if (dist > wsize) */
+
+ add ecx, r15d ; /* nbytes = dist - nbytes */
+ cmp dword ptr [rsp+96], 0
+ jne L_wrap_around_window ; /* if (write != 0) */
+
+ mov rsi, [rsp+56] ; /* from = window */
+ sub eax, ecx ; /* eax -= nbytes */
+ add rsi, rax ; /* from += wsize - nbytes */
+
+ mov eax, r14d ; /* eax = len */
+ cmp r14d, ecx
+ jbe L_do_copy ; /* if (nbytes >= len) */
+
+ sub eax, ecx ; /* eax -= nbytes */
+ rep movsb
+ mov rsi, rdi
+ sub rsi, r15 ; /* from = &out[ -dist ] */
+ jmp L_do_copy
+
+ALIGN 4
+L_wrap_around_window:
+ mov eax, [rsp+96] ; /* eax = write */
+ cmp ecx, eax
+ jbe L_contiguous_in_window ; /* if (write >= nbytes) */
+
+ mov esi, [rsp+92] ; /* from = wsize */
+ add rsi, [rsp+56] ; /* from += window */
+ add rsi, rax ; /* from += write */
+ sub rsi, rcx ; /* from -= nbytes */
+ sub ecx, eax ; /* nbytes -= write */
+
+ mov eax, r14d ; /* eax = len */
+ cmp eax, ecx
+ jbe L_do_copy ; /* if (nbytes >= len) */
+
+ sub eax, ecx ; /* len -= nbytes */
+ rep movsb
+ mov rsi, [rsp+56] ; /* from = window */
+ mov ecx, [rsp+96] ; /* nbytes = write */
+ cmp eax, ecx
+ jbe L_do_copy ; /* if (nbytes >= len) */
+
+ sub eax, ecx ; /* len -= nbytes */
+ rep movsb
+ mov rsi, rdi
+ sub rsi, r15 ; /* from = out - dist */
+ jmp L_do_copy
+
+ALIGN 4
+L_contiguous_in_window:
+ mov rsi, [rsp+56] ; /* rsi = window */
+ add rsi, rax
+ sub rsi, rcx ; /* from += write - nbytes */
+
+ mov eax, r14d ; /* eax = len */
+ cmp eax, ecx
+ jbe L_do_copy ; /* if (nbytes >= len) */
+
+ sub eax, ecx ; /* len -= nbytes */
+ rep movsb
+ mov rsi, rdi
+ sub rsi, r15 ; /* from = out - dist */
+ jmp L_do_copy ; /* if (nbytes >= len) */
+
+ALIGN 4
+L_do_copy:
+ mov ecx, eax ; /* ecx = len */
+ rep movsb
+
+ mov rsi, r8 ; /* move in back to %esi, toss from */
+ jmp L_while_test
+
+L_test_for_end_of_block:
+ test al, 32
+ jz L_invalid_literal_length_code
+ mov dword ptr [rsp+116], 1
+ jmp L_break_loop_with_status
+
+L_invalid_literal_length_code:
+ mov dword ptr [rsp+116], 2
+ jmp L_break_loop_with_status
+
+L_invalid_distance_code:
+ mov dword ptr [rsp+116], 3
+ jmp L_break_loop_with_status
+
+L_invalid_distance_too_far:
+ mov dword ptr [rsp+116], 4
+ jmp L_break_loop_with_status
+
+L_break_loop:
+ mov dword ptr [rsp+116], 0
+
+L_break_loop_with_status:
+; /* put in, out, bits, and hold back into ar and pop esp */
+ mov [rsp+16], rsi ; /* in */
+ mov [rsp+32], rdi ; /* out */
+ mov [rsp+88], ebx ; /* bits */
+ mov [rsp+80], rdx ; /* hold */
+
+ mov rax, [rsp] ; /* restore rbp and rsp */
+ mov rbp, [rsp+8]
+ mov rsp, rax
+
+
+
+ mov rsi,[rsp-8]
+ mov rdi,[rsp-16]
+ mov r12,[rsp-24]
+ mov r13,[rsp-32]
+ mov r14,[rsp-40]
+ mov r15,[rsp-48]
+ mov rbx,[rsp-56]
+
+ ret 0
+; :
+; : "m" (ar)
+; : "memory", "%rax", "%rbx", "%rcx", "%rdx", "%rsi", "%rdi",
+; "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15"
+; );
+
+inffas8664fnc ENDP
+;_TEXT ENDS
+END
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/readme.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/readme.txt
new file mode 100644
index 000000000..652571c7a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx64/readme.txt
@@ -0,0 +1,31 @@
+Summary
+-------
+This directory contains ASM implementations of the functions
+longest_match() and inflate_fast(), for 64 bits x86 (both AMD64 and Intel EM64t),
+for use with Microsoft Macro Assembler (x64) for AMD64 and Microsoft C++ 64 bits.
+
+gvmat64.asm is written by Gilles Vollant (2005), by using Brian Raiter 686/32 bits
+ assembly optimized version from Jean-loup Gailly original longest_match function
+
+inffasx64.asm and inffas8664.c were written by Chris Anderson, by optimizing
+ original function from Mark Adler
+
+Use instructions
+----------------
+Assemble the .asm files using MASM and put the object files into the zlib source
+directory. You can also get object files here:
+
+ http://www.winimage.com/zLibDll/zlib124_masm_obj.zip
+
+define ASMV and ASMINF in your project. Include inffas8664.c in your source tree,
+and inffasx64.obj and gvmat64.obj as object to link.
+
+
+Build instructions
+------------------
+run bld_64.bat with Microsoft Macro Assembler (x64) for AMD64 (ml64.exe)
+
+ml64.exe is given with Visual Studio 2005, Windows 2003 server DDK
+
+You can get Windows 2003 server DDK with ml64 and cl for AMD64 from
+ http://www.microsoft.com/whdc/devtools/ddk/default.mspx for low price)
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/bld_ml32.bat b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/bld_ml32.bat
new file mode 100644
index 000000000..fcf5755e4
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/bld_ml32.bat
@@ -0,0 +1,2 @@
+ml /coff /Zi /c /Flmatch686.lst match686.asm
+ml /coff /Zi /c /Flinffas32.lst inffas32.asm
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/inffas32.asm b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/inffas32.asm
new file mode 100644
index 000000000..cb37a81e4
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/inffas32.asm
@@ -0,0 +1,1080 @@
+;/* inffas32.asm is a hand tuned assembler version of inffast.c -- fast decoding
+; *
+; * inffas32.asm is derivated from inffas86.c, with translation of assembly code
+; *
+; * Copyright (C) 1995-2003 Mark Adler
+; * For conditions of distribution and use, see copyright notice in zlib.h
+; *
+; * Copyright (C) 2003 Chris Anderson <christop@charm.net>
+; * Please use the copyright conditions above.
+; *
+; * Mar-13-2003 -- Most of this is derived from inffast.S which is derived from
+; * the gcc -S output of zlib-1.2.0/inffast.c. Zlib-1.2.0 is in beta release at
+; * the moment. I have successfully compiled and tested this code with gcc2.96,
+; * gcc3.2, icc5.0, msvc6.0. It is very close to the speed of inffast.S
+; * compiled with gcc -DNO_MMX, but inffast.S is still faster on the P3 with MMX
+; * enabled. I will attempt to merge the MMX code into this version. Newer
+; * versions of this and inffast.S can be found at
+; * http://www.eetbeetee.com/zlib/ and http://www.charm.net/~christop/zlib/
+; *
+; * 2005 : modification by Gilles Vollant
+; */
+; For Visual C++ 4.x and higher and ML 6.x and higher
+; ml.exe is in directory \MASM611C of Win95 DDK
+; ml.exe is also distributed in http://www.masm32.com/masmdl.htm
+; and in VC++2003 toolkit at http://msdn.microsoft.com/visualc/vctoolkit2003/
+;
+;
+; compile with command line option
+; ml /coff /Zi /c /Flinffas32.lst inffas32.asm
+
+; if you define NO_GZIP (see inflate.h), compile with
+; ml /coff /Zi /c /Flinffas32.lst /DNO_GUNZIP inffas32.asm
+
+
+; zlib122sup is 0 fort zlib 1.2.2.1 and lower
+; zlib122sup is 8 fort zlib 1.2.2.2 and more (with addition of dmax and head
+; in inflate_state in inflate.h)
+zlib1222sup equ 8
+
+
+IFDEF GUNZIP
+ INFLATE_MODE_TYPE equ 11
+ INFLATE_MODE_BAD equ 26
+ELSE
+ IFNDEF NO_GUNZIP
+ INFLATE_MODE_TYPE equ 11
+ INFLATE_MODE_BAD equ 26
+ ELSE
+ INFLATE_MODE_TYPE equ 3
+ INFLATE_MODE_BAD equ 17
+ ENDIF
+ENDIF
+
+
+; 75 "inffast.S"
+;FILE "inffast.S"
+
+;;;GLOBAL _inflate_fast
+
+;;;SECTION .text
+
+
+
+ .586p
+ .mmx
+
+ name inflate_fast_x86
+ .MODEL FLAT
+
+_DATA segment
+inflate_fast_use_mmx:
+ dd 1
+
+
+_TEXT segment
+
+
+
+ALIGN 4
+ db 'Fast decoding Code from Chris Anderson'
+ db 0
+
+ALIGN 4
+invalid_literal_length_code_msg:
+ db 'invalid literal/length code'
+ db 0
+
+ALIGN 4
+invalid_distance_code_msg:
+ db 'invalid distance code'
+ db 0
+
+ALIGN 4
+invalid_distance_too_far_msg:
+ db 'invalid distance too far back'
+ db 0
+
+
+ALIGN 4
+inflate_fast_mask:
+dd 0
+dd 1
+dd 3
+dd 7
+dd 15
+dd 31
+dd 63
+dd 127
+dd 255
+dd 511
+dd 1023
+dd 2047
+dd 4095
+dd 8191
+dd 16383
+dd 32767
+dd 65535
+dd 131071
+dd 262143
+dd 524287
+dd 1048575
+dd 2097151
+dd 4194303
+dd 8388607
+dd 16777215
+dd 33554431
+dd 67108863
+dd 134217727
+dd 268435455
+dd 536870911
+dd 1073741823
+dd 2147483647
+dd 4294967295
+
+
+mode_state equ 0 ;/* state->mode */
+wsize_state equ (32+zlib1222sup) ;/* state->wsize */
+write_state equ (36+4+zlib1222sup) ;/* state->write */
+window_state equ (40+4+zlib1222sup) ;/* state->window */
+hold_state equ (44+4+zlib1222sup) ;/* state->hold */
+bits_state equ (48+4+zlib1222sup) ;/* state->bits */
+lencode_state equ (64+4+zlib1222sup) ;/* state->lencode */
+distcode_state equ (68+4+zlib1222sup) ;/* state->distcode */
+lenbits_state equ (72+4+zlib1222sup) ;/* state->lenbits */
+distbits_state equ (76+4+zlib1222sup) ;/* state->distbits */
+
+
+;;SECTION .text
+; 205 "inffast.S"
+;GLOBAL inflate_fast_use_mmx
+
+;SECTION .data
+
+
+; GLOBAL inflate_fast_use_mmx:object
+;.size inflate_fast_use_mmx, 4
+; 226 "inffast.S"
+;SECTION .text
+
+ALIGN 4
+_inflate_fast proc near
+.FPO (16, 4, 0, 0, 1, 0)
+ push edi
+ push esi
+ push ebp
+ push ebx
+ pushfd
+ sub esp,64
+ cld
+
+
+
+
+ mov esi, [esp+88]
+ mov edi, [esi+28]
+
+
+
+
+
+
+
+ mov edx, [esi+4]
+ mov eax, [esi+0]
+
+ add edx,eax
+ sub edx,11
+
+ mov [esp+44],eax
+ mov [esp+20],edx
+
+ mov ebp, [esp+92]
+ mov ecx, [esi+16]
+ mov ebx, [esi+12]
+
+ sub ebp,ecx
+ neg ebp
+ add ebp,ebx
+
+ sub ecx,257
+ add ecx,ebx
+
+ mov [esp+60],ebx
+ mov [esp+40],ebp
+ mov [esp+16],ecx
+; 285 "inffast.S"
+ mov eax, [edi+lencode_state]
+ mov ecx, [edi+distcode_state]
+
+ mov [esp+8],eax
+ mov [esp+12],ecx
+
+ mov eax,1
+ mov ecx, [edi+lenbits_state]
+ shl eax,cl
+ dec eax
+ mov [esp+0],eax
+
+ mov eax,1
+ mov ecx, [edi+distbits_state]
+ shl eax,cl
+ dec eax
+ mov [esp+4],eax
+
+ mov eax, [edi+wsize_state]
+ mov ecx, [edi+write_state]
+ mov edx, [edi+window_state]
+
+ mov [esp+52],eax
+ mov [esp+48],ecx
+ mov [esp+56],edx
+
+ mov ebp, [edi+hold_state]
+ mov ebx, [edi+bits_state]
+; 321 "inffast.S"
+ mov esi, [esp+44]
+ mov ecx, [esp+20]
+ cmp ecx,esi
+ ja L_align_long
+
+ add ecx,11
+ sub ecx,esi
+ mov eax,12
+ sub eax,ecx
+ lea edi, [esp+28]
+ rep movsb
+ mov ecx,eax
+ xor eax,eax
+ rep stosb
+ lea esi, [esp+28]
+ mov [esp+20],esi
+ jmp L_is_aligned
+
+
+L_align_long:
+ test esi,3
+ jz L_is_aligned
+ xor eax,eax
+ mov al, [esi]
+ inc esi
+ mov ecx,ebx
+ add ebx,8
+ shl eax,cl
+ or ebp,eax
+ jmp L_align_long
+
+L_is_aligned:
+ mov edi, [esp+60]
+; 366 "inffast.S"
+L_check_mmx:
+ cmp dword ptr [inflate_fast_use_mmx],2
+ je L_init_mmx
+ ja L_do_loop
+
+ push eax
+ push ebx
+ push ecx
+ push edx
+ pushfd
+ mov eax, [esp]
+ xor dword ptr [esp],0200000h
+
+
+
+
+ popfd
+ pushfd
+ pop edx
+ xor edx,eax
+ jz L_dont_use_mmx
+ xor eax,eax
+ cpuid
+ cmp ebx,0756e6547h
+ jne L_dont_use_mmx
+ cmp ecx,06c65746eh
+ jne L_dont_use_mmx
+ cmp edx,049656e69h
+ jne L_dont_use_mmx
+ mov eax,1
+ cpuid
+ shr eax,8
+ and eax,15
+ cmp eax,6
+ jne L_dont_use_mmx
+ test edx,0800000h
+ jnz L_use_mmx
+ jmp L_dont_use_mmx
+L_use_mmx:
+ mov dword ptr [inflate_fast_use_mmx],2
+ jmp L_check_mmx_pop
+L_dont_use_mmx:
+ mov dword ptr [inflate_fast_use_mmx],3
+L_check_mmx_pop:
+ pop edx
+ pop ecx
+ pop ebx
+ pop eax
+ jmp L_check_mmx
+; 426 "inffast.S"
+ALIGN 4
+L_do_loop:
+; 437 "inffast.S"
+ cmp bl,15
+ ja L_get_length_code
+
+ xor eax,eax
+ lodsw
+ mov cl,bl
+ add bl,16
+ shl eax,cl
+ or ebp,eax
+
+L_get_length_code:
+ mov edx, [esp+0]
+ mov ecx, [esp+8]
+ and edx,ebp
+ mov eax, [ecx+edx*4]
+
+L_dolen:
+
+
+
+
+
+
+ mov cl,ah
+ sub bl,ah
+ shr ebp,cl
+
+
+
+
+
+
+ test al,al
+ jnz L_test_for_length_base
+
+ shr eax,16
+ stosb
+
+L_while_test:
+
+
+ cmp [esp+16],edi
+ jbe L_break_loop
+
+ cmp [esp+20],esi
+ ja L_do_loop
+ jmp L_break_loop
+
+L_test_for_length_base:
+; 502 "inffast.S"
+ mov edx,eax
+ shr edx,16
+ mov cl,al
+
+ test al,16
+ jz L_test_for_second_level_length
+ and cl,15
+ jz L_save_len
+ cmp bl,cl
+ jae L_add_bits_to_len
+
+ mov ch,cl
+ xor eax,eax
+ lodsw
+ mov cl,bl
+ add bl,16
+ shl eax,cl
+ or ebp,eax
+ mov cl,ch
+
+L_add_bits_to_len:
+ mov eax,1
+ shl eax,cl
+ dec eax
+ sub bl,cl
+ and eax,ebp
+ shr ebp,cl
+ add edx,eax
+
+L_save_len:
+ mov [esp+24],edx
+
+
+L_decode_distance:
+; 549 "inffast.S"
+ cmp bl,15
+ ja L_get_distance_code
+
+ xor eax,eax
+ lodsw
+ mov cl,bl
+ add bl,16
+ shl eax,cl
+ or ebp,eax
+
+L_get_distance_code:
+ mov edx, [esp+4]
+ mov ecx, [esp+12]
+ and edx,ebp
+ mov eax, [ecx+edx*4]
+
+
+L_dodist:
+ mov edx,eax
+ shr edx,16
+ mov cl,ah
+ sub bl,ah
+ shr ebp,cl
+; 584 "inffast.S"
+ mov cl,al
+
+ test al,16
+ jz L_test_for_second_level_dist
+ and cl,15
+ jz L_check_dist_one
+ cmp bl,cl
+ jae L_add_bits_to_dist
+
+ mov ch,cl
+ xor eax,eax
+ lodsw
+ mov cl,bl
+ add bl,16
+ shl eax,cl
+ or ebp,eax
+ mov cl,ch
+
+L_add_bits_to_dist:
+ mov eax,1
+ shl eax,cl
+ dec eax
+ sub bl,cl
+ and eax,ebp
+ shr ebp,cl
+ add edx,eax
+ jmp L_check_window
+
+L_check_window:
+; 625 "inffast.S"
+ mov [esp+44],esi
+ mov eax,edi
+ sub eax, [esp+40]
+
+ cmp eax,edx
+ jb L_clip_window
+
+ mov ecx, [esp+24]
+ mov esi,edi
+ sub esi,edx
+
+ sub ecx,3
+ mov al, [esi]
+ mov [edi],al
+ mov al, [esi+1]
+ mov dl, [esi+2]
+ add esi,3
+ mov [edi+1],al
+ mov [edi+2],dl
+ add edi,3
+ rep movsb
+
+ mov esi, [esp+44]
+ jmp L_while_test
+
+ALIGN 4
+L_check_dist_one:
+ cmp edx,1
+ jne L_check_window
+ cmp [esp+40],edi
+ je L_check_window
+
+ dec edi
+ mov ecx, [esp+24]
+ mov al, [edi]
+ sub ecx,3
+
+ mov [edi+1],al
+ mov [edi+2],al
+ mov [edi+3],al
+ add edi,4
+ rep stosb
+
+ jmp L_while_test
+
+ALIGN 4
+L_test_for_second_level_length:
+
+
+
+
+ test al,64
+ jnz L_test_for_end_of_block
+
+ mov eax,1
+ shl eax,cl
+ dec eax
+ and eax,ebp
+ add eax,edx
+ mov edx, [esp+8]
+ mov eax, [edx+eax*4]
+ jmp L_dolen
+
+ALIGN 4
+L_test_for_second_level_dist:
+
+
+
+
+ test al,64
+ jnz L_invalid_distance_code
+
+ mov eax,1
+ shl eax,cl
+ dec eax
+ and eax,ebp
+ add eax,edx
+ mov edx, [esp+12]
+ mov eax, [edx+eax*4]
+ jmp L_dodist
+
+ALIGN 4
+L_clip_window:
+; 721 "inffast.S"
+ mov ecx,eax
+ mov eax, [esp+52]
+ neg ecx
+ mov esi, [esp+56]
+
+ cmp eax,edx
+ jb L_invalid_distance_too_far
+
+ add ecx,edx
+ cmp dword ptr [esp+48],0
+ jne L_wrap_around_window
+
+ sub eax,ecx
+ add esi,eax
+; 749 "inffast.S"
+ mov eax, [esp+24]
+ cmp eax,ecx
+ jbe L_do_copy1
+
+ sub eax,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,edx
+ jmp L_do_copy1
+
+ cmp eax,ecx
+ jbe L_do_copy1
+
+ sub eax,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,edx
+ jmp L_do_copy1
+
+L_wrap_around_window:
+; 793 "inffast.S"
+ mov eax, [esp+48]
+ cmp ecx,eax
+ jbe L_contiguous_in_window
+
+ add esi, [esp+52]
+ add esi,eax
+ sub esi,ecx
+ sub ecx,eax
+
+
+ mov eax, [esp+24]
+ cmp eax,ecx
+ jbe L_do_copy1
+
+ sub eax,ecx
+ rep movsb
+ mov esi, [esp+56]
+ mov ecx, [esp+48]
+ cmp eax,ecx
+ jbe L_do_copy1
+
+ sub eax,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,edx
+ jmp L_do_copy1
+
+L_contiguous_in_window:
+; 836 "inffast.S"
+ add esi,eax
+ sub esi,ecx
+
+
+ mov eax, [esp+24]
+ cmp eax,ecx
+ jbe L_do_copy1
+
+ sub eax,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,edx
+
+L_do_copy1:
+; 862 "inffast.S"
+ mov ecx,eax
+ rep movsb
+
+ mov esi, [esp+44]
+ jmp L_while_test
+; 878 "inffast.S"
+ALIGN 4
+L_init_mmx:
+ emms
+
+
+
+
+
+ movd mm0,ebp
+ mov ebp,ebx
+; 896 "inffast.S"
+ movd mm4,dword ptr [esp+0]
+ movq mm3,mm4
+ movd mm5,dword ptr [esp+4]
+ movq mm2,mm5
+ pxor mm1,mm1
+ mov ebx, [esp+8]
+ jmp L_do_loop_mmx
+
+ALIGN 4
+L_do_loop_mmx:
+ psrlq mm0,mm1
+
+ cmp ebp,32
+ ja L_get_length_code_mmx
+
+ movd mm6,ebp
+ movd mm7,dword ptr [esi]
+ add esi,4
+ psllq mm7,mm6
+ add ebp,32
+ por mm0,mm7
+
+L_get_length_code_mmx:
+ pand mm4,mm0
+ movd eax,mm4
+ movq mm4,mm3
+ mov eax, [ebx+eax*4]
+
+L_dolen_mmx:
+ movzx ecx,ah
+ movd mm1,ecx
+ sub ebp,ecx
+
+ test al,al
+ jnz L_test_for_length_base_mmx
+
+ shr eax,16
+ stosb
+
+L_while_test_mmx:
+
+
+ cmp [esp+16],edi
+ jbe L_break_loop
+
+ cmp [esp+20],esi
+ ja L_do_loop_mmx
+ jmp L_break_loop
+
+L_test_for_length_base_mmx:
+
+ mov edx,eax
+ shr edx,16
+
+ test al,16
+ jz L_test_for_second_level_length_mmx
+ and eax,15
+ jz L_decode_distance_mmx
+
+ psrlq mm0,mm1
+ movd mm1,eax
+ movd ecx,mm0
+ sub ebp,eax
+ and ecx, [inflate_fast_mask+eax*4]
+ add edx,ecx
+
+L_decode_distance_mmx:
+ psrlq mm0,mm1
+
+ cmp ebp,32
+ ja L_get_dist_code_mmx
+
+ movd mm6,ebp
+ movd mm7,dword ptr [esi]
+ add esi,4
+ psllq mm7,mm6
+ add ebp,32
+ por mm0,mm7
+
+L_get_dist_code_mmx:
+ mov ebx, [esp+12]
+ pand mm5,mm0
+ movd eax,mm5
+ movq mm5,mm2
+ mov eax, [ebx+eax*4]
+
+L_dodist_mmx:
+
+ movzx ecx,ah
+ mov ebx,eax
+ shr ebx,16
+ sub ebp,ecx
+ movd mm1,ecx
+
+ test al,16
+ jz L_test_for_second_level_dist_mmx
+ and eax,15
+ jz L_check_dist_one_mmx
+
+L_add_bits_to_dist_mmx:
+ psrlq mm0,mm1
+ movd mm1,eax
+ movd ecx,mm0
+ sub ebp,eax
+ and ecx, [inflate_fast_mask+eax*4]
+ add ebx,ecx
+
+L_check_window_mmx:
+ mov [esp+44],esi
+ mov eax,edi
+ sub eax, [esp+40]
+
+ cmp eax,ebx
+ jb L_clip_window_mmx
+
+ mov ecx,edx
+ mov esi,edi
+ sub esi,ebx
+
+ sub ecx,3
+ mov al, [esi]
+ mov [edi],al
+ mov al, [esi+1]
+ mov dl, [esi+2]
+ add esi,3
+ mov [edi+1],al
+ mov [edi+2],dl
+ add edi,3
+ rep movsb
+
+ mov esi, [esp+44]
+ mov ebx, [esp+8]
+ jmp L_while_test_mmx
+
+ALIGN 4
+L_check_dist_one_mmx:
+ cmp ebx,1
+ jne L_check_window_mmx
+ cmp [esp+40],edi
+ je L_check_window_mmx
+
+ dec edi
+ mov ecx,edx
+ mov al, [edi]
+ sub ecx,3
+
+ mov [edi+1],al
+ mov [edi+2],al
+ mov [edi+3],al
+ add edi,4
+ rep stosb
+
+ mov ebx, [esp+8]
+ jmp L_while_test_mmx
+
+ALIGN 4
+L_test_for_second_level_length_mmx:
+ test al,64
+ jnz L_test_for_end_of_block
+
+ and eax,15
+ psrlq mm0,mm1
+ movd ecx,mm0
+ and ecx, [inflate_fast_mask+eax*4]
+ add ecx,edx
+ mov eax, [ebx+ecx*4]
+ jmp L_dolen_mmx
+
+ALIGN 4
+L_test_for_second_level_dist_mmx:
+ test al,64
+ jnz L_invalid_distance_code
+
+ and eax,15
+ psrlq mm0,mm1
+ movd ecx,mm0
+ and ecx, [inflate_fast_mask+eax*4]
+ mov eax, [esp+12]
+ add ecx,ebx
+ mov eax, [eax+ecx*4]
+ jmp L_dodist_mmx
+
+ALIGN 4
+L_clip_window_mmx:
+
+ mov ecx,eax
+ mov eax, [esp+52]
+ neg ecx
+ mov esi, [esp+56]
+
+ cmp eax,ebx
+ jb L_invalid_distance_too_far
+
+ add ecx,ebx
+ cmp dword ptr [esp+48],0
+ jne L_wrap_around_window_mmx
+
+ sub eax,ecx
+ add esi,eax
+
+ cmp edx,ecx
+ jbe L_do_copy1_mmx
+
+ sub edx,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,ebx
+ jmp L_do_copy1_mmx
+
+ cmp edx,ecx
+ jbe L_do_copy1_mmx
+
+ sub edx,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,ebx
+ jmp L_do_copy1_mmx
+
+L_wrap_around_window_mmx:
+
+ mov eax, [esp+48]
+ cmp ecx,eax
+ jbe L_contiguous_in_window_mmx
+
+ add esi, [esp+52]
+ add esi,eax
+ sub esi,ecx
+ sub ecx,eax
+
+
+ cmp edx,ecx
+ jbe L_do_copy1_mmx
+
+ sub edx,ecx
+ rep movsb
+ mov esi, [esp+56]
+ mov ecx, [esp+48]
+ cmp edx,ecx
+ jbe L_do_copy1_mmx
+
+ sub edx,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,ebx
+ jmp L_do_copy1_mmx
+
+L_contiguous_in_window_mmx:
+
+ add esi,eax
+ sub esi,ecx
+
+
+ cmp edx,ecx
+ jbe L_do_copy1_mmx
+
+ sub edx,ecx
+ rep movsb
+ mov esi,edi
+ sub esi,ebx
+
+L_do_copy1_mmx:
+
+
+ mov ecx,edx
+ rep movsb
+
+ mov esi, [esp+44]
+ mov ebx, [esp+8]
+ jmp L_while_test_mmx
+; 1174 "inffast.S"
+L_invalid_distance_code:
+
+
+
+
+
+ mov ecx, invalid_distance_code_msg
+ mov edx,INFLATE_MODE_BAD
+ jmp L_update_stream_state
+
+L_test_for_end_of_block:
+
+
+
+
+
+ test al,32
+ jz L_invalid_literal_length_code
+
+ mov ecx,0
+ mov edx,INFLATE_MODE_TYPE
+ jmp L_update_stream_state
+
+L_invalid_literal_length_code:
+
+
+
+
+
+ mov ecx, invalid_literal_length_code_msg
+ mov edx,INFLATE_MODE_BAD
+ jmp L_update_stream_state
+
+L_invalid_distance_too_far:
+
+
+
+ mov esi, [esp+44]
+ mov ecx, invalid_distance_too_far_msg
+ mov edx,INFLATE_MODE_BAD
+ jmp L_update_stream_state
+
+L_update_stream_state:
+
+ mov eax, [esp+88]
+ test ecx,ecx
+ jz L_skip_msg
+ mov [eax+24],ecx
+L_skip_msg:
+ mov eax, [eax+28]
+ mov [eax+mode_state],edx
+ jmp L_break_loop
+
+ALIGN 4
+L_break_loop:
+; 1243 "inffast.S"
+ cmp dword ptr [inflate_fast_use_mmx],2
+ jne L_update_next_in
+
+
+
+ mov ebx,ebp
+
+L_update_next_in:
+; 1266 "inffast.S"
+ mov eax, [esp+88]
+ mov ecx,ebx
+ mov edx, [eax+28]
+ shr ecx,3
+ sub esi,ecx
+ shl ecx,3
+ sub ebx,ecx
+ mov [eax+12],edi
+ mov [edx+bits_state],ebx
+ mov ecx,ebx
+
+ lea ebx, [esp+28]
+ cmp [esp+20],ebx
+ jne L_buf_not_used
+
+ sub esi,ebx
+ mov ebx, [eax+0]
+ mov [esp+20],ebx
+ add esi,ebx
+ mov ebx, [eax+4]
+ sub ebx,11
+ add [esp+20],ebx
+
+L_buf_not_used:
+ mov [eax+0],esi
+
+ mov ebx,1
+ shl ebx,cl
+ dec ebx
+
+
+
+
+
+ cmp dword ptr [inflate_fast_use_mmx],2
+ jne L_update_hold
+
+
+
+ psrlq mm0,mm1
+ movd ebp,mm0
+
+ emms
+
+L_update_hold:
+
+
+
+ and ebp,ebx
+ mov [edx+hold_state],ebp
+
+
+
+
+ mov ebx, [esp+20]
+ cmp ebx,esi
+ jbe L_last_is_smaller
+
+ sub ebx,esi
+ add ebx,11
+ mov [eax+4],ebx
+ jmp L_fixup_out
+L_last_is_smaller:
+ sub esi,ebx
+ neg esi
+ add esi,11
+ mov [eax+4],esi
+
+
+
+
+L_fixup_out:
+
+ mov ebx, [esp+16]
+ cmp ebx,edi
+ jbe L_end_is_smaller
+
+ sub ebx,edi
+ add ebx,257
+ mov [eax+16],ebx
+ jmp L_done
+L_end_is_smaller:
+ sub edi,ebx
+ neg edi
+ add edi,257
+ mov [eax+16],edi
+
+
+
+
+
+L_done:
+ add esp,64
+ popfd
+ pop ebx
+ pop ebp
+ pop esi
+ pop edi
+ ret
+_inflate_fast endp
+
+_TEXT ends
+end
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/match686.asm b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/match686.asm
new file mode 100644
index 000000000..69e0eed01
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/match686.asm
@@ -0,0 +1,479 @@
+; match686.asm -- Asm portion of the optimized longest_match for 32 bits x86
+; Copyright (C) 1995-1996 Jean-loup Gailly, Brian Raiter and Gilles Vollant.
+; File written by Gilles Vollant, by converting match686.S from Brian Raiter
+; for MASM. This is as assembly version of longest_match
+; from Jean-loup Gailly in deflate.c
+;
+; http://www.zlib.net
+; http://www.winimage.com/zLibDll
+; http://www.muppetlabs.com/~breadbox/software/assembly.html
+;
+; For Visual C++ 4.x and higher and ML 6.x and higher
+; ml.exe is distributed in
+; http://www.microsoft.com/downloads/details.aspx?FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64
+;
+; this file contain two implementation of longest_match
+;
+; this longest_match was written by Brian raiter (1998), optimized for Pentium Pro
+; (and the faster known version of match_init on modern Core 2 Duo and AMD Phenom)
+;
+; for using an assembly version of longest_match, you need define ASMV in project
+;
+; compile the asm file running
+; ml /coff /Zi /c /Flmatch686.lst match686.asm
+; and do not include match686.obj in your project
+;
+; note: contrib of zLib 1.2.3 and earlier contained both a deprecated version for
+; Pentium (prior Pentium Pro) and this version for Pentium Pro and modern processor
+; with autoselect (with cpu detection code)
+; if you want support the old pentium optimization, you can still use these version
+;
+; this file is not optimized for old pentium, but it compatible with all x86 32 bits
+; processor (starting 80386)
+;
+;
+; see below : zlib1222add must be adjuster if you use a zlib version < 1.2.2.2
+
+;uInt longest_match(s, cur_match)
+; deflate_state *s;
+; IPos cur_match; /* current match */
+
+ NbStack equ 76
+ cur_match equ dword ptr[esp+NbStack-0]
+ str_s equ dword ptr[esp+NbStack-4]
+; 5 dword on top (ret,ebp,esi,edi,ebx)
+ adrret equ dword ptr[esp+NbStack-8]
+ pushebp equ dword ptr[esp+NbStack-12]
+ pushedi equ dword ptr[esp+NbStack-16]
+ pushesi equ dword ptr[esp+NbStack-20]
+ pushebx equ dword ptr[esp+NbStack-24]
+
+ chain_length equ dword ptr [esp+NbStack-28]
+ limit equ dword ptr [esp+NbStack-32]
+ best_len equ dword ptr [esp+NbStack-36]
+ window equ dword ptr [esp+NbStack-40]
+ prev equ dword ptr [esp+NbStack-44]
+ scan_start equ word ptr [esp+NbStack-48]
+ wmask equ dword ptr [esp+NbStack-52]
+ match_start_ptr equ dword ptr [esp+NbStack-56]
+ nice_match equ dword ptr [esp+NbStack-60]
+ scan equ dword ptr [esp+NbStack-64]
+
+ windowlen equ dword ptr [esp+NbStack-68]
+ match_start equ dword ptr [esp+NbStack-72]
+ strend equ dword ptr [esp+NbStack-76]
+ NbStackAdd equ (NbStack-24)
+
+ .386p
+
+ name gvmatch
+ .MODEL FLAT
+
+
+
+; all the +zlib1222add offsets are due to the addition of fields
+; in zlib in the deflate_state structure since the asm code was first written
+; (if you compile with zlib 1.0.4 or older, use "zlib1222add equ (-4)").
+; (if you compile with zlib between 1.0.5 and 1.2.2.1, use "zlib1222add equ 0").
+; if you compile with zlib 1.2.2.2 or later , use "zlib1222add equ 8").
+
+ zlib1222add equ 8
+
+; Note : these value are good with a 8 bytes boundary pack structure
+ dep_chain_length equ 74h+zlib1222add
+ dep_window equ 30h+zlib1222add
+ dep_strstart equ 64h+zlib1222add
+ dep_prev_length equ 70h+zlib1222add
+ dep_nice_match equ 88h+zlib1222add
+ dep_w_size equ 24h+zlib1222add
+ dep_prev equ 38h+zlib1222add
+ dep_w_mask equ 2ch+zlib1222add
+ dep_good_match equ 84h+zlib1222add
+ dep_match_start equ 68h+zlib1222add
+ dep_lookahead equ 6ch+zlib1222add
+
+
+_TEXT segment
+
+IFDEF NOUNDERLINE
+ public longest_match
+ public match_init
+ELSE
+ public _longest_match
+ public _match_init
+ENDIF
+
+ MAX_MATCH equ 258
+ MIN_MATCH equ 3
+ MIN_LOOKAHEAD equ (MAX_MATCH+MIN_MATCH+1)
+
+
+
+MAX_MATCH equ 258
+MIN_MATCH equ 3
+MIN_LOOKAHEAD equ (MAX_MATCH + MIN_MATCH + 1)
+MAX_MATCH_8_ equ ((MAX_MATCH + 7) AND 0FFF0h)
+
+
+;;; stack frame offsets
+
+chainlenwmask equ esp + 0 ; high word: current chain len
+ ; low word: s->wmask
+window equ esp + 4 ; local copy of s->window
+windowbestlen equ esp + 8 ; s->window + bestlen
+scanstart equ esp + 16 ; first two bytes of string
+scanend equ esp + 12 ; last two bytes of string
+scanalign equ esp + 20 ; dword-misalignment of string
+nicematch equ esp + 24 ; a good enough match size
+bestlen equ esp + 28 ; size of best match so far
+scan equ esp + 32 ; ptr to string wanting match
+
+LocalVarsSize equ 36
+; saved ebx byte esp + 36
+; saved edi byte esp + 40
+; saved esi byte esp + 44
+; saved ebp byte esp + 48
+; return address byte esp + 52
+deflatestate equ esp + 56 ; the function arguments
+curmatch equ esp + 60
+
+;;; Offsets for fields in the deflate_state structure. These numbers
+;;; are calculated from the definition of deflate_state, with the
+;;; assumption that the compiler will dword-align the fields. (Thus,
+;;; changing the definition of deflate_state could easily cause this
+;;; program to crash horribly, without so much as a warning at
+;;; compile time. Sigh.)
+
+dsWSize equ 36+zlib1222add
+dsWMask equ 44+zlib1222add
+dsWindow equ 48+zlib1222add
+dsPrev equ 56+zlib1222add
+dsMatchLen equ 88+zlib1222add
+dsPrevMatch equ 92+zlib1222add
+dsStrStart equ 100+zlib1222add
+dsMatchStart equ 104+zlib1222add
+dsLookahead equ 108+zlib1222add
+dsPrevLen equ 112+zlib1222add
+dsMaxChainLen equ 116+zlib1222add
+dsGoodMatch equ 132+zlib1222add
+dsNiceMatch equ 136+zlib1222add
+
+
+;;; match686.asm -- Pentium-Pro-optimized version of longest_match()
+;;; Written for zlib 1.1.2
+;;; Copyright (C) 1998 Brian Raiter <breadbox@muppetlabs.com>
+;;; You can look at http://www.muppetlabs.com/~breadbox/software/assembly.html
+;;;
+;;
+;; This software is provided 'as-is', without any express or implied
+;; warranty. In no event will the authors be held liable for any damages
+;; arising from the use of this software.
+;;
+;; Permission is granted to anyone to use this software for any purpose,
+;; including commercial applications, and to alter it and redistribute it
+;; freely, subject to the following restrictions:
+;;
+;; 1. The origin of this software must not be misrepresented; you must not
+;; claim that you wrote the original software. If you use this software
+;; in a product, an acknowledgment in the product documentation would be
+;; appreciated but is not required.
+;; 2. Altered source versions must be plainly marked as such, and must not be
+;; misrepresented as being the original software
+;; 3. This notice may not be removed or altered from any source distribution.
+;;
+
+;GLOBAL _longest_match, _match_init
+
+
+;SECTION .text
+
+;;; uInt longest_match(deflate_state *deflatestate, IPos curmatch)
+
+;_longest_match:
+ IFDEF NOUNDERLINE
+ longest_match proc near
+ ELSE
+ _longest_match proc near
+ ENDIF
+.FPO (9, 4, 0, 0, 1, 0)
+
+;;; Save registers that the compiler may be using, and adjust esp to
+;;; make room for our stack frame.
+
+ push ebp
+ push edi
+ push esi
+ push ebx
+ sub esp, LocalVarsSize
+
+;;; Retrieve the function arguments. ecx will hold cur_match
+;;; throughout the entire function. edx will hold the pointer to the
+;;; deflate_state structure during the function's setup (before
+;;; entering the main loop.
+
+ mov edx, [deflatestate]
+ mov ecx, [curmatch]
+
+;;; uInt wmask = s->w_mask;
+;;; unsigned chain_length = s->max_chain_length;
+;;; if (s->prev_length >= s->good_match) {
+;;; chain_length >>= 2;
+;;; }
+
+ mov eax, [edx + dsPrevLen]
+ mov ebx, [edx + dsGoodMatch]
+ cmp eax, ebx
+ mov eax, [edx + dsWMask]
+ mov ebx, [edx + dsMaxChainLen]
+ jl LastMatchGood
+ shr ebx, 2
+LastMatchGood:
+
+;;; chainlen is decremented once beforehand so that the function can
+;;; use the sign flag instead of the zero flag for the exit test.
+;;; It is then shifted into the high word, to make room for the wmask
+;;; value, which it will always accompany.
+
+ dec ebx
+ shl ebx, 16
+ or ebx, eax
+ mov [chainlenwmask], ebx
+
+;;; if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+ mov eax, [edx + dsNiceMatch]
+ mov ebx, [edx + dsLookahead]
+ cmp ebx, eax
+ jl LookaheadLess
+ mov ebx, eax
+LookaheadLess: mov [nicematch], ebx
+
+;;; register Bytef *scan = s->window + s->strstart;
+
+ mov esi, [edx + dsWindow]
+ mov [window], esi
+ mov ebp, [edx + dsStrStart]
+ lea edi, [esi + ebp]
+ mov [scan], edi
+
+;;; Determine how many bytes the scan ptr is off from being
+;;; dword-aligned.
+
+ mov eax, edi
+ neg eax
+ and eax, 3
+ mov [scanalign], eax
+
+;;; IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+;;; s->strstart - (IPos)MAX_DIST(s) : NIL;
+
+ mov eax, [edx + dsWSize]
+ sub eax, MIN_LOOKAHEAD
+ sub ebp, eax
+ jg LimitPositive
+ xor ebp, ebp
+LimitPositive:
+
+;;; int best_len = s->prev_length;
+
+ mov eax, [edx + dsPrevLen]
+ mov [bestlen], eax
+
+;;; Store the sum of s->window + best_len in esi locally, and in esi.
+
+ add esi, eax
+ mov [windowbestlen], esi
+
+;;; register ush scan_start = *(ushf*)scan;
+;;; register ush scan_end = *(ushf*)(scan+best_len-1);
+;;; Posf *prev = s->prev;
+
+ movzx ebx, word ptr [edi]
+ mov [scanstart], ebx
+ movzx ebx, word ptr [edi + eax - 1]
+ mov [scanend], ebx
+ mov edi, [edx + dsPrev]
+
+;;; Jump into the main loop.
+
+ mov edx, [chainlenwmask]
+ jmp short LoopEntry
+
+align 4
+
+;;; do {
+;;; match = s->window + cur_match;
+;;; if (*(ushf*)(match+best_len-1) != scan_end ||
+;;; *(ushf*)match != scan_start) continue;
+;;; [...]
+;;; } while ((cur_match = prev[cur_match & wmask]) > limit
+;;; && --chain_length != 0);
+;;;
+;;; Here is the inner loop of the function. The function will spend the
+;;; majority of its time in this loop, and majority of that time will
+;;; be spent in the first ten instructions.
+;;;
+;;; Within this loop:
+;;; ebx = scanend
+;;; ecx = curmatch
+;;; edx = chainlenwmask - i.e., ((chainlen << 16) | wmask)
+;;; esi = windowbestlen - i.e., (window + bestlen)
+;;; edi = prev
+;;; ebp = limit
+
+LookupLoop:
+ and ecx, edx
+ movzx ecx, word ptr [edi + ecx*2]
+ cmp ecx, ebp
+ jbe LeaveNow
+ sub edx, 00010000h
+ js LeaveNow
+LoopEntry: movzx eax, word ptr [esi + ecx - 1]
+ cmp eax, ebx
+ jnz LookupLoop
+ mov eax, [window]
+ movzx eax, word ptr [eax + ecx]
+ cmp eax, [scanstart]
+ jnz LookupLoop
+
+;;; Store the current value of chainlen.
+
+ mov [chainlenwmask], edx
+
+;;; Point edi to the string under scrutiny, and esi to the string we
+;;; are hoping to match it up with. In actuality, esi and edi are
+;;; both pointed (MAX_MATCH_8 - scanalign) bytes ahead, and edx is
+;;; initialized to -(MAX_MATCH_8 - scanalign).
+
+ mov esi, [window]
+ mov edi, [scan]
+ add esi, ecx
+ mov eax, [scanalign]
+ mov edx, 0fffffef8h; -(MAX_MATCH_8)
+ lea edi, [edi + eax + 0108h] ;MAX_MATCH_8]
+ lea esi, [esi + eax + 0108h] ;MAX_MATCH_8]
+
+;;; Test the strings for equality, 8 bytes at a time. At the end,
+;;; adjust edx so that it is offset to the exact byte that mismatched.
+;;;
+;;; We already know at this point that the first three bytes of the
+;;; strings match each other, and they can be safely passed over before
+;;; starting the compare loop. So what this code does is skip over 0-3
+;;; bytes, as much as necessary in order to dword-align the edi
+;;; pointer. (esi will still be misaligned three times out of four.)
+;;;
+;;; It should be confessed that this loop usually does not represent
+;;; much of the total running time. Replacing it with a more
+;;; straightforward "rep cmpsb" would not drastically degrade
+;;; performance.
+
+LoopCmps:
+ mov eax, [esi + edx]
+ xor eax, [edi + edx]
+ jnz LeaveLoopCmps
+ mov eax, [esi + edx + 4]
+ xor eax, [edi + edx + 4]
+ jnz LeaveLoopCmps4
+ add edx, 8
+ jnz LoopCmps
+ jmp short LenMaximum
+LeaveLoopCmps4: add edx, 4
+LeaveLoopCmps: test eax, 0000FFFFh
+ jnz LenLower
+ add edx, 2
+ shr eax, 16
+LenLower: sub al, 1
+ adc edx, 0
+
+;;; Calculate the length of the match. If it is longer than MAX_MATCH,
+;;; then automatically accept it as the best possible match and leave.
+
+ lea eax, [edi + edx]
+ mov edi, [scan]
+ sub eax, edi
+ cmp eax, MAX_MATCH
+ jge LenMaximum
+
+;;; If the length of the match is not longer than the best match we
+;;; have so far, then forget it and return to the lookup loop.
+
+ mov edx, [deflatestate]
+ mov ebx, [bestlen]
+ cmp eax, ebx
+ jg LongerMatch
+ mov esi, [windowbestlen]
+ mov edi, [edx + dsPrev]
+ mov ebx, [scanend]
+ mov edx, [chainlenwmask]
+ jmp LookupLoop
+
+;;; s->match_start = cur_match;
+;;; best_len = len;
+;;; if (len >= nice_match) break;
+;;; scan_end = *(ushf*)(scan+best_len-1);
+
+LongerMatch: mov ebx, [nicematch]
+ mov [bestlen], eax
+ mov [edx + dsMatchStart], ecx
+ cmp eax, ebx
+ jge LeaveNow
+ mov esi, [window]
+ add esi, eax
+ mov [windowbestlen], esi
+ movzx ebx, word ptr [edi + eax - 1]
+ mov edi, [edx + dsPrev]
+ mov [scanend], ebx
+ mov edx, [chainlenwmask]
+ jmp LookupLoop
+
+;;; Accept the current string, with the maximum possible length.
+
+LenMaximum: mov edx, [deflatestate]
+ mov dword ptr [bestlen], MAX_MATCH
+ mov [edx + dsMatchStart], ecx
+
+;;; if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+;;; return s->lookahead;
+
+LeaveNow:
+ mov edx, [deflatestate]
+ mov ebx, [bestlen]
+ mov eax, [edx + dsLookahead]
+ cmp ebx, eax
+ jg LookaheadRet
+ mov eax, ebx
+LookaheadRet:
+
+;;; Restore the stack and return from whence we came.
+
+ add esp, LocalVarsSize
+ pop ebx
+ pop esi
+ pop edi
+ pop ebp
+
+ ret
+; please don't remove this string !
+; Your can freely use match686 in any free or commercial app if you don't remove the string in the binary!
+ db 0dh,0ah,"asm686 with masm, optimised assembly code from Brian Raiter, written 1998",0dh,0ah
+
+
+ IFDEF NOUNDERLINE
+ longest_match endp
+ ELSE
+ _longest_match endp
+ ENDIF
+
+ IFDEF NOUNDERLINE
+ match_init proc near
+ ret
+ match_init endp
+ ELSE
+ _match_init proc near
+ ret
+ _match_init endp
+ ENDIF
+
+
+_TEXT ends
+end
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/readme.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/readme.txt
new file mode 100644
index 000000000..3f8888679
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/masmx86/readme.txt
@@ -0,0 +1,27 @@
+
+Summary
+-------
+This directory contains ASM implementations of the functions
+longest_match() and inflate_fast().
+
+
+Use instructions
+----------------
+Assemble using MASM, and copy the object files into the zlib source
+directory, then run the appropriate makefile, as suggested below. You can
+donwload MASM from here:
+
+ http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=7a1c9da0-0510-44a2-b042-7ef370530c64
+
+You can also get objects files here:
+
+ http://www.winimage.com/zLibDll/zlib124_masm_obj.zip
+
+Build instructions
+------------------
+* With Microsoft C and MASM:
+nmake -f win32/Makefile.msc LOC="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj"
+
+* With Borland C and TASM:
+make -f win32/Makefile.bor LOCAL_ZLIB="-DASMV -DASMINF" OBJA="match686.obj inffas32.obj" OBJPA="+match686c.obj+match686.obj+inffas32.obj"
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile
new file mode 100644
index 000000000..84eaad20d
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile
@@ -0,0 +1,25 @@
+CC=cc
+CFLAGS=-O -I../..
+
+UNZ_OBJS = miniunz.o unzip.o ioapi.o ../../libz.a
+ZIP_OBJS = minizip.o zip.o ioapi.o ../../libz.a
+
+.c.o:
+ $(CC) -c $(CFLAGS) $*.c
+
+all: miniunz minizip
+
+miniunz: $(UNZ_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(UNZ_OBJS)
+
+minizip: $(ZIP_OBJS)
+ $(CC) $(CFLAGS) -o $@ $(ZIP_OBJS)
+
+test: miniunz minizip
+ ./minizip test readme.txt
+ ./miniunz -l test.zip
+ mv readme.txt readme.old
+ ./miniunz test.zip
+
+clean:
+ /bin/rm -f *.o *~ minizip miniunz
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile.am b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile.am
new file mode 100644
index 000000000..d343011eb
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/Makefile.am
@@ -0,0 +1,45 @@
+lib_LTLIBRARIES = libminizip.la
+
+if COND_DEMOS
+bin_PROGRAMS = miniunzip minizip
+endif
+
+zlib_top_srcdir = $(top_srcdir)/../..
+zlib_top_builddir = $(top_builddir)/../..
+
+AM_CPPFLAGS = -I$(zlib_top_srcdir)
+AM_LDFLAGS = -L$(zlib_top_builddir)
+
+if WIN32
+iowin32_src = iowin32.c
+iowin32_h = iowin32.h
+endif
+
+libminizip_la_SOURCES = \
+ ioapi.c \
+ mztools.c \
+ unzip.c \
+ zip.c \
+ ${iowin32_src}
+
+libminizip_la_LDFLAGS = $(AM_LDFLAGS) -version-info 1:0:0 -lz
+
+minizip_includedir = $(includedir)/minizip
+minizip_include_HEADERS = \
+ crypt.h \
+ ioapi.h \
+ mztools.h \
+ unzip.h \
+ zip.h \
+ ${iowin32_h}
+
+pkgconfigdir = $(libdir)/pkgconfig
+pkgconfig_DATA = minizip.pc
+
+EXTRA_PROGRAMS = miniunzip minizip
+
+miniunzip_SOURCES = miniunz.c
+miniunzip_LDADD = libminizip.la
+
+minizip_SOURCES = minizip.c
+minizip_LDADD = libminizip.la -lz
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_Changes.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_Changes.txt
new file mode 100644
index 000000000..13a1bd91a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_Changes.txt
@@ -0,0 +1,6 @@
+
+MiniZip 1.1 was derrived from MiniZip at version 1.01f
+
+Change in 1.0 (Okt 2009)
+ - **TODO - Add history**
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_info.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_info.txt
new file mode 100644
index 000000000..57d715242
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/MiniZip64_info.txt
@@ -0,0 +1,74 @@
+MiniZip - Copyright (c) 1998-2010 - by Gilles Vollant - version 1.1 64 bits from Mathias Svensson
+
+Introduction
+---------------------
+MiniZip 1.1 is built from MiniZip 1.0 by Gilles Vollant ( http://www.winimage.com/zLibDll/minizip.html )
+
+When adding ZIP64 support into minizip it would result into risk of breaking compatibility with minizip 1.0.
+All possible work was done for compatibility.
+
+
+Background
+---------------------
+When adding ZIP64 support Mathias Svensson found that Even Rouault have added ZIP64
+support for unzip.c into minizip for a open source project called gdal ( http://www.gdal.org/ )
+
+That was used as a starting point. And after that ZIP64 support was added to zip.c
+some refactoring and code cleanup was also done.
+
+
+Changed from MiniZip 1.0 to MiniZip 1.1
+---------------------------------------
+* Added ZIP64 support for unzip ( by Even Rouault )
+* Added ZIP64 support for zip ( by Mathias Svensson )
+* Reverted some changed that Even Rouault did.
+* Bunch of patches received from Gulles Vollant that he received for MiniZip from various users.
+* Added unzip patch for BZIP Compression method (patch create by Daniel Borca)
+* Added BZIP Compress method for zip
+* Did some refactoring and code cleanup
+
+
+Credits
+
+ Gilles Vollant - Original MiniZip author
+ Even Rouault - ZIP64 unzip Support
+ Daniel Borca - BZip Compression method support in unzip
+ Mathias Svensson - ZIP64 zip support
+ Mathias Svensson - BZip Compression method support in zip
+
+ Resources
+
+ ZipLayout http://result42.com/projects/ZipFileLayout
+ Command line tool for Windows that shows the layout and information of the headers in a zip archive.
+ Used when debugging and validating the creation of zip files using MiniZip64
+
+
+ ZIP App Note http://www.pkware.com/documents/casestudies/APPNOTE.TXT
+ Zip File specification
+
+
+Notes.
+ * To be able to use BZip compression method in zip64.c or unzip64.c the BZIP2 lib is needed and HAVE_BZIP2 need to be defined.
+
+License
+----------------------------------------------------------
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+----------------------------------------------------------
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/configure.ac b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/configure.ac
new file mode 100644
index 000000000..5b1197097
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/configure.ac
@@ -0,0 +1,32 @@
+# -*- Autoconf -*-
+# Process this file with autoconf to produce a configure script.
+
+AC_INIT([minizip], [1.2.11], [bugzilla.redhat.com])
+AC_CONFIG_SRCDIR([minizip.c])
+AM_INIT_AUTOMAKE([foreign])
+LT_INIT
+
+AC_MSG_CHECKING([whether to build example programs])
+AC_ARG_ENABLE([demos], AC_HELP_STRING([--enable-demos], [build example programs]))
+AM_CONDITIONAL([COND_DEMOS], [test "$enable_demos" = yes])
+if test "$enable_demos" = yes
+then
+ AC_MSG_RESULT([yes])
+else
+ AC_MSG_RESULT([no])
+fi
+
+case "${host}" in
+ *-mingw* | mingw*)
+ WIN32="yes"
+ ;;
+ *)
+ ;;
+esac
+AM_CONDITIONAL([WIN32], [test "${WIN32}" = "yes"])
+
+
+AC_SUBST([HAVE_UNISTD_H], [0])
+AC_CHECK_HEADER([unistd.h], [HAVE_UNISTD_H=1], [])
+AC_CONFIG_FILES([Makefile minizip.pc])
+AC_OUTPUT
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/crypt.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/crypt.h
new file mode 100644
index 000000000..1e9e8200b
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/crypt.h
@@ -0,0 +1,131 @@
+/* crypt.h -- base code for crypt/uncrypt ZIPfile
+
+
+ Version 1.01e, February 12th, 2005
+
+ Copyright (C) 1998-2005 Gilles Vollant
+
+ This code is a modified version of crypting code in Infozip distribution
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+
+ If you don't need crypting in your application, just define symbols
+ NOCRYPT and NOUNCRYPT.
+
+ This code support the "Traditional PKWARE Encryption".
+
+ The new AES encryption added on Zip format by Winzip (see the page
+ http://www.winzip.com/aes_info.htm ) and PKWare PKZip 5.x Strong
+ Encryption is not supported.
+*/
+
+#define CRC32(c, b) ((*(pcrc_32_tab+(((int)(c) ^ (b)) & 0xff))) ^ ((c) >> 8))
+
+/***********************************************************************
+ * Return the next byte in the pseudo-random sequence
+ */
+static int decrypt_byte(unsigned long* pkeys, const z_crc_t* pcrc_32_tab)
+{
+ unsigned temp; /* POTENTIAL BUG: temp*(temp^1) may overflow in an
+ * unpredictable manner on 16-bit systems; not a problem
+ * with any known compiler so far, though */
+
+ temp = ((unsigned)(*(pkeys+2)) & 0xffff) | 2;
+ return (int)(((temp * (temp ^ 1)) >> 8) & 0xff);
+}
+
+/***********************************************************************
+ * Update the encryption keys with the next byte of plain text
+ */
+static int update_keys(unsigned long* pkeys,const z_crc_t* pcrc_32_tab,int c)
+{
+ (*(pkeys+0)) = CRC32((*(pkeys+0)), c);
+ (*(pkeys+1)) += (*(pkeys+0)) & 0xff;
+ (*(pkeys+1)) = (*(pkeys+1)) * 134775813L + 1;
+ {
+ register int keyshift = (int)((*(pkeys+1)) >> 24);
+ (*(pkeys+2)) = CRC32((*(pkeys+2)), keyshift);
+ }
+ return c;
+}
+
+
+/***********************************************************************
+ * Initialize the encryption keys and the random header according to
+ * the given password.
+ */
+static void init_keys(const char* passwd,unsigned long* pkeys,const z_crc_t* pcrc_32_tab)
+{
+ *(pkeys+0) = 305419896L;
+ *(pkeys+1) = 591751049L;
+ *(pkeys+2) = 878082192L;
+ while (*passwd != '\0') {
+ update_keys(pkeys,pcrc_32_tab,(int)*passwd);
+ passwd++;
+ }
+}
+
+#define zdecode(pkeys,pcrc_32_tab,c) \
+ (update_keys(pkeys,pcrc_32_tab,c ^= decrypt_byte(pkeys,pcrc_32_tab)))
+
+#define zencode(pkeys,pcrc_32_tab,c,t) \
+ (t=decrypt_byte(pkeys,pcrc_32_tab), update_keys(pkeys,pcrc_32_tab,c), t^(c))
+
+#ifdef INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+
+#define RAND_HEAD_LEN 12
+ /* "last resort" source for second part of crypt seed pattern */
+# ifndef ZCR_SEED2
+# define ZCR_SEED2 3141592654UL /* use PI as default pattern */
+# endif
+
+static int crypthead(const char* passwd, /* password string */
+ unsigned char* buf, /* where to write header */
+ int bufSize,
+ unsigned long* pkeys,
+ const z_crc_t* pcrc_32_tab,
+ unsigned long crcForCrypting)
+{
+ int n; /* index in random header */
+ int t; /* temporary */
+ int c; /* random byte */
+ unsigned char header[RAND_HEAD_LEN-2]; /* random header */
+ static unsigned calls = 0; /* ensure different random header each time */
+
+ if (bufSize<RAND_HEAD_LEN)
+ return 0;
+
+ /* First generate RAND_HEAD_LEN-2 random bytes. We encrypt the
+ * output of rand() to get less predictability, since rand() is
+ * often poorly implemented.
+ */
+ if (++calls == 1)
+ {
+ srand((unsigned)(time(NULL) ^ ZCR_SEED2));
+ }
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ c = (rand() >> 7) & 0xff;
+ header[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, c, t);
+ }
+ /* Encrypt random header (last two bytes is high word of crc) */
+ init_keys(passwd, pkeys, pcrc_32_tab);
+ for (n = 0; n < RAND_HEAD_LEN-2; n++)
+ {
+ buf[n] = (unsigned char)zencode(pkeys, pcrc_32_tab, header[n], t);
+ }
+ buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 16) & 0xff, t);
+ buf[n++] = (unsigned char)zencode(pkeys, pcrc_32_tab, (int)(crcForCrypting >> 24) & 0xff, t);
+ return n;
+}
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.c
new file mode 100644
index 000000000..7f5c191b2
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.c
@@ -0,0 +1,247 @@
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications for Zip64 support
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+*/
+
+#if defined(_WIN32) && (!(defined(_CRT_SECURE_NO_WARNINGS)))
+ #define _CRT_SECURE_NO_WARNINGS
+#endif
+
+#if defined(__APPLE__) || defined(IOAPI_NO_64)
+// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
+#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
+#define FTELLO_FUNC(stream) ftello(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
+#else
+#define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
+#define FTELLO_FUNC(stream) ftello64(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
+#endif
+
+
+#include "ioapi.h"
+
+voidpf call_zopen64 (const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode)
+{
+ if (pfilefunc->zfile_func64.zopen64_file != NULL)
+ return (*(pfilefunc->zfile_func64.zopen64_file)) (pfilefunc->zfile_func64.opaque,filename,mode);
+ else
+ {
+ return (*(pfilefunc->zopen32_file))(pfilefunc->zfile_func64.opaque,(const char*)filename,mode);
+ }
+}
+
+long call_zseek64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin)
+{
+ if (pfilefunc->zfile_func64.zseek64_file != NULL)
+ return (*(pfilefunc->zfile_func64.zseek64_file)) (pfilefunc->zfile_func64.opaque,filestream,offset,origin);
+ else
+ {
+ uLong offsetTruncated = (uLong)offset;
+ if (offsetTruncated != offset)
+ return -1;
+ else
+ return (*(pfilefunc->zseek32_file))(pfilefunc->zfile_func64.opaque,filestream,offsetTruncated,origin);
+ }
+}
+
+ZPOS64_T call_ztell64 (const zlib_filefunc64_32_def* pfilefunc,voidpf filestream)
+{
+ if (pfilefunc->zfile_func64.zseek64_file != NULL)
+ return (*(pfilefunc->zfile_func64.ztell64_file)) (pfilefunc->zfile_func64.opaque,filestream);
+ else
+ {
+ uLong tell_uLong = (*(pfilefunc->ztell32_file))(pfilefunc->zfile_func64.opaque,filestream);
+ if ((tell_uLong) == MAXU32)
+ return (ZPOS64_T)-1;
+ else
+ return tell_uLong;
+ }
+}
+
+void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32)
+{
+ p_filefunc64_32->zfile_func64.zopen64_file = NULL;
+ p_filefunc64_32->zopen32_file = p_filefunc32->zopen_file;
+ p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
+ p_filefunc64_32->zfile_func64.zread_file = p_filefunc32->zread_file;
+ p_filefunc64_32->zfile_func64.zwrite_file = p_filefunc32->zwrite_file;
+ p_filefunc64_32->zfile_func64.ztell64_file = NULL;
+ p_filefunc64_32->zfile_func64.zseek64_file = NULL;
+ p_filefunc64_32->zfile_func64.zclose_file = p_filefunc32->zclose_file;
+ p_filefunc64_32->zfile_func64.zerror_file = p_filefunc32->zerror_file;
+ p_filefunc64_32->zfile_func64.opaque = p_filefunc32->opaque;
+ p_filefunc64_32->zseek32_file = p_filefunc32->zseek_file;
+ p_filefunc64_32->ztell32_file = p_filefunc32->ztell_file;
+}
+
+
+
+static voidpf ZCALLBACK fopen_file_func OF((voidpf opaque, const char* filename, int mode));
+static uLong ZCALLBACK fread_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+static uLong ZCALLBACK fwrite_file_func OF((voidpf opaque, voidpf stream, const void* buf,uLong size));
+static ZPOS64_T ZCALLBACK ftell64_file_func OF((voidpf opaque, voidpf stream));
+static long ZCALLBACK fseek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
+static int ZCALLBACK fclose_file_func OF((voidpf opaque, voidpf stream));
+static int ZCALLBACK ferror_file_func OF((voidpf opaque, voidpf stream));
+
+static voidpf ZCALLBACK fopen_file_func (voidpf opaque, const char* filename, int mode)
+{
+ FILE* file = NULL;
+ const char* mode_fopen = NULL;
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+ mode_fopen = "rb";
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ mode_fopen = "r+b";
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+ mode_fopen = "wb";
+
+ if ((filename!=NULL) && (mode_fopen != NULL))
+ file = fopen(filename, mode_fopen);
+ return file;
+}
+
+static voidpf ZCALLBACK fopen64_file_func (voidpf opaque, const void* filename, int mode)
+{
+ FILE* file = NULL;
+ const char* mode_fopen = NULL;
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+ mode_fopen = "rb";
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ mode_fopen = "r+b";
+ else
+ if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+ mode_fopen = "wb";
+
+ if ((filename!=NULL) && (mode_fopen != NULL))
+ file = FOPEN_FUNC((const char*)filename, mode_fopen);
+ return file;
+}
+
+
+static uLong ZCALLBACK fread_file_func (voidpf opaque, voidpf stream, void* buf, uLong size)
+{
+ uLong ret;
+ ret = (uLong)fread(buf, 1, (size_t)size, (FILE *)stream);
+ return ret;
+}
+
+static uLong ZCALLBACK fwrite_file_func (voidpf opaque, voidpf stream, const void* buf, uLong size)
+{
+ uLong ret;
+ ret = (uLong)fwrite(buf, 1, (size_t)size, (FILE *)stream);
+ return ret;
+}
+
+static long ZCALLBACK ftell_file_func (voidpf opaque, voidpf stream)
+{
+ long ret;
+ ret = ftell((FILE *)stream);
+ return ret;
+}
+
+
+static ZPOS64_T ZCALLBACK ftell64_file_func (voidpf opaque, voidpf stream)
+{
+ ZPOS64_T ret;
+ ret = FTELLO_FUNC((FILE *)stream);
+ return ret;
+}
+
+static long ZCALLBACK fseek_file_func (voidpf opaque, voidpf stream, uLong offset, int origin)
+{
+ int fseek_origin=0;
+ long ret;
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ fseek_origin = SEEK_CUR;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ fseek_origin = SEEK_END;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ fseek_origin = SEEK_SET;
+ break;
+ default: return -1;
+ }
+ ret = 0;
+ if (fseek((FILE *)stream, offset, fseek_origin) != 0)
+ ret = -1;
+ return ret;
+}
+
+static long ZCALLBACK fseek64_file_func (voidpf opaque, voidpf stream, ZPOS64_T offset, int origin)
+{
+ int fseek_origin=0;
+ long ret;
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ fseek_origin = SEEK_CUR;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ fseek_origin = SEEK_END;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ fseek_origin = SEEK_SET;
+ break;
+ default: return -1;
+ }
+ ret = 0;
+
+ if(FSEEKO_FUNC((FILE *)stream, offset, fseek_origin) != 0)
+ ret = -1;
+
+ return ret;
+}
+
+
+static int ZCALLBACK fclose_file_func (voidpf opaque, voidpf stream)
+{
+ int ret;
+ ret = fclose((FILE *)stream);
+ return ret;
+}
+
+static int ZCALLBACK ferror_file_func (voidpf opaque, voidpf stream)
+{
+ int ret;
+ ret = ferror((FILE *)stream);
+ return ret;
+}
+
+void fill_fopen_filefunc (pzlib_filefunc_def)
+ zlib_filefunc_def* pzlib_filefunc_def;
+{
+ pzlib_filefunc_def->zopen_file = fopen_file_func;
+ pzlib_filefunc_def->zread_file = fread_file_func;
+ pzlib_filefunc_def->zwrite_file = fwrite_file_func;
+ pzlib_filefunc_def->ztell_file = ftell_file_func;
+ pzlib_filefunc_def->zseek_file = fseek_file_func;
+ pzlib_filefunc_def->zclose_file = fclose_file_func;
+ pzlib_filefunc_def->zerror_file = ferror_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
+
+void fill_fopen64_filefunc (zlib_filefunc64_def* pzlib_filefunc_def)
+{
+ pzlib_filefunc_def->zopen64_file = fopen64_file_func;
+ pzlib_filefunc_def->zread_file = fread_file_func;
+ pzlib_filefunc_def->zwrite_file = fwrite_file_func;
+ pzlib_filefunc_def->ztell64_file = ftell64_file_func;
+ pzlib_filefunc_def->zseek64_file = fseek64_file_func;
+ pzlib_filefunc_def->zclose_file = fclose_file_func;
+ pzlib_filefunc_def->zerror_file = ferror_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.h
new file mode 100644
index 000000000..8dcbdb06e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/ioapi.h
@@ -0,0 +1,208 @@
+/* ioapi.h -- IO base function header for compress/uncompress .zip
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications for Zip64 support
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+ Changes
+
+ Oct-2009 - Defined ZPOS64_T to fpos_t on windows and u_int64_t on linux. (might need to find a better why for this)
+ Oct-2009 - Change to fseeko64, ftello64 and fopen64 so large files would work on linux.
+ More if/def section may be needed to support other platforms
+ Oct-2009 - Defined fxxxx64 calls to normal fopen/ftell/fseek so they would compile on windows.
+ (but you should use iowin32.c for windows instead)
+
+*/
+
+#ifndef _ZLIBIOAPI64_H
+#define _ZLIBIOAPI64_H
+
+#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
+
+ // Linux needs this to support file operation on files larger then 4+GB
+ // But might need better if/def to select just the platforms that needs them.
+
+ #ifndef __USE_FILE_OFFSET64
+ #define __USE_FILE_OFFSET64
+ #endif
+ #ifndef __USE_LARGEFILE64
+ #define __USE_LARGEFILE64
+ #endif
+ #ifndef _LARGEFILE64_SOURCE
+ #define _LARGEFILE64_SOURCE
+ #endif
+ #ifndef _FILE_OFFSET_BIT
+ #define _FILE_OFFSET_BIT 64
+ #endif
+
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "zlib.h"
+
+#if defined(USE_FILE32API)
+#define fopen64 fopen
+#define ftello64 ftell
+#define fseeko64 fseek
+#else
+#ifdef __FreeBSD__
+#define fopen64 fopen
+#define ftello64 ftello
+#define fseeko64 fseeko
+#endif
+#ifdef _MSC_VER
+ #define fopen64 fopen
+ #if (_MSC_VER >= 1400) && (!(defined(NO_MSCVER_FILE64_FUNC)))
+ #define ftello64 _ftelli64
+ #define fseeko64 _fseeki64
+ #else // old MSC
+ #define ftello64 ftell
+ #define fseeko64 fseek
+ #endif
+#endif
+#endif
+
+/*
+#ifndef ZPOS64_T
+ #ifdef _WIN32
+ #define ZPOS64_T fpos_t
+ #else
+ #include <stdint.h>
+ #define ZPOS64_T uint64_t
+ #endif
+#endif
+*/
+
+#ifdef HAVE_MINIZIP64_CONF_H
+#include "mz64conf.h"
+#endif
+
+/* a type choosen by DEFINE */
+#ifdef HAVE_64BIT_INT_CUSTOM
+typedef 64BIT_INT_CUSTOM_TYPE ZPOS64_T;
+#else
+#ifdef HAS_STDINT_H
+#include "stdint.h"
+typedef uint64_t ZPOS64_T;
+#else
+
+/* Maximum unsigned 32-bit value used as placeholder for zip64 */
+#define MAXU32 0xffffffff
+
+#if defined(_MSC_VER) || defined(__BORLANDC__)
+typedef unsigned __int64 ZPOS64_T;
+#else
+typedef unsigned long long int ZPOS64_T;
+#endif
+#endif
+#endif
+
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+#define ZLIB_FILEFUNC_SEEK_CUR (1)
+#define ZLIB_FILEFUNC_SEEK_END (2)
+#define ZLIB_FILEFUNC_SEEK_SET (0)
+
+#define ZLIB_FILEFUNC_MODE_READ (1)
+#define ZLIB_FILEFUNC_MODE_WRITE (2)
+#define ZLIB_FILEFUNC_MODE_READWRITEFILTER (3)
+
+#define ZLIB_FILEFUNC_MODE_EXISTING (4)
+#define ZLIB_FILEFUNC_MODE_CREATE (8)
+
+
+#ifndef ZCALLBACK
+ #if (defined(WIN32) || defined(_WIN32) || defined (WINDOWS) || defined (_WINDOWS)) && defined(CALLBACK) && defined (USEWINDOWS_CALLBACK)
+ #define ZCALLBACK CALLBACK
+ #else
+ #define ZCALLBACK
+ #endif
+#endif
+
+
+
+
+typedef voidpf (ZCALLBACK *open_file_func) OF((voidpf opaque, const char* filename, int mode));
+typedef uLong (ZCALLBACK *read_file_func) OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+typedef uLong (ZCALLBACK *write_file_func) OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+typedef int (ZCALLBACK *close_file_func) OF((voidpf opaque, voidpf stream));
+typedef int (ZCALLBACK *testerror_file_func) OF((voidpf opaque, voidpf stream));
+
+typedef long (ZCALLBACK *tell_file_func) OF((voidpf opaque, voidpf stream));
+typedef long (ZCALLBACK *seek_file_func) OF((voidpf opaque, voidpf stream, uLong offset, int origin));
+
+
+/* here is the "old" 32 bits structure structure */
+typedef struct zlib_filefunc_def_s
+{
+ open_file_func zopen_file;
+ read_file_func zread_file;
+ write_file_func zwrite_file;
+ tell_file_func ztell_file;
+ seek_file_func zseek_file;
+ close_file_func zclose_file;
+ testerror_file_func zerror_file;
+ voidpf opaque;
+} zlib_filefunc_def;
+
+typedef ZPOS64_T (ZCALLBACK *tell64_file_func) OF((voidpf opaque, voidpf stream));
+typedef long (ZCALLBACK *seek64_file_func) OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
+typedef voidpf (ZCALLBACK *open64_file_func) OF((voidpf opaque, const void* filename, int mode));
+
+typedef struct zlib_filefunc64_def_s
+{
+ open64_file_func zopen64_file;
+ read_file_func zread_file;
+ write_file_func zwrite_file;
+ tell64_file_func ztell64_file;
+ seek64_file_func zseek64_file;
+ close_file_func zclose_file;
+ testerror_file_func zerror_file;
+ voidpf opaque;
+} zlib_filefunc64_def;
+
+void fill_fopen64_filefunc OF((zlib_filefunc64_def* pzlib_filefunc_def));
+void fill_fopen_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+
+/* now internal definition, only for zip.c and unzip.h */
+typedef struct zlib_filefunc64_32_def_s
+{
+ zlib_filefunc64_def zfile_func64;
+ open_file_func zopen32_file;
+ tell_file_func ztell32_file;
+ seek_file_func zseek32_file;
+} zlib_filefunc64_32_def;
+
+
+#define ZREAD64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zread_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
+#define ZWRITE64(filefunc,filestream,buf,size) ((*((filefunc).zfile_func64.zwrite_file)) ((filefunc).zfile_func64.opaque,filestream,buf,size))
+//#define ZTELL64(filefunc,filestream) ((*((filefunc).ztell64_file)) ((filefunc).opaque,filestream))
+//#define ZSEEK64(filefunc,filestream,pos,mode) ((*((filefunc).zseek64_file)) ((filefunc).opaque,filestream,pos,mode))
+#define ZCLOSE64(filefunc,filestream) ((*((filefunc).zfile_func64.zclose_file)) ((filefunc).zfile_func64.opaque,filestream))
+#define ZERROR64(filefunc,filestream) ((*((filefunc).zfile_func64.zerror_file)) ((filefunc).zfile_func64.opaque,filestream))
+
+voidpf call_zopen64 OF((const zlib_filefunc64_32_def* pfilefunc,const void*filename,int mode));
+long call_zseek64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream, ZPOS64_T offset, int origin));
+ZPOS64_T call_ztell64 OF((const zlib_filefunc64_32_def* pfilefunc,voidpf filestream));
+
+void fill_zlib_filefunc64_32_def_from_filefunc32(zlib_filefunc64_32_def* p_filefunc64_32,const zlib_filefunc_def* p_filefunc32);
+
+#define ZOPEN64(filefunc,filename,mode) (call_zopen64((&(filefunc)),(filename),(mode)))
+#define ZTELL64(filefunc,filestream) (call_ztell64((&(filefunc)),(filestream)))
+#define ZSEEK64(filefunc,filestream,pos,mode) (call_zseek64((&(filefunc)),(filestream),(pos),(mode)))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.c
new file mode 100644
index 000000000..274f39eb1
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.c
@@ -0,0 +1,462 @@
+/* iowin32.c -- IO base function header for compress/uncompress .zip
+ Version 1.1, February 14h, 2010
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications for Zip64 support
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+*/
+
+#include <stdlib.h>
+
+#include "zlib.h"
+#include "ioapi.h"
+#include "iowin32.h"
+
+#ifndef INVALID_HANDLE_VALUE
+#define INVALID_HANDLE_VALUE (0xFFFFFFFF)
+#endif
+
+#ifndef INVALID_SET_FILE_POINTER
+#define INVALID_SET_FILE_POINTER ((DWORD)-1)
+#endif
+
+
+// see Include/shared/winapifamily.h in the Windows Kit
+#if defined(WINAPI_FAMILY_PARTITION) && (!(defined(IOWIN32_USING_WINRT_API)))
+#if WINAPI_FAMILY_ONE_PARTITION(WINAPI_FAMILY, WINAPI_PARTITION_APP)
+#define IOWIN32_USING_WINRT_API 1
+#endif
+#endif
+
+voidpf ZCALLBACK win32_open_file_func OF((voidpf opaque, const char* filename, int mode));
+uLong ZCALLBACK win32_read_file_func OF((voidpf opaque, voidpf stream, void* buf, uLong size));
+uLong ZCALLBACK win32_write_file_func OF((voidpf opaque, voidpf stream, const void* buf, uLong size));
+ZPOS64_T ZCALLBACK win32_tell64_file_func OF((voidpf opaque, voidpf stream));
+long ZCALLBACK win32_seek64_file_func OF((voidpf opaque, voidpf stream, ZPOS64_T offset, int origin));
+int ZCALLBACK win32_close_file_func OF((voidpf opaque, voidpf stream));
+int ZCALLBACK win32_error_file_func OF((voidpf opaque, voidpf stream));
+
+typedef struct
+{
+ HANDLE hf;
+ int error;
+} WIN32FILE_IOWIN;
+
+
+static void win32_translate_open_mode(int mode,
+ DWORD* lpdwDesiredAccess,
+ DWORD* lpdwCreationDisposition,
+ DWORD* lpdwShareMode,
+ DWORD* lpdwFlagsAndAttributes)
+{
+ *lpdwDesiredAccess = *lpdwShareMode = *lpdwFlagsAndAttributes = *lpdwCreationDisposition = 0;
+
+ if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
+ {
+ *lpdwDesiredAccess = GENERIC_READ;
+ *lpdwCreationDisposition = OPEN_EXISTING;
+ *lpdwShareMode = FILE_SHARE_READ;
+ }
+ else if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
+ {
+ *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+ *lpdwCreationDisposition = OPEN_EXISTING;
+ }
+ else if (mode & ZLIB_FILEFUNC_MODE_CREATE)
+ {
+ *lpdwDesiredAccess = GENERIC_WRITE | GENERIC_READ;
+ *lpdwCreationDisposition = CREATE_ALWAYS;
+ }
+}
+
+static voidpf win32_build_iowin(HANDLE hFile)
+{
+ voidpf ret=NULL;
+
+ if ((hFile != NULL) && (hFile != INVALID_HANDLE_VALUE))
+ {
+ WIN32FILE_IOWIN w32fiow;
+ w32fiow.hf = hFile;
+ w32fiow.error = 0;
+ ret = malloc(sizeof(WIN32FILE_IOWIN));
+
+ if (ret==NULL)
+ CloseHandle(hFile);
+ else
+ *((WIN32FILE_IOWIN*)ret) = w32fiow;
+ }
+ return ret;
+}
+
+voidpf ZCALLBACK win32_open64_file_func (voidpf opaque,const void* filename,int mode)
+{
+ const char* mode_fopen = NULL;
+ DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+ HANDLE hFile = NULL;
+
+ win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+#ifdef IOWIN32_USING_WINRT_API
+#ifdef UNICODE
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
+#else
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ {
+ WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
+ MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
+ hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
+ }
+#endif
+#else
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+#endif
+
+ return win32_build_iowin(hFile);
+}
+
+
+voidpf ZCALLBACK win32_open64_file_funcA (voidpf opaque,const void* filename,int mode)
+{
+ const char* mode_fopen = NULL;
+ DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+ HANDLE hFile = NULL;
+
+ win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+#ifdef IOWIN32_USING_WINRT_API
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ {
+ WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
+ MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
+ hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
+ }
+#else
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFileA((LPCSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+#endif
+
+ return win32_build_iowin(hFile);
+}
+
+
+voidpf ZCALLBACK win32_open64_file_funcW (voidpf opaque,const void* filename,int mode)
+{
+ const char* mode_fopen = NULL;
+ DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+ HANDLE hFile = NULL;
+
+ win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+#ifdef IOWIN32_USING_WINRT_API
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFile2((LPCWSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition,NULL);
+#else
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFileW((LPCWSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+#endif
+
+ return win32_build_iowin(hFile);
+}
+
+
+voidpf ZCALLBACK win32_open_file_func (voidpf opaque,const char* filename,int mode)
+{
+ const char* mode_fopen = NULL;
+ DWORD dwDesiredAccess,dwCreationDisposition,dwShareMode,dwFlagsAndAttributes ;
+ HANDLE hFile = NULL;
+
+ win32_translate_open_mode(mode,&dwDesiredAccess,&dwCreationDisposition,&dwShareMode,&dwFlagsAndAttributes);
+
+#ifdef IOWIN32_USING_WINRT_API
+#ifdef UNICODE
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFile2((LPCTSTR)filename, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
+#else
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ {
+ WCHAR filenameW[FILENAME_MAX + 0x200 + 1];
+ MultiByteToWideChar(CP_ACP,0,(const char*)filename,-1,filenameW,FILENAME_MAX + 0x200);
+ hFile = CreateFile2(filenameW, dwDesiredAccess, dwShareMode, dwCreationDisposition, NULL);
+ }
+#endif
+#else
+ if ((filename!=NULL) && (dwDesiredAccess != 0))
+ hFile = CreateFile((LPCTSTR)filename, dwDesiredAccess, dwShareMode, NULL, dwCreationDisposition, dwFlagsAndAttributes, NULL);
+#endif
+
+ return win32_build_iowin(hFile);
+}
+
+
+uLong ZCALLBACK win32_read_file_func (voidpf opaque, voidpf stream, void* buf,uLong size)
+{
+ uLong ret=0;
+ HANDLE hFile = NULL;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+
+ if (hFile != NULL)
+ {
+ if (!ReadFile(hFile, buf, size, &ret, NULL))
+ {
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_HANDLE_EOF)
+ dwErr = 0;
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ }
+ }
+
+ return ret;
+}
+
+
+uLong ZCALLBACK win32_write_file_func (voidpf opaque,voidpf stream,const void* buf,uLong size)
+{
+ uLong ret=0;
+ HANDLE hFile = NULL;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+
+ if (hFile != NULL)
+ {
+ if (!WriteFile(hFile, buf, size, &ret, NULL))
+ {
+ DWORD dwErr = GetLastError();
+ if (dwErr == ERROR_HANDLE_EOF)
+ dwErr = 0;
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ }
+ }
+
+ return ret;
+}
+
+static BOOL MySetFilePointerEx(HANDLE hFile, LARGE_INTEGER pos, LARGE_INTEGER *newPos, DWORD dwMoveMethod)
+{
+#ifdef IOWIN32_USING_WINRT_API
+ return SetFilePointerEx(hFile, pos, newPos, dwMoveMethod);
+#else
+ LONG lHigh = pos.HighPart;
+ DWORD dwNewPos = SetFilePointer(hFile, pos.LowPart, &lHigh, dwMoveMethod);
+ BOOL fOk = TRUE;
+ if (dwNewPos == 0xFFFFFFFF)
+ if (GetLastError() != NO_ERROR)
+ fOk = FALSE;
+ if ((newPos != NULL) && (fOk))
+ {
+ newPos->LowPart = dwNewPos;
+ newPos->HighPart = lHigh;
+ }
+ return fOk;
+#endif
+}
+
+long ZCALLBACK win32_tell_file_func (voidpf opaque,voidpf stream)
+{
+ long ret=-1;
+ HANDLE hFile = NULL;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+ if (hFile != NULL)
+ {
+ LARGE_INTEGER pos;
+ pos.QuadPart = 0;
+
+ if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT))
+ {
+ DWORD dwErr = GetLastError();
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ ret = -1;
+ }
+ else
+ ret=(long)pos.LowPart;
+ }
+ return ret;
+}
+
+ZPOS64_T ZCALLBACK win32_tell64_file_func (voidpf opaque, voidpf stream)
+{
+ ZPOS64_T ret= (ZPOS64_T)-1;
+ HANDLE hFile = NULL;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream)->hf;
+
+ if (hFile)
+ {
+ LARGE_INTEGER pos;
+ pos.QuadPart = 0;
+
+ if (!MySetFilePointerEx(hFile, pos, &pos, FILE_CURRENT))
+ {
+ DWORD dwErr = GetLastError();
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ ret = (ZPOS64_T)-1;
+ }
+ else
+ ret=pos.QuadPart;
+ }
+ return ret;
+}
+
+
+long ZCALLBACK win32_seek_file_func (voidpf opaque,voidpf stream,uLong offset,int origin)
+{
+ DWORD dwMoveMethod=0xFFFFFFFF;
+ HANDLE hFile = NULL;
+
+ long ret=-1;
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ dwMoveMethod = FILE_CURRENT;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ dwMoveMethod = FILE_END;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ dwMoveMethod = FILE_BEGIN;
+ break;
+ default: return -1;
+ }
+
+ if (hFile != NULL)
+ {
+ LARGE_INTEGER pos;
+ pos.QuadPart = offset;
+ if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod))
+ {
+ DWORD dwErr = GetLastError();
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ ret = -1;
+ }
+ else
+ ret=0;
+ }
+ return ret;
+}
+
+long ZCALLBACK win32_seek64_file_func (voidpf opaque, voidpf stream,ZPOS64_T offset,int origin)
+{
+ DWORD dwMoveMethod=0xFFFFFFFF;
+ HANDLE hFile = NULL;
+ long ret=-1;
+
+ if (stream!=NULL)
+ hFile = ((WIN32FILE_IOWIN*)stream)->hf;
+
+ switch (origin)
+ {
+ case ZLIB_FILEFUNC_SEEK_CUR :
+ dwMoveMethod = FILE_CURRENT;
+ break;
+ case ZLIB_FILEFUNC_SEEK_END :
+ dwMoveMethod = FILE_END;
+ break;
+ case ZLIB_FILEFUNC_SEEK_SET :
+ dwMoveMethod = FILE_BEGIN;
+ break;
+ default: return -1;
+ }
+
+ if (hFile)
+ {
+ LARGE_INTEGER pos;
+ pos.QuadPart = offset;
+ if (!MySetFilePointerEx(hFile, pos, NULL, dwMoveMethod))
+ {
+ DWORD dwErr = GetLastError();
+ ((WIN32FILE_IOWIN*)stream) -> error=(int)dwErr;
+ ret = -1;
+ }
+ else
+ ret=0;
+ }
+ return ret;
+}
+
+int ZCALLBACK win32_close_file_func (voidpf opaque, voidpf stream)
+{
+ int ret=-1;
+
+ if (stream!=NULL)
+ {
+ HANDLE hFile;
+ hFile = ((WIN32FILE_IOWIN*)stream) -> hf;
+ if (hFile != NULL)
+ {
+ CloseHandle(hFile);
+ ret=0;
+ }
+ free(stream);
+ }
+ return ret;
+}
+
+int ZCALLBACK win32_error_file_func (voidpf opaque,voidpf stream)
+{
+ int ret=-1;
+ if (stream!=NULL)
+ {
+ ret = ((WIN32FILE_IOWIN*)stream) -> error;
+ }
+ return ret;
+}
+
+void fill_win32_filefunc (zlib_filefunc_def* pzlib_filefunc_def)
+{
+ pzlib_filefunc_def->zopen_file = win32_open_file_func;
+ pzlib_filefunc_def->zread_file = win32_read_file_func;
+ pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+ pzlib_filefunc_def->ztell_file = win32_tell_file_func;
+ pzlib_filefunc_def->zseek_file = win32_seek_file_func;
+ pzlib_filefunc_def->zclose_file = win32_close_file_func;
+ pzlib_filefunc_def->zerror_file = win32_error_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
+
+void fill_win32_filefunc64(zlib_filefunc64_def* pzlib_filefunc_def)
+{
+ pzlib_filefunc_def->zopen64_file = win32_open64_file_func;
+ pzlib_filefunc_def->zread_file = win32_read_file_func;
+ pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+ pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
+ pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
+ pzlib_filefunc_def->zclose_file = win32_close_file_func;
+ pzlib_filefunc_def->zerror_file = win32_error_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
+
+
+void fill_win32_filefunc64A(zlib_filefunc64_def* pzlib_filefunc_def)
+{
+ pzlib_filefunc_def->zopen64_file = win32_open64_file_funcA;
+ pzlib_filefunc_def->zread_file = win32_read_file_func;
+ pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+ pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
+ pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
+ pzlib_filefunc_def->zclose_file = win32_close_file_func;
+ pzlib_filefunc_def->zerror_file = win32_error_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
+
+
+void fill_win32_filefunc64W(zlib_filefunc64_def* pzlib_filefunc_def)
+{
+ pzlib_filefunc_def->zopen64_file = win32_open64_file_funcW;
+ pzlib_filefunc_def->zread_file = win32_read_file_func;
+ pzlib_filefunc_def->zwrite_file = win32_write_file_func;
+ pzlib_filefunc_def->ztell64_file = win32_tell64_file_func;
+ pzlib_filefunc_def->zseek64_file = win32_seek64_file_func;
+ pzlib_filefunc_def->zclose_file = win32_close_file_func;
+ pzlib_filefunc_def->zerror_file = win32_error_file_func;
+ pzlib_filefunc_def->opaque = NULL;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.h
new file mode 100644
index 000000000..0ca0969a7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/iowin32.h
@@ -0,0 +1,28 @@
+/* iowin32.h -- IO base function header for compress/uncompress .zip
+ Version 1.1, February 14h, 2010
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications for Zip64 support
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+*/
+
+#include <windows.h>
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+void fill_win32_filefunc OF((zlib_filefunc_def* pzlib_filefunc_def));
+void fill_win32_filefunc64 OF((zlib_filefunc64_def* pzlib_filefunc_def));
+void fill_win32_filefunc64A OF((zlib_filefunc64_def* pzlib_filefunc_def));
+void fill_win32_filefunc64W OF((zlib_filefunc64_def* pzlib_filefunc_def));
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/make_vms.com b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/make_vms.com
new file mode 100644
index 000000000..9ac13a98f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/make_vms.com
@@ -0,0 +1,25 @@
+$ if f$search("ioapi.h_orig") .eqs. "" then copy ioapi.h ioapi.h_orig
+$ open/write zdef vmsdefs.h
+$ copy sys$input: zdef
+$ deck
+#define unix
+#define fill_zlib_filefunc64_32_def_from_filefunc32 fillzffunc64from
+#define Write_Zip64EndOfCentralDirectoryLocator Write_Zip64EoDLocator
+#define Write_Zip64EndOfCentralDirectoryRecord Write_Zip64EoDRecord
+#define Write_EndOfCentralDirectoryRecord Write_EoDRecord
+$ eod
+$ close zdef
+$ copy vmsdefs.h,ioapi.h_orig ioapi.h
+$ cc/include=[--]/prefix=all ioapi.c
+$ cc/include=[--]/prefix=all miniunz.c
+$ cc/include=[--]/prefix=all unzip.c
+$ cc/include=[--]/prefix=all minizip.c
+$ cc/include=[--]/prefix=all zip.c
+$ link miniunz,unzip,ioapi,[--]libz.olb/lib
+$ link minizip,zip,ioapi,[--]libz.olb/lib
+$ mcr []minizip test minizip_info.txt
+$ mcr []miniunz -l test.zip
+$ rename minizip_info.txt; minizip_info.txt_old
+$ mcr []miniunz test.zip
+$ delete test.zip;*
+$exit
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunz.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunz.c
new file mode 100644
index 000000000..3d65401be
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunz.c
@@ -0,0 +1,660 @@
+/*
+ miniunz.c
+ Version 1.1, February 14h, 2010
+ sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications of Unzip for Zip64
+ Copyright (C) 2007-2008 Even Rouault
+
+ Modifications for Zip64 support on both zip and unzip
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+*/
+
+#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
+ #ifndef __USE_FILE_OFFSET64
+ #define __USE_FILE_OFFSET64
+ #endif
+ #ifndef __USE_LARGEFILE64
+ #define __USE_LARGEFILE64
+ #endif
+ #ifndef _LARGEFILE64_SOURCE
+ #define _LARGEFILE64_SOURCE
+ #endif
+ #ifndef _FILE_OFFSET_BIT
+ #define _FILE_OFFSET_BIT 64
+ #endif
+#endif
+
+#ifdef __APPLE__
+// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
+#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
+#define FTELLO_FUNC(stream) ftello(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
+#else
+#define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
+#define FTELLO_FUNC(stream) ftello64(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
+#endif
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifdef _WIN32
+# include <direct.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <utime.h>
+#endif
+
+
+#include "unzip.h"
+
+#define CASESENSITIVITY (0)
+#define WRITEBUFFERSIZE (8192)
+#define MAXFILENAME (256)
+
+#ifdef _WIN32
+#define USEWIN32IOAPI
+#include "iowin32.h"
+#endif
+/*
+ mini unzip, demo of unzip package
+
+ usage :
+ Usage : miniunz [-exvlo] file.zip [file_to_extract] [-d extractdir]
+
+ list the file in the zipfile, and print the content of FILE_ID.ZIP or README.TXT
+ if it exists
+*/
+
+
+/* change_file_date : change the date/time of a file
+ filename : the filename of the file where date/time must be modified
+ dosdate : the new date at the MSDos format (4 bytes)
+ tmu_date : the SAME new date at the tm_unz format */
+void change_file_date(filename,dosdate,tmu_date)
+ const char *filename;
+ uLong dosdate;
+ tm_unz tmu_date;
+{
+#ifdef _WIN32
+ HANDLE hFile;
+ FILETIME ftm,ftLocal,ftCreate,ftLastAcc,ftLastWrite;
+
+ hFile = CreateFileA(filename,GENERIC_READ | GENERIC_WRITE,
+ 0,NULL,OPEN_EXISTING,0,NULL);
+ GetFileTime(hFile,&ftCreate,&ftLastAcc,&ftLastWrite);
+ DosDateTimeToFileTime((WORD)(dosdate>>16),(WORD)dosdate,&ftLocal);
+ LocalFileTimeToFileTime(&ftLocal,&ftm);
+ SetFileTime(hFile,&ftm,&ftLastAcc,&ftm);
+ CloseHandle(hFile);
+#else
+#ifdef unix || __APPLE__
+ struct utimbuf ut;
+ struct tm newdate;
+ newdate.tm_sec = tmu_date.tm_sec;
+ newdate.tm_min=tmu_date.tm_min;
+ newdate.tm_hour=tmu_date.tm_hour;
+ newdate.tm_mday=tmu_date.tm_mday;
+ newdate.tm_mon=tmu_date.tm_mon;
+ if (tmu_date.tm_year > 1900)
+ newdate.tm_year=tmu_date.tm_year - 1900;
+ else
+ newdate.tm_year=tmu_date.tm_year ;
+ newdate.tm_isdst=-1;
+
+ ut.actime=ut.modtime=mktime(&newdate);
+ utime(filename,&ut);
+#endif
+#endif
+}
+
+
+/* mymkdir and change_file_date are not 100 % portable
+ As I don't know well Unix, I wait feedback for the unix portion */
+
+int mymkdir(dirname)
+ const char* dirname;
+{
+ int ret=0;
+#ifdef _WIN32
+ ret = _mkdir(dirname);
+#elif unix
+ ret = mkdir (dirname,0775);
+#elif __APPLE__
+ ret = mkdir (dirname,0775);
+#endif
+ return ret;
+}
+
+int makedir (newdir)
+ char *newdir;
+{
+ char *buffer ;
+ char *p;
+ int len = (int)strlen(newdir);
+
+ if (len <= 0)
+ return 0;
+
+ buffer = (char*)malloc(len+1);
+ if (buffer==NULL)
+ {
+ printf("Error allocating memory\n");
+ return UNZ_INTERNALERROR;
+ }
+ strcpy(buffer,newdir);
+
+ if (buffer[len-1] == '/') {
+ buffer[len-1] = '\0';
+ }
+ if (mymkdir(buffer) == 0)
+ {
+ free(buffer);
+ return 1;
+ }
+
+ p = buffer+1;
+ while (1)
+ {
+ char hold;
+
+ while(*p && *p != '\\' && *p != '/')
+ p++;
+ hold = *p;
+ *p = 0;
+ if ((mymkdir(buffer) == -1) && (errno == ENOENT))
+ {
+ printf("couldn't create directory %s\n",buffer);
+ free(buffer);
+ return 0;
+ }
+ if (hold == 0)
+ break;
+ *p++ = hold;
+ }
+ free(buffer);
+ return 1;
+}
+
+void do_banner()
+{
+ printf("MiniUnz 1.01b, demo of zLib + Unz package written by Gilles Vollant\n");
+ printf("more info at http://www.winimage.com/zLibDll/unzip.html\n\n");
+}
+
+void do_help()
+{
+ printf("Usage : miniunz [-e] [-x] [-v] [-l] [-o] [-p password] file.zip [file_to_extr.] [-d extractdir]\n\n" \
+ " -e Extract without pathname (junk paths)\n" \
+ " -x Extract with pathname\n" \
+ " -v list files\n" \
+ " -l list files\n" \
+ " -d directory to extract into\n" \
+ " -o overwrite files without prompting\n" \
+ " -p extract crypted file using password\n\n");
+}
+
+void Display64BitsSize(ZPOS64_T n, int size_char)
+{
+ /* to avoid compatibility problem , we do here the conversion */
+ char number[21];
+ int offset=19;
+ int pos_string = 19;
+ number[20]=0;
+ for (;;) {
+ number[offset]=(char)((n%10)+'0');
+ if (number[offset] != '0')
+ pos_string=offset;
+ n/=10;
+ if (offset==0)
+ break;
+ offset--;
+ }
+ {
+ int size_display_string = 19-pos_string;
+ while (size_char > size_display_string)
+ {
+ size_char--;
+ printf(" ");
+ }
+ }
+
+ printf("%s",&number[pos_string]);
+}
+
+int do_list(uf)
+ unzFile uf;
+{
+ uLong i;
+ unz_global_info64 gi;
+ int err;
+
+ err = unzGetGlobalInfo64(uf,&gi);
+ if (err!=UNZ_OK)
+ printf("error %d with zipfile in unzGetGlobalInfo \n",err);
+ printf(" Length Method Size Ratio Date Time CRC-32 Name\n");
+ printf(" ------ ------ ---- ----- ---- ---- ------ ----\n");
+ for (i=0;i<gi.number_entry;i++)
+ {
+ char filename_inzip[256];
+ unz_file_info64 file_info;
+ uLong ratio=0;
+ const char *string_method;
+ char charCrypt=' ';
+ err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
+ break;
+ }
+ if (file_info.uncompressed_size>0)
+ ratio = (uLong)((file_info.compressed_size*100)/file_info.uncompressed_size);
+
+ /* display a '*' if the file is crypted */
+ if ((file_info.flag & 1) != 0)
+ charCrypt='*';
+
+ if (file_info.compression_method==0)
+ string_method="Stored";
+ else
+ if (file_info.compression_method==Z_DEFLATED)
+ {
+ uInt iLevel=(uInt)((file_info.flag & 0x6)/2);
+ if (iLevel==0)
+ string_method="Defl:N";
+ else if (iLevel==1)
+ string_method="Defl:X";
+ else if ((iLevel==2) || (iLevel==3))
+ string_method="Defl:F"; /* 2:fast , 3 : extra fast*/
+ }
+ else
+ if (file_info.compression_method==Z_BZIP2ED)
+ {
+ string_method="BZip2 ";
+ }
+ else
+ string_method="Unkn. ";
+
+ Display64BitsSize(file_info.uncompressed_size,7);
+ printf(" %6s%c",string_method,charCrypt);
+ Display64BitsSize(file_info.compressed_size,7);
+ printf(" %3lu%% %2.2lu-%2.2lu-%2.2lu %2.2lu:%2.2lu %8.8lx %s\n",
+ ratio,
+ (uLong)file_info.tmu_date.tm_mon + 1,
+ (uLong)file_info.tmu_date.tm_mday,
+ (uLong)file_info.tmu_date.tm_year % 100,
+ (uLong)file_info.tmu_date.tm_hour,(uLong)file_info.tmu_date.tm_min,
+ (uLong)file_info.crc,filename_inzip);
+ if ((i+1)<gi.number_entry)
+ {
+ err = unzGoToNextFile(uf);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGoToNextFile\n",err);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+
+int do_extract_currentfile(uf,popt_extract_without_path,popt_overwrite,password)
+ unzFile uf;
+ const int* popt_extract_without_path;
+ int* popt_overwrite;
+ const char* password;
+{
+ char filename_inzip[256];
+ char* filename_withoutpath;
+ char* p;
+ int err=UNZ_OK;
+ FILE *fout=NULL;
+ void* buf;
+ uInt size_buf;
+
+ unz_file_info64 file_info;
+ uLong ratio=0;
+ err = unzGetCurrentFileInfo64(uf,&file_info,filename_inzip,sizeof(filename_inzip),NULL,0,NULL,0);
+
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGetCurrentFileInfo\n",err);
+ return err;
+ }
+
+ size_buf = WRITEBUFFERSIZE;
+ buf = (void*)malloc(size_buf);
+ if (buf==NULL)
+ {
+ printf("Error allocating memory\n");
+ return UNZ_INTERNALERROR;
+ }
+
+ p = filename_withoutpath = filename_inzip;
+ while ((*p) != '\0')
+ {
+ if (((*p)=='/') || ((*p)=='\\'))
+ filename_withoutpath = p+1;
+ p++;
+ }
+
+ if ((*filename_withoutpath)=='\0')
+ {
+ if ((*popt_extract_without_path)==0)
+ {
+ printf("creating directory: %s\n",filename_inzip);
+ mymkdir(filename_inzip);
+ }
+ }
+ else
+ {
+ const char* write_filename;
+ int skip=0;
+
+ if ((*popt_extract_without_path)==0)
+ write_filename = filename_inzip;
+ else
+ write_filename = filename_withoutpath;
+
+ err = unzOpenCurrentFilePassword(uf,password);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzOpenCurrentFilePassword\n",err);
+ }
+
+ if (((*popt_overwrite)==0) && (err==UNZ_OK))
+ {
+ char rep=0;
+ FILE* ftestexist;
+ ftestexist = FOPEN_FUNC(write_filename,"rb");
+ if (ftestexist!=NULL)
+ {
+ fclose(ftestexist);
+ do
+ {
+ char answer[128];
+ int ret;
+
+ printf("The file %s exists. Overwrite ? [y]es, [n]o, [A]ll: ",write_filename);
+ ret = scanf("%1s",answer);
+ if (ret != 1)
+ {
+ exit(EXIT_FAILURE);
+ }
+ rep = answer[0] ;
+ if ((rep>='a') && (rep<='z'))
+ rep -= 0x20;
+ }
+ while ((rep!='Y') && (rep!='N') && (rep!='A'));
+ }
+
+ if (rep == 'N')
+ skip = 1;
+
+ if (rep == 'A')
+ *popt_overwrite=1;
+ }
+
+ if ((skip==0) && (err==UNZ_OK))
+ {
+ fout=FOPEN_FUNC(write_filename,"wb");
+ /* some zipfile don't contain directory alone before file */
+ if ((fout==NULL) && ((*popt_extract_without_path)==0) &&
+ (filename_withoutpath!=(char*)filename_inzip))
+ {
+ char c=*(filename_withoutpath-1);
+ *(filename_withoutpath-1)='\0';
+ makedir(write_filename);
+ *(filename_withoutpath-1)=c;
+ fout=FOPEN_FUNC(write_filename,"wb");
+ }
+
+ if (fout==NULL)
+ {
+ printf("error opening %s\n",write_filename);
+ }
+ }
+
+ if (fout!=NULL)
+ {
+ printf(" extracting: %s\n",write_filename);
+
+ do
+ {
+ err = unzReadCurrentFile(uf,buf,size_buf);
+ if (err<0)
+ {
+ printf("error %d with zipfile in unzReadCurrentFile\n",err);
+ break;
+ }
+ if (err>0)
+ if (fwrite(buf,err,1,fout)!=1)
+ {
+ printf("error in writing extracted file\n");
+ err=UNZ_ERRNO;
+ break;
+ }
+ }
+ while (err>0);
+ if (fout)
+ fclose(fout);
+
+ if (err==0)
+ change_file_date(write_filename,file_info.dosDate,
+ file_info.tmu_date);
+ }
+
+ if (err==UNZ_OK)
+ {
+ err = unzCloseCurrentFile (uf);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzCloseCurrentFile\n",err);
+ }
+ }
+ else
+ unzCloseCurrentFile(uf); /* don't lose the error */
+ }
+
+ free(buf);
+ return err;
+}
+
+
+int do_extract(uf,opt_extract_without_path,opt_overwrite,password)
+ unzFile uf;
+ int opt_extract_without_path;
+ int opt_overwrite;
+ const char* password;
+{
+ uLong i;
+ unz_global_info64 gi;
+ int err;
+ FILE* fout=NULL;
+
+ err = unzGetGlobalInfo64(uf,&gi);
+ if (err!=UNZ_OK)
+ printf("error %d with zipfile in unzGetGlobalInfo \n",err);
+
+ for (i=0;i<gi.number_entry;i++)
+ {
+ if (do_extract_currentfile(uf,&opt_extract_without_path,
+ &opt_overwrite,
+ password) != UNZ_OK)
+ break;
+
+ if ((i+1)<gi.number_entry)
+ {
+ err = unzGoToNextFile(uf);
+ if (err!=UNZ_OK)
+ {
+ printf("error %d with zipfile in unzGoToNextFile\n",err);
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+int do_extract_onefile(uf,filename,opt_extract_without_path,opt_overwrite,password)
+ unzFile uf;
+ const char* filename;
+ int opt_extract_without_path;
+ int opt_overwrite;
+ const char* password;
+{
+ int err = UNZ_OK;
+ if (unzLocateFile(uf,filename,CASESENSITIVITY)!=UNZ_OK)
+ {
+ printf("file %s not found in the zipfile\n",filename);
+ return 2;
+ }
+
+ if (do_extract_currentfile(uf,&opt_extract_without_path,
+ &opt_overwrite,
+ password) == UNZ_OK)
+ return 0;
+ else
+ return 1;
+}
+
+
+int main(argc,argv)
+ int argc;
+ char *argv[];
+{
+ const char *zipfilename=NULL;
+ const char *filename_to_extract=NULL;
+ const char *password=NULL;
+ char filename_try[MAXFILENAME+16] = "";
+ int i;
+ int ret_value=0;
+ int opt_do_list=0;
+ int opt_do_extract=1;
+ int opt_do_extract_withoutpath=0;
+ int opt_overwrite=0;
+ int opt_extractdir=0;
+ const char *dirname=NULL;
+ unzFile uf=NULL;
+
+ do_banner();
+ if (argc==1)
+ {
+ do_help();
+ return 0;
+ }
+ else
+ {
+ for (i=1;i<argc;i++)
+ {
+ if ((*argv[i])=='-')
+ {
+ const char *p=argv[i]+1;
+
+ while ((*p)!='\0')
+ {
+ char c=*(p++);;
+ if ((c=='l') || (c=='L'))
+ opt_do_list = 1;
+ if ((c=='v') || (c=='V'))
+ opt_do_list = 1;
+ if ((c=='x') || (c=='X'))
+ opt_do_extract = 1;
+ if ((c=='e') || (c=='E'))
+ opt_do_extract = opt_do_extract_withoutpath = 1;
+ if ((c=='o') || (c=='O'))
+ opt_overwrite=1;
+ if ((c=='d') || (c=='D'))
+ {
+ opt_extractdir=1;
+ dirname=argv[i+1];
+ }
+
+ if (((c=='p') || (c=='P')) && (i+1<argc))
+ {
+ password=argv[i+1];
+ i++;
+ }
+ }
+ }
+ else
+ {
+ if (zipfilename == NULL)
+ zipfilename = argv[i];
+ else if ((filename_to_extract==NULL) && (!opt_extractdir))
+ filename_to_extract = argv[i] ;
+ }
+ }
+ }
+
+ if (zipfilename!=NULL)
+ {
+
+# ifdef USEWIN32IOAPI
+ zlib_filefunc64_def ffunc;
+# endif
+
+ strncpy(filename_try, zipfilename,MAXFILENAME-1);
+ /* strncpy doesnt append the trailing NULL, of the string is too long. */
+ filename_try[ MAXFILENAME ] = '\0';
+
+# ifdef USEWIN32IOAPI
+ fill_win32_filefunc64A(&ffunc);
+ uf = unzOpen2_64(zipfilename,&ffunc);
+# else
+ uf = unzOpen64(zipfilename);
+# endif
+ if (uf==NULL)
+ {
+ strcat(filename_try,".zip");
+# ifdef USEWIN32IOAPI
+ uf = unzOpen2_64(filename_try,&ffunc);
+# else
+ uf = unzOpen64(filename_try);
+# endif
+ }
+ }
+
+ if (uf==NULL)
+ {
+ printf("Cannot open %s or %s.zip\n",zipfilename,zipfilename);
+ return 1;
+ }
+ printf("%s opened\n",filename_try);
+
+ if (opt_do_list==1)
+ ret_value = do_list(uf);
+ else if (opt_do_extract==1)
+ {
+#ifdef _WIN32
+ if (opt_extractdir && _chdir(dirname))
+#else
+ if (opt_extractdir && chdir(dirname))
+#endif
+ {
+ printf("Error changing into %s, aborting\n", dirname);
+ exit(-1);
+ }
+
+ if (filename_to_extract == NULL)
+ ret_value = do_extract(uf, opt_do_extract_withoutpath, opt_overwrite, password);
+ else
+ ret_value = do_extract_onefile(uf, filename_to_extract, opt_do_extract_withoutpath, opt_overwrite, password);
+ }
+
+ unzClose(uf);
+
+ return ret_value;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunzip.1 b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunzip.1
new file mode 100644
index 000000000..111ac6919
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/miniunzip.1
@@ -0,0 +1,63 @@
+.\" Hey, EMACS: -*- nroff -*-
+.TH miniunzip 1 "Nov 7, 2001"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh disable hyphenation
+.\" .hy enable hyphenation
+.\" .ad l left justify
+.\" .ad b justify to both left and right margins
+.\" .nf disable filling
+.\" .fi enable filling
+.\" .br insert line break
+.\" .sp <n> insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+miniunzip - uncompress and examine ZIP archives
+.SH SYNOPSIS
+.B miniunzip
+.RI [ -exvlo ]
+zipfile [ files_to_extract ] [-d tempdir]
+.SH DESCRIPTION
+.B minizip
+is a simple tool which allows the extraction of compressed file
+archives in the ZIP format used by the MS-DOS utility PKZIP. It was
+written as a demonstration of the
+.IR zlib (3)
+library and therefore lack many of the features of the
+.IR unzip (1)
+program.
+.SH OPTIONS
+A number of options are supported. With the exception of
+.BI \-d\ tempdir
+these must be supplied before any
+other arguments and are:
+.TP
+.BI \-l\ ,\ \-\-v
+List the files in the archive without extracting them.
+.TP
+.B \-o
+Overwrite files without prompting for confirmation.
+.TP
+.B \-x
+Extract files (default).
+.PP
+The
+.I zipfile
+argument is the name of the archive to process. The next argument can be used
+to specify a single file to extract from the archive.
+
+Lastly, the following option can be specified at the end of the command-line:
+.TP
+.BI \-d\ tempdir
+Extract the archive in the directory
+.I tempdir
+rather than the current directory.
+.SH SEE ALSO
+.BR minizip (1),
+.BR zlib (3),
+.BR unzip (1).
+.SH AUTHOR
+This program was written by Gilles Vollant. This manual page was
+written by Mark Brown <broonie@sirena.org.uk>. The -d tempdir option
+was added by Dirk Eddelbuettel <edd@debian.org>.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.1 b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.1
new file mode 100644
index 000000000..1154484c1
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.1
@@ -0,0 +1,46 @@
+.\" Hey, EMACS: -*- nroff -*-
+.TH minizip 1 "May 2, 2001"
+.\" Please adjust this date whenever revising the manpage.
+.\"
+.\" Some roff macros, for reference:
+.\" .nh disable hyphenation
+.\" .hy enable hyphenation
+.\" .ad l left justify
+.\" .ad b justify to both left and right margins
+.\" .nf disable filling
+.\" .fi enable filling
+.\" .br insert line break
+.\" .sp <n> insert n+1 empty lines
+.\" for manpage-specific macros, see man(7)
+.SH NAME
+minizip - create ZIP archives
+.SH SYNOPSIS
+.B minizip
+.RI [ -o ]
+zipfile [ " files" ... ]
+.SH DESCRIPTION
+.B minizip
+is a simple tool which allows the creation of compressed file archives
+in the ZIP format used by the MS-DOS utility PKZIP. It was written as
+a demonstration of the
+.IR zlib (3)
+library and therefore lack many of the features of the
+.IR zip (1)
+program.
+.SH OPTIONS
+The first argument supplied is the name of the ZIP archive to create or
+.RI -o
+in which case it is ignored and the second argument treated as the
+name of the ZIP file. If the ZIP file already exists it will be
+overwritten.
+.PP
+Subsequent arguments specify a list of files to place in the ZIP
+archive. If none are specified then an empty archive will be created.
+.SH SEE ALSO
+.BR miniunzip (1),
+.BR zlib (3),
+.BR zip (1).
+.SH AUTHOR
+This program was written by Gilles Vollant. This manual page was
+written by Mark Brown <broonie@sirena.org.uk>.
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.c
new file mode 100644
index 000000000..4288962ec
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.c
@@ -0,0 +1,520 @@
+/*
+ minizip.c
+ Version 1.1, February 14h, 2010
+ sample part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications of Unzip for Zip64
+ Copyright (C) 2007-2008 Even Rouault
+
+ Modifications for Zip64 support on both zip and unzip
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+*/
+
+
+#if (!defined(_WIN32)) && (!defined(WIN32)) && (!defined(__APPLE__))
+ #ifndef __USE_FILE_OFFSET64
+ #define __USE_FILE_OFFSET64
+ #endif
+ #ifndef __USE_LARGEFILE64
+ #define __USE_LARGEFILE64
+ #endif
+ #ifndef _LARGEFILE64_SOURCE
+ #define _LARGEFILE64_SOURCE
+ #endif
+ #ifndef _FILE_OFFSET_BIT
+ #define _FILE_OFFSET_BIT 64
+ #endif
+#endif
+
+#ifdef __APPLE__
+// In darwin and perhaps other BSD variants off_t is a 64 bit value, hence no need for specific 64 bit functions
+#define FOPEN_FUNC(filename, mode) fopen(filename, mode)
+#define FTELLO_FUNC(stream) ftello(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko(stream, offset, origin)
+#else
+#define FOPEN_FUNC(filename, mode) fopen64(filename, mode)
+#define FTELLO_FUNC(stream) ftello64(stream)
+#define FSEEKO_FUNC(stream, offset, origin) fseeko64(stream, offset, origin)
+#endif
+
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+#include <fcntl.h>
+
+#ifdef _WIN32
+# include <direct.h>
+# include <io.h>
+#else
+# include <unistd.h>
+# include <utime.h>
+# include <sys/types.h>
+# include <sys/stat.h>
+#endif
+
+#include "zip.h"
+
+#ifdef _WIN32
+ #define USEWIN32IOAPI
+ #include "iowin32.h"
+#endif
+
+
+
+#define WRITEBUFFERSIZE (16384)
+#define MAXFILENAME (256)
+
+#ifdef _WIN32
+uLong filetime(f, tmzip, dt)
+ char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
+ uLong *dt; /* dostime */
+{
+ int ret = 0;
+ {
+ FILETIME ftLocal;
+ HANDLE hFind;
+ WIN32_FIND_DATAA ff32;
+
+ hFind = FindFirstFileA(f,&ff32);
+ if (hFind != INVALID_HANDLE_VALUE)
+ {
+ FileTimeToLocalFileTime(&(ff32.ftLastWriteTime),&ftLocal);
+ FileTimeToDosDateTime(&ftLocal,((LPWORD)dt)+1,((LPWORD)dt)+0);
+ FindClose(hFind);
+ ret = 1;
+ }
+ }
+ return ret;
+}
+#else
+#ifdef unix || __APPLE__
+uLong filetime(f, tmzip, dt)
+ char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
+ uLong *dt; /* dostime */
+{
+ int ret=0;
+ struct stat s; /* results of stat() */
+ struct tm* filedate;
+ time_t tm_t=0;
+
+ if (strcmp(f,"-")!=0)
+ {
+ char name[MAXFILENAME+1];
+ int len = strlen(f);
+ if (len > MAXFILENAME)
+ len = MAXFILENAME;
+
+ strncpy(name, f,MAXFILENAME-1);
+ /* strncpy doesnt append the trailing NULL, of the string is too long. */
+ name[ MAXFILENAME ] = '\0';
+
+ if (name[len - 1] == '/')
+ name[len - 1] = '\0';
+ /* not all systems allow stat'ing a file with / appended */
+ if (stat(name,&s)==0)
+ {
+ tm_t = s.st_mtime;
+ ret = 1;
+ }
+ }
+ filedate = localtime(&tm_t);
+
+ tmzip->tm_sec = filedate->tm_sec;
+ tmzip->tm_min = filedate->tm_min;
+ tmzip->tm_hour = filedate->tm_hour;
+ tmzip->tm_mday = filedate->tm_mday;
+ tmzip->tm_mon = filedate->tm_mon ;
+ tmzip->tm_year = filedate->tm_year;
+
+ return ret;
+}
+#else
+uLong filetime(f, tmzip, dt)
+ char *f; /* name of file to get info on */
+ tm_zip *tmzip; /* return value: access, modific. and creation times */
+ uLong *dt; /* dostime */
+{
+ return 0;
+}
+#endif
+#endif
+
+
+
+
+int check_exist_file(filename)
+ const char* filename;
+{
+ FILE* ftestexist;
+ int ret = 1;
+ ftestexist = FOPEN_FUNC(filename,"rb");
+ if (ftestexist==NULL)
+ ret = 0;
+ else
+ fclose(ftestexist);
+ return ret;
+}
+
+void do_banner()
+{
+ printf("MiniZip 1.1, demo of zLib + MiniZip64 package, written by Gilles Vollant\n");
+ printf("more info on MiniZip at http://www.winimage.com/zLibDll/minizip.html\n\n");
+}
+
+void do_help()
+{
+ printf("Usage : minizip [-o] [-a] [-0 to -9] [-p password] [-j] file.zip [files_to_add]\n\n" \
+ " -o Overwrite existing file.zip\n" \
+ " -a Append to existing file.zip\n" \
+ " -0 Store only\n" \
+ " -1 Compress faster\n" \
+ " -9 Compress better\n\n" \
+ " -j exclude path. store only the file name.\n\n");
+}
+
+/* calculate the CRC32 of a file,
+ because to encrypt a file, we need known the CRC32 of the file before */
+int getFileCrc(const char* filenameinzip,void*buf,unsigned long size_buf,unsigned long* result_crc)
+{
+ unsigned long calculate_crc=0;
+ int err=ZIP_OK;
+ FILE * fin = FOPEN_FUNC(filenameinzip,"rb");
+
+ unsigned long size_read = 0;
+ unsigned long total_read = 0;
+ if (fin==NULL)
+ {
+ err = ZIP_ERRNO;
+ }
+
+ if (err == ZIP_OK)
+ do
+ {
+ err = ZIP_OK;
+ size_read = (int)fread(buf,1,size_buf,fin);
+ if (size_read < size_buf)
+ if (feof(fin)==0)
+ {
+ printf("error in reading %s\n",filenameinzip);
+ err = ZIP_ERRNO;
+ }
+
+ if (size_read>0)
+ calculate_crc = crc32(calculate_crc,buf,size_read);
+ total_read += size_read;
+
+ } while ((err == ZIP_OK) && (size_read>0));
+
+ if (fin)
+ fclose(fin);
+
+ *result_crc=calculate_crc;
+ printf("file %s crc %lx\n", filenameinzip, calculate_crc);
+ return err;
+}
+
+int isLargeFile(const char* filename)
+{
+ int largeFile = 0;
+ ZPOS64_T pos = 0;
+ FILE* pFile = FOPEN_FUNC(filename, "rb");
+
+ if(pFile != NULL)
+ {
+ int n = FSEEKO_FUNC(pFile, 0, SEEK_END);
+ pos = FTELLO_FUNC(pFile);
+
+ printf("File : %s is %lld bytes\n", filename, pos);
+
+ if(pos >= 0xffffffff)
+ largeFile = 1;
+
+ fclose(pFile);
+ }
+
+ return largeFile;
+}
+
+int main(argc,argv)
+ int argc;
+ char *argv[];
+{
+ int i;
+ int opt_overwrite=0;
+ int opt_compress_level=Z_DEFAULT_COMPRESSION;
+ int opt_exclude_path=0;
+ int zipfilenamearg = 0;
+ char filename_try[MAXFILENAME+16];
+ int zipok;
+ int err=0;
+ int size_buf=0;
+ void* buf=NULL;
+ const char* password=NULL;
+
+
+ do_banner();
+ if (argc==1)
+ {
+ do_help();
+ return 0;
+ }
+ else
+ {
+ for (i=1;i<argc;i++)
+ {
+ if ((*argv[i])=='-')
+ {
+ const char *p=argv[i]+1;
+
+ while ((*p)!='\0')
+ {
+ char c=*(p++);;
+ if ((c=='o') || (c=='O'))
+ opt_overwrite = 1;
+ if ((c=='a') || (c=='A'))
+ opt_overwrite = 2;
+ if ((c>='0') && (c<='9'))
+ opt_compress_level = c-'0';
+ if ((c=='j') || (c=='J'))
+ opt_exclude_path = 1;
+
+ if (((c=='p') || (c=='P')) && (i+1<argc))
+ {
+ password=argv[i+1];
+ i++;
+ }
+ }
+ }
+ else
+ {
+ if (zipfilenamearg == 0)
+ {
+ zipfilenamearg = i ;
+ }
+ }
+ }
+ }
+
+ size_buf = WRITEBUFFERSIZE;
+ buf = (void*)malloc(size_buf);
+ if (buf==NULL)
+ {
+ printf("Error allocating memory\n");
+ return ZIP_INTERNALERROR;
+ }
+
+ if (zipfilenamearg==0)
+ {
+ zipok=0;
+ }
+ else
+ {
+ int i,len;
+ int dot_found=0;
+
+ zipok = 1 ;
+ strncpy(filename_try, argv[zipfilenamearg],MAXFILENAME-1);
+ /* strncpy doesnt append the trailing NULL, of the string is too long. */
+ filename_try[ MAXFILENAME ] = '\0';
+
+ len=(int)strlen(filename_try);
+ for (i=0;i<len;i++)
+ if (filename_try[i]=='.')
+ dot_found=1;
+
+ if (dot_found==0)
+ strcat(filename_try,".zip");
+
+ if (opt_overwrite==2)
+ {
+ /* if the file don't exist, we not append file */
+ if (check_exist_file(filename_try)==0)
+ opt_overwrite=1;
+ }
+ else
+ if (opt_overwrite==0)
+ if (check_exist_file(filename_try)!=0)
+ {
+ char rep=0;
+ do
+ {
+ char answer[128];
+ int ret;
+ printf("The file %s exists. Overwrite ? [y]es, [n]o, [a]ppend : ",filename_try);
+ ret = scanf("%1s",answer);
+ if (ret != 1)
+ {
+ exit(EXIT_FAILURE);
+ }
+ rep = answer[0] ;
+ if ((rep>='a') && (rep<='z'))
+ rep -= 0x20;
+ }
+ while ((rep!='Y') && (rep!='N') && (rep!='A'));
+ if (rep=='N')
+ zipok = 0;
+ if (rep=='A')
+ opt_overwrite = 2;
+ }
+ }
+
+ if (zipok==1)
+ {
+ zipFile zf;
+ int errclose;
+# ifdef USEWIN32IOAPI
+ zlib_filefunc64_def ffunc;
+ fill_win32_filefunc64A(&ffunc);
+ zf = zipOpen2_64(filename_try,(opt_overwrite==2) ? 2 : 0,NULL,&ffunc);
+# else
+ zf = zipOpen64(filename_try,(opt_overwrite==2) ? 2 : 0);
+# endif
+
+ if (zf == NULL)
+ {
+ printf("error opening %s\n",filename_try);
+ err= ZIP_ERRNO;
+ }
+ else
+ printf("creating %s\n",filename_try);
+
+ for (i=zipfilenamearg+1;(i<argc) && (err==ZIP_OK);i++)
+ {
+ if (!((((*(argv[i]))=='-') || ((*(argv[i]))=='/')) &&
+ ((argv[i][1]=='o') || (argv[i][1]=='O') ||
+ (argv[i][1]=='a') || (argv[i][1]=='A') ||
+ (argv[i][1]=='p') || (argv[i][1]=='P') ||
+ ((argv[i][1]>='0') || (argv[i][1]<='9'))) &&
+ (strlen(argv[i]) == 2)))
+ {
+ FILE * fin;
+ int size_read;
+ const char* filenameinzip = argv[i];
+ const char *savefilenameinzip;
+ zip_fileinfo zi;
+ unsigned long crcFile=0;
+ int zip64 = 0;
+
+ zi.tmz_date.tm_sec = zi.tmz_date.tm_min = zi.tmz_date.tm_hour =
+ zi.tmz_date.tm_mday = zi.tmz_date.tm_mon = zi.tmz_date.tm_year = 0;
+ zi.dosDate = 0;
+ zi.internal_fa = 0;
+ zi.external_fa = 0;
+ filetime(filenameinzip,&zi.tmz_date,&zi.dosDate);
+
+/*
+ err = zipOpenNewFileInZip(zf,filenameinzip,&zi,
+ NULL,0,NULL,0,NULL / * comment * /,
+ (opt_compress_level != 0) ? Z_DEFLATED : 0,
+ opt_compress_level);
+*/
+ if ((password != NULL) && (err==ZIP_OK))
+ err = getFileCrc(filenameinzip,buf,size_buf,&crcFile);
+
+ zip64 = isLargeFile(filenameinzip);
+
+ /* The path name saved, should not include a leading slash. */
+ /*if it did, windows/xp and dynazip couldn't read the zip file. */
+ savefilenameinzip = filenameinzip;
+ while( savefilenameinzip[0] == '\\' || savefilenameinzip[0] == '/' )
+ {
+ savefilenameinzip++;
+ }
+
+ /*should the zip file contain any path at all?*/
+ if( opt_exclude_path )
+ {
+ const char *tmpptr;
+ const char *lastslash = 0;
+ for( tmpptr = savefilenameinzip; *tmpptr; tmpptr++)
+ {
+ if( *tmpptr == '\\' || *tmpptr == '/')
+ {
+ lastslash = tmpptr;
+ }
+ }
+ if( lastslash != NULL )
+ {
+ savefilenameinzip = lastslash+1; // base filename follows last slash.
+ }
+ }
+
+ /**/
+ err = zipOpenNewFileInZip3_64(zf,savefilenameinzip,&zi,
+ NULL,0,NULL,0,NULL /* comment*/,
+ (opt_compress_level != 0) ? Z_DEFLATED : 0,
+ opt_compress_level,0,
+ /* -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY, */
+ -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+ password,crcFile, zip64);
+
+ if (err != ZIP_OK)
+ printf("error in opening %s in zipfile\n",filenameinzip);
+ else
+ {
+ fin = FOPEN_FUNC(filenameinzip,"rb");
+ if (fin==NULL)
+ {
+ err=ZIP_ERRNO;
+ printf("error in opening %s for reading\n",filenameinzip);
+ }
+ }
+
+ if (err == ZIP_OK)
+ do
+ {
+ err = ZIP_OK;
+ size_read = (int)fread(buf,1,size_buf,fin);
+ if (size_read < size_buf)
+ if (feof(fin)==0)
+ {
+ printf("error in reading %s\n",filenameinzip);
+ err = ZIP_ERRNO;
+ }
+
+ if (size_read>0)
+ {
+ err = zipWriteInFileInZip (zf,buf,size_read);
+ if (err<0)
+ {
+ printf("error in writing %s in the zipfile\n",
+ filenameinzip);
+ }
+
+ }
+ } while ((err == ZIP_OK) && (size_read>0));
+
+ if (fin)
+ fclose(fin);
+
+ if (err<0)
+ err=ZIP_ERRNO;
+ else
+ {
+ err = zipCloseFileInZip(zf);
+ if (err!=ZIP_OK)
+ printf("error in closing %s in the zipfile\n",
+ filenameinzip);
+ }
+ }
+ }
+ errclose = zipClose(zf,NULL);
+ if (errclose != ZIP_OK)
+ printf("error in closing %s\n",filename_try);
+ }
+ else
+ {
+ do_help();
+ }
+
+ free(buf);
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.pc.in b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.pc.in
new file mode 100644
index 000000000..69b5b7fdc
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/minizip.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/minizip
+
+Name: minizip
+Description: Minizip zip file manipulation library
+Requires:
+Version: @PACKAGE_VERSION@
+Libs: -L${libdir} -lminizip
+Libs.private: -lz
+Cflags: -I${includedir}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.c
new file mode 100644
index 000000000..96891c2e0
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.c
@@ -0,0 +1,291 @@
+/*
+ Additional tools for Minizip
+ Code: Xavier Roche '2004
+ License: Same as ZLIB (www.gzip.org)
+*/
+
+/* Code */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+#include "unzip.h"
+
+#define READ_8(adr) ((unsigned char)*(adr))
+#define READ_16(adr) ( READ_8(adr) | (READ_8(adr+1) << 8) )
+#define READ_32(adr) ( READ_16(adr) | (READ_16((adr)+2) << 16) )
+
+#define WRITE_8(buff, n) do { \
+ *((unsigned char*)(buff)) = (unsigned char) ((n) & 0xff); \
+} while(0)
+#define WRITE_16(buff, n) do { \
+ WRITE_8((unsigned char*)(buff), n); \
+ WRITE_8(((unsigned char*)(buff)) + 1, (n) >> 8); \
+} while(0)
+#define WRITE_32(buff, n) do { \
+ WRITE_16((unsigned char*)(buff), (n) & 0xffff); \
+ WRITE_16((unsigned char*)(buff) + 2, (n) >> 16); \
+} while(0)
+
+extern int ZEXPORT unzRepair(file, fileOut, fileOutTmp, nRecovered, bytesRecovered)
+const char* file;
+const char* fileOut;
+const char* fileOutTmp;
+uLong* nRecovered;
+uLong* bytesRecovered;
+{
+ int err = Z_OK;
+ FILE* fpZip = fopen(file, "rb");
+ FILE* fpOut = fopen(fileOut, "wb");
+ FILE* fpOutCD = fopen(fileOutTmp, "wb");
+ if (fpZip != NULL && fpOut != NULL) {
+ int entries = 0;
+ uLong totalBytes = 0;
+ char header[30];
+ char filename[1024];
+ char extra[1024];
+ int offset = 0;
+ int offsetCD = 0;
+ while ( fread(header, 1, 30, fpZip) == 30 ) {
+ int currentOffset = offset;
+
+ /* File entry */
+ if (READ_32(header) == 0x04034b50) {
+ unsigned int version = READ_16(header + 4);
+ unsigned int gpflag = READ_16(header + 6);
+ unsigned int method = READ_16(header + 8);
+ unsigned int filetime = READ_16(header + 10);
+ unsigned int filedate = READ_16(header + 12);
+ unsigned int crc = READ_32(header + 14); /* crc */
+ unsigned int cpsize = READ_32(header + 18); /* compressed size */
+ unsigned int uncpsize = READ_32(header + 22); /* uncompressed sz */
+ unsigned int fnsize = READ_16(header + 26); /* file name length */
+ unsigned int extsize = READ_16(header + 28); /* extra field length */
+ filename[0] = extra[0] = '\0';
+
+ /* Header */
+ if (fwrite(header, 1, 30, fpOut) == 30) {
+ offset += 30;
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+
+ /* Filename */
+ if (fnsize > 0) {
+ if (fnsize < sizeof(filename)) {
+ if (fread(filename, 1, fnsize, fpZip) == fnsize) {
+ if (fwrite(filename, 1, fnsize, fpOut) == fnsize) {
+ offset += fnsize;
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ } else {
+ err = Z_STREAM_ERROR;
+ break;
+ }
+
+ /* Extra field */
+ if (extsize > 0) {
+ if (extsize < sizeof(extra)) {
+ if (fread(extra, 1, extsize, fpZip) == extsize) {
+ if (fwrite(extra, 1, extsize, fpOut) == extsize) {
+ offset += extsize;
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ }
+
+ /* Data */
+ {
+ int dataSize = cpsize;
+ if (dataSize == 0) {
+ dataSize = uncpsize;
+ }
+ if (dataSize > 0) {
+ char* data = malloc(dataSize);
+ if (data != NULL) {
+ if ((int)fread(data, 1, dataSize, fpZip) == dataSize) {
+ if ((int)fwrite(data, 1, dataSize, fpOut) == dataSize) {
+ offset += dataSize;
+ totalBytes += dataSize;
+ } else {
+ err = Z_ERRNO;
+ }
+ } else {
+ err = Z_ERRNO;
+ }
+ free(data);
+ if (err != Z_OK) {
+ break;
+ }
+ } else {
+ err = Z_MEM_ERROR;
+ break;
+ }
+ }
+ }
+
+ /* Central directory entry */
+ {
+ char header[46];
+ char* comment = "";
+ int comsize = (int) strlen(comment);
+ WRITE_32(header, 0x02014b50);
+ WRITE_16(header + 4, version);
+ WRITE_16(header + 6, version);
+ WRITE_16(header + 8, gpflag);
+ WRITE_16(header + 10, method);
+ WRITE_16(header + 12, filetime);
+ WRITE_16(header + 14, filedate);
+ WRITE_32(header + 16, crc);
+ WRITE_32(header + 20, cpsize);
+ WRITE_32(header + 24, uncpsize);
+ WRITE_16(header + 28, fnsize);
+ WRITE_16(header + 30, extsize);
+ WRITE_16(header + 32, comsize);
+ WRITE_16(header + 34, 0); /* disk # */
+ WRITE_16(header + 36, 0); /* int attrb */
+ WRITE_32(header + 38, 0); /* ext attrb */
+ WRITE_32(header + 42, currentOffset);
+ /* Header */
+ if (fwrite(header, 1, 46, fpOutCD) == 46) {
+ offsetCD += 46;
+
+ /* Filename */
+ if (fnsize > 0) {
+ if (fwrite(filename, 1, fnsize, fpOutCD) == fnsize) {
+ offsetCD += fnsize;
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ } else {
+ err = Z_STREAM_ERROR;
+ break;
+ }
+
+ /* Extra field */
+ if (extsize > 0) {
+ if (fwrite(extra, 1, extsize, fpOutCD) == extsize) {
+ offsetCD += extsize;
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ }
+
+ /* Comment field */
+ if (comsize > 0) {
+ if ((int)fwrite(comment, 1, comsize, fpOutCD) == comsize) {
+ offsetCD += comsize;
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ }
+
+
+ } else {
+ err = Z_ERRNO;
+ break;
+ }
+ }
+
+ /* Success */
+ entries++;
+
+ } else {
+ break;
+ }
+ }
+
+ /* Final central directory */
+ {
+ int entriesZip = entries;
+ char header[22];
+ char* comment = ""; // "ZIP File recovered by zlib/minizip/mztools";
+ int comsize = (int) strlen(comment);
+ if (entriesZip > 0xffff) {
+ entriesZip = 0xffff;
+ }
+ WRITE_32(header, 0x06054b50);
+ WRITE_16(header + 4, 0); /* disk # */
+ WRITE_16(header + 6, 0); /* disk # */
+ WRITE_16(header + 8, entriesZip); /* hack */
+ WRITE_16(header + 10, entriesZip); /* hack */
+ WRITE_32(header + 12, offsetCD); /* size of CD */
+ WRITE_32(header + 16, offset); /* offset to CD */
+ WRITE_16(header + 20, comsize); /* comment */
+
+ /* Header */
+ if (fwrite(header, 1, 22, fpOutCD) == 22) {
+
+ /* Comment field */
+ if (comsize > 0) {
+ if ((int)fwrite(comment, 1, comsize, fpOutCD) != comsize) {
+ err = Z_ERRNO;
+ }
+ }
+
+ } else {
+ err = Z_ERRNO;
+ }
+ }
+
+ /* Final merge (file + central directory) */
+ fclose(fpOutCD);
+ if (err == Z_OK) {
+ fpOutCD = fopen(fileOutTmp, "rb");
+ if (fpOutCD != NULL) {
+ int nRead;
+ char buffer[8192];
+ while ( (nRead = (int)fread(buffer, 1, sizeof(buffer), fpOutCD)) > 0) {
+ if ((int)fwrite(buffer, 1, nRead, fpOut) != nRead) {
+ err = Z_ERRNO;
+ break;
+ }
+ }
+ fclose(fpOutCD);
+ }
+ }
+
+ /* Close */
+ fclose(fpZip);
+ fclose(fpOut);
+
+ /* Wipe temporary file */
+ (void)remove(fileOutTmp);
+
+ /* Number of recovered entries */
+ if (err == Z_OK) {
+ if (nRecovered != NULL) {
+ *nRecovered = entries;
+ }
+ if (bytesRecovered != NULL) {
+ *bytesRecovered = totalBytes;
+ }
+ }
+ } else {
+ err = Z_STREAM_ERROR;
+ }
+ return err;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.h
new file mode 100644
index 000000000..a49a426ec
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/mztools.h
@@ -0,0 +1,37 @@
+/*
+ Additional tools for Minizip
+ Code: Xavier Roche '2004
+ License: Same as ZLIB (www.gzip.org)
+*/
+
+#ifndef _zip_tools_H
+#define _zip_tools_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#include "unzip.h"
+
+/* Repair a ZIP file (missing central directory)
+ file: file to recover
+ fileOut: output file after recovery
+ fileOutTmp: temporary file name used for recovery
+*/
+extern int ZEXPORT unzRepair(const char* file,
+ const char* fileOut,
+ const char* fileOutTmp,
+ uLong* nRecovered,
+ uLong* bytesRecovered);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.c
new file mode 100644
index 000000000..bcfb9416e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.c
@@ -0,0 +1,2125 @@
+/* unzip.c -- IO for uncompress .zip files using zlib
+ Version 1.1, February 14h, 2010
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications of Unzip for Zip64
+ Copyright (C) 2007-2008 Even Rouault
+
+ Modifications for Zip64 support on both zip and unzip
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+
+ ------------------------------------------------------------------------------------
+ Decryption code comes from crypt.c by Info-ZIP but has been greatly reduced in terms of
+ compatibility with older software. The following is from the original crypt.c.
+ Code woven in by Terry Thorsen 1/2003.
+
+ Copyright (c) 1990-2000 Info-ZIP. All rights reserved.
+
+ See the accompanying file LICENSE, version 2000-Apr-09 or later
+ (the contents of which are also included in zip.h) for terms of use.
+ If, for some reason, all these files are missing, the Info-ZIP license
+ also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html
+
+ crypt.c (full version) by Info-ZIP. Last revised: [see crypt.h]
+
+ The encryption/decryption parts of this source code (as opposed to the
+ non-echoing password parts) were originally written in Europe. The
+ whole source package can be freely distributed, including from the USA.
+ (Prior to January 2000, re-export from the US was a violation of US law.)
+
+ This encryption code is a direct transcription of the algorithm from
+ Roger Schlafly, described by Phil Katz in the file appnote.txt. This
+ file (appnote.txt) is distributed with the PKZIP program (even in the
+ version without encryption capabilities).
+
+ ------------------------------------------------------------------------------------
+
+ Changes in unzip.c
+
+ 2007-2008 - Even Rouault - Addition of cpl_unzGetCurrentFileZStreamPos
+ 2007-2008 - Even Rouault - Decoration of symbol names unz* -> cpl_unz*
+ 2007-2008 - Even Rouault - Remove old C style function prototypes
+ 2007-2008 - Even Rouault - Add unzip support for ZIP64
+
+ Copyright (C) 2007-2008 Even Rouault
+
+
+ Oct-2009 - Mathias Svensson - Removed cpl_* from symbol names (Even Rouault added them but since this is now moved to a new project (minizip64) I renamed them again).
+ Oct-2009 - Mathias Svensson - Fixed problem if uncompressed size was > 4G and compressed size was <4G
+ should only read the compressed/uncompressed size from the Zip64 format if
+ the size from normal header was 0xFFFFFFFF
+ Oct-2009 - Mathias Svensson - Applied some bug fixes from paches recived from Gilles Vollant
+ Oct-2009 - Mathias Svensson - Applied support to unzip files with compression mathod BZIP2 (bzip2 lib is required)
+ Patch created by Daniel Borca
+
+ Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
+
+ Copyright (C) 1998 - 2010 Gilles Vollant, Even Rouault, Mathias Svensson
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef NOUNCRYPT
+ #define NOUNCRYPT
+#endif
+
+#include "zlib.h"
+#include "unzip.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+
+#ifndef CASESENSITIVITYDEFAULT_NO
+# if !defined(unix) && !defined(CASESENSITIVITYDEFAULT_YES)
+# define CASESENSITIVITYDEFAULT_NO
+# endif
+#endif
+
+
+#ifndef UNZ_BUFSIZE
+#define UNZ_BUFSIZE (16384)
+#endif
+
+#ifndef UNZ_MAXFILENAMEINZIP
+#define UNZ_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+
+
+const char unz_copyright[] =
+ " unzip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+/* unz_file_info_interntal contain internal info about a file in zipfile*/
+typedef struct unz_file_info64_internal_s
+{
+ ZPOS64_T offset_curfile;/* relative offset of local header 8 bytes */
+} unz_file_info64_internal;
+
+
+/* file_in_zip_read_info_s contain internal information about a file in zipfile,
+ when reading and decompress it */
+typedef struct
+{
+ char *read_buffer; /* internal buffer for compressed data */
+ z_stream stream; /* zLib stream structure for inflate */
+
+#ifdef HAVE_BZIP2
+ bz_stream bstream; /* bzLib stream structure for bziped */
+#endif
+
+ ZPOS64_T pos_in_zipfile; /* position in byte on the zipfile, for fseek*/
+ uLong stream_initialised; /* flag set if stream structure is initialised*/
+
+ ZPOS64_T offset_local_extrafield;/* offset of the local extra field */
+ uInt size_local_extrafield;/* size of the local extra field */
+ ZPOS64_T pos_local_extrafield; /* position in the local extra field in read*/
+ ZPOS64_T total_out_64;
+
+ uLong crc32; /* crc32 of all data uncompressed */
+ uLong crc32_wait; /* crc32 we must obtain after decompress all */
+ ZPOS64_T rest_read_compressed; /* number of byte to be decompressed */
+ ZPOS64_T rest_read_uncompressed;/*number of byte to be obtained after decomp*/
+ zlib_filefunc64_32_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ uLong compression_method; /* compression method (0==store) */
+ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ int raw;
+} file_in_zip64_read_info_s;
+
+
+/* unz64_s contain internal information about the zipfile
+*/
+typedef struct
+{
+ zlib_filefunc64_32_def z_filefunc;
+ int is64bitOpenFunction;
+ voidpf filestream; /* io structore of the zipfile */
+ unz_global_info64 gi; /* public global information */
+ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+ ZPOS64_T num_file; /* number of the current file in the zipfile*/
+ ZPOS64_T pos_in_central_dir; /* pos of the current file in the central dir*/
+ ZPOS64_T current_file_ok; /* flag about the usability of the current file*/
+ ZPOS64_T central_pos; /* position of the beginning of the central dir*/
+
+ ZPOS64_T size_central_dir; /* size of the central directory */
+ ZPOS64_T offset_central_dir; /* offset of start of central directory with
+ respect to the starting disk number */
+
+ unz_file_info64 cur_file_info; /* public info about the current file in zip*/
+ unz_file_info64_internal cur_file_info_internal; /* private info about it*/
+ file_in_zip64_read_info_s* pfile_in_zip_read; /* structure about the current
+ file if we are decompressing it */
+ int encrypted;
+
+ int isZip64;
+
+# ifndef NOUNCRYPT
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
+ const z_crc_t* pcrc_32_tab;
+# endif
+} unz64_s;
+
+
+#ifndef NOUNCRYPT
+#include "crypt.h"
+#endif
+
+/* ===========================================================================
+ Read a byte from a gz_stream; update next_in and avail_in. Return EOF
+ for end of file.
+ IN assertion: the stream s has been successfully opened for reading.
+*/
+
+
+local int unz64local_getByte OF((
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream,
+ int *pi));
+
+local int unz64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi)
+{
+ unsigned char c;
+ int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return UNZ_OK;
+ }
+ else
+ {
+ if (ZERROR64(*pzlib_filefunc_def,filestream))
+ return UNZ_ERRNO;
+ else
+ return UNZ_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int unz64local_getShort OF((
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unz64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX)
+{
+ uLong x ;
+ int i = 0;
+ int err;
+
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int unz64local_getLong OF((
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX));
+
+local int unz64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream,
+ uLong *pX)
+{
+ uLong x ;
+ int i = 0;
+ int err;
+
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((uLong)i)<<8;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((uLong)i)<<16;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int unz64local_getLong64 OF((
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream,
+ ZPOS64_T *pX));
+
+
+local int unz64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream,
+ ZPOS64_T *pX)
+{
+ ZPOS64_T x ;
+ int i = 0;
+ int err;
+
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (ZPOS64_T)i;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((ZPOS64_T)i)<<8;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((ZPOS64_T)i)<<16;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((ZPOS64_T)i)<<24;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((ZPOS64_T)i)<<32;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((ZPOS64_T)i)<<40;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((ZPOS64_T)i)<<48;
+
+ if (err==UNZ_OK)
+ err = unz64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x |= ((ZPOS64_T)i)<<56;
+
+ if (err==UNZ_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+/* My own strcmpi / strcasecmp */
+local int strcmpcasenosensitive_internal (const char* fileName1, const char* fileName2)
+{
+ for (;;)
+ {
+ char c1=*(fileName1++);
+ char c2=*(fileName2++);
+ if ((c1>='a') && (c1<='z'))
+ c1 -= 0x20;
+ if ((c2>='a') && (c2<='z'))
+ c2 -= 0x20;
+ if (c1=='\0')
+ return ((c2=='\0') ? 0 : -1);
+ if (c2=='\0')
+ return 1;
+ if (c1<c2)
+ return -1;
+ if (c1>c2)
+ return 1;
+ }
+}
+
+
+#ifdef CASESENSITIVITYDEFAULT_NO
+#define CASESENSITIVITYDEFAULTVALUE 2
+#else
+#define CASESENSITIVITYDEFAULTVALUE 1
+#endif
+
+#ifndef STRCMPCASENOSENTIVEFUNCTION
+#define STRCMPCASENOSENTIVEFUNCTION strcmpcasenosensitive_internal
+#endif
+
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+
+*/
+extern int ZEXPORT unzStringFileNameCompare (const char* fileName1,
+ const char* fileName2,
+ int iCaseSensitivity)
+
+{
+ if (iCaseSensitivity==0)
+ iCaseSensitivity=CASESENSITIVITYDEFAULTVALUE;
+
+ if (iCaseSensitivity==1)
+ return strcmp(fileName1,fileName2);
+
+ return STRCMPCASENOSENTIVEFUNCTION(fileName1,fileName2);
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local ZPOS64_T unz64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
+local ZPOS64_T unz64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
+{
+ unsigned char* buf;
+ ZPOS64_T uSizeFile;
+ ZPOS64_T uBackRead;
+ ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+ ZPOS64_T uPosFound=0;
+
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize;
+ ZPOS64_T uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+
+
+/*
+ Locate the Central directory 64 of a zipfile (at the end, just before
+ the global comment)
+*/
+local ZPOS64_T unz64local_SearchCentralDir64 OF((
+ const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream));
+
+local ZPOS64_T unz64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def,
+ voidpf filestream)
+{
+ unsigned char* buf;
+ ZPOS64_T uSizeFile;
+ ZPOS64_T uBackRead;
+ ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+ ZPOS64_T uPosFound=0;
+ uLong uL;
+ ZPOS64_T relativeOffset;
+
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize;
+ ZPOS64_T uReadPos;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ if (uPosFound == 0)
+ return 0;
+
+ /* Zip64 end of central directory locator */
+ if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return 0;
+
+ /* the signature, already checked */
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+ return 0;
+
+ /* number of the disk with the start of the zip64 end of central directory */
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+ return 0;
+ if (uL != 0)
+ return 0;
+
+ /* relative offset of the zip64 end of central directory record */
+ if (unz64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=UNZ_OK)
+ return 0;
+
+ /* total number of disks */
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+ return 0;
+ if (uL != 1)
+ return 0;
+
+ /* Goto end of central directory record */
+ if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return 0;
+
+ /* the signature */
+ if (unz64local_getLong(pzlib_filefunc_def,filestream,&uL)!=UNZ_OK)
+ return 0;
+
+ if (uL != 0x06064b50)
+ return 0;
+
+ return relativeOffset;
+}
+
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows NT computer "c:\\test\\zlib114.zip" or on an Unix computer
+ "zlib/zlib114.zip".
+ If the zipfile cannot be opened (file doesn't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+*/
+local unzFile unzOpenInternal (const void *path,
+ zlib_filefunc64_32_def* pzlib_filefunc64_32_def,
+ int is64bitOpenFunction)
+{
+ unz64_s us;
+ unz64_s *s;
+ ZPOS64_T central_pos;
+ uLong uL;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ ZPOS64_T number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+
+ int err=UNZ_OK;
+
+ if (unz_copyright[0]!=' ')
+ return NULL;
+
+ us.z_filefunc.zseek32_file = NULL;
+ us.z_filefunc.ztell32_file = NULL;
+ if (pzlib_filefunc64_32_def==NULL)
+ fill_fopen64_filefunc(&us.z_filefunc.zfile_func64);
+ else
+ us.z_filefunc = *pzlib_filefunc64_32_def;
+ us.is64bitOpenFunction = is64bitOpenFunction;
+
+
+
+ us.filestream = ZOPEN64(us.z_filefunc,
+ path,
+ ZLIB_FILEFUNC_MODE_READ |
+ ZLIB_FILEFUNC_MODE_EXISTING);
+ if (us.filestream==NULL)
+ return NULL;
+
+ central_pos = unz64local_SearchCentralDir64(&us.z_filefunc,us.filestream);
+ if (central_pos)
+ {
+ uLong uS;
+ ZPOS64_T uL64;
+
+ us.isZip64 = 1;
+
+ if (ZSEEK64(us.z_filefunc, us.filestream,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+ /* the signature, already checked */
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* size of zip64 end of central directory record */
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&uL64)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* version made by */
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* version needed to extract */
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uS)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of this disk */
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central directory on this disk */
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.gi.number_entry)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central directory */
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&number_entry_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if ((number_entry_CD!=us.gi.number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=UNZ_BADZIPFILE;
+
+ /* size of the central directory */
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.size_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (unz64local_getLong64(&us.z_filefunc, us.filestream,&us.offset_central_dir)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ us.gi.size_comment = 0;
+ }
+ else
+ {
+ central_pos = unz64local_SearchCentralDir(&us.z_filefunc,us.filestream);
+ if (central_pos==0)
+ err=UNZ_ERRNO;
+
+ us.isZip64 = 0;
+
+ if (ZSEEK64(us.z_filefunc, us.filestream,
+ central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+ /* the signature, already checked */
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of this disk */
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&number_disk_with_CD)!=UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+ us.gi.number_entry = uL;
+
+ /* total number of entries in the central dir */
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+ number_entry_CD = uL;
+
+ if ((number_entry_CD!=us.gi.number_entry) ||
+ (number_disk_with_CD!=0) ||
+ (number_disk!=0))
+ err=UNZ_BADZIPFILE;
+
+ /* size of the central directory */
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+ us.size_central_dir = uL;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (unz64local_getLong(&us.z_filefunc, us.filestream,&uL)!=UNZ_OK)
+ err=UNZ_ERRNO;
+ us.offset_central_dir = uL;
+
+ /* zipfile comment length */
+ if (unz64local_getShort(&us.z_filefunc, us.filestream,&us.gi.size_comment)!=UNZ_OK)
+ err=UNZ_ERRNO;
+ }
+
+ if ((central_pos<us.offset_central_dir+us.size_central_dir) &&
+ (err==UNZ_OK))
+ err=UNZ_BADZIPFILE;
+
+ if (err!=UNZ_OK)
+ {
+ ZCLOSE64(us.z_filefunc, us.filestream);
+ return NULL;
+ }
+
+ us.byte_before_the_zipfile = central_pos -
+ (us.offset_central_dir+us.size_central_dir);
+ us.central_pos = central_pos;
+ us.pfile_in_zip_read = NULL;
+ us.encrypted = 0;
+
+
+ s=(unz64_s*)ALLOC(sizeof(unz64_s));
+ if( s != NULL)
+ {
+ *s=us;
+ unzGoToFirstFile((unzFile)s);
+ }
+ return (unzFile)s;
+}
+
+
+extern unzFile ZEXPORT unzOpen2 (const char *path,
+ zlib_filefunc_def* pzlib_filefunc32_def)
+{
+ if (pzlib_filefunc32_def != NULL)
+ {
+ zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+ fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
+ return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 0);
+ }
+ else
+ return unzOpenInternal(path, NULL, 0);
+}
+
+extern unzFile ZEXPORT unzOpen2_64 (const void *path,
+ zlib_filefunc64_def* pzlib_filefunc_def)
+{
+ if (pzlib_filefunc_def != NULL)
+ {
+ zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+ zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
+ zlib_filefunc64_32_def_fill.ztell32_file = NULL;
+ zlib_filefunc64_32_def_fill.zseek32_file = NULL;
+ return unzOpenInternal(path, &zlib_filefunc64_32_def_fill, 1);
+ }
+ else
+ return unzOpenInternal(path, NULL, 1);
+}
+
+extern unzFile ZEXPORT unzOpen (const char *path)
+{
+ return unzOpenInternal(path, NULL, 0);
+}
+
+extern unzFile ZEXPORT unzOpen64 (const void *path)
+{
+ return unzOpenInternal(path, NULL, 1);
+}
+
+/*
+ Close a ZipFile opened with unzOpen.
+ If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+ these files MUST be closed with unzCloseCurrentFile before call unzClose.
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzClose (unzFile file)
+{
+ unz64_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+
+ if (s->pfile_in_zip_read!=NULL)
+ unzCloseCurrentFile(file);
+
+ ZCLOSE64(s->z_filefunc, s->filestream);
+ TRYFREE(s);
+ return UNZ_OK;
+}
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+extern int ZEXPORT unzGetGlobalInfo64 (unzFile file, unz_global_info64* pglobal_info)
+{
+ unz64_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ *pglobal_info=s->gi;
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzGetGlobalInfo (unzFile file, unz_global_info* pglobal_info32)
+{
+ unz64_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ /* to do : check if number_entry is not truncated */
+ pglobal_info32->number_entry = (uLong)s->gi.number_entry;
+ pglobal_info32->size_comment = s->gi.size_comment;
+ return UNZ_OK;
+}
+/*
+ Translate date/time from Dos format to tm_unz (readable more easilty)
+*/
+local void unz64local_DosDateToTmuDate (ZPOS64_T ulDosDate, tm_unz* ptm)
+{
+ ZPOS64_T uDate;
+ uDate = (ZPOS64_T)(ulDosDate>>16);
+ ptm->tm_mday = (uInt)(uDate&0x1f) ;
+ ptm->tm_mon = (uInt)((((uDate)&0x1E0)/0x20)-1) ;
+ ptm->tm_year = (uInt)(((uDate&0x0FE00)/0x0200)+1980) ;
+
+ ptm->tm_hour = (uInt) ((ulDosDate &0xF800)/0x800);
+ ptm->tm_min = (uInt) ((ulDosDate&0x7E0)/0x20) ;
+ ptm->tm_sec = (uInt) (2*(ulDosDate&0x1f)) ;
+}
+
+/*
+ Get Info about the current file in the zipfile, with internal only info
+*/
+local int unz64local_GetCurrentFileInfoInternal OF((unzFile file,
+ unz_file_info64 *pfile_info,
+ unz_file_info64_internal
+ *pfile_info_internal,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+
+local int unz64local_GetCurrentFileInfoInternal (unzFile file,
+ unz_file_info64 *pfile_info,
+ unz_file_info64_internal
+ *pfile_info_internal,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize)
+{
+ unz64_s* s;
+ unz_file_info64 file_info;
+ unz_file_info64_internal file_info_internal;
+ int err=UNZ_OK;
+ uLong uMagic;
+ long lSeek=0;
+ uLong uL;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ if (ZSEEK64(s->z_filefunc, s->filestream,
+ s->pos_in_central_dir+s->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=UNZ_ERRNO;
+
+
+ /* we check the magic */
+ if (err==UNZ_OK)
+ {
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x02014b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.version_needed) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.flag) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.compression_method) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.dosDate) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ unz64local_DosDateToTmuDate(file_info.dosDate,&file_info.tmu_date);
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.crc) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+ err=UNZ_ERRNO;
+ file_info.compressed_size = uL;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+ err=UNZ_ERRNO;
+ file_info.uncompressed_size = uL;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_extra) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.size_file_comment) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.disk_num_start) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&file_info.internal_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&file_info.external_fa) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ // relative offset of local header
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+ err=UNZ_ERRNO;
+ file_info_internal.offset_curfile = uL;
+
+ lSeek+=file_info.size_filename;
+ if ((err==UNZ_OK) && (szFileName!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_filename<fileNameBufferSize)
+ {
+ *(szFileName+file_info.size_filename)='\0';
+ uSizeRead = file_info.size_filename;
+ }
+ else
+ uSizeRead = fileNameBufferSize;
+
+ if ((file_info.size_filename>0) && (fileNameBufferSize>0))
+ if (ZREAD64(s->z_filefunc, s->filestream,szFileName,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ lSeek -= uSizeRead;
+ }
+
+ // Read extrafield
+ if ((err==UNZ_OK) && (extraField!=NULL))
+ {
+ ZPOS64_T uSizeRead ;
+ if (file_info.size_file_extra<extraFieldBufferSize)
+ uSizeRead = file_info.size_file_extra;
+ else
+ uSizeRead = extraFieldBufferSize;
+
+ if (lSeek!=0)
+ {
+ if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+
+ if ((file_info.size_file_extra>0) && (extraFieldBufferSize>0))
+ if (ZREAD64(s->z_filefunc, s->filestream,extraField,(uLong)uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+
+ lSeek += file_info.size_file_extra - (uLong)uSizeRead;
+ }
+ else
+ lSeek += file_info.size_file_extra;
+
+
+ if ((err==UNZ_OK) && (file_info.size_file_extra != 0))
+ {
+ uLong acc = 0;
+
+ // since lSeek now points to after the extra field we need to move back
+ lSeek -= file_info.size_file_extra;
+
+ if (lSeek!=0)
+ {
+ if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+
+ while(acc < file_info.size_file_extra)
+ {
+ uLong headerId;
+ uLong dataSize;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&headerId) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&dataSize) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ /* ZIP64 extra fields */
+ if (headerId == 0x0001)
+ {
+ uLong uL;
+
+ if(file_info.uncompressed_size == MAXU32)
+ {
+ if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.uncompressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+ }
+
+ if(file_info.compressed_size == MAXU32)
+ {
+ if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info.compressed_size) != UNZ_OK)
+ err=UNZ_ERRNO;
+ }
+
+ if(file_info_internal.offset_curfile == MAXU32)
+ {
+ /* Relative Header offset */
+ if (unz64local_getLong64(&s->z_filefunc, s->filestream,&file_info_internal.offset_curfile) != UNZ_OK)
+ err=UNZ_ERRNO;
+ }
+
+ if(file_info.disk_num_start == MAXU32)
+ {
+ /* Disk Start Number */
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uL) != UNZ_OK)
+ err=UNZ_ERRNO;
+ }
+
+ }
+ else
+ {
+ if (ZSEEK64(s->z_filefunc, s->filestream,dataSize,ZLIB_FILEFUNC_SEEK_CUR)!=0)
+ err=UNZ_ERRNO;
+ }
+
+ acc += 2 + 2 + dataSize;
+ }
+ }
+
+ if ((err==UNZ_OK) && (szComment!=NULL))
+ {
+ uLong uSizeRead ;
+ if (file_info.size_file_comment<commentBufferSize)
+ {
+ *(szComment+file_info.size_file_comment)='\0';
+ uSizeRead = file_info.size_file_comment;
+ }
+ else
+ uSizeRead = commentBufferSize;
+
+ if (lSeek!=0)
+ {
+ if (ZSEEK64(s->z_filefunc, s->filestream,lSeek,ZLIB_FILEFUNC_SEEK_CUR)==0)
+ lSeek=0;
+ else
+ err=UNZ_ERRNO;
+ }
+
+ if ((file_info.size_file_comment>0) && (commentBufferSize>0))
+ if (ZREAD64(s->z_filefunc, s->filestream,szComment,uSizeRead)!=uSizeRead)
+ err=UNZ_ERRNO;
+ lSeek+=file_info.size_file_comment - uSizeRead;
+ }
+ else
+ lSeek+=file_info.size_file_comment;
+
+
+ if ((err==UNZ_OK) && (pfile_info!=NULL))
+ *pfile_info=file_info;
+
+ if ((err==UNZ_OK) && (pfile_info_internal!=NULL))
+ *pfile_info_internal=file_info_internal;
+
+ return err;
+}
+
+
+
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem.
+*/
+extern int ZEXPORT unzGetCurrentFileInfo64 (unzFile file,
+ unz_file_info64 * pfile_info,
+ char * szFileName, uLong fileNameBufferSize,
+ void *extraField, uLong extraFieldBufferSize,
+ char* szComment, uLong commentBufferSize)
+{
+ return unz64local_GetCurrentFileInfoInternal(file,pfile_info,NULL,
+ szFileName,fileNameBufferSize,
+ extraField,extraFieldBufferSize,
+ szComment,commentBufferSize);
+}
+
+extern int ZEXPORT unzGetCurrentFileInfo (unzFile file,
+ unz_file_info * pfile_info,
+ char * szFileName, uLong fileNameBufferSize,
+ void *extraField, uLong extraFieldBufferSize,
+ char* szComment, uLong commentBufferSize)
+{
+ int err;
+ unz_file_info64 file_info64;
+ err = unz64local_GetCurrentFileInfoInternal(file,&file_info64,NULL,
+ szFileName,fileNameBufferSize,
+ extraField,extraFieldBufferSize,
+ szComment,commentBufferSize);
+ if ((err==UNZ_OK) && (pfile_info != NULL))
+ {
+ pfile_info->version = file_info64.version;
+ pfile_info->version_needed = file_info64.version_needed;
+ pfile_info->flag = file_info64.flag;
+ pfile_info->compression_method = file_info64.compression_method;
+ pfile_info->dosDate = file_info64.dosDate;
+ pfile_info->crc = file_info64.crc;
+
+ pfile_info->size_filename = file_info64.size_filename;
+ pfile_info->size_file_extra = file_info64.size_file_extra;
+ pfile_info->size_file_comment = file_info64.size_file_comment;
+
+ pfile_info->disk_num_start = file_info64.disk_num_start;
+ pfile_info->internal_fa = file_info64.internal_fa;
+ pfile_info->external_fa = file_info64.external_fa;
+
+ pfile_info->tmu_date = file_info64.tmu_date,
+
+
+ pfile_info->compressed_size = (uLong)file_info64.compressed_size;
+ pfile_info->uncompressed_size = (uLong)file_info64.uncompressed_size;
+
+ }
+ return err;
+}
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+extern int ZEXPORT unzGoToFirstFile (unzFile file)
+{
+ int err=UNZ_OK;
+ unz64_s* s;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ s->pos_in_central_dir=s->offset_central_dir;
+ s->num_file=0;
+ err=unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+extern int ZEXPORT unzGoToNextFile (unzFile file)
+{
+ unz64_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (s->gi.number_entry != 0xffff) /* 2^16 files overflow hack */
+ if (s->num_file+1==s->gi.number_entry)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ s->pos_in_central_dir += SIZECENTRALDIRITEM + s->cur_file_info.size_filename +
+ s->cur_file_info.size_file_extra + s->cur_file_info.size_file_comment ;
+ s->num_file++;
+ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+extern int ZEXPORT unzLocateFile (unzFile file, const char *szFileName, int iCaseSensitivity)
+{
+ unz64_s* s;
+ int err;
+
+ /* We remember the 'current' position in the file so that we can jump
+ * back there if we fail.
+ */
+ unz_file_info64 cur_file_infoSaved;
+ unz_file_info64_internal cur_file_info_internalSaved;
+ ZPOS64_T num_fileSaved;
+ ZPOS64_T pos_in_central_dirSaved;
+
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+
+ if (strlen(szFileName)>=UNZ_MAXFILENAMEINZIP)
+ return UNZ_PARAMERROR;
+
+ s=(unz64_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ /* Save the current state */
+ num_fileSaved = s->num_file;
+ pos_in_central_dirSaved = s->pos_in_central_dir;
+ cur_file_infoSaved = s->cur_file_info;
+ cur_file_info_internalSaved = s->cur_file_info_internal;
+
+ err = unzGoToFirstFile(file);
+
+ while (err == UNZ_OK)
+ {
+ char szCurrentFileName[UNZ_MAXFILENAMEINZIP+1];
+ err = unzGetCurrentFileInfo64(file,NULL,
+ szCurrentFileName,sizeof(szCurrentFileName)-1,
+ NULL,0,NULL,0);
+ if (err == UNZ_OK)
+ {
+ if (unzStringFileNameCompare(szCurrentFileName,
+ szFileName,iCaseSensitivity)==0)
+ return UNZ_OK;
+ err = unzGoToNextFile(file);
+ }
+ }
+
+ /* We failed, so restore the state of the 'current file' to where we
+ * were.
+ */
+ s->num_file = num_fileSaved ;
+ s->pos_in_central_dir = pos_in_central_dirSaved ;
+ s->cur_file_info = cur_file_infoSaved;
+ s->cur_file_info_internal = cur_file_info_internalSaved;
+ return err;
+}
+
+
+/*
+///////////////////////////////////////////
+// Contributed by Ryan Haksi (mailto://cryogen@infoserve.net)
+// I need random access
+//
+// Further optimization could be realized by adding an ability
+// to cache the directory in memory. The goal being a single
+// comprehensive file read to put the file I need in a memory.
+*/
+
+/*
+typedef struct unz_file_pos_s
+{
+ ZPOS64_T pos_in_zip_directory; // offset in file
+ ZPOS64_T num_of_file; // # of file
+} unz_file_pos;
+*/
+
+extern int ZEXPORT unzGetFilePos64(unzFile file, unz64_file_pos* file_pos)
+{
+ unz64_s* s;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_END_OF_LIST_OF_FILE;
+
+ file_pos->pos_in_zip_directory = s->pos_in_central_dir;
+ file_pos->num_of_file = s->num_file;
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzGetFilePos(
+ unzFile file,
+ unz_file_pos* file_pos)
+{
+ unz64_file_pos file_pos64;
+ int err = unzGetFilePos64(file,&file_pos64);
+ if (err==UNZ_OK)
+ {
+ file_pos->pos_in_zip_directory = (uLong)file_pos64.pos_in_zip_directory;
+ file_pos->num_of_file = (uLong)file_pos64.num_of_file;
+ }
+ return err;
+}
+
+extern int ZEXPORT unzGoToFilePos64(unzFile file, const unz64_file_pos* file_pos)
+{
+ unz64_s* s;
+ int err;
+
+ if (file==NULL || file_pos==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+
+ /* jump to the right spot */
+ s->pos_in_central_dir = file_pos->pos_in_zip_directory;
+ s->num_file = file_pos->num_of_file;
+
+ /* set the current file */
+ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ /* return results */
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+extern int ZEXPORT unzGoToFilePos(
+ unzFile file,
+ unz_file_pos* file_pos)
+{
+ unz64_file_pos file_pos64;
+ if (file_pos == NULL)
+ return UNZ_PARAMERROR;
+
+ file_pos64.pos_in_zip_directory = file_pos->pos_in_zip_directory;
+ file_pos64.num_of_file = file_pos->num_of_file;
+ return unzGoToFilePos64(file,&file_pos64);
+}
+
+/*
+// Unzip Helper Functions - should be here?
+///////////////////////////////////////////
+*/
+
+/*
+ Read the local header of the current zipfile
+ Check the coherency of the local header and info in the end of central
+ directory about this file
+ store in *piSizeVar the size of extra info in local header
+ (filename and size of extra field data)
+*/
+local int unz64local_CheckCurrentFileCoherencyHeader (unz64_s* s, uInt* piSizeVar,
+ ZPOS64_T * poffset_local_extrafield,
+ uInt * psize_local_extrafield)
+{
+ uLong uMagic,uData,uFlags;
+ uLong size_filename;
+ uLong size_extra_field;
+ int err=UNZ_OK;
+
+ *piSizeVar = 0;
+ *poffset_local_extrafield = 0;
+ *psize_local_extrafield = 0;
+
+ if (ZSEEK64(s->z_filefunc, s->filestream,s->cur_file_info_internal.offset_curfile +
+ s->byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+
+ if (err==UNZ_OK)
+ {
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uMagic) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if (uMagic!=0x04034b50)
+ err=UNZ_BADZIPFILE;
+ }
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+/*
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.wVersion))
+ err=UNZ_BADZIPFILE;
+*/
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uFlags) != UNZ_OK)
+ err=UNZ_ERRNO;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&uData) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.compression_method))
+ err=UNZ_BADZIPFILE;
+
+ if ((err==UNZ_OK) && (s->cur_file_info.compression_method!=0) &&
+/* #ifdef HAVE_BZIP2 */
+ (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
+/* #endif */
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+ err=UNZ_BADZIPFILE;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* date/time */
+ err=UNZ_ERRNO;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* crc */
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (uData!=s->cur_file_info.crc) && ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size compr */
+ err=UNZ_ERRNO;
+ else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.compressed_size) && ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unz64local_getLong(&s->z_filefunc, s->filestream,&uData) != UNZ_OK) /* size uncompr */
+ err=UNZ_ERRNO;
+ else if (uData != 0xFFFFFFFF && (err==UNZ_OK) && (uData!=s->cur_file_info.uncompressed_size) && ((uFlags & 8)==0))
+ err=UNZ_BADZIPFILE;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_filename) != UNZ_OK)
+ err=UNZ_ERRNO;
+ else if ((err==UNZ_OK) && (size_filename!=s->cur_file_info.size_filename))
+ err=UNZ_BADZIPFILE;
+
+ *piSizeVar += (uInt)size_filename;
+
+ if (unz64local_getShort(&s->z_filefunc, s->filestream,&size_extra_field) != UNZ_OK)
+ err=UNZ_ERRNO;
+ *poffset_local_extrafield= s->cur_file_info_internal.offset_curfile +
+ SIZEZIPLOCALHEADER + size_filename;
+ *psize_local_extrafield = (uInt)size_extra_field;
+
+ *piSizeVar += (uInt)size_extra_field;
+
+ return err;
+}
+
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error and the file is opened, the return value is UNZ_OK.
+*/
+extern int ZEXPORT unzOpenCurrentFile3 (unzFile file, int* method,
+ int* level, int raw, const char* password)
+{
+ int err=UNZ_OK;
+ uInt iSizeVar;
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ ZPOS64_T offset_local_extrafield; /* offset of the local extra field */
+ uInt size_local_extrafield; /* size of the local extra field */
+# ifndef NOUNCRYPT
+ char source[12];
+# else
+ if (password != NULL)
+ return UNZ_PARAMERROR;
+# endif
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ if (!s->current_file_ok)
+ return UNZ_PARAMERROR;
+
+ if (s->pfile_in_zip_read != NULL)
+ unzCloseCurrentFile(file);
+
+ if (unz64local_CheckCurrentFileCoherencyHeader(s,&iSizeVar, &offset_local_extrafield,&size_local_extrafield)!=UNZ_OK)
+ return UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info = (file_in_zip64_read_info_s*)ALLOC(sizeof(file_in_zip64_read_info_s));
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_INTERNALERROR;
+
+ pfile_in_zip_read_info->read_buffer=(char*)ALLOC(UNZ_BUFSIZE);
+ pfile_in_zip_read_info->offset_local_extrafield = offset_local_extrafield;
+ pfile_in_zip_read_info->size_local_extrafield = size_local_extrafield;
+ pfile_in_zip_read_info->pos_local_extrafield=0;
+ pfile_in_zip_read_info->raw=raw;
+
+ if (pfile_in_zip_read_info->read_buffer==NULL)
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return UNZ_INTERNALERROR;
+ }
+
+ pfile_in_zip_read_info->stream_initialised=0;
+
+ if (method!=NULL)
+ *method = (int)s->cur_file_info.compression_method;
+
+ if (level!=NULL)
+ {
+ *level = 6;
+ switch (s->cur_file_info.flag & 0x06)
+ {
+ case 6 : *level = 1; break;
+ case 4 : *level = 2; break;
+ case 2 : *level = 9; break;
+ }
+ }
+
+ if ((s->cur_file_info.compression_method!=0) &&
+/* #ifdef HAVE_BZIP2 */
+ (s->cur_file_info.compression_method!=Z_BZIP2ED) &&
+/* #endif */
+ (s->cur_file_info.compression_method!=Z_DEFLATED))
+
+ err=UNZ_BADZIPFILE;
+
+ pfile_in_zip_read_info->crc32_wait=s->cur_file_info.crc;
+ pfile_in_zip_read_info->crc32=0;
+ pfile_in_zip_read_info->total_out_64=0;
+ pfile_in_zip_read_info->compression_method = s->cur_file_info.compression_method;
+ pfile_in_zip_read_info->filestream=s->filestream;
+ pfile_in_zip_read_info->z_filefunc=s->z_filefunc;
+ pfile_in_zip_read_info->byte_before_the_zipfile=s->byte_before_the_zipfile;
+
+ pfile_in_zip_read_info->stream.total_out = 0;
+
+ if ((s->cur_file_info.compression_method==Z_BZIP2ED) && (!raw))
+ {
+#ifdef HAVE_BZIP2
+ pfile_in_zip_read_info->bstream.bzalloc = (void *(*) (void *, int, int))0;
+ pfile_in_zip_read_info->bstream.bzfree = (free_func)0;
+ pfile_in_zip_read_info->bstream.opaque = (voidpf)0;
+ pfile_in_zip_read_info->bstream.state = (voidpf)0;
+
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+ pfile_in_zip_read_info->stream.next_in = (voidpf)0;
+ pfile_in_zip_read_info->stream.avail_in = 0;
+
+ err=BZ2_bzDecompressInit(&pfile_in_zip_read_info->bstream, 0, 0);
+ if (err == Z_OK)
+ pfile_in_zip_read_info->stream_initialised=Z_BZIP2ED;
+ else
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return err;
+ }
+#else
+ pfile_in_zip_read_info->raw=1;
+#endif
+ }
+ else if ((s->cur_file_info.compression_method==Z_DEFLATED) && (!raw))
+ {
+ pfile_in_zip_read_info->stream.zalloc = (alloc_func)0;
+ pfile_in_zip_read_info->stream.zfree = (free_func)0;
+ pfile_in_zip_read_info->stream.opaque = (voidpf)0;
+ pfile_in_zip_read_info->stream.next_in = 0;
+ pfile_in_zip_read_info->stream.avail_in = 0;
+
+ err=inflateInit2(&pfile_in_zip_read_info->stream, -MAX_WBITS);
+ if (err == Z_OK)
+ pfile_in_zip_read_info->stream_initialised=Z_DEFLATED;
+ else
+ {
+ TRYFREE(pfile_in_zip_read_info);
+ return err;
+ }
+ /* windowBits is passed < 0 to tell that there is no zlib header.
+ * Note that in this case inflate *requires* an extra "dummy" byte
+ * after the compressed stream in order to complete decompression and
+ * return Z_STREAM_END.
+ * In unzip, i don't wait absolutely Z_STREAM_END because I known the
+ * size of both compressed and uncompressed data
+ */
+ }
+ pfile_in_zip_read_info->rest_read_compressed =
+ s->cur_file_info.compressed_size ;
+ pfile_in_zip_read_info->rest_read_uncompressed =
+ s->cur_file_info.uncompressed_size ;
+
+
+ pfile_in_zip_read_info->pos_in_zipfile =
+ s->cur_file_info_internal.offset_curfile + SIZEZIPLOCALHEADER +
+ iSizeVar;
+
+ pfile_in_zip_read_info->stream.avail_in = (uInt)0;
+
+ s->pfile_in_zip_read = pfile_in_zip_read_info;
+ s->encrypted = 0;
+
+# ifndef NOUNCRYPT
+ if (password != NULL)
+ {
+ int i;
+ s->pcrc_32_tab = get_crc_table();
+ init_keys(password,s->keys,s->pcrc_32_tab);
+ if (ZSEEK64(s->z_filefunc, s->filestream,
+ s->pfile_in_zip_read->pos_in_zipfile +
+ s->pfile_in_zip_read->byte_before_the_zipfile,
+ SEEK_SET)!=0)
+ return UNZ_INTERNALERROR;
+ if(ZREAD64(s->z_filefunc, s->filestream,source, 12)<12)
+ return UNZ_INTERNALERROR;
+
+ for (i = 0; i<12; i++)
+ zdecode(s->keys,s->pcrc_32_tab,source[i]);
+
+ s->pfile_in_zip_read->pos_in_zipfile+=12;
+ s->encrypted=1;
+ }
+# endif
+
+
+ return UNZ_OK;
+}
+
+extern int ZEXPORT unzOpenCurrentFile (unzFile file)
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, NULL);
+}
+
+extern int ZEXPORT unzOpenCurrentFilePassword (unzFile file, const char* password)
+{
+ return unzOpenCurrentFile3(file, NULL, NULL, 0, password);
+}
+
+extern int ZEXPORT unzOpenCurrentFile2 (unzFile file, int* method, int* level, int raw)
+{
+ return unzOpenCurrentFile3(file, method, level, raw, NULL);
+}
+
+/** Addition for GDAL : START */
+
+extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64( unzFile file)
+{
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ s=(unz64_s*)file;
+ if (file==NULL)
+ return 0; //UNZ_PARAMERROR;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+ if (pfile_in_zip_read_info==NULL)
+ return 0; //UNZ_PARAMERROR;
+ return pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->byte_before_the_zipfile;
+}
+
+/** Addition for GDAL : END */
+
+/*
+ Read bytes from the current file.
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+extern int ZEXPORT unzReadCurrentFile (unzFile file, voidp buf, unsigned len)
+{
+ int err=UNZ_OK;
+ uInt iRead = 0;
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if (pfile_in_zip_read_info->read_buffer == NULL)
+ return UNZ_END_OF_LIST_OF_FILE;
+ if (len==0)
+ return 0;
+
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)buf;
+
+ pfile_in_zip_read_info->stream.avail_out = (uInt)len;
+
+ if ((len>pfile_in_zip_read_info->rest_read_uncompressed) &&
+ (!(pfile_in_zip_read_info->raw)))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_uncompressed;
+
+ if ((len>pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in) &&
+ (pfile_in_zip_read_info->raw))
+ pfile_in_zip_read_info->stream.avail_out =
+ (uInt)pfile_in_zip_read_info->rest_read_compressed+
+ pfile_in_zip_read_info->stream.avail_in;
+
+ while (pfile_in_zip_read_info->stream.avail_out>0)
+ {
+ if ((pfile_in_zip_read_info->stream.avail_in==0) &&
+ (pfile_in_zip_read_info->rest_read_compressed>0))
+ {
+ uInt uReadThis = UNZ_BUFSIZE;
+ if (pfile_in_zip_read_info->rest_read_compressed<uReadThis)
+ uReadThis = (uInt)pfile_in_zip_read_info->rest_read_compressed;
+ if (uReadThis == 0)
+ return UNZ_EOF;
+ if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->pos_in_zipfile +
+ pfile_in_zip_read_info->byte_before_the_zipfile,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+ if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->read_buffer,
+ uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+
+
+# ifndef NOUNCRYPT
+ if(s->encrypted)
+ {
+ uInt i;
+ for(i=0;i<uReadThis;i++)
+ pfile_in_zip_read_info->read_buffer[i] =
+ zdecode(s->keys,s->pcrc_32_tab,
+ pfile_in_zip_read_info->read_buffer[i]);
+ }
+# endif
+
+
+ pfile_in_zip_read_info->pos_in_zipfile += uReadThis;
+
+ pfile_in_zip_read_info->rest_read_compressed-=uReadThis;
+
+ pfile_in_zip_read_info->stream.next_in =
+ (Bytef*)pfile_in_zip_read_info->read_buffer;
+ pfile_in_zip_read_info->stream.avail_in = (uInt)uReadThis;
+ }
+
+ if ((pfile_in_zip_read_info->compression_method==0) || (pfile_in_zip_read_info->raw))
+ {
+ uInt uDoCopy,i ;
+
+ if ((pfile_in_zip_read_info->stream.avail_in == 0) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ return (iRead==0) ? UNZ_EOF : iRead;
+
+ if (pfile_in_zip_read_info->stream.avail_out <
+ pfile_in_zip_read_info->stream.avail_in)
+ uDoCopy = pfile_in_zip_read_info->stream.avail_out ;
+ else
+ uDoCopy = pfile_in_zip_read_info->stream.avail_in ;
+
+ for (i=0;i<uDoCopy;i++)
+ *(pfile_in_zip_read_info->stream.next_out+i) =
+ *(pfile_in_zip_read_info->stream.next_in+i);
+
+ pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uDoCopy;
+
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,
+ pfile_in_zip_read_info->stream.next_out,
+ uDoCopy);
+ pfile_in_zip_read_info->rest_read_uncompressed-=uDoCopy;
+ pfile_in_zip_read_info->stream.avail_in -= uDoCopy;
+ pfile_in_zip_read_info->stream.avail_out -= uDoCopy;
+ pfile_in_zip_read_info->stream.next_out += uDoCopy;
+ pfile_in_zip_read_info->stream.next_in += uDoCopy;
+ pfile_in_zip_read_info->stream.total_out += uDoCopy;
+ iRead += uDoCopy;
+ }
+ else if (pfile_in_zip_read_info->compression_method==Z_BZIP2ED)
+ {
+#ifdef HAVE_BZIP2
+ uLong uTotalOutBefore,uTotalOutAfter;
+ const Bytef *bufBefore;
+ uLong uOutThis;
+
+ pfile_in_zip_read_info->bstream.next_in = (char*)pfile_in_zip_read_info->stream.next_in;
+ pfile_in_zip_read_info->bstream.avail_in = pfile_in_zip_read_info->stream.avail_in;
+ pfile_in_zip_read_info->bstream.total_in_lo32 = pfile_in_zip_read_info->stream.total_in;
+ pfile_in_zip_read_info->bstream.total_in_hi32 = 0;
+ pfile_in_zip_read_info->bstream.next_out = (char*)pfile_in_zip_read_info->stream.next_out;
+ pfile_in_zip_read_info->bstream.avail_out = pfile_in_zip_read_info->stream.avail_out;
+ pfile_in_zip_read_info->bstream.total_out_lo32 = pfile_in_zip_read_info->stream.total_out;
+ pfile_in_zip_read_info->bstream.total_out_hi32 = 0;
+
+ uTotalOutBefore = pfile_in_zip_read_info->bstream.total_out_lo32;
+ bufBefore = (const Bytef *)pfile_in_zip_read_info->bstream.next_out;
+
+ err=BZ2_bzDecompress(&pfile_in_zip_read_info->bstream);
+
+ uTotalOutAfter = pfile_in_zip_read_info->bstream.total_out_lo32;
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+ pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
+
+ pfile_in_zip_read_info->crc32 = crc32(pfile_in_zip_read_info->crc32,bufBefore, (uInt)(uOutThis));
+ pfile_in_zip_read_info->rest_read_uncompressed -= uOutThis;
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+ pfile_in_zip_read_info->stream.next_in = (Bytef*)pfile_in_zip_read_info->bstream.next_in;
+ pfile_in_zip_read_info->stream.avail_in = pfile_in_zip_read_info->bstream.avail_in;
+ pfile_in_zip_read_info->stream.total_in = pfile_in_zip_read_info->bstream.total_in_lo32;
+ pfile_in_zip_read_info->stream.next_out = (Bytef*)pfile_in_zip_read_info->bstream.next_out;
+ pfile_in_zip_read_info->stream.avail_out = pfile_in_zip_read_info->bstream.avail_out;
+ pfile_in_zip_read_info->stream.total_out = pfile_in_zip_read_info->bstream.total_out_lo32;
+
+ if (err==BZ_STREAM_END)
+ return (iRead==0) ? UNZ_EOF : iRead;
+ if (err!=BZ_OK)
+ break;
+#endif
+ } // end Z_BZIP2ED
+ else
+ {
+ ZPOS64_T uTotalOutBefore,uTotalOutAfter;
+ const Bytef *bufBefore;
+ ZPOS64_T uOutThis;
+ int flush=Z_SYNC_FLUSH;
+
+ uTotalOutBefore = pfile_in_zip_read_info->stream.total_out;
+ bufBefore = pfile_in_zip_read_info->stream.next_out;
+
+ /*
+ if ((pfile_in_zip_read_info->rest_read_uncompressed ==
+ pfile_in_zip_read_info->stream.avail_out) &&
+ (pfile_in_zip_read_info->rest_read_compressed == 0))
+ flush = Z_FINISH;
+ */
+ err=inflate(&pfile_in_zip_read_info->stream,flush);
+
+ if ((err>=0) && (pfile_in_zip_read_info->stream.msg!=NULL))
+ err = Z_DATA_ERROR;
+
+ uTotalOutAfter = pfile_in_zip_read_info->stream.total_out;
+ uOutThis = uTotalOutAfter-uTotalOutBefore;
+
+ pfile_in_zip_read_info->total_out_64 = pfile_in_zip_read_info->total_out_64 + uOutThis;
+
+ pfile_in_zip_read_info->crc32 =
+ crc32(pfile_in_zip_read_info->crc32,bufBefore,
+ (uInt)(uOutThis));
+
+ pfile_in_zip_read_info->rest_read_uncompressed -=
+ uOutThis;
+
+ iRead += (uInt)(uTotalOutAfter - uTotalOutBefore);
+
+ if (err==Z_STREAM_END)
+ return (iRead==0) ? UNZ_EOF : iRead;
+ if (err!=Z_OK)
+ break;
+ }
+ }
+
+ if (err==Z_OK)
+ return iRead;
+ return err;
+}
+
+
+/*
+ Give the current position in uncompressed data
+*/
+extern z_off_t ZEXPORT unztell (unzFile file)
+{
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ return (z_off_t)pfile_in_zip_read_info->stream.total_out;
+}
+
+extern ZPOS64_T ZEXPORT unztell64 (unzFile file)
+{
+
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return (ZPOS64_T)-1;
+ s=(unz64_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return (ZPOS64_T)-1;
+
+ return pfile_in_zip_read_info->total_out_64;
+}
+
+
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+extern int ZEXPORT unzeof (unzFile file)
+{
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ if (pfile_in_zip_read_info->rest_read_uncompressed == 0)
+ return 1;
+ else
+ return 0;
+}
+
+
+
+/*
+Read extra field from the current file (opened by unzOpenCurrentFile)
+This is the local-header version of the extra field (sometimes, there is
+more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field that can be read
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+extern int ZEXPORT unzGetLocalExtrafield (unzFile file, voidp buf, unsigned len)
+{
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ uInt read_now;
+ ZPOS64_T size_to_read;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+ size_to_read = (pfile_in_zip_read_info->size_local_extrafield -
+ pfile_in_zip_read_info->pos_local_extrafield);
+
+ if (buf==NULL)
+ return (int)size_to_read;
+
+ if (len>size_to_read)
+ read_now = (uInt)size_to_read;
+ else
+ read_now = (uInt)len ;
+
+ if (read_now==0)
+ return 0;
+
+ if (ZSEEK64(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ pfile_in_zip_read_info->offset_local_extrafield +
+ pfile_in_zip_read_info->pos_local_extrafield,
+ ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (ZREAD64(pfile_in_zip_read_info->z_filefunc,
+ pfile_in_zip_read_info->filestream,
+ buf,read_now)!=read_now)
+ return UNZ_ERRNO;
+
+ return (int)read_now;
+}
+
+/*
+ Close the file in zip opened with unzOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+extern int ZEXPORT unzCloseCurrentFile (unzFile file)
+{
+ int err=UNZ_OK;
+
+ unz64_s* s;
+ file_in_zip64_read_info_s* pfile_in_zip_read_info;
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ pfile_in_zip_read_info=s->pfile_in_zip_read;
+
+ if (pfile_in_zip_read_info==NULL)
+ return UNZ_PARAMERROR;
+
+
+ if ((pfile_in_zip_read_info->rest_read_uncompressed == 0) &&
+ (!pfile_in_zip_read_info->raw))
+ {
+ if (pfile_in_zip_read_info->crc32 != pfile_in_zip_read_info->crc32_wait)
+ err=UNZ_CRCERROR;
+ }
+
+
+ TRYFREE(pfile_in_zip_read_info->read_buffer);
+ pfile_in_zip_read_info->read_buffer = NULL;
+ if (pfile_in_zip_read_info->stream_initialised == Z_DEFLATED)
+ inflateEnd(&pfile_in_zip_read_info->stream);
+#ifdef HAVE_BZIP2
+ else if (pfile_in_zip_read_info->stream_initialised == Z_BZIP2ED)
+ BZ2_bzDecompressEnd(&pfile_in_zip_read_info->bstream);
+#endif
+
+
+ pfile_in_zip_read_info->stream_initialised = 0;
+ TRYFREE(pfile_in_zip_read_info);
+
+ s->pfile_in_zip_read=NULL;
+
+ return err;
+}
+
+
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+extern int ZEXPORT unzGetGlobalComment (unzFile file, char * szComment, uLong uSizeBuf)
+{
+ unz64_s* s;
+ uLong uReadThis ;
+ if (file==NULL)
+ return (int)UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+
+ uReadThis = uSizeBuf;
+ if (uReadThis>s->gi.size_comment)
+ uReadThis = s->gi.size_comment;
+
+ if (ZSEEK64(s->z_filefunc,s->filestream,s->central_pos+22,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return UNZ_ERRNO;
+
+ if (uReadThis>0)
+ {
+ *szComment='\0';
+ if (ZREAD64(s->z_filefunc,s->filestream,szComment,uReadThis)!=uReadThis)
+ return UNZ_ERRNO;
+ }
+
+ if ((szComment != NULL) && (uSizeBuf > s->gi.size_comment))
+ *(szComment+s->gi.size_comment)='\0';
+ return (int)uReadThis;
+}
+
+/* Additions by RX '2004 */
+extern ZPOS64_T ZEXPORT unzGetOffset64(unzFile file)
+{
+ unz64_s* s;
+
+ if (file==NULL)
+ return 0; //UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+ if (!s->current_file_ok)
+ return 0;
+ if (s->gi.number_entry != 0 && s->gi.number_entry != 0xffff)
+ if (s->num_file==s->gi.number_entry)
+ return 0;
+ return s->pos_in_central_dir;
+}
+
+extern uLong ZEXPORT unzGetOffset (unzFile file)
+{
+ ZPOS64_T offset64;
+
+ if (file==NULL)
+ return 0; //UNZ_PARAMERROR;
+ offset64 = unzGetOffset64(file);
+ return (uLong)offset64;
+}
+
+extern int ZEXPORT unzSetOffset64(unzFile file, ZPOS64_T pos)
+{
+ unz64_s* s;
+ int err;
+
+ if (file==NULL)
+ return UNZ_PARAMERROR;
+ s=(unz64_s*)file;
+
+ s->pos_in_central_dir = pos;
+ s->num_file = s->gi.number_entry; /* hack */
+ err = unz64local_GetCurrentFileInfoInternal(file,&s->cur_file_info,
+ &s->cur_file_info_internal,
+ NULL,0,NULL,0,NULL,0);
+ s->current_file_ok = (err == UNZ_OK);
+ return err;
+}
+
+extern int ZEXPORT unzSetOffset (unzFile file, uLong pos)
+{
+ return unzSetOffset64(file,pos);
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.h
new file mode 100644
index 000000000..2104e3915
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/unzip.h
@@ -0,0 +1,437 @@
+/* unzip.h -- IO for uncompress .zip files using zlib
+ Version 1.1, February 14h, 2010
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications of Unzip for Zip64
+ Copyright (C) 2007-2008 Even Rouault
+
+ Modifications for Zip64 support on both zip and unzip
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+ ---------------------------------------------------------------------------------
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ ---------------------------------------------------------------------------------
+
+ Changes
+
+ See header of unzip64.c
+
+*/
+
+#ifndef _unz64_H
+#define _unz64_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#ifdef HAVE_BZIP2
+#include "bzlib.h"
+#endif
+
+#define Z_BZIP2ED 12
+
+#if defined(STRICTUNZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagunzFile__ { int unused; } unzFile__;
+typedef unzFile__ *unzFile;
+#else
+typedef voidp unzFile;
+#endif
+
+
+#define UNZ_OK (0)
+#define UNZ_END_OF_LIST_OF_FILE (-100)
+#define UNZ_ERRNO (Z_ERRNO)
+#define UNZ_EOF (0)
+#define UNZ_PARAMERROR (-102)
+#define UNZ_BADZIPFILE (-103)
+#define UNZ_INTERNALERROR (-104)
+#define UNZ_CRCERROR (-105)
+
+/* tm_unz contain date/time info */
+typedef struct tm_unz_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_unz;
+
+/* unz_global_info structure contain global data about the ZIPfile
+ These data comes from the end of central dir */
+typedef struct unz_global_info64_s
+{
+ ZPOS64_T number_entry; /* total number of entries in
+ the central dir on this disk */
+ uLong size_comment; /* size of the global comment of the zipfile */
+} unz_global_info64;
+
+typedef struct unz_global_info_s
+{
+ uLong number_entry; /* total number of entries in
+ the central dir on this disk */
+ uLong size_comment; /* size of the global comment of the zipfile */
+} unz_global_info;
+
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_info64_s
+{
+ uLong version; /* version made by 2 bytes */
+ uLong version_needed; /* version needed to extract 2 bytes */
+ uLong flag; /* general purpose bit flag 2 bytes */
+ uLong compression_method; /* compression method 2 bytes */
+ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
+ uLong crc; /* crc-32 4 bytes */
+ ZPOS64_T compressed_size; /* compressed size 8 bytes */
+ ZPOS64_T uncompressed_size; /* uncompressed size 8 bytes */
+ uLong size_filename; /* filename length 2 bytes */
+ uLong size_file_extra; /* extra field length 2 bytes */
+ uLong size_file_comment; /* file comment length 2 bytes */
+
+ uLong disk_num_start; /* disk number start 2 bytes */
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+
+ tm_unz tmu_date;
+} unz_file_info64;
+
+typedef struct unz_file_info_s
+{
+ uLong version; /* version made by 2 bytes */
+ uLong version_needed; /* version needed to extract 2 bytes */
+ uLong flag; /* general purpose bit flag 2 bytes */
+ uLong compression_method; /* compression method 2 bytes */
+ uLong dosDate; /* last mod file date in Dos fmt 4 bytes */
+ uLong crc; /* crc-32 4 bytes */
+ uLong compressed_size; /* compressed size 4 bytes */
+ uLong uncompressed_size; /* uncompressed size 4 bytes */
+ uLong size_filename; /* filename length 2 bytes */
+ uLong size_file_extra; /* extra field length 2 bytes */
+ uLong size_file_comment; /* file comment length 2 bytes */
+
+ uLong disk_num_start; /* disk number start 2 bytes */
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+
+ tm_unz tmu_date;
+} unz_file_info;
+
+extern int ZEXPORT unzStringFileNameCompare OF ((const char* fileName1,
+ const char* fileName2,
+ int iCaseSensitivity));
+/*
+ Compare two filename (fileName1,fileName2).
+ If iCaseSenisivity = 1, comparision is case sensitivity (like strcmp)
+ If iCaseSenisivity = 2, comparision is not case sensitivity (like strcmpi
+ or strcasecmp)
+ If iCaseSenisivity = 0, case sensitivity is defaut of your operating system
+ (like 1 on Unix, 2 on Windows)
+*/
+
+
+extern unzFile ZEXPORT unzOpen OF((const char *path));
+extern unzFile ZEXPORT unzOpen64 OF((const void *path));
+/*
+ Open a Zip file. path contain the full pathname (by example,
+ on a Windows XP computer "c:\\zlib\\zlib113.zip" or on an Unix computer
+ "zlib/zlib113.zip".
+ If the zipfile cannot be opened (file don't exist or in not valid), the
+ return value is NULL.
+ Else, the return value is a unzFile Handle, usable with other function
+ of this unzip package.
+ the "64" function take a const void* pointer, because the path is just the
+ value passed to the open64_file_func callback.
+ Under Windows, if UNICODE is defined, using fill_fopen64_filefunc, the path
+ is a pointer to a wide unicode string (LPCTSTR is LPCWSTR), so const char*
+ does not describe the reality
+*/
+
+
+extern unzFile ZEXPORT unzOpen2 OF((const char *path,
+ zlib_filefunc_def* pzlib_filefunc_def));
+/*
+ Open a Zip file, like unzOpen, but provide a set of file low level API
+ for read/write the zip file (see ioapi.h)
+*/
+
+extern unzFile ZEXPORT unzOpen2_64 OF((const void *path,
+ zlib_filefunc64_def* pzlib_filefunc_def));
+/*
+ Open a Zip file, like unz64Open, but provide a set of file low level API
+ for read/write the zip file (see ioapi.h)
+*/
+
+extern int ZEXPORT unzClose OF((unzFile file));
+/*
+ Close a ZipFile opened with unzOpen.
+ If there is files inside the .Zip opened with unzOpenCurrentFile (see later),
+ these files MUST be closed with unzCloseCurrentFile before call unzClose.
+ return UNZ_OK if there is no problem. */
+
+extern int ZEXPORT unzGetGlobalInfo OF((unzFile file,
+ unz_global_info *pglobal_info));
+
+extern int ZEXPORT unzGetGlobalInfo64 OF((unzFile file,
+ unz_global_info64 *pglobal_info));
+/*
+ Write info about the ZipFile in the *pglobal_info structure.
+ No preparation of the structure is needed
+ return UNZ_OK if there is no problem. */
+
+
+extern int ZEXPORT unzGetGlobalComment OF((unzFile file,
+ char *szComment,
+ uLong uSizeBuf));
+/*
+ Get the global comment string of the ZipFile, in the szComment buffer.
+ uSizeBuf is the size of the szComment buffer.
+ return the number of byte copied or an error code <0
+*/
+
+
+/***************************************************************************/
+/* Unzip package allow you browse the directory of the zipfile */
+
+extern int ZEXPORT unzGoToFirstFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the first file.
+ return UNZ_OK if there is no problem
+*/
+
+extern int ZEXPORT unzGoToNextFile OF((unzFile file));
+/*
+ Set the current file of the zipfile to the next file.
+ return UNZ_OK if there is no problem
+ return UNZ_END_OF_LIST_OF_FILE if the actual file was the latest.
+*/
+
+extern int ZEXPORT unzLocateFile OF((unzFile file,
+ const char *szFileName,
+ int iCaseSensitivity));
+/*
+ Try locate the file szFileName in the zipfile.
+ For the iCaseSensitivity signification, see unzStringFileNameCompare
+
+ return value :
+ UNZ_OK if the file is found. It becomes the current file.
+ UNZ_END_OF_LIST_OF_FILE if the file is not found
+*/
+
+
+/* ****************************************** */
+/* Ryan supplied functions */
+/* unz_file_info contain information about a file in the zipfile */
+typedef struct unz_file_pos_s
+{
+ uLong pos_in_zip_directory; /* offset in zip file directory */
+ uLong num_of_file; /* # of file */
+} unz_file_pos;
+
+extern int ZEXPORT unzGetFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+extern int ZEXPORT unzGoToFilePos(
+ unzFile file,
+ unz_file_pos* file_pos);
+
+typedef struct unz64_file_pos_s
+{
+ ZPOS64_T pos_in_zip_directory; /* offset in zip file directory */
+ ZPOS64_T num_of_file; /* # of file */
+} unz64_file_pos;
+
+extern int ZEXPORT unzGetFilePos64(
+ unzFile file,
+ unz64_file_pos* file_pos);
+
+extern int ZEXPORT unzGoToFilePos64(
+ unzFile file,
+ const unz64_file_pos* file_pos);
+
+/* ****************************************** */
+
+extern int ZEXPORT unzGetCurrentFileInfo64 OF((unzFile file,
+ unz_file_info64 *pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+
+extern int ZEXPORT unzGetCurrentFileInfo OF((unzFile file,
+ unz_file_info *pfile_info,
+ char *szFileName,
+ uLong fileNameBufferSize,
+ void *extraField,
+ uLong extraFieldBufferSize,
+ char *szComment,
+ uLong commentBufferSize));
+/*
+ Get Info about the current file
+ if pfile_info!=NULL, the *pfile_info structure will contain somes info about
+ the current file
+ if szFileName!=NULL, the filemane string will be copied in szFileName
+ (fileNameBufferSize is the size of the buffer)
+ if extraField!=NULL, the extra field information will be copied in extraField
+ (extraFieldBufferSize is the size of the buffer).
+ This is the Central-header version of the extra field
+ if szComment!=NULL, the comment string of the file will be copied in szComment
+ (commentBufferSize is the size of the buffer)
+*/
+
+
+/** Addition for GDAL : START */
+
+extern ZPOS64_T ZEXPORT unzGetCurrentFileZStreamPos64 OF((unzFile file));
+
+/** Addition for GDAL : END */
+
+
+/***************************************************************************/
+/* for reading the content of the current zipfile, you can open it, read data
+ from it, and close it (you can close it before reading all the file)
+ */
+
+extern int ZEXPORT unzOpenCurrentFile OF((unzFile file));
+/*
+ Open for reading data the current file in the zipfile.
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFilePassword OF((unzFile file,
+ const char* password));
+/*
+ Open for reading data the current file in the zipfile.
+ password is a crypting password
+ If there is no error, the return value is UNZ_OK.
+*/
+
+extern int ZEXPORT unzOpenCurrentFile2 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+extern int ZEXPORT unzOpenCurrentFile3 OF((unzFile file,
+ int* method,
+ int* level,
+ int raw,
+ const char* password));
+/*
+ Same than unzOpenCurrentFile, but open for read raw the file (not uncompress)
+ if raw==1
+ *method will receive method of compression, *level will receive level of
+ compression
+ note : you can set level parameter as NULL (if you did not want known level,
+ but you CANNOT set method parameter as NULL
+*/
+
+
+extern int ZEXPORT unzCloseCurrentFile OF((unzFile file));
+/*
+ Close the file in zip opened with unzOpenCurrentFile
+ Return UNZ_CRCERROR if all the file was read but the CRC is not good
+*/
+
+extern int ZEXPORT unzReadCurrentFile OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read bytes from the current file (opened by unzOpenCurrentFile)
+ buf contain buffer where data must be copied
+ len the size of buf.
+
+ return the number of byte copied if somes bytes are copied
+ return 0 if the end of file was reached
+ return <0 with error code if there is an error
+ (UNZ_ERRNO for IO error, or zLib error for uncompress error)
+*/
+
+extern z_off_t ZEXPORT unztell OF((unzFile file));
+
+extern ZPOS64_T ZEXPORT unztell64 OF((unzFile file));
+/*
+ Give the current position in uncompressed data
+*/
+
+extern int ZEXPORT unzeof OF((unzFile file));
+/*
+ return 1 if the end of file was reached, 0 elsewhere
+*/
+
+extern int ZEXPORT unzGetLocalExtrafield OF((unzFile file,
+ voidp buf,
+ unsigned len));
+/*
+ Read extra field from the current file (opened by unzOpenCurrentFile)
+ This is the local-header version of the extra field (sometimes, there is
+ more info in the local-header version than in the central-header)
+
+ if buf==NULL, it return the size of the local extra field
+
+ if buf!=NULL, len is the size of the buffer, the extra header is copied in
+ buf.
+ the return value is the number of bytes copied in buf, or (if <0)
+ the error code
+*/
+
+/***************************************************************************/
+
+/* Get the current file offset */
+extern ZPOS64_T ZEXPORT unzGetOffset64 (unzFile file);
+extern uLong ZEXPORT unzGetOffset (unzFile file);
+
+/* Set the current file offset */
+extern int ZEXPORT unzSetOffset64 (unzFile file, ZPOS64_T pos);
+extern int ZEXPORT unzSetOffset (unzFile file, uLong pos);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _unz64_H */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.c
new file mode 100644
index 000000000..44e88a9cb
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.c
@@ -0,0 +1,2007 @@
+/* zip.c -- IO on .zip files using zlib
+ Version 1.1, February 14h, 2010
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications for Zip64 support
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+ Changes
+ Oct-2009 - Mathias Svensson - Remove old C style function prototypes
+ Oct-2009 - Mathias Svensson - Added Zip64 Support when creating new file archives
+ Oct-2009 - Mathias Svensson - Did some code cleanup and refactoring to get better overview of some functions.
+ Oct-2009 - Mathias Svensson - Added zipRemoveExtraInfoBlock to strip extra field data from its ZIP64 data
+ It is used when recreting zip archive with RAW when deleting items from a zip.
+ ZIP64 data is automatically added to items that needs it, and existing ZIP64 data need to be removed.
+ Oct-2009 - Mathias Svensson - Added support for BZIP2 as compression mode (bzip2 lib is required)
+ Jan-2010 - back to unzip and minizip 1.0 name scheme, with compatibility layer
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include "zlib.h"
+#include "zip.h"
+
+#ifdef STDC
+# include <stddef.h>
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+ extern int errno;
+#else
+# include <errno.h>
+#endif
+
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+#ifndef VERSIONMADEBY
+# define VERSIONMADEBY (0x0) /* platform depedent */
+#endif
+
+#ifndef Z_BUFSIZE
+#define Z_BUFSIZE (64*1024) //(16384)
+#endif
+
+#ifndef Z_MAXFILENAMEINZIP
+#define Z_MAXFILENAMEINZIP (256)
+#endif
+
+#ifndef ALLOC
+# define ALLOC(size) (malloc(size))
+#endif
+#ifndef TRYFREE
+# define TRYFREE(p) {if (p) free(p);}
+#endif
+
+/*
+#define SIZECENTRALDIRITEM (0x2e)
+#define SIZEZIPLOCALHEADER (0x1e)
+*/
+
+/* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
+
+
+// NOT sure that this work on ALL platform
+#define MAKEULONG64(a, b) ((ZPOS64_T)(((unsigned long)(a)) | ((ZPOS64_T)((unsigned long)(b))) << 32))
+
+#ifndef SEEK_CUR
+#define SEEK_CUR 1
+#endif
+
+#ifndef SEEK_END
+#define SEEK_END 2
+#endif
+
+#ifndef SEEK_SET
+#define SEEK_SET 0
+#endif
+
+#ifndef DEF_MEM_LEVEL
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+#endif
+const char zip_copyright[] =" zip 1.01 Copyright 1998-2004 Gilles Vollant - http://www.winimage.com/zLibDll";
+
+
+#define SIZEDATA_INDATABLOCK (4096-(4*4))
+
+#define LOCALHEADERMAGIC (0x04034b50)
+#define CENTRALHEADERMAGIC (0x02014b50)
+#define ENDHEADERMAGIC (0x06054b50)
+#define ZIP64ENDHEADERMAGIC (0x6064b50)
+#define ZIP64ENDLOCHEADERMAGIC (0x7064b50)
+
+#define FLAG_LOCALHEADER_OFFSET (0x06)
+#define CRC_LOCALHEADER_OFFSET (0x0e)
+
+#define SIZECENTRALHEADER (0x2e) /* 46 */
+
+typedef struct linkedlist_datablock_internal_s
+{
+ struct linkedlist_datablock_internal_s* next_datablock;
+ uLong avail_in_this_block;
+ uLong filled_in_this_block;
+ uLong unused; /* for future use and alignment */
+ unsigned char data[SIZEDATA_INDATABLOCK];
+} linkedlist_datablock_internal;
+
+typedef struct linkedlist_data_s
+{
+ linkedlist_datablock_internal* first_block;
+ linkedlist_datablock_internal* last_block;
+} linkedlist_data;
+
+
+typedef struct
+{
+ z_stream stream; /* zLib stream structure for inflate */
+#ifdef HAVE_BZIP2
+ bz_stream bstream; /* bzLib stream structure for bziped */
+#endif
+
+ int stream_initialised; /* 1 is stream is initialised */
+ uInt pos_in_buffered_data; /* last written byte in buffered_data */
+
+ ZPOS64_T pos_local_header; /* offset of the local header of the file
+ currenty writing */
+ char* central_header; /* central header data for the current file */
+ uLong size_centralExtra;
+ uLong size_centralheader; /* size of the central header for cur file */
+ uLong size_centralExtraFree; /* Extra bytes allocated to the centralheader but that are not used */
+ uLong flag; /* flag of the file currently writing */
+
+ int method; /* compression method of file currenty wr.*/
+ int raw; /* 1 for directly writing raw data */
+ Byte buffered_data[Z_BUFSIZE];/* buffer contain compressed data to be writ*/
+ uLong dosDate;
+ uLong crc32;
+ int encrypt;
+ int zip64; /* Add ZIP64 extened information in the extra field */
+ ZPOS64_T pos_zip64extrainfo;
+ ZPOS64_T totalCompressedData;
+ ZPOS64_T totalUncompressedData;
+#ifndef NOCRYPT
+ unsigned long keys[3]; /* keys defining the pseudo-random sequence */
+ const z_crc_t* pcrc_32_tab;
+ int crypt_header_size;
+#endif
+} curfile64_info;
+
+typedef struct
+{
+ zlib_filefunc64_32_def z_filefunc;
+ voidpf filestream; /* io structore of the zipfile */
+ linkedlist_data central_dir;/* datablock with central dir in construction*/
+ int in_opened_file_inzip; /* 1 if a file in the zip is currently writ.*/
+ curfile64_info ci; /* info on the file curretly writing */
+
+ ZPOS64_T begin_pos; /* position of the beginning of the zipfile */
+ ZPOS64_T add_position_when_writing_offset;
+ ZPOS64_T number_entry;
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+ char *globalcomment;
+#endif
+
+} zip64_internal;
+
+
+#ifndef NOCRYPT
+#define INCLUDECRYPTINGCODE_IFCRYPTALLOWED
+#include "crypt.h"
+#endif
+
+local linkedlist_datablock_internal* allocate_new_datablock()
+{
+ linkedlist_datablock_internal* ldi;
+ ldi = (linkedlist_datablock_internal*)
+ ALLOC(sizeof(linkedlist_datablock_internal));
+ if (ldi!=NULL)
+ {
+ ldi->next_datablock = NULL ;
+ ldi->filled_in_this_block = 0 ;
+ ldi->avail_in_this_block = SIZEDATA_INDATABLOCK ;
+ }
+ return ldi;
+}
+
+local void free_datablock(linkedlist_datablock_internal* ldi)
+{
+ while (ldi!=NULL)
+ {
+ linkedlist_datablock_internal* ldinext = ldi->next_datablock;
+ TRYFREE(ldi);
+ ldi = ldinext;
+ }
+}
+
+local void init_linkedlist(linkedlist_data* ll)
+{
+ ll->first_block = ll->last_block = NULL;
+}
+
+local void free_linkedlist(linkedlist_data* ll)
+{
+ free_datablock(ll->first_block);
+ ll->first_block = ll->last_block = NULL;
+}
+
+
+local int add_data_in_datablock(linkedlist_data* ll, const void* buf, uLong len)
+{
+ linkedlist_datablock_internal* ldi;
+ const unsigned char* from_copy;
+
+ if (ll==NULL)
+ return ZIP_INTERNALERROR;
+
+ if (ll->last_block == NULL)
+ {
+ ll->first_block = ll->last_block = allocate_new_datablock();
+ if (ll->first_block == NULL)
+ return ZIP_INTERNALERROR;
+ }
+
+ ldi = ll->last_block;
+ from_copy = (unsigned char*)buf;
+
+ while (len>0)
+ {
+ uInt copy_this;
+ uInt i;
+ unsigned char* to_copy;
+
+ if (ldi->avail_in_this_block==0)
+ {
+ ldi->next_datablock = allocate_new_datablock();
+ if (ldi->next_datablock == NULL)
+ return ZIP_INTERNALERROR;
+ ldi = ldi->next_datablock ;
+ ll->last_block = ldi;
+ }
+
+ if (ldi->avail_in_this_block < len)
+ copy_this = (uInt)ldi->avail_in_this_block;
+ else
+ copy_this = (uInt)len;
+
+ to_copy = &(ldi->data[ldi->filled_in_this_block]);
+
+ for (i=0;i<copy_this;i++)
+ *(to_copy+i)=*(from_copy+i);
+
+ ldi->filled_in_this_block += copy_this;
+ ldi->avail_in_this_block -= copy_this;
+ from_copy += copy_this ;
+ len -= copy_this;
+ }
+ return ZIP_OK;
+}
+
+
+
+/****************************************************************************/
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+/* ===========================================================================
+ Inputs a long in LSB order to the given file
+ nbByte == 1, 2 ,4 or 8 (byte, short or long, ZPOS64_T)
+*/
+
+local int zip64local_putValue OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte));
+local int zip64local_putValue (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T x, int nbByte)
+{
+ unsigned char buf[8];
+ int n;
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+ if (x != 0)
+ { /* data overflow - hack for ZIP64 (X Roche) */
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = 0xff;
+ }
+ }
+
+ if (ZWRITE64(*pzlib_filefunc_def,filestream,buf,nbByte)!=(uLong)nbByte)
+ return ZIP_ERRNO;
+ else
+ return ZIP_OK;
+}
+
+local void zip64local_putValue_inmemory OF((void* dest, ZPOS64_T x, int nbByte));
+local void zip64local_putValue_inmemory (void* dest, ZPOS64_T x, int nbByte)
+{
+ unsigned char* buf=(unsigned char*)dest;
+ int n;
+ for (n = 0; n < nbByte; n++) {
+ buf[n] = (unsigned char)(x & 0xff);
+ x >>= 8;
+ }
+
+ if (x != 0)
+ { /* data overflow - hack for ZIP64 */
+ for (n = 0; n < nbByte; n++)
+ {
+ buf[n] = 0xff;
+ }
+ }
+}
+
+/****************************************************************************/
+
+
+local uLong zip64local_TmzDateToDosDate(const tm_zip* ptm)
+{
+ uLong year = (uLong)ptm->tm_year;
+ if (year>=1980)
+ year-=1980;
+ else if (year>=80)
+ year-=80;
+ return
+ (uLong) (((ptm->tm_mday) + (32 * (ptm->tm_mon+1)) + (512 * year)) << 16) |
+ ((ptm->tm_sec/2) + (32* ptm->tm_min) + (2048 * (uLong)ptm->tm_hour));
+}
+
+
+/****************************************************************************/
+
+local int zip64local_getByte OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, int *pi));
+
+local int zip64local_getByte(const zlib_filefunc64_32_def* pzlib_filefunc_def,voidpf filestream,int* pi)
+{
+ unsigned char c;
+ int err = (int)ZREAD64(*pzlib_filefunc_def,filestream,&c,1);
+ if (err==1)
+ {
+ *pi = (int)c;
+ return ZIP_OK;
+ }
+ else
+ {
+ if (ZERROR64(*pzlib_filefunc_def,filestream))
+ return ZIP_ERRNO;
+ else
+ return ZIP_EOF;
+ }
+}
+
+
+/* ===========================================================================
+ Reads a long in LSB order from the given gz_stream. Sets
+*/
+local int zip64local_getShort OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX));
+
+local int zip64local_getShort (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
+{
+ uLong x ;
+ int i = 0;
+ int err;
+
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==ZIP_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int zip64local_getLong OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong *pX));
+
+local int zip64local_getLong (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, uLong* pX)
+{
+ uLong x ;
+ int i = 0;
+ int err;
+
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (uLong)i;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<8;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<16;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((uLong)i)<<24;
+
+ if (err==ZIP_OK)
+ *pX = x;
+ else
+ *pX = 0;
+ return err;
+}
+
+local int zip64local_getLong64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX));
+
+
+local int zip64local_getLong64 (const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream, ZPOS64_T *pX)
+{
+ ZPOS64_T x;
+ int i = 0;
+ int err;
+
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x = (ZPOS64_T)i;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((ZPOS64_T)i)<<8;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((ZPOS64_T)i)<<16;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((ZPOS64_T)i)<<24;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((ZPOS64_T)i)<<32;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((ZPOS64_T)i)<<40;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((ZPOS64_T)i)<<48;
+
+ if (err==ZIP_OK)
+ err = zip64local_getByte(pzlib_filefunc_def,filestream,&i);
+ x += ((ZPOS64_T)i)<<56;
+
+ if (err==ZIP_OK)
+ *pX = x;
+ else
+ *pX = 0;
+
+ return err;
+}
+
+#ifndef BUFREADCOMMENT
+#define BUFREADCOMMENT (0x400)
+#endif
+/*
+ Locate the Central directory of a zipfile (at the end, just before
+ the global comment)
+*/
+local ZPOS64_T zip64local_SearchCentralDir OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
+
+local ZPOS64_T zip64local_SearchCentralDir(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
+{
+ unsigned char* buf;
+ ZPOS64_T uSizeFile;
+ ZPOS64_T uBackRead;
+ ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+ ZPOS64_T uPosFound=0;
+
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+
+ uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize;
+ ZPOS64_T uReadPos ;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) &&
+ ((*(buf+i+2))==0x05) && ((*(buf+i+3))==0x06))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+ TRYFREE(buf);
+ return uPosFound;
+}
+
+/*
+Locate the End of Zip64 Central directory locator and from there find the CD of a zipfile (at the end, just before
+the global comment)
+*/
+local ZPOS64_T zip64local_SearchCentralDir64 OF((const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream));
+
+local ZPOS64_T zip64local_SearchCentralDir64(const zlib_filefunc64_32_def* pzlib_filefunc_def, voidpf filestream)
+{
+ unsigned char* buf;
+ ZPOS64_T uSizeFile;
+ ZPOS64_T uBackRead;
+ ZPOS64_T uMaxBack=0xffff; /* maximum size of global comment */
+ ZPOS64_T uPosFound=0;
+ uLong uL;
+ ZPOS64_T relativeOffset;
+
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,0,ZLIB_FILEFUNC_SEEK_END) != 0)
+ return 0;
+
+ uSizeFile = ZTELL64(*pzlib_filefunc_def,filestream);
+
+ if (uMaxBack>uSizeFile)
+ uMaxBack = uSizeFile;
+
+ buf = (unsigned char*)ALLOC(BUFREADCOMMENT+4);
+ if (buf==NULL)
+ return 0;
+
+ uBackRead = 4;
+ while (uBackRead<uMaxBack)
+ {
+ uLong uReadSize;
+ ZPOS64_T uReadPos;
+ int i;
+ if (uBackRead+BUFREADCOMMENT>uMaxBack)
+ uBackRead = uMaxBack;
+ else
+ uBackRead+=BUFREADCOMMENT;
+ uReadPos = uSizeFile-uBackRead ;
+
+ uReadSize = ((BUFREADCOMMENT+4) < (uSizeFile-uReadPos)) ?
+ (BUFREADCOMMENT+4) : (uLong)(uSizeFile-uReadPos);
+ if (ZSEEK64(*pzlib_filefunc_def,filestream,uReadPos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ break;
+
+ if (ZREAD64(*pzlib_filefunc_def,filestream,buf,uReadSize)!=uReadSize)
+ break;
+
+ for (i=(int)uReadSize-3; (i--)>0;)
+ {
+ // Signature "0x07064b50" Zip64 end of central directory locater
+ if (((*(buf+i))==0x50) && ((*(buf+i+1))==0x4b) && ((*(buf+i+2))==0x06) && ((*(buf+i+3))==0x07))
+ {
+ uPosFound = uReadPos+i;
+ break;
+ }
+ }
+
+ if (uPosFound!=0)
+ break;
+ }
+
+ TRYFREE(buf);
+ if (uPosFound == 0)
+ return 0;
+
+ /* Zip64 end of central directory locator */
+ if (ZSEEK64(*pzlib_filefunc_def,filestream, uPosFound,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return 0;
+
+ /* the signature, already checked */
+ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+ return 0;
+
+ /* number of the disk with the start of the zip64 end of central directory */
+ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+ return 0;
+ if (uL != 0)
+ return 0;
+
+ /* relative offset of the zip64 end of central directory record */
+ if (zip64local_getLong64(pzlib_filefunc_def,filestream,&relativeOffset)!=ZIP_OK)
+ return 0;
+
+ /* total number of disks */
+ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+ return 0;
+ if (uL != 1)
+ return 0;
+
+ /* Goto Zip64 end of central directory record */
+ if (ZSEEK64(*pzlib_filefunc_def,filestream, relativeOffset,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ return 0;
+
+ /* the signature */
+ if (zip64local_getLong(pzlib_filefunc_def,filestream,&uL)!=ZIP_OK)
+ return 0;
+
+ if (uL != 0x06064b50) // signature of 'Zip64 end of central directory'
+ return 0;
+
+ return relativeOffset;
+}
+
+int LoadCentralDirectoryRecord(zip64_internal* pziinit)
+{
+ int err=ZIP_OK;
+ ZPOS64_T byte_before_the_zipfile;/* byte before the zipfile, (>0 for sfx)*/
+
+ ZPOS64_T size_central_dir; /* size of the central directory */
+ ZPOS64_T offset_central_dir; /* offset of start of central directory */
+ ZPOS64_T central_pos;
+ uLong uL;
+
+ uLong number_disk; /* number of the current dist, used for
+ spaning ZIP, unsupported, always 0*/
+ uLong number_disk_with_CD; /* number the the disk with central dir, used
+ for spaning ZIP, unsupported, always 0*/
+ ZPOS64_T number_entry;
+ ZPOS64_T number_entry_CD; /* total number of entries in
+ the central dir
+ (same than number_entry on nospan) */
+ uLong VersionMadeBy;
+ uLong VersionNeeded;
+ uLong size_comment;
+
+ int hasZIP64Record = 0;
+
+ // check first if we find a ZIP64 record
+ central_pos = zip64local_SearchCentralDir64(&pziinit->z_filefunc,pziinit->filestream);
+ if(central_pos > 0)
+ {
+ hasZIP64Record = 1;
+ }
+ else if(central_pos == 0)
+ {
+ central_pos = zip64local_SearchCentralDir(&pziinit->z_filefunc,pziinit->filestream);
+ }
+
+/* disable to allow appending to empty ZIP archive
+ if (central_pos==0)
+ err=ZIP_ERRNO;
+*/
+
+ if(hasZIP64Record)
+ {
+ ZPOS64_T sizeEndOfCentralDirectory;
+ if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos, ZLIB_FILEFUNC_SEEK_SET) != 0)
+ err=ZIP_ERRNO;
+
+ /* the signature, already checked */
+ if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* size of zip64 end of central directory record */
+ if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &sizeEndOfCentralDirectory)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* version made by */
+ if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionMadeBy)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* version needed to extract */
+ if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &VersionNeeded)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of this disk */
+ if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* total number of entries in the central directory on this disk */
+ if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream, &number_entry)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* total number of entries in the central directory */
+ if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&number_entry_CD)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0))
+ err=ZIP_BADZIPFILE;
+
+ /* size of the central directory */
+ if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&size_central_dir)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* offset of start of central directory with respect to the
+ starting disk number */
+ if (zip64local_getLong64(&pziinit->z_filefunc, pziinit->filestream,&offset_central_dir)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ // TODO..
+ // read the comment from the standard central header.
+ size_comment = 0;
+ }
+ else
+ {
+ // Read End of central Directory info
+ if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, central_pos,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err=ZIP_ERRNO;
+
+ /* the signature, already checked */
+ if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream,&uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of this disk */
+ if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* number of the disk with the start of the central directory */
+ if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream,&number_disk_with_CD)!=ZIP_OK)
+ err=ZIP_ERRNO;
+
+ /* total number of entries in the central dir on this disk */
+ number_entry = 0;
+ if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+ else
+ number_entry = uL;
+
+ /* total number of entries in the central dir */
+ number_entry_CD = 0;
+ if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+ else
+ number_entry_CD = uL;
+
+ if ((number_entry_CD!=number_entry) || (number_disk_with_CD!=0) || (number_disk!=0))
+ err=ZIP_BADZIPFILE;
+
+ /* size of the central directory */
+ size_central_dir = 0;
+ if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+ else
+ size_central_dir = uL;
+
+ /* offset of start of central directory with respect to the starting disk number */
+ offset_central_dir = 0;
+ if (zip64local_getLong(&pziinit->z_filefunc, pziinit->filestream, &uL)!=ZIP_OK)
+ err=ZIP_ERRNO;
+ else
+ offset_central_dir = uL;
+
+
+ /* zipfile global comment length */
+ if (zip64local_getShort(&pziinit->z_filefunc, pziinit->filestream, &size_comment)!=ZIP_OK)
+ err=ZIP_ERRNO;
+ }
+
+ if ((central_pos<offset_central_dir+size_central_dir) &&
+ (err==ZIP_OK))
+ err=ZIP_BADZIPFILE;
+
+ if (err!=ZIP_OK)
+ {
+ ZCLOSE64(pziinit->z_filefunc, pziinit->filestream);
+ return ZIP_ERRNO;
+ }
+
+ if (size_comment>0)
+ {
+ pziinit->globalcomment = (char*)ALLOC(size_comment+1);
+ if (pziinit->globalcomment)
+ {
+ size_comment = ZREAD64(pziinit->z_filefunc, pziinit->filestream, pziinit->globalcomment,size_comment);
+ pziinit->globalcomment[size_comment]=0;
+ }
+ }
+
+ byte_before_the_zipfile = central_pos - (offset_central_dir+size_central_dir);
+ pziinit->add_position_when_writing_offset = byte_before_the_zipfile;
+
+ {
+ ZPOS64_T size_central_dir_to_read = size_central_dir;
+ size_t buf_size = SIZEDATA_INDATABLOCK;
+ void* buf_read = (void*)ALLOC(buf_size);
+ if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir + byte_before_the_zipfile, ZLIB_FILEFUNC_SEEK_SET) != 0)
+ err=ZIP_ERRNO;
+
+ while ((size_central_dir_to_read>0) && (err==ZIP_OK))
+ {
+ ZPOS64_T read_this = SIZEDATA_INDATABLOCK;
+ if (read_this > size_central_dir_to_read)
+ read_this = size_central_dir_to_read;
+
+ if (ZREAD64(pziinit->z_filefunc, pziinit->filestream,buf_read,(uLong)read_this) != read_this)
+ err=ZIP_ERRNO;
+
+ if (err==ZIP_OK)
+ err = add_data_in_datablock(&pziinit->central_dir,buf_read, (uLong)read_this);
+
+ size_central_dir_to_read-=read_this;
+ }
+ TRYFREE(buf_read);
+ }
+ pziinit->begin_pos = byte_before_the_zipfile;
+ pziinit->number_entry = number_entry_CD;
+
+ if (ZSEEK64(pziinit->z_filefunc, pziinit->filestream, offset_central_dir+byte_before_the_zipfile,ZLIB_FILEFUNC_SEEK_SET) != 0)
+ err=ZIP_ERRNO;
+
+ return err;
+}
+
+
+#endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+
+/************************************************************/
+extern zipFile ZEXPORT zipOpen3 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_32_def* pzlib_filefunc64_32_def)
+{
+ zip64_internal ziinit;
+ zip64_internal* zi;
+ int err=ZIP_OK;
+
+ ziinit.z_filefunc.zseek32_file = NULL;
+ ziinit.z_filefunc.ztell32_file = NULL;
+ if (pzlib_filefunc64_32_def==NULL)
+ fill_fopen64_filefunc(&ziinit.z_filefunc.zfile_func64);
+ else
+ ziinit.z_filefunc = *pzlib_filefunc64_32_def;
+
+ ziinit.filestream = ZOPEN64(ziinit.z_filefunc,
+ pathname,
+ (append == APPEND_STATUS_CREATE) ?
+ (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_CREATE) :
+ (ZLIB_FILEFUNC_MODE_READ | ZLIB_FILEFUNC_MODE_WRITE | ZLIB_FILEFUNC_MODE_EXISTING));
+
+ if (ziinit.filestream == NULL)
+ return NULL;
+
+ if (append == APPEND_STATUS_CREATEAFTER)
+ ZSEEK64(ziinit.z_filefunc,ziinit.filestream,0,SEEK_END);
+
+ ziinit.begin_pos = ZTELL64(ziinit.z_filefunc,ziinit.filestream);
+ ziinit.in_opened_file_inzip = 0;
+ ziinit.ci.stream_initialised = 0;
+ ziinit.number_entry = 0;
+ ziinit.add_position_when_writing_offset = 0;
+ init_linkedlist(&(ziinit.central_dir));
+
+
+
+ zi = (zip64_internal*)ALLOC(sizeof(zip64_internal));
+ if (zi==NULL)
+ {
+ ZCLOSE64(ziinit.z_filefunc,ziinit.filestream);
+ return NULL;
+ }
+
+ /* now we add file in a zipfile */
+# ifndef NO_ADDFILEINEXISTINGZIP
+ ziinit.globalcomment = NULL;
+ if (append == APPEND_STATUS_ADDINZIP)
+ {
+ // Read and Cache Central Directory Records
+ err = LoadCentralDirectoryRecord(&ziinit);
+ }
+
+ if (globalcomment)
+ {
+ *globalcomment = ziinit.globalcomment;
+ }
+# endif /* !NO_ADDFILEINEXISTINGZIP*/
+
+ if (err != ZIP_OK)
+ {
+# ifndef NO_ADDFILEINEXISTINGZIP
+ TRYFREE(ziinit.globalcomment);
+# endif /* !NO_ADDFILEINEXISTINGZIP*/
+ TRYFREE(zi);
+ return NULL;
+ }
+ else
+ {
+ *zi = ziinit;
+ return (zipFile)zi;
+ }
+}
+
+extern zipFile ZEXPORT zipOpen2 (const char *pathname, int append, zipcharpc* globalcomment, zlib_filefunc_def* pzlib_filefunc32_def)
+{
+ if (pzlib_filefunc32_def != NULL)
+ {
+ zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+ fill_zlib_filefunc64_32_def_from_filefunc32(&zlib_filefunc64_32_def_fill,pzlib_filefunc32_def);
+ return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill);
+ }
+ else
+ return zipOpen3(pathname, append, globalcomment, NULL);
+}
+
+extern zipFile ZEXPORT zipOpen2_64 (const void *pathname, int append, zipcharpc* globalcomment, zlib_filefunc64_def* pzlib_filefunc_def)
+{
+ if (pzlib_filefunc_def != NULL)
+ {
+ zlib_filefunc64_32_def zlib_filefunc64_32_def_fill;
+ zlib_filefunc64_32_def_fill.zfile_func64 = *pzlib_filefunc_def;
+ zlib_filefunc64_32_def_fill.ztell32_file = NULL;
+ zlib_filefunc64_32_def_fill.zseek32_file = NULL;
+ return zipOpen3(pathname, append, globalcomment, &zlib_filefunc64_32_def_fill);
+ }
+ else
+ return zipOpen3(pathname, append, globalcomment, NULL);
+}
+
+
+
+extern zipFile ZEXPORT zipOpen (const char* pathname, int append)
+{
+ return zipOpen3((const void*)pathname,append,NULL,NULL);
+}
+
+extern zipFile ZEXPORT zipOpen64 (const void* pathname, int append)
+{
+ return zipOpen3(pathname,append,NULL,NULL);
+}
+
+int Write_LocalFileHeader(zip64_internal* zi, const char* filename, uInt size_extrafield_local, const void* extrafield_local)
+{
+ /* write the local header */
+ int err;
+ uInt size_filename = (uInt)strlen(filename);
+ uInt size_extrafield = size_extrafield_local;
+
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)LOCALHEADERMAGIC, 4);
+
+ if (err==ZIP_OK)
+ {
+ if(zi->ci.zip64)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);/* version needed to extract */
+ else
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)20,2);/* version needed to extract */
+ }
+
+ if (err==ZIP_OK)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.flag,2);
+
+ if (err==ZIP_OK)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.method,2);
+
+ if (err==ZIP_OK)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->ci.dosDate,4);
+
+ // CRC / Compressed size / Uncompressed size will be filled in later and rewritten later
+ if (err==ZIP_OK)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* crc 32, unknown */
+ if (err==ZIP_OK)
+ {
+ if(zi->ci.zip64)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* compressed size, unknown */
+ else
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* compressed size, unknown */
+ }
+ if (err==ZIP_OK)
+ {
+ if(zi->ci.zip64)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xFFFFFFFF,4); /* uncompressed size, unknown */
+ else
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4); /* uncompressed size, unknown */
+ }
+
+ if (err==ZIP_OK)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_filename,2);
+
+ if(zi->ci.zip64)
+ {
+ size_extrafield += 20;
+ }
+
+ if (err==ZIP_OK)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_extrafield,2);
+
+ if ((err==ZIP_OK) && (size_filename > 0))
+ {
+ if (ZWRITE64(zi->z_filefunc,zi->filestream,filename,size_filename)!=size_filename)
+ err = ZIP_ERRNO;
+ }
+
+ if ((err==ZIP_OK) && (size_extrafield_local > 0))
+ {
+ if (ZWRITE64(zi->z_filefunc, zi->filestream, extrafield_local, size_extrafield_local) != size_extrafield_local)
+ err = ZIP_ERRNO;
+ }
+
+
+ if ((err==ZIP_OK) && (zi->ci.zip64))
+ {
+ // write the Zip64 extended info
+ short HeaderID = 1;
+ short DataSize = 16;
+ ZPOS64_T CompressedSize = 0;
+ ZPOS64_T UncompressedSize = 0;
+
+ // Remember position of Zip64 extended info for the local file header. (needed when we update size after done with file)
+ zi->ci.pos_zip64extrainfo = ZTELL64(zi->z_filefunc,zi->filestream);
+
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)HeaderID,2);
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (short)DataSize,2);
+
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)UncompressedSize,8);
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, (ZPOS64_T)CompressedSize,8);
+ }
+
+ return err;
+}
+
+/*
+ NOTE.
+ When writing RAW the ZIP64 extended information in extrafield_local and extrafield_global needs to be stripped
+ before calling this function it can be done with zipRemoveExtraInfoBlock
+
+ It is not done here because then we need to realloc a new buffer since parameters are 'const' and I want to minimize
+ unnecessary allocations.
+ */
+extern int ZEXPORT zipOpenNewFileInZip4_64 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void* extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level, int raw,
+ int windowBits,int memLevel, int strategy,
+ const char* password, uLong crcForCrypting,
+ uLong versionMadeBy, uLong flagBase, int zip64)
+{
+ zip64_internal* zi;
+ uInt size_filename;
+ uInt size_comment;
+ uInt i;
+ int err = ZIP_OK;
+
+# ifdef NOCRYPT
+ (crcForCrypting);
+ if (password != NULL)
+ return ZIP_PARAMERROR;
+# endif
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+
+#ifdef HAVE_BZIP2
+ if ((method!=0) && (method!=Z_DEFLATED) && (method!=Z_BZIP2ED))
+ return ZIP_PARAMERROR;
+#else
+ if ((method!=0) && (method!=Z_DEFLATED))
+ return ZIP_PARAMERROR;
+#endif
+
+ zi = (zip64_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ if (err != ZIP_OK)
+ return err;
+ }
+
+ if (filename==NULL)
+ filename="-";
+
+ if (comment==NULL)
+ size_comment = 0;
+ else
+ size_comment = (uInt)strlen(comment);
+
+ size_filename = (uInt)strlen(filename);
+
+ if (zipfi == NULL)
+ zi->ci.dosDate = 0;
+ else
+ {
+ if (zipfi->dosDate != 0)
+ zi->ci.dosDate = zipfi->dosDate;
+ else
+ zi->ci.dosDate = zip64local_TmzDateToDosDate(&zipfi->tmz_date);
+ }
+
+ zi->ci.flag = flagBase;
+ if ((level==8) || (level==9))
+ zi->ci.flag |= 2;
+ if (level==2)
+ zi->ci.flag |= 4;
+ if (level==1)
+ zi->ci.flag |= 6;
+ if (password != NULL)
+ zi->ci.flag |= 1;
+
+ zi->ci.crc32 = 0;
+ zi->ci.method = method;
+ zi->ci.encrypt = 0;
+ zi->ci.stream_initialised = 0;
+ zi->ci.pos_in_buffered_data = 0;
+ zi->ci.raw = raw;
+ zi->ci.pos_local_header = ZTELL64(zi->z_filefunc,zi->filestream);
+
+ zi->ci.size_centralheader = SIZECENTRALHEADER + size_filename + size_extrafield_global + size_comment;
+ zi->ci.size_centralExtraFree = 32; // Extra space we have reserved in case we need to add ZIP64 extra info data
+
+ zi->ci.central_header = (char*)ALLOC((uInt)zi->ci.size_centralheader + zi->ci.size_centralExtraFree);
+
+ zi->ci.size_centralExtra = size_extrafield_global;
+ zip64local_putValue_inmemory(zi->ci.central_header,(uLong)CENTRALHEADERMAGIC,4);
+ /* version info */
+ zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)versionMadeBy,2);
+ zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)20,2);
+ zip64local_putValue_inmemory(zi->ci.central_header+8,(uLong)zi->ci.flag,2);
+ zip64local_putValue_inmemory(zi->ci.central_header+10,(uLong)zi->ci.method,2);
+ zip64local_putValue_inmemory(zi->ci.central_header+12,(uLong)zi->ci.dosDate,4);
+ zip64local_putValue_inmemory(zi->ci.central_header+16,(uLong)0,4); /*crc*/
+ zip64local_putValue_inmemory(zi->ci.central_header+20,(uLong)0,4); /*compr size*/
+ zip64local_putValue_inmemory(zi->ci.central_header+24,(uLong)0,4); /*uncompr size*/
+ zip64local_putValue_inmemory(zi->ci.central_header+28,(uLong)size_filename,2);
+ zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)size_extrafield_global,2);
+ zip64local_putValue_inmemory(zi->ci.central_header+32,(uLong)size_comment,2);
+ zip64local_putValue_inmemory(zi->ci.central_header+34,(uLong)0,2); /*disk nm start*/
+
+ if (zipfi==NULL)
+ zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)0,2);
+ else
+ zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)zipfi->internal_fa,2);
+
+ if (zipfi==NULL)
+ zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)0,4);
+ else
+ zip64local_putValue_inmemory(zi->ci.central_header+38,(uLong)zipfi->external_fa,4);
+
+ if(zi->ci.pos_local_header >= 0xffffffff)
+ zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)0xffffffff,4);
+ else
+ zip64local_putValue_inmemory(zi->ci.central_header+42,(uLong)zi->ci.pos_local_header - zi->add_position_when_writing_offset,4);
+
+ for (i=0;i<size_filename;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+i) = *(filename+i);
+
+ for (i=0;i<size_extrafield_global;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+i) =
+ *(((const char*)extrafield_global)+i);
+
+ for (i=0;i<size_comment;i++)
+ *(zi->ci.central_header+SIZECENTRALHEADER+size_filename+
+ size_extrafield_global+i) = *(comment+i);
+ if (zi->ci.central_header == NULL)
+ return ZIP_INTERNALERROR;
+
+ zi->ci.zip64 = zip64;
+ zi->ci.totalCompressedData = 0;
+ zi->ci.totalUncompressedData = 0;
+ zi->ci.pos_zip64extrainfo = 0;
+
+ err = Write_LocalFileHeader(zi, filename, size_extrafield_local, extrafield_local);
+
+#ifdef HAVE_BZIP2
+ zi->ci.bstream.avail_in = (uInt)0;
+ zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.bstream.next_out = (char*)zi->ci.buffered_data;
+ zi->ci.bstream.total_in_hi32 = 0;
+ zi->ci.bstream.total_in_lo32 = 0;
+ zi->ci.bstream.total_out_hi32 = 0;
+ zi->ci.bstream.total_out_lo32 = 0;
+#endif
+
+ zi->ci.stream.avail_in = (uInt)0;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ zi->ci.stream.total_in = 0;
+ zi->ci.stream.total_out = 0;
+ zi->ci.stream.data_type = Z_BINARY;
+
+#ifdef HAVE_BZIP2
+ if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED || zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+#else
+ if ((err==ZIP_OK) && (zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+#endif
+ {
+ if(zi->ci.method == Z_DEFLATED)
+ {
+ zi->ci.stream.zalloc = (alloc_func)0;
+ zi->ci.stream.zfree = (free_func)0;
+ zi->ci.stream.opaque = (voidpf)0;
+
+ if (windowBits>0)
+ windowBits = -windowBits;
+
+ err = deflateInit2(&zi->ci.stream, level, Z_DEFLATED, windowBits, memLevel, strategy);
+
+ if (err==Z_OK)
+ zi->ci.stream_initialised = Z_DEFLATED;
+ }
+ else if(zi->ci.method == Z_BZIP2ED)
+ {
+#ifdef HAVE_BZIP2
+ // Init BZip stuff here
+ zi->ci.bstream.bzalloc = 0;
+ zi->ci.bstream.bzfree = 0;
+ zi->ci.bstream.opaque = (voidpf)0;
+
+ err = BZ2_bzCompressInit(&zi->ci.bstream, level, 0,35);
+ if(err == BZ_OK)
+ zi->ci.stream_initialised = Z_BZIP2ED;
+#endif
+ }
+
+ }
+
+# ifndef NOCRYPT
+ zi->ci.crypt_header_size = 0;
+ if ((err==Z_OK) && (password != NULL))
+ {
+ unsigned char bufHead[RAND_HEAD_LEN];
+ unsigned int sizeHead;
+ zi->ci.encrypt = 1;
+ zi->ci.pcrc_32_tab = get_crc_table();
+ /*init_keys(password,zi->ci.keys,zi->ci.pcrc_32_tab);*/
+
+ sizeHead=crypthead(password,bufHead,RAND_HEAD_LEN,zi->ci.keys,zi->ci.pcrc_32_tab,crcForCrypting);
+ zi->ci.crypt_header_size = sizeHead;
+
+ if (ZWRITE64(zi->z_filefunc,zi->filestream,bufHead,sizeHead) != sizeHead)
+ err = ZIP_ERRNO;
+ }
+# endif
+
+ if (err==Z_OK)
+ zi->in_opened_file_inzip = 1;
+ return err;
+}
+
+extern int ZEXPORT zipOpenNewFileInZip4 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void* extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level, int raw,
+ int windowBits,int memLevel, int strategy,
+ const char* password, uLong crcForCrypting,
+ uLong versionMadeBy, uLong flagBase)
+{
+ return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ windowBits, memLevel, strategy,
+ password, crcForCrypting, versionMadeBy, flagBase, 0);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip3 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void* extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level, int raw,
+ int windowBits,int memLevel, int strategy,
+ const char* password, uLong crcForCrypting)
+{
+ return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ windowBits, memLevel, strategy,
+ password, crcForCrypting, VERSIONMADEBY, 0, 0);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip3_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void* extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level, int raw,
+ int windowBits,int memLevel, int strategy,
+ const char* password, uLong crcForCrypting, int zip64)
+{
+ return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ windowBits, memLevel, strategy,
+ password, crcForCrypting, VERSIONMADEBY, 0, zip64);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip2(zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void* extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level, int raw)
+{
+ return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+ NULL, 0, VERSIONMADEBY, 0, 0);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip2_64(zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void* extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level, int raw, int zip64)
+{
+ return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, raw,
+ -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+ NULL, 0, VERSIONMADEBY, 0, zip64);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip64 (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void*extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level, int zip64)
+{
+ return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, 0,
+ -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+ NULL, 0, VERSIONMADEBY, 0, zip64);
+}
+
+extern int ZEXPORT zipOpenNewFileInZip (zipFile file, const char* filename, const zip_fileinfo* zipfi,
+ const void* extrafield_local, uInt size_extrafield_local,
+ const void*extrafield_global, uInt size_extrafield_global,
+ const char* comment, int method, int level)
+{
+ return zipOpenNewFileInZip4_64 (file, filename, zipfi,
+ extrafield_local, size_extrafield_local,
+ extrafield_global, size_extrafield_global,
+ comment, method, level, 0,
+ -MAX_WBITS, DEF_MEM_LEVEL, Z_DEFAULT_STRATEGY,
+ NULL, 0, VERSIONMADEBY, 0, 0);
+}
+
+local int zip64FlushWriteBuffer(zip64_internal* zi)
+{
+ int err=ZIP_OK;
+
+ if (zi->ci.encrypt != 0)
+ {
+#ifndef NOCRYPT
+ uInt i;
+ int t;
+ for (i=0;i<zi->ci.pos_in_buffered_data;i++)
+ zi->ci.buffered_data[i] = zencode(zi->ci.keys, zi->ci.pcrc_32_tab, zi->ci.buffered_data[i],t);
+#endif
+ }
+
+ if (ZWRITE64(zi->z_filefunc,zi->filestream,zi->ci.buffered_data,zi->ci.pos_in_buffered_data) != zi->ci.pos_in_buffered_data)
+ err = ZIP_ERRNO;
+
+ zi->ci.totalCompressedData += zi->ci.pos_in_buffered_data;
+
+#ifdef HAVE_BZIP2
+ if(zi->ci.method == Z_BZIP2ED)
+ {
+ zi->ci.totalUncompressedData += zi->ci.bstream.total_in_lo32;
+ zi->ci.bstream.total_in_lo32 = 0;
+ zi->ci.bstream.total_in_hi32 = 0;
+ }
+ else
+#endif
+ {
+ zi->ci.totalUncompressedData += zi->ci.stream.total_in;
+ zi->ci.stream.total_in = 0;
+ }
+
+
+ zi->ci.pos_in_buffered_data = 0;
+
+ return err;
+}
+
+extern int ZEXPORT zipWriteInFileInZip (zipFile file,const void* buf,unsigned int len)
+{
+ zip64_internal* zi;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip64_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+
+ zi->ci.crc32 = crc32(zi->ci.crc32,buf,(uInt)len);
+
+#ifdef HAVE_BZIP2
+ if(zi->ci.method == Z_BZIP2ED && (!zi->ci.raw))
+ {
+ zi->ci.bstream.next_in = (void*)buf;
+ zi->ci.bstream.avail_in = len;
+ err = BZ_RUN_OK;
+
+ while ((err==BZ_RUN_OK) && (zi->ci.bstream.avail_in>0))
+ {
+ if (zi->ci.bstream.avail_out == 0)
+ {
+ if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.bstream.next_out = (char*)zi->ci.buffered_data;
+ }
+
+
+ if(err != BZ_RUN_OK)
+ break;
+
+ if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+ {
+ uLong uTotalOutBefore_lo = zi->ci.bstream.total_out_lo32;
+// uLong uTotalOutBefore_hi = zi->ci.bstream.total_out_hi32;
+ err=BZ2_bzCompress(&zi->ci.bstream, BZ_RUN);
+
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore_lo) ;
+ }
+ }
+
+ if(err == BZ_RUN_OK)
+ err = ZIP_OK;
+ }
+ else
+#endif
+ {
+ zi->ci.stream.next_in = (Bytef*)buf;
+ zi->ci.stream.avail_in = len;
+
+ while ((err==ZIP_OK) && (zi->ci.stream.avail_in>0))
+ {
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+
+
+ if(err != ZIP_OK)
+ break;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ uLong uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_NO_FLUSH);
+ if(uTotalOutBefore > zi->ci.stream.total_out)
+ {
+ int bBreak = 0;
+ bBreak++;
+ }
+
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+ }
+ else
+ {
+ uInt copy_this,i;
+ if (zi->ci.stream.avail_in < zi->ci.stream.avail_out)
+ copy_this = zi->ci.stream.avail_in;
+ else
+ copy_this = zi->ci.stream.avail_out;
+
+ for (i = 0; i < copy_this; i++)
+ *(((char*)zi->ci.stream.next_out)+i) =
+ *(((const char*)zi->ci.stream.next_in)+i);
+ {
+ zi->ci.stream.avail_in -= copy_this;
+ zi->ci.stream.avail_out-= copy_this;
+ zi->ci.stream.next_in+= copy_this;
+ zi->ci.stream.next_out+= copy_this;
+ zi->ci.stream.total_in+= copy_this;
+ zi->ci.stream.total_out+= copy_this;
+ zi->ci.pos_in_buffered_data += copy_this;
+ }
+ }
+ }// while(...)
+ }
+
+ return err;
+}
+
+extern int ZEXPORT zipCloseFileInZipRaw (zipFile file, uLong uncompressed_size, uLong crc32)
+{
+ return zipCloseFileInZipRaw64 (file, uncompressed_size, crc32);
+}
+
+extern int ZEXPORT zipCloseFileInZipRaw64 (zipFile file, ZPOS64_T uncompressed_size, uLong crc32)
+{
+ zip64_internal* zi;
+ ZPOS64_T compressed_size;
+ uLong invalidValue = 0xffffffff;
+ short datasize = 0;
+ int err=ZIP_OK;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+ zi = (zip64_internal*)file;
+
+ if (zi->in_opened_file_inzip == 0)
+ return ZIP_PARAMERROR;
+ zi->ci.stream.avail_in = 0;
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ while (err==ZIP_OK)
+ {
+ uLong uTotalOutBefore;
+ if (zi->ci.stream.avail_out == 0)
+ {
+ if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.stream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.stream.next_out = zi->ci.buffered_data;
+ }
+ uTotalOutBefore = zi->ci.stream.total_out;
+ err=deflate(&zi->ci.stream, Z_FINISH);
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.stream.total_out - uTotalOutBefore) ;
+ }
+ }
+ else if ((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+ {
+#ifdef HAVE_BZIP2
+ err = BZ_FINISH_OK;
+ while (err==BZ_FINISH_OK)
+ {
+ uLong uTotalOutBefore;
+ if (zi->ci.bstream.avail_out == 0)
+ {
+ if (zip64FlushWriteBuffer(zi) == ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ zi->ci.bstream.avail_out = (uInt)Z_BUFSIZE;
+ zi->ci.bstream.next_out = (char*)zi->ci.buffered_data;
+ }
+ uTotalOutBefore = zi->ci.bstream.total_out_lo32;
+ err=BZ2_bzCompress(&zi->ci.bstream, BZ_FINISH);
+ if(err == BZ_STREAM_END)
+ err = Z_STREAM_END;
+
+ zi->ci.pos_in_buffered_data += (uInt)(zi->ci.bstream.total_out_lo32 - uTotalOutBefore);
+ }
+
+ if(err == BZ_FINISH_OK)
+ err = ZIP_OK;
+#endif
+ }
+
+ if (err==Z_STREAM_END)
+ err=ZIP_OK; /* this is normal */
+
+ if ((zi->ci.pos_in_buffered_data>0) && (err==ZIP_OK))
+ {
+ if (zip64FlushWriteBuffer(zi)==ZIP_ERRNO)
+ err = ZIP_ERRNO;
+ }
+
+ if ((zi->ci.method == Z_DEFLATED) && (!zi->ci.raw))
+ {
+ int tmp_err = deflateEnd(&zi->ci.stream);
+ if (err == ZIP_OK)
+ err = tmp_err;
+ zi->ci.stream_initialised = 0;
+ }
+#ifdef HAVE_BZIP2
+ else if((zi->ci.method == Z_BZIP2ED) && (!zi->ci.raw))
+ {
+ int tmperr = BZ2_bzCompressEnd(&zi->ci.bstream);
+ if (err==ZIP_OK)
+ err = tmperr;
+ zi->ci.stream_initialised = 0;
+ }
+#endif
+
+ if (!zi->ci.raw)
+ {
+ crc32 = (uLong)zi->ci.crc32;
+ uncompressed_size = zi->ci.totalUncompressedData;
+ }
+ compressed_size = zi->ci.totalCompressedData;
+
+# ifndef NOCRYPT
+ compressed_size += zi->ci.crypt_header_size;
+# endif
+
+ // update Current Item crc and sizes,
+ if(compressed_size >= 0xffffffff || uncompressed_size >= 0xffffffff || zi->ci.pos_local_header >= 0xffffffff)
+ {
+ /*version Made by*/
+ zip64local_putValue_inmemory(zi->ci.central_header+4,(uLong)45,2);
+ /*version needed*/
+ zip64local_putValue_inmemory(zi->ci.central_header+6,(uLong)45,2);
+
+ }
+
+ zip64local_putValue_inmemory(zi->ci.central_header+16,crc32,4); /*crc*/
+
+
+ if(compressed_size >= 0xffffffff)
+ zip64local_putValue_inmemory(zi->ci.central_header+20, invalidValue,4); /*compr size*/
+ else
+ zip64local_putValue_inmemory(zi->ci.central_header+20, compressed_size,4); /*compr size*/
+
+ /// set internal file attributes field
+ if (zi->ci.stream.data_type == Z_ASCII)
+ zip64local_putValue_inmemory(zi->ci.central_header+36,(uLong)Z_ASCII,2);
+
+ if(uncompressed_size >= 0xffffffff)
+ zip64local_putValue_inmemory(zi->ci.central_header+24, invalidValue,4); /*uncompr size*/
+ else
+ zip64local_putValue_inmemory(zi->ci.central_header+24, uncompressed_size,4); /*uncompr size*/
+
+ // Add ZIP64 extra info field for uncompressed size
+ if(uncompressed_size >= 0xffffffff)
+ datasize += 8;
+
+ // Add ZIP64 extra info field for compressed size
+ if(compressed_size >= 0xffffffff)
+ datasize += 8;
+
+ // Add ZIP64 extra info field for relative offset to local file header of current file
+ if(zi->ci.pos_local_header >= 0xffffffff)
+ datasize += 8;
+
+ if(datasize > 0)
+ {
+ char* p = NULL;
+
+ if((uLong)(datasize + 4) > zi->ci.size_centralExtraFree)
+ {
+ // we can not write more data to the buffer that we have room for.
+ return ZIP_BADZIPFILE;
+ }
+
+ p = zi->ci.central_header + zi->ci.size_centralheader;
+
+ // Add Extra Information Header for 'ZIP64 information'
+ zip64local_putValue_inmemory(p, 0x0001, 2); // HeaderID
+ p += 2;
+ zip64local_putValue_inmemory(p, datasize, 2); // DataSize
+ p += 2;
+
+ if(uncompressed_size >= 0xffffffff)
+ {
+ zip64local_putValue_inmemory(p, uncompressed_size, 8);
+ p += 8;
+ }
+
+ if(compressed_size >= 0xffffffff)
+ {
+ zip64local_putValue_inmemory(p, compressed_size, 8);
+ p += 8;
+ }
+
+ if(zi->ci.pos_local_header >= 0xffffffff)
+ {
+ zip64local_putValue_inmemory(p, zi->ci.pos_local_header, 8);
+ p += 8;
+ }
+
+ // Update how much extra free space we got in the memory buffer
+ // and increase the centralheader size so the new ZIP64 fields are included
+ // ( 4 below is the size of HeaderID and DataSize field )
+ zi->ci.size_centralExtraFree -= datasize + 4;
+ zi->ci.size_centralheader += datasize + 4;
+
+ // Update the extra info size field
+ zi->ci.size_centralExtra += datasize + 4;
+ zip64local_putValue_inmemory(zi->ci.central_header+30,(uLong)zi->ci.size_centralExtra,2);
+ }
+
+ if (err==ZIP_OK)
+ err = add_data_in_datablock(&zi->central_dir, zi->ci.central_header, (uLong)zi->ci.size_centralheader);
+
+ free(zi->ci.central_header);
+
+ if (err==ZIP_OK)
+ {
+ // Update the LocalFileHeader with the new values.
+
+ ZPOS64_T cur_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream);
+
+ if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_local_header + 14,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+
+ if (err==ZIP_OK)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,crc32,4); /* crc 32, unknown */
+
+ if(uncompressed_size >= 0xffffffff || compressed_size >= 0xffffffff )
+ {
+ if(zi->ci.pos_zip64extrainfo > 0)
+ {
+ // Update the size in the ZIP64 extended field.
+ if (ZSEEK64(zi->z_filefunc,zi->filestream, zi->ci.pos_zip64extrainfo + 4,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+
+ if (err==ZIP_OK) /* compressed size, unknown */
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, uncompressed_size, 8);
+
+ if (err==ZIP_OK) /* uncompressed size, unknown */
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, compressed_size, 8);
+ }
+ else
+ err = ZIP_BADZIPFILE; // Caller passed zip64 = 0, so no room for zip64 info -> fatal
+ }
+ else
+ {
+ if (err==ZIP_OK) /* compressed size, unknown */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,compressed_size,4);
+
+ if (err==ZIP_OK) /* uncompressed size, unknown */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,uncompressed_size,4);
+ }
+
+ if (ZSEEK64(zi->z_filefunc,zi->filestream, cur_pos_inzip,ZLIB_FILEFUNC_SEEK_SET)!=0)
+ err = ZIP_ERRNO;
+ }
+
+ zi->number_entry ++;
+ zi->in_opened_file_inzip = 0;
+
+ return err;
+}
+
+extern int ZEXPORT zipCloseFileInZip (zipFile file)
+{
+ return zipCloseFileInZipRaw (file,0,0);
+}
+
+int Write_Zip64EndOfCentralDirectoryLocator(zip64_internal* zi, ZPOS64_T zip64eocd_pos_inzip)
+{
+ int err = ZIP_OK;
+ ZPOS64_T pos = zip64eocd_pos_inzip - zi->add_position_when_writing_offset;
+
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDLOCHEADERMAGIC,4);
+
+ /*num disks*/
+ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
+
+ /*relative offset*/
+ if (err==ZIP_OK) /* Relative offset to the Zip64EndOfCentralDirectory */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream, pos,8);
+
+ /*total disks*/ /* Do not support spawning of disk so always say 1 here*/
+ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)1,4);
+
+ return err;
+}
+
+int Write_Zip64EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
+{
+ int err = ZIP_OK;
+
+ uLong Zip64DataSize = 44;
+
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ZIP64ENDHEADERMAGIC,4);
+
+ if (err==ZIP_OK) /* size of this 'zip64 end of central directory' */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)Zip64DataSize,8); // why ZPOS64_T of this ?
+
+ if (err==ZIP_OK) /* version made by */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);
+
+ if (err==ZIP_OK) /* version needed */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)45,2);
+
+ if (err==ZIP_OK) /* number of this disk */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
+
+ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,4);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir */
+ err = zip64local_putValue(&zi->z_filefunc, zi->filestream, zi->number_entry, 8);
+
+ if (err==ZIP_OK) /* size of the central directory */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(ZPOS64_T)size_centraldir,8);
+
+ if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */
+ {
+ ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (ZPOS64_T)pos,8);
+ }
+ return err;
+}
+int Write_EndOfCentralDirectoryRecord(zip64_internal* zi, uLong size_centraldir, ZPOS64_T centraldir_pos_inzip)
+{
+ int err = ZIP_OK;
+
+ /*signature*/
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)ENDHEADERMAGIC,4);
+
+ if (err==ZIP_OK) /* number of this disk */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+ if (err==ZIP_OK) /* number of the disk with the start of the central directory */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0,2);
+
+ if (err==ZIP_OK) /* total number of entries in the central dir on this disk */
+ {
+ {
+ if(zi->number_entry >= 0xFFFF)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record
+ else
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+ }
+ }
+
+ if (err==ZIP_OK) /* total number of entries in the central dir */
+ {
+ if(zi->number_entry >= 0xFFFF)
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)0xffff,2); // use value in ZIP64 record
+ else
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)zi->number_entry,2);
+ }
+
+ if (err==ZIP_OK) /* size of the central directory */
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_centraldir,4);
+
+ if (err==ZIP_OK) /* offset of start of central directory with respect to the starting disk number */
+ {
+ ZPOS64_T pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
+ if(pos >= 0xffffffff)
+ {
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)0xffffffff,4);
+ }
+ else
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream, (uLong)(centraldir_pos_inzip - zi->add_position_when_writing_offset),4);
+ }
+
+ return err;
+}
+
+int Write_GlobalComment(zip64_internal* zi, const char* global_comment)
+{
+ int err = ZIP_OK;
+ uInt size_global_comment = 0;
+
+ if(global_comment != NULL)
+ size_global_comment = (uInt)strlen(global_comment);
+
+ err = zip64local_putValue(&zi->z_filefunc,zi->filestream,(uLong)size_global_comment,2);
+
+ if (err == ZIP_OK && size_global_comment > 0)
+ {
+ if (ZWRITE64(zi->z_filefunc,zi->filestream, global_comment, size_global_comment) != size_global_comment)
+ err = ZIP_ERRNO;
+ }
+ return err;
+}
+
+extern int ZEXPORT zipClose (zipFile file, const char* global_comment)
+{
+ zip64_internal* zi;
+ int err = 0;
+ uLong size_centraldir = 0;
+ ZPOS64_T centraldir_pos_inzip;
+ ZPOS64_T pos;
+
+ if (file == NULL)
+ return ZIP_PARAMERROR;
+
+ zi = (zip64_internal*)file;
+
+ if (zi->in_opened_file_inzip == 1)
+ {
+ err = zipCloseFileInZip (file);
+ }
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+ if (global_comment==NULL)
+ global_comment = zi->globalcomment;
+#endif
+
+ centraldir_pos_inzip = ZTELL64(zi->z_filefunc,zi->filestream);
+
+ if (err==ZIP_OK)
+ {
+ linkedlist_datablock_internal* ldi = zi->central_dir.first_block;
+ while (ldi!=NULL)
+ {
+ if ((err==ZIP_OK) && (ldi->filled_in_this_block>0))
+ {
+ if (ZWRITE64(zi->z_filefunc,zi->filestream, ldi->data, ldi->filled_in_this_block) != ldi->filled_in_this_block)
+ err = ZIP_ERRNO;
+ }
+
+ size_centraldir += ldi->filled_in_this_block;
+ ldi = ldi->next_datablock;
+ }
+ }
+ free_linkedlist(&(zi->central_dir));
+
+ pos = centraldir_pos_inzip - zi->add_position_when_writing_offset;
+ if(pos >= 0xffffffff || zi->number_entry > 0xFFFF)
+ {
+ ZPOS64_T Zip64EOCDpos = ZTELL64(zi->z_filefunc,zi->filestream);
+ Write_Zip64EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip);
+
+ Write_Zip64EndOfCentralDirectoryLocator(zi, Zip64EOCDpos);
+ }
+
+ if (err==ZIP_OK)
+ err = Write_EndOfCentralDirectoryRecord(zi, size_centraldir, centraldir_pos_inzip);
+
+ if(err == ZIP_OK)
+ err = Write_GlobalComment(zi, global_comment);
+
+ if (ZCLOSE64(zi->z_filefunc,zi->filestream) != 0)
+ if (err == ZIP_OK)
+ err = ZIP_ERRNO;
+
+#ifndef NO_ADDFILEINEXISTINGZIP
+ TRYFREE(zi->globalcomment);
+#endif
+ TRYFREE(zi);
+
+ return err;
+}
+
+extern int ZEXPORT zipRemoveExtraInfoBlock (char* pData, int* dataLen, short sHeader)
+{
+ char* p = pData;
+ int size = 0;
+ char* pNewHeader;
+ char* pTmp;
+ short header;
+ short dataSize;
+
+ int retVal = ZIP_OK;
+
+ if(pData == NULL || *dataLen < 4)
+ return ZIP_PARAMERROR;
+
+ pNewHeader = (char*)ALLOC(*dataLen);
+ pTmp = pNewHeader;
+
+ while(p < (pData + *dataLen))
+ {
+ header = *(short*)p;
+ dataSize = *(((short*)p)+1);
+
+ if( header == sHeader ) // Header found.
+ {
+ p += dataSize + 4; // skip it. do not copy to temp buffer
+ }
+ else
+ {
+ // Extra Info block should not be removed, So copy it to the temp buffer.
+ memcpy(pTmp, p, dataSize + 4);
+ p += dataSize + 4;
+ size += dataSize + 4;
+ }
+
+ }
+
+ if(size < *dataLen)
+ {
+ // clean old extra info block.
+ memset(pData,0, *dataLen);
+
+ // copy the new extra info block over the old
+ if(size > 0)
+ memcpy(pData, pNewHeader, size);
+
+ // set the new extra info size
+ *dataLen = size;
+
+ retVal = ZIP_OK;
+ }
+ else
+ retVal = ZIP_ERRNO;
+
+ TRYFREE(pNewHeader);
+
+ return retVal;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.h
new file mode 100644
index 000000000..8aaebb623
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/minizip/zip.h
@@ -0,0 +1,362 @@
+/* zip.h -- IO on .zip files using zlib
+ Version 1.1, February 14h, 2010
+ part of the MiniZip project - ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Copyright (C) 1998-2010 Gilles Vollant (minizip) ( http://www.winimage.com/zLibDll/minizip.html )
+
+ Modifications for Zip64 support
+ Copyright (C) 2009-2010 Mathias Svensson ( http://result42.com )
+
+ For more info read MiniZip_info.txt
+
+ ---------------------------------------------------------------------------
+
+ Condition of use and distribution are the same than zlib :
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ ---------------------------------------------------------------------------
+
+ Changes
+
+ See header of zip.h
+
+*/
+
+#ifndef _zip12_H
+#define _zip12_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+//#define HAVE_BZIP2
+
+#ifndef _ZLIB_H
+#include "zlib.h"
+#endif
+
+#ifndef _ZLIBIOAPI_H
+#include "ioapi.h"
+#endif
+
+#ifdef HAVE_BZIP2
+#include "bzlib.h"
+#endif
+
+#define Z_BZIP2ED 12
+
+#if defined(STRICTZIP) || defined(STRICTZIPUNZIP)
+/* like the STRICT of WIN32, we define a pointer that cannot be converted
+ from (void*) without cast */
+typedef struct TagzipFile__ { int unused; } zipFile__;
+typedef zipFile__ *zipFile;
+#else
+typedef voidp zipFile;
+#endif
+
+#define ZIP_OK (0)
+#define ZIP_EOF (0)
+#define ZIP_ERRNO (Z_ERRNO)
+#define ZIP_PARAMERROR (-102)
+#define ZIP_BADZIPFILE (-103)
+#define ZIP_INTERNALERROR (-104)
+
+#ifndef DEF_MEM_LEVEL
+# if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+# else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+# endif
+#endif
+/* default memLevel */
+
+/* tm_zip contain date/time info */
+typedef struct tm_zip_s
+{
+ uInt tm_sec; /* seconds after the minute - [0,59] */
+ uInt tm_min; /* minutes after the hour - [0,59] */
+ uInt tm_hour; /* hours since midnight - [0,23] */
+ uInt tm_mday; /* day of the month - [1,31] */
+ uInt tm_mon; /* months since January - [0,11] */
+ uInt tm_year; /* years - [1980..2044] */
+} tm_zip;
+
+typedef struct
+{
+ tm_zip tmz_date; /* date in understandable format */
+ uLong dosDate; /* if dos_date == 0, tmu_date is used */
+/* uLong flag; */ /* general purpose bit flag 2 bytes */
+
+ uLong internal_fa; /* internal file attributes 2 bytes */
+ uLong external_fa; /* external file attributes 4 bytes */
+} zip_fileinfo;
+
+typedef const char* zipcharpc;
+
+
+#define APPEND_STATUS_CREATE (0)
+#define APPEND_STATUS_CREATEAFTER (1)
+#define APPEND_STATUS_ADDINZIP (2)
+
+extern zipFile ZEXPORT zipOpen OF((const char *pathname, int append));
+extern zipFile ZEXPORT zipOpen64 OF((const void *pathname, int append));
+/*
+ Create a zipfile.
+ pathname contain on Windows XP a filename like "c:\\zlib\\zlib113.zip" or on
+ an Unix computer "zlib/zlib113.zip".
+ if the file pathname exist and append==APPEND_STATUS_CREATEAFTER, the zip
+ will be created at the end of the file.
+ (useful if the file contain a self extractor code)
+ if the file pathname exist and append==APPEND_STATUS_ADDINZIP, we will
+ add files in existing zip (be sure you don't add file that doesn't exist)
+ If the zipfile cannot be opened, the return value is NULL.
+ Else, the return value is a zipFile Handle, usable with other function
+ of this zip package.
+*/
+
+/* Note : there is no delete function into a zipfile.
+ If you want delete file into a zipfile, you must open a zipfile, and create another
+ Of couse, you can use RAW reading and writing to copy the file you did not want delte
+*/
+
+extern zipFile ZEXPORT zipOpen2 OF((const char *pathname,
+ int append,
+ zipcharpc* globalcomment,
+ zlib_filefunc_def* pzlib_filefunc_def));
+
+extern zipFile ZEXPORT zipOpen2_64 OF((const void *pathname,
+ int append,
+ zipcharpc* globalcomment,
+ zlib_filefunc64_def* pzlib_filefunc_def));
+
+extern int ZEXPORT zipOpenNewFileInZip OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level));
+
+extern int ZEXPORT zipOpenNewFileInZip64 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int zip64));
+
+/*
+ Open a file in the ZIP for writing.
+ filename : the filename in zip (if NULL, '-' without quote will be used
+ *zipfi contain supplemental information
+ if extrafield_local!=NULL and size_extrafield_local>0, extrafield_local
+ contains the extrafield data the the local header
+ if extrafield_global!=NULL and size_extrafield_global>0, extrafield_global
+ contains the extrafield data the the local header
+ if comment != NULL, comment contain the comment string
+ method contain the compression method (0 for store, Z_DEFLATED for deflate)
+ level contain the level of compression (can be Z_DEFAULT_COMPRESSION)
+ zip64 is set to 1 if a zip64 extended information block should be added to the local file header.
+ this MUST be '1' if the uncompressed size is >= 0xffffffff.
+
+*/
+
+
+extern int ZEXPORT zipOpenNewFileInZip2 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw));
+
+
+extern int ZEXPORT zipOpenNewFileInZip2_64 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw,
+ int zip64));
+/*
+ Same than zipOpenNewFileInZip, except if raw=1, we write raw file
+ */
+
+extern int ZEXPORT zipOpenNewFileInZip3 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw,
+ int windowBits,
+ int memLevel,
+ int strategy,
+ const char* password,
+ uLong crcForCrypting));
+
+extern int ZEXPORT zipOpenNewFileInZip3_64 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw,
+ int windowBits,
+ int memLevel,
+ int strategy,
+ const char* password,
+ uLong crcForCrypting,
+ int zip64
+ ));
+
+/*
+ Same than zipOpenNewFileInZip2, except
+ windowBits,memLevel,,strategy : see parameter strategy in deflateInit2
+ password : crypting password (NULL for no crypting)
+ crcForCrypting : crc of file to compress (needed for crypting)
+ */
+
+extern int ZEXPORT zipOpenNewFileInZip4 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw,
+ int windowBits,
+ int memLevel,
+ int strategy,
+ const char* password,
+ uLong crcForCrypting,
+ uLong versionMadeBy,
+ uLong flagBase
+ ));
+
+
+extern int ZEXPORT zipOpenNewFileInZip4_64 OF((zipFile file,
+ const char* filename,
+ const zip_fileinfo* zipfi,
+ const void* extrafield_local,
+ uInt size_extrafield_local,
+ const void* extrafield_global,
+ uInt size_extrafield_global,
+ const char* comment,
+ int method,
+ int level,
+ int raw,
+ int windowBits,
+ int memLevel,
+ int strategy,
+ const char* password,
+ uLong crcForCrypting,
+ uLong versionMadeBy,
+ uLong flagBase,
+ int zip64
+ ));
+/*
+ Same than zipOpenNewFileInZip4, except
+ versionMadeBy : value for Version made by field
+ flag : value for flag field (compression level info will be added)
+ */
+
+
+extern int ZEXPORT zipWriteInFileInZip OF((zipFile file,
+ const void* buf,
+ unsigned len));
+/*
+ Write data in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZip OF((zipFile file));
+/*
+ Close the current file in the zipfile
+*/
+
+extern int ZEXPORT zipCloseFileInZipRaw OF((zipFile file,
+ uLong uncompressed_size,
+ uLong crc32));
+
+extern int ZEXPORT zipCloseFileInZipRaw64 OF((zipFile file,
+ ZPOS64_T uncompressed_size,
+ uLong crc32));
+
+/*
+ Close the current file in the zipfile, for file opened with
+ parameter raw=1 in zipOpenNewFileInZip2
+ uncompressed_size and crc32 are value for the uncompressed size
+*/
+
+extern int ZEXPORT zipClose OF((zipFile file,
+ const char* global_comment));
+/*
+ Close the zipfile
+*/
+
+
+extern int ZEXPORT zipRemoveExtraInfoBlock OF((char* pData, int* dataLen, short sHeader));
+/*
+ zipRemoveExtraInfoBlock - Added by Mathias Svensson
+
+ Remove extra information block from a extra information data for the local file header or central directory header
+
+ It is needed to remove ZIP64 extra information blocks when before data is written if using RAW mode.
+
+ 0x0001 is the signature header for the ZIP64 extra information blocks
+
+ usage.
+ Remove ZIP64 Extra information from a central director extra field data
+ zipRemoveExtraInfoBlock(pCenDirExtraFieldData, &nCenDirExtraFieldDataLen, 0x0001);
+
+ Remove ZIP64 Extra information from a Local File Header extra field data
+ zipRemoveExtraInfoBlock(pLocalHeaderExtraFieldData, &nLocalHeaderExtraFieldDataLen, 0x0001);
+*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _zip64_H */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/example.pas b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/example.pas
new file mode 100644
index 000000000..5518b36a7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/example.pas
@@ -0,0 +1,599 @@
+(* example.c -- usage example of the zlib compression library
+ * Copyright (C) 1995-2003 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Pascal translation
+ * Copyright (C) 1998 by Jacques Nomssi Nzali.
+ * For conditions of distribution and use, see copyright notice in readme.txt
+ *
+ * Adaptation to the zlibpas interface
+ * Copyright (C) 2003 by Cosmin Truta.
+ * For conditions of distribution and use, see copyright notice in readme.txt
+ *)
+
+program example;
+
+{$DEFINE TEST_COMPRESS}
+{DO NOT $DEFINE TEST_GZIO}
+{$DEFINE TEST_DEFLATE}
+{$DEFINE TEST_INFLATE}
+{$DEFINE TEST_FLUSH}
+{$DEFINE TEST_SYNC}
+{$DEFINE TEST_DICT}
+
+uses SysUtils, zlibpas;
+
+const TESTFILE = 'foo.gz';
+
+(* "hello world" would be more standard, but the repeated "hello"
+ * stresses the compression code better, sorry...
+ *)
+const hello: PChar = 'hello, hello!';
+
+const dictionary: PChar = 'hello';
+
+var dictId: LongInt; (* Adler32 value of the dictionary *)
+
+procedure CHECK_ERR(err: Integer; msg: String);
+begin
+ if err <> Z_OK then
+ begin
+ WriteLn(msg, ' error: ', err);
+ Halt(1);
+ end;
+end;
+
+procedure EXIT_ERR(const msg: String);
+begin
+ WriteLn('Error: ', msg);
+ Halt(1);
+end;
+
+(* ===========================================================================
+ * Test compress and uncompress
+ *)
+{$IFDEF TEST_COMPRESS}
+procedure test_compress(compr: Pointer; comprLen: LongInt;
+ uncompr: Pointer; uncomprLen: LongInt);
+var err: Integer;
+ len: LongInt;
+begin
+ len := StrLen(hello)+1;
+
+ err := compress(compr, comprLen, hello, len);
+ CHECK_ERR(err, 'compress');
+
+ StrCopy(PChar(uncompr), 'garbage');
+
+ err := uncompress(uncompr, uncomprLen, compr, comprLen);
+ CHECK_ERR(err, 'uncompress');
+
+ if StrComp(PChar(uncompr), hello) <> 0 then
+ EXIT_ERR('bad uncompress')
+ else
+ WriteLn('uncompress(): ', PChar(uncompr));
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test read/write of .gz files
+ *)
+{$IFDEF TEST_GZIO}
+procedure test_gzio(const fname: PChar; (* compressed file name *)
+ uncompr: Pointer;
+ uncomprLen: LongInt);
+var err: Integer;
+ len: Integer;
+ zfile: gzFile;
+ pos: LongInt;
+begin
+ len := StrLen(hello)+1;
+
+ zfile := gzopen(fname, 'wb');
+ if zfile = NIL then
+ begin
+ WriteLn('gzopen error');
+ Halt(1);
+ end;
+ gzputc(zfile, 'h');
+ if gzputs(zfile, 'ello') <> 4 then
+ begin
+ WriteLn('gzputs err: ', gzerror(zfile, err));
+ Halt(1);
+ end;
+ {$IFDEF GZ_FORMAT_STRING}
+ if gzprintf(zfile, ', %s!', 'hello') <> 8 then
+ begin
+ WriteLn('gzprintf err: ', gzerror(zfile, err));
+ Halt(1);
+ end;
+ {$ELSE}
+ if gzputs(zfile, ', hello!') <> 8 then
+ begin
+ WriteLn('gzputs err: ', gzerror(zfile, err));
+ Halt(1);
+ end;
+ {$ENDIF}
+ gzseek(zfile, 1, SEEK_CUR); (* add one zero byte *)
+ gzclose(zfile);
+
+ zfile := gzopen(fname, 'rb');
+ if zfile = NIL then
+ begin
+ WriteLn('gzopen error');
+ Halt(1);
+ end;
+
+ StrCopy(PChar(uncompr), 'garbage');
+
+ if gzread(zfile, uncompr, uncomprLen) <> len then
+ begin
+ WriteLn('gzread err: ', gzerror(zfile, err));
+ Halt(1);
+ end;
+ if StrComp(PChar(uncompr), hello) <> 0 then
+ begin
+ WriteLn('bad gzread: ', PChar(uncompr));
+ Halt(1);
+ end
+ else
+ WriteLn('gzread(): ', PChar(uncompr));
+
+ pos := gzseek(zfile, -8, SEEK_CUR);
+ if (pos <> 6) or (gztell(zfile) <> pos) then
+ begin
+ WriteLn('gzseek error, pos=', pos, ', gztell=', gztell(zfile));
+ Halt(1);
+ end;
+
+ if gzgetc(zfile) <> ' ' then
+ begin
+ WriteLn('gzgetc error');
+ Halt(1);
+ end;
+
+ if gzungetc(' ', zfile) <> ' ' then
+ begin
+ WriteLn('gzungetc error');
+ Halt(1);
+ end;
+
+ gzgets(zfile, PChar(uncompr), uncomprLen);
+ uncomprLen := StrLen(PChar(uncompr));
+ if uncomprLen <> 7 then (* " hello!" *)
+ begin
+ WriteLn('gzgets err after gzseek: ', gzerror(zfile, err));
+ Halt(1);
+ end;
+ if StrComp(PChar(uncompr), hello + 6) <> 0 then
+ begin
+ WriteLn('bad gzgets after gzseek');
+ Halt(1);
+ end
+ else
+ WriteLn('gzgets() after gzseek: ', PChar(uncompr));
+
+ gzclose(zfile);
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with small buffers
+ *)
+{$IFDEF TEST_DEFLATE}
+procedure test_deflate(compr: Pointer; comprLen: LongInt);
+var c_stream: z_stream; (* compression stream *)
+ err: Integer;
+ len: LongInt;
+begin
+ len := StrLen(hello)+1;
+
+ c_stream.zalloc := NIL;
+ c_stream.zfree := NIL;
+ c_stream.opaque := NIL;
+
+ err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
+ CHECK_ERR(err, 'deflateInit');
+
+ c_stream.next_in := hello;
+ c_stream.next_out := compr;
+
+ while (c_stream.total_in <> len) and
+ (c_stream.total_out < comprLen) do
+ begin
+ c_stream.avail_out := 1; { force small buffers }
+ c_stream.avail_in := 1;
+ err := deflate(c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, 'deflate');
+ end;
+
+ (* Finish the stream, still forcing small buffers: *)
+ while TRUE do
+ begin
+ c_stream.avail_out := 1;
+ err := deflate(c_stream, Z_FINISH);
+ if err = Z_STREAM_END then
+ break;
+ CHECK_ERR(err, 'deflate');
+ end;
+
+ err := deflateEnd(c_stream);
+ CHECK_ERR(err, 'deflateEnd');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflate with small buffers
+ *)
+{$IFDEF TEST_INFLATE}
+procedure test_inflate(compr: Pointer; comprLen : LongInt;
+ uncompr: Pointer; uncomprLen : LongInt);
+var err: Integer;
+ d_stream: z_stream; (* decompression stream *)
+begin
+ StrCopy(PChar(uncompr), 'garbage');
+
+ d_stream.zalloc := NIL;
+ d_stream.zfree := NIL;
+ d_stream.opaque := NIL;
+
+ d_stream.next_in := compr;
+ d_stream.avail_in := 0;
+ d_stream.next_out := uncompr;
+
+ err := inflateInit(d_stream);
+ CHECK_ERR(err, 'inflateInit');
+
+ while (d_stream.total_out < uncomprLen) and
+ (d_stream.total_in < comprLen) do
+ begin
+ d_stream.avail_out := 1; (* force small buffers *)
+ d_stream.avail_in := 1;
+ err := inflate(d_stream, Z_NO_FLUSH);
+ if err = Z_STREAM_END then
+ break;
+ CHECK_ERR(err, 'inflate');
+ end;
+
+ err := inflateEnd(d_stream);
+ CHECK_ERR(err, 'inflateEnd');
+
+ if StrComp(PChar(uncompr), hello) <> 0 then
+ EXIT_ERR('bad inflate')
+ else
+ WriteLn('inflate(): ', PChar(uncompr));
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with large buffers and dynamic change of compression level
+ *)
+{$IFDEF TEST_DEFLATE}
+procedure test_large_deflate(compr: Pointer; comprLen: LongInt;
+ uncompr: Pointer; uncomprLen: LongInt);
+var c_stream: z_stream; (* compression stream *)
+ err: Integer;
+begin
+ c_stream.zalloc := NIL;
+ c_stream.zfree := NIL;
+ c_stream.opaque := NIL;
+
+ err := deflateInit(c_stream, Z_BEST_SPEED);
+ CHECK_ERR(err, 'deflateInit');
+
+ c_stream.next_out := compr;
+ c_stream.avail_out := Integer(comprLen);
+
+ (* At this point, uncompr is still mostly zeroes, so it should compress
+ * very well:
+ *)
+ c_stream.next_in := uncompr;
+ c_stream.avail_in := Integer(uncomprLen);
+ err := deflate(c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, 'deflate');
+ if c_stream.avail_in <> 0 then
+ EXIT_ERR('deflate not greedy');
+
+ (* Feed in already compressed data and switch to no compression: *)
+ deflateParams(c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
+ c_stream.next_in := compr;
+ c_stream.avail_in := Integer(comprLen div 2);
+ err := deflate(c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, 'deflate');
+
+ (* Switch back to compressing mode: *)
+ deflateParams(c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
+ c_stream.next_in := uncompr;
+ c_stream.avail_in := Integer(uncomprLen);
+ err := deflate(c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, 'deflate');
+
+ err := deflate(c_stream, Z_FINISH);
+ if err <> Z_STREAM_END then
+ EXIT_ERR('deflate should report Z_STREAM_END');
+
+ err := deflateEnd(c_stream);
+ CHECK_ERR(err, 'deflateEnd');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflate with large buffers
+ *)
+{$IFDEF TEST_INFLATE}
+procedure test_large_inflate(compr: Pointer; comprLen: LongInt;
+ uncompr: Pointer; uncomprLen: LongInt);
+var err: Integer;
+ d_stream: z_stream; (* decompression stream *)
+begin
+ StrCopy(PChar(uncompr), 'garbage');
+
+ d_stream.zalloc := NIL;
+ d_stream.zfree := NIL;
+ d_stream.opaque := NIL;
+
+ d_stream.next_in := compr;
+ d_stream.avail_in := Integer(comprLen);
+
+ err := inflateInit(d_stream);
+ CHECK_ERR(err, 'inflateInit');
+
+ while TRUE do
+ begin
+ d_stream.next_out := uncompr; (* discard the output *)
+ d_stream.avail_out := Integer(uncomprLen);
+ err := inflate(d_stream, Z_NO_FLUSH);
+ if err = Z_STREAM_END then
+ break;
+ CHECK_ERR(err, 'large inflate');
+ end;
+
+ err := inflateEnd(d_stream);
+ CHECK_ERR(err, 'inflateEnd');
+
+ if d_stream.total_out <> 2 * uncomprLen + comprLen div 2 then
+ begin
+ WriteLn('bad large inflate: ', d_stream.total_out);
+ Halt(1);
+ end
+ else
+ WriteLn('large_inflate(): OK');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with full flush
+ *)
+{$IFDEF TEST_FLUSH}
+procedure test_flush(compr: Pointer; var comprLen : LongInt);
+var c_stream: z_stream; (* compression stream *)
+ err: Integer;
+ len: Integer;
+begin
+ len := StrLen(hello)+1;
+
+ c_stream.zalloc := NIL;
+ c_stream.zfree := NIL;
+ c_stream.opaque := NIL;
+
+ err := deflateInit(c_stream, Z_DEFAULT_COMPRESSION);
+ CHECK_ERR(err, 'deflateInit');
+
+ c_stream.next_in := hello;
+ c_stream.next_out := compr;
+ c_stream.avail_in := 3;
+ c_stream.avail_out := Integer(comprLen);
+ err := deflate(c_stream, Z_FULL_FLUSH);
+ CHECK_ERR(err, 'deflate');
+
+ Inc(PByteArray(compr)^[3]); (* force an error in first compressed block *)
+ c_stream.avail_in := len - 3;
+
+ err := deflate(c_stream, Z_FINISH);
+ if err <> Z_STREAM_END then
+ CHECK_ERR(err, 'deflate');
+
+ err := deflateEnd(c_stream);
+ CHECK_ERR(err, 'deflateEnd');
+
+ comprLen := c_stream.total_out;
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflateSync()
+ *)
+{$IFDEF TEST_SYNC}
+procedure test_sync(compr: Pointer; comprLen: LongInt;
+ uncompr: Pointer; uncomprLen : LongInt);
+var err: Integer;
+ d_stream: z_stream; (* decompression stream *)
+begin
+ StrCopy(PChar(uncompr), 'garbage');
+
+ d_stream.zalloc := NIL;
+ d_stream.zfree := NIL;
+ d_stream.opaque := NIL;
+
+ d_stream.next_in := compr;
+ d_stream.avail_in := 2; (* just read the zlib header *)
+
+ err := inflateInit(d_stream);
+ CHECK_ERR(err, 'inflateInit');
+
+ d_stream.next_out := uncompr;
+ d_stream.avail_out := Integer(uncomprLen);
+
+ inflate(d_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, 'inflate');
+
+ d_stream.avail_in := Integer(comprLen-2); (* read all compressed data *)
+ err := inflateSync(d_stream); (* but skip the damaged part *)
+ CHECK_ERR(err, 'inflateSync');
+
+ err := inflate(d_stream, Z_FINISH);
+ if err <> Z_DATA_ERROR then
+ EXIT_ERR('inflate should report DATA_ERROR');
+ (* Because of incorrect adler32 *)
+
+ err := inflateEnd(d_stream);
+ CHECK_ERR(err, 'inflateEnd');
+
+ WriteLn('after inflateSync(): hel', PChar(uncompr));
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test deflate with preset dictionary
+ *)
+{$IFDEF TEST_DICT}
+procedure test_dict_deflate(compr: Pointer; comprLen: LongInt);
+var c_stream: z_stream; (* compression stream *)
+ err: Integer;
+begin
+ c_stream.zalloc := NIL;
+ c_stream.zfree := NIL;
+ c_stream.opaque := NIL;
+
+ err := deflateInit(c_stream, Z_BEST_COMPRESSION);
+ CHECK_ERR(err, 'deflateInit');
+
+ err := deflateSetDictionary(c_stream, dictionary, StrLen(dictionary));
+ CHECK_ERR(err, 'deflateSetDictionary');
+
+ dictId := c_stream.adler;
+ c_stream.next_out := compr;
+ c_stream.avail_out := Integer(comprLen);
+
+ c_stream.next_in := hello;
+ c_stream.avail_in := StrLen(hello)+1;
+
+ err := deflate(c_stream, Z_FINISH);
+ if err <> Z_STREAM_END then
+ EXIT_ERR('deflate should report Z_STREAM_END');
+
+ err := deflateEnd(c_stream);
+ CHECK_ERR(err, 'deflateEnd');
+end;
+{$ENDIF}
+
+(* ===========================================================================
+ * Test inflate with a preset dictionary
+ *)
+{$IFDEF TEST_DICT}
+procedure test_dict_inflate(compr: Pointer; comprLen: LongInt;
+ uncompr: Pointer; uncomprLen: LongInt);
+var err: Integer;
+ d_stream: z_stream; (* decompression stream *)
+begin
+ StrCopy(PChar(uncompr), 'garbage');
+
+ d_stream.zalloc := NIL;
+ d_stream.zfree := NIL;
+ d_stream.opaque := NIL;
+
+ d_stream.next_in := compr;
+ d_stream.avail_in := Integer(comprLen);
+
+ err := inflateInit(d_stream);
+ CHECK_ERR(err, 'inflateInit');
+
+ d_stream.next_out := uncompr;
+ d_stream.avail_out := Integer(uncomprLen);
+
+ while TRUE do
+ begin
+ err := inflate(d_stream, Z_NO_FLUSH);
+ if err = Z_STREAM_END then
+ break;
+ if err = Z_NEED_DICT then
+ begin
+ if d_stream.adler <> dictId then
+ EXIT_ERR('unexpected dictionary');
+ err := inflateSetDictionary(d_stream, dictionary, StrLen(dictionary));
+ end;
+ CHECK_ERR(err, 'inflate with dict');
+ end;
+
+ err := inflateEnd(d_stream);
+ CHECK_ERR(err, 'inflateEnd');
+
+ if StrComp(PChar(uncompr), hello) <> 0 then
+ EXIT_ERR('bad inflate with dict')
+ else
+ WriteLn('inflate with dictionary: ', PChar(uncompr));
+end;
+{$ENDIF}
+
+var compr, uncompr: Pointer;
+ comprLen, uncomprLen: LongInt;
+
+begin
+ if zlibVersion^ <> ZLIB_VERSION[1] then
+ EXIT_ERR('Incompatible zlib version');
+
+ WriteLn('zlib version: ', zlibVersion);
+ WriteLn('zlib compile flags: ', Format('0x%x', [zlibCompileFlags]));
+
+ comprLen := 10000 * SizeOf(Integer); (* don't overflow on MSDOS *)
+ uncomprLen := comprLen;
+ GetMem(compr, comprLen);
+ GetMem(uncompr, uncomprLen);
+ if (compr = NIL) or (uncompr = NIL) then
+ EXIT_ERR('Out of memory');
+ (* compr and uncompr are cleared to avoid reading uninitialized
+ * data and to ensure that uncompr compresses well.
+ *)
+ FillChar(compr^, comprLen, 0);
+ FillChar(uncompr^, uncomprLen, 0);
+
+ {$IFDEF TEST_COMPRESS}
+ WriteLn('** Testing compress');
+ test_compress(compr, comprLen, uncompr, uncomprLen);
+ {$ENDIF}
+
+ {$IFDEF TEST_GZIO}
+ WriteLn('** Testing gzio');
+ if ParamCount >= 1 then
+ test_gzio(ParamStr(1), uncompr, uncomprLen)
+ else
+ test_gzio(TESTFILE, uncompr, uncomprLen);
+ {$ENDIF}
+
+ {$IFDEF TEST_DEFLATE}
+ WriteLn('** Testing deflate with small buffers');
+ test_deflate(compr, comprLen);
+ {$ENDIF}
+ {$IFDEF TEST_INFLATE}
+ WriteLn('** Testing inflate with small buffers');
+ test_inflate(compr, comprLen, uncompr, uncomprLen);
+ {$ENDIF}
+
+ {$IFDEF TEST_DEFLATE}
+ WriteLn('** Testing deflate with large buffers');
+ test_large_deflate(compr, comprLen, uncompr, uncomprLen);
+ {$ENDIF}
+ {$IFDEF TEST_INFLATE}
+ WriteLn('** Testing inflate with large buffers');
+ test_large_inflate(compr, comprLen, uncompr, uncomprLen);
+ {$ENDIF}
+
+ {$IFDEF TEST_FLUSH}
+ WriteLn('** Testing deflate with full flush');
+ test_flush(compr, comprLen);
+ {$ENDIF}
+ {$IFDEF TEST_SYNC}
+ WriteLn('** Testing inflateSync');
+ test_sync(compr, comprLen, uncompr, uncomprLen);
+ {$ENDIF}
+ comprLen := uncomprLen;
+
+ {$IFDEF TEST_DICT}
+ WriteLn('** Testing deflate and inflate with preset dictionary');
+ test_dict_deflate(compr, comprLen);
+ test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
+ {$ENDIF}
+
+ FreeMem(compr, comprLen);
+ FreeMem(uncompr, uncomprLen);
+end.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/readme.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/readme.txt
new file mode 100644
index 000000000..60e87c8a3
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/readme.txt
@@ -0,0 +1,76 @@
+
+This directory contains a Pascal (Delphi, Kylix) interface to the
+zlib data compression library.
+
+
+Directory listing
+=================
+
+zlibd32.mak makefile for Borland C++
+example.pas usage example of zlib
+zlibpas.pas the Pascal interface to zlib
+readme.txt this file
+
+
+Compatibility notes
+===================
+
+- Although the name "zlib" would have been more normal for the
+ zlibpas unit, this name is already taken by Borland's ZLib unit.
+ This is somehow unfortunate, because that unit is not a genuine
+ interface to the full-fledged zlib functionality, but a suite of
+ class wrappers around zlib streams. Other essential features,
+ such as checksums, are missing.
+ It would have been more appropriate for that unit to have a name
+ like "ZStreams", or something similar.
+
+- The C and zlib-supplied types int, uInt, long, uLong, etc. are
+ translated directly into Pascal types of similar sizes (Integer,
+ LongInt, etc.), to avoid namespace pollution. In particular,
+ there is no conversion of unsigned int into a Pascal unsigned
+ integer. The Word type is non-portable and has the same size
+ (16 bits) both in a 16-bit and in a 32-bit environment, unlike
+ Integer. Even if there is a 32-bit Cardinal type, there is no
+ real need for unsigned int in zlib under a 32-bit environment.
+
+- Except for the callbacks, the zlib function interfaces are
+ assuming the calling convention normally used in Pascal
+ (__pascal for DOS and Windows16, __fastcall for Windows32).
+ Since the cdecl keyword is used, the old Turbo Pascal does
+ not work with this interface.
+
+- The gz* function interfaces are not translated, to avoid
+ interfacing problems with the C runtime library. Besides,
+ gzprintf(gzFile file, const char *format, ...)
+ cannot be translated into Pascal.
+
+
+Legal issues
+============
+
+The zlibpas interface is:
+ Copyright (C) 1995-2003 Jean-loup Gailly and Mark Adler.
+ Copyright (C) 1998 by Bob Dellaca.
+ Copyright (C) 2003 by Cosmin Truta.
+
+The example program is:
+ Copyright (C) 1995-2003 by Jean-loup Gailly.
+ Copyright (C) 1998,1999,2000 by Jacques Nomssi Nzali.
+ Copyright (C) 2003 by Cosmin Truta.
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibd32.mak b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibd32.mak
new file mode 100644
index 000000000..9bb00b7cc
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibd32.mak
@@ -0,0 +1,99 @@
+# Makefile for zlib
+# For use with Delphi and C++ Builder under Win32
+# Updated for zlib 1.2.x by Cosmin Truta
+
+# ------------ Borland C++ ------------
+
+# This project uses the Delphi (fastcall/register) calling convention:
+LOC = -DZEXPORT=__fastcall -DZEXPORTVA=__cdecl
+
+CC = bcc32
+LD = bcc32
+AR = tlib
+# do not use "-pr" in CFLAGS
+CFLAGS = -a -d -k- -O2 $(LOC)
+LDFLAGS =
+
+
+# variables
+ZLIB_LIB = zlib.lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj
+OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj
+OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
+
+
+# targets
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+ $(CC) -c $(CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h
+
+gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h
+
+gzread.obj: gzread.c zlib.h zconf.h gzguts.h
+
+gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: test/example.c zlib.h zconf.h
+
+minigzip.obj: test/minigzip.c zlib.h zconf.h
+
+
+# For the sake of the old Borland make,
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ -del $(ZLIB_LIB)
+ $(AR) $(ZLIB_LIB) $(OBJP1)
+ $(AR) $(ZLIB_LIB) $(OBJP2)
+
+
+# testing
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
+
+
+# cleanup
+clean:
+ -del *.obj
+ -del *.exe
+ -del *.lib
+ -del *.tds
+ -del zlib.bak
+ -del foo.gz
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibpas.pas b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibpas.pas
new file mode 100644
index 000000000..a0dff11b5
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/pascal/zlibpas.pas
@@ -0,0 +1,276 @@
+(* zlibpas -- Pascal interface to the zlib data compression library
+ *
+ * Copyright (C) 2003 Cosmin Truta.
+ * Derived from original sources by Bob Dellaca.
+ * For conditions of distribution and use, see copyright notice in readme.txt
+ *)
+
+unit zlibpas;
+
+interface
+
+const
+ ZLIB_VERSION = '1.2.11';
+ ZLIB_VERNUM = $12a0;
+
+type
+ alloc_func = function(opaque: Pointer; items, size: Integer): Pointer;
+ cdecl;
+ free_func = procedure(opaque, address: Pointer);
+ cdecl;
+
+ in_func = function(opaque: Pointer; var buf: PByte): Integer;
+ cdecl;
+ out_func = function(opaque: Pointer; buf: PByte; size: Integer): Integer;
+ cdecl;
+
+ z_streamp = ^z_stream;
+ z_stream = packed record
+ next_in: PChar; (* next input byte *)
+ avail_in: Integer; (* number of bytes available at next_in *)
+ total_in: LongInt; (* total nb of input bytes read so far *)
+
+ next_out: PChar; (* next output byte should be put there *)
+ avail_out: Integer; (* remaining free space at next_out *)
+ total_out: LongInt; (* total nb of bytes output so far *)
+
+ msg: PChar; (* last error message, NULL if no error *)
+ state: Pointer; (* not visible by applications *)
+
+ zalloc: alloc_func; (* used to allocate the internal state *)
+ zfree: free_func; (* used to free the internal state *)
+ opaque: Pointer; (* private data object passed to zalloc and zfree *)
+
+ data_type: Integer; (* best guess about the data type: ascii or binary *)
+ adler: LongInt; (* adler32 value of the uncompressed data *)
+ reserved: LongInt; (* reserved for future use *)
+ end;
+
+ gz_headerp = ^gz_header;
+ gz_header = packed record
+ text: Integer; (* true if compressed data believed to be text *)
+ time: LongInt; (* modification time *)
+ xflags: Integer; (* extra flags (not used when writing a gzip file) *)
+ os: Integer; (* operating system *)
+ extra: PChar; (* pointer to extra field or Z_NULL if none *)
+ extra_len: Integer; (* extra field length (valid if extra != Z_NULL) *)
+ extra_max: Integer; (* space at extra (only when reading header) *)
+ name: PChar; (* pointer to zero-terminated file name or Z_NULL *)
+ name_max: Integer; (* space at name (only when reading header) *)
+ comment: PChar; (* pointer to zero-terminated comment or Z_NULL *)
+ comm_max: Integer; (* space at comment (only when reading header) *)
+ hcrc: Integer; (* true if there was or will be a header crc *)
+ done: Integer; (* true when done reading gzip header *)
+ end;
+
+(* constants *)
+const
+ Z_NO_FLUSH = 0;
+ Z_PARTIAL_FLUSH = 1;
+ Z_SYNC_FLUSH = 2;
+ Z_FULL_FLUSH = 3;
+ Z_FINISH = 4;
+ Z_BLOCK = 5;
+ Z_TREES = 6;
+
+ Z_OK = 0;
+ Z_STREAM_END = 1;
+ Z_NEED_DICT = 2;
+ Z_ERRNO = -1;
+ Z_STREAM_ERROR = -2;
+ Z_DATA_ERROR = -3;
+ Z_MEM_ERROR = -4;
+ Z_BUF_ERROR = -5;
+ Z_VERSION_ERROR = -6;
+
+ Z_NO_COMPRESSION = 0;
+ Z_BEST_SPEED = 1;
+ Z_BEST_COMPRESSION = 9;
+ Z_DEFAULT_COMPRESSION = -1;
+
+ Z_FILTERED = 1;
+ Z_HUFFMAN_ONLY = 2;
+ Z_RLE = 3;
+ Z_FIXED = 4;
+ Z_DEFAULT_STRATEGY = 0;
+
+ Z_BINARY = 0;
+ Z_TEXT = 1;
+ Z_ASCII = 1;
+ Z_UNKNOWN = 2;
+
+ Z_DEFLATED = 8;
+
+(* basic functions *)
+function zlibVersion: PChar;
+function deflateInit(var strm: z_stream; level: Integer): Integer;
+function deflate(var strm: z_stream; flush: Integer): Integer;
+function deflateEnd(var strm: z_stream): Integer;
+function inflateInit(var strm: z_stream): Integer;
+function inflate(var strm: z_stream; flush: Integer): Integer;
+function inflateEnd(var strm: z_stream): Integer;
+
+(* advanced functions *)
+function deflateInit2(var strm: z_stream; level, method, windowBits,
+ memLevel, strategy: Integer): Integer;
+function deflateSetDictionary(var strm: z_stream; const dictionary: PChar;
+ dictLength: Integer): Integer;
+function deflateCopy(var dest, source: z_stream): Integer;
+function deflateReset(var strm: z_stream): Integer;
+function deflateParams(var strm: z_stream; level, strategy: Integer): Integer;
+function deflateTune(var strm: z_stream; good_length, max_lazy, nice_length, max_chain: Integer): Integer;
+function deflateBound(var strm: z_stream; sourceLen: LongInt): LongInt;
+function deflatePending(var strm: z_stream; var pending: Integer; var bits: Integer): Integer;
+function deflatePrime(var strm: z_stream; bits, value: Integer): Integer;
+function deflateSetHeader(var strm: z_stream; head: gz_header): Integer;
+function inflateInit2(var strm: z_stream; windowBits: Integer): Integer;
+function inflateSetDictionary(var strm: z_stream; const dictionary: PChar;
+ dictLength: Integer): Integer;
+function inflateSync(var strm: z_stream): Integer;
+function inflateCopy(var dest, source: z_stream): Integer;
+function inflateReset(var strm: z_stream): Integer;
+function inflateReset2(var strm: z_stream; windowBits: Integer): Integer;
+function inflatePrime(var strm: z_stream; bits, value: Integer): Integer;
+function inflateMark(var strm: z_stream): LongInt;
+function inflateGetHeader(var strm: z_stream; var head: gz_header): Integer;
+function inflateBackInit(var strm: z_stream;
+ windowBits: Integer; window: PChar): Integer;
+function inflateBack(var strm: z_stream; in_fn: in_func; in_desc: Pointer;
+ out_fn: out_func; out_desc: Pointer): Integer;
+function inflateBackEnd(var strm: z_stream): Integer;
+function zlibCompileFlags: LongInt;
+
+(* utility functions *)
+function compress(dest: PChar; var destLen: LongInt;
+ const source: PChar; sourceLen: LongInt): Integer;
+function compress2(dest: PChar; var destLen: LongInt;
+ const source: PChar; sourceLen: LongInt;
+ level: Integer): Integer;
+function compressBound(sourceLen: LongInt): LongInt;
+function uncompress(dest: PChar; var destLen: LongInt;
+ const source: PChar; sourceLen: LongInt): Integer;
+
+(* checksum functions *)
+function adler32(adler: LongInt; const buf: PChar; len: Integer): LongInt;
+function adler32_combine(adler1, adler2, len2: LongInt): LongInt;
+function crc32(crc: LongInt; const buf: PChar; len: Integer): LongInt;
+function crc32_combine(crc1, crc2, len2: LongInt): LongInt;
+
+(* various hacks, don't look :) *)
+function deflateInit_(var strm: z_stream; level: Integer;
+ const version: PChar; stream_size: Integer): Integer;
+function inflateInit_(var strm: z_stream; const version: PChar;
+ stream_size: Integer): Integer;
+function deflateInit2_(var strm: z_stream;
+ level, method, windowBits, memLevel, strategy: Integer;
+ const version: PChar; stream_size: Integer): Integer;
+function inflateInit2_(var strm: z_stream; windowBits: Integer;
+ const version: PChar; stream_size: Integer): Integer;
+function inflateBackInit_(var strm: z_stream;
+ windowBits: Integer; window: PChar;
+ const version: PChar; stream_size: Integer): Integer;
+
+
+implementation
+
+{$L adler32.obj}
+{$L compress.obj}
+{$L crc32.obj}
+{$L deflate.obj}
+{$L infback.obj}
+{$L inffast.obj}
+{$L inflate.obj}
+{$L inftrees.obj}
+{$L trees.obj}
+{$L uncompr.obj}
+{$L zutil.obj}
+
+function adler32; external;
+function adler32_combine; external;
+function compress; external;
+function compress2; external;
+function compressBound; external;
+function crc32; external;
+function crc32_combine; external;
+function deflate; external;
+function deflateBound; external;
+function deflateCopy; external;
+function deflateEnd; external;
+function deflateInit_; external;
+function deflateInit2_; external;
+function deflateParams; external;
+function deflatePending; external;
+function deflatePrime; external;
+function deflateReset; external;
+function deflateSetDictionary; external;
+function deflateSetHeader; external;
+function deflateTune; external;
+function inflate; external;
+function inflateBack; external;
+function inflateBackEnd; external;
+function inflateBackInit_; external;
+function inflateCopy; external;
+function inflateEnd; external;
+function inflateGetHeader; external;
+function inflateInit_; external;
+function inflateInit2_; external;
+function inflateMark; external;
+function inflatePrime; external;
+function inflateReset; external;
+function inflateReset2; external;
+function inflateSetDictionary; external;
+function inflateSync; external;
+function uncompress; external;
+function zlibCompileFlags; external;
+function zlibVersion; external;
+
+function deflateInit(var strm: z_stream; level: Integer): Integer;
+begin
+ Result := deflateInit_(strm, level, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function deflateInit2(var strm: z_stream; level, method, windowBits, memLevel,
+ strategy: Integer): Integer;
+begin
+ Result := deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+ ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateInit(var strm: z_stream): Integer;
+begin
+ Result := inflateInit_(strm, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateInit2(var strm: z_stream; windowBits: Integer): Integer;
+begin
+ Result := inflateInit2_(strm, windowBits, ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function inflateBackInit(var strm: z_stream;
+ windowBits: Integer; window: PChar): Integer;
+begin
+ Result := inflateBackInit_(strm, windowBits, window,
+ ZLIB_VERSION, sizeof(z_stream));
+end;
+
+function _malloc(Size: Integer): Pointer; cdecl;
+begin
+ GetMem(Result, Size);
+end;
+
+procedure _free(Block: Pointer); cdecl;
+begin
+ FreeMem(Block);
+end;
+
+procedure _memset(P: Pointer; B: Byte; count: Integer); cdecl;
+begin
+ FillChar(P^, count, B);
+end;
+
+procedure _memcpy(dest, source: Pointer; count: Integer); cdecl;
+begin
+ Move(source^, dest^, count);
+end;
+
+end.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/Makefile b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/Makefile
new file mode 100644
index 000000000..0e2594c80
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/Makefile
@@ -0,0 +1,42 @@
+CFLAGS=-O
+
+puff: puff.o pufftest.o
+
+puff.o: puff.h
+
+pufftest.o: puff.h
+
+test: puff
+ puff zeros.raw
+
+puft: puff.c puff.h pufftest.o
+ cc -fprofile-arcs -ftest-coverage -o puft puff.c pufftest.o
+
+# puff full coverage test (should say 100%)
+cov: puft
+ @rm -f *.gcov *.gcda
+ @puft -w zeros.raw 2>&1 | cat > /dev/null
+ @echo '04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2
+ @echo '00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2
+ @echo '00 00 00 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 254
+ @echo '00 01 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2
+ @echo '01 01 00 fe ff 0a' | xxd -r -p | puft -f 2>&1 | cat > /dev/null
+ @echo '02 7e ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246
+ @echo '02' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2
+ @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 2
+ @echo '04 80 49 92 24 49 92 24 71 ff ff 93 11 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 249
+ @echo '04 c0 81 08 00 00 00 00 20 7f eb 0b 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246
+ @echo '0b 00 00' | xxd -r -p | puft -f 2>&1 | cat > /dev/null
+ @echo '1a 07' | xxd -r -p | puft 2> /dev/null || test $$? -eq 246
+ @echo '0c c0 81 00 00 00 00 00 90 ff 6b 04' | xxd -r -p | puft 2> /dev/null || test $$? -eq 245
+ @puft -f zeros.raw 2>&1 | cat > /dev/null
+ @echo 'fc 00 00' | xxd -r -p | puft 2> /dev/null || test $$? -eq 253
+ @echo '04 00 fe ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 252
+ @echo '04 00 24 49' | xxd -r -p | puft 2> /dev/null || test $$? -eq 251
+ @echo '04 80 49 92 24 49 92 24 0f b4 ff ff c3 84' | xxd -r -p | puft 2> /dev/null || test $$? -eq 248
+ @echo '04 00 24 e9 ff ff' | xxd -r -p | puft 2> /dev/null || test $$? -eq 250
+ @echo '04 00 24 e9 ff 6d' | xxd -r -p | puft 2> /dev/null || test $$? -eq 247
+ @gcov -n puff.c
+
+clean:
+ rm -f puff puft *.o *.gc*
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/README b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/README
new file mode 100644
index 000000000..bbc4cb595
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/README
@@ -0,0 +1,63 @@
+Puff -- A Simple Inflate
+3 Mar 2003
+Mark Adler
+madler@alumni.caltech.edu
+
+What this is --
+
+puff.c provides the routine puff() to decompress the deflate data format. It
+does so more slowly than zlib, but the code is about one-fifth the size of the
+inflate code in zlib, and written to be very easy to read.
+
+Why I wrote this --
+
+puff.c was written to document the deflate format unambiguously, by virtue of
+being working C code. It is meant to supplement RFC 1951, which formally
+describes the deflate format. I have received many questions on details of the
+deflate format, and I hope that reading this code will answer those questions.
+puff.c is heavily commented with details of the deflate format, especially
+those little nooks and cranies of the format that might not be obvious from a
+specification.
+
+puff.c may also be useful in applications where code size or memory usage is a
+very limited resource, and speed is not as important.
+
+How to use it --
+
+Well, most likely you should just be reading puff.c and using zlib for actual
+applications, but if you must ...
+
+Include puff.h in your code, which provides this prototype:
+
+int puff(unsigned char *dest, /* pointer to destination pointer */
+ unsigned long *destlen, /* amount of output space */
+ unsigned char *source, /* pointer to source data pointer */
+ unsigned long *sourcelen); /* amount of input available */
+
+Then you can call puff() to decompress a deflate stream that is in memory in
+its entirety at source, to a sufficiently sized block of memory for the
+decompressed data at dest. puff() is the only external symbol in puff.c The
+only C library functions that puff.c needs are setjmp() and longjmp(), which
+are used to simplify error checking in the code to improve readabilty. puff.c
+does no memory allocation, and uses less than 2K bytes off of the stack.
+
+If destlen is not enough space for the uncompressed data, then inflate will
+return an error without writing more than destlen bytes. Note that this means
+that in order to decompress the deflate data successfully, you need to know
+the size of the uncompressed data ahead of time.
+
+If needed, puff() can determine the size of the uncompressed data with no
+output space. This is done by passing dest equal to (unsigned char *)0. Then
+the initial value of *destlen is ignored and *destlen is set to the length of
+the uncompressed data. So if the size of the uncompressed data is not known,
+then two passes of puff() can be used--first to determine the size, and second
+to do the actual inflation after allocating the appropriate memory. Not
+pretty, but it works. (This is one of the reasons you should be using zlib.)
+
+The deflate format is self-terminating. If the deflate stream does not end
+in *sourcelen bytes, puff() will return an error without reading at or past
+endsource.
+
+On return, *sourcelen is updated to the amount of input data consumed, and
+*destlen is updated to the size of the uncompressed data. See the comments
+in puff.c for the possible return codes for puff().
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.c
new file mode 100644
index 000000000..c6c90d714
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.c
@@ -0,0 +1,840 @@
+/*
+ * puff.c
+ * Copyright (C) 2002-2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in puff.h
+ * version 2.3, 21 Jan 2013
+ *
+ * puff.c is a simple inflate written to be an unambiguous way to specify the
+ * deflate format. It is not written for speed but rather simplicity. As a
+ * side benefit, this code might actually be useful when small code is more
+ * important than speed, such as bootstrap applications. For typical deflate
+ * data, zlib's inflate() is about four times as fast as puff(). zlib's
+ * inflate compiles to around 20K on my machine, whereas puff.c compiles to
+ * around 4K on my machine (a PowerPC using GNU cc). If the faster decode()
+ * function here is used, then puff() is only twice as slow as zlib's
+ * inflate().
+ *
+ * All dynamically allocated memory comes from the stack. The stack required
+ * is less than 2K bytes. This code is compatible with 16-bit int's and
+ * assumes that long's are at least 32 bits. puff.c uses the short data type,
+ * assumed to be 16 bits, for arrays in order to conserve memory. The code
+ * works whether integers are stored big endian or little endian.
+ *
+ * In the comments below are "Format notes" that describe the inflate process
+ * and document some of the less obvious aspects of the format. This source
+ * code is meant to supplement RFC 1951, which formally describes the deflate
+ * format:
+ *
+ * http://www.zlib.org/rfc-deflate.html
+ */
+
+/*
+ * Change history:
+ *
+ * 1.0 10 Feb 2002 - First version
+ * 1.1 17 Feb 2002 - Clarifications of some comments and notes
+ * - Update puff() dest and source pointers on negative
+ * errors to facilitate debugging deflators
+ * - Remove longest from struct huffman -- not needed
+ * - Simplify offs[] index in construct()
+ * - Add input size and checking, using longjmp() to
+ * maintain easy readability
+ * - Use short data type for large arrays
+ * - Use pointers instead of long to specify source and
+ * destination sizes to avoid arbitrary 4 GB limits
+ * 1.2 17 Mar 2002 - Add faster version of decode(), doubles speed (!),
+ * but leave simple version for readabilty
+ * - Make sure invalid distances detected if pointers
+ * are 16 bits
+ * - Fix fixed codes table error
+ * - Provide a scanning mode for determining size of
+ * uncompressed data
+ * 1.3 20 Mar 2002 - Go back to lengths for puff() parameters [Gailly]
+ * - Add a puff.h file for the interface
+ * - Add braces in puff() for else do [Gailly]
+ * - Use indexes instead of pointers for readability
+ * 1.4 31 Mar 2002 - Simplify construct() code set check
+ * - Fix some comments
+ * - Add FIXLCODES #define
+ * 1.5 6 Apr 2002 - Minor comment fixes
+ * 1.6 7 Aug 2002 - Minor format changes
+ * 1.7 3 Mar 2003 - Added test code for distribution
+ * - Added zlib-like license
+ * 1.8 9 Jan 2004 - Added some comments on no distance codes case
+ * 1.9 21 Feb 2008 - Fix bug on 16-bit integer architectures [Pohland]
+ * - Catch missing end-of-block symbol error
+ * 2.0 25 Jul 2008 - Add #define to permit distance too far back
+ * - Add option in TEST code for puff to write the data
+ * - Add option in TEST code to skip input bytes
+ * - Allow TEST code to read from piped stdin
+ * 2.1 4 Apr 2010 - Avoid variable initialization for happier compilers
+ * - Avoid unsigned comparisons for even happier compilers
+ * 2.2 25 Apr 2010 - Fix bug in variable initializations [Oberhumer]
+ * - Add const where appropriate [Oberhumer]
+ * - Split if's and ?'s for coverage testing
+ * - Break out test code to separate file
+ * - Move NIL to puff.h
+ * - Allow incomplete code only if single code length is 1
+ * - Add full code coverage test to Makefile
+ * 2.3 21 Jan 2013 - Check for invalid code length codes in dynamic blocks
+ */
+
+#include <setjmp.h> /* for setjmp(), longjmp(), and jmp_buf */
+#include "puff.h" /* prototype for puff() */
+
+#define local static /* for local function definitions */
+
+/*
+ * Maximums for allocations and loops. It is not useful to change these --
+ * they are fixed by the deflate format.
+ */
+#define MAXBITS 15 /* maximum bits in a code */
+#define MAXLCODES 286 /* maximum number of literal/length codes */
+#define MAXDCODES 30 /* maximum number of distance codes */
+#define MAXCODES (MAXLCODES+MAXDCODES) /* maximum codes lengths to read */
+#define FIXLCODES 288 /* number of fixed literal/length codes */
+
+/* input and output state */
+struct state {
+ /* output state */
+ unsigned char *out; /* output buffer */
+ unsigned long outlen; /* available space at out */
+ unsigned long outcnt; /* bytes written to out so far */
+
+ /* input state */
+ const unsigned char *in; /* input buffer */
+ unsigned long inlen; /* available input at in */
+ unsigned long incnt; /* bytes read so far */
+ int bitbuf; /* bit buffer */
+ int bitcnt; /* number of bits in bit buffer */
+
+ /* input limit error return state for bits() and decode() */
+ jmp_buf env;
+};
+
+/*
+ * Return need bits from the input stream. This always leaves less than
+ * eight bits in the buffer. bits() works properly for need == 0.
+ *
+ * Format notes:
+ *
+ * - Bits are stored in bytes from the least significant bit to the most
+ * significant bit. Therefore bits are dropped from the bottom of the bit
+ * buffer, using shift right, and new bytes are appended to the top of the
+ * bit buffer, using shift left.
+ */
+local int bits(struct state *s, int need)
+{
+ long val; /* bit accumulator (can use up to 20 bits) */
+
+ /* load at least need bits into val */
+ val = s->bitbuf;
+ while (s->bitcnt < need) {
+ if (s->incnt == s->inlen)
+ longjmp(s->env, 1); /* out of input */
+ val |= (long)(s->in[s->incnt++]) << s->bitcnt; /* load eight bits */
+ s->bitcnt += 8;
+ }
+
+ /* drop need bits and update buffer, always zero to seven bits left */
+ s->bitbuf = (int)(val >> need);
+ s->bitcnt -= need;
+
+ /* return need bits, zeroing the bits above that */
+ return (int)(val & ((1L << need) - 1));
+}
+
+/*
+ * Process a stored block.
+ *
+ * Format notes:
+ *
+ * - After the two-bit stored block type (00), the stored block length and
+ * stored bytes are byte-aligned for fast copying. Therefore any leftover
+ * bits in the byte that has the last bit of the type, as many as seven, are
+ * discarded. The value of the discarded bits are not defined and should not
+ * be checked against any expectation.
+ *
+ * - The second inverted copy of the stored block length does not have to be
+ * checked, but it's probably a good idea to do so anyway.
+ *
+ * - A stored block can have zero length. This is sometimes used to byte-align
+ * subsets of the compressed data for random access or partial recovery.
+ */
+local int stored(struct state *s)
+{
+ unsigned len; /* length of stored block */
+
+ /* discard leftover bits from current byte (assumes s->bitcnt < 8) */
+ s->bitbuf = 0;
+ s->bitcnt = 0;
+
+ /* get length and check against its one's complement */
+ if (s->incnt + 4 > s->inlen)
+ return 2; /* not enough input */
+ len = s->in[s->incnt++];
+ len |= s->in[s->incnt++] << 8;
+ if (s->in[s->incnt++] != (~len & 0xff) ||
+ s->in[s->incnt++] != ((~len >> 8) & 0xff))
+ return -2; /* didn't match complement! */
+
+ /* copy len bytes from in to out */
+ if (s->incnt + len > s->inlen)
+ return 2; /* not enough input */
+ if (s->out != NIL) {
+ if (s->outcnt + len > s->outlen)
+ return 1; /* not enough output space */
+ while (len--)
+ s->out[s->outcnt++] = s->in[s->incnt++];
+ }
+ else { /* just scanning */
+ s->outcnt += len;
+ s->incnt += len;
+ }
+
+ /* done with a valid stored block */
+ return 0;
+}
+
+/*
+ * Huffman code decoding tables. count[1..MAXBITS] is the number of symbols of
+ * each length, which for a canonical code are stepped through in order.
+ * symbol[] are the symbol values in canonical order, where the number of
+ * entries is the sum of the counts in count[]. The decoding process can be
+ * seen in the function decode() below.
+ */
+struct huffman {
+ short *count; /* number of symbols of each length */
+ short *symbol; /* canonically ordered symbols */
+};
+
+/*
+ * Decode a code from the stream s using huffman table h. Return the symbol or
+ * a negative value if there is an error. If all of the lengths are zero, i.e.
+ * an empty code, or if the code is incomplete and an invalid code is received,
+ * then -10 is returned after reading MAXBITS bits.
+ *
+ * Format notes:
+ *
+ * - The codes as stored in the compressed data are bit-reversed relative to
+ * a simple integer ordering of codes of the same lengths. Hence below the
+ * bits are pulled from the compressed data one at a time and used to
+ * build the code value reversed from what is in the stream in order to
+ * permit simple integer comparisons for decoding. A table-based decoding
+ * scheme (as used in zlib) does not need to do this reversal.
+ *
+ * - The first code for the shortest length is all zeros. Subsequent codes of
+ * the same length are simply integer increments of the previous code. When
+ * moving up a length, a zero bit is appended to the code. For a complete
+ * code, the last code of the longest length will be all ones.
+ *
+ * - Incomplete codes are handled by this decoder, since they are permitted
+ * in the deflate format. See the format notes for fixed() and dynamic().
+ */
+#ifdef SLOW
+local int decode(struct state *s, const struct huffman *h)
+{
+ int len; /* current number of bits in code */
+ int code; /* len bits being decoded */
+ int first; /* first code of length len */
+ int count; /* number of codes of length len */
+ int index; /* index of first code of length len in symbol table */
+
+ code = first = index = 0;
+ for (len = 1; len <= MAXBITS; len++) {
+ code |= bits(s, 1); /* get next bit */
+ count = h->count[len];
+ if (code - count < first) /* if length len, return symbol */
+ return h->symbol[index + (code - first)];
+ index += count; /* else update for next length */
+ first += count;
+ first <<= 1;
+ code <<= 1;
+ }
+ return -10; /* ran out of codes */
+}
+
+/*
+ * A faster version of decode() for real applications of this code. It's not
+ * as readable, but it makes puff() twice as fast. And it only makes the code
+ * a few percent larger.
+ */
+#else /* !SLOW */
+local int decode(struct state *s, const struct huffman *h)
+{
+ int len; /* current number of bits in code */
+ int code; /* len bits being decoded */
+ int first; /* first code of length len */
+ int count; /* number of codes of length len */
+ int index; /* index of first code of length len in symbol table */
+ int bitbuf; /* bits from stream */
+ int left; /* bits left in next or left to process */
+ short *next; /* next number of codes */
+
+ bitbuf = s->bitbuf;
+ left = s->bitcnt;
+ code = first = index = 0;
+ len = 1;
+ next = h->count + 1;
+ while (1) {
+ while (left--) {
+ code |= bitbuf & 1;
+ bitbuf >>= 1;
+ count = *next++;
+ if (code - count < first) { /* if length len, return symbol */
+ s->bitbuf = bitbuf;
+ s->bitcnt = (s->bitcnt - len) & 7;
+ return h->symbol[index + (code - first)];
+ }
+ index += count; /* else update for next length */
+ first += count;
+ first <<= 1;
+ code <<= 1;
+ len++;
+ }
+ left = (MAXBITS+1) - len;
+ if (left == 0)
+ break;
+ if (s->incnt == s->inlen)
+ longjmp(s->env, 1); /* out of input */
+ bitbuf = s->in[s->incnt++];
+ if (left > 8)
+ left = 8;
+ }
+ return -10; /* ran out of codes */
+}
+#endif /* SLOW */
+
+/*
+ * Given the list of code lengths length[0..n-1] representing a canonical
+ * Huffman code for n symbols, construct the tables required to decode those
+ * codes. Those tables are the number of codes of each length, and the symbols
+ * sorted by length, retaining their original order within each length. The
+ * return value is zero for a complete code set, negative for an over-
+ * subscribed code set, and positive for an incomplete code set. The tables
+ * can be used if the return value is zero or positive, but they cannot be used
+ * if the return value is negative. If the return value is zero, it is not
+ * possible for decode() using that table to return an error--any stream of
+ * enough bits will resolve to a symbol. If the return value is positive, then
+ * it is possible for decode() using that table to return an error for received
+ * codes past the end of the incomplete lengths.
+ *
+ * Not used by decode(), but used for error checking, h->count[0] is the number
+ * of the n symbols not in the code. So n - h->count[0] is the number of
+ * codes. This is useful for checking for incomplete codes that have more than
+ * one symbol, which is an error in a dynamic block.
+ *
+ * Assumption: for all i in 0..n-1, 0 <= length[i] <= MAXBITS
+ * This is assured by the construction of the length arrays in dynamic() and
+ * fixed() and is not verified by construct().
+ *
+ * Format notes:
+ *
+ * - Permitted and expected examples of incomplete codes are one of the fixed
+ * codes and any code with a single symbol which in deflate is coded as one
+ * bit instead of zero bits. See the format notes for fixed() and dynamic().
+ *
+ * - Within a given code length, the symbols are kept in ascending order for
+ * the code bits definition.
+ */
+local int construct(struct huffman *h, const short *length, int n)
+{
+ int symbol; /* current symbol when stepping through length[] */
+ int len; /* current length when stepping through h->count[] */
+ int left; /* number of possible codes left of current length */
+ short offs[MAXBITS+1]; /* offsets in symbol table for each length */
+
+ /* count number of codes of each length */
+ for (len = 0; len <= MAXBITS; len++)
+ h->count[len] = 0;
+ for (symbol = 0; symbol < n; symbol++)
+ (h->count[length[symbol]])++; /* assumes lengths are within bounds */
+ if (h->count[0] == n) /* no codes! */
+ return 0; /* complete, but decode() will fail */
+
+ /* check for an over-subscribed or incomplete set of lengths */
+ left = 1; /* one possible code of zero length */
+ for (len = 1; len <= MAXBITS; len++) {
+ left <<= 1; /* one more bit, double codes left */
+ left -= h->count[len]; /* deduct count from possible codes */
+ if (left < 0)
+ return left; /* over-subscribed--return negative */
+ } /* left > 0 means incomplete */
+
+ /* generate offsets into symbol table for each length for sorting */
+ offs[1] = 0;
+ for (len = 1; len < MAXBITS; len++)
+ offs[len + 1] = offs[len] + h->count[len];
+
+ /*
+ * put symbols in table sorted by length, by symbol order within each
+ * length
+ */
+ for (symbol = 0; symbol < n; symbol++)
+ if (length[symbol] != 0)
+ h->symbol[offs[length[symbol]]++] = symbol;
+
+ /* return zero for complete set, positive for incomplete set */
+ return left;
+}
+
+/*
+ * Decode literal/length and distance codes until an end-of-block code.
+ *
+ * Format notes:
+ *
+ * - Compressed data that is after the block type if fixed or after the code
+ * description if dynamic is a combination of literals and length/distance
+ * pairs terminated by and end-of-block code. Literals are simply Huffman
+ * coded bytes. A length/distance pair is a coded length followed by a
+ * coded distance to represent a string that occurs earlier in the
+ * uncompressed data that occurs again at the current location.
+ *
+ * - Literals, lengths, and the end-of-block code are combined into a single
+ * code of up to 286 symbols. They are 256 literals (0..255), 29 length
+ * symbols (257..285), and the end-of-block symbol (256).
+ *
+ * - There are 256 possible lengths (3..258), and so 29 symbols are not enough
+ * to represent all of those. Lengths 3..10 and 258 are in fact represented
+ * by just a length symbol. Lengths 11..257 are represented as a symbol and
+ * some number of extra bits that are added as an integer to the base length
+ * of the length symbol. The number of extra bits is determined by the base
+ * length symbol. These are in the static arrays below, lens[] for the base
+ * lengths and lext[] for the corresponding number of extra bits.
+ *
+ * - The reason that 258 gets its own symbol is that the longest length is used
+ * often in highly redundant files. Note that 258 can also be coded as the
+ * base value 227 plus the maximum extra value of 31. While a good deflate
+ * should never do this, it is not an error, and should be decoded properly.
+ *
+ * - If a length is decoded, including its extra bits if any, then it is
+ * followed a distance code. There are up to 30 distance symbols. Again
+ * there are many more possible distances (1..32768), so extra bits are added
+ * to a base value represented by the symbol. The distances 1..4 get their
+ * own symbol, but the rest require extra bits. The base distances and
+ * corresponding number of extra bits are below in the static arrays dist[]
+ * and dext[].
+ *
+ * - Literal bytes are simply written to the output. A length/distance pair is
+ * an instruction to copy previously uncompressed bytes to the output. The
+ * copy is from distance bytes back in the output stream, copying for length
+ * bytes.
+ *
+ * - Distances pointing before the beginning of the output data are not
+ * permitted.
+ *
+ * - Overlapped copies, where the length is greater than the distance, are
+ * allowed and common. For example, a distance of one and a length of 258
+ * simply copies the last byte 258 times. A distance of four and a length of
+ * twelve copies the last four bytes three times. A simple forward copy
+ * ignoring whether the length is greater than the distance or not implements
+ * this correctly. You should not use memcpy() since its behavior is not
+ * defined for overlapped arrays. You should not use memmove() or bcopy()
+ * since though their behavior -is- defined for overlapping arrays, it is
+ * defined to do the wrong thing in this case.
+ */
+local int codes(struct state *s,
+ const struct huffman *lencode,
+ const struct huffman *distcode)
+{
+ int symbol; /* decoded symbol */
+ int len; /* length for copy */
+ unsigned dist; /* distance for copy */
+ static const short lens[29] = { /* Size base for length codes 257..285 */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258};
+ static const short lext[29] = { /* Extra bits for length codes 257..285 */
+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
+ 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0};
+ static const short dists[30] = { /* Offset base for distance codes 0..29 */
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+ 8193, 12289, 16385, 24577};
+ static const short dext[30] = { /* Extra bits for distance codes 0..29 */
+ 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
+ 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
+ 12, 12, 13, 13};
+
+ /* decode literals and length/distance pairs */
+ do {
+ symbol = decode(s, lencode);
+ if (symbol < 0)
+ return symbol; /* invalid symbol */
+ if (symbol < 256) { /* literal: symbol is the byte */
+ /* write out the literal */
+ if (s->out != NIL) {
+ if (s->outcnt == s->outlen)
+ return 1;
+ s->out[s->outcnt] = symbol;
+ }
+ s->outcnt++;
+ }
+ else if (symbol > 256) { /* length */
+ /* get and compute length */
+ symbol -= 257;
+ if (symbol >= 29)
+ return -10; /* invalid fixed code */
+ len = lens[symbol] + bits(s, lext[symbol]);
+
+ /* get and check distance */
+ symbol = decode(s, distcode);
+ if (symbol < 0)
+ return symbol; /* invalid symbol */
+ dist = dists[symbol] + bits(s, dext[symbol]);
+#ifndef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ if (dist > s->outcnt)
+ return -11; /* distance too far back */
+#endif
+
+ /* copy length bytes from distance bytes back */
+ if (s->out != NIL) {
+ if (s->outcnt + len > s->outlen)
+ return 1;
+ while (len--) {
+ s->out[s->outcnt] =
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ dist > s->outcnt ?
+ 0 :
+#endif
+ s->out[s->outcnt - dist];
+ s->outcnt++;
+ }
+ }
+ else
+ s->outcnt += len;
+ }
+ } while (symbol != 256); /* end of block symbol */
+
+ /* done with a valid fixed or dynamic block */
+ return 0;
+}
+
+/*
+ * Process a fixed codes block.
+ *
+ * Format notes:
+ *
+ * - This block type can be useful for compressing small amounts of data for
+ * which the size of the code descriptions in a dynamic block exceeds the
+ * benefit of custom codes for that block. For fixed codes, no bits are
+ * spent on code descriptions. Instead the code lengths for literal/length
+ * codes and distance codes are fixed. The specific lengths for each symbol
+ * can be seen in the "for" loops below.
+ *
+ * - The literal/length code is complete, but has two symbols that are invalid
+ * and should result in an error if received. This cannot be implemented
+ * simply as an incomplete code since those two symbols are in the "middle"
+ * of the code. They are eight bits long and the longest literal/length\
+ * code is nine bits. Therefore the code must be constructed with those
+ * symbols, and the invalid symbols must be detected after decoding.
+ *
+ * - The fixed distance codes also have two invalid symbols that should result
+ * in an error if received. Since all of the distance codes are the same
+ * length, this can be implemented as an incomplete code. Then the invalid
+ * codes are detected while decoding.
+ */
+local int fixed(struct state *s)
+{
+ static int virgin = 1;
+ static short lencnt[MAXBITS+1], lensym[FIXLCODES];
+ static short distcnt[MAXBITS+1], distsym[MAXDCODES];
+ static struct huffman lencode, distcode;
+
+ /* build fixed huffman tables if first call (may not be thread safe) */
+ if (virgin) {
+ int symbol;
+ short lengths[FIXLCODES];
+
+ /* construct lencode and distcode */
+ lencode.count = lencnt;
+ lencode.symbol = lensym;
+ distcode.count = distcnt;
+ distcode.symbol = distsym;
+
+ /* literal/length table */
+ for (symbol = 0; symbol < 144; symbol++)
+ lengths[symbol] = 8;
+ for (; symbol < 256; symbol++)
+ lengths[symbol] = 9;
+ for (; symbol < 280; symbol++)
+ lengths[symbol] = 7;
+ for (; symbol < FIXLCODES; symbol++)
+ lengths[symbol] = 8;
+ construct(&lencode, lengths, FIXLCODES);
+
+ /* distance table */
+ for (symbol = 0; symbol < MAXDCODES; symbol++)
+ lengths[symbol] = 5;
+ construct(&distcode, lengths, MAXDCODES);
+
+ /* do this just once */
+ virgin = 0;
+ }
+
+ /* decode data until end-of-block code */
+ return codes(s, &lencode, &distcode);
+}
+
+/*
+ * Process a dynamic codes block.
+ *
+ * Format notes:
+ *
+ * - A dynamic block starts with a description of the literal/length and
+ * distance codes for that block. New dynamic blocks allow the compressor to
+ * rapidly adapt to changing data with new codes optimized for that data.
+ *
+ * - The codes used by the deflate format are "canonical", which means that
+ * the actual bits of the codes are generated in an unambiguous way simply
+ * from the number of bits in each code. Therefore the code descriptions
+ * are simply a list of code lengths for each symbol.
+ *
+ * - The code lengths are stored in order for the symbols, so lengths are
+ * provided for each of the literal/length symbols, and for each of the
+ * distance symbols.
+ *
+ * - If a symbol is not used in the block, this is represented by a zero as
+ * as the code length. This does not mean a zero-length code, but rather
+ * that no code should be created for this symbol. There is no way in the
+ * deflate format to represent a zero-length code.
+ *
+ * - The maximum number of bits in a code is 15, so the possible lengths for
+ * any code are 1..15.
+ *
+ * - The fact that a length of zero is not permitted for a code has an
+ * interesting consequence. Normally if only one symbol is used for a given
+ * code, then in fact that code could be represented with zero bits. However
+ * in deflate, that code has to be at least one bit. So for example, if
+ * only a single distance base symbol appears in a block, then it will be
+ * represented by a single code of length one, in particular one 0 bit. This
+ * is an incomplete code, since if a 1 bit is received, it has no meaning,
+ * and should result in an error. So incomplete distance codes of one symbol
+ * should be permitted, and the receipt of invalid codes should be handled.
+ *
+ * - It is also possible to have a single literal/length code, but that code
+ * must be the end-of-block code, since every dynamic block has one. This
+ * is not the most efficient way to create an empty block (an empty fixed
+ * block is fewer bits), but it is allowed by the format. So incomplete
+ * literal/length codes of one symbol should also be permitted.
+ *
+ * - If there are only literal codes and no lengths, then there are no distance
+ * codes. This is represented by one distance code with zero bits.
+ *
+ * - The list of up to 286 length/literal lengths and up to 30 distance lengths
+ * are themselves compressed using Huffman codes and run-length encoding. In
+ * the list of code lengths, a 0 symbol means no code, a 1..15 symbol means
+ * that length, and the symbols 16, 17, and 18 are run-length instructions.
+ * Each of 16, 17, and 18 are follwed by extra bits to define the length of
+ * the run. 16 copies the last length 3 to 6 times. 17 represents 3 to 10
+ * zero lengths, and 18 represents 11 to 138 zero lengths. Unused symbols
+ * are common, hence the special coding for zero lengths.
+ *
+ * - The symbols for 0..18 are Huffman coded, and so that code must be
+ * described first. This is simply a sequence of up to 19 three-bit values
+ * representing no code (0) or the code length for that symbol (1..7).
+ *
+ * - A dynamic block starts with three fixed-size counts from which is computed
+ * the number of literal/length code lengths, the number of distance code
+ * lengths, and the number of code length code lengths (ok, you come up with
+ * a better name!) in the code descriptions. For the literal/length and
+ * distance codes, lengths after those provided are considered zero, i.e. no
+ * code. The code length code lengths are received in a permuted order (see
+ * the order[] array below) to make a short code length code length list more
+ * likely. As it turns out, very short and very long codes are less likely
+ * to be seen in a dynamic code description, hence what may appear initially
+ * to be a peculiar ordering.
+ *
+ * - Given the number of literal/length code lengths (nlen) and distance code
+ * lengths (ndist), then they are treated as one long list of nlen + ndist
+ * code lengths. Therefore run-length coding can and often does cross the
+ * boundary between the two sets of lengths.
+ *
+ * - So to summarize, the code description at the start of a dynamic block is
+ * three counts for the number of code lengths for the literal/length codes,
+ * the distance codes, and the code length codes. This is followed by the
+ * code length code lengths, three bits each. This is used to construct the
+ * code length code which is used to read the remainder of the lengths. Then
+ * the literal/length code lengths and distance lengths are read as a single
+ * set of lengths using the code length codes. Codes are constructed from
+ * the resulting two sets of lengths, and then finally you can start
+ * decoding actual compressed data in the block.
+ *
+ * - For reference, a "typical" size for the code description in a dynamic
+ * block is around 80 bytes.
+ */
+local int dynamic(struct state *s)
+{
+ int nlen, ndist, ncode; /* number of lengths in descriptor */
+ int index; /* index of lengths[] */
+ int err; /* construct() return value */
+ short lengths[MAXCODES]; /* descriptor code lengths */
+ short lencnt[MAXBITS+1], lensym[MAXLCODES]; /* lencode memory */
+ short distcnt[MAXBITS+1], distsym[MAXDCODES]; /* distcode memory */
+ struct huffman lencode, distcode; /* length and distance codes */
+ static const short order[19] = /* permutation of code length codes */
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+ /* construct lencode and distcode */
+ lencode.count = lencnt;
+ lencode.symbol = lensym;
+ distcode.count = distcnt;
+ distcode.symbol = distsym;
+
+ /* get number of lengths in each table, check lengths */
+ nlen = bits(s, 5) + 257;
+ ndist = bits(s, 5) + 1;
+ ncode = bits(s, 4) + 4;
+ if (nlen > MAXLCODES || ndist > MAXDCODES)
+ return -3; /* bad counts */
+
+ /* read code length code lengths (really), missing lengths are zero */
+ for (index = 0; index < ncode; index++)
+ lengths[order[index]] = bits(s, 3);
+ for (; index < 19; index++)
+ lengths[order[index]] = 0;
+
+ /* build huffman table for code lengths codes (use lencode temporarily) */
+ err = construct(&lencode, lengths, 19);
+ if (err != 0) /* require complete code set here */
+ return -4;
+
+ /* read length/literal and distance code length tables */
+ index = 0;
+ while (index < nlen + ndist) {
+ int symbol; /* decoded value */
+ int len; /* last length to repeat */
+
+ symbol = decode(s, &lencode);
+ if (symbol < 0)
+ return symbol; /* invalid symbol */
+ if (symbol < 16) /* length in 0..15 */
+ lengths[index++] = symbol;
+ else { /* repeat instruction */
+ len = 0; /* assume repeating zeros */
+ if (symbol == 16) { /* repeat last length 3..6 times */
+ if (index == 0)
+ return -5; /* no last length! */
+ len = lengths[index - 1]; /* last length */
+ symbol = 3 + bits(s, 2);
+ }
+ else if (symbol == 17) /* repeat zero 3..10 times */
+ symbol = 3 + bits(s, 3);
+ else /* == 18, repeat zero 11..138 times */
+ symbol = 11 + bits(s, 7);
+ if (index + symbol > nlen + ndist)
+ return -6; /* too many lengths! */
+ while (symbol--) /* repeat last or zero symbol times */
+ lengths[index++] = len;
+ }
+ }
+
+ /* check for end-of-block code -- there better be one! */
+ if (lengths[256] == 0)
+ return -9;
+
+ /* build huffman table for literal/length codes */
+ err = construct(&lencode, lengths, nlen);
+ if (err && (err < 0 || nlen != lencode.count[0] + lencode.count[1]))
+ return -7; /* incomplete code ok only for single length 1 code */
+
+ /* build huffman table for distance codes */
+ err = construct(&distcode, lengths + nlen, ndist);
+ if (err && (err < 0 || ndist != distcode.count[0] + distcode.count[1]))
+ return -8; /* incomplete code ok only for single length 1 code */
+
+ /* decode data until end-of-block code */
+ return codes(s, &lencode, &distcode);
+}
+
+/*
+ * Inflate source to dest. On return, destlen and sourcelen are updated to the
+ * size of the uncompressed data and the size of the deflate data respectively.
+ * On success, the return value of puff() is zero. If there is an error in the
+ * source data, i.e. it is not in the deflate format, then a negative value is
+ * returned. If there is not enough input available or there is not enough
+ * output space, then a positive error is returned. In that case, destlen and
+ * sourcelen are not updated to facilitate retrying from the beginning with the
+ * provision of more input data or more output space. In the case of invalid
+ * inflate data (a negative error), the dest and source pointers are updated to
+ * facilitate the debugging of deflators.
+ *
+ * puff() also has a mode to determine the size of the uncompressed output with
+ * no output written. For this dest must be (unsigned char *)0. In this case,
+ * the input value of *destlen is ignored, and on return *destlen is set to the
+ * size of the uncompressed output.
+ *
+ * The return codes are:
+ *
+ * 2: available inflate data did not terminate
+ * 1: output space exhausted before completing inflate
+ * 0: successful inflate
+ * -1: invalid block type (type == 3)
+ * -2: stored block length did not match one's complement
+ * -3: dynamic block code description: too many length or distance codes
+ * -4: dynamic block code description: code lengths codes incomplete
+ * -5: dynamic block code description: repeat lengths with no first length
+ * -6: dynamic block code description: repeat more than specified lengths
+ * -7: dynamic block code description: invalid literal/length code lengths
+ * -8: dynamic block code description: invalid distance code lengths
+ * -9: dynamic block code description: missing end-of-block code
+ * -10: invalid literal/length or distance code in fixed or dynamic block
+ * -11: distance is too far back in fixed or dynamic block
+ *
+ * Format notes:
+ *
+ * - Three bits are read for each block to determine the kind of block and
+ * whether or not it is the last block. Then the block is decoded and the
+ * process repeated if it was not the last block.
+ *
+ * - The leftover bits in the last byte of the deflate data after the last
+ * block (if it was a fixed or dynamic block) are undefined and have no
+ * expected values to check.
+ */
+int puff(unsigned char *dest, /* pointer to destination pointer */
+ unsigned long *destlen, /* amount of output space */
+ const unsigned char *source, /* pointer to source data pointer */
+ unsigned long *sourcelen) /* amount of input available */
+{
+ struct state s; /* input/output state */
+ int last, type; /* block information */
+ int err; /* return value */
+
+ /* initialize output state */
+ s.out = dest;
+ s.outlen = *destlen; /* ignored if dest is NIL */
+ s.outcnt = 0;
+
+ /* initialize input state */
+ s.in = source;
+ s.inlen = *sourcelen;
+ s.incnt = 0;
+ s.bitbuf = 0;
+ s.bitcnt = 0;
+
+ /* return if bits() or decode() tries to read past available input */
+ if (setjmp(s.env) != 0) /* if came back here via longjmp() */
+ err = 2; /* then skip do-loop, return error */
+ else {
+ /* process blocks until last block or error */
+ do {
+ last = bits(&s, 1); /* one if last block */
+ type = bits(&s, 2); /* block type 0..3 */
+ err = type == 0 ?
+ stored(&s) :
+ (type == 1 ?
+ fixed(&s) :
+ (type == 2 ?
+ dynamic(&s) :
+ -1)); /* type == 3, invalid */
+ if (err != 0)
+ break; /* return with error */
+ } while (!last);
+ }
+
+ /* update the lengths and return */
+ if (err <= 0) {
+ *destlen = s.outcnt;
+ *sourcelen = s.incnt;
+ }
+ return err;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.h
new file mode 100644
index 000000000..e23a24543
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/puff.h
@@ -0,0 +1,35 @@
+/* puff.h
+ Copyright (C) 2002-2013 Mark Adler, all rights reserved
+ version 2.3, 21 Jan 2013
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Mark Adler madler@alumni.caltech.edu
+ */
+
+
+/*
+ * See puff.c for purpose and usage.
+ */
+#ifndef NIL
+# define NIL ((unsigned char *)0) /* for no output option */
+#endif
+
+int puff(unsigned char *dest, /* pointer to destination pointer */
+ unsigned long *destlen, /* amount of output space */
+ const unsigned char *source, /* pointer to source data pointer */
+ unsigned long *sourcelen); /* amount of input available */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/pufftest.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/pufftest.c
new file mode 100644
index 000000000..776481488
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/pufftest.c
@@ -0,0 +1,165 @@
+/*
+ * pufftest.c
+ * Copyright (C) 2002-2013 Mark Adler
+ * For conditions of distribution and use, see copyright notice in puff.h
+ * version 2.3, 21 Jan 2013
+ */
+
+/* Example of how to use puff().
+
+ Usage: puff [-w] [-f] [-nnn] file
+ ... | puff [-w] [-f] [-nnn]
+
+ where file is the input file with deflate data, nnn is the number of bytes
+ of input to skip before inflating (e.g. to skip a zlib or gzip header), and
+ -w is used to write the decompressed data to stdout. -f is for coverage
+ testing, and causes pufftest to fail with not enough output space (-f does
+ a write like -w, so -w is not required). */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include "puff.h"
+
+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
+# include <fcntl.h>
+# include <io.h>
+# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+
+#define local static
+
+/* Return size times approximately the cube root of 2, keeping the result as 1,
+ 3, or 5 times a power of 2 -- the result is always > size, until the result
+ is the maximum value of an unsigned long, where it remains. This is useful
+ to keep reallocations less than ~33% over the actual data. */
+local size_t bythirds(size_t size)
+{
+ int n;
+ size_t m;
+
+ m = size;
+ for (n = 0; m; n++)
+ m >>= 1;
+ if (n < 3)
+ return size + 1;
+ n -= 3;
+ m = size >> n;
+ m += m == 6 ? 2 : 1;
+ m <<= n;
+ return m > size ? m : (size_t)(-1);
+}
+
+/* Read the input file *name, or stdin if name is NULL, into allocated memory.
+ Reallocate to larger buffers until the entire file is read in. Return a
+ pointer to the allocated data, or NULL if there was a memory allocation
+ failure. *len is the number of bytes of data read from the input file (even
+ if load() returns NULL). If the input file was empty or could not be opened
+ or read, *len is zero. */
+local void *load(const char *name, size_t *len)
+{
+ size_t size;
+ void *buf, *swap;
+ FILE *in;
+
+ *len = 0;
+ buf = malloc(size = 4096);
+ if (buf == NULL)
+ return NULL;
+ in = name == NULL ? stdin : fopen(name, "rb");
+ if (in != NULL) {
+ for (;;) {
+ *len += fread((char *)buf + *len, 1, size - *len, in);
+ if (*len < size) break;
+ size = bythirds(size);
+ if (size == *len || (swap = realloc(buf, size)) == NULL) {
+ free(buf);
+ buf = NULL;
+ break;
+ }
+ buf = swap;
+ }
+ fclose(in);
+ }
+ return buf;
+}
+
+int main(int argc, char **argv)
+{
+ int ret, put = 0, fail = 0;
+ unsigned skip = 0;
+ char *arg, *name = NULL;
+ unsigned char *source = NULL, *dest;
+ size_t len = 0;
+ unsigned long sourcelen, destlen;
+
+ /* process arguments */
+ while (arg = *++argv, --argc)
+ if (arg[0] == '-') {
+ if (arg[1] == 'w' && arg[2] == 0)
+ put = 1;
+ else if (arg[1] == 'f' && arg[2] == 0)
+ fail = 1, put = 1;
+ else if (arg[1] >= '0' && arg[1] <= '9')
+ skip = (unsigned)atoi(arg + 1);
+ else {
+ fprintf(stderr, "invalid option %s\n", arg);
+ return 3;
+ }
+ }
+ else if (name != NULL) {
+ fprintf(stderr, "only one file name allowed\n");
+ return 3;
+ }
+ else
+ name = arg;
+ source = load(name, &len);
+ if (source == NULL) {
+ fprintf(stderr, "memory allocation failure\n");
+ return 4;
+ }
+ if (len == 0) {
+ fprintf(stderr, "could not read %s, or it was empty\n",
+ name == NULL ? "<stdin>" : name);
+ free(source);
+ return 3;
+ }
+ if (skip >= len) {
+ fprintf(stderr, "skip request of %d leaves no input\n", skip);
+ free(source);
+ return 3;
+ }
+
+ /* test inflate data with offset skip */
+ len -= skip;
+ sourcelen = (unsigned long)len;
+ ret = puff(NIL, &destlen, source + skip, &sourcelen);
+ if (ret)
+ fprintf(stderr, "puff() failed with return code %d\n", ret);
+ else {
+ fprintf(stderr, "puff() succeeded uncompressing %lu bytes\n", destlen);
+ if (sourcelen < len) fprintf(stderr, "%lu compressed bytes unused\n",
+ len - sourcelen);
+ }
+
+ /* if requested, inflate again and write decompressd data to stdout */
+ if (put && ret == 0) {
+ if (fail)
+ destlen >>= 1;
+ dest = malloc(destlen);
+ if (dest == NULL) {
+ fprintf(stderr, "memory allocation failure\n");
+ free(source);
+ return 4;
+ }
+ puff(dest, &destlen, source + skip, &sourcelen);
+ SET_BINARY_MODE(stdout);
+ fwrite(dest, 1, destlen, stdout);
+ free(dest);
+ }
+
+ /* clean up */
+ free(source);
+ return ret;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/zeros.raw b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/zeros.raw
new file mode 100644
index 000000000..0a90e76b3
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/puff/zeros.raw
Binary files differ
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.c
new file mode 100644
index 000000000..8626c92ad
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.c
@@ -0,0 +1,275 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <windows.h>
+
+#include "zlib.h"
+
+
+void MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
+{
+ R->HighPart = A.HighPart - B.HighPart;
+ if (A.LowPart >= B.LowPart)
+ R->LowPart = A.LowPart - B.LowPart;
+ else
+ {
+ R->LowPart = A.LowPart - B.LowPart;
+ R->HighPart --;
+ }
+}
+
+#ifdef _M_X64
+// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
+unsigned __int64 __rdtsc(void);
+void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
+{
+ // printf("rdtsc = %I64x\n",__rdtsc());
+ pbeginTime64->QuadPart=__rdtsc();
+}
+
+LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
+{
+ LARGE_INTEGER LIres;
+ unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
+ LIres.QuadPart=res;
+ // printf("rdtsc = %I64x\n",__rdtsc());
+ return LIres;
+}
+#else
+#ifdef _M_IX86
+void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
+{
+ DWORD dwEdx,dwEax;
+ _asm
+ {
+ rdtsc
+ mov dwEax,eax
+ mov dwEdx,edx
+ }
+ pbeginTime64->LowPart=dwEax;
+ pbeginTime64->HighPart=dwEdx;
+}
+
+void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
+{
+ myGetRDTSC32(pbeginTime64);
+}
+
+LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
+{
+ LARGE_INTEGER LIres,endTime64;
+ myGetRDTSC32(&endTime64);
+
+ LIres.LowPart=LIres.HighPart=0;
+ MyDoMinus64(&LIres,endTime64,beginTime64);
+ return LIres;
+}
+#else
+void myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
+{
+}
+
+void BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
+{
+}
+
+LARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
+{
+ LARGE_INTEGER lr;
+ lr.QuadPart=0;
+ return lr;
+}
+#endif
+#endif
+
+void BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
+{
+ if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
+ {
+ pbeginTime64->LowPart = GetTickCount();
+ pbeginTime64->HighPart = 0;
+ }
+}
+
+DWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
+{
+ LARGE_INTEGER endTime64,ticksPerSecond,ticks;
+ DWORDLONG ticksShifted,tickSecShifted;
+ DWORD dwLog=16+0;
+ DWORD dwRet;
+ if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
+ dwRet = (GetTickCount() - beginTime64.LowPart)*1;
+ else
+ {
+ MyDoMinus64(&ticks,endTime64,beginTime64);
+ QueryPerformanceFrequency(&ticksPerSecond);
+
+
+ {
+ ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
+ tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
+
+ }
+
+ dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
+ dwRet *=1;
+ }
+ return dwRet;
+}
+
+int ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
+{
+ FILE* stream;
+ unsigned char* ptr;
+ int retVal=1;
+ stream=fopen(filename, "rb");
+ if (stream==NULL)
+ return 0;
+
+ fseek(stream,0,SEEK_END);
+
+ *plFileSize=ftell(stream);
+ fseek(stream,0,SEEK_SET);
+ ptr=malloc((*plFileSize)+1);
+ if (ptr==NULL)
+ retVal=0;
+ else
+ {
+ if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
+ retVal=0;
+ }
+ fclose(stream);
+ *pFilePtr=ptr;
+ return retVal;
+}
+
+int main(int argc, char *argv[])
+{
+ int BlockSizeCompress=0x8000;
+ int BlockSizeUncompress=0x8000;
+ int cprLevel=Z_DEFAULT_COMPRESSION ;
+ long lFileSize;
+ unsigned char* FilePtr;
+ long lBufferSizeCpr;
+ long lBufferSizeUncpr;
+ long lCompressedSize=0;
+ unsigned char* CprPtr;
+ unsigned char* UncprPtr;
+ long lSizeCpr,lSizeUncpr;
+ DWORD dwGetTick,dwMsecQP;
+ LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
+
+ if (argc<=1)
+ {
+ printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
+ return 0;
+ }
+
+ if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
+ {
+ printf("error reading %s\n",argv[1]);
+ return 1;
+ }
+ else printf("file %s read, %u bytes\n",argv[1],lFileSize);
+
+ if (argc>=3)
+ BlockSizeCompress=atol(argv[2]);
+
+ if (argc>=4)
+ BlockSizeUncompress=atol(argv[3]);
+
+ if (argc>=5)
+ cprLevel=(int)atol(argv[4]);
+
+ lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
+ lBufferSizeUncpr = lBufferSizeCpr;
+
+ CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
+
+ BeginCountPerfCounter(&li_qp,TRUE);
+ dwGetTick=GetTickCount();
+ BeginCountRdtsc(&li_rdtsc);
+ {
+ z_stream zcpr;
+ int ret=Z_OK;
+ long lOrigToDo = lFileSize;
+ long lOrigDone = 0;
+ int step=0;
+ memset(&zcpr,0,sizeof(z_stream));
+ deflateInit(&zcpr,cprLevel);
+
+ zcpr.next_in = FilePtr;
+ zcpr.next_out = CprPtr;
+
+
+ do
+ {
+ long all_read_before = zcpr.total_in;
+ zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
+ zcpr.avail_out = BlockSizeCompress;
+ ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
+ lOrigDone += (zcpr.total_in-all_read_before);
+ lOrigToDo -= (zcpr.total_in-all_read_before);
+ step++;
+ } while (ret==Z_OK);
+
+ lSizeCpr=zcpr.total_out;
+ deflateEnd(&zcpr);
+ dwGetTick=GetTickCount()-dwGetTick;
+ dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
+ dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
+ printf("total compress size = %u, in %u step\n",lSizeCpr,step);
+ printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
+ printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
+ printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
+ }
+
+ CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
+ UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
+
+ BeginCountPerfCounter(&li_qp,TRUE);
+ dwGetTick=GetTickCount();
+ BeginCountRdtsc(&li_rdtsc);
+ {
+ z_stream zcpr;
+ int ret=Z_OK;
+ long lOrigToDo = lSizeCpr;
+ long lOrigDone = 0;
+ int step=0;
+ memset(&zcpr,0,sizeof(z_stream));
+ inflateInit(&zcpr);
+
+ zcpr.next_in = CprPtr;
+ zcpr.next_out = UncprPtr;
+
+
+ do
+ {
+ long all_read_before = zcpr.total_in;
+ zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
+ zcpr.avail_out = BlockSizeUncompress;
+ ret=inflate(&zcpr,Z_SYNC_FLUSH);
+ lOrigDone += (zcpr.total_in-all_read_before);
+ lOrigToDo -= (zcpr.total_in-all_read_before);
+ step++;
+ } while (ret==Z_OK);
+
+ lSizeUncpr=zcpr.total_out;
+ inflateEnd(&zcpr);
+ dwGetTick=GetTickCount()-dwGetTick;
+ dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
+ dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
+ printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
+ printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
+ printf("uncpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
+ printf("uncpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
+ }
+
+ if (lSizeUncpr==lFileSize)
+ {
+ if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
+ printf("compare ok\n");
+
+ }
+
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.txt
new file mode 100644
index 000000000..e508bb22f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/testzlib/testzlib.txt
@@ -0,0 +1,10 @@
+To build testzLib with Visual Studio 2005:
+
+copy to a directory file from :
+- root of zLib tree
+- contrib/testzlib
+- contrib/masmx86
+- contrib/masmx64
+- contrib/vstudio/vc7
+
+and open testzlib8.sln \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile
new file mode 100644
index 000000000..b54266fba
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile
@@ -0,0 +1,14 @@
+CC=cc
+CFLAGS=-g
+
+untgz: untgz.o ../../libz.a
+ $(CC) $(CFLAGS) -o untgz untgz.o -L../.. -lz
+
+untgz.o: untgz.c ../../zlib.h
+ $(CC) $(CFLAGS) -c -I../.. untgz.c
+
+../../libz.a:
+ cd ../..; ./configure; make
+
+clean:
+ rm -f untgz untgz.o *~
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile.msc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile.msc
new file mode 100644
index 000000000..77b860221
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/Makefile.msc
@@ -0,0 +1,17 @@
+CC=cl
+CFLAGS=-MD
+
+untgz.exe: untgz.obj ..\..\zlib.lib
+ $(CC) $(CFLAGS) untgz.obj ..\..\zlib.lib
+
+untgz.obj: untgz.c ..\..\zlib.h
+ $(CC) $(CFLAGS) -c -I..\.. untgz.c
+
+..\..\zlib.lib:
+ cd ..\..
+ $(MAKE) -f win32\makefile.msc
+ cd contrib\untgz
+
+clean:
+ -del untgz.obj
+ -del untgz.exe
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/untgz.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/untgz.c
new file mode 100644
index 000000000..2c391e598
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/untgz/untgz.c
@@ -0,0 +1,674 @@
+/*
+ * untgz.c -- Display contents and extract files from a gzip'd TAR file
+ *
+ * written by Pedro A. Aranda Gutierrez <paag@tid.es>
+ * adaptation to Unix by Jean-loup Gailly <jloup@gzip.org>
+ * various fixes by Cosmin Truta <cosmint@cs.ubbcluj.ro>
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <errno.h>
+
+#include "zlib.h"
+
+#ifdef unix
+# include <unistd.h>
+#else
+# include <direct.h>
+# include <io.h>
+#endif
+
+#ifdef WIN32
+#include <windows.h>
+# ifndef F_OK
+# define F_OK 0
+# endif
+# define mkdir(dirname,mode) _mkdir(dirname)
+# ifdef _MSC_VER
+# define access(path,mode) _access(path,mode)
+# define chmod(path,mode) _chmod(path,mode)
+# define strdup(str) _strdup(str)
+# endif
+#else
+# include <utime.h>
+#endif
+
+
+/* values used in typeflag field */
+
+#define REGTYPE '0' /* regular file */
+#define AREGTYPE '\0' /* regular file */
+#define LNKTYPE '1' /* link */
+#define SYMTYPE '2' /* reserved */
+#define CHRTYPE '3' /* character special */
+#define BLKTYPE '4' /* block special */
+#define DIRTYPE '5' /* directory */
+#define FIFOTYPE '6' /* FIFO special */
+#define CONTTYPE '7' /* reserved */
+
+/* GNU tar extensions */
+
+#define GNUTYPE_DUMPDIR 'D' /* file names from dumped directory */
+#define GNUTYPE_LONGLINK 'K' /* long link name */
+#define GNUTYPE_LONGNAME 'L' /* long file name */
+#define GNUTYPE_MULTIVOL 'M' /* continuation of file from another volume */
+#define GNUTYPE_NAMES 'N' /* file name that does not fit into main hdr */
+#define GNUTYPE_SPARSE 'S' /* sparse file */
+#define GNUTYPE_VOLHDR 'V' /* tape/volume header */
+
+
+/* tar header */
+
+#define BLOCKSIZE 512
+#define SHORTNAMESIZE 100
+
+struct tar_header
+{ /* byte offset */
+ char name[100]; /* 0 */
+ char mode[8]; /* 100 */
+ char uid[8]; /* 108 */
+ char gid[8]; /* 116 */
+ char size[12]; /* 124 */
+ char mtime[12]; /* 136 */
+ char chksum[8]; /* 148 */
+ char typeflag; /* 156 */
+ char linkname[100]; /* 157 */
+ char magic[6]; /* 257 */
+ char version[2]; /* 263 */
+ char uname[32]; /* 265 */
+ char gname[32]; /* 297 */
+ char devmajor[8]; /* 329 */
+ char devminor[8]; /* 337 */
+ char prefix[155]; /* 345 */
+ /* 500 */
+};
+
+union tar_buffer
+{
+ char buffer[BLOCKSIZE];
+ struct tar_header header;
+};
+
+struct attr_item
+{
+ struct attr_item *next;
+ char *fname;
+ int mode;
+ time_t time;
+};
+
+enum { TGZ_EXTRACT, TGZ_LIST, TGZ_INVALID };
+
+char *TGZfname OF((const char *));
+void TGZnotfound OF((const char *));
+
+int getoct OF((char *, int));
+char *strtime OF((time_t *));
+int setfiletime OF((char *, time_t));
+void push_attr OF((struct attr_item **, char *, int, time_t));
+void restore_attr OF((struct attr_item **));
+
+int ExprMatch OF((char *, char *));
+
+int makedir OF((char *));
+int matchname OF((int, int, char **, char *));
+
+void error OF((const char *));
+int tar OF((gzFile, int, int, int, char **));
+
+void help OF((int));
+int main OF((int, char **));
+
+char *prog;
+
+const char *TGZsuffix[] = { "\0", ".tar", ".tar.gz", ".taz", ".tgz", NULL };
+
+/* return the file name of the TGZ archive */
+/* or NULL if it does not exist */
+
+char *TGZfname (const char *arcname)
+{
+ static char buffer[1024];
+ int origlen,i;
+
+ strcpy(buffer,arcname);
+ origlen = strlen(buffer);
+
+ for (i=0; TGZsuffix[i]; i++)
+ {
+ strcpy(buffer+origlen,TGZsuffix[i]);
+ if (access(buffer,F_OK) == 0)
+ return buffer;
+ }
+ return NULL;
+}
+
+
+/* error message for the filename */
+
+void TGZnotfound (const char *arcname)
+{
+ int i;
+
+ fprintf(stderr,"%s: Couldn't find ",prog);
+ for (i=0;TGZsuffix[i];i++)
+ fprintf(stderr,(TGZsuffix[i+1]) ? "%s%s, " : "or %s%s\n",
+ arcname,
+ TGZsuffix[i]);
+ exit(1);
+}
+
+
+/* convert octal digits to int */
+/* on error return -1 */
+
+int getoct (char *p,int width)
+{
+ int result = 0;
+ char c;
+
+ while (width--)
+ {
+ c = *p++;
+ if (c == 0)
+ break;
+ if (c == ' ')
+ continue;
+ if (c < '0' || c > '7')
+ return -1;
+ result = result * 8 + (c - '0');
+ }
+ return result;
+}
+
+
+/* convert time_t to string */
+/* use the "YYYY/MM/DD hh:mm:ss" format */
+
+char *strtime (time_t *t)
+{
+ struct tm *local;
+ static char result[32];
+
+ local = localtime(t);
+ sprintf(result,"%4d/%02d/%02d %02d:%02d:%02d",
+ local->tm_year+1900, local->tm_mon+1, local->tm_mday,
+ local->tm_hour, local->tm_min, local->tm_sec);
+ return result;
+}
+
+
+/* set file time */
+
+int setfiletime (char *fname,time_t ftime)
+{
+#ifdef WIN32
+ static int isWinNT = -1;
+ SYSTEMTIME st;
+ FILETIME locft, modft;
+ struct tm *loctm;
+ HANDLE hFile;
+ int result;
+
+ loctm = localtime(&ftime);
+ if (loctm == NULL)
+ return -1;
+
+ st.wYear = (WORD)loctm->tm_year + 1900;
+ st.wMonth = (WORD)loctm->tm_mon + 1;
+ st.wDayOfWeek = (WORD)loctm->tm_wday;
+ st.wDay = (WORD)loctm->tm_mday;
+ st.wHour = (WORD)loctm->tm_hour;
+ st.wMinute = (WORD)loctm->tm_min;
+ st.wSecond = (WORD)loctm->tm_sec;
+ st.wMilliseconds = 0;
+ if (!SystemTimeToFileTime(&st, &locft) ||
+ !LocalFileTimeToFileTime(&locft, &modft))
+ return -1;
+
+ if (isWinNT < 0)
+ isWinNT = (GetVersion() < 0x80000000) ? 1 : 0;
+ hFile = CreateFile(fname, GENERIC_WRITE, 0, NULL, OPEN_EXISTING,
+ (isWinNT ? FILE_FLAG_BACKUP_SEMANTICS : 0),
+ NULL);
+ if (hFile == INVALID_HANDLE_VALUE)
+ return -1;
+ result = SetFileTime(hFile, NULL, NULL, &modft) ? 0 : -1;
+ CloseHandle(hFile);
+ return result;
+#else
+ struct utimbuf settime;
+
+ settime.actime = settime.modtime = ftime;
+ return utime(fname,&settime);
+#endif
+}
+
+
+/* push file attributes */
+
+void push_attr(struct attr_item **list,char *fname,int mode,time_t time)
+{
+ struct attr_item *item;
+
+ item = (struct attr_item *)malloc(sizeof(struct attr_item));
+ if (item == NULL)
+ error("Out of memory");
+ item->fname = strdup(fname);
+ item->mode = mode;
+ item->time = time;
+ item->next = *list;
+ *list = item;
+}
+
+
+/* restore file attributes */
+
+void restore_attr(struct attr_item **list)
+{
+ struct attr_item *item, *prev;
+
+ for (item = *list; item != NULL; )
+ {
+ setfiletime(item->fname,item->time);
+ chmod(item->fname,item->mode);
+ prev = item;
+ item = item->next;
+ free(prev);
+ }
+ *list = NULL;
+}
+
+
+/* match regular expression */
+
+#define ISSPECIAL(c) (((c) == '*') || ((c) == '/'))
+
+int ExprMatch (char *string,char *expr)
+{
+ while (1)
+ {
+ if (ISSPECIAL(*expr))
+ {
+ if (*expr == '/')
+ {
+ if (*string != '\\' && *string != '/')
+ return 0;
+ string ++; expr++;
+ }
+ else if (*expr == '*')
+ {
+ if (*expr ++ == 0)
+ return 1;
+ while (*++string != *expr)
+ if (*string == 0)
+ return 0;
+ }
+ }
+ else
+ {
+ if (*string != *expr)
+ return 0;
+ if (*expr++ == 0)
+ return 1;
+ string++;
+ }
+ }
+}
+
+
+/* recursive mkdir */
+/* abort on ENOENT; ignore other errors like "directory already exists" */
+/* return 1 if OK */
+/* 0 on error */
+
+int makedir (char *newdir)
+{
+ char *buffer = strdup(newdir);
+ char *p;
+ int len = strlen(buffer);
+
+ if (len <= 0) {
+ free(buffer);
+ return 0;
+ }
+ if (buffer[len-1] == '/') {
+ buffer[len-1] = '\0';
+ }
+ if (mkdir(buffer, 0755) == 0)
+ {
+ free(buffer);
+ return 1;
+ }
+
+ p = buffer+1;
+ while (1)
+ {
+ char hold;
+
+ while(*p && *p != '\\' && *p != '/')
+ p++;
+ hold = *p;
+ *p = 0;
+ if ((mkdir(buffer, 0755) == -1) && (errno == ENOENT))
+ {
+ fprintf(stderr,"%s: Couldn't create directory %s\n",prog,buffer);
+ free(buffer);
+ return 0;
+ }
+ if (hold == 0)
+ break;
+ *p++ = hold;
+ }
+ free(buffer);
+ return 1;
+}
+
+
+int matchname (int arg,int argc,char **argv,char *fname)
+{
+ if (arg == argc) /* no arguments given (untgz tgzarchive) */
+ return 1;
+
+ while (arg < argc)
+ if (ExprMatch(fname,argv[arg++]))
+ return 1;
+
+ return 0; /* ignore this for the moment being */
+}
+
+
+/* tar file list or extract */
+
+int tar (gzFile in,int action,int arg,int argc,char **argv)
+{
+ union tar_buffer buffer;
+ int len;
+ int err;
+ int getheader = 1;
+ int remaining = 0;
+ FILE *outfile = NULL;
+ char fname[BLOCKSIZE];
+ int tarmode;
+ time_t tartime;
+ struct attr_item *attributes = NULL;
+
+ if (action == TGZ_LIST)
+ printf(" date time size file\n"
+ " ---------- -------- --------- -------------------------------------\n");
+ while (1)
+ {
+ len = gzread(in, &buffer, BLOCKSIZE);
+ if (len < 0)
+ error(gzerror(in, &err));
+ /*
+ * Always expect complete blocks to process
+ * the tar information.
+ */
+ if (len != BLOCKSIZE)
+ {
+ action = TGZ_INVALID; /* force error exit */
+ remaining = 0; /* force I/O cleanup */
+ }
+
+ /*
+ * If we have to get a tar header
+ */
+ if (getheader >= 1)
+ {
+ /*
+ * if we met the end of the tar
+ * or the end-of-tar block,
+ * we are done
+ */
+ if (len == 0 || buffer.header.name[0] == 0)
+ break;
+
+ tarmode = getoct(buffer.header.mode,8);
+ tartime = (time_t)getoct(buffer.header.mtime,12);
+ if (tarmode == -1 || tartime == (time_t)-1)
+ {
+ buffer.header.name[0] = 0;
+ action = TGZ_INVALID;
+ }
+
+ if (getheader == 1)
+ {
+ strncpy(fname,buffer.header.name,SHORTNAMESIZE);
+ if (fname[SHORTNAMESIZE-1] != 0)
+ fname[SHORTNAMESIZE] = 0;
+ }
+ else
+ {
+ /*
+ * The file name is longer than SHORTNAMESIZE
+ */
+ if (strncmp(fname,buffer.header.name,SHORTNAMESIZE-1) != 0)
+ error("bad long name");
+ getheader = 1;
+ }
+
+ /*
+ * Act according to the type flag
+ */
+ switch (buffer.header.typeflag)
+ {
+ case DIRTYPE:
+ if (action == TGZ_LIST)
+ printf(" %s <dir> %s\n",strtime(&tartime),fname);
+ if (action == TGZ_EXTRACT)
+ {
+ makedir(fname);
+ push_attr(&attributes,fname,tarmode,tartime);
+ }
+ break;
+ case REGTYPE:
+ case AREGTYPE:
+ remaining = getoct(buffer.header.size,12);
+ if (remaining == -1)
+ {
+ action = TGZ_INVALID;
+ break;
+ }
+ if (action == TGZ_LIST)
+ printf(" %s %9d %s\n",strtime(&tartime),remaining,fname);
+ else if (action == TGZ_EXTRACT)
+ {
+ if (matchname(arg,argc,argv,fname))
+ {
+ outfile = fopen(fname,"wb");
+ if (outfile == NULL) {
+ /* try creating directory */
+ char *p = strrchr(fname, '/');
+ if (p != NULL) {
+ *p = '\0';
+ makedir(fname);
+ *p = '/';
+ outfile = fopen(fname,"wb");
+ }
+ }
+ if (outfile != NULL)
+ printf("Extracting %s\n",fname);
+ else
+ fprintf(stderr, "%s: Couldn't create %s",prog,fname);
+ }
+ else
+ outfile = NULL;
+ }
+ getheader = 0;
+ break;
+ case GNUTYPE_LONGLINK:
+ case GNUTYPE_LONGNAME:
+ remaining = getoct(buffer.header.size,12);
+ if (remaining < 0 || remaining >= BLOCKSIZE)
+ {
+ action = TGZ_INVALID;
+ break;
+ }
+ len = gzread(in, fname, BLOCKSIZE);
+ if (len < 0)
+ error(gzerror(in, &err));
+ if (fname[BLOCKSIZE-1] != 0 || (int)strlen(fname) > remaining)
+ {
+ action = TGZ_INVALID;
+ break;
+ }
+ getheader = 2;
+ break;
+ default:
+ if (action == TGZ_LIST)
+ printf(" %s <---> %s\n",strtime(&tartime),fname);
+ break;
+ }
+ }
+ else
+ {
+ unsigned int bytes = (remaining > BLOCKSIZE) ? BLOCKSIZE : remaining;
+
+ if (outfile != NULL)
+ {
+ if (fwrite(&buffer,sizeof(char),bytes,outfile) != bytes)
+ {
+ fprintf(stderr,
+ "%s: Error writing %s -- skipping\n",prog,fname);
+ fclose(outfile);
+ outfile = NULL;
+ remove(fname);
+ }
+ }
+ remaining -= bytes;
+ }
+
+ if (remaining == 0)
+ {
+ getheader = 1;
+ if (outfile != NULL)
+ {
+ fclose(outfile);
+ outfile = NULL;
+ if (action != TGZ_INVALID)
+ push_attr(&attributes,fname,tarmode,tartime);
+ }
+ }
+
+ /*
+ * Abandon if errors are found
+ */
+ if (action == TGZ_INVALID)
+ {
+ error("broken archive");
+ break;
+ }
+ }
+
+ /*
+ * Restore file modes and time stamps
+ */
+ restore_attr(&attributes);
+
+ if (gzclose(in) != Z_OK)
+ error("failed gzclose");
+
+ return 0;
+}
+
+
+/* ============================================================ */
+
+void help(int exitval)
+{
+ printf("untgz version 0.2.1\n"
+ " using zlib version %s\n\n",
+ zlibVersion());
+ printf("Usage: untgz file.tgz extract all files\n"
+ " untgz file.tgz fname ... extract selected files\n"
+ " untgz -l file.tgz list archive contents\n"
+ " untgz -h display this help\n");
+ exit(exitval);
+}
+
+void error(const char *msg)
+{
+ fprintf(stderr, "%s: %s\n", prog, msg);
+ exit(1);
+}
+
+
+/* ============================================================ */
+
+#if defined(WIN32) && defined(__GNUC__)
+int _CRT_glob = 0; /* disable argument globbing in MinGW */
+#endif
+
+int main(int argc,char **argv)
+{
+ int action = TGZ_EXTRACT;
+ int arg = 1;
+ char *TGZfile;
+ gzFile *f;
+
+ prog = strrchr(argv[0],'\\');
+ if (prog == NULL)
+ {
+ prog = strrchr(argv[0],'/');
+ if (prog == NULL)
+ {
+ prog = strrchr(argv[0],':');
+ if (prog == NULL)
+ prog = argv[0];
+ else
+ prog++;
+ }
+ else
+ prog++;
+ }
+ else
+ prog++;
+
+ if (argc == 1)
+ help(0);
+
+ if (strcmp(argv[arg],"-l") == 0)
+ {
+ action = TGZ_LIST;
+ if (argc == ++arg)
+ help(0);
+ }
+ else if (strcmp(argv[arg],"-h") == 0)
+ {
+ help(0);
+ }
+
+ if ((TGZfile = TGZfname(argv[arg])) == NULL)
+ TGZnotfound(argv[arg]);
+
+ ++arg;
+ if ((action == TGZ_LIST) && (arg != argc))
+ help(1);
+
+/*
+ * Process the TGZ file
+ */
+ switch(action)
+ {
+ case TGZ_LIST:
+ case TGZ_EXTRACT:
+ f = gzopen(TGZfile,"rb");
+ if (f == NULL)
+ {
+ fprintf(stderr,"%s: Couldn't gzopen %s\n",prog,TGZfile);
+ return 1;
+ }
+ exit(tar(f, action, arg, argc, argv));
+ break;
+
+ default:
+ error("Unknown option");
+ exit(1);
+ }
+
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/readme.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/readme.txt
new file mode 100644
index 000000000..48cccc0d2
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/readme.txt
@@ -0,0 +1,78 @@
+Building instructions for the DLL versions of Zlib 1.2.11
+========================================================
+
+This directory contains projects that build zlib and minizip using
+Microsoft Visual C++ 9.0/10.0.
+
+You don't need to build these projects yourself. You can download the
+binaries from:
+ http://www.winimage.com/zLibDll
+
+More information can be found at this site.
+
+
+
+
+
+Build instructions for Visual Studio 2008 (32 bits or 64 bits)
+--------------------------------------------------------------
+- Decompress current zlib, including all contrib/* files
+- Compile assembly code (with Visual Studio Command Prompt) by running:
+ bld_ml64.bat (in contrib\masmx64)
+ bld_ml32.bat (in contrib\masmx86)
+- Open contrib\vstudio\vc9\zlibvc.sln with Microsoft Visual C++ 2008
+- Or run: vcbuild /rebuild contrib\vstudio\vc9\zlibvc.sln "Release|Win32"
+
+Build instructions for Visual Studio 2010 (32 bits or 64 bits)
+--------------------------------------------------------------
+- Decompress current zlib, including all contrib/* files
+- Open contrib\vstudio\vc10\zlibvc.sln with Microsoft Visual C++ 2010
+
+Build instructions for Visual Studio 2012 (32 bits or 64 bits)
+--------------------------------------------------------------
+- Decompress current zlib, including all contrib/* files
+- Open contrib\vstudio\vc11\zlibvc.sln with Microsoft Visual C++ 2012
+
+Build instructions for Visual Studio 2013 (32 bits or 64 bits)
+--------------------------------------------------------------
+- Decompress current zlib, including all contrib/* files
+- Open contrib\vstudio\vc12\zlibvc.sln with Microsoft Visual C++ 2013
+
+Build instructions for Visual Studio 2015 (32 bits or 64 bits)
+--------------------------------------------------------------
+- Decompress current zlib, including all contrib/* files
+- Open contrib\vstudio\vc14\zlibvc.sln with Microsoft Visual C++ 2015
+
+
+Important
+---------
+- To use zlibwapi.dll in your application, you must define the
+ macro ZLIB_WINAPI when compiling your application's source files.
+
+
+Additional notes
+----------------
+- This DLL, named zlibwapi.dll, is compatible to the old zlib.dll built
+ by Gilles Vollant from the zlib 1.1.x sources, and distributed at
+ http://www.winimage.com/zLibDll
+ It uses the WINAPI calling convention for the exported functions, and
+ includes the minizip functionality. If your application needs that
+ particular build of zlib.dll, you can rename zlibwapi.dll to zlib.dll.
+
+- The new DLL was renamed because there exist several incompatible
+ versions of zlib.dll on the Internet.
+
+- There is also an official DLL build of zlib, named zlib1.dll. This one
+ is exporting the functions using the CDECL convention. See the file
+ win32\DLL_FAQ.txt found in this zlib distribution.
+
+- There used to be a ZLIB_DLL macro in zlib 1.1.x, but now this symbol
+ has a slightly different effect. To avoid compatibility problems, do
+ not define it here.
+
+
+Gilles Vollant
+info@winimage.com
+
+Visual Studio 2013 and 2015 Projects from Sean Hunt
+seandhunt_7@yahoo.com
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj
new file mode 100644
index 000000000..74e15c90d
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694382A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\miniunz.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj.filters b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj.filters
new file mode 100644
index 000000000..0b2a3de2d
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/miniunz.vcxproj.filters
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{048af943-022b-4db6-beeb-a54c34774ee2}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{c1d600d2-888f-4aea-b73e-8b0dd9befa0c}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{0844199a-966b-4f19-81db-1e0125e141b9}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\miniunz.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj
new file mode 100644
index 000000000..917e15652
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj
@@ -0,0 +1,307 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\minizip.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj.filters b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj.filters
new file mode 100644
index 000000000..dd73cd313
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/minizip.vcxproj.filters
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{c0419b40-bf50-40da-b153-ff74215b79de}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{bb87b070-735b-478e-92ce-7383abb2f36c}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{f46ab6a6-548f-43cb-ae96-681abb5bd5db}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\minizip.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj
new file mode 100644
index 000000000..9088d176f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj
@@ -0,0 +1,420 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <RootNamespace>testzlib</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj.filters b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj.filters
new file mode 100644
index 000000000..249daa89c
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlib.vcxproj.filters
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{c1f6a2e3-5da5-4955-8653-310d3efe05a9}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{c2aaffdc-2c95-4d6f-8466-4bec5890af2c}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{c274fe07-05f2-461c-964b-f6341e4e7eb5}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\compress.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\crc32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\deflate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\infback.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inflate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inftrees.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\testzlib\testzlib.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\trees.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\uncompr.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj
new file mode 100644
index 000000000..bcb08ff95
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj
@@ -0,0 +1,310 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694366A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj.filters b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj.filters
new file mode 100644
index 000000000..53a8693bb
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/testzlibdll.vcxproj.filters
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{fa61a89f-93fc-4c89-b29e-36224b7592f4}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;def;odl;idl;hpj;bat;asm</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{d4b85da0-2ba2-4934-b57f-e2584e3848ee}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;inc</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{e573e075-00bd-4a7d-bd67-a8cc9bfc5aca}</UniqueIdentifier>
+ <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\testzlib\testzlib.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlib.rc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlib.rc
new file mode 100644
index 000000000..c4e4b016e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1 1
+IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0
+ FILEOS VOS_DOS_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0 // not used
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+
+ BEGIN
+ VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
+ VALUE "FileVersion", "1.2.11\0"
+ VALUE "InternalName", "zlib\0"
+ VALUE "OriginalFilename", "zlibwapi.dll\0"
+ VALUE "ProductName", "ZLib.DLL\0"
+ VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj
new file mode 100644
index 000000000..b9f2bbe5f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj
@@ -0,0 +1,473 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c" />
+ <ClCompile Include="..\..\minizip\zip.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj.filters b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj.filters
new file mode 100644
index 000000000..c8c7f7ea3
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibstat.vcxproj.filters
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{174213f6-7f66-4ae8-a3a8-a1e0a1e6ffdd}</UniqueIdentifier>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\compress.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\crc32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\deflate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzclose.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzlib.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzread.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzwrite.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\infback.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inflate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inftrees.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\ioapi.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\trees.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\uncompr.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\unzip.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\zip.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc">
+ <Filter>Source Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.def b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.def
new file mode 100644
index 000000000..f876c3bca
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.def
@@ -0,0 +1,153 @@
+LIBRARY
+; zlib data compression and ZIP file I/O library
+
+VERSION 1.2
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+ inflateCopy @42
+ inflateBackInit_ @43
+ inflateBack @44
+ inflateBackEnd @45
+ compressBound @46
+ deflateBound @47
+ gzclearerr @48
+ gzungetc @49
+ zlibCompileFlags @50
+ deflatePrime @51
+ deflatePending @52
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unzOpenCurrentFile3 @69
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+ unzOpen2 @77
+ unzOpenCurrentFile2 @78
+ unzOpenCurrentFilePassword @79
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
+ zipOpenNewFileInZip2 @86
+ zipCloseFileInZipRaw @87
+ zipOpen2 @88
+ zipOpenNewFileInZip3 @89
+
+ unzGetFilePos @100
+ unzGoToFilePos @101
+
+ fill_win32_filefunc @110
+
+; zlibwapi v1.2.4 added:
+ fill_win32_filefunc64 @111
+ fill_win32_filefunc64A @112
+ fill_win32_filefunc64W @113
+
+ unzOpen64 @120
+ unzOpen2_64 @121
+ unzGetGlobalInfo64 @122
+ unzGetCurrentFileInfo64 @124
+ unzGetCurrentFileZStreamPos64 @125
+ unztell64 @126
+ unzGetFilePos64 @127
+ unzGoToFilePos64 @128
+
+ zipOpen64 @130
+ zipOpen2_64 @131
+ zipOpenNewFileInZip64 @132
+ zipOpenNewFileInZip2_64 @133
+ zipOpenNewFileInZip3_64 @134
+ zipOpenNewFileInZip4_64 @135
+ zipCloseFileInZipRaw64 @136
+
+; zlib1 v1.2.4 added:
+ adler32_combine @140
+ crc32_combine @142
+ deflateSetHeader @144
+ deflateTune @145
+ gzbuffer @146
+ gzclose_r @147
+ gzclose_w @148
+ gzdirect @149
+ gzoffset @150
+ inflateGetHeader @156
+ inflateMark @157
+ inflatePrime @158
+ inflateReset2 @159
+ inflateUndermine @160
+
+; zlib1 v1.2.6 added:
+ gzgetc_ @161
+ inflateResetKeep @163
+ deflateResetKeep @164
+
+; zlib1 v1.2.7 added:
+ gzopen_w @165
+
+; zlib1 v1.2.8 added:
+ inflateGetDictionary @166
+ gzvprintf @167
+
+; zlib1 v1.2.9 added:
+ inflateCodesUsed @168
+ inflateValidate @169
+ uncompress2 @170
+ gzfread @171
+ gzfwrite @172
+ deflateGetDictionary @173
+ adler32_z @174
+ crc32_z @175
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.sln b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.sln
new file mode 100644
index 000000000..6f6ffd5ee
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.sln
@@ -0,0 +1,135 @@
+
+Microsoft Visual Studio Solution File, Format Version 11.00
+# Visual Studio 2010
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Itanium = Debug|Itanium
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Itanium = Release|Itanium
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium
+ ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
+ ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj
new file mode 100644
index 000000000..6ff9ddb07
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj
@@ -0,0 +1,657 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8FD826F8-3739-44E6-8CC8-997122E53B8D}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">zlibwapid</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">zlibwapid</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">zlibwapi</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>EditAndContinue</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <GenerateMapFile>true</GenerateMapFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <GenerateMapFile>true</GenerateMapFile>
+ <SubSystem>Windows</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <SubSystem>Windows</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <SubSystem>Windows</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\minizip\iowin32.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\zip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\deflate.h" />
+ <ClInclude Include="..\..\..\infblock.h" />
+ <ClInclude Include="..\..\..\infcodes.h" />
+ <ClInclude Include="..\..\..\inffast.h" />
+ <ClInclude Include="..\..\..\inftrees.h" />
+ <ClInclude Include="..\..\..\infutil.h" />
+ <ClInclude Include="..\..\..\zconf.h" />
+ <ClInclude Include="..\..\..\zlib.h" />
+ <ClInclude Include="..\..\..\zutil.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj.filters b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj.filters
new file mode 100644
index 000000000..180b71cd6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc10/zlibvc.vcxproj.filters
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup>
+ <Filter Include="Source Files">
+ <UniqueIdentifier>{07934a85-8b61-443d-a0ee-b2eedb74f3cd}</UniqueIdentifier>
+ <Extensions>cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90</Extensions>
+ </Filter>
+ <Filter Include="Header Files">
+ <UniqueIdentifier>{1d99675b-433d-4a21-9e50-ed4ab8b19762}</UniqueIdentifier>
+ <Extensions>h;hpp;hxx;hm;inl;fi;fd</Extensions>
+ </Filter>
+ <Filter Include="Resource Files">
+ <UniqueIdentifier>{431c0958-fa71-44d0-9084-2d19d100c0cc}</UniqueIdentifier>
+ <Extensions>ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe</Extensions>
+ </Filter>
+ </ItemGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\compress.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\crc32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\deflate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzclose.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzlib.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzread.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\gzwrite.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\infback.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inflate.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inftrees.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\ioapi.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\iowin32.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\trees.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\uncompr.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\unzip.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\zip.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c">
+ <Filter>Source Files</Filter>
+ </ClCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc">
+ <Filter>Source Files</Filter>
+ </ResourceCompile>
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def">
+ <Filter>Source Files</Filter>
+ </None>
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\deflate.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\infblock.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\infcodes.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\inffast.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\inftrees.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\infutil.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\zconf.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\zlib.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ <ClInclude Include="..\..\..\zutil.h">
+ <Filter>Header Files</Filter>
+ </ClInclude>
+ </ItemGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/miniunz.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/miniunz.vcxproj
new file mode 100644
index 000000000..8f9f20bd3
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/miniunz.vcxproj
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694382A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\miniunz.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/minizip.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/minizip.vcxproj
new file mode 100644
index 000000000..c93d9e6ff
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/minizip.vcxproj
@@ -0,0 +1,311 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\minizip.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlib.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlib.vcxproj
new file mode 100644
index 000000000..6d5595401
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlib.vcxproj
@@ -0,0 +1,426 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <RootNamespace>testzlib</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlibdll.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlibdll.vcxproj
new file mode 100644
index 000000000..9f20c78f6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/testzlibdll.vcxproj
@@ -0,0 +1,314 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694366A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlib.rc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlib.rc
new file mode 100644
index 000000000..c4e4b016e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1 1
+IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0
+ FILEOS VOS_DOS_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0 // not used
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+
+ BEGIN
+ VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
+ VALUE "FileVersion", "1.2.11\0"
+ VALUE "InternalName", "zlib\0"
+ VALUE "OriginalFilename", "zlibwapi.dll\0"
+ VALUE "ProductName", "ZLib.DLL\0"
+ VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibstat.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibstat.vcxproj
new file mode 100644
index 000000000..806b76a88
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibstat.vcxproj
@@ -0,0 +1,464 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c" />
+ <ClCompile Include="..\..\minizip\zip.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.def b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.def
new file mode 100644
index 000000000..f876c3bca
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.def
@@ -0,0 +1,153 @@
+LIBRARY
+; zlib data compression and ZIP file I/O library
+
+VERSION 1.2
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+ inflateCopy @42
+ inflateBackInit_ @43
+ inflateBack @44
+ inflateBackEnd @45
+ compressBound @46
+ deflateBound @47
+ gzclearerr @48
+ gzungetc @49
+ zlibCompileFlags @50
+ deflatePrime @51
+ deflatePending @52
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unzOpenCurrentFile3 @69
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+ unzOpen2 @77
+ unzOpenCurrentFile2 @78
+ unzOpenCurrentFilePassword @79
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
+ zipOpenNewFileInZip2 @86
+ zipCloseFileInZipRaw @87
+ zipOpen2 @88
+ zipOpenNewFileInZip3 @89
+
+ unzGetFilePos @100
+ unzGoToFilePos @101
+
+ fill_win32_filefunc @110
+
+; zlibwapi v1.2.4 added:
+ fill_win32_filefunc64 @111
+ fill_win32_filefunc64A @112
+ fill_win32_filefunc64W @113
+
+ unzOpen64 @120
+ unzOpen2_64 @121
+ unzGetGlobalInfo64 @122
+ unzGetCurrentFileInfo64 @124
+ unzGetCurrentFileZStreamPos64 @125
+ unztell64 @126
+ unzGetFilePos64 @127
+ unzGoToFilePos64 @128
+
+ zipOpen64 @130
+ zipOpen2_64 @131
+ zipOpenNewFileInZip64 @132
+ zipOpenNewFileInZip2_64 @133
+ zipOpenNewFileInZip3_64 @134
+ zipOpenNewFileInZip4_64 @135
+ zipCloseFileInZipRaw64 @136
+
+; zlib1 v1.2.4 added:
+ adler32_combine @140
+ crc32_combine @142
+ deflateSetHeader @144
+ deflateTune @145
+ gzbuffer @146
+ gzclose_r @147
+ gzclose_w @148
+ gzdirect @149
+ gzoffset @150
+ inflateGetHeader @156
+ inflateMark @157
+ inflatePrime @158
+ inflateReset2 @159
+ inflateUndermine @160
+
+; zlib1 v1.2.6 added:
+ gzgetc_ @161
+ inflateResetKeep @163
+ deflateResetKeep @164
+
+; zlib1 v1.2.7 added:
+ gzopen_w @165
+
+; zlib1 v1.2.8 added:
+ inflateGetDictionary @166
+ gzvprintf @167
+
+; zlib1 v1.2.9 added:
+ inflateCodesUsed @168
+ inflateValidate @169
+ uncompress2 @170
+ gzfread @171
+ gzfwrite @172
+ deflateGetDictionary @173
+ adler32_z @174
+ crc32_z @175
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.sln b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.sln
new file mode 100644
index 000000000..9fcbafdd0
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.sln
@@ -0,0 +1,117 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2012
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Itanium = Debug|Itanium
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Itanium = Release|Itanium
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium
+ ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
+ ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.vcxproj
new file mode 100644
index 000000000..c65b95fdb
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc11/zlibvc.vcxproj
@@ -0,0 +1,688 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8FD826F8-3739-44E6-8CC8-997122E53B8D}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v110</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">zlibwapi</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\contrib\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\minizip\iowin32.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\zip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\deflate.h" />
+ <ClInclude Include="..\..\..\infblock.h" />
+ <ClInclude Include="..\..\..\infcodes.h" />
+ <ClInclude Include="..\..\..\inffast.h" />
+ <ClInclude Include="..\..\..\inftrees.h" />
+ <ClInclude Include="..\..\..\infutil.h" />
+ <ClInclude Include="..\..\..\zconf.h" />
+ <ClInclude Include="..\..\..\zlib.h" />
+ <ClInclude Include="..\..\..\zutil.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/miniunz.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/miniunz.vcxproj
new file mode 100644
index 000000000..8eee81660
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/miniunz.vcxproj
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694382A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\miniunz.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/minizip.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/minizip.vcxproj
new file mode 100644
index 000000000..448063f48
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/minizip.vcxproj
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\minizip.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlib.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlib.vcxproj
new file mode 100644
index 000000000..8c74c882e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlib.vcxproj
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <RootNamespace>testzlib</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlibdll.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlibdll.vcxproj
new file mode 100644
index 000000000..0bac3420e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/testzlibdll.vcxproj
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694366A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlib.rc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlib.rc
new file mode 100644
index 000000000..c4e4b016e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1 1
+IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0
+ FILEOS VOS_DOS_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0 // not used
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+
+ BEGIN
+ VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
+ VALUE "FileVersion", "1.2.11\0"
+ VALUE "InternalName", "zlib\0"
+ VALUE "OriginalFilename", "zlibwapi.dll\0"
+ VALUE "ProductName", "ZLib.DLL\0"
+ VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibstat.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibstat.vcxproj
new file mode 100644
index 000000000..4168bdf17
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibstat.vcxproj
@@ -0,0 +1,467 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c" />
+ <ClCompile Include="..\..\minizip\zip.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.def b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.def
new file mode 100644
index 000000000..f876c3bca
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.def
@@ -0,0 +1,153 @@
+LIBRARY
+; zlib data compression and ZIP file I/O library
+
+VERSION 1.2
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+ inflateCopy @42
+ inflateBackInit_ @43
+ inflateBack @44
+ inflateBackEnd @45
+ compressBound @46
+ deflateBound @47
+ gzclearerr @48
+ gzungetc @49
+ zlibCompileFlags @50
+ deflatePrime @51
+ deflatePending @52
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unzOpenCurrentFile3 @69
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+ unzOpen2 @77
+ unzOpenCurrentFile2 @78
+ unzOpenCurrentFilePassword @79
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
+ zipOpenNewFileInZip2 @86
+ zipCloseFileInZipRaw @87
+ zipOpen2 @88
+ zipOpenNewFileInZip3 @89
+
+ unzGetFilePos @100
+ unzGoToFilePos @101
+
+ fill_win32_filefunc @110
+
+; zlibwapi v1.2.4 added:
+ fill_win32_filefunc64 @111
+ fill_win32_filefunc64A @112
+ fill_win32_filefunc64W @113
+
+ unzOpen64 @120
+ unzOpen2_64 @121
+ unzGetGlobalInfo64 @122
+ unzGetCurrentFileInfo64 @124
+ unzGetCurrentFileZStreamPos64 @125
+ unztell64 @126
+ unzGetFilePos64 @127
+ unzGoToFilePos64 @128
+
+ zipOpen64 @130
+ zipOpen2_64 @131
+ zipOpenNewFileInZip64 @132
+ zipOpenNewFileInZip2_64 @133
+ zipOpenNewFileInZip3_64 @134
+ zipOpenNewFileInZip4_64 @135
+ zipCloseFileInZipRaw64 @136
+
+; zlib1 v1.2.4 added:
+ adler32_combine @140
+ crc32_combine @142
+ deflateSetHeader @144
+ deflateTune @145
+ gzbuffer @146
+ gzclose_r @147
+ gzclose_w @148
+ gzdirect @149
+ gzoffset @150
+ inflateGetHeader @156
+ inflateMark @157
+ inflatePrime @158
+ inflateReset2 @159
+ inflateUndermine @160
+
+; zlib1 v1.2.6 added:
+ gzgetc_ @161
+ inflateResetKeep @163
+ deflateResetKeep @164
+
+; zlib1 v1.2.7 added:
+ gzopen_w @165
+
+; zlib1 v1.2.8 added:
+ inflateGetDictionary @166
+ gzvprintf @167
+
+; zlib1 v1.2.9 added:
+ inflateCodesUsed @168
+ inflateValidate @169
+ uncompress2 @170
+ gzfread @171
+ gzfwrite @172
+ deflateGetDictionary @173
+ adler32_z @174
+ crc32_z @175
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.sln b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.sln
new file mode 100644
index 000000000..273b7686b
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.sln
@@ -0,0 +1,119 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 2013
+VisualStudioVersion = 12.0.40629.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Itanium = Debug|Itanium
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Itanium = Release|Itanium
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium
+ ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
+ ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.vcxproj
new file mode 100644
index 000000000..099c094e6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc12/zlibvc.vcxproj
@@ -0,0 +1,692 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8FD826F8-3739-44E6-8CC8-997122E53B8D}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v120</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">zlibwapi</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\contrib\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\minizip\iowin32.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\zip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\deflate.h" />
+ <ClInclude Include="..\..\..\infblock.h" />
+ <ClInclude Include="..\..\..\infcodes.h" />
+ <ClInclude Include="..\..\..\inffast.h" />
+ <ClInclude Include="..\..\..\inftrees.h" />
+ <ClInclude Include="..\..\..\infutil.h" />
+ <ClInclude Include="..\..\..\zconf.h" />
+ <ClInclude Include="..\..\..\zlib.h" />
+ <ClInclude Include="..\..\..\zutil.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/miniunz.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/miniunz.vcxproj
new file mode 100644
index 000000000..9d6f52ecd
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/miniunz.vcxproj
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694382A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\MiniUnzip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)miniunz.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)miniunz.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\miniunz.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/minizip.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/minizip.vcxproj
new file mode 100644
index 000000000..d614517ab
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/minizip.vcxproj
@@ -0,0 +1,313 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\MiniZip$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\$(Configuration)\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)minizip.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)minizip.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\minizip\minizip.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlib.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlib.vcxproj
new file mode 100644
index 000000000..4d9558fd9
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlib.vcxproj
@@ -0,0 +1,430 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}</ProjectGuid>
+ <RootNamespace>testzlib</RootNamespace>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlib$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerOutput>AssemblyAndSourceCode</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <ClCompile>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <OutputFile>$(OutDir)testzlib.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlibdll.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlibdll.vcxproj
new file mode 100644
index 000000000..196f3833e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/testzlibdll.vcxproj
@@ -0,0 +1,316 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{C52F9E7B-498A-42BE-8DB4-85A15694366A}</ProjectGuid>
+ <Keyword>Win32Proj</Keyword>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>Unicode</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>Application</ConfigurationType>
+ <CharacterSet>MultiByte</CharacterSet>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\TestZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x86\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <TargetMachine>MachineX86</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MinimalRebuild>true</MinimalRebuild>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllDebug\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)testzlib.pdb</ProgramDatabaseFile>
+ <SubSystem>Console</SubSystem>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>x64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>MaxSpeed</Optimization>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <OmitFramePointers>true</OmitFramePointers>
+ <AdditionalIncludeDirectories>..\..\..;..\..\minizip;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <BasicRuntimeChecks>Default</BasicRuntimeChecks>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeader>
+ </PrecompiledHeader>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <WarningLevel>Level3</WarningLevel>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <Link>
+ <AdditionalDependencies>ia64\ZlibDllRelease\zlibwapi.lib;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)testzlibdll.exe</OutputFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <SubSystem>Console</SubSystem>
+ <OptimizeReferences>true</OptimizeReferences>
+ <EnableCOMDATFolding>true</EnableCOMDATFolding>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\testzlib\testzlib.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ProjectReference Include="zlibvc.vcxproj">
+ <Project>{8fd826f8-3739-44e6-8cc8-997122e53b8d}</Project>
+ </ProjectReference>
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlib.rc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlib.rc
new file mode 100644
index 000000000..c4e4b016e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1 1
+IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0
+ FILEOS VOS_DOS_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0 // not used
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+
+ BEGIN
+ VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
+ VALUE "FileVersion", "1.2.11\0"
+ VALUE "InternalName", "zlib\0"
+ VALUE "OriginalFilename", "zlibwapi.dll\0"
+ VALUE "ProductName", "ZLib.DLL\0"
+ VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibstat.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibstat.vcxproj
new file mode 100644
index 000000000..a3dcf79fa
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibstat.vcxproj
@@ -0,0 +1,467 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>StaticLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibStat$(Configuration)\Tmp\</IntDir>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:X86 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>OldStyle</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <TargetEnvironment>X64</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:AMD64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibstat.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Lib>
+ <AdditionalOptions>/MACHINE:IA64 /NODEFAULTLIB %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibstat.lib</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </Lib>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c" />
+ <ClCompile Include="..\..\minizip\zip.c" />
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.def b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.def
new file mode 100644
index 000000000..f876c3bca
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.def
@@ -0,0 +1,153 @@
+LIBRARY
+; zlib data compression and ZIP file I/O library
+
+VERSION 1.2
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+ inflateCopy @42
+ inflateBackInit_ @43
+ inflateBack @44
+ inflateBackEnd @45
+ compressBound @46
+ deflateBound @47
+ gzclearerr @48
+ gzungetc @49
+ zlibCompileFlags @50
+ deflatePrime @51
+ deflatePending @52
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unzOpenCurrentFile3 @69
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+ unzOpen2 @77
+ unzOpenCurrentFile2 @78
+ unzOpenCurrentFilePassword @79
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
+ zipOpenNewFileInZip2 @86
+ zipCloseFileInZipRaw @87
+ zipOpen2 @88
+ zipOpenNewFileInZip3 @89
+
+ unzGetFilePos @100
+ unzGoToFilePos @101
+
+ fill_win32_filefunc @110
+
+; zlibwapi v1.2.4 added:
+ fill_win32_filefunc64 @111
+ fill_win32_filefunc64A @112
+ fill_win32_filefunc64W @113
+
+ unzOpen64 @120
+ unzOpen2_64 @121
+ unzGetGlobalInfo64 @122
+ unzGetCurrentFileInfo64 @124
+ unzGetCurrentFileZStreamPos64 @125
+ unztell64 @126
+ unzGetFilePos64 @127
+ unzGoToFilePos64 @128
+
+ zipOpen64 @130
+ zipOpen2_64 @131
+ zipOpenNewFileInZip64 @132
+ zipOpenNewFileInZip2_64 @133
+ zipOpenNewFileInZip3_64 @134
+ zipOpenNewFileInZip4_64 @135
+ zipCloseFileInZipRaw64 @136
+
+; zlib1 v1.2.4 added:
+ adler32_combine @140
+ crc32_combine @142
+ deflateSetHeader @144
+ deflateTune @145
+ gzbuffer @146
+ gzclose_r @147
+ gzclose_w @148
+ gzdirect @149
+ gzoffset @150
+ inflateGetHeader @156
+ inflateMark @157
+ inflatePrime @158
+ inflateReset2 @159
+ inflateUndermine @160
+
+; zlib1 v1.2.6 added:
+ gzgetc_ @161
+ inflateResetKeep @163
+ deflateResetKeep @164
+
+; zlib1 v1.2.7 added:
+ gzopen_w @165
+
+; zlib1 v1.2.8 added:
+ inflateGetDictionary @166
+ gzvprintf @167
+
+; zlib1 v1.2.9 added:
+ inflateCodesUsed @168
+ inflateValidate @169
+ uncompress2 @170
+ gzfread @171
+ gzfwrite @172
+ deflateGetDictionary @173
+ adler32_z @174
+ crc32_z @175
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.sln b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.sln
new file mode 100644
index 000000000..a90cf5131
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.sln
@@ -0,0 +1,119 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 14
+VisualStudioVersion = 14.0.25420.1
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcxproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcxproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcxproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlibdll", "testzlibdll.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcxproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcxproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Itanium = Debug|Itanium
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Itanium = Release|Itanium
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium
+ ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
+ ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.vcxproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.vcxproj
new file mode 100644
index 000000000..55ae5af60
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc14/zlibvc.vcxproj
@@ -0,0 +1,692 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <ItemGroup Label="ProjectConfigurations">
+ <ProjectConfiguration Include="Debug|Itanium">
+ <Configuration>Debug</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|Win32">
+ <Configuration>Debug</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Debug|x64">
+ <Configuration>Debug</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Itanium">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|Win32">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="ReleaseWithoutAsm|x64">
+ <Configuration>ReleaseWithoutAsm</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Itanium">
+ <Configuration>Release</Configuration>
+ <Platform>Itanium</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|Win32">
+ <Configuration>Release</Configuration>
+ <Platform>Win32</Platform>
+ </ProjectConfiguration>
+ <ProjectConfiguration Include="Release|x64">
+ <Configuration>Release</Configuration>
+ <Platform>x64</Platform>
+ </ProjectConfiguration>
+ </ItemGroup>
+ <PropertyGroup Label="Globals">
+ <ProjectGuid>{8FD826F8-3739-44E6-8CC8-997122E53B8D}</ProjectGuid>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ <CharacterSet>Unicode</CharacterSet>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <WholeProgramOptimization>true</WholeProgramOptimization>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+ <ConfigurationType>DynamicLibrary</ConfigurationType>
+ <UseOfMfc>false</UseOfMfc>
+ <PlatformToolset>v140</PlatformToolset>
+ </PropertyGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+ <ImportGroup Label="ExtensionSettings">
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
+ <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
+ </ImportGroup>
+ <PropertyGroup Label="UserMacros" />
+ <PropertyGroup>
+ <_ProjectFileVersion>10.0.30128.1</_ProjectFileVersion>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">x86\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|x64'">x64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|x64'">false</GenerateManifest>
+ <OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\</OutDir>
+ <IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ia64\ZlibDll$(Configuration)\Tmp\</IntDir>
+ <LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</LinkIncremental>
+ <GenerateManifest Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">false</GenerateManifest>
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" />
+ <CodeAnalysisRuleSet Condition="'$(Configuration)|$(Platform)'=='Release|x64'">AllRules.ruleset</CodeAnalysisRuleSet>
+ <CodeAnalysisRules Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <CodeAnalysisRuleAssemblies Condition="'$(Configuration)|$(Platform)'=='Release|x64'" />
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">zlibwapi</TargetName>
+ <TargetName Condition="'$(Configuration)|$(Platform)'=='Release|x64'">zlibwapi</TargetName>
+ </PropertyGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Win32</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreaded</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalOptions>/MACHINE:I386 %(AdditionalOptions)</AdditionalOptions>
+ <AdditionalDependencies>..\..\masmx86\match686.obj;..\..\masmx86\inffas32.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <RandomizedBaseAddress>false</RandomizedBaseAddress>
+ <DataExecutionPrevention>
+ </DataExecutionPrevention>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <ImageHasSafeExceptionHandlers>false</ImageHasSafeExceptionHandlers>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx86
+bld_ml32.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\contrib\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <Optimization>Disabled</Optimization>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <GenerateDebugInformation>true</GenerateDebugInformation>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>X64</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <AdditionalDependencies>..\..\masmx64\gvmat64.obj;..\..\masmx64\inffasx64.obj;%(AdditionalDependencies)</AdditionalDependencies>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineX64</TargetMachine>
+ </Link>
+ <PreBuildEvent>
+ <Command>cd ..\..\masmx64
+bld_ml64.bat</Command>
+ </PreBuildEvent>
+ </ItemDefinitionGroup>
+ <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">
+ <Midl>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <MkTypLibCompatible>true</MkTypLibCompatible>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <TargetEnvironment>Itanium</TargetEnvironment>
+ <TypeLibraryName>$(OutDir)zlibvc.tlb</TypeLibraryName>
+ </Midl>
+ <ClCompile>
+ <InlineFunctionExpansion>OnlyExplicitInline</InlineFunctionExpansion>
+ <AdditionalIncludeDirectories>..\..\..;..\..\masmx86;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions>_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <StringPooling>true</StringPooling>
+ <ExceptionHandling>
+ </ExceptionHandling>
+ <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
+ <BufferSecurityCheck>false</BufferSecurityCheck>
+ <FunctionLevelLinking>true</FunctionLevelLinking>
+ <PrecompiledHeaderOutputFile>$(IntDir)zlibvc.pch</PrecompiledHeaderOutputFile>
+ <AssemblerOutput>All</AssemblerOutput>
+ <AssemblerListingLocation>$(IntDir)</AssemblerListingLocation>
+ <ObjectFileName>$(IntDir)</ObjectFileName>
+ <ProgramDataBaseFileName>$(OutDir)</ProgramDataBaseFileName>
+ <BrowseInformation>
+ </BrowseInformation>
+ <WarningLevel>Level3</WarningLevel>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ </ClCompile>
+ <ResourceCompile>
+ <PreprocessorDefinitions>NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <Culture>0x040c</Culture>
+ </ResourceCompile>
+ <Link>
+ <OutputFile>$(OutDir)zlibwapi.dll</OutputFile>
+ <SuppressStartupBanner>true</SuppressStartupBanner>
+ <IgnoreAllDefaultLibraries>false</IgnoreAllDefaultLibraries>
+ <ModuleDefinitionFile>.\zlibvc.def</ModuleDefinitionFile>
+ <ProgramDatabaseFile>$(OutDir)zlibwapi.pdb</ProgramDatabaseFile>
+ <GenerateMapFile>true</GenerateMapFile>
+ <MapFileName>$(OutDir)zlibwapi.map</MapFileName>
+ <SubSystem>Windows</SubSystem>
+ <ImportLibrary>$(OutDir)zlibwapi.lib</ImportLibrary>
+ <TargetMachine>MachineIA64</TargetMachine>
+ </Link>
+ </ItemDefinitionGroup>
+ <ItemGroup>
+ <ClCompile Include="..\..\..\adler32.c" />
+ <ClCompile Include="..\..\..\compress.c" />
+ <ClCompile Include="..\..\..\crc32.c" />
+ <ClCompile Include="..\..\..\deflate.c" />
+ <ClCompile Include="..\..\..\gzclose.c" />
+ <ClCompile Include="..\..\..\gzlib.c" />
+ <ClCompile Include="..\..\..\gzread.c" />
+ <ClCompile Include="..\..\..\gzwrite.c" />
+ <ClCompile Include="..\..\..\infback.c" />
+ <ClCompile Include="..\..\masmx64\inffas8664.c">
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='ReleaseWithoutAsm|Win32'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">true</ExcludedFromBuild>
+ <ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
+ </ClCompile>
+ <ClCompile Include="..\..\..\inffast.c" />
+ <ClCompile Include="..\..\..\inflate.c" />
+ <ClCompile Include="..\..\..\inftrees.c" />
+ <ClCompile Include="..\..\minizip\ioapi.c" />
+ <ClCompile Include="..\..\minizip\iowin32.c" />
+ <ClCompile Include="..\..\..\trees.c" />
+ <ClCompile Include="..\..\..\uncompr.c" />
+ <ClCompile Include="..\..\minizip\unzip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\minizip\zip.c">
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Itanium'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ <AdditionalIncludeDirectories Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
+ <PreprocessorDefinitions Condition="'$(Configuration)|$(Platform)'=='Release|x64'">ZLIB_INTERNAL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+ </ClCompile>
+ <ClCompile Include="..\..\..\zutil.c" />
+ </ItemGroup>
+ <ItemGroup>
+ <ResourceCompile Include="zlib.rc" />
+ </ItemGroup>
+ <ItemGroup>
+ <None Include="zlibvc.def" />
+ </ItemGroup>
+ <ItemGroup>
+ <ClInclude Include="..\..\..\deflate.h" />
+ <ClInclude Include="..\..\..\infblock.h" />
+ <ClInclude Include="..\..\..\infcodes.h" />
+ <ClInclude Include="..\..\..\inffast.h" />
+ <ClInclude Include="..\..\..\inftrees.h" />
+ <ClInclude Include="..\..\..\infutil.h" />
+ <ClInclude Include="..\..\..\zconf.h" />
+ <ClInclude Include="..\..\..\zlib.h" />
+ <ClInclude Include="..\..\..\zutil.h" />
+ </ItemGroup>
+ <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+ <ImportGroup Label="ExtensionTargets">
+ </ImportGroup>
+</Project> \ No newline at end of file
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/miniunz.vcproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/miniunz.vcproj
new file mode 100644
index 000000000..7da32b91e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/miniunz.vcproj
@@ -0,0 +1,565 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="miniunz"
+ ProjectGUID="{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ <Platform
+ Name="Itanium"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="x86\MiniUnzip$(ConfigurationName)"
+ IntermediateDirectory="x86\MiniUnzip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x86\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/miniunz.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/miniunz.pdb"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="x86\MiniUnzip$(ConfigurationName)"
+ IntermediateDirectory="x86\MiniUnzip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x86\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/miniunz.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="x64\MiniUnzip$(ConfigurationName)"
+ IntermediateDirectory="x64\MiniUnzip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x64\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/miniunz.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/miniunz.pdb"
+ SubSystem="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Itanium"
+ OutputDirectory="ia64\MiniUnzip$(ConfigurationName)"
+ IntermediateDirectory="ia64\MiniUnzip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ia64\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/miniunz.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/miniunz.pdb"
+ SubSystem="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="x64\MiniUnzip$(ConfigurationName)"
+ IntermediateDirectory="x64\MiniUnzip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x64\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/miniunz.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Itanium"
+ OutputDirectory="ia64\MiniUnzip$(ConfigurationName)"
+ IntermediateDirectory="ia64\MiniUnzip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ia64\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/miniunz.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
+ >
+ <File
+ RelativePath="..\..\minizip\miniunz.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/minizip.vcproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/minizip.vcproj
new file mode 100644
index 000000000..e57e07d90
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/minizip.vcproj
@@ -0,0 +1,562 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="minizip"
+ ProjectGUID="{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ <Platform
+ Name="Itanium"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="x86\MiniZip$(ConfigurationName)"
+ IntermediateDirectory="x86\MiniZip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x86\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/minizip.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/minizip.pdb"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="x86\MiniZip$(ConfigurationName)"
+ IntermediateDirectory="x86\MiniZip$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x86\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/minizip.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="x64\$(ConfigurationName)"
+ IntermediateDirectory="x64\$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x64\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/minizip.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/minizip.pdb"
+ SubSystem="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Itanium"
+ OutputDirectory="ia64\$(ConfigurationName)"
+ IntermediateDirectory="ia64\$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ia64\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/minizip.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/minizip.pdb"
+ SubSystem="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="x64\$(ConfigurationName)"
+ IntermediateDirectory="x64\$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x64\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/minizip.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Itanium"
+ OutputDirectory="ia64\$(ConfigurationName)"
+ IntermediateDirectory="ia64\$(ConfigurationName)"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ia64\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/minizip.exe"
+ LinkIncremental="1"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
+ >
+ <File
+ RelativePath="..\..\minizip\minizip.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlib.vcproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlib.vcproj
new file mode 100644
index 000000000..9cb0bf877
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlib.vcproj
@@ -0,0 +1,852 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="testzlib"
+ ProjectGUID="{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
+ RootNamespace="testzlib"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ <Platform
+ Name="Itanium"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="x86\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="x86\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerOutput="4"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="..\..\masmx86\match686.obj ..\..\masmx86\inffas32.obj"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/testzlib.pdb"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="x64\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="x64\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ AssemblerListingLocation="$(IntDir)\"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj"
+ GenerateManifest="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Itanium"
+ OutputDirectory="ia64\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="ia64\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="ZLIB_WINAPI;_DEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerOutput="4"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/testzlib.pdb"
+ SubSystem="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|Win32"
+ OutputDirectory="x86\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="x86\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|x64"
+ OutputDirectory="x64\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="x64\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ AssemblerListingLocation="$(IntDir)\"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies=""
+ GenerateManifest="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|Itanium"
+ OutputDirectory="ia64\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="ia64\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="x86\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="x86\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="..\..\masmx86\match686.obj ..\..\masmx86\inffas32.obj"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="x64\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="x64\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="ASMV;ASMINF;WIN32;ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ AssemblerListingLocation="$(IntDir)\"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj"
+ GenerateManifest="false"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Itanium"
+ OutputDirectory="ia64\TestZlib$(ConfigurationName)"
+ IntermediateDirectory="ia64\TestZlib$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ CharacterSet="2"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\.."
+ PreprocessorDefinitions="ZLIB_WINAPI;NDEBUG;_CONSOLE;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
+ >
+ <File
+ RelativePath="..\..\..\adler32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\compress.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\crc32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\deflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\infback.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\masmx64\inffas8664.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="ReleaseWithoutAsm|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="ReleaseWithoutAsm|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\inffast.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inftrees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\testzlib\testzlib.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\trees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\uncompr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\zutil.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlibdll.vcproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlibdll.vcproj
new file mode 100644
index 000000000..b1ddde05f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/testzlibdll.vcproj
@@ -0,0 +1,565 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9.00"
+ Name="TestZlibDll"
+ ProjectGUID="{C52F9E7B-498A-42BE-8DB4-85A15694366A}"
+ Keyword="Win32Proj"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ <Platform
+ Name="Itanium"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="x86\TestZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x86\TestZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x86\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/testzlib.pdb"
+ SubSystem="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="x86\TestZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x86\TestZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x86\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ TargetMachine="1"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="x64\TestZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x64\TestZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x64\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/testzlib.pdb"
+ SubSystem="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Itanium"
+ OutputDirectory="ia64\TestZlibDll$(ConfigurationName)"
+ IntermediateDirectory="ia64\TestZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;_DEBUG;_CONSOLE;WIN64"
+ MinimalRebuild="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ia64\ZlibDllDebug\zlibwapi.lib"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="2"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/testzlib.pdb"
+ SubSystem="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="x64\TestZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x64\TestZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="x64\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Itanium"
+ OutputDirectory="ia64\TestZlibDll$(ConfigurationName)"
+ IntermediateDirectory="ia64\TestZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="1"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ CharacterSet="2"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="2"
+ InlineFunctionExpansion="1"
+ OmitFramePointers="true"
+ AdditionalIncludeDirectories="..\..\..;..\..\minizip"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;ZLIB_WINAPI;NDEBUG;_CONSOLE;WIN64"
+ StringPooling="true"
+ BasicRuntimeChecks="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ UsePrecompiledHeader="0"
+ AssemblerListingLocation="$(IntDir)\"
+ WarningLevel="3"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="ia64\ZlibDllRelease\zlibwapi.lib"
+ OutputFile="$(OutDir)/testzlib.exe"
+ LinkIncremental="1"
+ GenerateManifest="false"
+ GenerateDebugInformation="true"
+ SubSystem="1"
+ OptimizeReferences="2"
+ EnableCOMDATFolding="2"
+ OptimizeForWindows98="1"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCWebDeploymentTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm"
+ >
+ <File
+ RelativePath="..\..\testzlib\testzlib.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;inc"
+ >
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc
new file mode 100644
index 000000000..c4e4b016e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlib.rc
@@ -0,0 +1,32 @@
+#include <windows.h>
+
+#define IDR_VERSION1 1
+IDR_VERSION1 VERSIONINFO MOVEABLE IMPURE LOADONCALL DISCARDABLE
+ FILEVERSION 1, 2, 11, 0
+ PRODUCTVERSION 1, 2, 11, 0
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+ FILEFLAGS 0
+ FILEOS VOS_DOS_WINDOWS32
+ FILETYPE VFT_DLL
+ FILESUBTYPE 0 // not used
+BEGIN
+ BLOCK "StringFileInfo"
+ BEGIN
+ BLOCK "040904E4"
+ //language ID = U.S. English, char set = Windows, Multilingual
+
+ BEGIN
+ VALUE "FileDescription", "zlib data compression and ZIP file I/O library\0"
+ VALUE "FileVersion", "1.2.11\0"
+ VALUE "InternalName", "zlib\0"
+ VALUE "OriginalFilename", "zlibwapi.dll\0"
+ VALUE "ProductName", "ZLib.DLL\0"
+ VALUE "Comments","DLL support by Alessandro Iacopetti & Gilles Vollant\0"
+ VALUE "LegalCopyright", "(C) 1995-2017 Jean-loup Gailly & Mark Adler\0"
+ END
+ END
+ BLOCK "VarFileInfo"
+ BEGIN
+ VALUE "Translation", 0x0409, 1252
+ END
+END
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibstat.vcproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibstat.vcproj
new file mode 100644
index 000000000..61c76c7c5
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibstat.vcproj
@@ -0,0 +1,835 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="zlibstat"
+ ProjectGUID="{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ <Platform
+ Name="Itanium"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="x86\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="x86\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ ExceptionHandling="0"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="1"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X86 /NODEFAULTLIB"
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="x64\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="x64\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ ExceptionHandling="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="1"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:AMD64 /NODEFAULTLIB"
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Itanium"
+ OutputDirectory="ia64\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="ia64\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ ExceptionHandling="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ Detect64BitPortabilityProblems="true"
+ DebugInformationFormat="1"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:IA64 /NODEFAULTLIB"
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="x86\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="x86\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X86 /NODEFAULTLIB"
+ AdditionalDependencies="..\..\masmx86\match686.obj ..\..\masmx86\inffas32.obj "
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="x64\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="x64\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ASMV;ASMINF;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:AMD64 /NODEFAULTLIB"
+ AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj "
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Itanium"
+ OutputDirectory="ia64\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="ia64\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:IA64 /NODEFAULTLIB"
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|Win32"
+ OutputDirectory="x86\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="x86\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:X86 /NODEFAULTLIB"
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|x64"
+ OutputDirectory="x64\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="x64\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="3"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:AMD64 /NODEFAULTLIB"
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|Itanium"
+ OutputDirectory="ia64\ZlibStat$(ConfigurationName)"
+ IntermediateDirectory="ia64\ZlibStat$(ConfigurationName)\Tmp"
+ ConfigurationType="4"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ TargetEnvironment="2"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="ZLIB_WINAPI;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibstat.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLibrarianTool"
+ AdditionalOptions="/MACHINE:IA64 /NODEFAULTLIB"
+ OutputFile="$(OutDir)\zlibstat.lib"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ >
+ <File
+ RelativePath="..\..\..\adler32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\compress.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\crc32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\deflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzclose.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzguts.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzlib.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzread.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzwrite.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\infback.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\masmx64\inffas8664.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="ReleaseWithoutAsm|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="ReleaseWithoutAsm|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\inffast.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inftrees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\minizip\ioapi.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\trees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\uncompr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\minizip\unzip.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\minizip\zip.c"
+ >
+ </File>
+ <File
+ RelativePath=".\zlib.rc"
+ >
+ </File>
+ <File
+ RelativePath=".\zlibvc.def"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\zutil.c"
+ >
+ </File>
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def
new file mode 100644
index 000000000..f876c3bca
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.def
@@ -0,0 +1,153 @@
+LIBRARY
+; zlib data compression and ZIP file I/O library
+
+VERSION 1.2
+
+EXPORTS
+ adler32 @1
+ compress @2
+ crc32 @3
+ deflate @4
+ deflateCopy @5
+ deflateEnd @6
+ deflateInit2_ @7
+ deflateInit_ @8
+ deflateParams @9
+ deflateReset @10
+ deflateSetDictionary @11
+ gzclose @12
+ gzdopen @13
+ gzerror @14
+ gzflush @15
+ gzopen @16
+ gzread @17
+ gzwrite @18
+ inflate @19
+ inflateEnd @20
+ inflateInit2_ @21
+ inflateInit_ @22
+ inflateReset @23
+ inflateSetDictionary @24
+ inflateSync @25
+ uncompress @26
+ zlibVersion @27
+ gzprintf @28
+ gzputc @29
+ gzgetc @30
+ gzseek @31
+ gzrewind @32
+ gztell @33
+ gzeof @34
+ gzsetparams @35
+ zError @36
+ inflateSyncPoint @37
+ get_crc_table @38
+ compress2 @39
+ gzputs @40
+ gzgets @41
+ inflateCopy @42
+ inflateBackInit_ @43
+ inflateBack @44
+ inflateBackEnd @45
+ compressBound @46
+ deflateBound @47
+ gzclearerr @48
+ gzungetc @49
+ zlibCompileFlags @50
+ deflatePrime @51
+ deflatePending @52
+
+ unzOpen @61
+ unzClose @62
+ unzGetGlobalInfo @63
+ unzGetCurrentFileInfo @64
+ unzGoToFirstFile @65
+ unzGoToNextFile @66
+ unzOpenCurrentFile @67
+ unzReadCurrentFile @68
+ unzOpenCurrentFile3 @69
+ unztell @70
+ unzeof @71
+ unzCloseCurrentFile @72
+ unzGetGlobalComment @73
+ unzStringFileNameCompare @74
+ unzLocateFile @75
+ unzGetLocalExtrafield @76
+ unzOpen2 @77
+ unzOpenCurrentFile2 @78
+ unzOpenCurrentFilePassword @79
+
+ zipOpen @80
+ zipOpenNewFileInZip @81
+ zipWriteInFileInZip @82
+ zipCloseFileInZip @83
+ zipClose @84
+ zipOpenNewFileInZip2 @86
+ zipCloseFileInZipRaw @87
+ zipOpen2 @88
+ zipOpenNewFileInZip3 @89
+
+ unzGetFilePos @100
+ unzGoToFilePos @101
+
+ fill_win32_filefunc @110
+
+; zlibwapi v1.2.4 added:
+ fill_win32_filefunc64 @111
+ fill_win32_filefunc64A @112
+ fill_win32_filefunc64W @113
+
+ unzOpen64 @120
+ unzOpen2_64 @121
+ unzGetGlobalInfo64 @122
+ unzGetCurrentFileInfo64 @124
+ unzGetCurrentFileZStreamPos64 @125
+ unztell64 @126
+ unzGetFilePos64 @127
+ unzGoToFilePos64 @128
+
+ zipOpen64 @130
+ zipOpen2_64 @131
+ zipOpenNewFileInZip64 @132
+ zipOpenNewFileInZip2_64 @133
+ zipOpenNewFileInZip3_64 @134
+ zipOpenNewFileInZip4_64 @135
+ zipCloseFileInZipRaw64 @136
+
+; zlib1 v1.2.4 added:
+ adler32_combine @140
+ crc32_combine @142
+ deflateSetHeader @144
+ deflateTune @145
+ gzbuffer @146
+ gzclose_r @147
+ gzclose_w @148
+ gzdirect @149
+ gzoffset @150
+ inflateGetHeader @156
+ inflateMark @157
+ inflatePrime @158
+ inflateReset2 @159
+ inflateUndermine @160
+
+; zlib1 v1.2.6 added:
+ gzgetc_ @161
+ inflateResetKeep @163
+ deflateResetKeep @164
+
+; zlib1 v1.2.7 added:
+ gzopen_w @165
+
+; zlib1 v1.2.8 added:
+ inflateGetDictionary @166
+ gzvprintf @167
+
+; zlib1 v1.2.9 added:
+ inflateCodesUsed @168
+ inflateValidate @169
+ uncompress2 @170
+ gzfread @171
+ gzfwrite @172
+ deflateGetDictionary @173
+ adler32_z @174
+ crc32_z @175
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.sln b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.sln
new file mode 100644
index 000000000..b4829671f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.sln
@@ -0,0 +1,144 @@
+
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibvc", "zlibvc.vcproj", "{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "zlibstat", "zlibstat.vcproj", "{745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "testzlib", "testzlib.vcproj", "{AA6666AA-E09F-4135-9C0C-4FE50C3C654B}"
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TestZlibDll", "testzlibdll.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694366A}"
+ ProjectSection(ProjectDependencies) = postProject
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "minizip", "minizip.vcproj", "{48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}"
+ ProjectSection(ProjectDependencies) = postProject
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D}
+ EndProjectSection
+EndProject
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "miniunz", "miniunz.vcproj", "{C52F9E7B-498A-42BE-8DB4-85A15694382A}"
+ ProjectSection(ProjectDependencies) = postProject
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D} = {8FD826F8-3739-44E6-8CC8-997122E53B8D}
+ EndProjectSection
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Itanium = Debug|Itanium
+ Debug|Win32 = Debug|Win32
+ Debug|x64 = Debug|x64
+ Release|Itanium = Release|Itanium
+ Release|Win32 = Release|Win32
+ Release|x64 = Release|x64
+ ReleaseWithoutAsm|Itanium = ReleaseWithoutAsm|Itanium
+ ReleaseWithoutAsm|Win32 = ReleaseWithoutAsm|Win32
+ ReleaseWithoutAsm|x64 = ReleaseWithoutAsm|x64
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Itanium.Build.0 = Debug|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.ActiveCfg = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|Win32.Build.0 = Debug|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.ActiveCfg = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Debug|x64.Build.0 = Debug|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.ActiveCfg = Release|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Itanium.Build.0 = Release|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.ActiveCfg = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|Win32.Build.0 = Release|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.ActiveCfg = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.Release|x64.Build.0 = Release|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {8FD826F8-3739-44E6-8CC8-997122E53B8D}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Itanium.Build.0 = Debug|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.ActiveCfg = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|Win32.Build.0 = Debug|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.ActiveCfg = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Debug|x64.Build.0 = Debug|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.ActiveCfg = Release|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Itanium.Build.0 = Release|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.ActiveCfg = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|Win32.Build.0 = Release|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.ActiveCfg = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.Release|x64.Build.0 = Release|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {745DEC58-EBB3-47A9-A9B8-4C6627C01BF8}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = ReleaseWithoutAsm|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = ReleaseWithoutAsm|Itanium
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.Build.0 = ReleaseWithoutAsm|Win32
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = ReleaseWithoutAsm|x64
+ {AA6666AA-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.Build.0 = ReleaseWithoutAsm|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Itanium.Build.0 = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694366A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Itanium.Build.0 = Debug|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.ActiveCfg = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|Win32.Build.0 = Debug|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.ActiveCfg = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Debug|x64.Build.0 = Debug|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.ActiveCfg = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Itanium.Build.0 = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|Win32.Build.0 = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.ActiveCfg = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.Release|x64.Build.0 = Release|x64
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {48CDD9DC-E09F-4135-9C0C-4FE50C3C654B}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.ActiveCfg = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Itanium.Build.0 = Debug|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.ActiveCfg = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|Win32.Build.0 = Debug|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.ActiveCfg = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Debug|x64.Build.0 = Debug|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|Win32.Build.0 = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.ActiveCfg = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.Release|x64.Build.0 = Release|x64
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.ActiveCfg = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Itanium.Build.0 = Release|Itanium
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|Win32.ActiveCfg = Release|Win32
+ {C52F9E7B-498A-42BE-8DB4-85A15694382A}.ReleaseWithoutAsm|x64.ActiveCfg = Release|x64
+ EndGlobalSection
+ GlobalSection(SolutionProperties) = preSolution
+ HideSolutionNode = FALSE
+ EndGlobalSection
+EndGlobal
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.vcproj b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.vcproj
new file mode 100644
index 000000000..c9a89471e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/contrib/vstudio/vc9/zlibvc.vcproj
@@ -0,0 +1,1156 @@
+<?xml version="1.0" encoding="Windows-1252"?>
+<VisualStudioProject
+ ProjectType="Visual C++"
+ Version="9,00"
+ Name="zlibvc"
+ ProjectGUID="{8FD826F8-3739-44E6-8CC8-997122E53B8D}"
+ RootNamespace="zlibvc"
+ TargetFrameworkVersion="131072"
+ >
+ <Platforms>
+ <Platform
+ Name="Win32"
+ />
+ <Platform
+ Name="x64"
+ />
+ <Platform
+ Name="Itanium"
+ />
+ </Platforms>
+ <ToolFiles>
+ </ToolFiles>
+ <Configurations>
+ <Configuration
+ Name="Debug|Win32"
+ OutputDirectory="x86\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x86\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF"
+ ExceptionHandling="0"
+ RuntimeLibrary="1"
+ BufferSecurityCheck="false"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="4"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="..\..\masmx86\match686.obj ..\..\masmx86\inffas32.obj"
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|x64"
+ OutputDirectory="x64\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x64\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="3"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64"
+ ExceptionHandling="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj "
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Debug|Itanium"
+ OutputDirectory="ia64\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="ia64\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="_DEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="2"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ Optimization="0"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64"
+ ExceptionHandling="0"
+ RuntimeLibrary="3"
+ BufferSecurityCheck="false"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ DebugInformationFormat="3"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="_DEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="2"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ GenerateDebugInformation="true"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|Win32"
+ OutputDirectory="x86\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x86\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerOutput="2"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ IgnoreAllDefaultLibraries="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ OptimizeForWindows98="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|x64"
+ OutputDirectory="x64\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x64\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="3"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerOutput="2"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ IgnoreAllDefaultLibraries="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ OptimizeForWindows98="1"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="ReleaseWithoutAsm|Itanium"
+ OutputDirectory="ia64\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="ia64\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="2"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerOutput="2"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ IgnoreAllDefaultLibraries="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ OptimizeForWindows98="1"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Win32"
+ OutputDirectory="x86\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x86\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="1"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="WIN32;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="0"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerOutput="2"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalOptions="/MACHINE:I386"
+ AdditionalDependencies="..\..\masmx86\match686.obj ..\..\masmx86\inffas32.obj "
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ IgnoreAllDefaultLibraries="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ OptimizeForWindows98="1"
+ RandomizedBaseAddress="1"
+ DataExecutionPrevention="0"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|x64"
+ OutputDirectory="x64\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="x64\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="3"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;ASMV;ASMINF;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerOutput="2"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ AdditionalDependencies="..\..\masmx64\gvmat64.obj ..\..\masmx64\inffasx64.obj "
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ IgnoreAllDefaultLibraries="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ OptimizeForWindows98="1"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ TargetMachine="17"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ <Configuration
+ Name="Release|Itanium"
+ OutputDirectory="ia64\ZlibDll$(ConfigurationName)"
+ IntermediateDirectory="ia64\ZlibDll$(ConfigurationName)\Tmp"
+ ConfigurationType="2"
+ InheritedPropertySheets="UpgradeFromVC70.vsprops"
+ UseOfMFC="0"
+ ATLMinimizesCRunTimeLibraryUsage="false"
+ WholeProgramOptimization="1"
+ >
+ <Tool
+ Name="VCPreBuildEventTool"
+ />
+ <Tool
+ Name="VCCustomBuildTool"
+ />
+ <Tool
+ Name="VCXMLDataGeneratorTool"
+ />
+ <Tool
+ Name="VCWebServiceProxyGeneratorTool"
+ />
+ <Tool
+ Name="VCMIDLTool"
+ PreprocessorDefinitions="NDEBUG"
+ MkTypLibCompatible="true"
+ SuppressStartupBanner="true"
+ TargetEnvironment="2"
+ TypeLibraryName="$(OutDir)/zlibvc.tlb"
+ />
+ <Tool
+ Name="VCCLCompilerTool"
+ InlineFunctionExpansion="1"
+ AdditionalIncludeDirectories="..\..\..;..\..\masmx86"
+ PreprocessorDefinitions="_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_WARNINGS;ZLIB_WINAPI;WIN64"
+ StringPooling="true"
+ ExceptionHandling="0"
+ RuntimeLibrary="2"
+ BufferSecurityCheck="false"
+ EnableFunctionLevelLinking="true"
+ PrecompiledHeaderFile="$(IntDir)/zlibvc.pch"
+ AssemblerOutput="2"
+ AssemblerListingLocation="$(IntDir)\"
+ ObjectFile="$(IntDir)\"
+ ProgramDataBaseFileName="$(OutDir)\"
+ BrowseInformation="0"
+ WarningLevel="3"
+ SuppressStartupBanner="true"
+ />
+ <Tool
+ Name="VCManagedResourceCompilerTool"
+ />
+ <Tool
+ Name="VCResourceCompilerTool"
+ PreprocessorDefinitions="NDEBUG"
+ Culture="1036"
+ />
+ <Tool
+ Name="VCPreLinkEventTool"
+ />
+ <Tool
+ Name="VCLinkerTool"
+ OutputFile="$(OutDir)\zlibwapi.dll"
+ LinkIncremental="1"
+ SuppressStartupBanner="true"
+ GenerateManifest="false"
+ IgnoreAllDefaultLibraries="false"
+ ModuleDefinitionFile=".\zlibvc.def"
+ ProgramDatabaseFile="$(OutDir)/zlibwapi.pdb"
+ GenerateMapFile="true"
+ MapFileName="$(OutDir)/zlibwapi.map"
+ SubSystem="2"
+ OptimizeForWindows98="1"
+ ImportLibrary="$(OutDir)/zlibwapi.lib"
+ TargetMachine="5"
+ />
+ <Tool
+ Name="VCALinkTool"
+ />
+ <Tool
+ Name="VCManifestTool"
+ />
+ <Tool
+ Name="VCXDCMakeTool"
+ />
+ <Tool
+ Name="VCBscMakeTool"
+ />
+ <Tool
+ Name="VCFxCopTool"
+ />
+ <Tool
+ Name="VCAppVerifierTool"
+ />
+ <Tool
+ Name="VCPostBuildEventTool"
+ />
+ </Configuration>
+ </Configurations>
+ <References>
+ </References>
+ <Files>
+ <Filter
+ Name="Source Files"
+ Filter="cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90"
+ >
+ <File
+ RelativePath="..\..\..\adler32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\compress.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\crc32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\deflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzclose.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzguts.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzlib.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzread.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\gzwrite.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\infback.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\masmx64\inffas8664.c"
+ >
+ <FileConfiguration
+ Name="Debug|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Debug|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="ReleaseWithoutAsm|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="ReleaseWithoutAsm|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Win32"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Itanium"
+ ExcludedFromBuild="true"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\..\inffast.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inflate.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inftrees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\minizip\ioapi.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\minizip\iowin32.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\trees.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\uncompr.c"
+ >
+ </File>
+ <File
+ RelativePath="..\..\minizip\unzip.c"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="ZLIB_INTERNAL"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="ZLIB_INTERNAL"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Itanium"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="ZLIB_INTERNAL"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath="..\..\minizip\zip.c"
+ >
+ <FileConfiguration
+ Name="Release|Win32"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="ZLIB_INTERNAL"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|x64"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="ZLIB_INTERNAL"
+ />
+ </FileConfiguration>
+ <FileConfiguration
+ Name="Release|Itanium"
+ >
+ <Tool
+ Name="VCCLCompilerTool"
+ AdditionalIncludeDirectories=""
+ PreprocessorDefinitions="ZLIB_INTERNAL"
+ />
+ </FileConfiguration>
+ </File>
+ <File
+ RelativePath=".\zlib.rc"
+ >
+ </File>
+ <File
+ RelativePath=".\zlibvc.def"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\zutil.c"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Header Files"
+ Filter="h;hpp;hxx;hm;inl;fi;fd"
+ >
+ <File
+ RelativePath="..\..\..\deflate.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\infblock.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\infcodes.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inffast.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\inftrees.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\infutil.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\zconf.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\zlib.h"
+ >
+ </File>
+ <File
+ RelativePath="..\..\..\zutil.h"
+ >
+ </File>
+ </Filter>
+ <Filter
+ Name="Resource Files"
+ Filter="ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe"
+ >
+ </Filter>
+ </Files>
+ <Globals>
+ </Globals>
+</VisualStudioProject>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.c
new file mode 100644
index 000000000..9580440c0
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.c
@@ -0,0 +1,442 @@
+/* crc32.c -- compute the CRC-32 of a data stream
+ * Copyright (C) 1995-2006, 2010, 2011, 2012, 2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
+ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
+ * tables for updating the shift register in one step with three exclusive-ors
+ * instead of four steps with four exclusive-ors. This results in about a
+ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
+ */
+
+/* @(#) $Id$ */
+
+/*
+ Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
+ protection on the static variables used to control the first-use generation
+ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
+ first call get_crc_table() to initialize the tables before allowing more than
+ one thread to use crc32().
+
+ DYNAMIC_CRC_TABLE and MAKECRCH can be #defined to write out crc32.h.
+ */
+
+#ifdef MAKECRCH
+# include <stdio.h>
+# ifndef DYNAMIC_CRC_TABLE
+# define DYNAMIC_CRC_TABLE
+# endif /* !DYNAMIC_CRC_TABLE */
+#endif /* MAKECRCH */
+
+#include "zutil.h" /* for STDC and FAR definitions */
+
+/* Definitions for doing the crc four data bytes at a time. */
+#if !defined(NOBYFOUR) && defined(Z_U4)
+# define BYFOUR
+#endif
+#ifdef BYFOUR
+ local unsigned long crc32_little OF((unsigned long,
+ const unsigned char FAR *, z_size_t));
+ local unsigned long crc32_big OF((unsigned long,
+ const unsigned char FAR *, z_size_t));
+# define TBLS 8
+#else
+# define TBLS 1
+#endif /* BYFOUR */
+
+/* Local functions for crc concatenation */
+local unsigned long gf2_matrix_times OF((unsigned long *mat,
+ unsigned long vec));
+local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
+local uLong crc32_combine_ OF((uLong crc1, uLong crc2, z_off64_t len2));
+
+
+#ifdef DYNAMIC_CRC_TABLE
+
+local volatile int crc_table_empty = 1;
+local z_crc_t FAR crc_table[TBLS][256];
+local void make_crc_table OF((void));
+#ifdef MAKECRCH
+ local void write_table OF((FILE *, const z_crc_t FAR *));
+#endif /* MAKECRCH */
+/*
+ Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
+ x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+
+ Polynomials over GF(2) are represented in binary, one bit per coefficient,
+ with the lowest powers in the most significant bit. Then adding polynomials
+ is just exclusive-or, and multiplying a polynomial by x is a right shift by
+ one. If we call the above polynomial p, and represent a byte as the
+ polynomial q, also with the lowest power in the most significant bit (so the
+ byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+ where a mod b means the remainder after dividing a by b.
+
+ This calculation is done using the shift-register method of multiplying and
+ taking the remainder. The register is initialized to zero, and for each
+ incoming bit, x^32 is added mod p to the register if the bit is a one (where
+ x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
+ x (which is shifting right by one and adding x^32 mod p if the bit shifted
+ out is a one). We start with the highest power (least significant bit) of
+ q and repeat for all eight bits of q.
+
+ The first table is simply the CRC of all possible eight bit values. This is
+ all the information needed to generate CRCs on data a byte at a time for all
+ combinations of CRC register values and incoming bytes. The remaining tables
+ allow for word-at-a-time CRC calculation for both big-endian and little-
+ endian machines, where a word is four bytes.
+*/
+local void make_crc_table()
+{
+ z_crc_t c;
+ int n, k;
+ z_crc_t poly; /* polynomial exclusive-or pattern */
+ /* terms of polynomial defining this crc (except x^32): */
+ static volatile int first = 1; /* flag to limit concurrent making */
+ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+
+ /* See if another task is already doing this (not thread-safe, but better
+ than nothing -- significantly reduces duration of vulnerability in
+ case the advice about DYNAMIC_CRC_TABLE is ignored) */
+ if (first) {
+ first = 0;
+
+ /* make exclusive-or pattern from polynomial (0xedb88320UL) */
+ poly = 0;
+ for (n = 0; n < (int)(sizeof(p)/sizeof(unsigned char)); n++)
+ poly |= (z_crc_t)1 << (31 - p[n]);
+
+ /* generate a crc for every 8-bit value */
+ for (n = 0; n < 256; n++) {
+ c = (z_crc_t)n;
+ for (k = 0; k < 8; k++)
+ c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+ crc_table[0][n] = c;
+ }
+
+#ifdef BYFOUR
+ /* generate crc for each value followed by one, two, and three zeros,
+ and then the byte reversal of those as well as the first table */
+ for (n = 0; n < 256; n++) {
+ c = crc_table[0][n];
+ crc_table[4][n] = ZSWAP32(c);
+ for (k = 1; k < 4; k++) {
+ c = crc_table[0][c & 0xff] ^ (c >> 8);
+ crc_table[k][n] = c;
+ crc_table[k + 4][n] = ZSWAP32(c);
+ }
+ }
+#endif /* BYFOUR */
+
+ crc_table_empty = 0;
+ }
+ else { /* not first */
+ /* wait for the other guy to finish (not efficient, but rare) */
+ while (crc_table_empty)
+ ;
+ }
+
+#ifdef MAKECRCH
+ /* write out CRC tables to crc32.h */
+ {
+ FILE *out;
+
+ out = fopen("crc32.h", "w");
+ if (out == NULL) return;
+ fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
+ fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
+ fprintf(out, "local const z_crc_t FAR ");
+ fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
+ write_table(out, crc_table[0]);
+# ifdef BYFOUR
+ fprintf(out, "#ifdef BYFOUR\n");
+ for (k = 1; k < 8; k++) {
+ fprintf(out, " },\n {\n");
+ write_table(out, crc_table[k]);
+ }
+ fprintf(out, "#endif\n");
+# endif /* BYFOUR */
+ fprintf(out, " }\n};\n");
+ fclose(out);
+ }
+#endif /* MAKECRCH */
+}
+
+#ifdef MAKECRCH
+local void write_table(out, table)
+ FILE *out;
+ const z_crc_t FAR *table;
+{
+ int n;
+
+ for (n = 0; n < 256; n++)
+ fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ",
+ (unsigned long)(table[n]),
+ n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
+}
+#endif /* MAKECRCH */
+
+#else /* !DYNAMIC_CRC_TABLE */
+/* ========================================================================
+ * Tables of CRC-32s of all single-byte values, made by make_crc_table().
+ */
+#include "crc32.h"
+#endif /* DYNAMIC_CRC_TABLE */
+
+/* =========================================================================
+ * This function can be used by asm versions of crc32()
+ */
+const z_crc_t FAR * ZEXPORT get_crc_table()
+{
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty)
+ make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+ return (const z_crc_t FAR *)crc_table;
+}
+
+/* ========================================================================= */
+#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
+#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
+
+/* ========================================================================= */
+unsigned long ZEXPORT crc32_z(crc, buf, len)
+ unsigned long crc;
+ const unsigned char FAR *buf;
+ z_size_t len;
+{
+ if (buf == Z_NULL) return 0UL;
+
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty)
+ make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+
+#ifdef BYFOUR
+ if (sizeof(void *) == sizeof(ptrdiff_t)) {
+ z_crc_t endian;
+
+ endian = 1;
+ if (*((unsigned char *)(&endian)))
+ return crc32_little(crc, buf, len);
+ else
+ return crc32_big(crc, buf, len);
+ }
+#endif /* BYFOUR */
+ crc = crc ^ 0xffffffffUL;
+ while (len >= 8) {
+ DO8;
+ len -= 8;
+ }
+ if (len) do {
+ DO1;
+ } while (--len);
+ return crc ^ 0xffffffffUL;
+}
+
+/* ========================================================================= */
+unsigned long ZEXPORT crc32(crc, buf, len)
+ unsigned long crc;
+ const unsigned char FAR *buf;
+ uInt len;
+{
+ return crc32_z(crc, buf, len);
+}
+
+#ifdef BYFOUR
+
+/*
+ This BYFOUR code accesses the passed unsigned char * buffer with a 32-bit
+ integer pointer type. This violates the strict aliasing rule, where a
+ compiler can assume, for optimization purposes, that two pointers to
+ fundamentally different types won't ever point to the same memory. This can
+ manifest as a problem only if one of the pointers is written to. This code
+ only reads from those pointers. So long as this code remains isolated in
+ this compilation unit, there won't be a problem. For this reason, this code
+ should not be copied and pasted into a compilation unit in which other code
+ writes to the buffer that is passed to these routines.
+ */
+
+/* ========================================================================= */
+#define DOLIT4 c ^= *buf4++; \
+ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
+ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
+#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
+
+/* ========================================================================= */
+local unsigned long crc32_little(crc, buf, len)
+ unsigned long crc;
+ const unsigned char FAR *buf;
+ z_size_t len;
+{
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
+
+ c = (z_crc_t)crc;
+ c = ~c;
+ while (len && ((ptrdiff_t)buf & 3)) {
+ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+ len--;
+ }
+
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
+ while (len >= 32) {
+ DOLIT32;
+ len -= 32;
+ }
+ while (len >= 4) {
+ DOLIT4;
+ len -= 4;
+ }
+ buf = (const unsigned char FAR *)buf4;
+
+ if (len) do {
+ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+ } while (--len);
+ c = ~c;
+ return (unsigned long)c;
+}
+
+/* ========================================================================= */
+#define DOBIG4 c ^= *buf4++; \
+ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
+ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
+#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
+
+/* ========================================================================= */
+local unsigned long crc32_big(crc, buf, len)
+ unsigned long crc;
+ const unsigned char FAR *buf;
+ z_size_t len;
+{
+ register z_crc_t c;
+ register const z_crc_t FAR *buf4;
+
+ c = ZSWAP32((z_crc_t)crc);
+ c = ~c;
+ while (len && ((ptrdiff_t)buf & 3)) {
+ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+ len--;
+ }
+
+ buf4 = (const z_crc_t FAR *)(const void FAR *)buf;
+ while (len >= 32) {
+ DOBIG32;
+ len -= 32;
+ }
+ while (len >= 4) {
+ DOBIG4;
+ len -= 4;
+ }
+ buf = (const unsigned char FAR *)buf4;
+
+ if (len) do {
+ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+ } while (--len);
+ c = ~c;
+ return (unsigned long)(ZSWAP32(c));
+}
+
+#endif /* BYFOUR */
+
+#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
+
+/* ========================================================================= */
+local unsigned long gf2_matrix_times(mat, vec)
+ unsigned long *mat;
+ unsigned long vec;
+{
+ unsigned long sum;
+
+ sum = 0;
+ while (vec) {
+ if (vec & 1)
+ sum ^= *mat;
+ vec >>= 1;
+ mat++;
+ }
+ return sum;
+}
+
+/* ========================================================================= */
+local void gf2_matrix_square(square, mat)
+ unsigned long *square;
+ unsigned long *mat;
+{
+ int n;
+
+ for (n = 0; n < GF2_DIM; n++)
+ square[n] = gf2_matrix_times(mat, mat[n]);
+}
+
+/* ========================================================================= */
+local uLong crc32_combine_(crc1, crc2, len2)
+ uLong crc1;
+ uLong crc2;
+ z_off64_t len2;
+{
+ int n;
+ unsigned long row;
+ unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */
+ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */
+
+ /* degenerate case (also disallow negative lengths) */
+ if (len2 <= 0)
+ return crc1;
+
+ /* put operator for one zero bit in odd */
+ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */
+ row = 1;
+ for (n = 1; n < GF2_DIM; n++) {
+ odd[n] = row;
+ row <<= 1;
+ }
+
+ /* put operator for two zero bits in even */
+ gf2_matrix_square(even, odd);
+
+ /* put operator for four zero bits in odd */
+ gf2_matrix_square(odd, even);
+
+ /* apply len2 zeros to crc1 (first square will put the operator for one
+ zero byte, eight zero bits, in even) */
+ do {
+ /* apply zeros operator for this bit of len2 */
+ gf2_matrix_square(even, odd);
+ if (len2 & 1)
+ crc1 = gf2_matrix_times(even, crc1);
+ len2 >>= 1;
+
+ /* if no more bits set, then done */
+ if (len2 == 0)
+ break;
+
+ /* another iteration of the loop with odd and even swapped */
+ gf2_matrix_square(odd, even);
+ if (len2 & 1)
+ crc1 = gf2_matrix_times(odd, crc1);
+ len2 >>= 1;
+
+ /* if no more bits set, then done */
+ } while (len2 != 0);
+
+ /* return combined crc */
+ crc1 ^= crc2;
+ return crc1;
+}
+
+/* ========================================================================= */
+uLong ZEXPORT crc32_combine(crc1, crc2, len2)
+ uLong crc1;
+ uLong crc2;
+ z_off_t len2;
+{
+ return crc32_combine_(crc1, crc2, len2);
+}
+
+uLong ZEXPORT crc32_combine64(crc1, crc2, len2)
+ uLong crc1;
+ uLong crc2;
+ z_off64_t len2;
+{
+ return crc32_combine_(crc1, crc2, len2);
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.h
new file mode 100644
index 000000000..9e0c77810
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/crc32.h
@@ -0,0 +1,441 @@
+/* crc32.h -- tables for rapid CRC calculation
+ * Generated automatically by crc32.c
+ */
+
+local const z_crc_t FAR crc_table[TBLS][256] =
+{
+ {
+ 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
+ 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
+ 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
+ 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
+ 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
+ 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
+ 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
+ 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
+ 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
+ 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
+ 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
+ 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
+ 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
+ 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
+ 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
+ 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
+ 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
+ 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
+ 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
+ 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
+ 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
+ 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
+ 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
+ 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
+ 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
+ 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
+ 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
+ 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
+ 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
+ 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
+ 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
+ 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
+ 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
+ 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
+ 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
+ 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
+ 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
+ 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
+ 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
+ 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
+ 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
+ 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
+ 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
+ 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
+ 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
+ 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
+ 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
+ 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
+ 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
+ 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
+ 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
+ 0x2d02ef8dUL
+#ifdef BYFOUR
+ },
+ {
+ 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
+ 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
+ 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
+ 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
+ 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
+ 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
+ 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
+ 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
+ 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
+ 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
+ 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
+ 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
+ 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
+ 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
+ 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
+ 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
+ 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
+ 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
+ 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
+ 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
+ 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
+ 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
+ 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
+ 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
+ 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
+ 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
+ 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
+ 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
+ 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
+ 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
+ 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
+ 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
+ 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
+ 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
+ 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
+ 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
+ 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
+ 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
+ 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
+ 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
+ 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
+ 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
+ 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
+ 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
+ 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
+ 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
+ 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
+ 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
+ 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
+ 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
+ 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
+ 0x9324fd72UL
+ },
+ {
+ 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
+ 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
+ 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
+ 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
+ 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
+ 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
+ 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
+ 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
+ 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
+ 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
+ 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
+ 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
+ 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
+ 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
+ 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
+ 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
+ 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
+ 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
+ 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
+ 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
+ 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
+ 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
+ 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
+ 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
+ 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
+ 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
+ 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
+ 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
+ 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
+ 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
+ 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
+ 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
+ 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
+ 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
+ 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
+ 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
+ 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
+ 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
+ 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
+ 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
+ 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
+ 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
+ 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
+ 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
+ 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
+ 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
+ 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
+ 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
+ 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
+ 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
+ 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
+ 0xbe9834edUL
+ },
+ {
+ 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
+ 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
+ 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
+ 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
+ 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
+ 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
+ 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
+ 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
+ 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
+ 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
+ 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
+ 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
+ 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
+ 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
+ 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
+ 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
+ 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
+ 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
+ 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
+ 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
+ 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
+ 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
+ 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
+ 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
+ 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
+ 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
+ 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
+ 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
+ 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
+ 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
+ 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
+ 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
+ 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
+ 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
+ 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
+ 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
+ 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
+ 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
+ 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
+ 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
+ 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
+ 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
+ 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
+ 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
+ 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
+ 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
+ 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
+ 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
+ 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
+ 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
+ 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
+ 0xde0506f1UL
+ },
+ {
+ 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
+ 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
+ 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
+ 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
+ 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
+ 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
+ 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
+ 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
+ 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
+ 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
+ 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
+ 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
+ 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
+ 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
+ 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
+ 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
+ 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
+ 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
+ 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
+ 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
+ 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
+ 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
+ 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
+ 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
+ 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
+ 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
+ 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
+ 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
+ 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
+ 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
+ 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
+ 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
+ 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
+ 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
+ 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
+ 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
+ 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
+ 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
+ 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
+ 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
+ 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
+ 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
+ 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
+ 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
+ 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
+ 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
+ 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
+ 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
+ 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
+ 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
+ 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
+ 0x8def022dUL
+ },
+ {
+ 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
+ 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
+ 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
+ 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
+ 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
+ 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
+ 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
+ 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
+ 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
+ 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
+ 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
+ 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
+ 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
+ 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
+ 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
+ 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
+ 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
+ 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
+ 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
+ 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
+ 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
+ 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
+ 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
+ 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
+ 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
+ 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
+ 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
+ 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
+ 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
+ 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
+ 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
+ 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
+ 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
+ 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
+ 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
+ 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
+ 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
+ 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
+ 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
+ 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
+ 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
+ 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
+ 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
+ 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
+ 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
+ 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
+ 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
+ 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
+ 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
+ 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
+ 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
+ 0x72fd2493UL
+ },
+ {
+ 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
+ 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
+ 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
+ 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
+ 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
+ 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
+ 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
+ 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
+ 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
+ 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
+ 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
+ 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
+ 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
+ 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
+ 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
+ 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
+ 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
+ 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
+ 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
+ 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
+ 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
+ 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
+ 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
+ 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
+ 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
+ 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
+ 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
+ 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
+ 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
+ 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
+ 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
+ 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
+ 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
+ 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
+ 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
+ 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
+ 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
+ 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
+ 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
+ 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
+ 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
+ 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
+ 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
+ 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
+ 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
+ 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
+ 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
+ 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
+ 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
+ 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
+ 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
+ 0xed3498beUL
+ },
+ {
+ 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
+ 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
+ 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
+ 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
+ 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
+ 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
+ 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
+ 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
+ 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
+ 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
+ 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
+ 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
+ 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
+ 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
+ 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
+ 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
+ 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
+ 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
+ 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
+ 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
+ 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
+ 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
+ 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
+ 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
+ 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
+ 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
+ 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
+ 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
+ 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
+ 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
+ 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
+ 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
+ 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
+ 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
+ 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
+ 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
+ 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
+ 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
+ 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
+ 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
+ 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
+ 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
+ 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
+ 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
+ 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
+ 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
+ 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
+ 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
+ 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
+ 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
+ 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
+ 0xf10605deUL
+#endif
+ }
+};
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.c
new file mode 100644
index 000000000..1ec761448
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.c
@@ -0,0 +1,2163 @@
+/* deflate.c -- compress data using the deflation algorithm
+ * Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process depends on being able to identify portions
+ * of the input text which are identical to earlier input (within a
+ * sliding window trailing behind the input currently being processed).
+ *
+ * The most straightforward technique turns out to be the fastest for
+ * most input files: try all possible matches and select the longest.
+ * The key feature of this algorithm is that insertions into the string
+ * dictionary are very simple and thus fast, and deletions are avoided
+ * completely. Insertions are performed at each input character, whereas
+ * string matches are performed only when the previous match ends. So it
+ * is preferable to spend more time in matches to allow very fast string
+ * insertions and avoid deletions. The matching algorithm for small
+ * strings is inspired from that of Rabin & Karp. A brute force approach
+ * is used to find longer strings when a small match has been found.
+ * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
+ * (by Leonid Broukhis).
+ * A previous version of this file used a more sophisticated algorithm
+ * (by Fiala and Greene) which is guaranteed to run in linear amortized
+ * time, but has a larger average cost, uses more memory and is patented.
+ * However the F&G algorithm may be faster for some highly redundant
+ * files if the parameter max_chain_length (described below) is too large.
+ *
+ * ACKNOWLEDGEMENTS
+ *
+ * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
+ * I found it in 'freeze' written by Leonid Broukhis.
+ * Thanks to many people for bug reports and testing.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
+ * Available in http://tools.ietf.org/html/rfc1951
+ *
+ * A description of the Rabin and Karp algorithm is given in the book
+ * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
+ *
+ * Fiala,E.R., and Greene,D.H.
+ * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
+ *
+ */
+
+/* @(#) $Id$ */
+
+#include "deflate.h"
+
+const char deflate_copyright[] =
+ " deflate 1.2.11 Copyright 1995-2017 Jean-loup Gailly and Mark Adler ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/* ===========================================================================
+ * Function prototypes.
+ */
+typedef enum {
+ need_more, /* block not completed, need more input or more output */
+ block_done, /* block flush performed */
+ finish_started, /* finish started, need only more output at next deflate */
+ finish_done /* finish done, accept no more input or output */
+} block_state;
+
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+/* Compression function. Returns the block state after the call. */
+
+local int deflateStateCheck OF((z_streamp strm));
+local void slide_hash OF((deflate_state *s));
+local void fill_window OF((deflate_state *s));
+local block_state deflate_stored OF((deflate_state *s, int flush));
+local block_state deflate_fast OF((deflate_state *s, int flush));
+#ifndef FASTEST
+local block_state deflate_slow OF((deflate_state *s, int flush));
+#endif
+local block_state deflate_rle OF((deflate_state *s, int flush));
+local block_state deflate_huff OF((deflate_state *s, int flush));
+local void lm_init OF((deflate_state *s));
+local void putShortMSB OF((deflate_state *s, uInt b));
+local void flush_pending OF((z_streamp strm));
+local unsigned read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
+#ifdef ASMV
+# pragma message("Assembler code may have bugs -- use at your own risk")
+ void match_init OF((void)); /* asm code initialization */
+ uInt longest_match OF((deflate_state *s, IPos cur_match));
+#else
+local uInt longest_match OF((deflate_state *s, IPos cur_match));
+#endif
+
+#ifdef ZLIB_DEBUG
+local void check_match OF((deflate_state *s, IPos start, IPos match,
+ int length));
+#endif
+
+/* ===========================================================================
+ * Local data
+ */
+
+#define NIL 0
+/* Tail of hash chains */
+
+#ifndef TOO_FAR
+# define TOO_FAR 4096
+#endif
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+typedef struct config_s {
+ ush good_length; /* reduce lazy search above this match length */
+ ush max_lazy; /* do not perform lazy search above this match length */
+ ush nice_length; /* quit search above this match length */
+ ush max_chain;
+ compress_func func;
+} config;
+
+#ifdef FASTEST
+local const config configuration_table[2] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
+/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */
+#else
+local const config configuration_table[10] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
+/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */
+/* 2 */ {4, 5, 16, 8, deflate_fast},
+/* 3 */ {4, 6, 32, 32, deflate_fast},
+
+/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
+/* 5 */ {8, 16, 32, 32, deflate_slow},
+/* 6 */ {8, 16, 128, 128, deflate_slow},
+/* 7 */ {8, 32, 128, 256, deflate_slow},
+/* 8 */ {32, 128, 258, 1024, deflate_slow},
+/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
+#endif
+
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
+ * meaning.
+ */
+
+/* rank Z_BLOCK between Z_NO_FLUSH and Z_PARTIAL_FLUSH */
+#define RANK(f) (((f) * 2) - ((f) > 4 ? 9 : 0))
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN assertion: all calls to UPDATE_HASH are made with consecutive input
+ * characters, so that a running hash key can be computed from the previous
+ * key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
+
+
+/* ===========================================================================
+ * Insert string str in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * If this file is compiled with -DFASTEST, the compression level is forced
+ * to 1, and no hash chains are maintained.
+ * IN assertion: all calls to INSERT_STRING are made with consecutive input
+ * characters and the first MIN_MATCH bytes of str are valid (except for
+ * the last MIN_MATCH-1 bytes of the input file).
+ */
+#ifdef FASTEST
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ match_head = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#else
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#endif
+
+/* ===========================================================================
+ * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
+ * prev[] will be initialized on the fly.
+ */
+#define CLEAR_HASH(s) \
+ s->head[s->hash_size-1] = NIL; \
+ zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
+
+/* ===========================================================================
+ * Slide the hash table when sliding the window down (could be avoided with 32
+ * bit values at the expense of memory usage). We slide even when level == 0 to
+ * keep the hash table consistent if we switch back to level > 0 later.
+ */
+local void slide_hash(s)
+ deflate_state *s;
+{
+ unsigned n, m;
+ Posf *p;
+ uInt wsize = s->w_size;
+
+ n = s->hash_size;
+ p = &s->head[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m - wsize : NIL);
+ } while (--n);
+ n = wsize;
+#ifndef FASTEST
+ p = &s->prev[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m - wsize : NIL);
+ /* If n is not on any hash chain, prev[n] is garbage but
+ * its value will never be used.
+ */
+ } while (--n);
+#endif
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateInit_(strm, level, version, stream_size)
+ z_streamp strm;
+ int level;
+ const char *version;
+ int stream_size;
+{
+ return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
+ Z_DEFAULT_STRATEGY, version, stream_size);
+ /* To do: ignore strm->next_in if we use it as window */
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+ version, stream_size)
+ z_streamp strm;
+ int level;
+ int method;
+ int windowBits;
+ int memLevel;
+ int strategy;
+ const char *version;
+ int stream_size;
+{
+ deflate_state *s;
+ int wrap = 1;
+ static const char my_version[] = ZLIB_VERSION;
+
+ ushf *overlay;
+ /* We overlay pending_buf and d_buf+l_buf. This works since the average
+ * output size for (length,distance) codes is <= 24 bits.
+ */
+
+ if (version == Z_NULL || version[0] != my_version[0] ||
+ stream_size != sizeof(z_stream)) {
+ return Z_VERSION_ERROR;
+ }
+ if (strm == Z_NULL) return Z_STREAM_ERROR;
+
+ strm->msg = Z_NULL;
+ if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+#endif
+ }
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
+
+#ifdef FASTEST
+ if (level != 0) level = 1;
+#else
+ if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+
+ if (windowBits < 0) { /* suppress zlib wrapper */
+ wrap = 0;
+ windowBits = -windowBits;
+ }
+#ifdef GZIP
+ else if (windowBits > 15) {
+ wrap = 2; /* write gzip wrapper instead */
+ windowBits -= 16;
+ }
+#endif
+ if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
+ windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+ strategy < 0 || strategy > Z_FIXED || (windowBits == 8 && wrap != 1)) {
+ return Z_STREAM_ERROR;
+ }
+ if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
+ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
+ if (s == Z_NULL) return Z_MEM_ERROR;
+ strm->state = (struct internal_state FAR *)s;
+ s->strm = strm;
+ s->status = INIT_STATE; /* to pass state test in deflateReset() */
+
+ s->wrap = wrap;
+ s->gzhead = Z_NULL;
+ s->w_bits = (uInt)windowBits;
+ s->w_size = 1 << s->w_bits;
+ s->w_mask = s->w_size - 1;
+
+ s->hash_bits = (uInt)memLevel + 7;
+ s->hash_size = 1 << s->hash_bits;
+ s->hash_mask = s->hash_size - 1;
+ s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+
+ s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
+ s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
+ s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
+
+ s->high_water = 0; /* nothing written to s->window yet */
+
+ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+ s->pending_buf = (uchf *) overlay;
+ s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
+
+ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
+ s->pending_buf == Z_NULL) {
+ s->status = FINISH_STATE;
+ strm->msg = ERR_MSG(Z_MEM_ERROR);
+ deflateEnd (strm);
+ return Z_MEM_ERROR;
+ }
+ s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+ s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+
+ s->level = level;
+ s->strategy = strategy;
+ s->method = (Byte)method;
+
+ return deflateReset(strm);
+}
+
+/* =========================================================================
+ * Check for a valid deflate stream state. Return 0 if ok, 1 if not.
+ */
+local int deflateStateCheck (strm)
+ z_streamp strm;
+{
+ deflate_state *s;
+ if (strm == Z_NULL ||
+ strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
+ return 1;
+ s = strm->state;
+ if (s == Z_NULL || s->strm != strm || (s->status != INIT_STATE &&
+#ifdef GZIP
+ s->status != GZIP_STATE &&
+#endif
+ s->status != EXTRA_STATE &&
+ s->status != NAME_STATE &&
+ s->status != COMMENT_STATE &&
+ s->status != HCRC_STATE &&
+ s->status != BUSY_STATE &&
+ s->status != FINISH_STATE))
+ return 1;
+ return 0;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
+ z_streamp strm;
+ const Bytef *dictionary;
+ uInt dictLength;
+{
+ deflate_state *s;
+ uInt str, n;
+ int wrap;
+ unsigned avail;
+ z_const unsigned char *next;
+
+ if (deflateStateCheck(strm) || dictionary == Z_NULL)
+ return Z_STREAM_ERROR;
+ s = strm->state;
+ wrap = s->wrap;
+ if (wrap == 2 || (wrap == 1 && s->status != INIT_STATE) || s->lookahead)
+ return Z_STREAM_ERROR;
+
+ /* when using zlib wrappers, compute Adler-32 for provided dictionary */
+ if (wrap == 1)
+ strm->adler = adler32(strm->adler, dictionary, dictLength);
+ s->wrap = 0; /* avoid computing Adler-32 in read_buf */
+
+ /* if dictionary would fill window, just replace the history */
+ if (dictLength >= s->w_size) {
+ if (wrap == 0) { /* already empty otherwise */
+ CLEAR_HASH(s);
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->insert = 0;
+ }
+ dictionary += dictLength - s->w_size; /* use the tail */
+ dictLength = s->w_size;
+ }
+
+ /* insert dictionary into window and hash */
+ avail = strm->avail_in;
+ next = strm->next_in;
+ strm->avail_in = dictLength;
+ strm->next_in = (z_const Bytef *)dictionary;
+ fill_window(s);
+ while (s->lookahead >= MIN_MATCH) {
+ str = s->strstart;
+ n = s->lookahead - (MIN_MATCH-1);
+ do {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ } while (--n);
+ s->strstart = str;
+ s->lookahead = MIN_MATCH-1;
+ fill_window(s);
+ }
+ s->strstart += s->lookahead;
+ s->block_start = (long)s->strstart;
+ s->insert = s->lookahead;
+ s->lookahead = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ strm->next_in = next;
+ strm->avail_in = avail;
+ s->wrap = wrap;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateGetDictionary (strm, dictionary, dictLength)
+ z_streamp strm;
+ Bytef *dictionary;
+ uInt *dictLength;
+{
+ deflate_state *s;
+ uInt len;
+
+ if (deflateStateCheck(strm))
+ return Z_STREAM_ERROR;
+ s = strm->state;
+ len = s->strstart + s->lookahead;
+ if (len > s->w_size)
+ len = s->w_size;
+ if (dictionary != Z_NULL && len)
+ zmemcpy(dictionary, s->window + s->strstart + s->lookahead - len, len);
+ if (dictLength != Z_NULL)
+ *dictLength = len;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateResetKeep (strm)
+ z_streamp strm;
+{
+ deflate_state *s;
+
+ if (deflateStateCheck(strm)) {
+ return Z_STREAM_ERROR;
+ }
+
+ strm->total_in = strm->total_out = 0;
+ strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
+ strm->data_type = Z_UNKNOWN;
+
+ s = (deflate_state *)strm->state;
+ s->pending = 0;
+ s->pending_out = s->pending_buf;
+
+ if (s->wrap < 0) {
+ s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
+ }
+ s->status =
+#ifdef GZIP
+ s->wrap == 2 ? GZIP_STATE :
+#endif
+ s->wrap ? INIT_STATE : BUSY_STATE;
+ strm->adler =
+#ifdef GZIP
+ s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
+#endif
+ adler32(0L, Z_NULL, 0);
+ s->last_flush = Z_NO_FLUSH;
+
+ _tr_init(s);
+
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateReset (strm)
+ z_streamp strm;
+{
+ int ret;
+
+ ret = deflateResetKeep(strm);
+ if (ret == Z_OK)
+ lm_init(strm->state);
+ return ret;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetHeader (strm, head)
+ z_streamp strm;
+ gz_headerp head;
+{
+ if (deflateStateCheck(strm) || strm->state->wrap != 2)
+ return Z_STREAM_ERROR;
+ strm->state->gzhead = head;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflatePending (strm, pending, bits)
+ unsigned *pending;
+ int *bits;
+ z_streamp strm;
+{
+ if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
+ if (pending != Z_NULL)
+ *pending = strm->state->pending;
+ if (bits != Z_NULL)
+ *bits = strm->state->bi_valid;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflatePrime (strm, bits, value)
+ z_streamp strm;
+ int bits;
+ int value;
+{
+ deflate_state *s;
+ int put;
+
+ if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
+ s = strm->state;
+ if ((Bytef *)(s->d_buf) < s->pending_out + ((Buf_size + 7) >> 3))
+ return Z_BUF_ERROR;
+ do {
+ put = Buf_size - s->bi_valid;
+ if (put > bits)
+ put = bits;
+ s->bi_buf |= (ush)((value & ((1 << put) - 1)) << s->bi_valid);
+ s->bi_valid += put;
+ _tr_flush_bits(s);
+ value >>= put;
+ bits -= put;
+ } while (bits);
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateParams(strm, level, strategy)
+ z_streamp strm;
+ int level;
+ int strategy;
+{
+ deflate_state *s;
+ compress_func func;
+
+ if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
+ s = strm->state;
+
+#ifdef FASTEST
+ if (level != 0) level = 1;
+#else
+ if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+ if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
+ return Z_STREAM_ERROR;
+ }
+ func = configuration_table[s->level].func;
+
+ if ((strategy != s->strategy || func != configuration_table[level].func) &&
+ s->high_water) {
+ /* Flush the last buffer: */
+ int err = deflate(strm, Z_BLOCK);
+ if (err == Z_STREAM_ERROR)
+ return err;
+ if (strm->avail_out == 0)
+ return Z_BUF_ERROR;
+ }
+ if (s->level != level) {
+ if (s->level == 0 && s->matches != 0) {
+ if (s->matches == 1)
+ slide_hash(s);
+ else
+ CLEAR_HASH(s);
+ s->matches = 0;
+ }
+ s->level = level;
+ s->max_lazy_match = configuration_table[level].max_lazy;
+ s->good_match = configuration_table[level].good_length;
+ s->nice_match = configuration_table[level].nice_length;
+ s->max_chain_length = configuration_table[level].max_chain;
+ }
+ s->strategy = strategy;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
+ z_streamp strm;
+ int good_length;
+ int max_lazy;
+ int nice_length;
+ int max_chain;
+{
+ deflate_state *s;
+
+ if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
+ s = strm->state;
+ s->good_match = (uInt)good_length;
+ s->max_lazy_match = (uInt)max_lazy;
+ s->nice_match = nice_length;
+ s->max_chain_length = (uInt)max_chain;
+ return Z_OK;
+}
+
+/* =========================================================================
+ * For the default windowBits of 15 and memLevel of 8, this function returns
+ * a close to exact, as well as small, upper bound on the compressed size.
+ * They are coded as constants here for a reason--if the #define's are
+ * changed, then this function needs to be changed as well. The return
+ * value for 15 and 8 only works for those exact settings.
+ *
+ * For any setting other than those defaults for windowBits and memLevel,
+ * the value returned is a conservative worst case for the maximum expansion
+ * resulting from using fixed blocks instead of stored blocks, which deflate
+ * can emit on compressed data for some combinations of the parameters.
+ *
+ * This function could be more sophisticated to provide closer upper bounds for
+ * every combination of windowBits and memLevel. But even the conservative
+ * upper bound of about 14% expansion does not seem onerous for output buffer
+ * allocation.
+ */
+uLong ZEXPORT deflateBound(strm, sourceLen)
+ z_streamp strm;
+ uLong sourceLen;
+{
+ deflate_state *s;
+ uLong complen, wraplen;
+
+ /* conservative upper bound for compressed data */
+ complen = sourceLen +
+ ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 5;
+
+ /* if can't get parameters, return conservative bound plus zlib wrapper */
+ if (deflateStateCheck(strm))
+ return complen + 6;
+
+ /* compute wrapper length */
+ s = strm->state;
+ switch (s->wrap) {
+ case 0: /* raw deflate */
+ wraplen = 0;
+ break;
+ case 1: /* zlib wrapper */
+ wraplen = 6 + (s->strstart ? 4 : 0);
+ break;
+#ifdef GZIP
+ case 2: /* gzip wrapper */
+ wraplen = 18;
+ if (s->gzhead != Z_NULL) { /* user-supplied gzip header */
+ Bytef *str;
+ if (s->gzhead->extra != Z_NULL)
+ wraplen += 2 + s->gzhead->extra_len;
+ str = s->gzhead->name;
+ if (str != Z_NULL)
+ do {
+ wraplen++;
+ } while (*str++);
+ str = s->gzhead->comment;
+ if (str != Z_NULL)
+ do {
+ wraplen++;
+ } while (*str++);
+ if (s->gzhead->hcrc)
+ wraplen += 2;
+ }
+ break;
+#endif
+ default: /* for compiler happiness */
+ wraplen = 6;
+ }
+
+ /* if not default parameters, return conservative bound */
+ if (s->w_bits != 15 || s->hash_bits != 8 + 7)
+ return complen + wraplen;
+
+ /* default settings: return tight bound for that case */
+ return sourceLen + (sourceLen >> 12) + (sourceLen >> 14) +
+ (sourceLen >> 25) + 13 - 6 + wraplen;
+}
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
+ */
+local void putShortMSB (s, b)
+ deflate_state *s;
+ uInt b;
+{
+ put_byte(s, (Byte)(b >> 8));
+ put_byte(s, (Byte)(b & 0xff));
+}
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output, except for
+ * some deflate_stored() output, goes through this function so some
+ * applications may wish to modify it to avoid allocating a large
+ * strm->next_out buffer and copying into it. (See also read_buf()).
+ */
+local void flush_pending(strm)
+ z_streamp strm;
+{
+ unsigned len;
+ deflate_state *s = strm->state;
+
+ _tr_flush_bits(s);
+ len = s->pending;
+ if (len > strm->avail_out) len = strm->avail_out;
+ if (len == 0) return;
+
+ zmemcpy(strm->next_out, s->pending_out, len);
+ strm->next_out += len;
+ s->pending_out += len;
+ strm->total_out += len;
+ strm->avail_out -= len;
+ s->pending -= len;
+ if (s->pending == 0) {
+ s->pending_out = s->pending_buf;
+ }
+}
+
+/* ===========================================================================
+ * Update the header CRC with the bytes s->pending_buf[beg..s->pending - 1].
+ */
+#define HCRC_UPDATE(beg) \
+ do { \
+ if (s->gzhead->hcrc && s->pending > (beg)) \
+ strm->adler = crc32(strm->adler, s->pending_buf + (beg), \
+ s->pending - (beg)); \
+ } while (0)
+
+/* ========================================================================= */
+int ZEXPORT deflate (strm, flush)
+ z_streamp strm;
+ int flush;
+{
+ int old_flush; /* value of flush param for previous deflate call */
+ deflate_state *s;
+
+ if (deflateStateCheck(strm) || flush > Z_BLOCK || flush < 0) {
+ return Z_STREAM_ERROR;
+ }
+ s = strm->state;
+
+ if (strm->next_out == Z_NULL ||
+ (strm->avail_in != 0 && strm->next_in == Z_NULL) ||
+ (s->status == FINISH_STATE && flush != Z_FINISH)) {
+ ERR_RETURN(strm, Z_STREAM_ERROR);
+ }
+ if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
+
+ old_flush = s->last_flush;
+ s->last_flush = flush;
+
+ /* Flush as much pending output as possible */
+ if (s->pending != 0) {
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ /* Since avail_out is 0, deflate will be called again with
+ * more output space, but possibly with both pending and
+ * avail_in equal to zero. There won't be anything to do,
+ * but this is not an error situation so make sure we
+ * return OK instead of BUF_ERROR at next call of deflate:
+ */
+ s->last_flush = -1;
+ return Z_OK;
+ }
+
+ /* Make sure there is something to do and avoid duplicate consecutive
+ * flushes. For repeated and useless calls with Z_FINISH, we keep
+ * returning Z_STREAM_END instead of Z_BUF_ERROR.
+ */
+ } else if (strm->avail_in == 0 && RANK(flush) <= RANK(old_flush) &&
+ flush != Z_FINISH) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* User must not provide more input after the first FINISH: */
+ if (s->status == FINISH_STATE && strm->avail_in != 0) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* Write the header */
+ if (s->status == INIT_STATE) {
+ /* zlib header */
+ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+ uInt level_flags;
+
+ if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
+ level_flags = 0;
+ else if (s->level < 6)
+ level_flags = 1;
+ else if (s->level == 6)
+ level_flags = 2;
+ else
+ level_flags = 3;
+ header |= (level_flags << 6);
+ if (s->strstart != 0) header |= PRESET_DICT;
+ header += 31 - (header % 31);
+
+ putShortMSB(s, header);
+
+ /* Save the adler32 of the preset dictionary: */
+ if (s->strstart != 0) {
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ }
+ strm->adler = adler32(0L, Z_NULL, 0);
+ s->status = BUSY_STATE;
+
+ /* Compression must start with an empty pending buffer */
+ flush_pending(strm);
+ if (s->pending != 0) {
+ s->last_flush = -1;
+ return Z_OK;
+ }
+ }
+#ifdef GZIP
+ if (s->status == GZIP_STATE) {
+ /* gzip header */
+ strm->adler = crc32(0L, Z_NULL, 0);
+ put_byte(s, 31);
+ put_byte(s, 139);
+ put_byte(s, 8);
+ if (s->gzhead == Z_NULL) {
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, s->level == 9 ? 2 :
+ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+ 4 : 0));
+ put_byte(s, OS_CODE);
+ s->status = BUSY_STATE;
+
+ /* Compression must start with an empty pending buffer */
+ flush_pending(strm);
+ if (s->pending != 0) {
+ s->last_flush = -1;
+ return Z_OK;
+ }
+ }
+ else {
+ put_byte(s, (s->gzhead->text ? 1 : 0) +
+ (s->gzhead->hcrc ? 2 : 0) +
+ (s->gzhead->extra == Z_NULL ? 0 : 4) +
+ (s->gzhead->name == Z_NULL ? 0 : 8) +
+ (s->gzhead->comment == Z_NULL ? 0 : 16)
+ );
+ put_byte(s, (Byte)(s->gzhead->time & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
+ put_byte(s, s->level == 9 ? 2 :
+ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+ 4 : 0));
+ put_byte(s, s->gzhead->os & 0xff);
+ if (s->gzhead->extra != Z_NULL) {
+ put_byte(s, s->gzhead->extra_len & 0xff);
+ put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
+ }
+ if (s->gzhead->hcrc)
+ strm->adler = crc32(strm->adler, s->pending_buf,
+ s->pending);
+ s->gzindex = 0;
+ s->status = EXTRA_STATE;
+ }
+ }
+ if (s->status == EXTRA_STATE) {
+ if (s->gzhead->extra != Z_NULL) {
+ ulg beg = s->pending; /* start of bytes to update crc */
+ uInt left = (s->gzhead->extra_len & 0xffff) - s->gzindex;
+ while (s->pending + left > s->pending_buf_size) {
+ uInt copy = s->pending_buf_size - s->pending;
+ zmemcpy(s->pending_buf + s->pending,
+ s->gzhead->extra + s->gzindex, copy);
+ s->pending = s->pending_buf_size;
+ HCRC_UPDATE(beg);
+ s->gzindex += copy;
+ flush_pending(strm);
+ if (s->pending != 0) {
+ s->last_flush = -1;
+ return Z_OK;
+ }
+ beg = 0;
+ left -= copy;
+ }
+ zmemcpy(s->pending_buf + s->pending,
+ s->gzhead->extra + s->gzindex, left);
+ s->pending += left;
+ HCRC_UPDATE(beg);
+ s->gzindex = 0;
+ }
+ s->status = NAME_STATE;
+ }
+ if (s->status == NAME_STATE) {
+ if (s->gzhead->name != Z_NULL) {
+ ulg beg = s->pending; /* start of bytes to update crc */
+ int val;
+ do {
+ if (s->pending == s->pending_buf_size) {
+ HCRC_UPDATE(beg);
+ flush_pending(strm);
+ if (s->pending != 0) {
+ s->last_flush = -1;
+ return Z_OK;
+ }
+ beg = 0;
+ }
+ val = s->gzhead->name[s->gzindex++];
+ put_byte(s, val);
+ } while (val != 0);
+ HCRC_UPDATE(beg);
+ s->gzindex = 0;
+ }
+ s->status = COMMENT_STATE;
+ }
+ if (s->status == COMMENT_STATE) {
+ if (s->gzhead->comment != Z_NULL) {
+ ulg beg = s->pending; /* start of bytes to update crc */
+ int val;
+ do {
+ if (s->pending == s->pending_buf_size) {
+ HCRC_UPDATE(beg);
+ flush_pending(strm);
+ if (s->pending != 0) {
+ s->last_flush = -1;
+ return Z_OK;
+ }
+ beg = 0;
+ }
+ val = s->gzhead->comment[s->gzindex++];
+ put_byte(s, val);
+ } while (val != 0);
+ HCRC_UPDATE(beg);
+ }
+ s->status = HCRC_STATE;
+ }
+ if (s->status == HCRC_STATE) {
+ if (s->gzhead->hcrc) {
+ if (s->pending + 2 > s->pending_buf_size) {
+ flush_pending(strm);
+ if (s->pending != 0) {
+ s->last_flush = -1;
+ return Z_OK;
+ }
+ }
+ put_byte(s, (Byte)(strm->adler & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+ strm->adler = crc32(0L, Z_NULL, 0);
+ }
+ s->status = BUSY_STATE;
+
+ /* Compression must start with an empty pending buffer */
+ flush_pending(strm);
+ if (s->pending != 0) {
+ s->last_flush = -1;
+ return Z_OK;
+ }
+ }
+#endif
+
+ /* Start a new block or continue the current one.
+ */
+ if (strm->avail_in != 0 || s->lookahead != 0 ||
+ (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
+ block_state bstate;
+
+ bstate = s->level == 0 ? deflate_stored(s, flush) :
+ s->strategy == Z_HUFFMAN_ONLY ? deflate_huff(s, flush) :
+ s->strategy == Z_RLE ? deflate_rle(s, flush) :
+ (*(configuration_table[s->level].func))(s, flush);
+
+ if (bstate == finish_started || bstate == finish_done) {
+ s->status = FINISH_STATE;
+ }
+ if (bstate == need_more || bstate == finish_started) {
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
+ }
+ return Z_OK;
+ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+ * of deflate should use the same flush parameter to make sure
+ * that the flush is complete. So we don't have to output an
+ * empty block here, this will be done at next call. This also
+ * ensures that for a very small output buffer, we emit at most
+ * one empty block.
+ */
+ }
+ if (bstate == block_done) {
+ if (flush == Z_PARTIAL_FLUSH) {
+ _tr_align(s);
+ } else if (flush != Z_BLOCK) { /* FULL_FLUSH or SYNC_FLUSH */
+ _tr_stored_block(s, (char*)0, 0L, 0);
+ /* For a full flush, this empty block will be recognized
+ * as a special marker by inflate_sync().
+ */
+ if (flush == Z_FULL_FLUSH) {
+ CLEAR_HASH(s); /* forget history */
+ if (s->lookahead == 0) {
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->insert = 0;
+ }
+ }
+ }
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+ return Z_OK;
+ }
+ }
+ }
+
+ if (flush != Z_FINISH) return Z_OK;
+ if (s->wrap <= 0) return Z_STREAM_END;
+
+ /* Write the trailer */
+#ifdef GZIP
+ if (s->wrap == 2) {
+ put_byte(s, (Byte)(strm->adler & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
+ put_byte(s, (Byte)(strm->total_in & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
+ }
+ else
+#endif
+ {
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ }
+ flush_pending(strm);
+ /* If avail_out is zero, the application will call deflate again
+ * to flush the rest.
+ */
+ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
+ return s->pending != 0 ? Z_OK : Z_STREAM_END;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateEnd (strm)
+ z_streamp strm;
+{
+ int status;
+
+ if (deflateStateCheck(strm)) return Z_STREAM_ERROR;
+
+ status = strm->state->status;
+
+ /* Deallocate in reverse order of allocations: */
+ TRY_FREE(strm, strm->state->pending_buf);
+ TRY_FREE(strm, strm->state->head);
+ TRY_FREE(strm, strm->state->prev);
+ TRY_FREE(strm, strm->state->window);
+
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+
+ return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
+}
+
+/* =========================================================================
+ * Copy the source state to the destination state.
+ * To simplify the source, this is not supported for 16-bit MSDOS (which
+ * doesn't have enough memory anyway to duplicate compression states).
+ */
+int ZEXPORT deflateCopy (dest, source)
+ z_streamp dest;
+ z_streamp source;
+{
+#ifdef MAXSEG_64K
+ return Z_STREAM_ERROR;
+#else
+ deflate_state *ds;
+ deflate_state *ss;
+ ushf *overlay;
+
+
+ if (deflateStateCheck(source) || dest == Z_NULL) {
+ return Z_STREAM_ERROR;
+ }
+
+ ss = source->state;
+
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+
+ ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
+ if (ds == Z_NULL) return Z_MEM_ERROR;
+ dest->state = (struct internal_state FAR *) ds;
+ zmemcpy((voidpf)ds, (voidpf)ss, sizeof(deflate_state));
+ ds->strm = dest;
+
+ ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
+ ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
+ ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
+ overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
+ ds->pending_buf = (uchf *) overlay;
+
+ if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
+ ds->pending_buf == Z_NULL) {
+ deflateEnd (dest);
+ return Z_MEM_ERROR;
+ }
+ /* following zmemcpy do not work for 16-bit MSDOS */
+ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
+ zmemcpy((voidpf)ds->prev, (voidpf)ss->prev, ds->w_size * sizeof(Pos));
+ zmemcpy((voidpf)ds->head, (voidpf)ss->head, ds->hash_size * sizeof(Pos));
+ zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+
+ ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+ ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
+ ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
+
+ ds->l_desc.dyn_tree = ds->dyn_ltree;
+ ds->d_desc.dyn_tree = ds->dyn_dtree;
+ ds->bl_desc.dyn_tree = ds->bl_tree;
+
+ return Z_OK;
+#endif /* MAXSEG_64K */
+}
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read. All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local unsigned read_buf(strm, buf, size)
+ z_streamp strm;
+ Bytef *buf;
+ unsigned size;
+{
+ unsigned len = strm->avail_in;
+
+ if (len > size) len = size;
+ if (len == 0) return 0;
+
+ strm->avail_in -= len;
+
+ zmemcpy(buf, strm->next_in, len);
+ if (strm->state->wrap == 1) {
+ strm->adler = adler32(strm->adler, buf, len);
+ }
+#ifdef GZIP
+ else if (strm->state->wrap == 2) {
+ strm->adler = crc32(strm->adler, buf, len);
+ }
+#endif
+ strm->next_in += len;
+ strm->total_in += len;
+
+ return len;
+}
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init (s)
+ deflate_state *s;
+{
+ s->window_size = (ulg)2L*s->w_size;
+
+ CLEAR_HASH(s);
+
+ /* Set the default configuration parameters:
+ */
+ s->max_lazy_match = configuration_table[s->level].max_lazy;
+ s->good_match = configuration_table[s->level].good_length;
+ s->nice_match = configuration_table[s->level].nice_length;
+ s->max_chain_length = configuration_table[s->level].max_chain;
+
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->lookahead = 0;
+ s->insert = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ s->ins_h = 0;
+#ifndef FASTEST
+#ifdef ASMV
+ match_init(); /* initialize the asm code */
+#endif
+#endif
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+#ifndef ASMV
+/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
+ * match.S. The code will be functionally equivalent.
+ */
+local uInt longest_match(s, cur_match)
+ deflate_state *s;
+ IPos cur_match; /* current match */
+{
+ unsigned chain_length = s->max_chain_length;/* max hash chain length */
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ int best_len = (int)s->prev_length; /* best match length so far */
+ int nice_match = s->nice_match; /* stop if match long enough */
+ IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+ s->strstart - (IPos)MAX_DIST(s) : NIL;
+ /* Stop when cur_match becomes <= limit. To simplify the code,
+ * we prevent matches with the string of window index 0.
+ */
+ Posf *prev = s->prev;
+ uInt wmask = s->w_mask;
+
+#ifdef UNALIGNED_OK
+ /* Compare two bytes at a time. Note: this is not always beneficial.
+ * Try with and without -DUNALIGNED_OK to check.
+ */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+ register ush scan_start = *(ushf*)scan;
+ register ush scan_end = *(ushf*)(scan+best_len-1);
+#else
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+ register Byte scan_end1 = scan[best_len-1];
+ register Byte scan_end = scan[best_len];
+#endif
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ /* Do not waste too much time if we already have a good match: */
+ if (s->prev_length >= s->good_match) {
+ chain_length >>= 2;
+ }
+ /* Do not look for matches beyond the end of the input. This is necessary
+ * to make deflate deterministic.
+ */
+ if ((uInt)nice_match > s->lookahead) nice_match = (int)s->lookahead;
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ do {
+ Assert(cur_match < s->strstart, "no future");
+ match = s->window + cur_match;
+
+ /* Skip to next match if the match length cannot increase
+ * or if the match length is less than 2. Note that the checks below
+ * for insufficient lookahead only occur occasionally for performance
+ * reasons. Therefore uninitialized memory will be accessed, and
+ * conditional jumps will be made that depend on those values.
+ * However the length of the match is limited to the lookahead, so
+ * the output of deflate is not affected by the uninitialized values.
+ */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+ /* This code assumes sizeof(unsigned short) == 2. Do not use
+ * UNALIGNED_OK if your compiler uses a different size.
+ */
+ if (*(ushf*)(match+best_len-1) != scan_end ||
+ *(ushf*)match != scan_start) continue;
+
+ /* It is not necessary to compare scan[2] and match[2] since they are
+ * always equal when the other bytes match, given that the hash keys
+ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+ * strstart+3, +5, ... up to strstart+257. We check for insufficient
+ * lookahead only every 4th comparison; the 128th check will be made
+ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+ * necessary to put more guard bytes at the end of the window, or
+ * to check more often for insufficient lookahead.
+ */
+ Assert(scan[2] == match[2], "scan[2]?");
+ scan++, match++;
+ do {
+ } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ scan < strend);
+ /* The funny "do {}" generates better code on most compilers */
+
+ /* Here, scan <= window+strstart+257 */
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+ if (*scan == *match) scan++;
+
+ len = (MAX_MATCH - 1) - (int)(strend-scan);
+ scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+ if (match[best_len] != scan_end ||
+ match[best_len-1] != scan_end1 ||
+ *match != *scan ||
+ *++match != scan[1]) continue;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match++;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+ scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+ if (len > best_len) {
+ s->match_start = cur_match;
+ best_len = len;
+ if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+ scan_end = *(ushf*)(scan+best_len-1);
+#else
+ scan_end1 = scan[best_len-1];
+ scan_end = scan[best_len];
+#endif
+ }
+ } while ((cur_match = prev[cur_match & wmask]) > limit
+ && --chain_length != 0);
+
+ if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+ return s->lookahead;
+}
+#endif /* ASMV */
+
+#else /* FASTEST */
+
+/* ---------------------------------------------------------------------------
+ * Optimized version for FASTEST only
+ */
+local uInt longest_match(s, cur_match)
+ deflate_state *s;
+ IPos cur_match; /* current match */
+{
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ Assert(cur_match < s->strstart, "no future");
+
+ match = s->window + cur_match;
+
+ /* Return failure if the match length is less than 2:
+ */
+ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match += 2;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+
+ if (len < MIN_MATCH) return MIN_MATCH - 1;
+
+ s->match_start = cur_match;
+ return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
+}
+
+#endif /* FASTEST */
+
+#ifdef ZLIB_DEBUG
+
+#define EQUAL 0
+/* result of memcmp for equal strings */
+
+/* ===========================================================================
+ * Check that the match at match_start is indeed a match.
+ */
+local void check_match(s, start, match, length)
+ deflate_state *s;
+ IPos start, match;
+ int length;
+{
+ /* check that the match is indeed a match */
+ if (zmemcmp(s->window + match,
+ s->window + start, length) != EQUAL) {
+ fprintf(stderr, " start %u, match %u, length %d\n",
+ start, match, length);
+ do {
+ fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
+ } while (--length != 0);
+ z_error("invalid match");
+ }
+ if (z_verbose > 1) {
+ fprintf(stderr,"\\[%d,%d]", start-match, length);
+ do { putc(s->window[start++], stderr); } while (--length != 0);
+ }
+}
+#else
+# define check_match(s, start, match, length)
+#endif /* ZLIB_DEBUG */
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ * At least one byte has been read, or avail_in == 0; reads are
+ * performed for at least two bytes (required for the zip translate_eol
+ * option -- not supported here).
+ */
+local void fill_window(s)
+ deflate_state *s;
+{
+ unsigned n;
+ unsigned more; /* Amount of free space at the end of the window. */
+ uInt wsize = s->w_size;
+
+ Assert(s->lookahead < MIN_LOOKAHEAD, "already enough lookahead");
+
+ do {
+ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+ /* Deal with !@#$% 64K limit: */
+ if (sizeof(int) <= 2) {
+ if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+ more = wsize;
+
+ } else if (more == (unsigned)(-1)) {
+ /* Very unlikely, but possible on 16 bit machine if
+ * strstart == 0 && lookahead == 1 (input done a byte at time)
+ */
+ more--;
+ }
+ }
+
+ /* If the window is almost full and there is insufficient lookahead,
+ * move the upper half to the lower one to make room in the upper half.
+ */
+ if (s->strstart >= wsize+MAX_DIST(s)) {
+
+ zmemcpy(s->window, s->window+wsize, (unsigned)wsize - more);
+ s->match_start -= wsize;
+ s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
+ s->block_start -= (long) wsize;
+ slide_hash(s);
+ more += wsize;
+ }
+ if (s->strm->avail_in == 0) break;
+
+ /* If there was no sliding:
+ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+ * more == window_size - lookahead - strstart
+ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+ * => more >= window_size - 2*WSIZE + 2
+ * In the BIG_MEM or MMAP case (not yet supported),
+ * window_size == input_size + MIN_LOOKAHEAD &&
+ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+ * Otherwise, window_size == 2*WSIZE so more >= 2.
+ * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+ */
+ Assert(more >= 2, "more < 2");
+
+ n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+ s->lookahead += n;
+
+ /* Initialize the hash value now that we have some input: */
+ if (s->lookahead + s->insert >= MIN_MATCH) {
+ uInt str = s->strstart - s->insert;
+ s->ins_h = s->window[str];
+ UPDATE_HASH(s, s->ins_h, s->window[str + 1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ while (s->insert) {
+ UPDATE_HASH(s, s->ins_h, s->window[str + MIN_MATCH-1]);
+#ifndef FASTEST
+ s->prev[str & s->w_mask] = s->head[s->ins_h];
+#endif
+ s->head[s->ins_h] = (Pos)str;
+ str++;
+ s->insert--;
+ if (s->lookahead + s->insert < MIN_MATCH)
+ break;
+ }
+ }
+ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+ * but this is not important since only literal bytes will be emitted.
+ */
+
+ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+
+ /* If the WIN_INIT bytes after the end of the current data have never been
+ * written, then zero those bytes in order to avoid memory check reports of
+ * the use of uninitialized (or uninitialised as Julian writes) bytes by
+ * the longest match routines. Update the high water mark for the next
+ * time through here. WIN_INIT is set to MAX_MATCH since the longest match
+ * routines allow scanning to strstart + MAX_MATCH, ignoring lookahead.
+ */
+ if (s->high_water < s->window_size) {
+ ulg curr = s->strstart + (ulg)(s->lookahead);
+ ulg init;
+
+ if (s->high_water < curr) {
+ /* Previous high water mark below current data -- zero WIN_INIT
+ * bytes or up to end of window, whichever is less.
+ */
+ init = s->window_size - curr;
+ if (init > WIN_INIT)
+ init = WIN_INIT;
+ zmemzero(s->window + curr, (unsigned)init);
+ s->high_water = curr + init;
+ }
+ else if (s->high_water < (ulg)curr + WIN_INIT) {
+ /* High water mark at or above current data, but below current data
+ * plus WIN_INIT -- zero out to current data plus WIN_INIT, or up
+ * to end of window, whichever is less.
+ */
+ init = (ulg)curr + WIN_INIT - s->high_water;
+ if (init > s->window_size - s->high_water)
+ init = s->window_size - s->high_water;
+ zmemzero(s->window + s->high_water, (unsigned)init);
+ s->high_water += init;
+ }
+ }
+
+ Assert((ulg)s->strstart <= s->window_size - MIN_LOOKAHEAD,
+ "not enough room for search");
+}
+
+/* ===========================================================================
+ * Flush the current block, with given end-of-file flag.
+ * IN assertion: strstart is set to the end of the current match.
+ */
+#define FLUSH_BLOCK_ONLY(s, last) { \
+ _tr_flush_block(s, (s->block_start >= 0L ? \
+ (charf *)&s->window[(unsigned)s->block_start] : \
+ (charf *)Z_NULL), \
+ (ulg)((long)s->strstart - s->block_start), \
+ (last)); \
+ s->block_start = s->strstart; \
+ flush_pending(s->strm); \
+ Tracev((stderr,"[FLUSH]")); \
+}
+
+/* Same but force premature exit if necessary. */
+#define FLUSH_BLOCK(s, last) { \
+ FLUSH_BLOCK_ONLY(s, last); \
+ if (s->strm->avail_out == 0) return (last) ? finish_started : need_more; \
+}
+
+/* Maximum stored block length in deflate format (not including header). */
+#define MAX_STORED 65535
+
+/* Minimum of a and b. */
+#define MIN(a, b) ((a) > (b) ? (b) : (a))
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ *
+ * In case deflateParams() is used to later switch to a non-zero compression
+ * level, s->matches (otherwise unused when storing) keeps track of the number
+ * of hash table slides to perform. If s->matches is 1, then one hash table
+ * slide will be done when switching. If s->matches is 2, the maximum value
+ * allowed here, then the hash table will be cleared, since two or more slides
+ * is the same as a clear.
+ *
+ * deflate_stored() is written to minimize the number of times an input byte is
+ * copied. It is most efficient with large input and output buffers, which
+ * maximizes the opportunites to have a single copy from next_in to next_out.
+ */
+local block_state deflate_stored(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ /* Smallest worthy block size when not flushing or finishing. By default
+ * this is 32K. This can be as small as 507 bytes for memLevel == 1. For
+ * large input and output buffers, the stored block size will be larger.
+ */
+ unsigned min_block = MIN(s->pending_buf_size - 5, s->w_size);
+
+ /* Copy as many min_block or larger stored blocks directly to next_out as
+ * possible. If flushing, copy the remaining available input to next_out as
+ * stored blocks, if there is enough space.
+ */
+ unsigned len, left, have, last = 0;
+ unsigned used = s->strm->avail_in;
+ do {
+ /* Set len to the maximum size block that we can copy directly with the
+ * available input data and output space. Set left to how much of that
+ * would be copied from what's left in the window.
+ */
+ len = MAX_STORED; /* maximum deflate stored block length */
+ have = (s->bi_valid + 42) >> 3; /* number of header bytes */
+ if (s->strm->avail_out < have) /* need room for header */
+ break;
+ /* maximum stored block length that will fit in avail_out: */
+ have = s->strm->avail_out - have;
+ left = s->strstart - s->block_start; /* bytes left in window */
+ if (len > (ulg)left + s->strm->avail_in)
+ len = left + s->strm->avail_in; /* limit len to the input */
+ if (len > have)
+ len = have; /* limit len to the output */
+
+ /* If the stored block would be less than min_block in length, or if
+ * unable to copy all of the available input when flushing, then try
+ * copying to the window and the pending buffer instead. Also don't
+ * write an empty block when flushing -- deflate() does that.
+ */
+ if (len < min_block && ((len == 0 && flush != Z_FINISH) ||
+ flush == Z_NO_FLUSH ||
+ len != left + s->strm->avail_in))
+ break;
+
+ /* Make a dummy stored block in pending to get the header bytes,
+ * including any pending bits. This also updates the debugging counts.
+ */
+ last = flush == Z_FINISH && len == left + s->strm->avail_in ? 1 : 0;
+ _tr_stored_block(s, (char *)0, 0L, last);
+
+ /* Replace the lengths in the dummy stored block with len. */
+ s->pending_buf[s->pending - 4] = len;
+ s->pending_buf[s->pending - 3] = len >> 8;
+ s->pending_buf[s->pending - 2] = ~len;
+ s->pending_buf[s->pending - 1] = ~len >> 8;
+
+ /* Write the stored block header bytes. */
+ flush_pending(s->strm);
+
+#ifdef ZLIB_DEBUG
+ /* Update debugging counts for the data about to be copied. */
+ s->compressed_len += len << 3;
+ s->bits_sent += len << 3;
+#endif
+
+ /* Copy uncompressed bytes from the window to next_out. */
+ if (left) {
+ if (left > len)
+ left = len;
+ zmemcpy(s->strm->next_out, s->window + s->block_start, left);
+ s->strm->next_out += left;
+ s->strm->avail_out -= left;
+ s->strm->total_out += left;
+ s->block_start += left;
+ len -= left;
+ }
+
+ /* Copy uncompressed bytes directly from next_in to next_out, updating
+ * the check value.
+ */
+ if (len) {
+ read_buf(s->strm, s->strm->next_out, len);
+ s->strm->next_out += len;
+ s->strm->avail_out -= len;
+ s->strm->total_out += len;
+ }
+ } while (last == 0);
+
+ /* Update the sliding window with the last s->w_size bytes of the copied
+ * data, or append all of the copied data to the existing window if less
+ * than s->w_size bytes were copied. Also update the number of bytes to
+ * insert in the hash tables, in the event that deflateParams() switches to
+ * a non-zero compression level.
+ */
+ used -= s->strm->avail_in; /* number of input bytes directly copied */
+ if (used) {
+ /* If any input was used, then no unused input remains in the window,
+ * therefore s->block_start == s->strstart.
+ */
+ if (used >= s->w_size) { /* supplant the previous history */
+ s->matches = 2; /* clear hash */
+ zmemcpy(s->window, s->strm->next_in - s->w_size, s->w_size);
+ s->strstart = s->w_size;
+ }
+ else {
+ if (s->window_size - s->strstart <= used) {
+ /* Slide the window down. */
+ s->strstart -= s->w_size;
+ zmemcpy(s->window, s->window + s->w_size, s->strstart);
+ if (s->matches < 2)
+ s->matches++; /* add a pending slide_hash() */
+ }
+ zmemcpy(s->window + s->strstart, s->strm->next_in - used, used);
+ s->strstart += used;
+ }
+ s->block_start = s->strstart;
+ s->insert += MIN(used, s->w_size - s->insert);
+ }
+ if (s->high_water < s->strstart)
+ s->high_water = s->strstart;
+
+ /* If the last block was written to next_out, then done. */
+ if (last)
+ return finish_done;
+
+ /* If flushing and all input has been consumed, then done. */
+ if (flush != Z_NO_FLUSH && flush != Z_FINISH &&
+ s->strm->avail_in == 0 && (long)s->strstart == s->block_start)
+ return block_done;
+
+ /* Fill the window with any remaining input. */
+ have = s->window_size - s->strstart - 1;
+ if (s->strm->avail_in > have && s->block_start >= (long)s->w_size) {
+ /* Slide the window down. */
+ s->block_start -= s->w_size;
+ s->strstart -= s->w_size;
+ zmemcpy(s->window, s->window + s->w_size, s->strstart);
+ if (s->matches < 2)
+ s->matches++; /* add a pending slide_hash() */
+ have += s->w_size; /* more space now */
+ }
+ if (have > s->strm->avail_in)
+ have = s->strm->avail_in;
+ if (have) {
+ read_buf(s->strm, s->window + s->strstart, have);
+ s->strstart += have;
+ }
+ if (s->high_water < s->strstart)
+ s->high_water = s->strstart;
+
+ /* There was not enough avail_out to write a complete worthy or flushed
+ * stored block to next_out. Write a stored block to pending instead, if we
+ * have enough input for a worthy block, or if flushing and there is enough
+ * room for the remaining input as a stored block in the pending buffer.
+ */
+ have = (s->bi_valid + 42) >> 3; /* number of header bytes */
+ /* maximum stored block length that will fit in pending: */
+ have = MIN(s->pending_buf_size - have, MAX_STORED);
+ min_block = MIN(have, s->w_size);
+ left = s->strstart - s->block_start;
+ if (left >= min_block ||
+ ((left || flush == Z_FINISH) && flush != Z_NO_FLUSH &&
+ s->strm->avail_in == 0 && left <= have)) {
+ len = MIN(left, have);
+ last = flush == Z_FINISH && s->strm->avail_in == 0 &&
+ len == left ? 1 : 0;
+ _tr_stored_block(s, (charf *)s->window + s->block_start, len, last);
+ s->block_start += len;
+ flush_pending(s->strm);
+ }
+
+ /* We've done all we can with the available input and output. */
+ return last ? finish_started : need_more;
+}
+
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+local block_state deflate_fast(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ IPos hash_head; /* head of the hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ hash_head = NIL;
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ * At this point we have always match_length < MIN_MATCH
+ */
+ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ s->match_length = longest_match (s, hash_head);
+ /* longest_match() sets match_start */
+ }
+ if (s->match_length >= MIN_MATCH) {
+ check_match(s, s->strstart, s->match_start, s->match_length);
+
+ _tr_tally_dist(s, s->strstart - s->match_start,
+ s->match_length - MIN_MATCH, bflush);
+
+ s->lookahead -= s->match_length;
+
+ /* Insert new strings in the hash table only if the match length
+ * is not too large. This saves time but degrades compression.
+ */
+#ifndef FASTEST
+ if (s->match_length <= s->max_insert_length &&
+ s->lookahead >= MIN_MATCH) {
+ s->match_length--; /* string at strstart already in table */
+ do {
+ s->strstart++;
+ INSERT_STRING(s, s->strstart, hash_head);
+ /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+ * always MIN_MATCH bytes ahead.
+ */
+ } while (--s->match_length != 0);
+ s->strstart++;
+ } else
+#endif
+ {
+ s->strstart += s->match_length;
+ s->match_length = 0;
+ s->ins_h = s->window[s->strstart];
+ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+ * matter since it will be recomputed at next deflate call.
+ */
+ }
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ }
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+local block_state deflate_slow(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ IPos hash_head; /* head of hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ /* Process the input block. */
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ hash_head = NIL;
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ */
+ s->prev_length = s->match_length, s->prev_match = s->match_start;
+ s->match_length = MIN_MATCH-1;
+
+ if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
+ s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ s->match_length = longest_match (s, hash_head);
+ /* longest_match() sets match_start */
+
+ if (s->match_length <= 5 && (s->strategy == Z_FILTERED
+#if TOO_FAR <= 32767
+ || (s->match_length == MIN_MATCH &&
+ s->strstart - s->match_start > TOO_FAR)
+#endif
+ )) {
+
+ /* If prev_match is also MIN_MATCH, match_start is garbage
+ * but we will ignore the current match anyway.
+ */
+ s->match_length = MIN_MATCH-1;
+ }
+ }
+ /* If there was a match at the previous step and the current
+ * match is not better, output the previous match:
+ */
+ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
+ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+ /* Do not insert strings in hash table beyond this. */
+
+ check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+
+ _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+ s->prev_length - MIN_MATCH, bflush);
+
+ /* Insert in hash table all strings up to the end of the match.
+ * strstart-1 and strstart are already inserted. If there is not
+ * enough lookahead, the last two strings are not inserted in
+ * the hash table.
+ */
+ s->lookahead -= s->prev_length-1;
+ s->prev_length -= 2;
+ do {
+ if (++s->strstart <= max_insert) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+ } while (--s->prev_length != 0);
+ s->match_available = 0;
+ s->match_length = MIN_MATCH-1;
+ s->strstart++;
+
+ if (bflush) FLUSH_BLOCK(s, 0);
+
+ } else if (s->match_available) {
+ /* If there was no match at the previous position, output a
+ * single literal. If there was a match but the current match
+ * is longer, truncate the previous match to a single literal.
+ */
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ if (bflush) {
+ FLUSH_BLOCK_ONLY(s, 0);
+ }
+ s->strstart++;
+ s->lookahead--;
+ if (s->strm->avail_out == 0) return need_more;
+ } else {
+ /* There is no previous match to compare with, wait for
+ * the next step to decide.
+ */
+ s->match_available = 1;
+ s->strstart++;
+ s->lookahead--;
+ }
+ }
+ Assert (flush != Z_NO_FLUSH, "no flush?");
+ if (s->match_available) {
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ s->match_available = 0;
+ }
+ s->insert = s->strstart < MIN_MATCH-1 ? s->strstart : MIN_MATCH-1;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+#endif /* FASTEST */
+
+/* ===========================================================================
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance
+ * one. Do not maintain a hash table. (It will be regenerated if this run of
+ * deflate switches away from Z_RLE.)
+ */
+local block_state deflate_rle(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ int bflush; /* set if current block must be flushed */
+ uInt prev; /* byte at distance one to match */
+ Bytef *scan, *strend; /* scan goes up to strend for length of run */
+
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the longest run, plus one for the unrolled loop.
+ */
+ if (s->lookahead <= MAX_MATCH) {
+ fill_window(s);
+ if (s->lookahead <= MAX_MATCH && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* See how many times the previous byte repeats */
+ s->match_length = 0;
+ if (s->lookahead >= MIN_MATCH && s->strstart > 0) {
+ scan = s->window + s->strstart - 1;
+ prev = *scan;
+ if (prev == *++scan && prev == *++scan && prev == *++scan) {
+ strend = s->window + s->strstart + MAX_MATCH;
+ do {
+ } while (prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ prev == *++scan && prev == *++scan &&
+ scan < strend);
+ s->match_length = MAX_MATCH - (uInt)(strend - scan);
+ if (s->match_length > s->lookahead)
+ s->match_length = s->lookahead;
+ }
+ Assert(scan <= s->window+(uInt)(s->window_size-1), "wild scan");
+ }
+
+ /* Emit match if have run of MIN_MATCH or longer, else emit literal */
+ if (s->match_length >= MIN_MATCH) {
+ check_match(s, s->strstart, s->strstart - 1, s->match_length);
+
+ _tr_tally_dist(s, 1, s->match_length - MIN_MATCH, bflush);
+
+ s->lookahead -= s->match_length;
+ s->strstart += s->match_length;
+ s->match_length = 0;
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ }
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
+
+/* ===========================================================================
+ * For Z_HUFFMAN_ONLY, do not look for matches. Do not maintain a hash table.
+ * (It will be regenerated if this run of deflate switches away from Huffman.)
+ */
+local block_state deflate_huff(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ int bflush; /* set if current block must be flushed */
+
+ for (;;) {
+ /* Make sure that we have a literal to write. */
+ if (s->lookahead == 0) {
+ fill_window(s);
+ if (s->lookahead == 0) {
+ if (flush == Z_NO_FLUSH)
+ return need_more;
+ break; /* flush the current block */
+ }
+ }
+
+ /* Output a literal byte */
+ s->match_length = 0;
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ s->insert = 0;
+ if (flush == Z_FINISH) {
+ FLUSH_BLOCK(s, 1);
+ return finish_done;
+ }
+ if (s->last_lit)
+ FLUSH_BLOCK(s, 0);
+ return block_done;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.h
new file mode 100644
index 000000000..23ecdd312
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/deflate.h
@@ -0,0 +1,349 @@
+/* deflate.h -- internal compression state
+ * Copyright (C) 1995-2016 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef DEFLATE_H
+#define DEFLATE_H
+
+#include "zutil.h"
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+ trailer creation by deflate(). NO_GZIP would be used to avoid linking in
+ the crc code when it is not needed. For shared libraries, gzip encoding
+ should be left enabled. */
+#ifndef NO_GZIP
+# define GZIP
+#endif
+
+/* ===========================================================================
+ * Internal compression state.
+ */
+
+#define LENGTH_CODES 29
+/* number of length codes, not counting the special END_BLOCK code */
+
+#define LITERALS 256
+/* number of literal bytes 0..255 */
+
+#define L_CODES (LITERALS+1+LENGTH_CODES)
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+#define D_CODES 30
+/* number of distance codes */
+
+#define BL_CODES 19
+/* number of codes used to transfer the bit lengths */
+
+#define HEAP_SIZE (2*L_CODES+1)
+/* maximum heap size */
+
+#define MAX_BITS 15
+/* All codes must not exceed MAX_BITS bits */
+
+#define Buf_size 16
+/* size of bit buffer in bi_buf */
+
+#define INIT_STATE 42 /* zlib header -> BUSY_STATE */
+#ifdef GZIP
+# define GZIP_STATE 57 /* gzip header -> BUSY_STATE | EXTRA_STATE */
+#endif
+#define EXTRA_STATE 69 /* gzip extra block -> NAME_STATE */
+#define NAME_STATE 73 /* gzip file name -> COMMENT_STATE */
+#define COMMENT_STATE 91 /* gzip comment -> HCRC_STATE */
+#define HCRC_STATE 103 /* gzip header CRC -> BUSY_STATE */
+#define BUSY_STATE 113 /* deflate -> FINISH_STATE */
+#define FINISH_STATE 666 /* stream complete */
+/* Stream status */
+
+
+/* Data structure describing a single value and its code string. */
+typedef struct ct_data_s {
+ union {
+ ush freq; /* frequency count */
+ ush code; /* bit string */
+ } fc;
+ union {
+ ush dad; /* father node in Huffman tree */
+ ush len; /* length of bit string */
+ } dl;
+} FAR ct_data;
+
+#define Freq fc.freq
+#define Code fc.code
+#define Dad dl.dad
+#define Len dl.len
+
+typedef struct static_tree_desc_s static_tree_desc;
+
+typedef struct tree_desc_s {
+ ct_data *dyn_tree; /* the dynamic tree */
+ int max_code; /* largest code with non zero frequency */
+ const static_tree_desc *stat_desc; /* the corresponding static tree */
+} FAR tree_desc;
+
+typedef ush Pos;
+typedef Pos FAR Posf;
+typedef unsigned IPos;
+
+/* A Pos is an index in the character window. We use short instead of int to
+ * save space in the various tables. IPos is used only for parameter passing.
+ */
+
+typedef struct internal_state {
+ z_streamp strm; /* pointer back to this zlib stream */
+ int status; /* as the name implies */
+ Bytef *pending_buf; /* output still pending */
+ ulg pending_buf_size; /* size of pending_buf */
+ Bytef *pending_out; /* next pending byte to output to the stream */
+ ulg pending; /* nb of bytes in the pending buffer */
+ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
+ gz_headerp gzhead; /* gzip header information to write */
+ ulg gzindex; /* where in extra, name, or comment */
+ Byte method; /* can only be DEFLATED */
+ int last_flush; /* value of flush param for previous deflate call */
+
+ /* used by deflate.c: */
+
+ uInt w_size; /* LZ77 window size (32K by default) */
+ uInt w_bits; /* log2(w_size) (8..16) */
+ uInt w_mask; /* w_size - 1 */
+
+ Bytef *window;
+ /* Sliding window. Input bytes are read into the second half of the window,
+ * and move to the first half later to keep a dictionary of at least wSize
+ * bytes. With this organization, matches are limited to a distance of
+ * wSize-MAX_MATCH bytes, but this ensures that IO is always
+ * performed with a length multiple of the block size. Also, it limits
+ * the window size to 64K, which is quite useful on MSDOS.
+ * To do: use the user input buffer as sliding window.
+ */
+
+ ulg window_size;
+ /* Actual size of window: 2*wSize, except when the user input buffer
+ * is directly used as sliding window.
+ */
+
+ Posf *prev;
+ /* Link to older string with same hash index. To limit the size of this
+ * array to 64K, this link is maintained only for the last 32K strings.
+ * An index in this array is thus a window index modulo 32K.
+ */
+
+ Posf *head; /* Heads of the hash chains or NIL. */
+
+ uInt ins_h; /* hash index of string to be inserted */
+ uInt hash_size; /* number of elements in hash table */
+ uInt hash_bits; /* log2(hash_size) */
+ uInt hash_mask; /* hash_size-1 */
+
+ uInt hash_shift;
+ /* Number of bits by which ins_h must be shifted at each input
+ * step. It must be such that after MIN_MATCH steps, the oldest
+ * byte no longer takes part in the hash key, that is:
+ * hash_shift * MIN_MATCH >= hash_bits
+ */
+
+ long block_start;
+ /* Window position at the beginning of the current output block. Gets
+ * negative when the window is moved backwards.
+ */
+
+ uInt match_length; /* length of best match */
+ IPos prev_match; /* previous match */
+ int match_available; /* set if previous match exists */
+ uInt strstart; /* start of string to insert */
+ uInt match_start; /* start of matching string */
+ uInt lookahead; /* number of valid bytes ahead in window */
+
+ uInt prev_length;
+ /* Length of the best match at previous step. Matches not greater than this
+ * are discarded. This is used in the lazy match evaluation.
+ */
+
+ uInt max_chain_length;
+ /* To speed up deflation, hash chains are never searched beyond this
+ * length. A higher limit improves compression ratio but degrades the
+ * speed.
+ */
+
+ uInt max_lazy_match;
+ /* Attempt to find a better match only when the current match is strictly
+ * smaller than this value. This mechanism is used only for compression
+ * levels >= 4.
+ */
+# define max_insert_length max_lazy_match
+ /* Insert new strings in the hash table only if the match length is not
+ * greater than this length. This saves time but degrades compression.
+ * max_insert_length is used only for compression levels <= 3.
+ */
+
+ int level; /* compression level (1..9) */
+ int strategy; /* favor or force Huffman coding*/
+
+ uInt good_match;
+ /* Use a faster search when the previous match is longer than this */
+
+ int nice_match; /* Stop searching when current match exceeds this */
+
+ /* used by trees.c: */
+ /* Didn't use ct_data typedef below to suppress compiler warning */
+ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
+ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
+
+ struct tree_desc_s l_desc; /* desc. for literal tree */
+ struct tree_desc_s d_desc; /* desc. for distance tree */
+ struct tree_desc_s bl_desc; /* desc. for bit length tree */
+
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
+ int heap_len; /* number of elements in the heap */
+ int heap_max; /* element of largest frequency */
+ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+ * The same heap array is used to build all trees.
+ */
+
+ uch depth[2*L_CODES+1];
+ /* Depth of each subtree used as tie breaker for trees of equal frequency
+ */
+
+ uchf *l_buf; /* buffer for literals or lengths */
+
+ uInt lit_bufsize;
+ /* Size of match buffer for literals/lengths. There are 4 reasons for
+ * limiting lit_bufsize to 64K:
+ * - frequencies can be kept in 16 bit counters
+ * - if compression is not successful for the first block, all input
+ * data is still in the window so we can still emit a stored block even
+ * when input comes from standard input. (This can also be done for
+ * all blocks if lit_bufsize is not greater than 32K.)
+ * - if compression is not successful for a file smaller than 64K, we can
+ * even emit a stored file instead of a stored block (saving 5 bytes).
+ * This is applicable only for zip (not gzip or zlib).
+ * - creating new Huffman trees less frequently may not provide fast
+ * adaptation to changes in the input data statistics. (Take for
+ * example a binary file with poorly compressible code followed by
+ * a highly compressible string table.) Smaller buffer sizes give
+ * fast adaptation but have of course the overhead of transmitting
+ * trees more frequently.
+ * - I can't count above 4
+ */
+
+ uInt last_lit; /* running index in l_buf */
+
+ ushf *d_buf;
+ /* Buffer for distances. To simplify the code, d_buf and l_buf have
+ * the same number of elements. To use different lengths, an extra flag
+ * array would be necessary.
+ */
+
+ ulg opt_len; /* bit length of current block with optimal trees */
+ ulg static_len; /* bit length of current block with static trees */
+ uInt matches; /* number of string matches in current block */
+ uInt insert; /* bytes at end of window left to insert */
+
+#ifdef ZLIB_DEBUG
+ ulg compressed_len; /* total bit length of compressed file mod 2^32 */
+ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
+#endif
+
+ ush bi_buf;
+ /* Output buffer. bits are inserted starting at the bottom (least
+ * significant bits).
+ */
+ int bi_valid;
+ /* Number of valid bits in bi_buf. All bits above the last valid bit
+ * are always zero.
+ */
+
+ ulg high_water;
+ /* High water mark offset in window for initialized bytes -- bytes above
+ * this are set to zero in order to avoid memory check warnings when
+ * longest match routines access bytes past the input. This is then
+ * updated to the new high water mark.
+ */
+
+} FAR deflate_state;
+
+/* Output a byte on the stream.
+ * IN assertion: there is enough room in pending_buf.
+ */
+#define put_byte(s, c) {s->pending_buf[s->pending++] = (Bytef)(c);}
+
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
+/* In order to simplify the code, particularly on 16 bit machines, match
+ * distances are limited to MAX_DIST instead of WSIZE.
+ */
+
+#define WIN_INIT MAX_MATCH
+/* Number of bytes after end of data in window to initialize in order to avoid
+ memory checker errors from longest match routines */
+
+ /* in trees.c */
+void ZLIB_INTERNAL _tr_init OF((deflate_state *s));
+int ZLIB_INTERNAL _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
+void ZLIB_INTERNAL _tr_flush_block OF((deflate_state *s, charf *buf,
+ ulg stored_len, int last));
+void ZLIB_INTERNAL _tr_flush_bits OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_align OF((deflate_state *s));
+void ZLIB_INTERNAL _tr_stored_block OF((deflate_state *s, charf *buf,
+ ulg stored_len, int last));
+
+#define d_code(dist) \
+ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
+/* Mapping from a distance to a distance code. dist is the distance - 1 and
+ * must not have side effects. _dist_code[256] and _dist_code[257] are never
+ * used.
+ */
+
+#ifndef ZLIB_DEBUG
+/* Inline versions of _tr_tally for speed: */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+ extern uch ZLIB_INTERNAL _length_code[];
+ extern uch ZLIB_INTERNAL _dist_code[];
+#else
+ extern const uch ZLIB_INTERNAL _length_code[];
+ extern const uch ZLIB_INTERNAL _dist_code[];
+#endif
+
+# define _tr_tally_lit(s, c, flush) \
+ { uch cc = (c); \
+ s->d_buf[s->last_lit] = 0; \
+ s->l_buf[s->last_lit++] = cc; \
+ s->dyn_ltree[cc].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+# define _tr_tally_dist(s, distance, length, flush) \
+ { uch len = (uch)(length); \
+ ush dist = (ush)(distance); \
+ s->d_buf[s->last_lit] = dist; \
+ s->l_buf[s->last_lit++] = len; \
+ dist--; \
+ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+ s->dyn_dtree[d_code(dist)].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+#else
+# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
+# define _tr_tally_dist(s, distance, length, flush) \
+ flush = _tr_tally(s, distance, length)
+#endif
+
+#endif /* DEFLATE_H */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/README.examples b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/README.examples
new file mode 100644
index 000000000..56a31714e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/README.examples
@@ -0,0 +1,49 @@
+This directory contains examples of the use of zlib and other relevant
+programs and documentation.
+
+enough.c
+ calculation and justification of ENOUGH parameter in inftrees.h
+ - calculates the maximum table space used in inflate tree
+ construction over all possible Huffman codes
+
+fitblk.c
+ compress just enough input to nearly fill a requested output size
+ - zlib isn't designed to do this, but fitblk does it anyway
+
+gun.c
+ uncompress a gzip file
+ - illustrates the use of inflateBack() for high speed file-to-file
+ decompression using call-back functions
+ - is approximately twice as fast as gzip -d
+ - also provides Unix uncompress functionality, again twice as fast
+
+gzappend.c
+ append to a gzip file
+ - illustrates the use of the Z_BLOCK flush parameter for inflate()
+ - illustrates the use of deflatePrime() to start at any bit
+
+gzjoin.c
+ join gzip files without recalculating the crc or recompressing
+ - illustrates the use of the Z_BLOCK flush parameter for inflate()
+ - illustrates the use of crc32_combine()
+
+gzlog.c
+gzlog.h
+ efficiently and robustly maintain a message log file in gzip format
+ - illustrates use of raw deflate, Z_PARTIAL_FLUSH, deflatePrime(),
+ and deflateSetDictionary()
+ - illustrates use of a gzip header extra field
+
+zlib_how.html
+ painfully comprehensive description of zpipe.c (see below)
+ - describes in excruciating detail the use of deflate() and inflate()
+
+zpipe.c
+ reads and writes zlib streams from stdin to stdout
+ - illustrates the proper use of deflate() and inflate()
+ - deeply commented in zlib_how.html (see above)
+
+zran.c
+ index a zlib or gzip stream and randomly access it
+ - illustrates the use of Z_BLOCK, inflatePrime(), and
+ inflateSetDictionary() to provide random access
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/enough.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/enough.c
new file mode 100644
index 000000000..b99114430
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/enough.c
@@ -0,0 +1,572 @@
+/* enough.c -- determine the maximum size of inflate's Huffman code tables over
+ * all possible valid and complete Huffman codes, subject to a length limit.
+ * Copyright (C) 2007, 2008, 2012 Mark Adler
+ * Version 1.4 18 August 2012 Mark Adler
+ */
+
+/* Version history:
+ 1.0 3 Jan 2007 First version (derived from codecount.c version 1.4)
+ 1.1 4 Jan 2007 Use faster incremental table usage computation
+ Prune examine() search on previously visited states
+ 1.2 5 Jan 2007 Comments clean up
+ As inflate does, decrease root for short codes
+ Refuse cases where inflate would increase root
+ 1.3 17 Feb 2008 Add argument for initial root table size
+ Fix bug for initial root table size == max - 1
+ Use a macro to compute the history index
+ 1.4 18 Aug 2012 Avoid shifts more than bits in type (caused endless loop!)
+ Clean up comparisons of different types
+ Clean up code indentation
+ */
+
+/*
+ Examine all possible Huffman codes for a given number of symbols and a
+ maximum code length in bits to determine the maximum table size for zilb's
+ inflate. Only complete Huffman codes are counted.
+
+ Two codes are considered distinct if the vectors of the number of codes per
+ length are not identical. So permutations of the symbol assignments result
+ in the same code for the counting, as do permutations of the assignments of
+ the bit values to the codes (i.e. only canonical codes are counted).
+
+ We build a code from shorter to longer lengths, determining how many symbols
+ are coded at each length. At each step, we have how many symbols remain to
+ be coded, what the last code length used was, and how many bit patterns of
+ that length remain unused. Then we add one to the code length and double the
+ number of unused patterns to graduate to the next code length. We then
+ assign all portions of the remaining symbols to that code length that
+ preserve the properties of a correct and eventually complete code. Those
+ properties are: we cannot use more bit patterns than are available; and when
+ all the symbols are used, there are exactly zero possible bit patterns
+ remaining.
+
+ The inflate Huffman decoding algorithm uses two-level lookup tables for
+ speed. There is a single first-level table to decode codes up to root bits
+ in length (root == 9 in the current inflate implementation). The table
+ has 1 << root entries and is indexed by the next root bits of input. Codes
+ shorter than root bits have replicated table entries, so that the correct
+ entry is pointed to regardless of the bits that follow the short code. If
+ the code is longer than root bits, then the table entry points to a second-
+ level table. The size of that table is determined by the longest code with
+ that root-bit prefix. If that longest code has length len, then the table
+ has size 1 << (len - root), to index the remaining bits in that set of
+ codes. Each subsequent root-bit prefix then has its own sub-table. The
+ total number of table entries required by the code is calculated
+ incrementally as the number of codes at each bit length is populated. When
+ all of the codes are shorter than root bits, then root is reduced to the
+ longest code length, resulting in a single, smaller, one-level table.
+
+ The inflate algorithm also provides for small values of root (relative to
+ the log2 of the number of symbols), where the shortest code has more bits
+ than root. In that case, root is increased to the length of the shortest
+ code. This program, by design, does not handle that case, so it is verified
+ that the number of symbols is less than 2^(root + 1).
+
+ In order to speed up the examination (by about ten orders of magnitude for
+ the default arguments), the intermediate states in the build-up of a code
+ are remembered and previously visited branches are pruned. The memory
+ required for this will increase rapidly with the total number of symbols and
+ the maximum code length in bits. However this is a very small price to pay
+ for the vast speedup.
+
+ First, all of the possible Huffman codes are counted, and reachable
+ intermediate states are noted by a non-zero count in a saved-results array.
+ Second, the intermediate states that lead to (root + 1) bit or longer codes
+ are used to look at all sub-codes from those junctures for their inflate
+ memory usage. (The amount of memory used is not affected by the number of
+ codes of root bits or less in length.) Third, the visited states in the
+ construction of those sub-codes and the associated calculation of the table
+ size is recalled in order to avoid recalculating from the same juncture.
+ Beginning the code examination at (root + 1) bit codes, which is enabled by
+ identifying the reachable nodes, accounts for about six of the orders of
+ magnitude of improvement for the default arguments. About another four
+ orders of magnitude come from not revisiting previous states. Out of
+ approximately 2x10^16 possible Huffman codes, only about 2x10^6 sub-codes
+ need to be examined to cover all of the possible table memory usage cases
+ for the default arguments of 286 symbols limited to 15-bit codes.
+
+ Note that an unsigned long long type is used for counting. It is quite easy
+ to exceed the capacity of an eight-byte integer with a large number of
+ symbols and a large maximum code length, so multiple-precision arithmetic
+ would need to replace the unsigned long long arithmetic in that case. This
+ program will abort if an overflow occurs. The big_t type identifies where
+ the counting takes place.
+
+ An unsigned long long type is also used for calculating the number of
+ possible codes remaining at the maximum length. This limits the maximum
+ code length to the number of bits in a long long minus the number of bits
+ needed to represent the symbols in a flat code. The code_t type identifies
+ where the bit pattern counting takes place.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+
+#define local static
+
+/* special data types */
+typedef unsigned long long big_t; /* type for code counting */
+typedef unsigned long long code_t; /* type for bit pattern counting */
+struct tab { /* type for been here check */
+ size_t len; /* length of bit vector in char's */
+ char *vec; /* allocated bit vector */
+};
+
+/* The array for saving results, num[], is indexed with this triplet:
+
+ syms: number of symbols remaining to code
+ left: number of available bit patterns at length len
+ len: number of bits in the codes currently being assigned
+
+ Those indices are constrained thusly when saving results:
+
+ syms: 3..totsym (totsym == total symbols to code)
+ left: 2..syms - 1, but only the evens (so syms == 8 -> 2, 4, 6)
+ len: 1..max - 1 (max == maximum code length in bits)
+
+ syms == 2 is not saved since that immediately leads to a single code. left
+ must be even, since it represents the number of available bit patterns at
+ the current length, which is double the number at the previous length.
+ left ends at syms-1 since left == syms immediately results in a single code.
+ (left > sym is not allowed since that would result in an incomplete code.)
+ len is less than max, since the code completes immediately when len == max.
+
+ The offset into the array is calculated for the three indices with the
+ first one (syms) being outermost, and the last one (len) being innermost.
+ We build the array with length max-1 lists for the len index, with syms-3
+ of those for each symbol. There are totsym-2 of those, with each one
+ varying in length as a function of sym. See the calculation of index in
+ count() for the index, and the calculation of size in main() for the size
+ of the array.
+
+ For the deflate example of 286 symbols limited to 15-bit codes, the array
+ has 284,284 entries, taking up 2.17 MB for an 8-byte big_t. More than
+ half of the space allocated for saved results is actually used -- not all
+ possible triplets are reached in the generation of valid Huffman codes.
+ */
+
+/* The array for tracking visited states, done[], is itself indexed identically
+ to the num[] array as described above for the (syms, left, len) triplet.
+ Each element in the array is further indexed by the (mem, rem) doublet,
+ where mem is the amount of inflate table space used so far, and rem is the
+ remaining unused entries in the current inflate sub-table. Each indexed
+ element is simply one bit indicating whether the state has been visited or
+ not. Since the ranges for mem and rem are not known a priori, each bit
+ vector is of a variable size, and grows as needed to accommodate the visited
+ states. mem and rem are used to calculate a single index in a triangular
+ array. Since the range of mem is expected in the default case to be about
+ ten times larger than the range of rem, the array is skewed to reduce the
+ memory usage, with eight times the range for mem than for rem. See the
+ calculations for offset and bit in beenhere() for the details.
+
+ For the deflate example of 286 symbols limited to 15-bit codes, the bit
+ vectors grow to total approximately 21 MB, in addition to the 4.3 MB done[]
+ array itself.
+ */
+
+/* Globals to avoid propagating constants or constant pointers recursively */
+local int max; /* maximum allowed bit length for the codes */
+local int root; /* size of base code table in bits */
+local int large; /* largest code table so far */
+local size_t size; /* number of elements in num and done */
+local int *code; /* number of symbols assigned to each bit length */
+local big_t *num; /* saved results array for code counting */
+local struct tab *done; /* states already evaluated array */
+
+/* Index function for num[] and done[] */
+#define INDEX(i,j,k) (((size_t)((i-1)>>1)*((i-2)>>1)+(j>>1)-1)*(max-1)+k-1)
+
+/* Free allocated space. Uses globals code, num, and done. */
+local void cleanup(void)
+{
+ size_t n;
+
+ if (done != NULL) {
+ for (n = 0; n < size; n++)
+ if (done[n].len)
+ free(done[n].vec);
+ free(done);
+ }
+ if (num != NULL)
+ free(num);
+ if (code != NULL)
+ free(code);
+}
+
+/* Return the number of possible Huffman codes using bit patterns of lengths
+ len through max inclusive, coding syms symbols, with left bit patterns of
+ length len unused -- return -1 if there is an overflow in the counting.
+ Keep a record of previous results in num to prevent repeating the same
+ calculation. Uses the globals max and num. */
+local big_t count(int syms, int len, int left)
+{
+ big_t sum; /* number of possible codes from this juncture */
+ big_t got; /* value returned from count() */
+ int least; /* least number of syms to use at this juncture */
+ int most; /* most number of syms to use at this juncture */
+ int use; /* number of bit patterns to use in next call */
+ size_t index; /* index of this case in *num */
+
+ /* see if only one possible code */
+ if (syms == left)
+ return 1;
+
+ /* note and verify the expected state */
+ assert(syms > left && left > 0 && len < max);
+
+ /* see if we've done this one already */
+ index = INDEX(syms, left, len);
+ got = num[index];
+ if (got)
+ return got; /* we have -- return the saved result */
+
+ /* we need to use at least this many bit patterns so that the code won't be
+ incomplete at the next length (more bit patterns than symbols) */
+ least = (left << 1) - syms;
+ if (least < 0)
+ least = 0;
+
+ /* we can use at most this many bit patterns, lest there not be enough
+ available for the remaining symbols at the maximum length (if there were
+ no limit to the code length, this would become: most = left - 1) */
+ most = (((code_t)left << (max - len)) - syms) /
+ (((code_t)1 << (max - len)) - 1);
+
+ /* count all possible codes from this juncture and add them up */
+ sum = 0;
+ for (use = least; use <= most; use++) {
+ got = count(syms - use, len + 1, (left - use) << 1);
+ sum += got;
+ if (got == (big_t)0 - 1 || sum < got) /* overflow */
+ return (big_t)0 - 1;
+ }
+
+ /* verify that all recursive calls are productive */
+ assert(sum != 0);
+
+ /* save the result and return it */
+ num[index] = sum;
+ return sum;
+}
+
+/* Return true if we've been here before, set to true if not. Set a bit in a
+ bit vector to indicate visiting this state. Each (syms,len,left) state
+ has a variable size bit vector indexed by (mem,rem). The bit vector is
+ lengthened if needed to allow setting the (mem,rem) bit. */
+local int beenhere(int syms, int len, int left, int mem, int rem)
+{
+ size_t index; /* index for this state's bit vector */
+ size_t offset; /* offset in this state's bit vector */
+ int bit; /* mask for this state's bit */
+ size_t length; /* length of the bit vector in bytes */
+ char *vector; /* new or enlarged bit vector */
+
+ /* point to vector for (syms,left,len), bit in vector for (mem,rem) */
+ index = INDEX(syms, left, len);
+ mem -= 1 << root;
+ offset = (mem >> 3) + rem;
+ offset = ((offset * (offset + 1)) >> 1) + rem;
+ bit = 1 << (mem & 7);
+
+ /* see if we've been here */
+ length = done[index].len;
+ if (offset < length && (done[index].vec[offset] & bit) != 0)
+ return 1; /* done this! */
+
+ /* we haven't been here before -- set the bit to show we have now */
+
+ /* see if we need to lengthen the vector in order to set the bit */
+ if (length <= offset) {
+ /* if we have one already, enlarge it, zero out the appended space */
+ if (length) {
+ do {
+ length <<= 1;
+ } while (length <= offset);
+ vector = realloc(done[index].vec, length);
+ if (vector != NULL)
+ memset(vector + done[index].len, 0, length - done[index].len);
+ }
+
+ /* otherwise we need to make a new vector and zero it out */
+ else {
+ length = 1 << (len - root);
+ while (length <= offset)
+ length <<= 1;
+ vector = calloc(length, sizeof(char));
+ }
+
+ /* in either case, bail if we can't get the memory */
+ if (vector == NULL) {
+ fputs("abort: unable to allocate enough memory\n", stderr);
+ cleanup();
+ exit(1);
+ }
+
+ /* install the new vector */
+ done[index].len = length;
+ done[index].vec = vector;
+ }
+
+ /* set the bit */
+ done[index].vec[offset] |= bit;
+ return 0;
+}
+
+/* Examine all possible codes from the given node (syms, len, left). Compute
+ the amount of memory required to build inflate's decoding tables, where the
+ number of code structures used so far is mem, and the number remaining in
+ the current sub-table is rem. Uses the globals max, code, root, large, and
+ done. */
+local void examine(int syms, int len, int left, int mem, int rem)
+{
+ int least; /* least number of syms to use at this juncture */
+ int most; /* most number of syms to use at this juncture */
+ int use; /* number of bit patterns to use in next call */
+
+ /* see if we have a complete code */
+ if (syms == left) {
+ /* set the last code entry */
+ code[len] = left;
+
+ /* complete computation of memory used by this code */
+ while (rem < left) {
+ left -= rem;
+ rem = 1 << (len - root);
+ mem += rem;
+ }
+ assert(rem == left);
+
+ /* if this is a new maximum, show the entries used and the sub-code */
+ if (mem > large) {
+ large = mem;
+ printf("max %d: ", mem);
+ for (use = root + 1; use <= max; use++)
+ if (code[use])
+ printf("%d[%d] ", code[use], use);
+ putchar('\n');
+ fflush(stdout);
+ }
+
+ /* remove entries as we drop back down in the recursion */
+ code[len] = 0;
+ return;
+ }
+
+ /* prune the tree if we can */
+ if (beenhere(syms, len, left, mem, rem))
+ return;
+
+ /* we need to use at least this many bit patterns so that the code won't be
+ incomplete at the next length (more bit patterns than symbols) */
+ least = (left << 1) - syms;
+ if (least < 0)
+ least = 0;
+
+ /* we can use at most this many bit patterns, lest there not be enough
+ available for the remaining symbols at the maximum length (if there were
+ no limit to the code length, this would become: most = left - 1) */
+ most = (((code_t)left << (max - len)) - syms) /
+ (((code_t)1 << (max - len)) - 1);
+
+ /* occupy least table spaces, creating new sub-tables as needed */
+ use = least;
+ while (rem < use) {
+ use -= rem;
+ rem = 1 << (len - root);
+ mem += rem;
+ }
+ rem -= use;
+
+ /* examine codes from here, updating table space as we go */
+ for (use = least; use <= most; use++) {
+ code[len] = use;
+ examine(syms - use, len + 1, (left - use) << 1,
+ mem + (rem ? 1 << (len - root) : 0), rem << 1);
+ if (rem == 0) {
+ rem = 1 << (len - root);
+ mem += rem;
+ }
+ rem--;
+ }
+
+ /* remove entries as we drop back down in the recursion */
+ code[len] = 0;
+}
+
+/* Look at all sub-codes starting with root + 1 bits. Look at only the valid
+ intermediate code states (syms, left, len). For each completed code,
+ calculate the amount of memory required by inflate to build the decoding
+ tables. Find the maximum amount of memory required and show the code that
+ requires that maximum. Uses the globals max, root, and num. */
+local void enough(int syms)
+{
+ int n; /* number of remaing symbols for this node */
+ int left; /* number of unused bit patterns at this length */
+ size_t index; /* index of this case in *num */
+
+ /* clear code */
+ for (n = 0; n <= max; n++)
+ code[n] = 0;
+
+ /* look at all (root + 1) bit and longer codes */
+ large = 1 << root; /* base table */
+ if (root < max) /* otherwise, there's only a base table */
+ for (n = 3; n <= syms; n++)
+ for (left = 2; left < n; left += 2)
+ {
+ /* look at all reachable (root + 1) bit nodes, and the
+ resulting codes (complete at root + 2 or more) */
+ index = INDEX(n, left, root + 1);
+ if (root + 1 < max && num[index]) /* reachable node */
+ examine(n, root + 1, left, 1 << root, 0);
+
+ /* also look at root bit codes with completions at root + 1
+ bits (not saved in num, since complete), just in case */
+ if (num[index - 1] && n <= left << 1)
+ examine((n - left) << 1, root + 1, (n - left) << 1,
+ 1 << root, 0);
+ }
+
+ /* done */
+ printf("done: maximum of %d table entries\n", large);
+}
+
+/*
+ Examine and show the total number of possible Huffman codes for a given
+ maximum number of symbols, initial root table size, and maximum code length
+ in bits -- those are the command arguments in that order. The default
+ values are 286, 9, and 15 respectively, for the deflate literal/length code.
+ The possible codes are counted for each number of coded symbols from two to
+ the maximum. The counts for each of those and the total number of codes are
+ shown. The maximum number of inflate table entires is then calculated
+ across all possible codes. Each new maximum number of table entries and the
+ associated sub-code (starting at root + 1 == 10 bits) is shown.
+
+ To count and examine Huffman codes that are not length-limited, provide a
+ maximum length equal to the number of symbols minus one.
+
+ For the deflate literal/length code, use "enough". For the deflate distance
+ code, use "enough 30 6".
+
+ This uses the %llu printf format to print big_t numbers, which assumes that
+ big_t is an unsigned long long. If the big_t type is changed (for example
+ to a multiple precision type), the method of printing will also need to be
+ updated.
+ */
+int main(int argc, char **argv)
+{
+ int syms; /* total number of symbols to code */
+ int n; /* number of symbols to code for this run */
+ big_t got; /* return value of count() */
+ big_t sum; /* accumulated number of codes over n */
+ code_t word; /* for counting bits in code_t */
+
+ /* set up globals for cleanup() */
+ code = NULL;
+ num = NULL;
+ done = NULL;
+
+ /* get arguments -- default to the deflate literal/length code */
+ syms = 286;
+ root = 9;
+ max = 15;
+ if (argc > 1) {
+ syms = atoi(argv[1]);
+ if (argc > 2) {
+ root = atoi(argv[2]);
+ if (argc > 3)
+ max = atoi(argv[3]);
+ }
+ }
+ if (argc > 4 || syms < 2 || root < 1 || max < 1) {
+ fputs("invalid arguments, need: [sym >= 2 [root >= 1 [max >= 1]]]\n",
+ stderr);
+ return 1;
+ }
+
+ /* if not restricting the code length, the longest is syms - 1 */
+ if (max > syms - 1)
+ max = syms - 1;
+
+ /* determine the number of bits in a code_t */
+ for (n = 0, word = 1; word; n++, word <<= 1)
+ ;
+
+ /* make sure that the calculation of most will not overflow */
+ if (max > n || (code_t)(syms - 2) >= (((code_t)0 - 1) >> (max - 1))) {
+ fputs("abort: code length too long for internal types\n", stderr);
+ return 1;
+ }
+
+ /* reject impossible code requests */
+ if ((code_t)(syms - 1) > ((code_t)1 << max) - 1) {
+ fprintf(stderr, "%d symbols cannot be coded in %d bits\n",
+ syms, max);
+ return 1;
+ }
+
+ /* allocate code vector */
+ code = calloc(max + 1, sizeof(int));
+ if (code == NULL) {
+ fputs("abort: unable to allocate enough memory\n", stderr);
+ return 1;
+ }
+
+ /* determine size of saved results array, checking for overflows,
+ allocate and clear the array (set all to zero with calloc()) */
+ if (syms == 2) /* iff max == 1 */
+ num = NULL; /* won't be saving any results */
+ else {
+ size = syms >> 1;
+ if (size > ((size_t)0 - 1) / (n = (syms - 1) >> 1) ||
+ (size *= n, size > ((size_t)0 - 1) / (n = max - 1)) ||
+ (size *= n, size > ((size_t)0 - 1) / sizeof(big_t)) ||
+ (num = calloc(size, sizeof(big_t))) == NULL) {
+ fputs("abort: unable to allocate enough memory\n", stderr);
+ cleanup();
+ return 1;
+ }
+ }
+
+ /* count possible codes for all numbers of symbols, add up counts */
+ sum = 0;
+ for (n = 2; n <= syms; n++) {
+ got = count(n, 1, 2);
+ sum += got;
+ if (got == (big_t)0 - 1 || sum < got) { /* overflow */
+ fputs("abort: can't count that high!\n", stderr);
+ cleanup();
+ return 1;
+ }
+ printf("%llu %d-codes\n", got, n);
+ }
+ printf("%llu total codes for 2 to %d symbols", sum, syms);
+ if (max < syms - 1)
+ printf(" (%d-bit length limit)\n", max);
+ else
+ puts(" (no length limit)");
+
+ /* allocate and clear done array for beenhere() */
+ if (syms == 2)
+ done = NULL;
+ else if (size > ((size_t)0 - 1) / sizeof(struct tab) ||
+ (done = calloc(size, sizeof(struct tab))) == NULL) {
+ fputs("abort: unable to allocate enough memory\n", stderr);
+ cleanup();
+ return 1;
+ }
+
+ /* find and show maximum inflate table usage */
+ if (root > max) /* reduce root to max length */
+ root = max;
+ if ((code_t)syms < ((code_t)1 << (root + 1)))
+ enough(syms);
+ else
+ puts("cannot handle minimum code lengths > root");
+
+ /* done */
+ cleanup();
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/fitblk.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/fitblk.c
new file mode 100644
index 000000000..c61de5c99
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/fitblk.c
@@ -0,0 +1,233 @@
+/* fitblk.c: example of fitting compressed output to a specified size
+ Not copyrighted -- provided to the public domain
+ Version 1.1 25 November 2004 Mark Adler */
+
+/* Version history:
+ 1.0 24 Nov 2004 First version
+ 1.1 25 Nov 2004 Change deflateInit2() to deflateInit()
+ Use fixed-size, stack-allocated raw buffers
+ Simplify code moving compression to subroutines
+ Use assert() for internal errors
+ Add detailed description of approach
+ */
+
+/* Approach to just fitting a requested compressed size:
+
+ fitblk performs three compression passes on a portion of the input
+ data in order to determine how much of that input will compress to
+ nearly the requested output block size. The first pass generates
+ enough deflate blocks to produce output to fill the requested
+ output size plus a specfied excess amount (see the EXCESS define
+ below). The last deflate block may go quite a bit past that, but
+ is discarded. The second pass decompresses and recompresses just
+ the compressed data that fit in the requested plus excess sized
+ buffer. The deflate process is terminated after that amount of
+ input, which is less than the amount consumed on the first pass.
+ The last deflate block of the result will be of a comparable size
+ to the final product, so that the header for that deflate block and
+ the compression ratio for that block will be about the same as in
+ the final product. The third compression pass decompresses the
+ result of the second step, but only the compressed data up to the
+ requested size minus an amount to allow the compressed stream to
+ complete (see the MARGIN define below). That will result in a
+ final compressed stream whose length is less than or equal to the
+ requested size. Assuming sufficient input and a requested size
+ greater than a few hundred bytes, the shortfall will typically be
+ less than ten bytes.
+
+ If the input is short enough that the first compression completes
+ before filling the requested output size, then that compressed
+ stream is return with no recompression.
+
+ EXCESS is chosen to be just greater than the shortfall seen in a
+ two pass approach similar to the above. That shortfall is due to
+ the last deflate block compressing more efficiently with a smaller
+ header on the second pass. EXCESS is set to be large enough so
+ that there is enough uncompressed data for the second pass to fill
+ out the requested size, and small enough so that the final deflate
+ block of the second pass will be close in size to the final deflate
+ block of the third and final pass. MARGIN is chosen to be just
+ large enough to assure that the final compression has enough room
+ to complete in all cases.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+#include "zlib.h"
+
+#define local static
+
+/* print nastygram and leave */
+local void quit(char *why)
+{
+ fprintf(stderr, "fitblk abort: %s\n", why);
+ exit(1);
+}
+
+#define RAWLEN 4096 /* intermediate uncompressed buffer size */
+
+/* compress from file to def until provided buffer is full or end of
+ input reached; return last deflate() return value, or Z_ERRNO if
+ there was read error on the file */
+local int partcompress(FILE *in, z_streamp def)
+{
+ int ret, flush;
+ unsigned char raw[RAWLEN];
+
+ flush = Z_NO_FLUSH;
+ do {
+ def->avail_in = fread(raw, 1, RAWLEN, in);
+ if (ferror(in))
+ return Z_ERRNO;
+ def->next_in = raw;
+ if (feof(in))
+ flush = Z_FINISH;
+ ret = deflate(def, flush);
+ assert(ret != Z_STREAM_ERROR);
+ } while (def->avail_out != 0 && flush == Z_NO_FLUSH);
+ return ret;
+}
+
+/* recompress from inf's input to def's output; the input for inf and
+ the output for def are set in those structures before calling;
+ return last deflate() return value, or Z_MEM_ERROR if inflate()
+ was not able to allocate enough memory when it needed to */
+local int recompress(z_streamp inf, z_streamp def)
+{
+ int ret, flush;
+ unsigned char raw[RAWLEN];
+
+ flush = Z_NO_FLUSH;
+ do {
+ /* decompress */
+ inf->avail_out = RAWLEN;
+ inf->next_out = raw;
+ ret = inflate(inf, Z_NO_FLUSH);
+ assert(ret != Z_STREAM_ERROR && ret != Z_DATA_ERROR &&
+ ret != Z_NEED_DICT);
+ if (ret == Z_MEM_ERROR)
+ return ret;
+
+ /* compress what was decompresed until done or no room */
+ def->avail_in = RAWLEN - inf->avail_out;
+ def->next_in = raw;
+ if (inf->avail_out != 0)
+ flush = Z_FINISH;
+ ret = deflate(def, flush);
+ assert(ret != Z_STREAM_ERROR);
+ } while (ret != Z_STREAM_END && def->avail_out != 0);
+ return ret;
+}
+
+#define EXCESS 256 /* empirically determined stream overage */
+#define MARGIN 8 /* amount to back off for completion */
+
+/* compress from stdin to fixed-size block on stdout */
+int main(int argc, char **argv)
+{
+ int ret; /* return code */
+ unsigned size; /* requested fixed output block size */
+ unsigned have; /* bytes written by deflate() call */
+ unsigned char *blk; /* intermediate and final stream */
+ unsigned char *tmp; /* close to desired size stream */
+ z_stream def, inf; /* zlib deflate and inflate states */
+
+ /* get requested output size */
+ if (argc != 2)
+ quit("need one argument: size of output block");
+ ret = strtol(argv[1], argv + 1, 10);
+ if (argv[1][0] != 0)
+ quit("argument must be a number");
+ if (ret < 8) /* 8 is minimum zlib stream size */
+ quit("need positive size of 8 or greater");
+ size = (unsigned)ret;
+
+ /* allocate memory for buffers and compression engine */
+ blk = malloc(size + EXCESS);
+ def.zalloc = Z_NULL;
+ def.zfree = Z_NULL;
+ def.opaque = Z_NULL;
+ ret = deflateInit(&def, Z_DEFAULT_COMPRESSION);
+ if (ret != Z_OK || blk == NULL)
+ quit("out of memory");
+
+ /* compress from stdin until output full, or no more input */
+ def.avail_out = size + EXCESS;
+ def.next_out = blk;
+ ret = partcompress(stdin, &def);
+ if (ret == Z_ERRNO)
+ quit("error reading input");
+
+ /* if it all fit, then size was undersubscribed -- done! */
+ if (ret == Z_STREAM_END && def.avail_out >= EXCESS) {
+ /* write block to stdout */
+ have = size + EXCESS - def.avail_out;
+ if (fwrite(blk, 1, have, stdout) != have || ferror(stdout))
+ quit("error writing output");
+
+ /* clean up and print results to stderr */
+ ret = deflateEnd(&def);
+ assert(ret != Z_STREAM_ERROR);
+ free(blk);
+ fprintf(stderr,
+ "%u bytes unused out of %u requested (all input)\n",
+ size - have, size);
+ return 0;
+ }
+
+ /* it didn't all fit -- set up for recompression */
+ inf.zalloc = Z_NULL;
+ inf.zfree = Z_NULL;
+ inf.opaque = Z_NULL;
+ inf.avail_in = 0;
+ inf.next_in = Z_NULL;
+ ret = inflateInit(&inf);
+ tmp = malloc(size + EXCESS);
+ if (ret != Z_OK || tmp == NULL)
+ quit("out of memory");
+ ret = deflateReset(&def);
+ assert(ret != Z_STREAM_ERROR);
+
+ /* do first recompression close to the right amount */
+ inf.avail_in = size + EXCESS;
+ inf.next_in = blk;
+ def.avail_out = size + EXCESS;
+ def.next_out = tmp;
+ ret = recompress(&inf, &def);
+ if (ret == Z_MEM_ERROR)
+ quit("out of memory");
+
+ /* set up for next reocmpression */
+ ret = inflateReset(&inf);
+ assert(ret != Z_STREAM_ERROR);
+ ret = deflateReset(&def);
+ assert(ret != Z_STREAM_ERROR);
+
+ /* do second and final recompression (third compression) */
+ inf.avail_in = size - MARGIN; /* assure stream will complete */
+ inf.next_in = tmp;
+ def.avail_out = size;
+ def.next_out = blk;
+ ret = recompress(&inf, &def);
+ if (ret == Z_MEM_ERROR)
+ quit("out of memory");
+ assert(ret == Z_STREAM_END); /* otherwise MARGIN too small */
+
+ /* done -- write block to stdout */
+ have = size - def.avail_out;
+ if (fwrite(blk, 1, have, stdout) != have || ferror(stdout))
+ quit("error writing output");
+
+ /* clean up and print results to stderr */
+ free(tmp);
+ ret = inflateEnd(&inf);
+ assert(ret != Z_STREAM_ERROR);
+ ret = deflateEnd(&def);
+ assert(ret != Z_STREAM_ERROR);
+ free(blk);
+ fprintf(stderr,
+ "%u bytes unused out of %u requested (%lu input)\n",
+ size - have, size, def.total_in);
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gun.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gun.c
new file mode 100644
index 000000000..be44fa51f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gun.c
@@ -0,0 +1,702 @@
+/* gun.c -- simple gunzip to give an example of the use of inflateBack()
+ * Copyright (C) 2003, 2005, 2008, 2010, 2012 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ Version 1.7 12 August 2012 Mark Adler */
+
+/* Version history:
+ 1.0 16 Feb 2003 First version for testing of inflateBack()
+ 1.1 21 Feb 2005 Decompress concatenated gzip streams
+ Remove use of "this" variable (C++ keyword)
+ Fix return value for in()
+ Improve allocation failure checking
+ Add typecasting for void * structures
+ Add -h option for command version and usage
+ Add a bunch of comments
+ 1.2 20 Mar 2005 Add Unix compress (LZW) decompression
+ Copy file attributes from input file to output file
+ 1.3 12 Jun 2005 Add casts for error messages [Oberhumer]
+ 1.4 8 Dec 2006 LZW decompression speed improvements
+ 1.5 9 Feb 2008 Avoid warning in latest version of gcc
+ 1.6 17 Jan 2010 Avoid signed/unsigned comparison warnings
+ 1.7 12 Aug 2012 Update for z_const usage in zlib 1.2.8
+ */
+
+/*
+ gun [ -t ] [ name ... ]
+
+ decompresses the data in the named gzip files. If no arguments are given,
+ gun will decompress from stdin to stdout. The names must end in .gz, -gz,
+ .z, -z, _z, or .Z. The uncompressed data will be written to a file name
+ with the suffix stripped. On success, the original file is deleted. On
+ failure, the output file is deleted. For most failures, the command will
+ continue to process the remaining names on the command line. A memory
+ allocation failure will abort the command. If -t is specified, then the
+ listed files or stdin will be tested as gzip files for integrity (without
+ checking for a proper suffix), no output will be written, and no files
+ will be deleted.
+
+ Like gzip, gun allows concatenated gzip streams and will decompress them,
+ writing all of the uncompressed data to the output. Unlike gzip, gun allows
+ an empty file on input, and will produce no error writing an empty output
+ file.
+
+ gun will also decompress files made by Unix compress, which uses LZW
+ compression. These files are automatically detected by virtue of their
+ magic header bytes. Since the end of Unix compress stream is marked by the
+ end-of-file, they cannot be concantenated. If a Unix compress stream is
+ encountered in an input file, it is the last stream in that file.
+
+ Like gunzip and uncompress, the file attributes of the original compressed
+ file are maintained in the final uncompressed file, to the extent that the
+ user permissions allow it.
+
+ On my Mac OS X PowerPC G4, gun is almost twice as fast as gunzip (version
+ 1.2.4) is on the same file, when gun is linked with zlib 1.2.2. Also the
+ LZW decompression provided by gun is about twice as fast as the standard
+ Unix uncompress command.
+ */
+
+/* external functions and related types and constants */
+#include <stdio.h> /* fprintf() */
+#include <stdlib.h> /* malloc(), free() */
+#include <string.h> /* strerror(), strcmp(), strlen(), memcpy() */
+#include <errno.h> /* errno */
+#include <fcntl.h> /* open() */
+#include <unistd.h> /* read(), write(), close(), chown(), unlink() */
+#include <sys/types.h>
+#include <sys/stat.h> /* stat(), chmod() */
+#include <utime.h> /* utime() */
+#include "zlib.h" /* inflateBackInit(), inflateBack(), */
+ /* inflateBackEnd(), crc32() */
+
+/* function declaration */
+#define local static
+
+/* buffer constants */
+#define SIZE 32768U /* input and output buffer sizes */
+#define PIECE 16384 /* limits i/o chunks for 16-bit int case */
+
+/* structure for infback() to pass to input function in() -- it maintains the
+ input file and a buffer of size SIZE */
+struct ind {
+ int infile;
+ unsigned char *inbuf;
+};
+
+/* Load input buffer, assumed to be empty, and return bytes loaded and a
+ pointer to them. read() is called until the buffer is full, or until it
+ returns end-of-file or error. Return 0 on error. */
+local unsigned in(void *in_desc, z_const unsigned char **buf)
+{
+ int ret;
+ unsigned len;
+ unsigned char *next;
+ struct ind *me = (struct ind *)in_desc;
+
+ next = me->inbuf;
+ *buf = next;
+ len = 0;
+ do {
+ ret = PIECE;
+ if ((unsigned)ret > SIZE - len)
+ ret = (int)(SIZE - len);
+ ret = (int)read(me->infile, next, ret);
+ if (ret == -1) {
+ len = 0;
+ break;
+ }
+ next += ret;
+ len += ret;
+ } while (ret != 0 && len < SIZE);
+ return len;
+}
+
+/* structure for infback() to pass to output function out() -- it maintains the
+ output file, a running CRC-32 check on the output and the total number of
+ bytes output, both for checking against the gzip trailer. (The length in
+ the gzip trailer is stored modulo 2^32, so it's ok if a long is 32 bits and
+ the output is greater than 4 GB.) */
+struct outd {
+ int outfile;
+ int check; /* true if checking crc and total */
+ unsigned long crc;
+ unsigned long total;
+};
+
+/* Write output buffer and update the CRC-32 and total bytes written. write()
+ is called until all of the output is written or an error is encountered.
+ On success out() returns 0. For a write failure, out() returns 1. If the
+ output file descriptor is -1, then nothing is written.
+ */
+local int out(void *out_desc, unsigned char *buf, unsigned len)
+{
+ int ret;
+ struct outd *me = (struct outd *)out_desc;
+
+ if (me->check) {
+ me->crc = crc32(me->crc, buf, len);
+ me->total += len;
+ }
+ if (me->outfile != -1)
+ do {
+ ret = PIECE;
+ if ((unsigned)ret > len)
+ ret = (int)len;
+ ret = (int)write(me->outfile, buf, ret);
+ if (ret == -1)
+ return 1;
+ buf += ret;
+ len -= ret;
+ } while (len != 0);
+ return 0;
+}
+
+/* next input byte macro for use inside lunpipe() and gunpipe() */
+#define NEXT() (have ? 0 : (have = in(indp, &next)), \
+ last = have ? (have--, (int)(*next++)) : -1)
+
+/* memory for gunpipe() and lunpipe() --
+ the first 256 entries of prefix[] and suffix[] are never used, could
+ have offset the index, but it's faster to waste the memory */
+unsigned char inbuf[SIZE]; /* input buffer */
+unsigned char outbuf[SIZE]; /* output buffer */
+unsigned short prefix[65536]; /* index to LZW prefix string */
+unsigned char suffix[65536]; /* one-character LZW suffix */
+unsigned char match[65280 + 2]; /* buffer for reversed match or gzip
+ 32K sliding window */
+
+/* throw out what's left in the current bits byte buffer (this is a vestigial
+ aspect of the compressed data format derived from an implementation that
+ made use of a special VAX machine instruction!) */
+#define FLUSHCODE() \
+ do { \
+ left = 0; \
+ rem = 0; \
+ if (chunk > have) { \
+ chunk -= have; \
+ have = 0; \
+ if (NEXT() == -1) \
+ break; \
+ chunk--; \
+ if (chunk > have) { \
+ chunk = have = 0; \
+ break; \
+ } \
+ } \
+ have -= chunk; \
+ next += chunk; \
+ chunk = 0; \
+ } while (0)
+
+/* Decompress a compress (LZW) file from indp to outfile. The compress magic
+ header (two bytes) has already been read and verified. There are have bytes
+ of buffered input at next. strm is used for passing error information back
+ to gunpipe().
+
+ lunpipe() will return Z_OK on success, Z_BUF_ERROR for an unexpected end of
+ file, read error, or write error (a write error indicated by strm->next_in
+ not equal to Z_NULL), or Z_DATA_ERROR for invalid input.
+ */
+local int lunpipe(unsigned have, z_const unsigned char *next, struct ind *indp,
+ int outfile, z_stream *strm)
+{
+ int last; /* last byte read by NEXT(), or -1 if EOF */
+ unsigned chunk; /* bytes left in current chunk */
+ int left; /* bits left in rem */
+ unsigned rem; /* unused bits from input */
+ int bits; /* current bits per code */
+ unsigned code; /* code, table traversal index */
+ unsigned mask; /* mask for current bits codes */
+ int max; /* maximum bits per code for this stream */
+ unsigned flags; /* compress flags, then block compress flag */
+ unsigned end; /* last valid entry in prefix/suffix tables */
+ unsigned temp; /* current code */
+ unsigned prev; /* previous code */
+ unsigned final; /* last character written for previous code */
+ unsigned stack; /* next position for reversed string */
+ unsigned outcnt; /* bytes in output buffer */
+ struct outd outd; /* output structure */
+ unsigned char *p;
+
+ /* set up output */
+ outd.outfile = outfile;
+ outd.check = 0;
+
+ /* process remainder of compress header -- a flags byte */
+ flags = NEXT();
+ if (last == -1)
+ return Z_BUF_ERROR;
+ if (flags & 0x60) {
+ strm->msg = (char *)"unknown lzw flags set";
+ return Z_DATA_ERROR;
+ }
+ max = flags & 0x1f;
+ if (max < 9 || max > 16) {
+ strm->msg = (char *)"lzw bits out of range";
+ return Z_DATA_ERROR;
+ }
+ if (max == 9) /* 9 doesn't really mean 9 */
+ max = 10;
+ flags &= 0x80; /* true if block compress */
+
+ /* clear table */
+ bits = 9;
+ mask = 0x1ff;
+ end = flags ? 256 : 255;
+
+ /* set up: get first 9-bit code, which is the first decompressed byte, but
+ don't create a table entry until the next code */
+ if (NEXT() == -1) /* no compressed data is ok */
+ return Z_OK;
+ final = prev = (unsigned)last; /* low 8 bits of code */
+ if (NEXT() == -1) /* missing a bit */
+ return Z_BUF_ERROR;
+ if (last & 1) { /* code must be < 256 */
+ strm->msg = (char *)"invalid lzw code";
+ return Z_DATA_ERROR;
+ }
+ rem = (unsigned)last >> 1; /* remaining 7 bits */
+ left = 7;
+ chunk = bits - 2; /* 7 bytes left in this chunk */
+ outbuf[0] = (unsigned char)final; /* write first decompressed byte */
+ outcnt = 1;
+
+ /* decode codes */
+ stack = 0;
+ for (;;) {
+ /* if the table will be full after this, increment the code size */
+ if (end >= mask && bits < max) {
+ FLUSHCODE();
+ bits++;
+ mask <<= 1;
+ mask++;
+ }
+
+ /* get a code of length bits */
+ if (chunk == 0) /* decrement chunk modulo bits */
+ chunk = bits;
+ code = rem; /* low bits of code */
+ if (NEXT() == -1) { /* EOF is end of compressed data */
+ /* write remaining buffered output */
+ if (outcnt && out(&outd, outbuf, outcnt)) {
+ strm->next_in = outbuf; /* signal write error */
+ return Z_BUF_ERROR;
+ }
+ return Z_OK;
+ }
+ code += (unsigned)last << left; /* middle (or high) bits of code */
+ left += 8;
+ chunk--;
+ if (bits > left) { /* need more bits */
+ if (NEXT() == -1) /* can't end in middle of code */
+ return Z_BUF_ERROR;
+ code += (unsigned)last << left; /* high bits of code */
+ left += 8;
+ chunk--;
+ }
+ code &= mask; /* mask to current code length */
+ left -= bits; /* number of unused bits */
+ rem = (unsigned)last >> (8 - left); /* unused bits from last byte */
+
+ /* process clear code (256) */
+ if (code == 256 && flags) {
+ FLUSHCODE();
+ bits = 9; /* initialize bits and mask */
+ mask = 0x1ff;
+ end = 255; /* empty table */
+ continue; /* get next code */
+ }
+
+ /* special code to reuse last match */
+ temp = code; /* save the current code */
+ if (code > end) {
+ /* Be picky on the allowed code here, and make sure that the code
+ we drop through (prev) will be a valid index so that random
+ input does not cause an exception. The code != end + 1 check is
+ empirically derived, and not checked in the original uncompress
+ code. If this ever causes a problem, that check could be safely
+ removed. Leaving this check in greatly improves gun's ability
+ to detect random or corrupted input after a compress header.
+ In any case, the prev > end check must be retained. */
+ if (code != end + 1 || prev > end) {
+ strm->msg = (char *)"invalid lzw code";
+ return Z_DATA_ERROR;
+ }
+ match[stack++] = (unsigned char)final;
+ code = prev;
+ }
+
+ /* walk through linked list to generate output in reverse order */
+ p = match + stack;
+ while (code >= 256) {
+ *p++ = suffix[code];
+ code = prefix[code];
+ }
+ stack = p - match;
+ match[stack++] = (unsigned char)code;
+ final = code;
+
+ /* link new table entry */
+ if (end < mask) {
+ end++;
+ prefix[end] = (unsigned short)prev;
+ suffix[end] = (unsigned char)final;
+ }
+
+ /* set previous code for next iteration */
+ prev = temp;
+
+ /* write output in forward order */
+ while (stack > SIZE - outcnt) {
+ while (outcnt < SIZE)
+ outbuf[outcnt++] = match[--stack];
+ if (out(&outd, outbuf, outcnt)) {
+ strm->next_in = outbuf; /* signal write error */
+ return Z_BUF_ERROR;
+ }
+ outcnt = 0;
+ }
+ p = match + stack;
+ do {
+ outbuf[outcnt++] = *--p;
+ } while (p > match);
+ stack = 0;
+
+ /* loop for next code with final and prev as the last match, rem and
+ left provide the first 0..7 bits of the next code, end is the last
+ valid table entry */
+ }
+}
+
+/* Decompress a gzip file from infile to outfile. strm is assumed to have been
+ successfully initialized with inflateBackInit(). The input file may consist
+ of a series of gzip streams, in which case all of them will be decompressed
+ to the output file. If outfile is -1, then the gzip stream(s) integrity is
+ checked and nothing is written.
+
+ The return value is a zlib error code: Z_MEM_ERROR if out of memory,
+ Z_DATA_ERROR if the header or the compressed data is invalid, or if the
+ trailer CRC-32 check or length doesn't match, Z_BUF_ERROR if the input ends
+ prematurely or a write error occurs, or Z_ERRNO if junk (not a another gzip
+ stream) follows a valid gzip stream.
+ */
+local int gunpipe(z_stream *strm, int infile, int outfile)
+{
+ int ret, first, last;
+ unsigned have, flags, len;
+ z_const unsigned char *next = NULL;
+ struct ind ind, *indp;
+ struct outd outd;
+
+ /* setup input buffer */
+ ind.infile = infile;
+ ind.inbuf = inbuf;
+ indp = &ind;
+
+ /* decompress concatenated gzip streams */
+ have = 0; /* no input data read in yet */
+ first = 1; /* looking for first gzip header */
+ strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */
+ for (;;) {
+ /* look for the two magic header bytes for a gzip stream */
+ if (NEXT() == -1) {
+ ret = Z_OK;
+ break; /* empty gzip stream is ok */
+ }
+ if (last != 31 || (NEXT() != 139 && last != 157)) {
+ strm->msg = (char *)"incorrect header check";
+ ret = first ? Z_DATA_ERROR : Z_ERRNO;
+ break; /* not a gzip or compress header */
+ }
+ first = 0; /* next non-header is junk */
+
+ /* process a compress (LZW) file -- can't be concatenated after this */
+ if (last == 157) {
+ ret = lunpipe(have, next, indp, outfile, strm);
+ break;
+ }
+
+ /* process remainder of gzip header */
+ ret = Z_BUF_ERROR;
+ if (NEXT() != 8) { /* only deflate method allowed */
+ if (last == -1) break;
+ strm->msg = (char *)"unknown compression method";
+ ret = Z_DATA_ERROR;
+ break;
+ }
+ flags = NEXT(); /* header flags */
+ NEXT(); /* discard mod time, xflgs, os */
+ NEXT();
+ NEXT();
+ NEXT();
+ NEXT();
+ NEXT();
+ if (last == -1) break;
+ if (flags & 0xe0) {
+ strm->msg = (char *)"unknown header flags set";
+ ret = Z_DATA_ERROR;
+ break;
+ }
+ if (flags & 4) { /* extra field */
+ len = NEXT();
+ len += (unsigned)(NEXT()) << 8;
+ if (last == -1) break;
+ while (len > have) {
+ len -= have;
+ have = 0;
+ if (NEXT() == -1) break;
+ len--;
+ }
+ if (last == -1) break;
+ have -= len;
+ next += len;
+ }
+ if (flags & 8) /* file name */
+ while (NEXT() != 0 && last != -1)
+ ;
+ if (flags & 16) /* comment */
+ while (NEXT() != 0 && last != -1)
+ ;
+ if (flags & 2) { /* header crc */
+ NEXT();
+ NEXT();
+ }
+ if (last == -1) break;
+
+ /* set up output */
+ outd.outfile = outfile;
+ outd.check = 1;
+ outd.crc = crc32(0L, Z_NULL, 0);
+ outd.total = 0;
+
+ /* decompress data to output */
+ strm->next_in = next;
+ strm->avail_in = have;
+ ret = inflateBack(strm, in, indp, out, &outd);
+ if (ret != Z_STREAM_END) break;
+ next = strm->next_in;
+ have = strm->avail_in;
+ strm->next_in = Z_NULL; /* so Z_BUF_ERROR means EOF */
+
+ /* check trailer */
+ ret = Z_BUF_ERROR;
+ if (NEXT() != (int)(outd.crc & 0xff) ||
+ NEXT() != (int)((outd.crc >> 8) & 0xff) ||
+ NEXT() != (int)((outd.crc >> 16) & 0xff) ||
+ NEXT() != (int)((outd.crc >> 24) & 0xff)) {
+ /* crc error */
+ if (last != -1) {
+ strm->msg = (char *)"incorrect data check";
+ ret = Z_DATA_ERROR;
+ }
+ break;
+ }
+ if (NEXT() != (int)(outd.total & 0xff) ||
+ NEXT() != (int)((outd.total >> 8) & 0xff) ||
+ NEXT() != (int)((outd.total >> 16) & 0xff) ||
+ NEXT() != (int)((outd.total >> 24) & 0xff)) {
+ /* length error */
+ if (last != -1) {
+ strm->msg = (char *)"incorrect length check";
+ ret = Z_DATA_ERROR;
+ }
+ break;
+ }
+
+ /* go back and look for another gzip stream */
+ }
+
+ /* clean up and return */
+ return ret;
+}
+
+/* Copy file attributes, from -> to, as best we can. This is best effort, so
+ no errors are reported. The mode bits, including suid, sgid, and the sticky
+ bit are copied (if allowed), the owner's user id and group id are copied
+ (again if allowed), and the access and modify times are copied. */
+local void copymeta(char *from, char *to)
+{
+ struct stat was;
+ struct utimbuf when;
+
+ /* get all of from's Unix meta data, return if not a regular file */
+ if (stat(from, &was) != 0 || (was.st_mode & S_IFMT) != S_IFREG)
+ return;
+
+ /* set to's mode bits, ignore errors */
+ (void)chmod(to, was.st_mode & 07777);
+
+ /* copy owner's user and group, ignore errors */
+ (void)chown(to, was.st_uid, was.st_gid);
+
+ /* copy access and modify times, ignore errors */
+ when.actime = was.st_atime;
+ when.modtime = was.st_mtime;
+ (void)utime(to, &when);
+}
+
+/* Decompress the file inname to the file outnname, of if test is true, just
+ decompress without writing and check the gzip trailer for integrity. If
+ inname is NULL or an empty string, read from stdin. If outname is NULL or
+ an empty string, write to stdout. strm is a pre-initialized inflateBack
+ structure. When appropriate, copy the file attributes from inname to
+ outname.
+
+ gunzip() returns 1 if there is an out-of-memory error or an unexpected
+ return code from gunpipe(). Otherwise it returns 0.
+ */
+local int gunzip(z_stream *strm, char *inname, char *outname, int test)
+{
+ int ret;
+ int infile, outfile;
+
+ /* open files */
+ if (inname == NULL || *inname == 0) {
+ inname = "-";
+ infile = 0; /* stdin */
+ }
+ else {
+ infile = open(inname, O_RDONLY, 0);
+ if (infile == -1) {
+ fprintf(stderr, "gun cannot open %s\n", inname);
+ return 0;
+ }
+ }
+ if (test)
+ outfile = -1;
+ else if (outname == NULL || *outname == 0) {
+ outname = "-";
+ outfile = 1; /* stdout */
+ }
+ else {
+ outfile = open(outname, O_CREAT | O_TRUNC | O_WRONLY, 0666);
+ if (outfile == -1) {
+ close(infile);
+ fprintf(stderr, "gun cannot create %s\n", outname);
+ return 0;
+ }
+ }
+ errno = 0;
+
+ /* decompress */
+ ret = gunpipe(strm, infile, outfile);
+ if (outfile > 2) close(outfile);
+ if (infile > 2) close(infile);
+
+ /* interpret result */
+ switch (ret) {
+ case Z_OK:
+ case Z_ERRNO:
+ if (infile > 2 && outfile > 2) {
+ copymeta(inname, outname); /* copy attributes */
+ unlink(inname);
+ }
+ if (ret == Z_ERRNO)
+ fprintf(stderr, "gun warning: trailing garbage ignored in %s\n",
+ inname);
+ break;
+ case Z_DATA_ERROR:
+ if (outfile > 2) unlink(outname);
+ fprintf(stderr, "gun data error on %s: %s\n", inname, strm->msg);
+ break;
+ case Z_MEM_ERROR:
+ if (outfile > 2) unlink(outname);
+ fprintf(stderr, "gun out of memory error--aborting\n");
+ return 1;
+ case Z_BUF_ERROR:
+ if (outfile > 2) unlink(outname);
+ if (strm->next_in != Z_NULL) {
+ fprintf(stderr, "gun write error on %s: %s\n",
+ outname, strerror(errno));
+ }
+ else if (errno) {
+ fprintf(stderr, "gun read error on %s: %s\n",
+ inname, strerror(errno));
+ }
+ else {
+ fprintf(stderr, "gun unexpected end of file on %s\n",
+ inname);
+ }
+ break;
+ default:
+ if (outfile > 2) unlink(outname);
+ fprintf(stderr, "gun internal error--aborting\n");
+ return 1;
+ }
+ return 0;
+}
+
+/* Process the gun command line arguments. See the command syntax near the
+ beginning of this source file. */
+int main(int argc, char **argv)
+{
+ int ret, len, test;
+ char *outname;
+ unsigned char *window;
+ z_stream strm;
+
+ /* initialize inflateBack state for repeated use */
+ window = match; /* reuse LZW match buffer */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ ret = inflateBackInit(&strm, 15, window);
+ if (ret != Z_OK) {
+ fprintf(stderr, "gun out of memory error--aborting\n");
+ return 1;
+ }
+
+ /* decompress each file to the same name with the suffix removed */
+ argc--;
+ argv++;
+ test = 0;
+ if (argc && strcmp(*argv, "-h") == 0) {
+ fprintf(stderr, "gun 1.6 (17 Jan 2010)\n");
+ fprintf(stderr, "Copyright (C) 2003-2010 Mark Adler\n");
+ fprintf(stderr, "usage: gun [-t] [file1.gz [file2.Z ...]]\n");
+ return 0;
+ }
+ if (argc && strcmp(*argv, "-t") == 0) {
+ test = 1;
+ argc--;
+ argv++;
+ }
+ if (argc)
+ do {
+ if (test)
+ outname = NULL;
+ else {
+ len = (int)strlen(*argv);
+ if (strcmp(*argv + len - 3, ".gz") == 0 ||
+ strcmp(*argv + len - 3, "-gz") == 0)
+ len -= 3;
+ else if (strcmp(*argv + len - 2, ".z") == 0 ||
+ strcmp(*argv + len - 2, "-z") == 0 ||
+ strcmp(*argv + len - 2, "_z") == 0 ||
+ strcmp(*argv + len - 2, ".Z") == 0)
+ len -= 2;
+ else {
+ fprintf(stderr, "gun error: no gz type on %s--skipping\n",
+ *argv);
+ continue;
+ }
+ outname = malloc(len + 1);
+ if (outname == NULL) {
+ fprintf(stderr, "gun out of memory error--aborting\n");
+ ret = 1;
+ break;
+ }
+ memcpy(outname, *argv, len);
+ outname[len] = 0;
+ }
+ ret = gunzip(&strm, *argv, outname, test);
+ if (outname != NULL) free(outname);
+ if (ret) break;
+ } while (argv++, --argc);
+ else
+ ret = gunzip(&strm, NULL, NULL, test);
+
+ /* clean up */
+ inflateBackEnd(&strm);
+ return ret;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzappend.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzappend.c
new file mode 100644
index 000000000..662dec379
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzappend.c
@@ -0,0 +1,504 @@
+/* gzappend -- command to append to a gzip file
+
+ Copyright (C) 2003, 2012 Mark Adler, all rights reserved
+ version 1.2, 11 Oct 2012
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Mark Adler madler@alumni.caltech.edu
+ */
+
+/*
+ * Change history:
+ *
+ * 1.0 19 Oct 2003 - First version
+ * 1.1 4 Nov 2003 - Expand and clarify some comments and notes
+ * - Add version and copyright to help
+ * - Send help to stdout instead of stderr
+ * - Add some preemptive typecasts
+ * - Add L to constants in lseek() calls
+ * - Remove some debugging information in error messages
+ * - Use new data_type definition for zlib 1.2.1
+ * - Simplfy and unify file operations
+ * - Finish off gzip file in gztack()
+ * - Use deflatePrime() instead of adding empty blocks
+ * - Keep gzip file clean on appended file read errors
+ * - Use in-place rotate instead of auxiliary buffer
+ * (Why you ask? Because it was fun to write!)
+ * 1.2 11 Oct 2012 - Fix for proper z_const usage
+ * - Check for input buffer malloc failure
+ */
+
+/*
+ gzappend takes a gzip file and appends to it, compressing files from the
+ command line or data from stdin. The gzip file is written to directly, to
+ avoid copying that file, in case it's large. Note that this results in the
+ unfriendly behavior that if gzappend fails, the gzip file is corrupted.
+
+ This program was written to illustrate the use of the new Z_BLOCK option of
+ zlib 1.2.x's inflate() function. This option returns from inflate() at each
+ block boundary to facilitate locating and modifying the last block bit at
+ the start of the final deflate block. Also whether using Z_BLOCK or not,
+ another required feature of zlib 1.2.x is that inflate() now provides the
+ number of unusued bits in the last input byte used. gzappend will not work
+ with versions of zlib earlier than 1.2.1.
+
+ gzappend first decompresses the gzip file internally, discarding all but
+ the last 32K of uncompressed data, and noting the location of the last block
+ bit and the number of unused bits in the last byte of the compressed data.
+ The gzip trailer containing the CRC-32 and length of the uncompressed data
+ is verified. This trailer will be later overwritten.
+
+ Then the last block bit is cleared by seeking back in the file and rewriting
+ the byte that contains it. Seeking forward, the last byte of the compressed
+ data is saved along with the number of unused bits to initialize deflate.
+
+ A deflate process is initialized, using the last 32K of the uncompressed
+ data from the gzip file to initialize the dictionary. If the total
+ uncompressed data was less than 32K, then all of it is used to initialize
+ the dictionary. The deflate output bit buffer is also initialized with the
+ last bits from the original deflate stream. From here on, the data to
+ append is simply compressed using deflate, and written to the gzip file.
+ When that is complete, the new CRC-32 and uncompressed length are written
+ as the trailer of the gzip file.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <fcntl.h>
+#include <unistd.h>
+#include "zlib.h"
+
+#define local static
+#define LGCHUNK 14
+#define CHUNK (1U << LGCHUNK)
+#define DSIZE 32768U
+
+/* print an error message and terminate with extreme prejudice */
+local void bye(char *msg1, char *msg2)
+{
+ fprintf(stderr, "gzappend error: %s%s\n", msg1, msg2);
+ exit(1);
+}
+
+/* return the greatest common divisor of a and b using Euclid's algorithm,
+ modified to be fast when one argument much greater than the other, and
+ coded to avoid unnecessary swapping */
+local unsigned gcd(unsigned a, unsigned b)
+{
+ unsigned c;
+
+ while (a && b)
+ if (a > b) {
+ c = b;
+ while (a - c >= c)
+ c <<= 1;
+ a -= c;
+ }
+ else {
+ c = a;
+ while (b - c >= c)
+ c <<= 1;
+ b -= c;
+ }
+ return a + b;
+}
+
+/* rotate list[0..len-1] left by rot positions, in place */
+local void rotate(unsigned char *list, unsigned len, unsigned rot)
+{
+ unsigned char tmp;
+ unsigned cycles;
+ unsigned char *start, *last, *to, *from;
+
+ /* normalize rot and handle degenerate cases */
+ if (len < 2) return;
+ if (rot >= len) rot %= len;
+ if (rot == 0) return;
+
+ /* pointer to last entry in list */
+ last = list + (len - 1);
+
+ /* do simple left shift by one */
+ if (rot == 1) {
+ tmp = *list;
+ memcpy(list, list + 1, len - 1);
+ *last = tmp;
+ return;
+ }
+
+ /* do simple right shift by one */
+ if (rot == len - 1) {
+ tmp = *last;
+ memmove(list + 1, list, len - 1);
+ *list = tmp;
+ return;
+ }
+
+ /* otherwise do rotate as a set of cycles in place */
+ cycles = gcd(len, rot); /* number of cycles */
+ do {
+ start = from = list + cycles; /* start index is arbitrary */
+ tmp = *from; /* save entry to be overwritten */
+ for (;;) {
+ to = from; /* next step in cycle */
+ from += rot; /* go right rot positions */
+ if (from > last) from -= len; /* (pointer better not wrap) */
+ if (from == start) break; /* all but one shifted */
+ *to = *from; /* shift left */
+ }
+ *to = tmp; /* complete the circle */
+ } while (--cycles);
+}
+
+/* structure for gzip file read operations */
+typedef struct {
+ int fd; /* file descriptor */
+ int size; /* 1 << size is bytes in buf */
+ unsigned left; /* bytes available at next */
+ unsigned char *buf; /* buffer */
+ z_const unsigned char *next; /* next byte in buffer */
+ char *name; /* file name for error messages */
+} file;
+
+/* reload buffer */
+local int readin(file *in)
+{
+ int len;
+
+ len = read(in->fd, in->buf, 1 << in->size);
+ if (len == -1) bye("error reading ", in->name);
+ in->left = (unsigned)len;
+ in->next = in->buf;
+ return len;
+}
+
+/* read from file in, exit if end-of-file */
+local int readmore(file *in)
+{
+ if (readin(in) == 0) bye("unexpected end of ", in->name);
+ return 0;
+}
+
+#define read1(in) (in->left == 0 ? readmore(in) : 0, \
+ in->left--, *(in->next)++)
+
+/* skip over n bytes of in */
+local void skip(file *in, unsigned n)
+{
+ unsigned bypass;
+
+ if (n > in->left) {
+ n -= in->left;
+ bypass = n & ~((1U << in->size) - 1);
+ if (bypass) {
+ if (lseek(in->fd, (off_t)bypass, SEEK_CUR) == -1)
+ bye("seeking ", in->name);
+ n -= bypass;
+ }
+ readmore(in);
+ if (n > in->left)
+ bye("unexpected end of ", in->name);
+ }
+ in->left -= n;
+ in->next += n;
+}
+
+/* read a four-byte unsigned integer, little-endian, from in */
+unsigned long read4(file *in)
+{
+ unsigned long val;
+
+ val = read1(in);
+ val += (unsigned)read1(in) << 8;
+ val += (unsigned long)read1(in) << 16;
+ val += (unsigned long)read1(in) << 24;
+ return val;
+}
+
+/* skip over gzip header */
+local void gzheader(file *in)
+{
+ int flags;
+ unsigned n;
+
+ if (read1(in) != 31 || read1(in) != 139) bye(in->name, " not a gzip file");
+ if (read1(in) != 8) bye("unknown compression method in", in->name);
+ flags = read1(in);
+ if (flags & 0xe0) bye("unknown header flags set in", in->name);
+ skip(in, 6);
+ if (flags & 4) {
+ n = read1(in);
+ n += (unsigned)(read1(in)) << 8;
+ skip(in, n);
+ }
+ if (flags & 8) while (read1(in) != 0) ;
+ if (flags & 16) while (read1(in) != 0) ;
+ if (flags & 2) skip(in, 2);
+}
+
+/* decompress gzip file "name", return strm with a deflate stream ready to
+ continue compression of the data in the gzip file, and return a file
+ descriptor pointing to where to write the compressed data -- the deflate
+ stream is initialized to compress using level "level" */
+local int gzscan(char *name, z_stream *strm, int level)
+{
+ int ret, lastbit, left, full;
+ unsigned have;
+ unsigned long crc, tot;
+ unsigned char *window;
+ off_t lastoff, end;
+ file gz;
+
+ /* open gzip file */
+ gz.name = name;
+ gz.fd = open(name, O_RDWR, 0);
+ if (gz.fd == -1) bye("cannot open ", name);
+ gz.buf = malloc(CHUNK);
+ if (gz.buf == NULL) bye("out of memory", "");
+ gz.size = LGCHUNK;
+ gz.left = 0;
+
+ /* skip gzip header */
+ gzheader(&gz);
+
+ /* prepare to decompress */
+ window = malloc(DSIZE);
+ if (window == NULL) bye("out of memory", "");
+ strm->zalloc = Z_NULL;
+ strm->zfree = Z_NULL;
+ strm->opaque = Z_NULL;
+ ret = inflateInit2(strm, -15);
+ if (ret != Z_OK) bye("out of memory", " or library mismatch");
+
+ /* decompress the deflate stream, saving append information */
+ lastbit = 0;
+ lastoff = lseek(gz.fd, 0L, SEEK_CUR) - gz.left;
+ left = 0;
+ strm->avail_in = gz.left;
+ strm->next_in = gz.next;
+ crc = crc32(0L, Z_NULL, 0);
+ have = full = 0;
+ do {
+ /* if needed, get more input */
+ if (strm->avail_in == 0) {
+ readmore(&gz);
+ strm->avail_in = gz.left;
+ strm->next_in = gz.next;
+ }
+
+ /* set up output to next available section of sliding window */
+ strm->avail_out = DSIZE - have;
+ strm->next_out = window + have;
+
+ /* inflate and check for errors */
+ ret = inflate(strm, Z_BLOCK);
+ if (ret == Z_STREAM_ERROR) bye("internal stream error!", "");
+ if (ret == Z_MEM_ERROR) bye("out of memory", "");
+ if (ret == Z_DATA_ERROR)
+ bye("invalid compressed data--format violated in", name);
+
+ /* update crc and sliding window pointer */
+ crc = crc32(crc, window + have, DSIZE - have - strm->avail_out);
+ if (strm->avail_out)
+ have = DSIZE - strm->avail_out;
+ else {
+ have = 0;
+ full = 1;
+ }
+
+ /* process end of block */
+ if (strm->data_type & 128) {
+ if (strm->data_type & 64)
+ left = strm->data_type & 0x1f;
+ else {
+ lastbit = strm->data_type & 0x1f;
+ lastoff = lseek(gz.fd, 0L, SEEK_CUR) - strm->avail_in;
+ }
+ }
+ } while (ret != Z_STREAM_END);
+ inflateEnd(strm);
+ gz.left = strm->avail_in;
+ gz.next = strm->next_in;
+
+ /* save the location of the end of the compressed data */
+ end = lseek(gz.fd, 0L, SEEK_CUR) - gz.left;
+
+ /* check gzip trailer and save total for deflate */
+ if (crc != read4(&gz))
+ bye("invalid compressed data--crc mismatch in ", name);
+ tot = strm->total_out;
+ if ((tot & 0xffffffffUL) != read4(&gz))
+ bye("invalid compressed data--length mismatch in", name);
+
+ /* if not at end of file, warn */
+ if (gz.left || readin(&gz))
+ fprintf(stderr,
+ "gzappend warning: junk at end of gzip file overwritten\n");
+
+ /* clear last block bit */
+ lseek(gz.fd, lastoff - (lastbit != 0), SEEK_SET);
+ if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name);
+ *gz.buf = (unsigned char)(*gz.buf ^ (1 << ((8 - lastbit) & 7)));
+ lseek(gz.fd, -1L, SEEK_CUR);
+ if (write(gz.fd, gz.buf, 1) != 1) bye("writing after seek to ", name);
+
+ /* if window wrapped, build dictionary from window by rotating */
+ if (full) {
+ rotate(window, DSIZE, have);
+ have = DSIZE;
+ }
+
+ /* set up deflate stream with window, crc, total_in, and leftover bits */
+ ret = deflateInit2(strm, level, Z_DEFLATED, -15, 8, Z_DEFAULT_STRATEGY);
+ if (ret != Z_OK) bye("out of memory", "");
+ deflateSetDictionary(strm, window, have);
+ strm->adler = crc;
+ strm->total_in = tot;
+ if (left) {
+ lseek(gz.fd, --end, SEEK_SET);
+ if (read(gz.fd, gz.buf, 1) != 1) bye("reading after seek on ", name);
+ deflatePrime(strm, 8 - left, *gz.buf);
+ }
+ lseek(gz.fd, end, SEEK_SET);
+
+ /* clean up and return */
+ free(window);
+ free(gz.buf);
+ return gz.fd;
+}
+
+/* append file "name" to gzip file gd using deflate stream strm -- if last
+ is true, then finish off the deflate stream at the end */
+local void gztack(char *name, int gd, z_stream *strm, int last)
+{
+ int fd, len, ret;
+ unsigned left;
+ unsigned char *in, *out;
+
+ /* open file to compress and append */
+ fd = 0;
+ if (name != NULL) {
+ fd = open(name, O_RDONLY, 0);
+ if (fd == -1)
+ fprintf(stderr, "gzappend warning: %s not found, skipping ...\n",
+ name);
+ }
+
+ /* allocate buffers */
+ in = malloc(CHUNK);
+ out = malloc(CHUNK);
+ if (in == NULL || out == NULL) bye("out of memory", "");
+
+ /* compress input file and append to gzip file */
+ do {
+ /* get more input */
+ len = read(fd, in, CHUNK);
+ if (len == -1) {
+ fprintf(stderr,
+ "gzappend warning: error reading %s, skipping rest ...\n",
+ name);
+ len = 0;
+ }
+ strm->avail_in = (unsigned)len;
+ strm->next_in = in;
+ if (len) strm->adler = crc32(strm->adler, in, (unsigned)len);
+
+ /* compress and write all available output */
+ do {
+ strm->avail_out = CHUNK;
+ strm->next_out = out;
+ ret = deflate(strm, last && len == 0 ? Z_FINISH : Z_NO_FLUSH);
+ left = CHUNK - strm->avail_out;
+ while (left) {
+ len = write(gd, out + CHUNK - strm->avail_out - left, left);
+ if (len == -1) bye("writing gzip file", "");
+ left -= (unsigned)len;
+ }
+ } while (strm->avail_out == 0 && ret != Z_STREAM_END);
+ } while (len != 0);
+
+ /* write trailer after last entry */
+ if (last) {
+ deflateEnd(strm);
+ out[0] = (unsigned char)(strm->adler);
+ out[1] = (unsigned char)(strm->adler >> 8);
+ out[2] = (unsigned char)(strm->adler >> 16);
+ out[3] = (unsigned char)(strm->adler >> 24);
+ out[4] = (unsigned char)(strm->total_in);
+ out[5] = (unsigned char)(strm->total_in >> 8);
+ out[6] = (unsigned char)(strm->total_in >> 16);
+ out[7] = (unsigned char)(strm->total_in >> 24);
+ len = 8;
+ do {
+ ret = write(gd, out + 8 - len, len);
+ if (ret == -1) bye("writing gzip file", "");
+ len -= ret;
+ } while (len);
+ close(gd);
+ }
+
+ /* clean up and return */
+ free(out);
+ free(in);
+ if (fd > 0) close(fd);
+}
+
+/* process the compression level option if present, scan the gzip file, and
+ append the specified files, or append the data from stdin if no other file
+ names are provided on the command line -- the gzip file must be writable
+ and seekable */
+int main(int argc, char **argv)
+{
+ int gd, level;
+ z_stream strm;
+
+ /* ignore command name */
+ argc--; argv++;
+
+ /* provide usage if no arguments */
+ if (*argv == NULL) {
+ printf(
+ "gzappend 1.2 (11 Oct 2012) Copyright (C) 2003, 2012 Mark Adler\n"
+ );
+ printf(
+ "usage: gzappend [-level] file.gz [ addthis [ andthis ... ]]\n");
+ return 0;
+ }
+
+ /* set compression level */
+ level = Z_DEFAULT_COMPRESSION;
+ if (argv[0][0] == '-') {
+ if (argv[0][1] < '0' || argv[0][1] > '9' || argv[0][2] != 0)
+ bye("invalid compression level", "");
+ level = argv[0][1] - '0';
+ if (*++argv == NULL) bye("no gzip file name after options", "");
+ }
+
+ /* prepare to append to gzip file */
+ gd = gzscan(*argv++, &strm, level);
+
+ /* append files on command line, or from stdin if none */
+ if (*argv == NULL)
+ gztack(NULL, gd, &strm, 1);
+ else
+ do {
+ gztack(*argv, gd, &strm, argv[1] == NULL);
+ } while (*++argv != NULL);
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzjoin.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzjoin.c
new file mode 100644
index 000000000..89e809844
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzjoin.c
@@ -0,0 +1,449 @@
+/* gzjoin -- command to join gzip files into one gzip file
+
+ Copyright (C) 2004, 2005, 2012 Mark Adler, all rights reserved
+ version 1.2, 14 Aug 2012
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Mark Adler madler@alumni.caltech.edu
+ */
+
+/*
+ * Change history:
+ *
+ * 1.0 11 Dec 2004 - First version
+ * 1.1 12 Jun 2005 - Changed ssize_t to long for portability
+ * 1.2 14 Aug 2012 - Clean up for z_const usage
+ */
+
+/*
+ gzjoin takes one or more gzip files on the command line and writes out a
+ single gzip file that will uncompress to the concatenation of the
+ uncompressed data from the individual gzip files. gzjoin does this without
+ having to recompress any of the data and without having to calculate a new
+ crc32 for the concatenated uncompressed data. gzjoin does however have to
+ decompress all of the input data in order to find the bits in the compressed
+ data that need to be modified to concatenate the streams.
+
+ gzjoin does not do an integrity check on the input gzip files other than
+ checking the gzip header and decompressing the compressed data. They are
+ otherwise assumed to be complete and correct.
+
+ Each joint between gzip files removes at least 18 bytes of previous trailer
+ and subsequent header, and inserts an average of about three bytes to the
+ compressed data in order to connect the streams. The output gzip file
+ has a minimal ten-byte gzip header with no file name or modification time.
+
+ This program was written to illustrate the use of the Z_BLOCK option of
+ inflate() and the crc32_combine() function. gzjoin will not compile with
+ versions of zlib earlier than 1.2.3.
+ */
+
+#include <stdio.h> /* fputs(), fprintf(), fwrite(), putc() */
+#include <stdlib.h> /* exit(), malloc(), free() */
+#include <fcntl.h> /* open() */
+#include <unistd.h> /* close(), read(), lseek() */
+#include "zlib.h"
+ /* crc32(), crc32_combine(), inflateInit2(), inflate(), inflateEnd() */
+
+#define local static
+
+/* exit with an error (return a value to allow use in an expression) */
+local int bail(char *why1, char *why2)
+{
+ fprintf(stderr, "gzjoin error: %s%s, output incomplete\n", why1, why2);
+ exit(1);
+ return 0;
+}
+
+/* -- simple buffered file input with access to the buffer -- */
+
+#define CHUNK 32768 /* must be a power of two and fit in unsigned */
+
+/* bin buffered input file type */
+typedef struct {
+ char *name; /* name of file for error messages */
+ int fd; /* file descriptor */
+ unsigned left; /* bytes remaining at next */
+ unsigned char *next; /* next byte to read */
+ unsigned char *buf; /* allocated buffer of length CHUNK */
+} bin;
+
+/* close a buffered file and free allocated memory */
+local void bclose(bin *in)
+{
+ if (in != NULL) {
+ if (in->fd != -1)
+ close(in->fd);
+ if (in->buf != NULL)
+ free(in->buf);
+ free(in);
+ }
+}
+
+/* open a buffered file for input, return a pointer to type bin, or NULL on
+ failure */
+local bin *bopen(char *name)
+{
+ bin *in;
+
+ in = malloc(sizeof(bin));
+ if (in == NULL)
+ return NULL;
+ in->buf = malloc(CHUNK);
+ in->fd = open(name, O_RDONLY, 0);
+ if (in->buf == NULL || in->fd == -1) {
+ bclose(in);
+ return NULL;
+ }
+ in->left = 0;
+ in->next = in->buf;
+ in->name = name;
+ return in;
+}
+
+/* load buffer from file, return -1 on read error, 0 or 1 on success, with
+ 1 indicating that end-of-file was reached */
+local int bload(bin *in)
+{
+ long len;
+
+ if (in == NULL)
+ return -1;
+ if (in->left != 0)
+ return 0;
+ in->next = in->buf;
+ do {
+ len = (long)read(in->fd, in->buf + in->left, CHUNK - in->left);
+ if (len < 0)
+ return -1;
+ in->left += (unsigned)len;
+ } while (len != 0 && in->left < CHUNK);
+ return len == 0 ? 1 : 0;
+}
+
+/* get a byte from the file, bail if end of file */
+#define bget(in) (in->left ? 0 : bload(in), \
+ in->left ? (in->left--, *(in->next)++) : \
+ bail("unexpected end of file on ", in->name))
+
+/* get a four-byte little-endian unsigned integer from file */
+local unsigned long bget4(bin *in)
+{
+ unsigned long val;
+
+ val = bget(in);
+ val += (unsigned long)(bget(in)) << 8;
+ val += (unsigned long)(bget(in)) << 16;
+ val += (unsigned long)(bget(in)) << 24;
+ return val;
+}
+
+/* skip bytes in file */
+local void bskip(bin *in, unsigned skip)
+{
+ /* check pointer */
+ if (in == NULL)
+ return;
+
+ /* easy case -- skip bytes in buffer */
+ if (skip <= in->left) {
+ in->left -= skip;
+ in->next += skip;
+ return;
+ }
+
+ /* skip what's in buffer, discard buffer contents */
+ skip -= in->left;
+ in->left = 0;
+
+ /* seek past multiples of CHUNK bytes */
+ if (skip > CHUNK) {
+ unsigned left;
+
+ left = skip & (CHUNK - 1);
+ if (left == 0) {
+ /* exact number of chunks: seek all the way minus one byte to check
+ for end-of-file with a read */
+ lseek(in->fd, skip - 1, SEEK_CUR);
+ if (read(in->fd, in->buf, 1) != 1)
+ bail("unexpected end of file on ", in->name);
+ return;
+ }
+
+ /* skip the integral chunks, update skip with remainder */
+ lseek(in->fd, skip - left, SEEK_CUR);
+ skip = left;
+ }
+
+ /* read more input and skip remainder */
+ bload(in);
+ if (skip > in->left)
+ bail("unexpected end of file on ", in->name);
+ in->left -= skip;
+ in->next += skip;
+}
+
+/* -- end of buffered input functions -- */
+
+/* skip the gzip header from file in */
+local void gzhead(bin *in)
+{
+ int flags;
+
+ /* verify gzip magic header and compression method */
+ if (bget(in) != 0x1f || bget(in) != 0x8b || bget(in) != 8)
+ bail(in->name, " is not a valid gzip file");
+
+ /* get and verify flags */
+ flags = bget(in);
+ if ((flags & 0xe0) != 0)
+ bail("unknown reserved bits set in ", in->name);
+
+ /* skip modification time, extra flags, and os */
+ bskip(in, 6);
+
+ /* skip extra field if present */
+ if (flags & 4) {
+ unsigned len;
+
+ len = bget(in);
+ len += (unsigned)(bget(in)) << 8;
+ bskip(in, len);
+ }
+
+ /* skip file name if present */
+ if (flags & 8)
+ while (bget(in) != 0)
+ ;
+
+ /* skip comment if present */
+ if (flags & 16)
+ while (bget(in) != 0)
+ ;
+
+ /* skip header crc if present */
+ if (flags & 2)
+ bskip(in, 2);
+}
+
+/* write a four-byte little-endian unsigned integer to out */
+local void put4(unsigned long val, FILE *out)
+{
+ putc(val & 0xff, out);
+ putc((val >> 8) & 0xff, out);
+ putc((val >> 16) & 0xff, out);
+ putc((val >> 24) & 0xff, out);
+}
+
+/* Load up zlib stream from buffered input, bail if end of file */
+local void zpull(z_streamp strm, bin *in)
+{
+ if (in->left == 0)
+ bload(in);
+ if (in->left == 0)
+ bail("unexpected end of file on ", in->name);
+ strm->avail_in = in->left;
+ strm->next_in = in->next;
+}
+
+/* Write header for gzip file to out and initialize trailer. */
+local void gzinit(unsigned long *crc, unsigned long *tot, FILE *out)
+{
+ fwrite("\x1f\x8b\x08\0\0\0\0\0\0\xff", 1, 10, out);
+ *crc = crc32(0L, Z_NULL, 0);
+ *tot = 0;
+}
+
+/* Copy the compressed data from name, zeroing the last block bit of the last
+ block if clr is true, and adding empty blocks as needed to get to a byte
+ boundary. If clr is false, then the last block becomes the last block of
+ the output, and the gzip trailer is written. crc and tot maintains the
+ crc and length (modulo 2^32) of the output for the trailer. The resulting
+ gzip file is written to out. gzinit() must be called before the first call
+ of gzcopy() to write the gzip header and to initialize crc and tot. */
+local void gzcopy(char *name, int clr, unsigned long *crc, unsigned long *tot,
+ FILE *out)
+{
+ int ret; /* return value from zlib functions */
+ int pos; /* where the "last block" bit is in byte */
+ int last; /* true if processing the last block */
+ bin *in; /* buffered input file */
+ unsigned char *start; /* start of compressed data in buffer */
+ unsigned char *junk; /* buffer for uncompressed data -- discarded */
+ z_off_t len; /* length of uncompressed data (support > 4 GB) */
+ z_stream strm; /* zlib inflate stream */
+
+ /* open gzip file and skip header */
+ in = bopen(name);
+ if (in == NULL)
+ bail("could not open ", name);
+ gzhead(in);
+
+ /* allocate buffer for uncompressed data and initialize raw inflate
+ stream */
+ junk = malloc(CHUNK);
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit2(&strm, -15);
+ if (junk == NULL || ret != Z_OK)
+ bail("out of memory", "");
+
+ /* inflate and copy compressed data, clear last-block bit if requested */
+ len = 0;
+ zpull(&strm, in);
+ start = in->next;
+ last = start[0] & 1;
+ if (last && clr)
+ start[0] &= ~1;
+ strm.avail_out = 0;
+ for (;;) {
+ /* if input used and output done, write used input and get more */
+ if (strm.avail_in == 0 && strm.avail_out != 0) {
+ fwrite(start, 1, strm.next_in - start, out);
+ start = in->buf;
+ in->left = 0;
+ zpull(&strm, in);
+ }
+
+ /* decompress -- return early when end-of-block reached */
+ strm.avail_out = CHUNK;
+ strm.next_out = junk;
+ ret = inflate(&strm, Z_BLOCK);
+ switch (ret) {
+ case Z_MEM_ERROR:
+ bail("out of memory", "");
+ case Z_DATA_ERROR:
+ bail("invalid compressed data in ", in->name);
+ }
+
+ /* update length of uncompressed data */
+ len += CHUNK - strm.avail_out;
+
+ /* check for block boundary (only get this when block copied out) */
+ if (strm.data_type & 128) {
+ /* if that was the last block, then done */
+ if (last)
+ break;
+
+ /* number of unused bits in last byte */
+ pos = strm.data_type & 7;
+
+ /* find the next last-block bit */
+ if (pos != 0) {
+ /* next last-block bit is in last used byte */
+ pos = 0x100 >> pos;
+ last = strm.next_in[-1] & pos;
+ if (last && clr)
+ in->buf[strm.next_in - in->buf - 1] &= ~pos;
+ }
+ else {
+ /* next last-block bit is in next unused byte */
+ if (strm.avail_in == 0) {
+ /* don't have that byte yet -- get it */
+ fwrite(start, 1, strm.next_in - start, out);
+ start = in->buf;
+ in->left = 0;
+ zpull(&strm, in);
+ }
+ last = strm.next_in[0] & 1;
+ if (last && clr)
+ in->buf[strm.next_in - in->buf] &= ~1;
+ }
+ }
+ }
+
+ /* update buffer with unused input */
+ in->left = strm.avail_in;
+ in->next = in->buf + (strm.next_in - in->buf);
+
+ /* copy used input, write empty blocks to get to byte boundary */
+ pos = strm.data_type & 7;
+ fwrite(start, 1, in->next - start - 1, out);
+ last = in->next[-1];
+ if (pos == 0 || !clr)
+ /* already at byte boundary, or last file: write last byte */
+ putc(last, out);
+ else {
+ /* append empty blocks to last byte */
+ last &= ((0x100 >> pos) - 1); /* assure unused bits are zero */
+ if (pos & 1) {
+ /* odd -- append an empty stored block */
+ putc(last, out);
+ if (pos == 1)
+ putc(0, out); /* two more bits in block header */
+ fwrite("\0\0\xff\xff", 1, 4, out);
+ }
+ else {
+ /* even -- append 1, 2, or 3 empty fixed blocks */
+ switch (pos) {
+ case 6:
+ putc(last | 8, out);
+ last = 0;
+ case 4:
+ putc(last | 0x20, out);
+ last = 0;
+ case 2:
+ putc(last | 0x80, out);
+ putc(0, out);
+ }
+ }
+ }
+
+ /* update crc and tot */
+ *crc = crc32_combine(*crc, bget4(in), len);
+ *tot += (unsigned long)len;
+
+ /* clean up */
+ inflateEnd(&strm);
+ free(junk);
+ bclose(in);
+
+ /* write trailer if this is the last gzip file */
+ if (!clr) {
+ put4(*crc, out);
+ put4(*tot, out);
+ }
+}
+
+/* join the gzip files on the command line, write result to stdout */
+int main(int argc, char **argv)
+{
+ unsigned long crc, tot; /* running crc and total uncompressed length */
+
+ /* skip command name */
+ argc--;
+ argv++;
+
+ /* show usage if no arguments */
+ if (argc == 0) {
+ fputs("gzjoin usage: gzjoin f1.gz [f2.gz [f3.gz ...]] > fjoin.gz\n",
+ stderr);
+ return 0;
+ }
+
+ /* join gzip files on command line and write to stdout */
+ gzinit(&crc, &tot, stdout);
+ while (argc--)
+ gzcopy(*argv++, argc, &crc, &tot, stdout);
+
+ /* done */
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.c
new file mode 100644
index 000000000..b8c29274e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.c
@@ -0,0 +1,1059 @@
+/*
+ * gzlog.c
+ * Copyright (C) 2004, 2008, 2012, 2016 Mark Adler, all rights reserved
+ * For conditions of distribution and use, see copyright notice in gzlog.h
+ * version 2.2, 14 Aug 2012
+ */
+
+/*
+ gzlog provides a mechanism for frequently appending short strings to a gzip
+ file that is efficient both in execution time and compression ratio. The
+ strategy is to write the short strings in an uncompressed form to the end of
+ the gzip file, only compressing when the amount of uncompressed data has
+ reached a given threshold.
+
+ gzlog also provides protection against interruptions in the process due to
+ system crashes. The status of the operation is recorded in an extra field
+ in the gzip file, and is only updated once the gzip file is brought to a
+ valid state. The last data to be appended or compressed is saved in an
+ auxiliary file, so that if the operation is interrupted, it can be completed
+ the next time an append operation is attempted.
+
+ gzlog maintains another auxiliary file with the last 32K of data from the
+ compressed portion, which is preloaded for the compression of the subsequent
+ data. This minimizes the impact to the compression ratio of appending.
+ */
+
+/*
+ Operations Concept:
+
+ Files (log name "foo"):
+ foo.gz -- gzip file with the complete log
+ foo.add -- last message to append or last data to compress
+ foo.dict -- dictionary of the last 32K of data for next compression
+ foo.temp -- temporary dictionary file for compression after this one
+ foo.lock -- lock file for reading and writing the other files
+ foo.repairs -- log file for log file recovery operations (not compressed)
+
+ gzip file structure:
+ - fixed-length (no file name) header with extra field (see below)
+ - compressed data ending initially with empty stored block
+ - uncompressed data filling out originally empty stored block and
+ subsequent stored blocks as needed (16K max each)
+ - gzip trailer
+ - no junk at end (no other gzip streams)
+
+ When appending data, the information in the first three items above plus the
+ foo.add file are sufficient to recover an interrupted append operation. The
+ extra field has the necessary information to restore the start of the last
+ stored block and determine where to append the data in the foo.add file, as
+ well as the crc and length of the gzip data before the append operation.
+
+ The foo.add file is created before the gzip file is marked for append, and
+ deleted after the gzip file is marked as complete. So if the append
+ operation is interrupted, the data to add will still be there. If due to
+ some external force, the foo.add file gets deleted between when the append
+ operation was interrupted and when recovery is attempted, the gzip file will
+ still be restored, but without the appended data.
+
+ When compressing data, the information in the first two items above plus the
+ foo.add file are sufficient to recover an interrupted compress operation.
+ The extra field has the necessary information to find the end of the
+ compressed data, and contains both the crc and length of just the compressed
+ data and of the complete set of data including the contents of the foo.add
+ file.
+
+ Again, the foo.add file is maintained during the compress operation in case
+ of an interruption. If in the unlikely event the foo.add file with the data
+ to be compressed is missing due to some external force, a gzip file with
+ just the previous compressed data will be reconstructed. In this case, all
+ of the data that was to be compressed is lost (approximately one megabyte).
+ This will not occur if all that happened was an interruption of the compress
+ operation.
+
+ The third state that is marked is the replacement of the old dictionary with
+ the new dictionary after a compress operation. Once compression is
+ complete, the gzip file is marked as being in the replace state. This
+ completes the gzip file, so an interrupt after being so marked does not
+ result in recompression. Then the dictionary file is replaced, and the gzip
+ file is marked as completed. This state prevents the possibility of
+ restarting compression with the wrong dictionary file.
+
+ All three operations are wrapped by a lock/unlock procedure. In order to
+ gain exclusive access to the log files, first a foo.lock file must be
+ exclusively created. When all operations are complete, the lock is
+ released by deleting the foo.lock file. If when attempting to create the
+ lock file, it already exists and the modify time of the lock file is more
+ than five minutes old (set by the PATIENCE define below), then the old
+ lock file is considered stale and deleted, and the exclusive creation of
+ the lock file is retried. To assure that there are no false assessments
+ of the staleness of the lock file, the operations periodically touch the
+ lock file to update the modified date.
+
+ Following is the definition of the extra field with all of the information
+ required to enable the above append and compress operations and their
+ recovery if interrupted. Multi-byte values are stored little endian
+ (consistent with the gzip format). File pointers are eight bytes long.
+ The crc's and lengths for the gzip trailer are four bytes long. (Note that
+ the length at the end of a gzip file is used for error checking only, and
+ for large files is actually the length modulo 2^32.) The stored block
+ length is two bytes long. The gzip extra field two-byte identification is
+ "ap" for append. It is assumed that writing the extra field to the file is
+ an "atomic" operation. That is, either all of the extra field is written
+ to the file, or none of it is, if the operation is interrupted right at the
+ point of updating the extra field. This is a reasonable assumption, since
+ the extra field is within the first 52 bytes of the file, which is smaller
+ than any expected block size for a mass storage device (usually 512 bytes or
+ larger).
+
+ Extra field (35 bytes):
+ - Pointer to first stored block length -- this points to the two-byte length
+ of the first stored block, which is followed by the two-byte, one's
+ complement of that length. The stored block length is preceded by the
+ three-bit header of the stored block, which is the actual start of the
+ stored block in the deflate format. See the bit offset field below.
+ - Pointer to the last stored block length. This is the same as above, but
+ for the last stored block of the uncompressed data in the gzip file.
+ Initially this is the same as the first stored block length pointer.
+ When the stored block gets to 16K (see the MAX_STORE define), then a new
+ stored block as added, at which point the last stored block length pointer
+ is different from the first stored block length pointer. When they are
+ different, the first bit of the last stored block header is eight bits, or
+ one byte back from the block length.
+ - Compressed data crc and length. This is the crc and length of the data
+ that is in the compressed portion of the deflate stream. These are used
+ only in the event that the foo.add file containing the data to compress is
+ lost after a compress operation is interrupted.
+ - Total data crc and length. This is the crc and length of all of the data
+ stored in the gzip file, compressed and uncompressed. It is used to
+ reconstruct the gzip trailer when compressing, as well as when recovering
+ interrupted operations.
+ - Final stored block length. This is used to quickly find where to append,
+ and allows the restoration of the original final stored block state when
+ an append operation is interrupted.
+ - First stored block start as the number of bits back from the final stored
+ block first length byte. This value is in the range of 3..10, and is
+ stored as the low three bits of the final byte of the extra field after
+ subtracting three (0..7). This allows the last-block bit of the stored
+ block header to be updated when a new stored block is added, for the case
+ when the first stored block and the last stored block are the same. (When
+ they are different, the numbers of bits back is known to be eight.) This
+ also allows for new compressed data to be appended to the old compressed
+ data in the compress operation, overwriting the previous first stored
+ block, or for the compressed data to be terminated and a valid gzip file
+ reconstructed on the off chance that a compression operation was
+ interrupted and the data to compress in the foo.add file was deleted.
+ - The operation in process. This is the next two bits in the last byte (the
+ bits under the mask 0x18). The are interpreted as 0: nothing in process,
+ 1: append in process, 2: compress in process, 3: replace in process.
+ - The top three bits of the last byte in the extra field are reserved and
+ are currently set to zero.
+
+ Main procedure:
+ - Exclusively create the foo.lock file using the O_CREAT and O_EXCL modes of
+ the system open() call. If the modify time of an existing lock file is
+ more than PATIENCE seconds old, then the lock file is deleted and the
+ exclusive create is retried.
+ - Load the extra field from the foo.gz file, and see if an operation was in
+ progress but not completed. If so, apply the recovery procedure below.
+ - Perform the append procedure with the provided data.
+ - If the uncompressed data in the foo.gz file is 1MB or more, apply the
+ compress procedure.
+ - Delete the foo.lock file.
+
+ Append procedure:
+ - Put what to append in the foo.add file so that the operation can be
+ restarted if this procedure is interrupted.
+ - Mark the foo.gz extra field with the append operation in progress.
+ + Restore the original last-block bit and stored block length of the last
+ stored block from the information in the extra field, in case a previous
+ append operation was interrupted.
+ - Append the provided data to the last stored block, creating new stored
+ blocks as needed and updating the stored blocks last-block bits and
+ lengths.
+ - Update the crc and length with the new data, and write the gzip trailer.
+ - Write over the extra field (with a single write operation) with the new
+ pointers, lengths, and crc's, and mark the gzip file as not in process.
+ Though there is still a foo.add file, it will be ignored since nothing
+ is in process. If a foo.add file is leftover from a previously
+ completed operation, it is truncated when writing new data to it.
+ - Delete the foo.add file.
+
+ Compress and replace procedures:
+ - Read all of the uncompressed data in the stored blocks in foo.gz and write
+ it to foo.add. Also write foo.temp with the last 32K of that data to
+ provide a dictionary for the next invocation of this procedure.
+ - Rewrite the extra field marking foo.gz with a compression in process.
+ * If there is no data provided to compress (due to a missing foo.add file
+ when recovering), reconstruct and truncate the foo.gz file to contain
+ only the previous compressed data and proceed to the step after the next
+ one. Otherwise ...
+ - Compress the data with the dictionary in foo.dict, and write to the
+ foo.gz file starting at the bit immediately following the last previously
+ compressed block. If there is no foo.dict, proceed anyway with the
+ compression at slightly reduced efficiency. (For the foo.dict file to be
+ missing requires some external failure beyond simply the interruption of
+ a compress operation.) During this process, the foo.lock file is
+ periodically touched to assure that that file is not considered stale by
+ another process before we're done. The deflation is terminated with a
+ non-last empty static block (10 bits long), that is then located and
+ written over by a last-bit-set empty stored block.
+ - Append the crc and length of the data in the gzip file (previously
+ calculated during the append operations).
+ - Write over the extra field with the updated stored block offsets, bits
+ back, crc's, and lengths, and mark foo.gz as in process for a replacement
+ of the dictionary.
+ @ Delete the foo.add file.
+ - Replace foo.dict with foo.temp.
+ - Write over the extra field, marking foo.gz as complete.
+
+ Recovery procedure:
+ - If not a replace recovery, read in the foo.add file, and provide that data
+ to the appropriate recovery below. If there is no foo.add file, provide
+ a zero data length to the recovery. In that case, the append recovery
+ restores the foo.gz to the previous compressed + uncompressed data state.
+ For the the compress recovery, a missing foo.add file results in foo.gz
+ being restored to the previous compressed-only data state.
+ - Append recovery:
+ - Pick up append at + step above
+ - Compress recovery:
+ - Pick up compress at * step above
+ - Replace recovery:
+ - Pick up compress at @ step above
+ - Log the repair with a date stamp in foo.repairs
+ */
+
+#include <sys/types.h>
+#include <stdio.h> /* rename, fopen, fprintf, fclose */
+#include <stdlib.h> /* malloc, free */
+#include <string.h> /* strlen, strrchr, strcpy, strncpy, strcmp */
+#include <fcntl.h> /* open */
+#include <unistd.h> /* lseek, read, write, close, unlink, sleep, */
+ /* ftruncate, fsync */
+#include <errno.h> /* errno */
+#include <time.h> /* time, ctime */
+#include <sys/stat.h> /* stat */
+#include <sys/time.h> /* utimes */
+#include "zlib.h" /* crc32 */
+
+#include "gzlog.h" /* header for external access */
+
+#define local static
+typedef unsigned int uint;
+typedef unsigned long ulong;
+
+/* Macro for debugging to deterministically force recovery operations */
+#ifdef GZLOG_DEBUG
+ #include <setjmp.h> /* longjmp */
+ jmp_buf gzlog_jump; /* where to go back to */
+ int gzlog_bail = 0; /* which point to bail at (1..8) */
+ int gzlog_count = -1; /* number of times through to wait */
+# define BAIL(n) do { if (n == gzlog_bail && gzlog_count-- == 0) \
+ longjmp(gzlog_jump, gzlog_bail); } while (0)
+#else
+# define BAIL(n)
+#endif
+
+/* how old the lock file can be in seconds before considering it stale */
+#define PATIENCE 300
+
+/* maximum stored block size in Kbytes -- must be in 1..63 */
+#define MAX_STORE 16
+
+/* number of stored Kbytes to trigger compression (must be >= 32 to allow
+ dictionary construction, and <= 204 * MAX_STORE, in order for >> 10 to
+ discard the stored block headers contribution of five bytes each) */
+#define TRIGGER 1024
+
+/* size of a deflate dictionary (this cannot be changed) */
+#define DICT 32768U
+
+/* values for the operation (2 bits) */
+#define NO_OP 0
+#define APPEND_OP 1
+#define COMPRESS_OP 2
+#define REPLACE_OP 3
+
+/* macros to extract little-endian integers from an unsigned byte buffer */
+#define PULL2(p) ((p)[0]+((uint)((p)[1])<<8))
+#define PULL4(p) (PULL2(p)+((ulong)PULL2(p+2)<<16))
+#define PULL8(p) (PULL4(p)+((off_t)PULL4(p+4)<<32))
+
+/* macros to store integers into a byte buffer in little-endian order */
+#define PUT2(p,a) do {(p)[0]=a;(p)[1]=(a)>>8;} while(0)
+#define PUT4(p,a) do {PUT2(p,a);PUT2(p+2,a>>16);} while(0)
+#define PUT8(p,a) do {PUT4(p,a);PUT4(p+4,a>>32);} while(0)
+
+/* internal structure for log information */
+#define LOGID "\106\035\172" /* should be three non-zero characters */
+struct log {
+ char id[4]; /* contains LOGID to detect inadvertent overwrites */
+ int fd; /* file descriptor for .gz file, opened read/write */
+ char *path; /* allocated path, e.g. "/var/log/foo" or "foo" */
+ char *end; /* end of path, for appending suffices such as ".gz" */
+ off_t first; /* offset of first stored block first length byte */
+ int back; /* location of first block id in bits back from first */
+ uint stored; /* bytes currently in last stored block */
+ off_t last; /* offset of last stored block first length byte */
+ ulong ccrc; /* crc of compressed data */
+ ulong clen; /* length (modulo 2^32) of compressed data */
+ ulong tcrc; /* crc of total data */
+ ulong tlen; /* length (modulo 2^32) of total data */
+ time_t lock; /* last modify time of our lock file */
+};
+
+/* gzip header for gzlog */
+local unsigned char log_gzhead[] = {
+ 0x1f, 0x8b, /* magic gzip id */
+ 8, /* compression method is deflate */
+ 4, /* there is an extra field (no file name) */
+ 0, 0, 0, 0, /* no modification time provided */
+ 0, 0xff, /* no extra flags, no OS specified */
+ 39, 0, 'a', 'p', 35, 0 /* extra field with "ap" subfield */
+ /* 35 is EXTRA, 39 is EXTRA + 4 */
+};
+
+#define HEAD sizeof(log_gzhead) /* should be 16 */
+
+/* initial gzip extra field content (52 == HEAD + EXTRA + 1) */
+local unsigned char log_gzext[] = {
+ 52, 0, 0, 0, 0, 0, 0, 0, /* offset of first stored block length */
+ 52, 0, 0, 0, 0, 0, 0, 0, /* offset of last stored block length */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* compressed data crc and length */
+ 0, 0, 0, 0, 0, 0, 0, 0, /* total data crc and length */
+ 0, 0, /* final stored block data length */
+ 5 /* op is NO_OP, last bit 8 bits back */
+};
+
+#define EXTRA sizeof(log_gzext) /* should be 35 */
+
+/* initial gzip data and trailer */
+local unsigned char log_gzbody[] = {
+ 1, 0, 0, 0xff, 0xff, /* empty stored block (last) */
+ 0, 0, 0, 0, /* crc */
+ 0, 0, 0, 0 /* uncompressed length */
+};
+
+#define BODY sizeof(log_gzbody)
+
+/* Exclusively create foo.lock in order to negotiate exclusive access to the
+ foo.* files. If the modify time of an existing lock file is greater than
+ PATIENCE seconds in the past, then consider the lock file to have been
+ abandoned, delete it, and try the exclusive create again. Save the lock
+ file modify time for verification of ownership. Return 0 on success, or -1
+ on failure, usually due to an access restriction or invalid path. Note that
+ if stat() or unlink() fails, it may be due to another process noticing the
+ abandoned lock file a smidge sooner and deleting it, so those are not
+ flagged as an error. */
+local int log_lock(struct log *log)
+{
+ int fd;
+ struct stat st;
+
+ strcpy(log->end, ".lock");
+ while ((fd = open(log->path, O_CREAT | O_EXCL, 0644)) < 0) {
+ if (errno != EEXIST)
+ return -1;
+ if (stat(log->path, &st) == 0 && time(NULL) - st.st_mtime > PATIENCE) {
+ unlink(log->path);
+ continue;
+ }
+ sleep(2); /* relinquish the CPU for two seconds while waiting */
+ }
+ close(fd);
+ if (stat(log->path, &st) == 0)
+ log->lock = st.st_mtime;
+ return 0;
+}
+
+/* Update the modify time of the lock file to now, in order to prevent another
+ task from thinking that the lock is stale. Save the lock file modify time
+ for verification of ownership. */
+local void log_touch(struct log *log)
+{
+ struct stat st;
+
+ strcpy(log->end, ".lock");
+ utimes(log->path, NULL);
+ if (stat(log->path, &st) == 0)
+ log->lock = st.st_mtime;
+}
+
+/* Check the log file modify time against what is expected. Return true if
+ this is not our lock. If it is our lock, touch it to keep it. */
+local int log_check(struct log *log)
+{
+ struct stat st;
+
+ strcpy(log->end, ".lock");
+ if (stat(log->path, &st) || st.st_mtime != log->lock)
+ return 1;
+ log_touch(log);
+ return 0;
+}
+
+/* Unlock a previously acquired lock, but only if it's ours. */
+local void log_unlock(struct log *log)
+{
+ if (log_check(log))
+ return;
+ strcpy(log->end, ".lock");
+ unlink(log->path);
+ log->lock = 0;
+}
+
+/* Check the gzip header and read in the extra field, filling in the values in
+ the log structure. Return op on success or -1 if the gzip header was not as
+ expected. op is the current operation in progress last written to the extra
+ field. This assumes that the gzip file has already been opened, with the
+ file descriptor log->fd. */
+local int log_head(struct log *log)
+{
+ int op;
+ unsigned char buf[HEAD + EXTRA];
+
+ if (lseek(log->fd, 0, SEEK_SET) < 0 ||
+ read(log->fd, buf, HEAD + EXTRA) != HEAD + EXTRA ||
+ memcmp(buf, log_gzhead, HEAD)) {
+ return -1;
+ }
+ log->first = PULL8(buf + HEAD);
+ log->last = PULL8(buf + HEAD + 8);
+ log->ccrc = PULL4(buf + HEAD + 16);
+ log->clen = PULL4(buf + HEAD + 20);
+ log->tcrc = PULL4(buf + HEAD + 24);
+ log->tlen = PULL4(buf + HEAD + 28);
+ log->stored = PULL2(buf + HEAD + 32);
+ log->back = 3 + (buf[HEAD + 34] & 7);
+ op = (buf[HEAD + 34] >> 3) & 3;
+ return op;
+}
+
+/* Write over the extra field contents, marking the operation as op. Use fsync
+ to assure that the device is written to, and in the requested order. This
+ operation, and only this operation, is assumed to be atomic in order to
+ assure that the log is recoverable in the event of an interruption at any
+ point in the process. Return -1 if the write to foo.gz failed. */
+local int log_mark(struct log *log, int op)
+{
+ int ret;
+ unsigned char ext[EXTRA];
+
+ PUT8(ext, log->first);
+ PUT8(ext + 8, log->last);
+ PUT4(ext + 16, log->ccrc);
+ PUT4(ext + 20, log->clen);
+ PUT4(ext + 24, log->tcrc);
+ PUT4(ext + 28, log->tlen);
+ PUT2(ext + 32, log->stored);
+ ext[34] = log->back - 3 + (op << 3);
+ fsync(log->fd);
+ ret = lseek(log->fd, HEAD, SEEK_SET) < 0 ||
+ write(log->fd, ext, EXTRA) != EXTRA ? -1 : 0;
+ fsync(log->fd);
+ return ret;
+}
+
+/* Rewrite the last block header bits and subsequent zero bits to get to a byte
+ boundary, setting the last block bit if last is true, and then write the
+ remainder of the stored block header (length and one's complement). Leave
+ the file pointer after the end of the last stored block data. Return -1 if
+ there is a read or write failure on the foo.gz file */
+local int log_last(struct log *log, int last)
+{
+ int back, len, mask;
+ unsigned char buf[6];
+
+ /* determine the locations of the bytes and bits to modify */
+ back = log->last == log->first ? log->back : 8;
+ len = back > 8 ? 2 : 1; /* bytes back from log->last */
+ mask = 0x80 >> ((back - 1) & 7); /* mask for block last-bit */
+
+ /* get the byte to modify (one or two back) into buf[0] -- don't need to
+ read the byte if the last-bit is eight bits back, since in that case
+ the entire byte will be modified */
+ buf[0] = 0;
+ if (back != 8 && (lseek(log->fd, log->last - len, SEEK_SET) < 0 ||
+ read(log->fd, buf, 1) != 1))
+ return -1;
+
+ /* change the last-bit of the last stored block as requested -- note
+ that all bits above the last-bit are set to zero, per the type bits
+ of a stored block being 00 and per the convention that the bits to
+ bring the stream to a byte boundary are also zeros */
+ buf[1] = 0;
+ buf[2 - len] = (*buf & (mask - 1)) + (last ? mask : 0);
+
+ /* write the modified stored block header and lengths, move the file
+ pointer to after the last stored block data */
+ PUT2(buf + 2, log->stored);
+ PUT2(buf + 4, log->stored ^ 0xffff);
+ return lseek(log->fd, log->last - len, SEEK_SET) < 0 ||
+ write(log->fd, buf + 2 - len, len + 4) != len + 4 ||
+ lseek(log->fd, log->stored, SEEK_CUR) < 0 ? -1 : 0;
+}
+
+/* Append len bytes from data to the locked and open log file. len may be zero
+ if recovering and no .add file was found. In that case, the previous state
+ of the foo.gz file is restored. The data is appended uncompressed in
+ deflate stored blocks. Return -1 if there was an error reading or writing
+ the foo.gz file. */
+local int log_append(struct log *log, unsigned char *data, size_t len)
+{
+ uint put;
+ off_t end;
+ unsigned char buf[8];
+
+ /* set the last block last-bit and length, in case recovering an
+ interrupted append, then position the file pointer to append to the
+ block */
+ if (log_last(log, 1))
+ return -1;
+
+ /* append, adding stored blocks and updating the offset of the last stored
+ block as needed, and update the total crc and length */
+ while (len) {
+ /* append as much as we can to the last block */
+ put = (MAX_STORE << 10) - log->stored;
+ if (put > len)
+ put = (uint)len;
+ if (put) {
+ if (write(log->fd, data, put) != put)
+ return -1;
+ BAIL(1);
+ log->tcrc = crc32(log->tcrc, data, put);
+ log->tlen += put;
+ log->stored += put;
+ data += put;
+ len -= put;
+ }
+
+ /* if we need to, add a new empty stored block */
+ if (len) {
+ /* mark current block as not last */
+ if (log_last(log, 0))
+ return -1;
+
+ /* point to new, empty stored block */
+ log->last += 4 + log->stored + 1;
+ log->stored = 0;
+ }
+
+ /* mark last block as last, update its length */
+ if (log_last(log, 1))
+ return -1;
+ BAIL(2);
+ }
+
+ /* write the new crc and length trailer, and truncate just in case (could
+ be recovering from partial append with a missing foo.add file) */
+ PUT4(buf, log->tcrc);
+ PUT4(buf + 4, log->tlen);
+ if (write(log->fd, buf, 8) != 8 ||
+ (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end))
+ return -1;
+
+ /* write the extra field, marking the log file as done, delete .add file */
+ if (log_mark(log, NO_OP))
+ return -1;
+ strcpy(log->end, ".add");
+ unlink(log->path); /* ignore error, since may not exist */
+ return 0;
+}
+
+/* Replace the foo.dict file with the foo.temp file. Also delete the foo.add
+ file, since the compress operation may have been interrupted before that was
+ done. Returns 1 if memory could not be allocated, or -1 if reading or
+ writing foo.gz fails, or if the rename fails for some reason other than
+ foo.temp not existing. foo.temp not existing is a permitted error, since
+ the replace operation may have been interrupted after the rename is done,
+ but before foo.gz is marked as complete. */
+local int log_replace(struct log *log)
+{
+ int ret;
+ char *dest;
+
+ /* delete foo.add file */
+ strcpy(log->end, ".add");
+ unlink(log->path); /* ignore error, since may not exist */
+ BAIL(3);
+
+ /* rename foo.name to foo.dict, replacing foo.dict if it exists */
+ strcpy(log->end, ".dict");
+ dest = malloc(strlen(log->path) + 1);
+ if (dest == NULL)
+ return -2;
+ strcpy(dest, log->path);
+ strcpy(log->end, ".temp");
+ ret = rename(log->path, dest);
+ free(dest);
+ if (ret && errno != ENOENT)
+ return -1;
+ BAIL(4);
+
+ /* mark the foo.gz file as done */
+ return log_mark(log, NO_OP);
+}
+
+/* Compress the len bytes at data and append the compressed data to the
+ foo.gz deflate data immediately after the previous compressed data. This
+ overwrites the previous uncompressed data, which was stored in foo.add
+ and is the data provided in data[0..len-1]. If this operation is
+ interrupted, it picks up at the start of this routine, with the foo.add
+ file read in again. If there is no data to compress (len == 0), then we
+ simply terminate the foo.gz file after the previously compressed data,
+ appending a final empty stored block and the gzip trailer. Return -1 if
+ reading or writing the log.gz file failed, or -2 if there was a memory
+ allocation failure. */
+local int log_compress(struct log *log, unsigned char *data, size_t len)
+{
+ int fd;
+ uint got, max;
+ ssize_t dict;
+ off_t end;
+ z_stream strm;
+ unsigned char buf[DICT];
+
+ /* compress and append compressed data */
+ if (len) {
+ /* set up for deflate, allocating memory */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ if (deflateInit2(&strm, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -15, 8,
+ Z_DEFAULT_STRATEGY) != Z_OK)
+ return -2;
+
+ /* read in dictionary (last 32K of data that was compressed) */
+ strcpy(log->end, ".dict");
+ fd = open(log->path, O_RDONLY, 0);
+ if (fd >= 0) {
+ dict = read(fd, buf, DICT);
+ close(fd);
+ if (dict < 0) {
+ deflateEnd(&strm);
+ return -1;
+ }
+ if (dict)
+ deflateSetDictionary(&strm, buf, (uint)dict);
+ }
+ log_touch(log);
+
+ /* prime deflate with last bits of previous block, position write
+ pointer to write those bits and overwrite what follows */
+ if (lseek(log->fd, log->first - (log->back > 8 ? 2 : 1),
+ SEEK_SET) < 0 ||
+ read(log->fd, buf, 1) != 1 || lseek(log->fd, -1, SEEK_CUR) < 0) {
+ deflateEnd(&strm);
+ return -1;
+ }
+ deflatePrime(&strm, (8 - log->back) & 7, *buf);
+
+ /* compress, finishing with a partial non-last empty static block */
+ strm.next_in = data;
+ max = (((uint)0 - 1) >> 1) + 1; /* in case int smaller than size_t */
+ do {
+ strm.avail_in = len > max ? max : (uint)len;
+ len -= strm.avail_in;
+ do {
+ strm.avail_out = DICT;
+ strm.next_out = buf;
+ deflate(&strm, len ? Z_NO_FLUSH : Z_PARTIAL_FLUSH);
+ got = DICT - strm.avail_out;
+ if (got && write(log->fd, buf, got) != got) {
+ deflateEnd(&strm);
+ return -1;
+ }
+ log_touch(log);
+ } while (strm.avail_out == 0);
+ } while (len);
+ deflateEnd(&strm);
+ BAIL(5);
+
+ /* find start of empty static block -- scanning backwards the first one
+ bit is the second bit of the block, if the last byte is zero, then
+ we know the byte before that has a one in the top bit, since an
+ empty static block is ten bits long */
+ if ((log->first = lseek(log->fd, -1, SEEK_CUR)) < 0 ||
+ read(log->fd, buf, 1) != 1)
+ return -1;
+ log->first++;
+ if (*buf) {
+ log->back = 1;
+ while ((*buf & ((uint)1 << (8 - log->back++))) == 0)
+ ; /* guaranteed to terminate, since *buf != 0 */
+ }
+ else
+ log->back = 10;
+
+ /* update compressed crc and length */
+ log->ccrc = log->tcrc;
+ log->clen = log->tlen;
+ }
+ else {
+ /* no data to compress -- fix up existing gzip stream */
+ log->tcrc = log->ccrc;
+ log->tlen = log->clen;
+ }
+
+ /* complete and truncate gzip stream */
+ log->last = log->first;
+ log->stored = 0;
+ PUT4(buf, log->tcrc);
+ PUT4(buf + 4, log->tlen);
+ if (log_last(log, 1) || write(log->fd, buf, 8) != 8 ||
+ (end = lseek(log->fd, 0, SEEK_CUR)) < 0 || ftruncate(log->fd, end))
+ return -1;
+ BAIL(6);
+
+ /* mark as being in the replace operation */
+ if (log_mark(log, REPLACE_OP))
+ return -1;
+
+ /* execute the replace operation and mark the file as done */
+ return log_replace(log);
+}
+
+/* log a repair record to the .repairs file */
+local void log_log(struct log *log, int op, char *record)
+{
+ time_t now;
+ FILE *rec;
+
+ now = time(NULL);
+ strcpy(log->end, ".repairs");
+ rec = fopen(log->path, "a");
+ if (rec == NULL)
+ return;
+ fprintf(rec, "%.24s %s recovery: %s\n", ctime(&now), op == APPEND_OP ?
+ "append" : (op == COMPRESS_OP ? "compress" : "replace"), record);
+ fclose(rec);
+ return;
+}
+
+/* Recover the interrupted operation op. First read foo.add for recovering an
+ append or compress operation. Return -1 if there was an error reading or
+ writing foo.gz or reading an existing foo.add, or -2 if there was a memory
+ allocation failure. */
+local int log_recover(struct log *log, int op)
+{
+ int fd, ret = 0;
+ unsigned char *data = NULL;
+ size_t len = 0;
+ struct stat st;
+
+ /* log recovery */
+ log_log(log, op, "start");
+
+ /* load foo.add file if expected and present */
+ if (op == APPEND_OP || op == COMPRESS_OP) {
+ strcpy(log->end, ".add");
+ if (stat(log->path, &st) == 0 && st.st_size) {
+ len = (size_t)(st.st_size);
+ if ((off_t)len != st.st_size ||
+ (data = malloc(st.st_size)) == NULL) {
+ log_log(log, op, "allocation failure");
+ return -2;
+ }
+ if ((fd = open(log->path, O_RDONLY, 0)) < 0) {
+ log_log(log, op, ".add file read failure");
+ return -1;
+ }
+ ret = (size_t)read(fd, data, len) != len;
+ close(fd);
+ if (ret) {
+ log_log(log, op, ".add file read failure");
+ return -1;
+ }
+ log_log(log, op, "loaded .add file");
+ }
+ else
+ log_log(log, op, "missing .add file!");
+ }
+
+ /* recover the interrupted operation */
+ switch (op) {
+ case APPEND_OP:
+ ret = log_append(log, data, len);
+ break;
+ case COMPRESS_OP:
+ ret = log_compress(log, data, len);
+ break;
+ case REPLACE_OP:
+ ret = log_replace(log);
+ }
+
+ /* log status */
+ log_log(log, op, ret ? "failure" : "complete");
+
+ /* clean up */
+ if (data != NULL)
+ free(data);
+ return ret;
+}
+
+/* Close the foo.gz file (if open) and release the lock. */
+local void log_close(struct log *log)
+{
+ if (log->fd >= 0)
+ close(log->fd);
+ log->fd = -1;
+ log_unlock(log);
+}
+
+/* Open foo.gz, verify the header, and load the extra field contents, after
+ first creating the foo.lock file to gain exclusive access to the foo.*
+ files. If foo.gz does not exist or is empty, then write the initial header,
+ extra, and body content of an empty foo.gz log file. If there is an error
+ creating the lock file due to access restrictions, or an error reading or
+ writing the foo.gz file, or if the foo.gz file is not a proper log file for
+ this object (e.g. not a gzip file or does not contain the expected extra
+ field), then return true. If there is an error, the lock is released.
+ Otherwise, the lock is left in place. */
+local int log_open(struct log *log)
+{
+ int op;
+
+ /* release open file resource if left over -- can occur if lock lost
+ between gzlog_open() and gzlog_write() */
+ if (log->fd >= 0)
+ close(log->fd);
+ log->fd = -1;
+
+ /* negotiate exclusive access */
+ if (log_lock(log) < 0)
+ return -1;
+
+ /* open the log file, foo.gz */
+ strcpy(log->end, ".gz");
+ log->fd = open(log->path, O_RDWR | O_CREAT, 0644);
+ if (log->fd < 0) {
+ log_close(log);
+ return -1;
+ }
+
+ /* if new, initialize foo.gz with an empty log, delete old dictionary */
+ if (lseek(log->fd, 0, SEEK_END) == 0) {
+ if (write(log->fd, log_gzhead, HEAD) != HEAD ||
+ write(log->fd, log_gzext, EXTRA) != EXTRA ||
+ write(log->fd, log_gzbody, BODY) != BODY) {
+ log_close(log);
+ return -1;
+ }
+ strcpy(log->end, ".dict");
+ unlink(log->path);
+ }
+
+ /* verify log file and load extra field information */
+ if ((op = log_head(log)) < 0) {
+ log_close(log);
+ return -1;
+ }
+
+ /* check for interrupted process and if so, recover */
+ if (op != NO_OP && log_recover(log, op)) {
+ log_close(log);
+ return -1;
+ }
+
+ /* touch the lock file to prevent another process from grabbing it */
+ log_touch(log);
+ return 0;
+}
+
+/* See gzlog.h for the description of the external methods below */
+gzlog *gzlog_open(char *path)
+{
+ size_t n;
+ struct log *log;
+
+ /* check arguments */
+ if (path == NULL || *path == 0)
+ return NULL;
+
+ /* allocate and initialize log structure */
+ log = malloc(sizeof(struct log));
+ if (log == NULL)
+ return NULL;
+ strcpy(log->id, LOGID);
+ log->fd = -1;
+
+ /* save path and end of path for name construction */
+ n = strlen(path);
+ log->path = malloc(n + 9); /* allow for ".repairs" */
+ if (log->path == NULL) {
+ free(log);
+ return NULL;
+ }
+ strcpy(log->path, path);
+ log->end = log->path + n;
+
+ /* gain exclusive access and verify log file -- may perform a
+ recovery operation if needed */
+ if (log_open(log)) {
+ free(log->path);
+ free(log);
+ return NULL;
+ }
+
+ /* return pointer to log structure */
+ return log;
+}
+
+/* gzlog_compress() return values:
+ 0: all good
+ -1: file i/o error (usually access issue)
+ -2: memory allocation failure
+ -3: invalid log pointer argument */
+int gzlog_compress(gzlog *logd)
+{
+ int fd, ret;
+ uint block;
+ size_t len, next;
+ unsigned char *data, buf[5];
+ struct log *log = logd;
+
+ /* check arguments */
+ if (log == NULL || strcmp(log->id, LOGID))
+ return -3;
+
+ /* see if we lost the lock -- if so get it again and reload the extra
+ field information (it probably changed), recover last operation if
+ necessary */
+ if (log_check(log) && log_open(log))
+ return -1;
+
+ /* create space for uncompressed data */
+ len = ((size_t)(log->last - log->first) & ~(((size_t)1 << 10) - 1)) +
+ log->stored;
+ if ((data = malloc(len)) == NULL)
+ return -2;
+
+ /* do statement here is just a cheap trick for error handling */
+ do {
+ /* read in the uncompressed data */
+ if (lseek(log->fd, log->first - 1, SEEK_SET) < 0)
+ break;
+ next = 0;
+ while (next < len) {
+ if (read(log->fd, buf, 5) != 5)
+ break;
+ block = PULL2(buf + 1);
+ if (next + block > len ||
+ read(log->fd, (char *)data + next, block) != block)
+ break;
+ next += block;
+ }
+ if (lseek(log->fd, 0, SEEK_CUR) != log->last + 4 + log->stored)
+ break;
+ log_touch(log);
+
+ /* write the uncompressed data to the .add file */
+ strcpy(log->end, ".add");
+ fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (fd < 0)
+ break;
+ ret = (size_t)write(fd, data, len) != len;
+ if (ret | close(fd))
+ break;
+ log_touch(log);
+
+ /* write the dictionary for the next compress to the .temp file */
+ strcpy(log->end, ".temp");
+ fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (fd < 0)
+ break;
+ next = DICT > len ? len : DICT;
+ ret = (size_t)write(fd, (char *)data + len - next, next) != next;
+ if (ret | close(fd))
+ break;
+ log_touch(log);
+
+ /* roll back to compressed data, mark the compress in progress */
+ log->last = log->first;
+ log->stored = 0;
+ if (log_mark(log, COMPRESS_OP))
+ break;
+ BAIL(7);
+
+ /* compress and append the data (clears mark) */
+ ret = log_compress(log, data, len);
+ free(data);
+ return ret;
+ } while (0);
+
+ /* broke out of do above on i/o error */
+ free(data);
+ return -1;
+}
+
+/* gzlog_write() return values:
+ 0: all good
+ -1: file i/o error (usually access issue)
+ -2: memory allocation failure
+ -3: invalid log pointer argument */
+int gzlog_write(gzlog *logd, void *data, size_t len)
+{
+ int fd, ret;
+ struct log *log = logd;
+
+ /* check arguments */
+ if (log == NULL || strcmp(log->id, LOGID))
+ return -3;
+ if (data == NULL || len <= 0)
+ return 0;
+
+ /* see if we lost the lock -- if so get it again and reload the extra
+ field information (it probably changed), recover last operation if
+ necessary */
+ if (log_check(log) && log_open(log))
+ return -1;
+
+ /* create and write .add file */
+ strcpy(log->end, ".add");
+ fd = open(log->path, O_WRONLY | O_CREAT | O_TRUNC, 0644);
+ if (fd < 0)
+ return -1;
+ ret = (size_t)write(fd, data, len) != len;
+ if (ret | close(fd))
+ return -1;
+ log_touch(log);
+
+ /* mark log file with append in progress */
+ if (log_mark(log, APPEND_OP))
+ return -1;
+ BAIL(8);
+
+ /* append data (clears mark) */
+ if (log_append(log, data, len))
+ return -1;
+
+ /* check to see if it's time to compress -- if not, then done */
+ if (((log->last - log->first) >> 10) + (log->stored >> 10) < TRIGGER)
+ return 0;
+
+ /* time to compress */
+ return gzlog_compress(log);
+}
+
+/* gzlog_close() return values:
+ 0: ok
+ -3: invalid log pointer argument */
+int gzlog_close(gzlog *logd)
+{
+ struct log *log = logd;
+
+ /* check arguments */
+ if (log == NULL || strcmp(log->id, LOGID))
+ return -3;
+
+ /* close the log file and release the lock */
+ log_close(log);
+
+ /* free structure and return */
+ if (log->path != NULL)
+ free(log->path);
+ strcpy(log->id, "bad");
+ free(log);
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.h
new file mode 100644
index 000000000..86f0cecba
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/gzlog.h
@@ -0,0 +1,91 @@
+/* gzlog.h
+ Copyright (C) 2004, 2008, 2012 Mark Adler, all rights reserved
+ version 2.2, 14 Aug 2012
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the author be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Mark Adler madler@alumni.caltech.edu
+ */
+
+/* Version History:
+ 1.0 26 Nov 2004 First version
+ 2.0 25 Apr 2008 Complete redesign for recovery of interrupted operations
+ Interface changed slightly in that now path is a prefix
+ Compression now occurs as needed during gzlog_write()
+ gzlog_write() now always leaves the log file as valid gzip
+ 2.1 8 Jul 2012 Fix argument checks in gzlog_compress() and gzlog_write()
+ 2.2 14 Aug 2012 Clean up signed comparisons
+ */
+
+/*
+ The gzlog object allows writing short messages to a gzipped log file,
+ opening the log file locked for small bursts, and then closing it. The log
+ object works by appending stored (uncompressed) data to the gzip file until
+ 1 MB has been accumulated. At that time, the stored data is compressed, and
+ replaces the uncompressed data in the file. The log file is truncated to
+ its new size at that time. After each write operation, the log file is a
+ valid gzip file that can decompressed to recover what was written.
+
+ The gzlog operations can be interupted at any point due to an application or
+ system crash, and the log file will be recovered the next time the log is
+ opened with gzlog_open().
+ */
+
+#ifndef GZLOG_H
+#define GZLOG_H
+
+/* gzlog object type */
+typedef void gzlog;
+
+/* Open a gzlog object, creating the log file if it does not exist. Return
+ NULL on error. Note that gzlog_open() could take a while to complete if it
+ has to wait to verify that a lock is stale (possibly for five minutes), or
+ if there is significant contention with other instantiations of this object
+ when locking the resource. path is the prefix of the file names created by
+ this object. If path is "foo", then the log file will be "foo.gz", and
+ other auxiliary files will be created and destroyed during the process:
+ "foo.dict" for a compression dictionary, "foo.temp" for a temporary (next)
+ dictionary, "foo.add" for data being added or compressed, "foo.lock" for the
+ lock file, and "foo.repairs" to log recovery operations performed due to
+ interrupted gzlog operations. A gzlog_open() followed by a gzlog_close()
+ will recover a previously interrupted operation, if any. */
+gzlog *gzlog_open(char *path);
+
+/* Write to a gzlog object. Return zero on success, -1 if there is a file i/o
+ error on any of the gzlog files (this should not happen if gzlog_open()
+ succeeded, unless the device has run out of space or leftover auxiliary
+ files have permissions or ownership that prevent their use), -2 if there is
+ a memory allocation failure, or -3 if the log argument is invalid (e.g. if
+ it was not created by gzlog_open()). This function will write data to the
+ file uncompressed, until 1 MB has been accumulated, at which time that data
+ will be compressed. The log file will be a valid gzip file upon successful
+ return. */
+int gzlog_write(gzlog *log, void *data, size_t len);
+
+/* Force compression of any uncompressed data in the log. This should be used
+ sparingly, if at all. The main application would be when a log file will
+ not be appended to again. If this is used to compress frequently while
+ appending, it will both significantly increase the execution time and
+ reduce the compression ratio. The return codes are the same as for
+ gzlog_write(). */
+int gzlog_compress(gzlog *log);
+
+/* Close a gzlog object. Return zero on success, -3 if the log argument is
+ invalid. The log object is freed, and so cannot be referenced again. */
+int gzlog_close(gzlog *log);
+
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zlib_how.html b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zlib_how.html
new file mode 100644
index 000000000..444ff1c9a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zlib_how.html
@@ -0,0 +1,545 @@
+<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
+ "http://www.w3.org/TR/REC-html40/loose.dtd">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
+<title>zlib Usage Example</title>
+<!-- Copyright (c) 2004, 2005 Mark Adler. -->
+</head>
+<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#00A000">
+<h2 align="center"> zlib Usage Example </h2>
+We often get questions about how the <tt>deflate()</tt> and <tt>inflate()</tt> functions should be used.
+Users wonder when they should provide more input, when they should use more output,
+what to do with a <tt>Z_BUF_ERROR</tt>, how to make sure the process terminates properly, and
+so on. So for those who have read <tt>zlib.h</tt> (a few times), and
+would like further edification, below is an annotated example in C of simple routines to compress and decompress
+from an input file to an output file using <tt>deflate()</tt> and <tt>inflate()</tt> respectively. The
+annotations are interspersed between lines of the code. So please read between the lines.
+We hope this helps explain some of the intricacies of <em>zlib</em>.
+<p>
+Without further adieu, here is the program <a href="zpipe.c"><tt>zpipe.c</tt></a>:
+<pre><b>
+/* zpipe.c: example of proper use of zlib's inflate() and deflate()
+ Not copyrighted -- provided to the public domain
+ Version 1.4 11 December 2005 Mark Adler */
+
+/* Version history:
+ 1.0 30 Oct 2004 First version
+ 1.1 8 Nov 2004 Add void casting for unused return values
+ Use switch statement for inflate() return values
+ 1.2 9 Nov 2004 Add assertions to document zlib guarantees
+ 1.3 6 Apr 2005 Remove incorrect assertion in inf()
+ 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions
+ Avoid some compiler warnings for input and output buffers
+ */
+</b></pre><!-- -->
+We now include the header files for the required definitions. From
+<tt>stdio.h</tt> we use <tt>fopen()</tt>, <tt>fread()</tt>, <tt>fwrite()</tt>,
+<tt>feof()</tt>, <tt>ferror()</tt>, and <tt>fclose()</tt> for file i/o, and
+<tt>fputs()</tt> for error messages. From <tt>string.h</tt> we use
+<tt>strcmp()</tt> for command line argument processing.
+From <tt>assert.h</tt> we use the <tt>assert()</tt> macro.
+From <tt>zlib.h</tt>
+we use the basic compression functions <tt>deflateInit()</tt>,
+<tt>deflate()</tt>, and <tt>deflateEnd()</tt>, and the basic decompression
+functions <tt>inflateInit()</tt>, <tt>inflate()</tt>, and
+<tt>inflateEnd()</tt>.
+<pre><b>
+#include &lt;stdio.h&gt;
+#include &lt;string.h&gt;
+#include &lt;assert.h&gt;
+#include "zlib.h"
+</b></pre><!-- -->
+This is an ugly hack required to avoid corruption of the input and output data on
+Windows/MS-DOS systems. Without this, those systems would assume that the input and output
+files are text, and try to convert the end-of-line characters from one standard to
+another. That would corrupt binary data, and in particular would render the compressed data unusable.
+This sets the input and output to binary which suppresses the end-of-line conversions.
+<tt>SET_BINARY_MODE()</tt> will be used later on <tt>stdin</tt> and <tt>stdout</tt>, at the beginning of <tt>main()</tt>.
+<pre><b>
+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
+# include &lt;fcntl.h&gt;
+# include &lt;io.h&gt;
+# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+</b></pre><!-- -->
+<tt>CHUNK</tt> is simply the buffer size for feeding data to and pulling data
+from the <em>zlib</em> routines. Larger buffer sizes would be more efficient,
+especially for <tt>inflate()</tt>. If the memory is available, buffers sizes
+on the order of 128K or 256K bytes should be used.
+<pre><b>
+#define CHUNK 16384
+</b></pre><!-- -->
+The <tt>def()</tt> routine compresses data from an input file to an output file. The output data
+will be in the <em>zlib</em> format, which is different from the <em>gzip</em> or <em>zip</em>
+formats. The <em>zlib</em> format has a very small header of only two bytes to identify it as
+a <em>zlib</em> stream and to provide decoding information, and a four-byte trailer with a fast
+check value to verify the integrity of the uncompressed data after decoding.
+<pre><b>
+/* Compress from file source to file dest until EOF on source.
+ def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+ allocated for processing, Z_STREAM_ERROR if an invalid compression
+ level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
+ version of the library linked do not match, or Z_ERRNO if there is
+ an error reading or writing the files. */
+int def(FILE *source, FILE *dest, int level)
+{
+</b></pre>
+Here are the local variables for <tt>def()</tt>. <tt>ret</tt> will be used for <em>zlib</em>
+return codes. <tt>flush</tt> will keep track of the current flushing state for <tt>deflate()</tt>,
+which is either no flushing, or flush to completion after the end of the input file is reached.
+<tt>have</tt> is the amount of data returned from <tt>deflate()</tt>. The <tt>strm</tt> structure
+is used to pass information to and from the <em>zlib</em> routines, and to maintain the
+<tt>deflate()</tt> state. <tt>in</tt> and <tt>out</tt> are the input and output buffers for
+<tt>deflate()</tt>.
+<pre><b>
+ int ret, flush;
+ unsigned have;
+ z_stream strm;
+ unsigned char in[CHUNK];
+ unsigned char out[CHUNK];
+</b></pre><!-- -->
+The first thing we do is to initialize the <em>zlib</em> state for compression using
+<tt>deflateInit()</tt>. This must be done before the first use of <tt>deflate()</tt>.
+The <tt>zalloc</tt>, <tt>zfree</tt>, and <tt>opaque</tt> fields in the <tt>strm</tt>
+structure must be initialized before calling <tt>deflateInit()</tt>. Here they are
+set to the <em>zlib</em> constant <tt>Z_NULL</tt> to request that <em>zlib</em> use
+the default memory allocation routines. An application may also choose to provide
+custom memory allocation routines here. <tt>deflateInit()</tt> will allocate on the
+order of 256K bytes for the internal state.
+(See <a href="zlib_tech.html"><em>zlib Technical Details</em></a>.)
+<p>
+<tt>deflateInit()</tt> is called with a pointer to the structure to be initialized and
+the compression level, which is an integer in the range of -1 to 9. Lower compression
+levels result in faster execution, but less compression. Higher levels result in
+greater compression, but slower execution. The <em>zlib</em> constant Z_DEFAULT_COMPRESSION,
+equal to -1,
+provides a good compromise between compression and speed and is equivalent to level 6.
+Level 0 actually does no compression at all, and in fact expands the data slightly to produce
+the <em>zlib</em> format (it is not a byte-for-byte copy of the input).
+More advanced applications of <em>zlib</em>
+may use <tt>deflateInit2()</tt> here instead. Such an application may want to reduce how
+much memory will be used, at some price in compression. Or it may need to request a
+<em>gzip</em> header and trailer instead of a <em>zlib</em> header and trailer, or raw
+encoding with no header or trailer at all.
+<p>
+We must check the return value of <tt>deflateInit()</tt> against the <em>zlib</em> constant
+<tt>Z_OK</tt> to make sure that it was able to
+allocate memory for the internal state, and that the provided arguments were valid.
+<tt>deflateInit()</tt> will also check that the version of <em>zlib</em> that the <tt>zlib.h</tt>
+file came from matches the version of <em>zlib</em> actually linked with the program. This
+is especially important for environments in which <em>zlib</em> is a shared library.
+<p>
+Note that an application can initialize multiple, independent <em>zlib</em> streams, which can
+operate in parallel. The state information maintained in the structure allows the <em>zlib</em>
+routines to be reentrant.
+<pre><b>
+ /* allocate deflate state */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ ret = deflateInit(&amp;strm, level);
+ if (ret != Z_OK)
+ return ret;
+</b></pre><!-- -->
+With the pleasantries out of the way, now we can get down to business. The outer <tt>do</tt>-loop
+reads all of the input file and exits at the bottom of the loop once end-of-file is reached.
+This loop contains the only call of <tt>deflate()</tt>. So we must make sure that all of the
+input data has been processed and that all of the output data has been generated and consumed
+before we fall out of the loop at the bottom.
+<pre><b>
+ /* compress until end of file */
+ do {
+</b></pre>
+We start off by reading data from the input file. The number of bytes read is put directly
+into <tt>avail_in</tt>, and a pointer to those bytes is put into <tt>next_in</tt>. We also
+check to see if end-of-file on the input has been reached. If we are at the end of file, then <tt>flush</tt> is set to the
+<em>zlib</em> constant <tt>Z_FINISH</tt>, which is later passed to <tt>deflate()</tt> to
+indicate that this is the last chunk of input data to compress. We need to use <tt>feof()</tt>
+to check for end-of-file as opposed to seeing if fewer than <tt>CHUNK</tt> bytes have been read. The
+reason is that if the input file length is an exact multiple of <tt>CHUNK</tt>, we will miss
+the fact that we got to the end-of-file, and not know to tell <tt>deflate()</tt> to finish
+up the compressed stream. If we are not yet at the end of the input, then the <em>zlib</em>
+constant <tt>Z_NO_FLUSH</tt> will be passed to <tt>deflate</tt> to indicate that we are still
+in the middle of the uncompressed data.
+<p>
+If there is an error in reading from the input file, the process is aborted with
+<tt>deflateEnd()</tt> being called to free the allocated <em>zlib</em> state before returning
+the error. We wouldn't want a memory leak, now would we? <tt>deflateEnd()</tt> can be called
+at any time after the state has been initialized. Once that's done, <tt>deflateInit()</tt> (or
+<tt>deflateInit2()</tt>) would have to be called to start a new compression process. There is
+no point here in checking the <tt>deflateEnd()</tt> return code. The deallocation can't fail.
+<pre><b>
+ strm.avail_in = fread(in, 1, CHUNK, source);
+ if (ferror(source)) {
+ (void)deflateEnd(&amp;strm);
+ return Z_ERRNO;
+ }
+ flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
+ strm.next_in = in;
+</b></pre><!-- -->
+The inner <tt>do</tt>-loop passes our chunk of input data to <tt>deflate()</tt>, and then
+keeps calling <tt>deflate()</tt> until it is done producing output. Once there is no more
+new output, <tt>deflate()</tt> is guaranteed to have consumed all of the input, i.e.,
+<tt>avail_in</tt> will be zero.
+<pre><b>
+ /* run deflate() on input until output buffer not full, finish
+ compression if all of source has been read in */
+ do {
+</b></pre>
+Output space is provided to <tt>deflate()</tt> by setting <tt>avail_out</tt> to the number
+of available output bytes and <tt>next_out</tt> to a pointer to that space.
+<pre><b>
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+</b></pre>
+Now we call the compression engine itself, <tt>deflate()</tt>. It takes as many of the
+<tt>avail_in</tt> bytes at <tt>next_in</tt> as it can process, and writes as many as
+<tt>avail_out</tt> bytes to <tt>next_out</tt>. Those counters and pointers are then
+updated past the input data consumed and the output data written. It is the amount of
+output space available that may limit how much input is consumed.
+Hence the inner loop to make sure that
+all of the input is consumed by providing more output space each time. Since <tt>avail_in</tt>
+and <tt>next_in</tt> are updated by <tt>deflate()</tt>, we don't have to mess with those
+between <tt>deflate()</tt> calls until it's all used up.
+<p>
+The parameters to <tt>deflate()</tt> are a pointer to the <tt>strm</tt> structure containing
+the input and output information and the internal compression engine state, and a parameter
+indicating whether and how to flush data to the output. Normally <tt>deflate</tt> will consume
+several K bytes of input data before producing any output (except for the header), in order
+to accumulate statistics on the data for optimum compression. It will then put out a burst of
+compressed data, and proceed to consume more input before the next burst. Eventually,
+<tt>deflate()</tt>
+must be told to terminate the stream, complete the compression with provided input data, and
+write out the trailer check value. <tt>deflate()</tt> will continue to compress normally as long
+as the flush parameter is <tt>Z_NO_FLUSH</tt>. Once the <tt>Z_FINISH</tt> parameter is provided,
+<tt>deflate()</tt> will begin to complete the compressed output stream. However depending on how
+much output space is provided, <tt>deflate()</tt> may have to be called several times until it
+has provided the complete compressed stream, even after it has consumed all of the input. The flush
+parameter must continue to be <tt>Z_FINISH</tt> for those subsequent calls.
+<p>
+There are other values of the flush parameter that are used in more advanced applications. You can
+force <tt>deflate()</tt> to produce a burst of output that encodes all of the input data provided
+so far, even if it wouldn't have otherwise, for example to control data latency on a link with
+compressed data. You can also ask that <tt>deflate()</tt> do that as well as erase any history up to
+that point so that what follows can be decompressed independently, for example for random access
+applications. Both requests will degrade compression by an amount depending on how often such
+requests are made.
+<p>
+<tt>deflate()</tt> has a return value that can indicate errors, yet we do not check it here. Why
+not? Well, it turns out that <tt>deflate()</tt> can do no wrong here. Let's go through
+<tt>deflate()</tt>'s return values and dispense with them one by one. The possible values are
+<tt>Z_OK</tt>, <tt>Z_STREAM_END</tt>, <tt>Z_STREAM_ERROR</tt>, or <tt>Z_BUF_ERROR</tt>. <tt>Z_OK</tt>
+is, well, ok. <tt>Z_STREAM_END</tt> is also ok and will be returned for the last call of
+<tt>deflate()</tt>. This is already guaranteed by calling <tt>deflate()</tt> with <tt>Z_FINISH</tt>
+until it has no more output. <tt>Z_STREAM_ERROR</tt> is only possible if the stream is not
+initialized properly, but we did initialize it properly. There is no harm in checking for
+<tt>Z_STREAM_ERROR</tt> here, for example to check for the possibility that some
+other part of the application inadvertently clobbered the memory containing the <em>zlib</em> state.
+<tt>Z_BUF_ERROR</tt> will be explained further below, but
+suffice it to say that this is simply an indication that <tt>deflate()</tt> could not consume
+more input or produce more output. <tt>deflate()</tt> can be called again with more output space
+or more available input, which it will be in this code.
+<pre><b>
+ ret = deflate(&amp;strm, flush); /* no bad return value */
+ assert(ret != Z_STREAM_ERROR); /* state not clobbered */
+</b></pre>
+Now we compute how much output <tt>deflate()</tt> provided on the last call, which is the
+difference between how much space was provided before the call, and how much output space
+is still available after the call. Then that data, if any, is written to the output file.
+We can then reuse the output buffer for the next call of <tt>deflate()</tt>. Again if there
+is a file i/o error, we call <tt>deflateEnd()</tt> before returning to avoid a memory leak.
+<pre><b>
+ have = CHUNK - strm.avail_out;
+ if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+ (void)deflateEnd(&amp;strm);
+ return Z_ERRNO;
+ }
+</b></pre>
+The inner <tt>do</tt>-loop is repeated until the last <tt>deflate()</tt> call fails to fill the
+provided output buffer. Then we know that <tt>deflate()</tt> has done as much as it can with
+the provided input, and that all of that input has been consumed. We can then fall out of this
+loop and reuse the input buffer.
+<p>
+The way we tell that <tt>deflate()</tt> has no more output is by seeing that it did not fill
+the output buffer, leaving <tt>avail_out</tt> greater than zero. However suppose that
+<tt>deflate()</tt> has no more output, but just so happened to exactly fill the output buffer!
+<tt>avail_out</tt> is zero, and we can't tell that <tt>deflate()</tt> has done all it can.
+As far as we know, <tt>deflate()</tt>
+has more output for us. So we call it again. But now <tt>deflate()</tt> produces no output
+at all, and <tt>avail_out</tt> remains unchanged as <tt>CHUNK</tt>. That <tt>deflate()</tt> call
+wasn't able to do anything, either consume input or produce output, and so it returns
+<tt>Z_BUF_ERROR</tt>. (See, I told you I'd cover this later.) However this is not a problem at
+all. Now we finally have the desired indication that <tt>deflate()</tt> is really done,
+and so we drop out of the inner loop to provide more input to <tt>deflate()</tt>.
+<p>
+With <tt>flush</tt> set to <tt>Z_FINISH</tt>, this final set of <tt>deflate()</tt> calls will
+complete the output stream. Once that is done, subsequent calls of <tt>deflate()</tt> would return
+<tt>Z_STREAM_ERROR</tt> if the flush parameter is not <tt>Z_FINISH</tt>, and do no more processing
+until the state is reinitialized.
+<p>
+Some applications of <em>zlib</em> have two loops that call <tt>deflate()</tt>
+instead of the single inner loop we have here. The first loop would call
+without flushing and feed all of the data to <tt>deflate()</tt>. The second loop would call
+<tt>deflate()</tt> with no more
+data and the <tt>Z_FINISH</tt> parameter to complete the process. As you can see from this
+example, that can be avoided by simply keeping track of the current flush state.
+<pre><b>
+ } while (strm.avail_out == 0);
+ assert(strm.avail_in == 0); /* all input will be used */
+</b></pre><!-- -->
+Now we check to see if we have already processed all of the input file. That information was
+saved in the <tt>flush</tt> variable, so we see if that was set to <tt>Z_FINISH</tt>. If so,
+then we're done and we fall out of the outer loop. We're guaranteed to get <tt>Z_STREAM_END</tt>
+from the last <tt>deflate()</tt> call, since we ran it until the last chunk of input was
+consumed and all of the output was generated.
+<pre><b>
+ /* done when last data in file processed */
+ } while (flush != Z_FINISH);
+ assert(ret == Z_STREAM_END); /* stream will be complete */
+</b></pre><!-- -->
+The process is complete, but we still need to deallocate the state to avoid a memory leak
+(or rather more like a memory hemorrhage if you didn't do this). Then
+finally we can return with a happy return value.
+<pre><b>
+ /* clean up and return */
+ (void)deflateEnd(&amp;strm);
+ return Z_OK;
+}
+</b></pre><!-- -->
+Now we do the same thing for decompression in the <tt>inf()</tt> routine. <tt>inf()</tt>
+decompresses what is hopefully a valid <em>zlib</em> stream from the input file and writes the
+uncompressed data to the output file. Much of the discussion above for <tt>def()</tt>
+applies to <tt>inf()</tt> as well, so the discussion here will focus on the differences between
+the two.
+<pre><b>
+/* Decompress from file source to file dest until stream ends or EOF.
+ inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+ allocated for processing, Z_DATA_ERROR if the deflate data is
+ invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
+ the version of the library linked do not match, or Z_ERRNO if there
+ is an error reading or writing the files. */
+int inf(FILE *source, FILE *dest)
+{
+</b></pre>
+The local variables have the same functionality as they do for <tt>def()</tt>. The
+only difference is that there is no <tt>flush</tt> variable, since <tt>inflate()</tt>
+can tell from the <em>zlib</em> stream itself when the stream is complete.
+<pre><b>
+ int ret;
+ unsigned have;
+ z_stream strm;
+ unsigned char in[CHUNK];
+ unsigned char out[CHUNK];
+</b></pre><!-- -->
+The initialization of the state is the same, except that there is no compression level,
+of course, and two more elements of the structure are initialized. <tt>avail_in</tt>
+and <tt>next_in</tt> must be initialized before calling <tt>inflateInit()</tt>. This
+is because the application has the option to provide the start of the zlib stream in
+order for <tt>inflateInit()</tt> to have access to information about the compression
+method to aid in memory allocation. In the current implementation of <em>zlib</em>
+(up through versions 1.2.x), the method-dependent memory allocations are deferred to the first call of
+<tt>inflate()</tt> anyway. However those fields must be initialized since later versions
+of <em>zlib</em> that provide more compression methods may take advantage of this interface.
+In any case, no decompression is performed by <tt>inflateInit()</tt>, so the
+<tt>avail_out</tt> and <tt>next_out</tt> fields do not need to be initialized before calling.
+<p>
+Here <tt>avail_in</tt> is set to zero and <tt>next_in</tt> is set to <tt>Z_NULL</tt> to
+indicate that no input data is being provided.
+<pre><b>
+ /* allocate inflate state */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit(&amp;strm);
+ if (ret != Z_OK)
+ return ret;
+</b></pre><!-- -->
+The outer <tt>do</tt>-loop decompresses input until <tt>inflate()</tt> indicates
+that it has reached the end of the compressed data and has produced all of the uncompressed
+output. This is in contrast to <tt>def()</tt> which processes all of the input file.
+If end-of-file is reached before the compressed data self-terminates, then the compressed
+data is incomplete and an error is returned.
+<pre><b>
+ /* decompress until deflate stream ends or end of file */
+ do {
+</b></pre>
+We read input data and set the <tt>strm</tt> structure accordingly. If we've reached the
+end of the input file, then we leave the outer loop and report an error, since the
+compressed data is incomplete. Note that we may read more data than is eventually consumed
+by <tt>inflate()</tt>, if the input file continues past the <em>zlib</em> stream.
+For applications where <em>zlib</em> streams are embedded in other data, this routine would
+need to be modified to return the unused data, or at least indicate how much of the input
+data was not used, so the application would know where to pick up after the <em>zlib</em> stream.
+<pre><b>
+ strm.avail_in = fread(in, 1, CHUNK, source);
+ if (ferror(source)) {
+ (void)inflateEnd(&amp;strm);
+ return Z_ERRNO;
+ }
+ if (strm.avail_in == 0)
+ break;
+ strm.next_in = in;
+</b></pre><!-- -->
+The inner <tt>do</tt>-loop has the same function it did in <tt>def()</tt>, which is to
+keep calling <tt>inflate()</tt> until has generated all of the output it can with the
+provided input.
+<pre><b>
+ /* run inflate() on input until output buffer not full */
+ do {
+</b></pre>
+Just like in <tt>def()</tt>, the same output space is provided for each call of <tt>inflate()</tt>.
+<pre><b>
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+</b></pre>
+Now we run the decompression engine itself. There is no need to adjust the flush parameter, since
+the <em>zlib</em> format is self-terminating. The main difference here is that there are
+return values that we need to pay attention to. <tt>Z_DATA_ERROR</tt>
+indicates that <tt>inflate()</tt> detected an error in the <em>zlib</em> compressed data format,
+which means that either the data is not a <em>zlib</em> stream to begin with, or that the data was
+corrupted somewhere along the way since it was compressed. The other error to be processed is
+<tt>Z_MEM_ERROR</tt>, which can occur since memory allocation is deferred until <tt>inflate()</tt>
+needs it, unlike <tt>deflate()</tt>, whose memory is allocated at the start by <tt>deflateInit()</tt>.
+<p>
+Advanced applications may use
+<tt>deflateSetDictionary()</tt> to prime <tt>deflate()</tt> with a set of likely data to improve the
+first 32K or so of compression. This is noted in the <em>zlib</em> header, so <tt>inflate()</tt>
+requests that that dictionary be provided before it can start to decompress. Without the dictionary,
+correct decompression is not possible. For this routine, we have no idea what the dictionary is,
+so the <tt>Z_NEED_DICT</tt> indication is converted to a <tt>Z_DATA_ERROR</tt>.
+<p>
+<tt>inflate()</tt> can also return <tt>Z_STREAM_ERROR</tt>, which should not be possible here,
+but could be checked for as noted above for <tt>def()</tt>. <tt>Z_BUF_ERROR</tt> does not need to be
+checked for here, for the same reasons noted for <tt>def()</tt>. <tt>Z_STREAM_END</tt> will be
+checked for later.
+<pre><b>
+ ret = inflate(&amp;strm, Z_NO_FLUSH);
+ assert(ret != Z_STREAM_ERROR); /* state not clobbered */
+ switch (ret) {
+ case Z_NEED_DICT:
+ ret = Z_DATA_ERROR; /* and fall through */
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ (void)inflateEnd(&amp;strm);
+ return ret;
+ }
+</b></pre>
+The output of <tt>inflate()</tt> is handled identically to that of <tt>deflate()</tt>.
+<pre><b>
+ have = CHUNK - strm.avail_out;
+ if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+ (void)inflateEnd(&amp;strm);
+ return Z_ERRNO;
+ }
+</b></pre>
+The inner <tt>do</tt>-loop ends when <tt>inflate()</tt> has no more output as indicated
+by not filling the output buffer, just as for <tt>deflate()</tt>. In this case, we cannot
+assert that <tt>strm.avail_in</tt> will be zero, since the deflate stream may end before the file
+does.
+<pre><b>
+ } while (strm.avail_out == 0);
+</b></pre><!-- -->
+The outer <tt>do</tt>-loop ends when <tt>inflate()</tt> reports that it has reached the
+end of the input <em>zlib</em> stream, has completed the decompression and integrity
+check, and has provided all of the output. This is indicated by the <tt>inflate()</tt>
+return value <tt>Z_STREAM_END</tt>. The inner loop is guaranteed to leave <tt>ret</tt>
+equal to <tt>Z_STREAM_END</tt> if the last chunk of the input file read contained the end
+of the <em>zlib</em> stream. So if the return value is not <tt>Z_STREAM_END</tt>, the
+loop continues to read more input.
+<pre><b>
+ /* done when inflate() says it's done */
+ } while (ret != Z_STREAM_END);
+</b></pre><!-- -->
+At this point, decompression successfully completed, or we broke out of the loop due to no
+more data being available from the input file. If the last <tt>inflate()</tt> return value
+is not <tt>Z_STREAM_END</tt>, then the <em>zlib</em> stream was incomplete and a data error
+is returned. Otherwise, we return with a happy return value. Of course, <tt>inflateEnd()</tt>
+is called first to avoid a memory leak.
+<pre><b>
+ /* clean up and return */
+ (void)inflateEnd(&amp;strm);
+ return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
+}
+</b></pre><!-- -->
+That ends the routines that directly use <em>zlib</em>. The following routines make this
+a command-line program by running data through the above routines from <tt>stdin</tt> to
+<tt>stdout</tt>, and handling any errors reported by <tt>def()</tt> or <tt>inf()</tt>.
+<p>
+<tt>zerr()</tt> is used to interpret the possible error codes from <tt>def()</tt>
+and <tt>inf()</tt>, as detailed in their comments above, and print out an error message.
+Note that these are only a subset of the possible return values from <tt>deflate()</tt>
+and <tt>inflate()</tt>.
+<pre><b>
+/* report a zlib or i/o error */
+void zerr(int ret)
+{
+ fputs("zpipe: ", stderr);
+ switch (ret) {
+ case Z_ERRNO:
+ if (ferror(stdin))
+ fputs("error reading stdin\n", stderr);
+ if (ferror(stdout))
+ fputs("error writing stdout\n", stderr);
+ break;
+ case Z_STREAM_ERROR:
+ fputs("invalid compression level\n", stderr);
+ break;
+ case Z_DATA_ERROR:
+ fputs("invalid or incomplete deflate data\n", stderr);
+ break;
+ case Z_MEM_ERROR:
+ fputs("out of memory\n", stderr);
+ break;
+ case Z_VERSION_ERROR:
+ fputs("zlib version mismatch!\n", stderr);
+ }
+}
+</b></pre><!-- -->
+Here is the <tt>main()</tt> routine used to test <tt>def()</tt> and <tt>inf()</tt>. The
+<tt>zpipe</tt> command is simply a compression pipe from <tt>stdin</tt> to <tt>stdout</tt>, if
+no arguments are given, or it is a decompression pipe if <tt>zpipe -d</tt> is used. If any other
+arguments are provided, no compression or decompression is performed. Instead a usage
+message is displayed. Examples are <tt>zpipe < foo.txt > foo.txt.z</tt> to compress, and
+<tt>zpipe -d < foo.txt.z > foo.txt</tt> to decompress.
+<pre><b>
+/* compress or decompress from stdin to stdout */
+int main(int argc, char **argv)
+{
+ int ret;
+
+ /* avoid end-of-line conversions */
+ SET_BINARY_MODE(stdin);
+ SET_BINARY_MODE(stdout);
+
+ /* do compression if no arguments */
+ if (argc == 1) {
+ ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
+ if (ret != Z_OK)
+ zerr(ret);
+ return ret;
+ }
+
+ /* do decompression if -d specified */
+ else if (argc == 2 &amp;&amp; strcmp(argv[1], "-d") == 0) {
+ ret = inf(stdin, stdout);
+ if (ret != Z_OK)
+ zerr(ret);
+ return ret;
+ }
+
+ /* otherwise, report usage */
+ else {
+ fputs("zpipe usage: zpipe [-d] &lt; source &gt; dest\n", stderr);
+ return 1;
+ }
+}
+</b></pre>
+<hr>
+<i>Copyright (c) 2004, 2005 by Mark Adler<br>Last modified 11 December 2005</i>
+</body>
+</html>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zpipe.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zpipe.c
new file mode 100644
index 000000000..83535d169
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zpipe.c
@@ -0,0 +1,205 @@
+/* zpipe.c: example of proper use of zlib's inflate() and deflate()
+ Not copyrighted -- provided to the public domain
+ Version 1.4 11 December 2005 Mark Adler */
+
+/* Version history:
+ 1.0 30 Oct 2004 First version
+ 1.1 8 Nov 2004 Add void casting for unused return values
+ Use switch statement for inflate() return values
+ 1.2 9 Nov 2004 Add assertions to document zlib guarantees
+ 1.3 6 Apr 2005 Remove incorrect assertion in inf()
+ 1.4 11 Dec 2005 Add hack to avoid MSDOS end-of-line conversions
+ Avoid some compiler warnings for input and output buffers
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+#include "zlib.h"
+
+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
+# include <fcntl.h>
+# include <io.h>
+# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+
+#define CHUNK 16384
+
+/* Compress from file source to file dest until EOF on source.
+ def() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+ allocated for processing, Z_STREAM_ERROR if an invalid compression
+ level is supplied, Z_VERSION_ERROR if the version of zlib.h and the
+ version of the library linked do not match, or Z_ERRNO if there is
+ an error reading or writing the files. */
+int def(FILE *source, FILE *dest, int level)
+{
+ int ret, flush;
+ unsigned have;
+ z_stream strm;
+ unsigned char in[CHUNK];
+ unsigned char out[CHUNK];
+
+ /* allocate deflate state */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ ret = deflateInit(&strm, level);
+ if (ret != Z_OK)
+ return ret;
+
+ /* compress until end of file */
+ do {
+ strm.avail_in = fread(in, 1, CHUNK, source);
+ if (ferror(source)) {
+ (void)deflateEnd(&strm);
+ return Z_ERRNO;
+ }
+ flush = feof(source) ? Z_FINISH : Z_NO_FLUSH;
+ strm.next_in = in;
+
+ /* run deflate() on input until output buffer not full, finish
+ compression if all of source has been read in */
+ do {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = deflate(&strm, flush); /* no bad return value */
+ assert(ret != Z_STREAM_ERROR); /* state not clobbered */
+ have = CHUNK - strm.avail_out;
+ if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+ (void)deflateEnd(&strm);
+ return Z_ERRNO;
+ }
+ } while (strm.avail_out == 0);
+ assert(strm.avail_in == 0); /* all input will be used */
+
+ /* done when last data in file processed */
+ } while (flush != Z_FINISH);
+ assert(ret == Z_STREAM_END); /* stream will be complete */
+
+ /* clean up and return */
+ (void)deflateEnd(&strm);
+ return Z_OK;
+}
+
+/* Decompress from file source to file dest until stream ends or EOF.
+ inf() returns Z_OK on success, Z_MEM_ERROR if memory could not be
+ allocated for processing, Z_DATA_ERROR if the deflate data is
+ invalid or incomplete, Z_VERSION_ERROR if the version of zlib.h and
+ the version of the library linked do not match, or Z_ERRNO if there
+ is an error reading or writing the files. */
+int inf(FILE *source, FILE *dest)
+{
+ int ret;
+ unsigned have;
+ z_stream strm;
+ unsigned char in[CHUNK];
+ unsigned char out[CHUNK];
+
+ /* allocate inflate state */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit(&strm);
+ if (ret != Z_OK)
+ return ret;
+
+ /* decompress until deflate stream ends or end of file */
+ do {
+ strm.avail_in = fread(in, 1, CHUNK, source);
+ if (ferror(source)) {
+ (void)inflateEnd(&strm);
+ return Z_ERRNO;
+ }
+ if (strm.avail_in == 0)
+ break;
+ strm.next_in = in;
+
+ /* run inflate() on input until output buffer not full */
+ do {
+ strm.avail_out = CHUNK;
+ strm.next_out = out;
+ ret = inflate(&strm, Z_NO_FLUSH);
+ assert(ret != Z_STREAM_ERROR); /* state not clobbered */
+ switch (ret) {
+ case Z_NEED_DICT:
+ ret = Z_DATA_ERROR; /* and fall through */
+ case Z_DATA_ERROR:
+ case Z_MEM_ERROR:
+ (void)inflateEnd(&strm);
+ return ret;
+ }
+ have = CHUNK - strm.avail_out;
+ if (fwrite(out, 1, have, dest) != have || ferror(dest)) {
+ (void)inflateEnd(&strm);
+ return Z_ERRNO;
+ }
+ } while (strm.avail_out == 0);
+
+ /* done when inflate() says it's done */
+ } while (ret != Z_STREAM_END);
+
+ /* clean up and return */
+ (void)inflateEnd(&strm);
+ return ret == Z_STREAM_END ? Z_OK : Z_DATA_ERROR;
+}
+
+/* report a zlib or i/o error */
+void zerr(int ret)
+{
+ fputs("zpipe: ", stderr);
+ switch (ret) {
+ case Z_ERRNO:
+ if (ferror(stdin))
+ fputs("error reading stdin\n", stderr);
+ if (ferror(stdout))
+ fputs("error writing stdout\n", stderr);
+ break;
+ case Z_STREAM_ERROR:
+ fputs("invalid compression level\n", stderr);
+ break;
+ case Z_DATA_ERROR:
+ fputs("invalid or incomplete deflate data\n", stderr);
+ break;
+ case Z_MEM_ERROR:
+ fputs("out of memory\n", stderr);
+ break;
+ case Z_VERSION_ERROR:
+ fputs("zlib version mismatch!\n", stderr);
+ }
+}
+
+/* compress or decompress from stdin to stdout */
+int main(int argc, char **argv)
+{
+ int ret;
+
+ /* avoid end-of-line conversions */
+ SET_BINARY_MODE(stdin);
+ SET_BINARY_MODE(stdout);
+
+ /* do compression if no arguments */
+ if (argc == 1) {
+ ret = def(stdin, stdout, Z_DEFAULT_COMPRESSION);
+ if (ret != Z_OK)
+ zerr(ret);
+ return ret;
+ }
+
+ /* do decompression if -d specified */
+ else if (argc == 2 && strcmp(argv[1], "-d") == 0) {
+ ret = inf(stdin, stdout);
+ if (ret != Z_OK)
+ zerr(ret);
+ return ret;
+ }
+
+ /* otherwise, report usage */
+ else {
+ fputs("zpipe usage: zpipe [-d] < source > dest\n", stderr);
+ return 1;
+ }
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zran.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zran.c
new file mode 100644
index 000000000..4fec6594a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/examples/zran.c
@@ -0,0 +1,409 @@
+/* zran.c -- example of zlib/gzip stream indexing and random access
+ * Copyright (C) 2005, 2012 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ Version 1.1 29 Sep 2012 Mark Adler */
+
+/* Version History:
+ 1.0 29 May 2005 First version
+ 1.1 29 Sep 2012 Fix memory reallocation error
+ */
+
+/* Illustrate the use of Z_BLOCK, inflatePrime(), and inflateSetDictionary()
+ for random access of a compressed file. A file containing a zlib or gzip
+ stream is provided on the command line. The compressed stream is decoded in
+ its entirety, and an index built with access points about every SPAN bytes
+ in the uncompressed output. The compressed file is left open, and can then
+ be read randomly, having to decompress on the average SPAN/2 uncompressed
+ bytes before getting to the desired block of data.
+
+ An access point can be created at the start of any deflate block, by saving
+ the starting file offset and bit of that block, and the 32K bytes of
+ uncompressed data that precede that block. Also the uncompressed offset of
+ that block is saved to provide a referece for locating a desired starting
+ point in the uncompressed stream. build_index() works by decompressing the
+ input zlib or gzip stream a block at a time, and at the end of each block
+ deciding if enough uncompressed data has gone by to justify the creation of
+ a new access point. If so, that point is saved in a data structure that
+ grows as needed to accommodate the points.
+
+ To use the index, an offset in the uncompressed data is provided, for which
+ the latest access point at or preceding that offset is located in the index.
+ The input file is positioned to the specified location in the index, and if
+ necessary the first few bits of the compressed data is read from the file.
+ inflate is initialized with those bits and the 32K of uncompressed data, and
+ the decompression then proceeds until the desired offset in the file is
+ reached. Then the decompression continues to read the desired uncompressed
+ data from the file.
+
+ Another approach would be to generate the index on demand. In that case,
+ requests for random access reads from the compressed data would try to use
+ the index, but if a read far enough past the end of the index is required,
+ then further index entries would be generated and added.
+
+ There is some fair bit of overhead to starting inflation for the random
+ access, mainly copying the 32K byte dictionary. So if small pieces of the
+ file are being accessed, it would make sense to implement a cache to hold
+ some lookahead and avoid many calls to extract() for small lengths.
+
+ Another way to build an index would be to use inflateCopy(). That would
+ not be constrained to have access points at block boundaries, but requires
+ more memory per access point, and also cannot be saved to file due to the
+ use of pointers in the state. The approach here allows for storage of the
+ index in a file.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "zlib.h"
+
+#define local static
+
+#define SPAN 1048576L /* desired distance between access points */
+#define WINSIZE 32768U /* sliding window size */
+#define CHUNK 16384 /* file input buffer size */
+
+/* access point entry */
+struct point {
+ off_t out; /* corresponding offset in uncompressed data */
+ off_t in; /* offset in input file of first full byte */
+ int bits; /* number of bits (1-7) from byte at in - 1, or 0 */
+ unsigned char window[WINSIZE]; /* preceding 32K of uncompressed data */
+};
+
+/* access point list */
+struct access {
+ int have; /* number of list entries filled in */
+ int size; /* number of list entries allocated */
+ struct point *list; /* allocated list */
+};
+
+/* Deallocate an index built by build_index() */
+local void free_index(struct access *index)
+{
+ if (index != NULL) {
+ free(index->list);
+ free(index);
+ }
+}
+
+/* Add an entry to the access point list. If out of memory, deallocate the
+ existing list and return NULL. */
+local struct access *addpoint(struct access *index, int bits,
+ off_t in, off_t out, unsigned left, unsigned char *window)
+{
+ struct point *next;
+
+ /* if list is empty, create it (start with eight points) */
+ if (index == NULL) {
+ index = malloc(sizeof(struct access));
+ if (index == NULL) return NULL;
+ index->list = malloc(sizeof(struct point) << 3);
+ if (index->list == NULL) {
+ free(index);
+ return NULL;
+ }
+ index->size = 8;
+ index->have = 0;
+ }
+
+ /* if list is full, make it bigger */
+ else if (index->have == index->size) {
+ index->size <<= 1;
+ next = realloc(index->list, sizeof(struct point) * index->size);
+ if (next == NULL) {
+ free_index(index);
+ return NULL;
+ }
+ index->list = next;
+ }
+
+ /* fill in entry and increment how many we have */
+ next = index->list + index->have;
+ next->bits = bits;
+ next->in = in;
+ next->out = out;
+ if (left)
+ memcpy(next->window, window + WINSIZE - left, left);
+ if (left < WINSIZE)
+ memcpy(next->window + left, window, WINSIZE - left);
+ index->have++;
+
+ /* return list, possibly reallocated */
+ return index;
+}
+
+/* Make one entire pass through the compressed stream and build an index, with
+ access points about every span bytes of uncompressed output -- span is
+ chosen to balance the speed of random access against the memory requirements
+ of the list, about 32K bytes per access point. Note that data after the end
+ of the first zlib or gzip stream in the file is ignored. build_index()
+ returns the number of access points on success (>= 1), Z_MEM_ERROR for out
+ of memory, Z_DATA_ERROR for an error in the input file, or Z_ERRNO for a
+ file read error. On success, *built points to the resulting index. */
+local int build_index(FILE *in, off_t span, struct access **built)
+{
+ int ret;
+ off_t totin, totout; /* our own total counters to avoid 4GB limit */
+ off_t last; /* totout value of last access point */
+ struct access *index; /* access points being generated */
+ z_stream strm;
+ unsigned char input[CHUNK];
+ unsigned char window[WINSIZE];
+
+ /* initialize inflate */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit2(&strm, 47); /* automatic zlib or gzip decoding */
+ if (ret != Z_OK)
+ return ret;
+
+ /* inflate the input, maintain a sliding window, and build an index -- this
+ also validates the integrity of the compressed data using the check
+ information at the end of the gzip or zlib stream */
+ totin = totout = last = 0;
+ index = NULL; /* will be allocated by first addpoint() */
+ strm.avail_out = 0;
+ do {
+ /* get some compressed data from input file */
+ strm.avail_in = fread(input, 1, CHUNK, in);
+ if (ferror(in)) {
+ ret = Z_ERRNO;
+ goto build_index_error;
+ }
+ if (strm.avail_in == 0) {
+ ret = Z_DATA_ERROR;
+ goto build_index_error;
+ }
+ strm.next_in = input;
+
+ /* process all of that, or until end of stream */
+ do {
+ /* reset sliding window if necessary */
+ if (strm.avail_out == 0) {
+ strm.avail_out = WINSIZE;
+ strm.next_out = window;
+ }
+
+ /* inflate until out of input, output, or at end of block --
+ update the total input and output counters */
+ totin += strm.avail_in;
+ totout += strm.avail_out;
+ ret = inflate(&strm, Z_BLOCK); /* return at end of block */
+ totin -= strm.avail_in;
+ totout -= strm.avail_out;
+ if (ret == Z_NEED_DICT)
+ ret = Z_DATA_ERROR;
+ if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR)
+ goto build_index_error;
+ if (ret == Z_STREAM_END)
+ break;
+
+ /* if at end of block, consider adding an index entry (note that if
+ data_type indicates an end-of-block, then all of the
+ uncompressed data from that block has been delivered, and none
+ of the compressed data after that block has been consumed,
+ except for up to seven bits) -- the totout == 0 provides an
+ entry point after the zlib or gzip header, and assures that the
+ index always has at least one access point; we avoid creating an
+ access point after the last block by checking bit 6 of data_type
+ */
+ if ((strm.data_type & 128) && !(strm.data_type & 64) &&
+ (totout == 0 || totout - last > span)) {
+ index = addpoint(index, strm.data_type & 7, totin,
+ totout, strm.avail_out, window);
+ if (index == NULL) {
+ ret = Z_MEM_ERROR;
+ goto build_index_error;
+ }
+ last = totout;
+ }
+ } while (strm.avail_in != 0);
+ } while (ret != Z_STREAM_END);
+
+ /* clean up and return index (release unused entries in list) */
+ (void)inflateEnd(&strm);
+ index->list = realloc(index->list, sizeof(struct point) * index->have);
+ index->size = index->have;
+ *built = index;
+ return index->size;
+
+ /* return error */
+ build_index_error:
+ (void)inflateEnd(&strm);
+ if (index != NULL)
+ free_index(index);
+ return ret;
+}
+
+/* Use the index to read len bytes from offset into buf, return bytes read or
+ negative for error (Z_DATA_ERROR or Z_MEM_ERROR). If data is requested past
+ the end of the uncompressed data, then extract() will return a value less
+ than len, indicating how much as actually read into buf. This function
+ should not return a data error unless the file was modified since the index
+ was generated. extract() may also return Z_ERRNO if there is an error on
+ reading or seeking the input file. */
+local int extract(FILE *in, struct access *index, off_t offset,
+ unsigned char *buf, int len)
+{
+ int ret, skip;
+ z_stream strm;
+ struct point *here;
+ unsigned char input[CHUNK];
+ unsigned char discard[WINSIZE];
+
+ /* proceed only if something reasonable to do */
+ if (len < 0)
+ return 0;
+
+ /* find where in stream to start */
+ here = index->list;
+ ret = index->have;
+ while (--ret && here[1].out <= offset)
+ here++;
+
+ /* initialize file and inflate state to start there */
+ strm.zalloc = Z_NULL;
+ strm.zfree = Z_NULL;
+ strm.opaque = Z_NULL;
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit2(&strm, -15); /* raw inflate */
+ if (ret != Z_OK)
+ return ret;
+ ret = fseeko(in, here->in - (here->bits ? 1 : 0), SEEK_SET);
+ if (ret == -1)
+ goto extract_ret;
+ if (here->bits) {
+ ret = getc(in);
+ if (ret == -1) {
+ ret = ferror(in) ? Z_ERRNO : Z_DATA_ERROR;
+ goto extract_ret;
+ }
+ (void)inflatePrime(&strm, here->bits, ret >> (8 - here->bits));
+ }
+ (void)inflateSetDictionary(&strm, here->window, WINSIZE);
+
+ /* skip uncompressed bytes until offset reached, then satisfy request */
+ offset -= here->out;
+ strm.avail_in = 0;
+ skip = 1; /* while skipping to offset */
+ do {
+ /* define where to put uncompressed data, and how much */
+ if (offset == 0 && skip) { /* at offset now */
+ strm.avail_out = len;
+ strm.next_out = buf;
+ skip = 0; /* only do this once */
+ }
+ if (offset > WINSIZE) { /* skip WINSIZE bytes */
+ strm.avail_out = WINSIZE;
+ strm.next_out = discard;
+ offset -= WINSIZE;
+ }
+ else if (offset != 0) { /* last skip */
+ strm.avail_out = (unsigned)offset;
+ strm.next_out = discard;
+ offset = 0;
+ }
+
+ /* uncompress until avail_out filled, or end of stream */
+ do {
+ if (strm.avail_in == 0) {
+ strm.avail_in = fread(input, 1, CHUNK, in);
+ if (ferror(in)) {
+ ret = Z_ERRNO;
+ goto extract_ret;
+ }
+ if (strm.avail_in == 0) {
+ ret = Z_DATA_ERROR;
+ goto extract_ret;
+ }
+ strm.next_in = input;
+ }
+ ret = inflate(&strm, Z_NO_FLUSH); /* normal inflate */
+ if (ret == Z_NEED_DICT)
+ ret = Z_DATA_ERROR;
+ if (ret == Z_MEM_ERROR || ret == Z_DATA_ERROR)
+ goto extract_ret;
+ if (ret == Z_STREAM_END)
+ break;
+ } while (strm.avail_out != 0);
+
+ /* if reach end of stream, then don't keep trying to get more */
+ if (ret == Z_STREAM_END)
+ break;
+
+ /* do until offset reached and requested data read, or stream ends */
+ } while (skip);
+
+ /* compute number of uncompressed bytes read after offset */
+ ret = skip ? 0 : len - strm.avail_out;
+
+ /* clean up and return bytes read or error */
+ extract_ret:
+ (void)inflateEnd(&strm);
+ return ret;
+}
+
+/* Demonstrate the use of build_index() and extract() by processing the file
+ provided on the command line, and the extracting 16K from about 2/3rds of
+ the way through the uncompressed output, and writing that to stdout. */
+int main(int argc, char **argv)
+{
+ int len;
+ off_t offset;
+ FILE *in;
+ struct access *index = NULL;
+ unsigned char buf[CHUNK];
+
+ /* open input file */
+ if (argc != 2) {
+ fprintf(stderr, "usage: zran file.gz\n");
+ return 1;
+ }
+ in = fopen(argv[1], "rb");
+ if (in == NULL) {
+ fprintf(stderr, "zran: could not open %s for reading\n", argv[1]);
+ return 1;
+ }
+
+ /* build index */
+ len = build_index(in, SPAN, &index);
+ if (len < 0) {
+ fclose(in);
+ switch (len) {
+ case Z_MEM_ERROR:
+ fprintf(stderr, "zran: out of memory\n");
+ break;
+ case Z_DATA_ERROR:
+ fprintf(stderr, "zran: compressed data error in %s\n", argv[1]);
+ break;
+ case Z_ERRNO:
+ fprintf(stderr, "zran: read error on %s\n", argv[1]);
+ break;
+ default:
+ fprintf(stderr, "zran: error %d while building index\n", len);
+ }
+ return 1;
+ }
+ fprintf(stderr, "zran: built index with %d access points\n", len);
+
+ /* use index by reading some bytes from an arbitrary offset */
+ offset = (index->list[index->have - 1].out << 1) / 3;
+ len = extract(in, index, offset, buf, CHUNK);
+ if (len < 0)
+ fprintf(stderr, "zran: extraction failed: %s error\n",
+ len == Z_MEM_ERROR ? "out of memory" : "input corrupted");
+ else {
+ fwrite(buf, 1, len, stdout);
+ fprintf(stderr, "zran: extracted %d bytes at %llu\n", len, offset);
+ }
+
+ /* clean up and exit */
+ free_index(index);
+ fclose(in);
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/gzclose.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzclose.c
new file mode 100644
index 000000000..caeb99a31
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzclose.c
@@ -0,0 +1,25 @@
+/* gzclose.c -- zlib gzclose() function
+ * Copyright (C) 2004, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* gzclose() is in a separate file so that it is linked in only if it is used.
+ That way the other gzclose functions can be used instead to avoid linking in
+ unneeded compression or decompression routines. */
+int ZEXPORT gzclose(file)
+ gzFile file;
+{
+#ifndef NO_GZCOMPRESS
+ gz_statep state;
+
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+
+ return state->mode == GZ_READ ? gzclose_r(file) : gzclose_w(file);
+#else
+ return gzclose_r(file);
+#endif
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/gzguts.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzguts.h
new file mode 100644
index 000000000..990a4d251
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzguts.h
@@ -0,0 +1,218 @@
+/* gzguts.h -- zlib internal header definitions for gz* operations
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#ifdef _LARGEFILE64_SOURCE
+# ifndef _LARGEFILE_SOURCE
+# define _LARGEFILE_SOURCE 1
+# endif
+# ifdef _FILE_OFFSET_BITS
+# undef _FILE_OFFSET_BITS
+# endif
+#endif
+
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+# define ZLIB_INTERNAL
+#endif
+
+#include <stdio.h>
+#include "zlib.h"
+#ifdef STDC
+# include <string.h>
+# include <stdlib.h>
+# include <limits.h>
+#endif
+
+#ifndef _POSIX_SOURCE
+# define _POSIX_SOURCE
+#endif
+#include <fcntl.h>
+
+#ifdef _WIN32
+# include <stddef.h>
+#endif
+
+#if defined(__TURBOC__) || defined(_MSC_VER) || defined(_WIN32)
+# include <io.h>
+#endif
+
+#if defined(_WIN32) || defined(__CYGWIN__)
+# define WIDECHAR
+#endif
+
+#ifdef WINAPI_FAMILY
+# define open _open
+# define read _read
+# define write _write
+# define close _close
+#endif
+
+#ifdef NO_DEFLATE /* for compatibility with old definition */
+# define NO_GZCOMPRESS
+#endif
+
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(__CYGWIN__)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#if defined(MSDOS) && defined(__BORLANDC__) && (BORLANDC > 0x410)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+
+#ifndef HAVE_VSNPRINTF
+# ifdef MSDOS
+/* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
+ but for now we just assume it doesn't. */
+# define NO_vsnprintf
+# endif
+# ifdef __TURBOC__
+# define NO_vsnprintf
+# endif
+# ifdef WIN32
+/* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
+# if !defined(vsnprintf) && !defined(NO_vsnprintf)
+# if !defined(_MSC_VER) || ( defined(_MSC_VER) && _MSC_VER < 1500 )
+# define vsnprintf _vsnprintf
+# endif
+# endif
+# endif
+# ifdef __SASC
+# define NO_vsnprintf
+# endif
+# ifdef VMS
+# define NO_vsnprintf
+# endif
+# ifdef __OS400__
+# define NO_vsnprintf
+# endif
+# ifdef __MVS__
+# define NO_vsnprintf
+# endif
+#endif
+
+/* unlike snprintf (which is required in C99), _snprintf does not guarantee
+ null termination of the result -- however this is only used in gzlib.c where
+ the result is assured to fit in the space provided */
+#if defined(_MSC_VER) && _MSC_VER < 1900
+# define snprintf _snprintf
+#endif
+
+#ifndef local
+# define local static
+#endif
+/* since "static" is used to mean two completely different things in C, we
+ define "local" for the non-static meaning of "static", for readability
+ (compile with -Dlocal if your debugger can't find static symbols) */
+
+/* gz* functions always use library allocation functions */
+#ifndef STDC
+ extern voidp malloc OF((uInt size));
+ extern void free OF((voidpf ptr));
+#endif
+
+/* get errno and strerror definition */
+#if defined UNDER_CE
+# include <windows.h>
+# define zstrerror() gz_strwinerror((DWORD)GetLastError())
+#else
+# ifndef NO_STRERROR
+# include <errno.h>
+# define zstrerror() strerror(errno)
+# else
+# define zstrerror() "stdio error (consult errno)"
+# endif
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+#endif
+
+/* default memLevel */
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+
+/* default i/o buffer size -- double this for output when reading (this and
+ twice this must be able to fit in an unsigned type) */
+#define GZBUFSIZE 8192
+
+/* gzip modes, also provide a little integrity check on the passed structure */
+#define GZ_NONE 0
+#define GZ_READ 7247
+#define GZ_WRITE 31153
+#define GZ_APPEND 1 /* mode set to GZ_WRITE after the file is opened */
+
+/* values for gz_state how */
+#define LOOK 0 /* look for a gzip header */
+#define COPY 1 /* copy input directly */
+#define GZIP 2 /* decompress a gzip stream */
+
+/* internal gzip file state data structure */
+typedef struct {
+ /* exposed contents for gzgetc() macro */
+ struct gzFile_s x; /* "x" for exposed */
+ /* x.have: number of bytes available at x.next */
+ /* x.next: next output data to deliver or write */
+ /* x.pos: current position in uncompressed data */
+ /* used for both reading and writing */
+ int mode; /* see gzip modes above */
+ int fd; /* file descriptor */
+ char *path; /* path or fd for error messages */
+ unsigned size; /* buffer size, zero if not allocated yet */
+ unsigned want; /* requested buffer size, default is GZBUFSIZE */
+ unsigned char *in; /* input buffer (double-sized when writing) */
+ unsigned char *out; /* output buffer (double-sized when reading) */
+ int direct; /* 0 if processing gzip, 1 if transparent */
+ /* just for reading */
+ int how; /* 0: get header, 1: copy, 2: decompress */
+ z_off64_t start; /* where the gzip data started, for rewinding */
+ int eof; /* true if end of input file reached */
+ int past; /* true if read requested past end */
+ /* just for writing */
+ int level; /* compression level */
+ int strategy; /* compression strategy */
+ /* seek request */
+ z_off64_t skip; /* amount to skip (already rewound if backwards) */
+ int seek; /* true if seek request pending */
+ /* error information */
+ int err; /* error code */
+ char *msg; /* error message */
+ /* zlib inflate or deflate stream */
+ z_stream strm; /* stream structure in-place (not a pointer) */
+} gz_state;
+typedef gz_state FAR *gz_statep;
+
+/* shared functions */
+void ZLIB_INTERNAL gz_error OF((gz_statep, int, const char *));
+#if defined UNDER_CE
+char ZLIB_INTERNAL *gz_strwinerror OF((DWORD error));
+#endif
+
+/* GT_OFF(x), where x is an unsigned value, is true if x > maximum z_off64_t
+ value -- needed when comparing unsigned to z_off64_t, which is signed
+ (possible z_off64_t types off_t, off64_t, and long are all signed) */
+#ifdef INT_MAX
+# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > INT_MAX)
+#else
+unsigned ZLIB_INTERNAL gz_intmax OF((void));
+# define GT_OFF(x) (sizeof(int) == sizeof(z_off64_t) && (x) > gz_intmax())
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/gzlib.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzlib.c
new file mode 100644
index 000000000..4105e6aff
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzlib.c
@@ -0,0 +1,637 @@
+/* gzlib.c -- zlib functions common to reading and writing gzip files
+ * Copyright (C) 2004-2017 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+#if defined(_WIN32) && !defined(__BORLANDC__) && !defined(__MINGW32__)
+# define LSEEK _lseeki64
+#else
+#if defined(_LARGEFILE64_SOURCE) && _LFS64_LARGEFILE-0
+# define LSEEK lseek64
+#else
+# define LSEEK lseek
+#endif
+#endif
+
+/* Local functions */
+local void gz_reset OF((gz_statep));
+local gzFile gz_open OF((const void *, int, const char *));
+
+#if defined UNDER_CE
+
+/* Map the Windows error number in ERROR to a locale-dependent error message
+ string and return a pointer to it. Typically, the values for ERROR come
+ from GetLastError.
+
+ The string pointed to shall not be modified by the application, but may be
+ overwritten by a subsequent call to gz_strwinerror
+
+ The gz_strwinerror function does not change the current setting of
+ GetLastError. */
+char ZLIB_INTERNAL *gz_strwinerror (error)
+ DWORD error;
+{
+ static char buf[1024];
+
+ wchar_t *msgbuf;
+ DWORD lasterr = GetLastError();
+ DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
+ | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+ NULL,
+ error,
+ 0, /* Default language */
+ (LPVOID)&msgbuf,
+ 0,
+ NULL);
+ if (chars != 0) {
+ /* If there is an \r\n appended, zap it. */
+ if (chars >= 2
+ && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
+ chars -= 2;
+ msgbuf[chars] = 0;
+ }
+
+ if (chars > sizeof (buf) - 1) {
+ chars = sizeof (buf) - 1;
+ msgbuf[chars] = 0;
+ }
+
+ wcstombs(buf, msgbuf, chars + 1);
+ LocalFree(msgbuf);
+ }
+ else {
+ sprintf(buf, "unknown win32 error (%ld)", error);
+ }
+
+ SetLastError(lasterr);
+ return buf;
+}
+
+#endif /* UNDER_CE */
+
+/* Reset gzip file state */
+local void gz_reset(state)
+ gz_statep state;
+{
+ state->x.have = 0; /* no output data available */
+ if (state->mode == GZ_READ) { /* for reading ... */
+ state->eof = 0; /* not at end of file */
+ state->past = 0; /* have not read past end yet */
+ state->how = LOOK; /* look for gzip header */
+ }
+ state->seek = 0; /* no seek request pending */
+ gz_error(state, Z_OK, NULL); /* clear error */
+ state->x.pos = 0; /* no uncompressed data yet */
+ state->strm.avail_in = 0; /* no input data yet */
+}
+
+/* Open a gzip file either by name or file descriptor. */
+local gzFile gz_open(path, fd, mode)
+ const void *path;
+ int fd;
+ const char *mode;
+{
+ gz_statep state;
+ z_size_t len;
+ int oflag;
+#ifdef O_CLOEXEC
+ int cloexec = 0;
+#endif
+#ifdef O_EXCL
+ int exclusive = 0;
+#endif
+
+ /* check input */
+ if (path == NULL)
+ return NULL;
+
+ /* allocate gzFile structure to return */
+ state = (gz_statep)malloc(sizeof(gz_state));
+ if (state == NULL)
+ return NULL;
+ state->size = 0; /* no buffers allocated yet */
+ state->want = GZBUFSIZE; /* requested buffer size */
+ state->msg = NULL; /* no error message yet */
+
+ /* interpret mode */
+ state->mode = GZ_NONE;
+ state->level = Z_DEFAULT_COMPRESSION;
+ state->strategy = Z_DEFAULT_STRATEGY;
+ state->direct = 0;
+ while (*mode) {
+ if (*mode >= '0' && *mode <= '9')
+ state->level = *mode - '0';
+ else
+ switch (*mode) {
+ case 'r':
+ state->mode = GZ_READ;
+ break;
+#ifndef NO_GZCOMPRESS
+ case 'w':
+ state->mode = GZ_WRITE;
+ break;
+ case 'a':
+ state->mode = GZ_APPEND;
+ break;
+#endif
+ case '+': /* can't read and write at the same time */
+ free(state);
+ return NULL;
+ case 'b': /* ignore -- will request binary anyway */
+ break;
+#ifdef O_CLOEXEC
+ case 'e':
+ cloexec = 1;
+ break;
+#endif
+#ifdef O_EXCL
+ case 'x':
+ exclusive = 1;
+ break;
+#endif
+ case 'f':
+ state->strategy = Z_FILTERED;
+ break;
+ case 'h':
+ state->strategy = Z_HUFFMAN_ONLY;
+ break;
+ case 'R':
+ state->strategy = Z_RLE;
+ break;
+ case 'F':
+ state->strategy = Z_FIXED;
+ break;
+ case 'T':
+ state->direct = 1;
+ break;
+ default: /* could consider as an error, but just ignore */
+ ;
+ }
+ mode++;
+ }
+
+ /* must provide an "r", "w", or "a" */
+ if (state->mode == GZ_NONE) {
+ free(state);
+ return NULL;
+ }
+
+ /* can't force transparent read */
+ if (state->mode == GZ_READ) {
+ if (state->direct) {
+ free(state);
+ return NULL;
+ }
+ state->direct = 1; /* for empty file */
+ }
+
+ /* save the path name for error messages */
+#ifdef WIDECHAR
+ if (fd == -2) {
+ len = wcstombs(NULL, path, 0);
+ if (len == (z_size_t)-1)
+ len = 0;
+ }
+ else
+#endif
+ len = strlen((const char *)path);
+ state->path = (char *)malloc(len + 1);
+ if (state->path == NULL) {
+ free(state);
+ return NULL;
+ }
+#ifdef WIDECHAR
+ if (fd == -2)
+ if (len)
+ wcstombs(state->path, path, len + 1);
+ else
+ *(state->path) = 0;
+ else
+#endif
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ (void)snprintf(state->path, len + 1, "%s", (const char *)path);
+#else
+ strcpy(state->path, path);
+#endif
+
+ /* compute the flags for open() */
+ oflag =
+#ifdef O_LARGEFILE
+ O_LARGEFILE |
+#endif
+#ifdef O_BINARY
+ O_BINARY |
+#endif
+#ifdef O_CLOEXEC
+ (cloexec ? O_CLOEXEC : 0) |
+#endif
+ (state->mode == GZ_READ ?
+ O_RDONLY :
+ (O_WRONLY | O_CREAT |
+#ifdef O_EXCL
+ (exclusive ? O_EXCL : 0) |
+#endif
+ (state->mode == GZ_WRITE ?
+ O_TRUNC :
+ O_APPEND)));
+
+ /* open the file with the appropriate flags (or just use fd) */
+ state->fd = fd > -1 ? fd : (
+#ifdef WIDECHAR
+ fd == -2 ? _wopen(path, oflag, 0666) :
+#endif
+ open((const char *)path, oflag, 0666));
+ if (state->fd == -1) {
+ free(state->path);
+ free(state);
+ return NULL;
+ }
+ if (state->mode == GZ_APPEND) {
+ LSEEK(state->fd, 0, SEEK_END); /* so gzoffset() is correct */
+ state->mode = GZ_WRITE; /* simplify later checks */
+ }
+
+ /* save the current position for rewinding (only if reading) */
+ if (state->mode == GZ_READ) {
+ state->start = LSEEK(state->fd, 0, SEEK_CUR);
+ if (state->start == -1) state->start = 0;
+ }
+
+ /* initialize stream */
+ gz_reset(state);
+
+ /* return stream */
+ return (gzFile)state;
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzopen(path, mode)
+ const char *path;
+ const char *mode;
+{
+ return gz_open(path, -1, mode);
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzopen64(path, mode)
+ const char *path;
+ const char *mode;
+{
+ return gz_open(path, -1, mode);
+}
+
+/* -- see zlib.h -- */
+gzFile ZEXPORT gzdopen(fd, mode)
+ int fd;
+ const char *mode;
+{
+ char *path; /* identifier for error messages */
+ gzFile gz;
+
+ if (fd == -1 || (path = (char *)malloc(7 + 3 * sizeof(int))) == NULL)
+ return NULL;
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ (void)snprintf(path, 7 + 3 * sizeof(int), "<fd:%d>", fd);
+#else
+ sprintf(path, "<fd:%d>", fd); /* for debugging */
+#endif
+ gz = gz_open(path, fd, mode);
+ free(path);
+ return gz;
+}
+
+/* -- see zlib.h -- */
+#ifdef WIDECHAR
+gzFile ZEXPORT gzopen_w(path, mode)
+ const wchar_t *path;
+ const char *mode;
+{
+ return gz_open(path, -2, mode);
+}
+#endif
+
+/* -- see zlib.h -- */
+int ZEXPORT gzbuffer(file, size)
+ gzFile file;
+ unsigned size;
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* make sure we haven't already allocated memory */
+ if (state->size != 0)
+ return -1;
+
+ /* check and set requested size */
+ if ((size << 1) < size)
+ return -1; /* need to be able to double it */
+ if (size < 2)
+ size = 2; /* need two bytes to check magic header */
+ state->want = size;
+ return 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzrewind(file)
+ gzFile file;
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* back up and start over */
+ if (LSEEK(state->fd, state->start, SEEK_SET) == -1)
+ return -1;
+ gz_reset(state);
+ return 0;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gzseek64(file, offset, whence)
+ gzFile file;
+ z_off64_t offset;
+ int whence;
+{
+ unsigned n;
+ z_off64_t ret;
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* check that there's no error */
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR)
+ return -1;
+
+ /* can only seek from start or relative to current position */
+ if (whence != SEEK_SET && whence != SEEK_CUR)
+ return -1;
+
+ /* normalize offset to a SEEK_CUR specification */
+ if (whence == SEEK_SET)
+ offset -= state->x.pos;
+ else if (state->seek)
+ offset += state->skip;
+ state->seek = 0;
+
+ /* if within raw area while reading, just go there */
+ if (state->mode == GZ_READ && state->how == COPY &&
+ state->x.pos + offset >= 0) {
+ ret = LSEEK(state->fd, offset - state->x.have, SEEK_CUR);
+ if (ret == -1)
+ return -1;
+ state->x.have = 0;
+ state->eof = 0;
+ state->past = 0;
+ state->seek = 0;
+ gz_error(state, Z_OK, NULL);
+ state->strm.avail_in = 0;
+ state->x.pos += offset;
+ return state->x.pos;
+ }
+
+ /* calculate skip amount, rewinding if needed for back seek when reading */
+ if (offset < 0) {
+ if (state->mode != GZ_READ) /* writing -- can't go backwards */
+ return -1;
+ offset += state->x.pos;
+ if (offset < 0) /* before start of file! */
+ return -1;
+ if (gzrewind(file) == -1) /* rewind, then skip to offset */
+ return -1;
+ }
+
+ /* if reading, skip what's in output buffer (one less gzgetc() check) */
+ if (state->mode == GZ_READ) {
+ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > offset ?
+ (unsigned)offset : state->x.have;
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
+ offset -= n;
+ }
+
+ /* request skip (if not zero) */
+ if (offset) {
+ state->seek = 1;
+ state->skip = offset;
+ }
+ return state->x.pos + offset;
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gzseek(file, offset, whence)
+ gzFile file;
+ z_off_t offset;
+ int whence;
+{
+ z_off64_t ret;
+
+ ret = gzseek64(file, (z_off64_t)offset, whence);
+ return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gztell64(file)
+ gzFile file;
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* return position */
+ return state->x.pos + (state->seek ? state->skip : 0);
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gztell(file)
+ gzFile file;
+{
+ z_off64_t ret;
+
+ ret = gztell64(file);
+ return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+z_off64_t ZEXPORT gzoffset64(file)
+ gzFile file;
+{
+ z_off64_t offset;
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return -1;
+
+ /* compute and return effective offset in file */
+ offset = LSEEK(state->fd, 0, SEEK_CUR);
+ if (offset == -1)
+ return -1;
+ if (state->mode == GZ_READ) /* reading */
+ offset -= state->strm.avail_in; /* don't count buffered input */
+ return offset;
+}
+
+/* -- see zlib.h -- */
+z_off_t ZEXPORT gzoffset(file)
+ gzFile file;
+{
+ z_off64_t ret;
+
+ ret = gzoffset64(file);
+ return ret == (z_off_t)ret ? (z_off_t)ret : -1;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzeof(file)
+ gzFile file;
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return 0;
+
+ /* return end-of-file state */
+ return state->mode == GZ_READ ? state->past : 0;
+}
+
+/* -- see zlib.h -- */
+const char * ZEXPORT gzerror(file, errnum)
+ gzFile file;
+ int *errnum;
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return NULL;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return NULL;
+
+ /* return error information */
+ if (errnum != NULL)
+ *errnum = state->err;
+ return state->err == Z_MEM_ERROR ? "out of memory" :
+ (state->msg == NULL ? "" : state->msg);
+}
+
+/* -- see zlib.h -- */
+void ZEXPORT gzclearerr(file)
+ gzFile file;
+{
+ gz_statep state;
+
+ /* get internal structure and check integrity */
+ if (file == NULL)
+ return;
+ state = (gz_statep)file;
+ if (state->mode != GZ_READ && state->mode != GZ_WRITE)
+ return;
+
+ /* clear error and end-of-file */
+ if (state->mode == GZ_READ) {
+ state->eof = 0;
+ state->past = 0;
+ }
+ gz_error(state, Z_OK, NULL);
+}
+
+/* Create an error message in allocated memory and set state->err and
+ state->msg accordingly. Free any previous error message already there. Do
+ not try to free or allocate space if the error is Z_MEM_ERROR (out of
+ memory). Simply save the error message as a static string. If there is an
+ allocation failure constructing the error message, then convert the error to
+ out of memory. */
+void ZLIB_INTERNAL gz_error(state, err, msg)
+ gz_statep state;
+ int err;
+ const char *msg;
+{
+ /* free previously allocated message and clear */
+ if (state->msg != NULL) {
+ if (state->err != Z_MEM_ERROR)
+ free(state->msg);
+ state->msg = NULL;
+ }
+
+ /* if fatal, set state->x.have to 0 so that the gzgetc() macro fails */
+ if (err != Z_OK && err != Z_BUF_ERROR)
+ state->x.have = 0;
+
+ /* set error code, and if no message, then done */
+ state->err = err;
+ if (msg == NULL)
+ return;
+
+ /* for an out of memory error, return literal string when requested */
+ if (err == Z_MEM_ERROR)
+ return;
+
+ /* construct error message with path */
+ if ((state->msg = (char *)malloc(strlen(state->path) + strlen(msg) + 3)) ==
+ NULL) {
+ state->err = Z_MEM_ERROR;
+ return;
+ }
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ (void)snprintf(state->msg, strlen(state->path) + strlen(msg) + 3,
+ "%s%s%s", state->path, ": ", msg);
+#else
+ strcpy(state->msg, state->path);
+ strcat(state->msg, ": ");
+ strcat(state->msg, msg);
+#endif
+}
+
+#ifndef INT_MAX
+/* portably return maximum value for an int (when limits.h presumed not
+ available) -- we need to do this to cover cases where 2's complement not
+ used, since C standard permits 1's complement and sign-bit representations,
+ otherwise we could just use ((unsigned)-1) >> 1 */
+unsigned ZLIB_INTERNAL gz_intmax()
+{
+ unsigned p, q;
+
+ p = 1;
+ do {
+ q = p;
+ p <<= 1;
+ p++;
+ } while (p > q);
+ return q >> 1;
+}
+#endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/gzread.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzread.c
new file mode 100644
index 000000000..956b91ea7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzread.c
@@ -0,0 +1,654 @@
+/* gzread.c -- zlib functions for reading gzip files
+ * Copyright (C) 2004, 2005, 2010, 2011, 2012, 2013, 2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* Local functions */
+local int gz_load OF((gz_statep, unsigned char *, unsigned, unsigned *));
+local int gz_avail OF((gz_statep));
+local int gz_look OF((gz_statep));
+local int gz_decomp OF((gz_statep));
+local int gz_fetch OF((gz_statep));
+local int gz_skip OF((gz_statep, z_off64_t));
+local z_size_t gz_read OF((gz_statep, voidp, z_size_t));
+
+/* Use read() to load a buffer -- return -1 on error, otherwise 0. Read from
+ state->fd, and update state->eof, state->err, and state->msg as appropriate.
+ This function needs to loop on read(), since read() is not guaranteed to
+ read the number of bytes requested, depending on the type of descriptor. */
+local int gz_load(state, buf, len, have)
+ gz_statep state;
+ unsigned char *buf;
+ unsigned len;
+ unsigned *have;
+{
+ int ret;
+ unsigned get, max = ((unsigned)-1 >> 2) + 1;
+
+ *have = 0;
+ do {
+ get = len - *have;
+ if (get > max)
+ get = max;
+ ret = read(state->fd, buf + *have, get);
+ if (ret <= 0)
+ break;
+ *have += (unsigned)ret;
+ } while (*have < len);
+ if (ret < 0) {
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ if (ret == 0)
+ state->eof = 1;
+ return 0;
+}
+
+/* Load up input buffer and set eof flag if last data loaded -- return -1 on
+ error, 0 otherwise. Note that the eof flag is set when the end of the input
+ file is reached, even though there may be unused data in the buffer. Once
+ that data has been used, no more attempts will be made to read the file.
+ If strm->avail_in != 0, then the current data is moved to the beginning of
+ the input buffer, and then the remainder of the buffer is loaded with the
+ available data from the input file. */
+local int gz_avail(state)
+ gz_statep state;
+{
+ unsigned got;
+ z_streamp strm = &(state->strm);
+
+ if (state->err != Z_OK && state->err != Z_BUF_ERROR)
+ return -1;
+ if (state->eof == 0) {
+ if (strm->avail_in) { /* copy what's there to the start */
+ unsigned char *p = state->in;
+ unsigned const char *q = strm->next_in;
+ unsigned n = strm->avail_in;
+ do {
+ *p++ = *q++;
+ } while (--n);
+ }
+ if (gz_load(state, state->in + strm->avail_in,
+ state->size - strm->avail_in, &got) == -1)
+ return -1;
+ strm->avail_in += got;
+ strm->next_in = state->in;
+ }
+ return 0;
+}
+
+/* Look for gzip header, set up for inflate or copy. state->x.have must be 0.
+ If this is the first time in, allocate required memory. state->how will be
+ left unchanged if there is no more input data available, will be set to COPY
+ if there is no gzip header and direct copying will be performed, or it will
+ be set to GZIP for decompression. If direct copying, then leftover input
+ data from the input buffer will be copied to the output buffer. In that
+ case, all further file reads will be directly to either the output buffer or
+ a user buffer. If decompressing, the inflate state will be initialized.
+ gz_look() will return 0 on success or -1 on failure. */
+local int gz_look(state)
+ gz_statep state;
+{
+ z_streamp strm = &(state->strm);
+
+ /* allocate read buffers and inflate memory */
+ if (state->size == 0) {
+ /* allocate buffers */
+ state->in = (unsigned char *)malloc(state->want);
+ state->out = (unsigned char *)malloc(state->want << 1);
+ if (state->in == NULL || state->out == NULL) {
+ free(state->out);
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ state->size = state->want;
+
+ /* allocate inflate memory */
+ state->strm.zalloc = Z_NULL;
+ state->strm.zfree = Z_NULL;
+ state->strm.opaque = Z_NULL;
+ state->strm.avail_in = 0;
+ state->strm.next_in = Z_NULL;
+ if (inflateInit2(&(state->strm), 15 + 16) != Z_OK) { /* gunzip */
+ free(state->out);
+ free(state->in);
+ state->size = 0;
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ }
+
+ /* get at least the magic bytes in the input buffer */
+ if (strm->avail_in < 2) {
+ if (gz_avail(state) == -1)
+ return -1;
+ if (strm->avail_in == 0)
+ return 0;
+ }
+
+ /* look for gzip magic bytes -- if there, do gzip decoding (note: there is
+ a logical dilemma here when considering the case of a partially written
+ gzip file, to wit, if a single 31 byte is written, then we cannot tell
+ whether this is a single-byte file, or just a partially written gzip
+ file -- for here we assume that if a gzip file is being written, then
+ the header will be written in a single operation, so that reading a
+ single byte is sufficient indication that it is not a gzip file) */
+ if (strm->avail_in > 1 &&
+ strm->next_in[0] == 31 && strm->next_in[1] == 139) {
+ inflateReset(strm);
+ state->how = GZIP;
+ state->direct = 0;
+ return 0;
+ }
+
+ /* no gzip header -- if we were decoding gzip before, then this is trailing
+ garbage. Ignore the trailing garbage and finish. */
+ if (state->direct == 0) {
+ strm->avail_in = 0;
+ state->eof = 1;
+ state->x.have = 0;
+ return 0;
+ }
+
+ /* doing raw i/o, copy any leftover input to output -- this assumes that
+ the output buffer is larger than the input buffer, which also assures
+ space for gzungetc() */
+ state->x.next = state->out;
+ if (strm->avail_in) {
+ memcpy(state->x.next, strm->next_in, strm->avail_in);
+ state->x.have = strm->avail_in;
+ strm->avail_in = 0;
+ }
+ state->how = COPY;
+ state->direct = 1;
+ return 0;
+}
+
+/* Decompress from input to the provided next_out and avail_out in the state.
+ On return, state->x.have and state->x.next point to the just decompressed
+ data. If the gzip stream completes, state->how is reset to LOOK to look for
+ the next gzip stream or raw data, once state->x.have is depleted. Returns 0
+ on success, -1 on failure. */
+local int gz_decomp(state)
+ gz_statep state;
+{
+ int ret = Z_OK;
+ unsigned had;
+ z_streamp strm = &(state->strm);
+
+ /* fill output buffer up to end of deflate stream */
+ had = strm->avail_out;
+ do {
+ /* get more input for inflate() */
+ if (strm->avail_in == 0 && gz_avail(state) == -1)
+ return -1;
+ if (strm->avail_in == 0) {
+ gz_error(state, Z_BUF_ERROR, "unexpected end of file");
+ break;
+ }
+
+ /* decompress and handle errors */
+ ret = inflate(strm, Z_NO_FLUSH);
+ if (ret == Z_STREAM_ERROR || ret == Z_NEED_DICT) {
+ gz_error(state, Z_STREAM_ERROR,
+ "internal error: inflate stream corrupt");
+ return -1;
+ }
+ if (ret == Z_MEM_ERROR) {
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ if (ret == Z_DATA_ERROR) { /* deflate stream invalid */
+ gz_error(state, Z_DATA_ERROR,
+ strm->msg == NULL ? "compressed data error" : strm->msg);
+ return -1;
+ }
+ } while (strm->avail_out && ret != Z_STREAM_END);
+
+ /* update available output */
+ state->x.have = had - strm->avail_out;
+ state->x.next = strm->next_out - state->x.have;
+
+ /* if the gzip stream completed successfully, look for another */
+ if (ret == Z_STREAM_END)
+ state->how = LOOK;
+
+ /* good decompression */
+ return 0;
+}
+
+/* Fetch data and put it in the output buffer. Assumes state->x.have is 0.
+ Data is either copied from the input file or decompressed from the input
+ file depending on state->how. If state->how is LOOK, then a gzip header is
+ looked for to determine whether to copy or decompress. Returns -1 on error,
+ otherwise 0. gz_fetch() will leave state->how as COPY or GZIP unless the
+ end of the input file has been reached and all data has been processed. */
+local int gz_fetch(state)
+ gz_statep state;
+{
+ z_streamp strm = &(state->strm);
+
+ do {
+ switch(state->how) {
+ case LOOK: /* -> LOOK, COPY (only if never GZIP), or GZIP */
+ if (gz_look(state) == -1)
+ return -1;
+ if (state->how == LOOK)
+ return 0;
+ break;
+ case COPY: /* -> COPY */
+ if (gz_load(state, state->out, state->size << 1, &(state->x.have))
+ == -1)
+ return -1;
+ state->x.next = state->out;
+ return 0;
+ case GZIP: /* -> GZIP or LOOK (if end of gzip stream) */
+ strm->avail_out = state->size << 1;
+ strm->next_out = state->out;
+ if (gz_decomp(state) == -1)
+ return -1;
+ }
+ } while (state->x.have == 0 && (!state->eof || strm->avail_in));
+ return 0;
+}
+
+/* Skip len uncompressed bytes of output. Return -1 on error, 0 on success. */
+local int gz_skip(state, len)
+ gz_statep state;
+ z_off64_t len;
+{
+ unsigned n;
+
+ /* skip over len bytes or reach end-of-file, whichever comes first */
+ while (len)
+ /* skip over whatever is in output buffer */
+ if (state->x.have) {
+ n = GT_OFF(state->x.have) || (z_off64_t)state->x.have > len ?
+ (unsigned)len : state->x.have;
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
+ len -= n;
+ }
+
+ /* output buffer empty -- return if we're at the end of the input */
+ else if (state->eof && state->strm.avail_in == 0)
+ break;
+
+ /* need more data to skip -- load up output buffer */
+ else {
+ /* get more output, looking for header if required */
+ if (gz_fetch(state) == -1)
+ return -1;
+ }
+ return 0;
+}
+
+/* Read len bytes into buf from file, or less than len up to the end of the
+ input. Return the number of bytes read. If zero is returned, either the
+ end of file was reached, or there was an error. state->err must be
+ consulted in that case to determine which. */
+local z_size_t gz_read(state, buf, len)
+ gz_statep state;
+ voidp buf;
+ z_size_t len;
+{
+ z_size_t got;
+ unsigned n;
+
+ /* if len is zero, avoid unnecessary operations */
+ if (len == 0)
+ return 0;
+
+ /* process a skip request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_skip(state, state->skip) == -1)
+ return 0;
+ }
+
+ /* get len bytes to buf, or less than len if at the end */
+ got = 0;
+ do {
+ /* set n to the maximum amount of len that fits in an unsigned int */
+ n = -1;
+ if (n > len)
+ n = len;
+
+ /* first just try copying data from the output buffer */
+ if (state->x.have) {
+ if (state->x.have < n)
+ n = state->x.have;
+ memcpy(buf, state->x.next, n);
+ state->x.next += n;
+ state->x.have -= n;
+ }
+
+ /* output buffer empty -- return if we're at the end of the input */
+ else if (state->eof && state->strm.avail_in == 0) {
+ state->past = 1; /* tried to read past end */
+ break;
+ }
+
+ /* need output data -- for small len or new stream load up our output
+ buffer */
+ else if (state->how == LOOK || n < (state->size << 1)) {
+ /* get more output, looking for header if required */
+ if (gz_fetch(state) == -1)
+ return 0;
+ continue; /* no progress yet -- go back to copy above */
+ /* the copy above assures that we will leave with space in the
+ output buffer, allowing at least one gzungetc() to succeed */
+ }
+
+ /* large len -- read directly into user buffer */
+ else if (state->how == COPY) { /* read directly */
+ if (gz_load(state, (unsigned char *)buf, n, &n) == -1)
+ return 0;
+ }
+
+ /* large len -- decompress directly into user buffer */
+ else { /* state->how == GZIP */
+ state->strm.avail_out = n;
+ state->strm.next_out = (unsigned char *)buf;
+ if (gz_decomp(state) == -1)
+ return 0;
+ n = state->x.have;
+ state->x.have = 0;
+ }
+
+ /* update progress */
+ len -= n;
+ buf = (char *)buf + n;
+ got += n;
+ state->x.pos += n;
+ } while (len);
+
+ /* return number of bytes read into user buffer */
+ return got;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzread(file, buf, len)
+ gzFile file;
+ voidp buf;
+ unsigned len;
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* since an int is returned, make sure len fits in one, otherwise return
+ with an error (this avoids a flaw in the interface) */
+ if ((int)len < 0) {
+ gz_error(state, Z_STREAM_ERROR, "request does not fit in an int");
+ return -1;
+ }
+
+ /* read len or fewer bytes to buf */
+ len = gz_read(state, buf, len);
+
+ /* check for an error */
+ if (len == 0 && state->err != Z_OK && state->err != Z_BUF_ERROR)
+ return -1;
+
+ /* return the number of bytes read (this is assured to fit in an int) */
+ return (int)len;
+}
+
+/* -- see zlib.h -- */
+z_size_t ZEXPORT gzfread(buf, size, nitems, file)
+ voidp buf;
+ z_size_t size;
+ z_size_t nitems;
+ gzFile file;
+{
+ z_size_t len;
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return 0;
+
+ /* compute bytes to read -- error on overflow */
+ len = nitems * size;
+ if (size && len / size != nitems) {
+ gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t");
+ return 0;
+ }
+
+ /* read len or fewer bytes to buf, return the number of full items read */
+ return len ? gz_read(state, buf, len) / size : 0;
+}
+
+/* -- see zlib.h -- */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+#else
+# undef gzgetc
+#endif
+int ZEXPORT gzgetc(file)
+ gzFile file;
+{
+ int ret;
+ unsigned char buf[1];
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* try output buffer (no need to check for skip request) */
+ if (state->x.have) {
+ state->x.have--;
+ state->x.pos++;
+ return *(state->x.next)++;
+ }
+
+ /* nothing there -- try gz_read() */
+ ret = gz_read(state, buf, 1);
+ return ret < 1 ? -1 : buf[0];
+}
+
+int ZEXPORT gzgetc_(file)
+gzFile file;
+{
+ return gzgetc(file);
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzungetc(c, file)
+ int c;
+ gzFile file;
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return -1;
+
+ /* process a skip request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_skip(state, state->skip) == -1)
+ return -1;
+ }
+
+ /* can't push EOF */
+ if (c < 0)
+ return -1;
+
+ /* if output buffer empty, put byte at end (allows more pushing) */
+ if (state->x.have == 0) {
+ state->x.have = 1;
+ state->x.next = state->out + (state->size << 1) - 1;
+ state->x.next[0] = (unsigned char)c;
+ state->x.pos--;
+ state->past = 0;
+ return c;
+ }
+
+ /* if no room, give up (must have already done a gzungetc()) */
+ if (state->x.have == (state->size << 1)) {
+ gz_error(state, Z_DATA_ERROR, "out of room to push characters");
+ return -1;
+ }
+
+ /* slide output data if needed and insert byte before existing data */
+ if (state->x.next == state->out) {
+ unsigned char *src = state->out + state->x.have;
+ unsigned char *dest = state->out + (state->size << 1);
+ while (src > state->out)
+ *--dest = *--src;
+ state->x.next = dest;
+ }
+ state->x.have++;
+ state->x.next--;
+ state->x.next[0] = (unsigned char)c;
+ state->x.pos--;
+ state->past = 0;
+ return c;
+}
+
+/* -- see zlib.h -- */
+char * ZEXPORT gzgets(file, buf, len)
+ gzFile file;
+ char *buf;
+ int len;
+{
+ unsigned left, n;
+ char *str;
+ unsigned char *eol;
+ gz_statep state;
+
+ /* check parameters and get internal structure */
+ if (file == NULL || buf == NULL || len < 1)
+ return NULL;
+ state = (gz_statep)file;
+
+ /* check that we're reading and that there's no (serious) error */
+ if (state->mode != GZ_READ ||
+ (state->err != Z_OK && state->err != Z_BUF_ERROR))
+ return NULL;
+
+ /* process a skip request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_skip(state, state->skip) == -1)
+ return NULL;
+ }
+
+ /* copy output bytes up to new line or len - 1, whichever comes first --
+ append a terminating zero to the string (we don't check for a zero in
+ the contents, let the user worry about that) */
+ str = buf;
+ left = (unsigned)len - 1;
+ if (left) do {
+ /* assure that something is in the output buffer */
+ if (state->x.have == 0 && gz_fetch(state) == -1)
+ return NULL; /* error */
+ if (state->x.have == 0) { /* end of file */
+ state->past = 1; /* read past end */
+ break; /* return what we have */
+ }
+
+ /* look for end-of-line in current output buffer */
+ n = state->x.have > left ? left : state->x.have;
+ eol = (unsigned char *)memchr(state->x.next, '\n', n);
+ if (eol != NULL)
+ n = (unsigned)(eol - state->x.next) + 1;
+
+ /* copy through end-of-line, or remainder if not found */
+ memcpy(buf, state->x.next, n);
+ state->x.have -= n;
+ state->x.next += n;
+ state->x.pos += n;
+ left -= n;
+ buf += n;
+ } while (left && eol == NULL);
+
+ /* return terminated string, or if nothing, end of file */
+ if (buf == str)
+ return NULL;
+ buf[0] = 0;
+ return str;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzdirect(file)
+ gzFile file;
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+
+ /* if the state is not known, but we can find out, then do so (this is
+ mainly for right after a gzopen() or gzdopen()) */
+ if (state->mode == GZ_READ && state->how == LOOK && state->x.have == 0)
+ (void)gz_look(state);
+
+ /* return 1 if transparent, 0 if processing a gzip stream */
+ return state->direct;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzclose_r(file)
+ gzFile file;
+{
+ int ret, err;
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+
+ /* check that we're reading */
+ if (state->mode != GZ_READ)
+ return Z_STREAM_ERROR;
+
+ /* free memory and close file */
+ if (state->size) {
+ inflateEnd(&(state->strm));
+ free(state->out);
+ free(state->in);
+ }
+ err = state->err == Z_BUF_ERROR ? Z_BUF_ERROR : Z_OK;
+ gz_error(state, Z_OK, NULL);
+ free(state->path);
+ ret = close(state->fd);
+ free(state);
+ return ret ? Z_ERRNO : err;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/gzwrite.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzwrite.c
new file mode 100644
index 000000000..c7b5651d7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/gzwrite.c
@@ -0,0 +1,665 @@
+/* gzwrite.c -- zlib functions for writing gzip files
+ * Copyright (C) 2004-2017 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "gzguts.h"
+
+/* Local functions */
+local int gz_init OF((gz_statep));
+local int gz_comp OF((gz_statep, int));
+local int gz_zero OF((gz_statep, z_off64_t));
+local z_size_t gz_write OF((gz_statep, voidpc, z_size_t));
+
+/* Initialize state for writing a gzip file. Mark initialization by setting
+ state->size to non-zero. Return -1 on a memory allocation failure, or 0 on
+ success. */
+local int gz_init(state)
+ gz_statep state;
+{
+ int ret;
+ z_streamp strm = &(state->strm);
+
+ /* allocate input buffer (double size for gzprintf) */
+ state->in = (unsigned char *)malloc(state->want << 1);
+ if (state->in == NULL) {
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+
+ /* only need output buffer and deflate state if compressing */
+ if (!state->direct) {
+ /* allocate output buffer */
+ state->out = (unsigned char *)malloc(state->want);
+ if (state->out == NULL) {
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+
+ /* allocate deflate memory, set up for gzip compression */
+ strm->zalloc = Z_NULL;
+ strm->zfree = Z_NULL;
+ strm->opaque = Z_NULL;
+ ret = deflateInit2(strm, state->level, Z_DEFLATED,
+ MAX_WBITS + 16, DEF_MEM_LEVEL, state->strategy);
+ if (ret != Z_OK) {
+ free(state->out);
+ free(state->in);
+ gz_error(state, Z_MEM_ERROR, "out of memory");
+ return -1;
+ }
+ strm->next_in = NULL;
+ }
+
+ /* mark state as initialized */
+ state->size = state->want;
+
+ /* initialize write buffer if compressing */
+ if (!state->direct) {
+ strm->avail_out = state->size;
+ strm->next_out = state->out;
+ state->x.next = strm->next_out;
+ }
+ return 0;
+}
+
+/* Compress whatever is at avail_in and next_in and write to the output file.
+ Return -1 if there is an error writing to the output file or if gz_init()
+ fails to allocate memory, otherwise 0. flush is assumed to be a valid
+ deflate() flush value. If flush is Z_FINISH, then the deflate() state is
+ reset to start a new gzip stream. If gz->direct is true, then simply write
+ to the output file without compressing, and ignore flush. */
+local int gz_comp(state, flush)
+ gz_statep state;
+ int flush;
+{
+ int ret, writ;
+ unsigned have, put, max = ((unsigned)-1 >> 2) + 1;
+ z_streamp strm = &(state->strm);
+
+ /* allocate memory if this is the first time through */
+ if (state->size == 0 && gz_init(state) == -1)
+ return -1;
+
+ /* write directly if requested */
+ if (state->direct) {
+ while (strm->avail_in) {
+ put = strm->avail_in > max ? max : strm->avail_in;
+ writ = write(state->fd, strm->next_in, put);
+ if (writ < 0) {
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ strm->avail_in -= (unsigned)writ;
+ strm->next_in += writ;
+ }
+ return 0;
+ }
+
+ /* run deflate() on provided input until it produces no more output */
+ ret = Z_OK;
+ do {
+ /* write out current buffer contents if full, or if flushing, but if
+ doing Z_FINISH then don't write until we get to Z_STREAM_END */
+ if (strm->avail_out == 0 || (flush != Z_NO_FLUSH &&
+ (flush != Z_FINISH || ret == Z_STREAM_END))) {
+ while (strm->next_out > state->x.next) {
+ put = strm->next_out - state->x.next > (int)max ? max :
+ (unsigned)(strm->next_out - state->x.next);
+ writ = write(state->fd, state->x.next, put);
+ if (writ < 0) {
+ gz_error(state, Z_ERRNO, zstrerror());
+ return -1;
+ }
+ state->x.next += writ;
+ }
+ if (strm->avail_out == 0) {
+ strm->avail_out = state->size;
+ strm->next_out = state->out;
+ state->x.next = state->out;
+ }
+ }
+
+ /* compress */
+ have = strm->avail_out;
+ ret = deflate(strm, flush);
+ if (ret == Z_STREAM_ERROR) {
+ gz_error(state, Z_STREAM_ERROR,
+ "internal error: deflate stream corrupt");
+ return -1;
+ }
+ have -= strm->avail_out;
+ } while (have);
+
+ /* if that completed a deflate stream, allow another to start */
+ if (flush == Z_FINISH)
+ deflateReset(strm);
+
+ /* all done, no errors */
+ return 0;
+}
+
+/* Compress len zeros to output. Return -1 on a write error or memory
+ allocation failure by gz_comp(), or 0 on success. */
+local int gz_zero(state, len)
+ gz_statep state;
+ z_off64_t len;
+{
+ int first;
+ unsigned n;
+ z_streamp strm = &(state->strm);
+
+ /* consume whatever's left in the input buffer */
+ if (strm->avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+ return -1;
+
+ /* compress len zeros (len guaranteed > 0) */
+ first = 1;
+ while (len) {
+ n = GT_OFF(state->size) || (z_off64_t)state->size > len ?
+ (unsigned)len : state->size;
+ if (first) {
+ memset(state->in, 0, n);
+ first = 0;
+ }
+ strm->avail_in = n;
+ strm->next_in = state->in;
+ state->x.pos += n;
+ if (gz_comp(state, Z_NO_FLUSH) == -1)
+ return -1;
+ len -= n;
+ }
+ return 0;
+}
+
+/* Write len bytes from buf to file. Return the number of bytes written. If
+ the returned value is less than len, then there was an error. */
+local z_size_t gz_write(state, buf, len)
+ gz_statep state;
+ voidpc buf;
+ z_size_t len;
+{
+ z_size_t put = len;
+
+ /* if len is zero, avoid unnecessary operations */
+ if (len == 0)
+ return 0;
+
+ /* allocate memory if this is the first time through */
+ if (state->size == 0 && gz_init(state) == -1)
+ return 0;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return 0;
+ }
+
+ /* for small len, copy to input buffer, otherwise compress directly */
+ if (len < state->size) {
+ /* copy to input buffer, compress when full */
+ do {
+ unsigned have, copy;
+
+ if (state->strm.avail_in == 0)
+ state->strm.next_in = state->in;
+ have = (unsigned)((state->strm.next_in + state->strm.avail_in) -
+ state->in);
+ copy = state->size - have;
+ if (copy > len)
+ copy = len;
+ memcpy(state->in + have, buf, copy);
+ state->strm.avail_in += copy;
+ state->x.pos += copy;
+ buf = (const char *)buf + copy;
+ len -= copy;
+ if (len && gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+ } while (len);
+ }
+ else {
+ /* consume whatever's left in the input buffer */
+ if (state->strm.avail_in && gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+
+ /* directly compress user buffer to file */
+ state->strm.next_in = (z_const Bytef *)buf;
+ do {
+ unsigned n = (unsigned)-1;
+ if (n > len)
+ n = len;
+ state->strm.avail_in = n;
+ state->x.pos += n;
+ if (gz_comp(state, Z_NO_FLUSH) == -1)
+ return 0;
+ len -= n;
+ } while (len);
+ }
+
+ /* input was all buffered or compressed */
+ return put;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzwrite(file, buf, len)
+ gzFile file;
+ voidpc buf;
+ unsigned len;
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return 0;
+
+ /* since an int is returned, make sure len fits in one, otherwise return
+ with an error (this avoids a flaw in the interface) */
+ if ((int)len < 0) {
+ gz_error(state, Z_DATA_ERROR, "requested length does not fit in int");
+ return 0;
+ }
+
+ /* write len bytes from buf (the return value will fit in an int) */
+ return (int)gz_write(state, buf, len);
+}
+
+/* -- see zlib.h -- */
+z_size_t ZEXPORT gzfwrite(buf, size, nitems, file)
+ voidpc buf;
+ z_size_t size;
+ z_size_t nitems;
+ gzFile file;
+{
+ z_size_t len;
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return 0;
+ state = (gz_statep)file;
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return 0;
+
+ /* compute bytes to read -- error on overflow */
+ len = nitems * size;
+ if (size && len / size != nitems) {
+ gz_error(state, Z_STREAM_ERROR, "request does not fit in a size_t");
+ return 0;
+ }
+
+ /* write len bytes to buf, return the number of full items written */
+ return len ? gz_write(state, buf, len) / size : 0;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzputc(file, c)
+ gzFile file;
+ int c;
+{
+ unsigned have;
+ unsigned char buf[1];
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return -1;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return -1;
+ }
+
+ /* try writing to input buffer for speed (state->size == 0 if buffer not
+ initialized) */
+ if (state->size) {
+ if (strm->avail_in == 0)
+ strm->next_in = state->in;
+ have = (unsigned)((strm->next_in + strm->avail_in) - state->in);
+ if (have < state->size) {
+ state->in[have] = (unsigned char)c;
+ strm->avail_in++;
+ state->x.pos++;
+ return c & 0xff;
+ }
+ }
+
+ /* no room in buffer or not initialized, use gz_write() */
+ buf[0] = (unsigned char)c;
+ if (gz_write(state, buf, 1) != 1)
+ return -1;
+ return c & 0xff;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzputs(file, str)
+ gzFile file;
+ const char *str;
+{
+ int ret;
+ z_size_t len;
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return -1;
+ state = (gz_statep)file;
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return -1;
+
+ /* write string */
+ len = strlen(str);
+ ret = gz_write(state, str, len);
+ return ret == 0 && len != 0 ? -1 : ret;
+}
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+#include <stdarg.h>
+
+/* -- see zlib.h -- */
+int ZEXPORTVA gzvprintf(gzFile file, const char *format, va_list va)
+{
+ int len;
+ unsigned left;
+ char *next;
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return Z_STREAM_ERROR;
+
+ /* make sure we have some buffer space */
+ if (state->size == 0 && gz_init(state) == -1)
+ return state->err;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return state->err;
+ }
+
+ /* do the printf() into the input buffer, put length in len -- the input
+ buffer is double-sized just for this function, so there is guaranteed to
+ be state->size bytes available after the current contents */
+ if (strm->avail_in == 0)
+ strm->next_in = state->in;
+ next = (char *)(state->in + (strm->next_in - state->in) + strm->avail_in);
+ next[state->size - 1] = 0;
+#ifdef NO_vsnprintf
+# ifdef HAS_vsprintf_void
+ (void)vsprintf(next, format, va);
+ for (len = 0; len < state->size; len++)
+ if (next[len] == 0) break;
+# else
+ len = vsprintf(next, format, va);
+# endif
+#else
+# ifdef HAS_vsnprintf_void
+ (void)vsnprintf(next, state->size, format, va);
+ len = strlen(next);
+# else
+ len = vsnprintf(next, state->size, format, va);
+# endif
+#endif
+
+ /* check that printf() results fit in buffer */
+ if (len == 0 || (unsigned)len >= state->size || next[state->size - 1] != 0)
+ return 0;
+
+ /* update buffer and position, compress first half if past that */
+ strm->avail_in += (unsigned)len;
+ state->x.pos += len;
+ if (strm->avail_in >= state->size) {
+ left = strm->avail_in - state->size;
+ strm->avail_in = state->size;
+ if (gz_comp(state, Z_NO_FLUSH) == -1)
+ return state->err;
+ memcpy(state->in, state->in + state->size, left);
+ strm->next_in = state->in;
+ strm->avail_in = left;
+ }
+ return len;
+}
+
+int ZEXPORTVA gzprintf(gzFile file, const char *format, ...)
+{
+ va_list va;
+ int ret;
+
+ va_start(va, format);
+ ret = gzvprintf(file, format, va);
+ va_end(va);
+ return ret;
+}
+
+#else /* !STDC && !Z_HAVE_STDARG_H */
+
+/* -- see zlib.h -- */
+int ZEXPORTVA gzprintf (file, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
+ a11, a12, a13, a14, a15, a16, a17, a18, a19, a20)
+ gzFile file;
+ const char *format;
+ int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10,
+ a11, a12, a13, a14, a15, a16, a17, a18, a19, a20;
+{
+ unsigned len, left;
+ char *next;
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that can really pass pointer in ints */
+ if (sizeof(int) != sizeof(void *))
+ return Z_STREAM_ERROR;
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return Z_STREAM_ERROR;
+
+ /* make sure we have some buffer space */
+ if (state->size == 0 && gz_init(state) == -1)
+ return state->error;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return state->error;
+ }
+
+ /* do the printf() into the input buffer, put length in len -- the input
+ buffer is double-sized just for this function, so there is guaranteed to
+ be state->size bytes available after the current contents */
+ if (strm->avail_in == 0)
+ strm->next_in = state->in;
+ next = (char *)(strm->next_in + strm->avail_in);
+ next[state->size - 1] = 0;
+#ifdef NO_snprintf
+# ifdef HAS_sprintf_void
+ sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12,
+ a13, a14, a15, a16, a17, a18, a19, a20);
+ for (len = 0; len < size; len++)
+ if (next[len] == 0)
+ break;
+# else
+ len = sprintf(next, format, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11,
+ a12, a13, a14, a15, a16, a17, a18, a19, a20);
+# endif
+#else
+# ifdef HAS_snprintf_void
+ snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8, a9,
+ a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+ len = strlen(next);
+# else
+ len = snprintf(next, state->size, format, a1, a2, a3, a4, a5, a6, a7, a8,
+ a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
+# endif
+#endif
+
+ /* check that printf() results fit in buffer */
+ if (len == 0 || len >= state->size || next[state->size - 1] != 0)
+ return 0;
+
+ /* update buffer and position, compress first half if past that */
+ strm->avail_in += len;
+ state->x.pos += len;
+ if (strm->avail_in >= state->size) {
+ left = strm->avail_in - state->size;
+ strm->avail_in = state->size;
+ if (gz_comp(state, Z_NO_FLUSH) == -1)
+ return state->err;
+ memcpy(state->in, state->in + state->size, left);
+ strm->next_in = state->in;
+ strm->avail_in = left;
+ }
+ return (int)len;
+}
+
+#endif
+
+/* -- see zlib.h -- */
+int ZEXPORT gzflush(file, flush)
+ gzFile file;
+ int flush;
+{
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return Z_STREAM_ERROR;
+
+ /* check flush parameter */
+ if (flush < 0 || flush > Z_FINISH)
+ return Z_STREAM_ERROR;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return state->err;
+ }
+
+ /* compress remaining data with requested flush */
+ (void)gz_comp(state, flush);
+ return state->err;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzsetparams(file, level, strategy)
+ gzFile file;
+ int level;
+ int strategy;
+{
+ gz_statep state;
+ z_streamp strm;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+ strm = &(state->strm);
+
+ /* check that we're writing and that there's no error */
+ if (state->mode != GZ_WRITE || state->err != Z_OK)
+ return Z_STREAM_ERROR;
+
+ /* if no change is requested, then do nothing */
+ if (level == state->level && strategy == state->strategy)
+ return Z_OK;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ return state->err;
+ }
+
+ /* change compression parameters for subsequent input */
+ if (state->size) {
+ /* flush previous input with previous parameters before changing */
+ if (strm->avail_in && gz_comp(state, Z_BLOCK) == -1)
+ return state->err;
+ deflateParams(strm, level, strategy);
+ }
+ state->level = level;
+ state->strategy = strategy;
+ return Z_OK;
+}
+
+/* -- see zlib.h -- */
+int ZEXPORT gzclose_w(file)
+ gzFile file;
+{
+ int ret = Z_OK;
+ gz_statep state;
+
+ /* get internal structure */
+ if (file == NULL)
+ return Z_STREAM_ERROR;
+ state = (gz_statep)file;
+
+ /* check that we're writing */
+ if (state->mode != GZ_WRITE)
+ return Z_STREAM_ERROR;
+
+ /* check for seek request */
+ if (state->seek) {
+ state->seek = 0;
+ if (gz_zero(state, state->skip) == -1)
+ ret = state->err;
+ }
+
+ /* flush, free memory, and close file */
+ if (gz_comp(state, Z_FINISH) == -1)
+ ret = state->err;
+ if (state->size) {
+ if (!state->direct) {
+ (void)deflateEnd(&(state->strm));
+ free(state->out);
+ }
+ free(state->in);
+ }
+ gz_error(state, Z_OK, NULL);
+ free(state->path);
+ if (close(state->fd) == -1)
+ ret = Z_ERRNO;
+ free(state);
+ return ret;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/infback.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/infback.c
new file mode 100644
index 000000000..59679ecbf
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/infback.c
@@ -0,0 +1,640 @@
+/* infback.c -- inflate using a call-back interface
+ * Copyright (C) 1995-2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ This code is largely copied from inflate.c. Normally either infback.o or
+ inflate.o would be linked into an application--not both. The interface
+ with inffast.c is retained so that optimized assembler-coded versions of
+ inflate_fast() can be used with either inflate.c or infback.c.
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+/* function prototypes */
+local void fixedtables OF((struct inflate_state FAR *state));
+
+/*
+ strm provides memory allocation functions in zalloc and zfree, or
+ Z_NULL to use the library memory allocation functions.
+
+ windowBits is in the range 8..15, and window is a user-supplied
+ window and output buffer that is 2**windowBits bytes.
+ */
+int ZEXPORT inflateBackInit_(strm, windowBits, window, version, stream_size)
+z_streamp strm;
+int windowBits;
+unsigned char FAR *window;
+const char *version;
+int stream_size;
+{
+ struct inflate_state FAR *state;
+
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+ stream_size != (int)(sizeof(z_stream)))
+ return Z_VERSION_ERROR;
+ if (strm == Z_NULL || window == Z_NULL ||
+ windowBits < 8 || windowBits > 15)
+ return Z_STREAM_ERROR;
+ strm->msg = Z_NULL; /* in case we return an error */
+ if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+#endif
+ }
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
+ state = (struct inflate_state FAR *)ZALLOC(strm, 1,
+ sizeof(struct inflate_state));
+ if (state == Z_NULL) return Z_MEM_ERROR;
+ Tracev((stderr, "inflate: allocated\n"));
+ strm->state = (struct internal_state FAR *)state;
+ state->dmax = 32768U;
+ state->wbits = (uInt)windowBits;
+ state->wsize = 1U << windowBits;
+ state->window = window;
+ state->wnext = 0;
+ state->whave = 0;
+ return Z_OK;
+}
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding. Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter. This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time. However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
+ */
+local void fixedtables(state)
+struct inflate_state FAR *state;
+{
+#ifdef BUILDFIXED
+ static int virgin = 1;
+ static code *lenfix, *distfix;
+ static code fixed[544];
+
+ /* build fixed huffman tables if first call (may not be thread safe) */
+ if (virgin) {
+ unsigned sym, bits;
+ static code *next;
+
+ /* literal/length table */
+ sym = 0;
+ while (sym < 144) state->lens[sym++] = 8;
+ while (sym < 256) state->lens[sym++] = 9;
+ while (sym < 280) state->lens[sym++] = 7;
+ while (sym < 288) state->lens[sym++] = 8;
+ next = fixed;
+ lenfix = next;
+ bits = 9;
+ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+
+ /* distance table */
+ sym = 0;
+ while (sym < 32) state->lens[sym++] = 5;
+ distfix = next;
+ bits = 5;
+ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+
+ /* do this just once */
+ virgin = 0;
+ }
+#else /* !BUILDFIXED */
+# include "inffixed.h"
+#endif /* BUILDFIXED */
+ state->lencode = lenfix;
+ state->lenbits = 9;
+ state->distcode = distfix;
+ state->distbits = 5;
+}
+
+/* Macros for inflateBack(): */
+
+/* Load returned state from inflate_fast() */
+#define LOAD() \
+ do { \
+ put = strm->next_out; \
+ left = strm->avail_out; \
+ next = strm->next_in; \
+ have = strm->avail_in; \
+ hold = state->hold; \
+ bits = state->bits; \
+ } while (0)
+
+/* Set state from registers for inflate_fast() */
+#define RESTORE() \
+ do { \
+ strm->next_out = put; \
+ strm->avail_out = left; \
+ strm->next_in = next; \
+ strm->avail_in = have; \
+ state->hold = hold; \
+ state->bits = bits; \
+ } while (0)
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+ do { \
+ hold = 0; \
+ bits = 0; \
+ } while (0)
+
+/* Assure that some input is available. If input is requested, but denied,
+ then return a Z_BUF_ERROR from inflateBack(). */
+#define PULL() \
+ do { \
+ if (have == 0) { \
+ have = in(in_desc, &next); \
+ if (have == 0) { \
+ next = Z_NULL; \
+ ret = Z_BUF_ERROR; \
+ goto inf_leave; \
+ } \
+ } \
+ } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflateBack()
+ with an error if there is no input available. */
+#define PULLBYTE() \
+ do { \
+ PULL(); \
+ have--; \
+ hold += (unsigned long)(*next++) << bits; \
+ bits += 8; \
+ } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator. If there is
+ not enough available input to do that, then return from inflateBack() with
+ an error. */
+#define NEEDBITS(n) \
+ do { \
+ while (bits < (unsigned)(n)) \
+ PULLBYTE(); \
+ } while (0)
+
+/* Return the low n bits of the bit accumulator (n < 16) */
+#define BITS(n) \
+ ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+ do { \
+ hold >>= (n); \
+ bits -= (unsigned)(n); \
+ } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+ do { \
+ hold >>= bits & 7; \
+ bits -= bits & 7; \
+ } while (0)
+
+/* Assure that some output space is available, by writing out the window
+ if it's full. If the write fails, return from inflateBack() with a
+ Z_BUF_ERROR. */
+#define ROOM() \
+ do { \
+ if (left == 0) { \
+ put = state->window; \
+ left = state->wsize; \
+ state->whave = left; \
+ if (out(out_desc, put, left)) { \
+ ret = Z_BUF_ERROR; \
+ goto inf_leave; \
+ } \
+ } \
+ } while (0)
+
+/*
+ strm provides the memory allocation functions and window buffer on input,
+ and provides information on the unused input on return. For Z_DATA_ERROR
+ returns, strm will also provide an error message.
+
+ in() and out() are the call-back input and output functions. When
+ inflateBack() needs more input, it calls in(). When inflateBack() has
+ filled the window with output, or when it completes with data in the
+ window, it calls out() to write out the data. The application must not
+ change the provided input until in() is called again or inflateBack()
+ returns. The application must not change the window/output buffer until
+ inflateBack() returns.
+
+ in() and out() are called with a descriptor parameter provided in the
+ inflateBack() call. This parameter can be a structure that provides the
+ information required to do the read or write, as well as accumulated
+ information on the input and output such as totals and check values.
+
+ in() should return zero on failure. out() should return non-zero on
+ failure. If either in() or out() fails, than inflateBack() returns a
+ Z_BUF_ERROR. strm->next_in can be checked for Z_NULL to see whether it
+ was in() or out() that caused in the error. Otherwise, inflateBack()
+ returns Z_STREAM_END on success, Z_DATA_ERROR for an deflate format
+ error, or Z_MEM_ERROR if it could not allocate memory for the state.
+ inflateBack() can also return Z_STREAM_ERROR if the input parameters
+ are not correct, i.e. strm is Z_NULL or the state was not initialized.
+ */
+int ZEXPORT inflateBack(strm, in, in_desc, out, out_desc)
+z_streamp strm;
+in_func in;
+void FAR *in_desc;
+out_func out;
+void FAR *out_desc;
+{
+ struct inflate_state FAR *state;
+ z_const unsigned char FAR *next; /* next input */
+ unsigned char FAR *put; /* next output */
+ unsigned have, left; /* available input and output */
+ unsigned long hold; /* bit buffer */
+ unsigned bits; /* bits in bit buffer */
+ unsigned copy; /* number of stored or match bytes to copy */
+ unsigned char FAR *from; /* where to copy match bytes from */
+ code here; /* current decoding table entry */
+ code last; /* parent table entry */
+ unsigned len; /* length to copy for repeats, bits to drop */
+ int ret; /* return code */
+ static const unsigned short order[19] = /* permutation of code lengths */
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+ /* Check that the strm exists and that the state was initialized */
+ if (strm == Z_NULL || strm->state == Z_NULL)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* Reset the state */
+ strm->msg = Z_NULL;
+ state->mode = TYPE;
+ state->last = 0;
+ state->whave = 0;
+ next = strm->next_in;
+ have = next != Z_NULL ? strm->avail_in : 0;
+ hold = 0;
+ bits = 0;
+ put = state->window;
+ left = state->wsize;
+
+ /* Inflate until end of block marked as last */
+ for (;;)
+ switch (state->mode) {
+ case TYPE:
+ /* determine and dispatch block type */
+ if (state->last) {
+ BYTEBITS();
+ state->mode = DONE;
+ break;
+ }
+ NEEDBITS(3);
+ state->last = BITS(1);
+ DROPBITS(1);
+ switch (BITS(2)) {
+ case 0: /* stored block */
+ Tracev((stderr, "inflate: stored block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = STORED;
+ break;
+ case 1: /* fixed block */
+ fixedtables(state);
+ Tracev((stderr, "inflate: fixed codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = LEN; /* decode codes */
+ break;
+ case 2: /* dynamic block */
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = TABLE;
+ break;
+ case 3:
+ strm->msg = (char *)"invalid block type";
+ state->mode = BAD;
+ }
+ DROPBITS(2);
+ break;
+
+ case STORED:
+ /* get and verify stored block length */
+ BYTEBITS(); /* go to byte boundary */
+ NEEDBITS(32);
+ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+ strm->msg = (char *)"invalid stored block lengths";
+ state->mode = BAD;
+ break;
+ }
+ state->length = (unsigned)hold & 0xffff;
+ Tracev((stderr, "inflate: stored length %u\n",
+ state->length));
+ INITBITS();
+
+ /* copy stored block from input to output */
+ while (state->length != 0) {
+ copy = state->length;
+ PULL();
+ ROOM();
+ if (copy > have) copy = have;
+ if (copy > left) copy = left;
+ zmemcpy(put, next, copy);
+ have -= copy;
+ next += copy;
+ left -= copy;
+ put += copy;
+ state->length -= copy;
+ }
+ Tracev((stderr, "inflate: stored end\n"));
+ state->mode = TYPE;
+ break;
+
+ case TABLE:
+ /* get dynamic table entries descriptor */
+ NEEDBITS(14);
+ state->nlen = BITS(5) + 257;
+ DROPBITS(5);
+ state->ndist = BITS(5) + 1;
+ DROPBITS(5);
+ state->ncode = BITS(4) + 4;
+ DROPBITS(4);
+#ifndef PKZIP_BUG_WORKAROUND
+ if (state->nlen > 286 || state->ndist > 30) {
+ strm->msg = (char *)"too many length or distance symbols";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ Tracev((stderr, "inflate: table sizes ok\n"));
+
+ /* get code length code lengths (not a typo) */
+ state->have = 0;
+ while (state->have < state->ncode) {
+ NEEDBITS(3);
+ state->lens[order[state->have++]] = (unsigned short)BITS(3);
+ DROPBITS(3);
+ }
+ while (state->have < 19)
+ state->lens[order[state->have++]] = 0;
+ state->next = state->codes;
+ state->lencode = (code const FAR *)(state->next);
+ state->lenbits = 7;
+ ret = inflate_table(CODES, state->lens, 19, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid code lengths set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: code lengths ok\n"));
+
+ /* get length and distance code code lengths */
+ state->have = 0;
+ while (state->have < state->nlen + state->ndist) {
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.val < 16) {
+ DROPBITS(here.bits);
+ state->lens[state->have++] = here.val;
+ }
+ else {
+ if (here.val == 16) {
+ NEEDBITS(here.bits + 2);
+ DROPBITS(here.bits);
+ if (state->have == 0) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ len = (unsigned)(state->lens[state->have - 1]);
+ copy = 3 + BITS(2);
+ DROPBITS(2);
+ }
+ else if (here.val == 17) {
+ NEEDBITS(here.bits + 3);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 3 + BITS(3);
+ DROPBITS(3);
+ }
+ else {
+ NEEDBITS(here.bits + 7);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 11 + BITS(7);
+ DROPBITS(7);
+ }
+ if (state->have + copy > state->nlen + state->ndist) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ while (copy--)
+ state->lens[state->have++] = (unsigned short)len;
+ }
+ }
+
+ /* handle error breaks in while */
+ if (state->mode == BAD) break;
+
+ /* check for end-of-block code (better have one) */
+ if (state->lens[256] == 0) {
+ strm->msg = (char *)"invalid code -- missing end-of-block";
+ state->mode = BAD;
+ break;
+ }
+
+ /* build code tables -- note: do not change the lenbits or distbits
+ values here (9 and 6) without reading the comments in inftrees.h
+ concerning the ENOUGH constants, which depend on those values */
+ state->next = state->codes;
+ state->lencode = (code const FAR *)(state->next);
+ state->lenbits = 9;
+ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid literal/lengths set";
+ state->mode = BAD;
+ break;
+ }
+ state->distcode = (code const FAR *)(state->next);
+ state->distbits = 6;
+ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+ &(state->next), &(state->distbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid distances set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: codes ok\n"));
+ state->mode = LEN;
+
+ case LEN:
+ /* use inflate_fast() if we have enough input and output */
+ if (have >= 6 && left >= 258) {
+ RESTORE();
+ if (state->whave < state->wsize)
+ state->whave = state->wsize - left;
+ inflate_fast(strm, state->wsize);
+ LOAD();
+ break;
+ }
+
+ /* get a literal, length, or end-of-block code */
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.op && (here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->lencode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(here.bits);
+ state->length = (unsigned)here.val;
+
+ /* process literal */
+ if (here.op == 0) {
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", here.val));
+ ROOM();
+ *put++ = (unsigned char)(state->length);
+ left--;
+ state->mode = LEN;
+ break;
+ }
+
+ /* process end of block */
+ if (here.op & 32) {
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->mode = TYPE;
+ break;
+ }
+
+ /* invalid code */
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+
+ /* length code -- get extra bits, if any */
+ state->extra = (unsigned)(here.op) & 15;
+ if (state->extra != 0) {
+ NEEDBITS(state->extra);
+ state->length += BITS(state->extra);
+ DROPBITS(state->extra);
+ }
+ Tracevv((stderr, "inflate: length %u\n", state->length));
+
+ /* get distance code */
+ for (;;) {
+ here = state->distcode[BITS(state->distbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if ((here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->distcode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(here.bits);
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ state->offset = (unsigned)here.val;
+
+ /* get distance extra bits, if any */
+ state->extra = (unsigned)(here.op) & 15;
+ if (state->extra != 0) {
+ NEEDBITS(state->extra);
+ state->offset += BITS(state->extra);
+ DROPBITS(state->extra);
+ }
+ if (state->offset > state->wsize - (state->whave < state->wsize ?
+ left : 0)) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+ Tracevv((stderr, "inflate: distance %u\n", state->offset));
+
+ /* copy match from window to output */
+ do {
+ ROOM();
+ copy = state->wsize - state->offset;
+ if (copy < left) {
+ from = put + copy;
+ copy = left - copy;
+ }
+ else {
+ from = put - state->offset;
+ copy = left;
+ }
+ if (copy > state->length) copy = state->length;
+ state->length -= copy;
+ left -= copy;
+ do {
+ *put++ = *from++;
+ } while (--copy);
+ } while (state->length != 0);
+ break;
+
+ case DONE:
+ /* inflate stream terminated properly -- write leftover output */
+ ret = Z_STREAM_END;
+ if (left < state->wsize) {
+ if (out(out_desc, state->window, state->wsize - left))
+ ret = Z_BUF_ERROR;
+ }
+ goto inf_leave;
+
+ case BAD:
+ ret = Z_DATA_ERROR;
+ goto inf_leave;
+
+ default: /* can't happen, but makes compilers happy */
+ ret = Z_STREAM_ERROR;
+ goto inf_leave;
+ }
+
+ /* Return unused input */
+ inf_leave:
+ strm->next_in = next;
+ strm->avail_in = have;
+ return ret;
+}
+
+int ZEXPORT inflateBackEnd(strm)
+z_streamp strm;
+{
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+ return Z_STREAM_ERROR;
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+ Tracev((stderr, "inflate: end\n"));
+ return Z_OK;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.c
new file mode 100644
index 000000000..0dbd1dbc0
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.c
@@ -0,0 +1,323 @@
+/* inffast.c -- fast decoding
+ * Copyright (C) 1995-2017 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifdef ASMINF
+# pragma message("Assembler code may have bugs -- use at your own risk")
+#else
+
+/*
+ Decode literal, length, and distance codes and write out the resulting
+ literal and match bytes until either not enough input or output is
+ available, an end-of-block is encountered, or a data error is encountered.
+ When large enough input and output buffers are supplied to inflate(), for
+ example, a 16K input buffer and a 64K output buffer, more than 95% of the
+ inflate execution time is spent in this routine.
+
+ Entry assumptions:
+
+ state->mode == LEN
+ strm->avail_in >= 6
+ strm->avail_out >= 258
+ start >= strm->avail_out
+ state->bits < 8
+
+ On return, state->mode is one of:
+
+ LEN -- ran out of enough output space or enough available input
+ TYPE -- reached end of block code, inflate() to interpret next block
+ BAD -- error in block data
+
+ Notes:
+
+ - The maximum input bits used by a length/distance pair is 15 bits for the
+ length code, 5 bits for the length extra, 15 bits for the distance code,
+ and 13 bits for the distance extra. This totals 48 bits, or six bytes.
+ Therefore if strm->avail_in >= 6, then there is enough input to avoid
+ checking for available input while decoding.
+
+ - The maximum bytes that a single length/distance pair can output is 258
+ bytes, which is the maximum length that can be coded. inflate_fast()
+ requires strm->avail_out >= 258 for each loop to avoid checking for
+ output space.
+ */
+void ZLIB_INTERNAL inflate_fast(strm, start)
+z_streamp strm;
+unsigned start; /* inflate()'s starting value for strm->avail_out */
+{
+ struct inflate_state FAR *state;
+ z_const unsigned char FAR *in; /* local strm->next_in */
+ z_const unsigned char FAR *last; /* have enough input while in < last */
+ unsigned char FAR *out; /* local strm->next_out */
+ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
+ unsigned char FAR *end; /* while out < end, enough space available */
+#ifdef INFLATE_STRICT
+ unsigned dmax; /* maximum distance from zlib header */
+#endif
+ unsigned wsize; /* window size or zero if not using window */
+ unsigned whave; /* valid bytes in the window */
+ unsigned wnext; /* window write index */
+ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
+ unsigned long hold; /* local strm->hold */
+ unsigned bits; /* local strm->bits */
+ code const FAR *lcode; /* local strm->lencode */
+ code const FAR *dcode; /* local strm->distcode */
+ unsigned lmask; /* mask for first level of length codes */
+ unsigned dmask; /* mask for first level of distance codes */
+ code here; /* retrieved table entry */
+ unsigned op; /* code bits, operation, extra bits, or */
+ /* window position, window bytes to copy */
+ unsigned len; /* match length, unused bytes */
+ unsigned dist; /* match distance */
+ unsigned char FAR *from; /* where to copy match from */
+
+ /* copy state to local variables */
+ state = (struct inflate_state FAR *)strm->state;
+ in = strm->next_in;
+ last = in + (strm->avail_in - 5);
+ out = strm->next_out;
+ beg = out - (start - strm->avail_out);
+ end = out + (strm->avail_out - 257);
+#ifdef INFLATE_STRICT
+ dmax = state->dmax;
+#endif
+ wsize = state->wsize;
+ whave = state->whave;
+ wnext = state->wnext;
+ window = state->window;
+ hold = state->hold;
+ bits = state->bits;
+ lcode = state->lencode;
+ dcode = state->distcode;
+ lmask = (1U << state->lenbits) - 1;
+ dmask = (1U << state->distbits) - 1;
+
+ /* decode literals and length/distances until end-of-block or not enough
+ input data or output space */
+ do {
+ if (bits < 15) {
+ hold += (unsigned long)(*in++) << bits;
+ bits += 8;
+ hold += (unsigned long)(*in++) << bits;
+ bits += 8;
+ }
+ here = lcode[hold & lmask];
+ dolen:
+ op = (unsigned)(here.bits);
+ hold >>= op;
+ bits -= op;
+ op = (unsigned)(here.op);
+ if (op == 0) { /* literal */
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", here.val));
+ *out++ = (unsigned char)(here.val);
+ }
+ else if (op & 16) { /* length base */
+ len = (unsigned)(here.val);
+ op &= 15; /* number of extra bits */
+ if (op) {
+ if (bits < op) {
+ hold += (unsigned long)(*in++) << bits;
+ bits += 8;
+ }
+ len += (unsigned)hold & ((1U << op) - 1);
+ hold >>= op;
+ bits -= op;
+ }
+ Tracevv((stderr, "inflate: length %u\n", len));
+ if (bits < 15) {
+ hold += (unsigned long)(*in++) << bits;
+ bits += 8;
+ hold += (unsigned long)(*in++) << bits;
+ bits += 8;
+ }
+ here = dcode[hold & dmask];
+ dodist:
+ op = (unsigned)(here.bits);
+ hold >>= op;
+ bits -= op;
+ op = (unsigned)(here.op);
+ if (op & 16) { /* distance base */
+ dist = (unsigned)(here.val);
+ op &= 15; /* number of extra bits */
+ if (bits < op) {
+ hold += (unsigned long)(*in++) << bits;
+ bits += 8;
+ if (bits < op) {
+ hold += (unsigned long)(*in++) << bits;
+ bits += 8;
+ }
+ }
+ dist += (unsigned)hold & ((1U << op) - 1);
+#ifdef INFLATE_STRICT
+ if (dist > dmax) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ hold >>= op;
+ bits -= op;
+ Tracevv((stderr, "inflate: distance %u\n", dist));
+ op = (unsigned)(out - beg); /* max distance in output */
+ if (dist > op) { /* see if copy from window */
+ op = dist - op; /* distance back in window */
+ if (op > whave) {
+ if (state->sane) {
+ strm->msg =
+ (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ if (len <= op - whave) {
+ do {
+ *out++ = 0;
+ } while (--len);
+ continue;
+ }
+ len -= op - whave;
+ do {
+ *out++ = 0;
+ } while (--op > whave);
+ if (op == 0) {
+ from = out - dist;
+ do {
+ *out++ = *from++;
+ } while (--len);
+ continue;
+ }
+#endif
+ }
+ from = window;
+ if (wnext == 0) { /* very common case */
+ from += wsize - op;
+ if (op < len) { /* some from window */
+ len -= op;
+ do {
+ *out++ = *from++;
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ else if (wnext < op) { /* wrap around window */
+ from += wsize + wnext - op;
+ op -= wnext;
+ if (op < len) { /* some from end of window */
+ len -= op;
+ do {
+ *out++ = *from++;
+ } while (--op);
+ from = window;
+ if (wnext < len) { /* some from start of window */
+ op = wnext;
+ len -= op;
+ do {
+ *out++ = *from++;
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ }
+ else { /* contiguous in window */
+ from += wnext - op;
+ if (op < len) { /* some from window */
+ len -= op;
+ do {
+ *out++ = *from++;
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ while (len > 2) {
+ *out++ = *from++;
+ *out++ = *from++;
+ *out++ = *from++;
+ len -= 3;
+ }
+ if (len) {
+ *out++ = *from++;
+ if (len > 1)
+ *out++ = *from++;
+ }
+ }
+ else {
+ from = out - dist; /* copy direct from output */
+ do { /* minimum length is three */
+ *out++ = *from++;
+ *out++ = *from++;
+ *out++ = *from++;
+ len -= 3;
+ } while (len > 2);
+ if (len) {
+ *out++ = *from++;
+ if (len > 1)
+ *out++ = *from++;
+ }
+ }
+ }
+ else if ((op & 64) == 0) { /* 2nd level distance code */
+ here = dcode[here.val + (hold & ((1U << op) - 1))];
+ goto dodist;
+ }
+ else {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ }
+ else if ((op & 64) == 0) { /* 2nd level length code */
+ here = lcode[here.val + (hold & ((1U << op) - 1))];
+ goto dolen;
+ }
+ else if (op & 32) { /* end-of-block */
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->mode = TYPE;
+ break;
+ }
+ else {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+ } while (in < last && out < end);
+
+ /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+ len = bits >> 3;
+ in -= len;
+ bits -= len << 3;
+ hold &= (1U << bits) - 1;
+
+ /* update state and return */
+ strm->next_in = in;
+ strm->next_out = out;
+ strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
+ strm->avail_out = (unsigned)(out < end ?
+ 257 + (end - out) : 257 - (out - end));
+ state->hold = hold;
+ state->bits = bits;
+ return;
+}
+
+/*
+ inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
+ - Using bit fields for code structure
+ - Different op definition to avoid & for extra bits (do & for table bits)
+ - Three separate decoding do-loops for direct, window, and wnext == 0
+ - Special case for distance > 1 copies to do overlapped load and store copy
+ - Explicit branch predictions (based on measured branch probabilities)
+ - Deferring match copy and interspersed it with decoding subsequent codes
+ - Swapping literal/length else
+ - Swapping window/direct else
+ - Larger unrolled copy loops (three is about right)
+ - Moving len -= 3 statement into middle of loop
+ */
+
+#endif /* !ASMINF */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.h
new file mode 100644
index 000000000..e5c1aa4ca
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/inffast.h
@@ -0,0 +1,11 @@
+/* inffast.h -- header to use inffast.c
+ * Copyright (C) 1995-2003, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+void ZLIB_INTERNAL inflate_fast OF((z_streamp strm, unsigned start));
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/inffixed.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/inffixed.h
new file mode 100644
index 000000000..d62832776
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/inffixed.h
@@ -0,0 +1,94 @@
+ /* inffixed.h -- table for decoding fixed codes
+ * Generated automatically by makefixed().
+ */
+
+ /* WARNING: this file should *not* be used by applications.
+ It is part of the implementation of this library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+ static const code lenfix[512] = {
+ {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
+ {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
+ {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
+ {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
+ {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
+ {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
+ {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
+ {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
+ {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
+ {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
+ {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
+ {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
+ {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
+ {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
+ {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
+ {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
+ {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
+ {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
+ {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
+ {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
+ {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
+ {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
+ {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
+ {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
+ {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
+ {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
+ {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
+ {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
+ {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
+ {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
+ {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
+ {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
+ {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
+ {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
+ {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
+ {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
+ {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
+ {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
+ {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
+ {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
+ {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
+ {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
+ {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
+ {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
+ {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
+ {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
+ {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
+ {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
+ {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
+ {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
+ {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
+ {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
+ {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
+ {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
+ {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
+ {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
+ {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
+ {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
+ {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
+ {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
+ {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
+ {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
+ {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
+ {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
+ {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
+ {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
+ {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
+ {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
+ {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
+ {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
+ {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
+ {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
+ {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
+ {0,9,255}
+ };
+
+ static const code distfix[32] = {
+ {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
+ {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
+ {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
+ {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
+ {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
+ {22,5,193},{64,5,0}
+ };
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.c
new file mode 100644
index 000000000..ac333e8c2
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.c
@@ -0,0 +1,1561 @@
+/* inflate.c -- zlib decompression
+ * Copyright (C) 1995-2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * Change history:
+ *
+ * 1.2.beta0 24 Nov 2002
+ * - First version -- complete rewrite of inflate to simplify code, avoid
+ * creation of window when not needed, minimize use of window when it is
+ * needed, make inffast.c even faster, implement gzip decoding, and to
+ * improve code readability and style over the previous zlib inflate code
+ *
+ * 1.2.beta1 25 Nov 2002
+ * - Use pointers for available input and output checking in inffast.c
+ * - Remove input and output counters in inffast.c
+ * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
+ * - Remove unnecessary second byte pull from length extra in inffast.c
+ * - Unroll direct copy to three copies per loop in inffast.c
+ *
+ * 1.2.beta2 4 Dec 2002
+ * - Change external routine names to reduce potential conflicts
+ * - Correct filename to inffixed.h for fixed tables in inflate.c
+ * - Make hbuf[] unsigned char to match parameter type in inflate.c
+ * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
+ * to avoid negation problem on Alphas (64 bit) in inflate.c
+ *
+ * 1.2.beta3 22 Dec 2002
+ * - Add comments on state->bits assertion in inffast.c
+ * - Add comments on op field in inftrees.h
+ * - Fix bug in reuse of allocated window after inflateReset()
+ * - Remove bit fields--back to byte structure for speed
+ * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
+ * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
+ * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
+ * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
+ * - Use local copies of stream next and avail values, as well as local bit
+ * buffer and bit count in inflate()--for speed when inflate_fast() not used
+ *
+ * 1.2.beta4 1 Jan 2003
+ * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
+ * - Move a comment on output buffer sizes from inffast.c to inflate.c
+ * - Add comments in inffast.c to introduce the inflate_fast() routine
+ * - Rearrange window copies in inflate_fast() for speed and simplification
+ * - Unroll last copy for window match in inflate_fast()
+ * - Use local copies of window variables in inflate_fast() for speed
+ * - Pull out common wnext == 0 case for speed in inflate_fast()
+ * - Make op and len in inflate_fast() unsigned for consistency
+ * - Add FAR to lcode and dcode declarations in inflate_fast()
+ * - Simplified bad distance check in inflate_fast()
+ * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
+ * source file infback.c to provide a call-back interface to inflate for
+ * programs like gzip and unzip -- uses window as output buffer to avoid
+ * window copying
+ *
+ * 1.2.beta5 1 Jan 2003
+ * - Improved inflateBack() interface to allow the caller to provide initial
+ * input in strm.
+ * - Fixed stored blocks bug in inflateBack()
+ *
+ * 1.2.beta6 4 Jan 2003
+ * - Added comments in inffast.c on effectiveness of POSTINC
+ * - Typecasting all around to reduce compiler warnings
+ * - Changed loops from while (1) or do {} while (1) to for (;;), again to
+ * make compilers happy
+ * - Changed type of window in inflateBackInit() to unsigned char *
+ *
+ * 1.2.beta7 27 Jan 2003
+ * - Changed many types to unsigned or unsigned short to avoid warnings
+ * - Added inflateCopy() function
+ *
+ * 1.2.0 9 Mar 2003
+ * - Changed inflateBack() interface to provide separate opaque descriptors
+ * for the in() and out() functions
+ * - Changed inflateBack() argument and in_func typedef to swap the length
+ * and buffer address return values for the input function
+ * - Check next_in and next_out for Z_NULL on entry to inflate()
+ *
+ * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifdef MAKEFIXED
+# ifndef BUILDFIXED
+# define BUILDFIXED
+# endif
+#endif
+
+/* function prototypes */
+local int inflateStateCheck OF((z_streamp strm));
+local void fixedtables OF((struct inflate_state FAR *state));
+local int updatewindow OF((z_streamp strm, const unsigned char FAR *end,
+ unsigned copy));
+#ifdef BUILDFIXED
+ void makefixed OF((void));
+#endif
+local unsigned syncsearch OF((unsigned FAR *have, const unsigned char FAR *buf,
+ unsigned len));
+
+local int inflateStateCheck(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+ if (strm == Z_NULL ||
+ strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0)
+ return 1;
+ state = (struct inflate_state FAR *)strm->state;
+ if (state == Z_NULL || state->strm != strm ||
+ state->mode < HEAD || state->mode > SYNC)
+ return 1;
+ return 0;
+}
+
+int ZEXPORT inflateResetKeep(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ strm->total_in = strm->total_out = state->total = 0;
+ strm->msg = Z_NULL;
+ if (state->wrap) /* to support ill-conceived Java test suite */
+ strm->adler = state->wrap & 1;
+ state->mode = HEAD;
+ state->last = 0;
+ state->havedict = 0;
+ state->dmax = 32768U;
+ state->head = Z_NULL;
+ state->hold = 0;
+ state->bits = 0;
+ state->lencode = state->distcode = state->next = state->codes;
+ state->sane = 1;
+ state->back = -1;
+ Tracev((stderr, "inflate: reset\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateReset(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ state->wsize = 0;
+ state->whave = 0;
+ state->wnext = 0;
+ return inflateResetKeep(strm);
+}
+
+int ZEXPORT inflateReset2(strm, windowBits)
+z_streamp strm;
+int windowBits;
+{
+ int wrap;
+ struct inflate_state FAR *state;
+
+ /* get the state */
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* extract wrap request from windowBits parameter */
+ if (windowBits < 0) {
+ wrap = 0;
+ windowBits = -windowBits;
+ }
+ else {
+ wrap = (windowBits >> 4) + 5;
+#ifdef GUNZIP
+ if (windowBits < 48)
+ windowBits &= 15;
+#endif
+ }
+
+ /* set number of window bits, free window if different */
+ if (windowBits && (windowBits < 8 || windowBits > 15))
+ return Z_STREAM_ERROR;
+ if (state->window != Z_NULL && state->wbits != (unsigned)windowBits) {
+ ZFREE(strm, state->window);
+ state->window = Z_NULL;
+ }
+
+ /* update state and reset the rest of it */
+ state->wrap = wrap;
+ state->wbits = (unsigned)windowBits;
+ return inflateReset(strm);
+}
+
+int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
+z_streamp strm;
+int windowBits;
+const char *version;
+int stream_size;
+{
+ int ret;
+ struct inflate_state FAR *state;
+
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+ stream_size != (int)(sizeof(z_stream)))
+ return Z_VERSION_ERROR;
+ if (strm == Z_NULL) return Z_STREAM_ERROR;
+ strm->msg = Z_NULL; /* in case we return an error */
+ if (strm->zalloc == (alloc_func)0) {
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+#endif
+ }
+ if (strm->zfree == (free_func)0)
+#ifdef Z_SOLO
+ return Z_STREAM_ERROR;
+#else
+ strm->zfree = zcfree;
+#endif
+ state = (struct inflate_state FAR *)
+ ZALLOC(strm, 1, sizeof(struct inflate_state));
+ if (state == Z_NULL) return Z_MEM_ERROR;
+ Tracev((stderr, "inflate: allocated\n"));
+ strm->state = (struct internal_state FAR *)state;
+ state->strm = strm;
+ state->window = Z_NULL;
+ state->mode = HEAD; /* to pass state test in inflateReset2() */
+ ret = inflateReset2(strm, windowBits);
+ if (ret != Z_OK) {
+ ZFREE(strm, state);
+ strm->state = Z_NULL;
+ }
+ return ret;
+}
+
+int ZEXPORT inflateInit_(strm, version, stream_size)
+z_streamp strm;
+const char *version;
+int stream_size;
+{
+ return inflateInit2_(strm, DEF_WBITS, version, stream_size);
+}
+
+int ZEXPORT inflatePrime(strm, bits, value)
+z_streamp strm;
+int bits;
+int value;
+{
+ struct inflate_state FAR *state;
+
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (bits < 0) {
+ state->hold = 0;
+ state->bits = 0;
+ return Z_OK;
+ }
+ if (bits > 16 || state->bits + (uInt)bits > 32) return Z_STREAM_ERROR;
+ value &= (1L << bits) - 1;
+ state->hold += (unsigned)value << state->bits;
+ state->bits += (uInt)bits;
+ return Z_OK;
+}
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding. Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter. This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time. However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
+ */
+local void fixedtables(state)
+struct inflate_state FAR *state;
+{
+#ifdef BUILDFIXED
+ static int virgin = 1;
+ static code *lenfix, *distfix;
+ static code fixed[544];
+
+ /* build fixed huffman tables if first call (may not be thread safe) */
+ if (virgin) {
+ unsigned sym, bits;
+ static code *next;
+
+ /* literal/length table */
+ sym = 0;
+ while (sym < 144) state->lens[sym++] = 8;
+ while (sym < 256) state->lens[sym++] = 9;
+ while (sym < 280) state->lens[sym++] = 7;
+ while (sym < 288) state->lens[sym++] = 8;
+ next = fixed;
+ lenfix = next;
+ bits = 9;
+ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+
+ /* distance table */
+ sym = 0;
+ while (sym < 32) state->lens[sym++] = 5;
+ distfix = next;
+ bits = 5;
+ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+
+ /* do this just once */
+ virgin = 0;
+ }
+#else /* !BUILDFIXED */
+# include "inffixed.h"
+#endif /* BUILDFIXED */
+ state->lencode = lenfix;
+ state->lenbits = 9;
+ state->distcode = distfix;
+ state->distbits = 5;
+}
+
+#ifdef MAKEFIXED
+#include <stdio.h>
+
+/*
+ Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also
+ defines BUILDFIXED, so the tables are built on the fly. makefixed() writes
+ those tables to stdout, which would be piped to inffixed.h. A small program
+ can simply call makefixed to do this:
+
+ void makefixed(void);
+
+ int main(void)
+ {
+ makefixed();
+ return 0;
+ }
+
+ Then that can be linked with zlib built with MAKEFIXED defined and run:
+
+ a.out > inffixed.h
+ */
+void makefixed()
+{
+ unsigned low, size;
+ struct inflate_state state;
+
+ fixedtables(&state);
+ puts(" /* inffixed.h -- table for decoding fixed codes");
+ puts(" * Generated automatically by makefixed().");
+ puts(" */");
+ puts("");
+ puts(" /* WARNING: this file should *not* be used by applications.");
+ puts(" It is part of the implementation of this library and is");
+ puts(" subject to change. Applications should only use zlib.h.");
+ puts(" */");
+ puts("");
+ size = 1U << 9;
+ printf(" static const code lenfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 7) == 0) printf("\n ");
+ printf("{%u,%u,%d}", (low & 127) == 99 ? 64 : state.lencode[low].op,
+ state.lencode[low].bits, state.lencode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+ size = 1U << 5;
+ printf("\n static const code distfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 6) == 0) printf("\n ");
+ printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
+ state.distcode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+}
+#endif /* MAKEFIXED */
+
+/*
+ Update the window with the last wsize (normally 32K) bytes written before
+ returning. If window does not exist yet, create it. This is only called
+ when a window is already in use, or when output has been written during this
+ inflate call, but the end of the deflate stream has not been reached yet.
+ It is also called to create a window for dictionary data when a dictionary
+ is loaded.
+
+ Providing output buffers larger than 32K to inflate() should provide a speed
+ advantage, since only the last 32K of output is copied to the sliding window
+ upon return from inflate(), and since all distances after the first 32K of
+ output will fall in the output data, making match copies simpler and faster.
+ The advantage may be dependent on the size of the processor's data caches.
+ */
+local int updatewindow(strm, end, copy)
+z_streamp strm;
+const Bytef *end;
+unsigned copy;
+{
+ struct inflate_state FAR *state;
+ unsigned dist;
+
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* if it hasn't been done already, allocate space for the window */
+ if (state->window == Z_NULL) {
+ state->window = (unsigned char FAR *)
+ ZALLOC(strm, 1U << state->wbits,
+ sizeof(unsigned char));
+ if (state->window == Z_NULL) return 1;
+ }
+
+ /* if window not in use yet, initialize */
+ if (state->wsize == 0) {
+ state->wsize = 1U << state->wbits;
+ state->wnext = 0;
+ state->whave = 0;
+ }
+
+ /* copy state->wsize or less output bytes into the circular window */
+ if (copy >= state->wsize) {
+ zmemcpy(state->window, end - state->wsize, state->wsize);
+ state->wnext = 0;
+ state->whave = state->wsize;
+ }
+ else {
+ dist = state->wsize - state->wnext;
+ if (dist > copy) dist = copy;
+ zmemcpy(state->window + state->wnext, end - copy, dist);
+ copy -= dist;
+ if (copy) {
+ zmemcpy(state->window, end - copy, copy);
+ state->wnext = copy;
+ state->whave = state->wsize;
+ }
+ else {
+ state->wnext += dist;
+ if (state->wnext == state->wsize) state->wnext = 0;
+ if (state->whave < state->wsize) state->whave += dist;
+ }
+ }
+ return 0;
+}
+
+/* Macros for inflate(): */
+
+/* check function to use adler32() for zlib or crc32() for gzip */
+#ifdef GUNZIP
+# define UPDATE(check, buf, len) \
+ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
+#else
+# define UPDATE(check, buf, len) adler32(check, buf, len)
+#endif
+
+/* check macros for header crc */
+#ifdef GUNZIP
+# define CRC2(check, word) \
+ do { \
+ hbuf[0] = (unsigned char)(word); \
+ hbuf[1] = (unsigned char)((word) >> 8); \
+ check = crc32(check, hbuf, 2); \
+ } while (0)
+
+# define CRC4(check, word) \
+ do { \
+ hbuf[0] = (unsigned char)(word); \
+ hbuf[1] = (unsigned char)((word) >> 8); \
+ hbuf[2] = (unsigned char)((word) >> 16); \
+ hbuf[3] = (unsigned char)((word) >> 24); \
+ check = crc32(check, hbuf, 4); \
+ } while (0)
+#endif
+
+/* Load registers with state in inflate() for speed */
+#define LOAD() \
+ do { \
+ put = strm->next_out; \
+ left = strm->avail_out; \
+ next = strm->next_in; \
+ have = strm->avail_in; \
+ hold = state->hold; \
+ bits = state->bits; \
+ } while (0)
+
+/* Restore state from registers in inflate() */
+#define RESTORE() \
+ do { \
+ strm->next_out = put; \
+ strm->avail_out = left; \
+ strm->next_in = next; \
+ strm->avail_in = have; \
+ state->hold = hold; \
+ state->bits = bits; \
+ } while (0)
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+ do { \
+ hold = 0; \
+ bits = 0; \
+ } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflate()
+ if there is no input available. */
+#define PULLBYTE() \
+ do { \
+ if (have == 0) goto inf_leave; \
+ have--; \
+ hold += (unsigned long)(*next++) << bits; \
+ bits += 8; \
+ } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator. If there is
+ not enough available input to do that, then return from inflate(). */
+#define NEEDBITS(n) \
+ do { \
+ while (bits < (unsigned)(n)) \
+ PULLBYTE(); \
+ } while (0)
+
+/* Return the low n bits of the bit accumulator (n < 16) */
+#define BITS(n) \
+ ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+ do { \
+ hold >>= (n); \
+ bits -= (unsigned)(n); \
+ } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+ do { \
+ hold >>= bits & 7; \
+ bits -= bits & 7; \
+ } while (0)
+
+/*
+ inflate() uses a state machine to process as much input data and generate as
+ much output data as possible before returning. The state machine is
+ structured roughly as follows:
+
+ for (;;) switch (state) {
+ ...
+ case STATEn:
+ if (not enough input data or output space to make progress)
+ return;
+ ... make progress ...
+ state = STATEm;
+ break;
+ ...
+ }
+
+ so when inflate() is called again, the same case is attempted again, and
+ if the appropriate resources are provided, the machine proceeds to the
+ next state. The NEEDBITS() macro is usually the way the state evaluates
+ whether it can proceed or should return. NEEDBITS() does the return if
+ the requested bits are not available. The typical use of the BITS macros
+ is:
+
+ NEEDBITS(n);
+ ... do something with BITS(n) ...
+ DROPBITS(n);
+
+ where NEEDBITS(n) either returns from inflate() if there isn't enough
+ input left to load n bits into the accumulator, or it continues. BITS(n)
+ gives the low n bits in the accumulator. When done, DROPBITS(n) drops
+ the low n bits off the accumulator. INITBITS() clears the accumulator
+ and sets the number of available bits to zero. BYTEBITS() discards just
+ enough bits to put the accumulator on a byte boundary. After BYTEBITS()
+ and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
+
+ NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
+ if there is no input available. The decoding of variable length codes uses
+ PULLBYTE() directly in order to pull just enough bytes to decode the next
+ code, and no more.
+
+ Some states loop until they get enough input, making sure that enough
+ state information is maintained to continue the loop where it left off
+ if NEEDBITS() returns in the loop. For example, want, need, and keep
+ would all have to actually be part of the saved state in case NEEDBITS()
+ returns:
+
+ case STATEw:
+ while (want < need) {
+ NEEDBITS(n);
+ keep[want++] = BITS(n);
+ DROPBITS(n);
+ }
+ state = STATEx;
+ case STATEx:
+
+ As shown above, if the next state is also the next case, then the break
+ is omitted.
+
+ A state may also return if there is not enough output space available to
+ complete that state. Those states are copying stored data, writing a
+ literal byte, and copying a matching string.
+
+ When returning, a "goto inf_leave" is used to update the total counters,
+ update the check value, and determine whether any progress has been made
+ during that inflate() call in order to return the proper return code.
+ Progress is defined as a change in either strm->avail_in or strm->avail_out.
+ When there is a window, goto inf_leave will update the window with the last
+ output written. If a goto inf_leave occurs in the middle of decompression
+ and there is no window currently, goto inf_leave will create one and copy
+ output to the window for the next call of inflate().
+
+ In this implementation, the flush parameter of inflate() only affects the
+ return code (per zlib.h). inflate() always writes as much as possible to
+ strm->next_out, given the space available and the provided input--the effect
+ documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
+ the allocation of and copying into a sliding window until necessary, which
+ provides the effect documented in zlib.h for Z_FINISH when the entire input
+ stream available. So the only thing the flush parameter actually does is:
+ when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
+ will return Z_BUF_ERROR if it has not reached the end of the stream.
+ */
+
+int ZEXPORT inflate(strm, flush)
+z_streamp strm;
+int flush;
+{
+ struct inflate_state FAR *state;
+ z_const unsigned char FAR *next; /* next input */
+ unsigned char FAR *put; /* next output */
+ unsigned have, left; /* available input and output */
+ unsigned long hold; /* bit buffer */
+ unsigned bits; /* bits in bit buffer */
+ unsigned in, out; /* save starting available input and output */
+ unsigned copy; /* number of stored or match bytes to copy */
+ unsigned char FAR *from; /* where to copy match bytes from */
+ code here; /* current decoding table entry */
+ code last; /* parent table entry */
+ unsigned len; /* length to copy for repeats, bits to drop */
+ int ret; /* return code */
+#ifdef GUNZIP
+ unsigned char hbuf[4]; /* buffer for gzip header crc calculation */
+#endif
+ static const unsigned short order[19] = /* permutation of code lengths */
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+ if (inflateStateCheck(strm) || strm->next_out == Z_NULL ||
+ (strm->next_in == Z_NULL && strm->avail_in != 0))
+ return Z_STREAM_ERROR;
+
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
+ LOAD();
+ in = have;
+ out = left;
+ ret = Z_OK;
+ for (;;)
+ switch (state->mode) {
+ case HEAD:
+ if (state->wrap == 0) {
+ state->mode = TYPEDO;
+ break;
+ }
+ NEEDBITS(16);
+#ifdef GUNZIP
+ if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
+ if (state->wbits == 0)
+ state->wbits = 15;
+ state->check = crc32(0L, Z_NULL, 0);
+ CRC2(state->check, hold);
+ INITBITS();
+ state->mode = FLAGS;
+ break;
+ }
+ state->flags = 0; /* expect zlib header */
+ if (state->head != Z_NULL)
+ state->head->done = -1;
+ if (!(state->wrap & 1) || /* check if zlib header allowed */
+#else
+ if (
+#endif
+ ((BITS(8) << 8) + (hold >> 8)) % 31) {
+ strm->msg = (char *)"incorrect header check";
+ state->mode = BAD;
+ break;
+ }
+ if (BITS(4) != Z_DEFLATED) {
+ strm->msg = (char *)"unknown compression method";
+ state->mode = BAD;
+ break;
+ }
+ DROPBITS(4);
+ len = BITS(4) + 8;
+ if (state->wbits == 0)
+ state->wbits = len;
+ if (len > 15 || len > state->wbits) {
+ strm->msg = (char *)"invalid window size";
+ state->mode = BAD;
+ break;
+ }
+ state->dmax = 1U << len;
+ Tracev((stderr, "inflate: zlib header ok\n"));
+ strm->adler = state->check = adler32(0L, Z_NULL, 0);
+ state->mode = hold & 0x200 ? DICTID : TYPE;
+ INITBITS();
+ break;
+#ifdef GUNZIP
+ case FLAGS:
+ NEEDBITS(16);
+ state->flags = (int)(hold);
+ if ((state->flags & 0xff) != Z_DEFLATED) {
+ strm->msg = (char *)"unknown compression method";
+ state->mode = BAD;
+ break;
+ }
+ if (state->flags & 0xe000) {
+ strm->msg = (char *)"unknown header flags set";
+ state->mode = BAD;
+ break;
+ }
+ if (state->head != Z_NULL)
+ state->head->text = (int)((hold >> 8) & 1);
+ if ((state->flags & 0x0200) && (state->wrap & 4))
+ CRC2(state->check, hold);
+ INITBITS();
+ state->mode = TIME;
+ case TIME:
+ NEEDBITS(32);
+ if (state->head != Z_NULL)
+ state->head->time = hold;
+ if ((state->flags & 0x0200) && (state->wrap & 4))
+ CRC4(state->check, hold);
+ INITBITS();
+ state->mode = OS;
+ case OS:
+ NEEDBITS(16);
+ if (state->head != Z_NULL) {
+ state->head->xflags = (int)(hold & 0xff);
+ state->head->os = (int)(hold >> 8);
+ }
+ if ((state->flags & 0x0200) && (state->wrap & 4))
+ CRC2(state->check, hold);
+ INITBITS();
+ state->mode = EXLEN;
+ case EXLEN:
+ if (state->flags & 0x0400) {
+ NEEDBITS(16);
+ state->length = (unsigned)(hold);
+ if (state->head != Z_NULL)
+ state->head->extra_len = (unsigned)hold;
+ if ((state->flags & 0x0200) && (state->wrap & 4))
+ CRC2(state->check, hold);
+ INITBITS();
+ }
+ else if (state->head != Z_NULL)
+ state->head->extra = Z_NULL;
+ state->mode = EXTRA;
+ case EXTRA:
+ if (state->flags & 0x0400) {
+ copy = state->length;
+ if (copy > have) copy = have;
+ if (copy) {
+ if (state->head != Z_NULL &&
+ state->head->extra != Z_NULL) {
+ len = state->head->extra_len - state->length;
+ zmemcpy(state->head->extra + len, next,
+ len + copy > state->head->extra_max ?
+ state->head->extra_max - len : copy);
+ }
+ if ((state->flags & 0x0200) && (state->wrap & 4))
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ state->length -= copy;
+ }
+ if (state->length) goto inf_leave;
+ }
+ state->length = 0;
+ state->mode = NAME;
+ case NAME:
+ if (state->flags & 0x0800) {
+ if (have == 0) goto inf_leave;
+ copy = 0;
+ do {
+ len = (unsigned)(next[copy++]);
+ if (state->head != Z_NULL &&
+ state->head->name != Z_NULL &&
+ state->length < state->head->name_max)
+ state->head->name[state->length++] = (Bytef)len;
+ } while (len && copy < have);
+ if ((state->flags & 0x0200) && (state->wrap & 4))
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ if (len) goto inf_leave;
+ }
+ else if (state->head != Z_NULL)
+ state->head->name = Z_NULL;
+ state->length = 0;
+ state->mode = COMMENT;
+ case COMMENT:
+ if (state->flags & 0x1000) {
+ if (have == 0) goto inf_leave;
+ copy = 0;
+ do {
+ len = (unsigned)(next[copy++]);
+ if (state->head != Z_NULL &&
+ state->head->comment != Z_NULL &&
+ state->length < state->head->comm_max)
+ state->head->comment[state->length++] = (Bytef)len;
+ } while (len && copy < have);
+ if ((state->flags & 0x0200) && (state->wrap & 4))
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ if (len) goto inf_leave;
+ }
+ else if (state->head != Z_NULL)
+ state->head->comment = Z_NULL;
+ state->mode = HCRC;
+ case HCRC:
+ if (state->flags & 0x0200) {
+ NEEDBITS(16);
+ if ((state->wrap & 4) && hold != (state->check & 0xffff)) {
+ strm->msg = (char *)"header crc mismatch";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ }
+ if (state->head != Z_NULL) {
+ state->head->hcrc = (int)((state->flags >> 9) & 1);
+ state->head->done = 1;
+ }
+ strm->adler = state->check = crc32(0L, Z_NULL, 0);
+ state->mode = TYPE;
+ break;
+#endif
+ case DICTID:
+ NEEDBITS(32);
+ strm->adler = state->check = ZSWAP32(hold);
+ INITBITS();
+ state->mode = DICT;
+ case DICT:
+ if (state->havedict == 0) {
+ RESTORE();
+ return Z_NEED_DICT;
+ }
+ strm->adler = state->check = adler32(0L, Z_NULL, 0);
+ state->mode = TYPE;
+ case TYPE:
+ if (flush == Z_BLOCK || flush == Z_TREES) goto inf_leave;
+ case TYPEDO:
+ if (state->last) {
+ BYTEBITS();
+ state->mode = CHECK;
+ break;
+ }
+ NEEDBITS(3);
+ state->last = BITS(1);
+ DROPBITS(1);
+ switch (BITS(2)) {
+ case 0: /* stored block */
+ Tracev((stderr, "inflate: stored block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = STORED;
+ break;
+ case 1: /* fixed block */
+ fixedtables(state);
+ Tracev((stderr, "inflate: fixed codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = LEN_; /* decode codes */
+ if (flush == Z_TREES) {
+ DROPBITS(2);
+ goto inf_leave;
+ }
+ break;
+ case 2: /* dynamic block */
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = TABLE;
+ break;
+ case 3:
+ strm->msg = (char *)"invalid block type";
+ state->mode = BAD;
+ }
+ DROPBITS(2);
+ break;
+ case STORED:
+ BYTEBITS(); /* go to byte boundary */
+ NEEDBITS(32);
+ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+ strm->msg = (char *)"invalid stored block lengths";
+ state->mode = BAD;
+ break;
+ }
+ state->length = (unsigned)hold & 0xffff;
+ Tracev((stderr, "inflate: stored length %u\n",
+ state->length));
+ INITBITS();
+ state->mode = COPY_;
+ if (flush == Z_TREES) goto inf_leave;
+ case COPY_:
+ state->mode = COPY;
+ case COPY:
+ copy = state->length;
+ if (copy) {
+ if (copy > have) copy = have;
+ if (copy > left) copy = left;
+ if (copy == 0) goto inf_leave;
+ zmemcpy(put, next, copy);
+ have -= copy;
+ next += copy;
+ left -= copy;
+ put += copy;
+ state->length -= copy;
+ break;
+ }
+ Tracev((stderr, "inflate: stored end\n"));
+ state->mode = TYPE;
+ break;
+ case TABLE:
+ NEEDBITS(14);
+ state->nlen = BITS(5) + 257;
+ DROPBITS(5);
+ state->ndist = BITS(5) + 1;
+ DROPBITS(5);
+ state->ncode = BITS(4) + 4;
+ DROPBITS(4);
+#ifndef PKZIP_BUG_WORKAROUND
+ if (state->nlen > 286 || state->ndist > 30) {
+ strm->msg = (char *)"too many length or distance symbols";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ Tracev((stderr, "inflate: table sizes ok\n"));
+ state->have = 0;
+ state->mode = LENLENS;
+ case LENLENS:
+ while (state->have < state->ncode) {
+ NEEDBITS(3);
+ state->lens[order[state->have++]] = (unsigned short)BITS(3);
+ DROPBITS(3);
+ }
+ while (state->have < 19)
+ state->lens[order[state->have++]] = 0;
+ state->next = state->codes;
+ state->lencode = (const code FAR *)(state->next);
+ state->lenbits = 7;
+ ret = inflate_table(CODES, state->lens, 19, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid code lengths set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: code lengths ok\n"));
+ state->have = 0;
+ state->mode = CODELENS;
+ case CODELENS:
+ while (state->have < state->nlen + state->ndist) {
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.val < 16) {
+ DROPBITS(here.bits);
+ state->lens[state->have++] = here.val;
+ }
+ else {
+ if (here.val == 16) {
+ NEEDBITS(here.bits + 2);
+ DROPBITS(here.bits);
+ if (state->have == 0) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ len = state->lens[state->have - 1];
+ copy = 3 + BITS(2);
+ DROPBITS(2);
+ }
+ else if (here.val == 17) {
+ NEEDBITS(here.bits + 3);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 3 + BITS(3);
+ DROPBITS(3);
+ }
+ else {
+ NEEDBITS(here.bits + 7);
+ DROPBITS(here.bits);
+ len = 0;
+ copy = 11 + BITS(7);
+ DROPBITS(7);
+ }
+ if (state->have + copy > state->nlen + state->ndist) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ while (copy--)
+ state->lens[state->have++] = (unsigned short)len;
+ }
+ }
+
+ /* handle error breaks in while */
+ if (state->mode == BAD) break;
+
+ /* check for end-of-block code (better have one) */
+ if (state->lens[256] == 0) {
+ strm->msg = (char *)"invalid code -- missing end-of-block";
+ state->mode = BAD;
+ break;
+ }
+
+ /* build code tables -- note: do not change the lenbits or distbits
+ values here (9 and 6) without reading the comments in inftrees.h
+ concerning the ENOUGH constants, which depend on those values */
+ state->next = state->codes;
+ state->lencode = (const code FAR *)(state->next);
+ state->lenbits = 9;
+ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid literal/lengths set";
+ state->mode = BAD;
+ break;
+ }
+ state->distcode = (const code FAR *)(state->next);
+ state->distbits = 6;
+ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+ &(state->next), &(state->distbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid distances set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: codes ok\n"));
+ state->mode = LEN_;
+ if (flush == Z_TREES) goto inf_leave;
+ case LEN_:
+ state->mode = LEN;
+ case LEN:
+ if (have >= 6 && left >= 258) {
+ RESTORE();
+ inflate_fast(strm, out);
+ LOAD();
+ if (state->mode == TYPE)
+ state->back = -1;
+ break;
+ }
+ state->back = 0;
+ for (;;) {
+ here = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (here.op && (here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->lencode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ state->back += last.bits;
+ }
+ DROPBITS(here.bits);
+ state->back += here.bits;
+ state->length = (unsigned)here.val;
+ if ((int)(here.op) == 0) {
+ Tracevv((stderr, here.val >= 0x20 && here.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", here.val));
+ state->mode = LIT;
+ break;
+ }
+ if (here.op & 32) {
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->back = -1;
+ state->mode = TYPE;
+ break;
+ }
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+ state->extra = (unsigned)(here.op) & 15;
+ state->mode = LENEXT;
+ case LENEXT:
+ if (state->extra) {
+ NEEDBITS(state->extra);
+ state->length += BITS(state->extra);
+ DROPBITS(state->extra);
+ state->back += state->extra;
+ }
+ Tracevv((stderr, "inflate: length %u\n", state->length));
+ state->was = state->length;
+ state->mode = DIST;
+ case DIST:
+ for (;;) {
+ here = state->distcode[BITS(state->distbits)];
+ if ((unsigned)(here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if ((here.op & 0xf0) == 0) {
+ last = here;
+ for (;;) {
+ here = state->distcode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + here.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ state->back += last.bits;
+ }
+ DROPBITS(here.bits);
+ state->back += here.bits;
+ if (here.op & 64) {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ state->offset = (unsigned)here.val;
+ state->extra = (unsigned)(here.op) & 15;
+ state->mode = DISTEXT;
+ case DISTEXT:
+ if (state->extra) {
+ NEEDBITS(state->extra);
+ state->offset += BITS(state->extra);
+ DROPBITS(state->extra);
+ state->back += state->extra;
+ }
+#ifdef INFLATE_STRICT
+ if (state->offset > state->dmax) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ Tracevv((stderr, "inflate: distance %u\n", state->offset));
+ state->mode = MATCH;
+ case MATCH:
+ if (left == 0) goto inf_leave;
+ copy = out - left;
+ if (state->offset > copy) { /* copy from window */
+ copy = state->offset - copy;
+ if (copy > state->whave) {
+ if (state->sane) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ Trace((stderr, "inflate.c too far\n"));
+ copy -= state->whave;
+ if (copy > state->length) copy = state->length;
+ if (copy > left) copy = left;
+ left -= copy;
+ state->length -= copy;
+ do {
+ *put++ = 0;
+ } while (--copy);
+ if (state->length == 0) state->mode = LEN;
+ break;
+#endif
+ }
+ if (copy > state->wnext) {
+ copy -= state->wnext;
+ from = state->window + (state->wsize - copy);
+ }
+ else
+ from = state->window + (state->wnext - copy);
+ if (copy > state->length) copy = state->length;
+ }
+ else { /* copy from output */
+ from = put - state->offset;
+ copy = state->length;
+ }
+ if (copy > left) copy = left;
+ left -= copy;
+ state->length -= copy;
+ do {
+ *put++ = *from++;
+ } while (--copy);
+ if (state->length == 0) state->mode = LEN;
+ break;
+ case LIT:
+ if (left == 0) goto inf_leave;
+ *put++ = (unsigned char)(state->length);
+ left--;
+ state->mode = LEN;
+ break;
+ case CHECK:
+ if (state->wrap) {
+ NEEDBITS(32);
+ out -= left;
+ strm->total_out += out;
+ state->total += out;
+ if ((state->wrap & 4) && out)
+ strm->adler = state->check =
+ UPDATE(state->check, put - out, out);
+ out = left;
+ if ((state->wrap & 4) && (
+#ifdef GUNZIP
+ state->flags ? hold :
+#endif
+ ZSWAP32(hold)) != state->check) {
+ strm->msg = (char *)"incorrect data check";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ Tracev((stderr, "inflate: check matches trailer\n"));
+ }
+#ifdef GUNZIP
+ state->mode = LENGTH;
+ case LENGTH:
+ if (state->wrap && state->flags) {
+ NEEDBITS(32);
+ if (hold != (state->total & 0xffffffffUL)) {
+ strm->msg = (char *)"incorrect length check";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ Tracev((stderr, "inflate: length matches trailer\n"));
+ }
+#endif
+ state->mode = DONE;
+ case DONE:
+ ret = Z_STREAM_END;
+ goto inf_leave;
+ case BAD:
+ ret = Z_DATA_ERROR;
+ goto inf_leave;
+ case MEM:
+ return Z_MEM_ERROR;
+ case SYNC:
+ default:
+ return Z_STREAM_ERROR;
+ }
+
+ /*
+ Return from inflate(), updating the total counts and the check value.
+ If there was no progress during the inflate() call, return a buffer
+ error. Call updatewindow() to create and/or update the window state.
+ Note: a memory error from inflate() is non-recoverable.
+ */
+ inf_leave:
+ RESTORE();
+ if (state->wsize || (out != strm->avail_out && state->mode < BAD &&
+ (state->mode < CHECK || flush != Z_FINISH)))
+ if (updatewindow(strm, strm->next_out, out - strm->avail_out)) {
+ state->mode = MEM;
+ return Z_MEM_ERROR;
+ }
+ in -= strm->avail_in;
+ out -= strm->avail_out;
+ strm->total_in += in;
+ strm->total_out += out;
+ state->total += out;
+ if ((state->wrap & 4) && out)
+ strm->adler = state->check =
+ UPDATE(state->check, strm->next_out - out, out);
+ strm->data_type = (int)state->bits + (state->last ? 64 : 0) +
+ (state->mode == TYPE ? 128 : 0) +
+ (state->mode == LEN_ || state->mode == COPY_ ? 256 : 0);
+ if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
+ ret = Z_BUF_ERROR;
+ return ret;
+}
+
+int ZEXPORT inflateEnd(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+ if (inflateStateCheck(strm))
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->window != Z_NULL) ZFREE(strm, state->window);
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+ Tracev((stderr, "inflate: end\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateGetDictionary(strm, dictionary, dictLength)
+z_streamp strm;
+Bytef *dictionary;
+uInt *dictLength;
+{
+ struct inflate_state FAR *state;
+
+ /* check state */
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* copy dictionary */
+ if (state->whave && dictionary != Z_NULL) {
+ zmemcpy(dictionary, state->window + state->wnext,
+ state->whave - state->wnext);
+ zmemcpy(dictionary + state->whave - state->wnext,
+ state->window, state->wnext);
+ }
+ if (dictLength != Z_NULL)
+ *dictLength = state->whave;
+ return Z_OK;
+}
+
+int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
+z_streamp strm;
+const Bytef *dictionary;
+uInt dictLength;
+{
+ struct inflate_state FAR *state;
+ unsigned long dictid;
+ int ret;
+
+ /* check state */
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->wrap != 0 && state->mode != DICT)
+ return Z_STREAM_ERROR;
+
+ /* check for correct dictionary identifier */
+ if (state->mode == DICT) {
+ dictid = adler32(0L, Z_NULL, 0);
+ dictid = adler32(dictid, dictionary, dictLength);
+ if (dictid != state->check)
+ return Z_DATA_ERROR;
+ }
+
+ /* copy dictionary to window using updatewindow(), which will amend the
+ existing dictionary if appropriate */
+ ret = updatewindow(strm, dictionary + dictLength, dictLength);
+ if (ret) {
+ state->mode = MEM;
+ return Z_MEM_ERROR;
+ }
+ state->havedict = 1;
+ Tracev((stderr, "inflate: dictionary set\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateGetHeader(strm, head)
+z_streamp strm;
+gz_headerp head;
+{
+ struct inflate_state FAR *state;
+
+ /* check state */
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
+
+ /* save header structure */
+ state->head = head;
+ head->done = 0;
+ return Z_OK;
+}
+
+/*
+ Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found
+ or when out of input. When called, *have is the number of pattern bytes
+ found in order so far, in 0..3. On return *have is updated to the new
+ state. If on return *have equals four, then the pattern was found and the
+ return value is how many bytes were read including the last byte of the
+ pattern. If *have is less than four, then the pattern has not been found
+ yet and the return value is len. In the latter case, syncsearch() can be
+ called again with more data and the *have state. *have is initialized to
+ zero for the first call.
+ */
+local unsigned syncsearch(have, buf, len)
+unsigned FAR *have;
+const unsigned char FAR *buf;
+unsigned len;
+{
+ unsigned got;
+ unsigned next;
+
+ got = *have;
+ next = 0;
+ while (next < len && got < 4) {
+ if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
+ got++;
+ else if (buf[next])
+ got = 0;
+ else
+ got = 4 - got;
+ next++;
+ }
+ *have = got;
+ return next;
+}
+
+int ZEXPORT inflateSync(strm)
+z_streamp strm;
+{
+ unsigned len; /* number of bytes to look at or looked at */
+ unsigned long in, out; /* temporary to save total_in and total_out */
+ unsigned char buf[4]; /* to restore bit buffer to byte string */
+ struct inflate_state FAR *state;
+
+ /* check parameters */
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
+
+ /* if first time, start search in bit buffer */
+ if (state->mode != SYNC) {
+ state->mode = SYNC;
+ state->hold <<= state->bits & 7;
+ state->bits -= state->bits & 7;
+ len = 0;
+ while (state->bits >= 8) {
+ buf[len++] = (unsigned char)(state->hold);
+ state->hold >>= 8;
+ state->bits -= 8;
+ }
+ state->have = 0;
+ syncsearch(&(state->have), buf, len);
+ }
+
+ /* search available input */
+ len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
+ strm->avail_in -= len;
+ strm->next_in += len;
+ strm->total_in += len;
+
+ /* return no joy or set up to restart inflate() on a new block */
+ if (state->have != 4) return Z_DATA_ERROR;
+ in = strm->total_in; out = strm->total_out;
+ inflateReset(strm);
+ strm->total_in = in; strm->total_out = out;
+ state->mode = TYPE;
+ return Z_OK;
+}
+
+/*
+ Returns true if inflate is currently at the end of a block generated by
+ Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
+ implementation to provide an additional safety check. PPP uses
+ Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
+ block. When decompressing, PPP checks that at the end of input packet,
+ inflate is waiting for these length bytes.
+ */
+int ZEXPORT inflateSyncPoint(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ return state->mode == STORED && state->bits == 0;
+}
+
+int ZEXPORT inflateCopy(dest, source)
+z_streamp dest;
+z_streamp source;
+{
+ struct inflate_state FAR *state;
+ struct inflate_state FAR *copy;
+ unsigned char FAR *window;
+ unsigned wsize;
+
+ /* check input */
+ if (inflateStateCheck(source) || dest == Z_NULL)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)source->state;
+
+ /* allocate space */
+ copy = (struct inflate_state FAR *)
+ ZALLOC(source, 1, sizeof(struct inflate_state));
+ if (copy == Z_NULL) return Z_MEM_ERROR;
+ window = Z_NULL;
+ if (state->window != Z_NULL) {
+ window = (unsigned char FAR *)
+ ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
+ if (window == Z_NULL) {
+ ZFREE(source, copy);
+ return Z_MEM_ERROR;
+ }
+ }
+
+ /* copy state */
+ zmemcpy((voidpf)dest, (voidpf)source, sizeof(z_stream));
+ zmemcpy((voidpf)copy, (voidpf)state, sizeof(struct inflate_state));
+ copy->strm = dest;
+ if (state->lencode >= state->codes &&
+ state->lencode <= state->codes + ENOUGH - 1) {
+ copy->lencode = copy->codes + (state->lencode - state->codes);
+ copy->distcode = copy->codes + (state->distcode - state->codes);
+ }
+ copy->next = copy->codes + (state->next - state->codes);
+ if (window != Z_NULL) {
+ wsize = 1U << state->wbits;
+ zmemcpy(window, state->window, wsize);
+ }
+ copy->window = window;
+ dest->state = (struct internal_state FAR *)copy;
+ return Z_OK;
+}
+
+int ZEXPORT inflateUndermine(strm, subvert)
+z_streamp strm;
+int subvert;
+{
+ struct inflate_state FAR *state;
+
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+#ifdef INFLATE_ALLOW_INVALID_DISTANCE_TOOFAR_ARRR
+ state->sane = !subvert;
+ return Z_OK;
+#else
+ (void)subvert;
+ state->sane = 1;
+ return Z_DATA_ERROR;
+#endif
+}
+
+int ZEXPORT inflateValidate(strm, check)
+z_streamp strm;
+int check;
+{
+ struct inflate_state FAR *state;
+
+ if (inflateStateCheck(strm)) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (check)
+ state->wrap |= 4;
+ else
+ state->wrap &= ~4;
+ return Z_OK;
+}
+
+long ZEXPORT inflateMark(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (inflateStateCheck(strm))
+ return -(1L << 16);
+ state = (struct inflate_state FAR *)strm->state;
+ return (long)(((unsigned long)((long)state->back)) << 16) +
+ (state->mode == COPY ? state->length :
+ (state->mode == MATCH ? state->was - state->length : 0));
+}
+
+unsigned long ZEXPORT inflateCodesUsed(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+ if (inflateStateCheck(strm)) return (unsigned long)-1;
+ state = (struct inflate_state FAR *)strm->state;
+ return (unsigned long)(state->next - state->codes);
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.h
new file mode 100644
index 000000000..a46cce6b6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/inflate.h
@@ -0,0 +1,125 @@
+/* inflate.h -- internal inflate state definition
+ * Copyright (C) 1995-2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+ trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
+ the crc code when it is not needed. For shared libraries, gzip decoding
+ should be left enabled. */
+#ifndef NO_GZIP
+# define GUNZIP
+#endif
+
+/* Possible inflate modes between inflate() calls */
+typedef enum {
+ HEAD = 16180, /* i: waiting for magic header */
+ FLAGS, /* i: waiting for method and flags (gzip) */
+ TIME, /* i: waiting for modification time (gzip) */
+ OS, /* i: waiting for extra flags and operating system (gzip) */
+ EXLEN, /* i: waiting for extra length (gzip) */
+ EXTRA, /* i: waiting for extra bytes (gzip) */
+ NAME, /* i: waiting for end of file name (gzip) */
+ COMMENT, /* i: waiting for end of comment (gzip) */
+ HCRC, /* i: waiting for header crc (gzip) */
+ DICTID, /* i: waiting for dictionary check value */
+ DICT, /* waiting for inflateSetDictionary() call */
+ TYPE, /* i: waiting for type bits, including last-flag bit */
+ TYPEDO, /* i: same, but skip check to exit inflate on new block */
+ STORED, /* i: waiting for stored size (length and complement) */
+ COPY_, /* i/o: same as COPY below, but only first time in */
+ COPY, /* i/o: waiting for input or output to copy stored block */
+ TABLE, /* i: waiting for dynamic block table lengths */
+ LENLENS, /* i: waiting for code length code lengths */
+ CODELENS, /* i: waiting for length/lit and distance code lengths */
+ LEN_, /* i: same as LEN below, but only first time in */
+ LEN, /* i: waiting for length/lit/eob code */
+ LENEXT, /* i: waiting for length extra bits */
+ DIST, /* i: waiting for distance code */
+ DISTEXT, /* i: waiting for distance extra bits */
+ MATCH, /* o: waiting for output space to copy string */
+ LIT, /* o: waiting for output space to write literal */
+ CHECK, /* i: waiting for 32-bit check value */
+ LENGTH, /* i: waiting for 32-bit length (gzip) */
+ DONE, /* finished check, done -- remain here until reset */
+ BAD, /* got a data error -- remain here until reset */
+ MEM, /* got an inflate() memory error -- remain here until reset */
+ SYNC /* looking for synchronization bytes to restart inflate() */
+} inflate_mode;
+
+/*
+ State transitions between above modes -
+
+ (most modes can go to BAD or MEM on error -- not shown for clarity)
+
+ Process header:
+ HEAD -> (gzip) or (zlib) or (raw)
+ (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME -> COMMENT ->
+ HCRC -> TYPE
+ (zlib) -> DICTID or TYPE
+ DICTID -> DICT -> TYPE
+ (raw) -> TYPEDO
+ Read deflate blocks:
+ TYPE -> TYPEDO -> STORED or TABLE or LEN_ or CHECK
+ STORED -> COPY_ -> COPY -> TYPE
+ TABLE -> LENLENS -> CODELENS -> LEN_
+ LEN_ -> LEN
+ Read deflate codes in fixed or dynamic block:
+ LEN -> LENEXT or LIT or TYPE
+ LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
+ LIT -> LEN
+ Process trailer:
+ CHECK -> LENGTH -> DONE
+ */
+
+/* State maintained between inflate() calls -- approximately 7K bytes, not
+ including the allocated sliding window, which is up to 32K bytes. */
+struct inflate_state {
+ z_streamp strm; /* pointer back to this zlib stream */
+ inflate_mode mode; /* current inflate mode */
+ int last; /* true if processing last block */
+ int wrap; /* bit 0 true for zlib, bit 1 true for gzip,
+ bit 2 true to validate check value */
+ int havedict; /* true if dictionary provided */
+ int flags; /* gzip header method and flags (0 if zlib) */
+ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
+ unsigned long check; /* protected copy of check value */
+ unsigned long total; /* protected copy of output count */
+ gz_headerp head; /* where to save gzip header information */
+ /* sliding window */
+ unsigned wbits; /* log base 2 of requested window size */
+ unsigned wsize; /* window size or zero if not using window */
+ unsigned whave; /* valid bytes in the window */
+ unsigned wnext; /* window write index */
+ unsigned char FAR *window; /* allocated sliding window, if needed */
+ /* bit accumulator */
+ unsigned long hold; /* input bit accumulator */
+ unsigned bits; /* number of bits in "in" */
+ /* for string and stored block copying */
+ unsigned length; /* literal or length of data to copy */
+ unsigned offset; /* distance back to copy string from */
+ /* for table and code decoding */
+ unsigned extra; /* extra bits needed */
+ /* fixed and dynamic code tables */
+ code const FAR *lencode; /* starting table for length/literal codes */
+ code const FAR *distcode; /* starting table for distance codes */
+ unsigned lenbits; /* index bits for lencode */
+ unsigned distbits; /* index bits for distcode */
+ /* dynamic table building */
+ unsigned ncode; /* number of code length code lengths */
+ unsigned nlen; /* number of length code lengths */
+ unsigned ndist; /* number of distance code lengths */
+ unsigned have; /* number of code lengths in lens[] */
+ code FAR *next; /* next available space in codes[] */
+ unsigned short lens[320]; /* temporary storage for code lengths */
+ unsigned short work[288]; /* work area for code table building */
+ code codes[ENOUGH]; /* space for code tables */
+ int sane; /* if false, allow invalid distance too far */
+ int back; /* bits back of last unprocessed length/lit */
+ unsigned was; /* initial length of match */
+};
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.c
new file mode 100644
index 000000000..2ea08fc13
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.c
@@ -0,0 +1,304 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-2017 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+
+#define MAXBITS 15
+
+const char inflate_copyright[] =
+ " inflate 1.2.11 Copyright 1995-2017 Mark Adler ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/*
+ Build a set of tables to decode the provided canonical Huffman code.
+ The code lengths are lens[0..codes-1]. The result starts at *table,
+ whose indices are 0..2^bits-1. work is a writable array of at least
+ lens shorts, which is used as a work area. type is the type of code
+ to be generated, CODES, LENS, or DISTS. On return, zero is success,
+ -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
+ on return points to the next available entry's address. bits is the
+ requested root table index bits, and on return it is the actual root
+ table index bits. It will differ if the request is greater than the
+ longest code or if it is less than the shortest code.
+ */
+int ZLIB_INTERNAL inflate_table(type, lens, codes, table, bits, work)
+codetype type;
+unsigned short FAR *lens;
+unsigned codes;
+code FAR * FAR *table;
+unsigned FAR *bits;
+unsigned short FAR *work;
+{
+ unsigned len; /* a code's length in bits */
+ unsigned sym; /* index of code symbols */
+ unsigned min, max; /* minimum and maximum code lengths */
+ unsigned root; /* number of index bits for root table */
+ unsigned curr; /* number of index bits for current table */
+ unsigned drop; /* code bits to drop for sub-table */
+ int left; /* number of prefix codes available */
+ unsigned used; /* code entries in table used */
+ unsigned huff; /* Huffman code */
+ unsigned incr; /* for incrementing code, index */
+ unsigned fill; /* index for replicating entries */
+ unsigned low; /* low bits for current root entry */
+ unsigned mask; /* mask for low root bits */
+ code here; /* table entry for duplication */
+ code FAR *next; /* next available space in table */
+ const unsigned short FAR *base; /* base value table to use */
+ const unsigned short FAR *extra; /* extra bits table to use */
+ unsigned match; /* use base and extra for symbol >= match */
+ unsigned short count[MAXBITS+1]; /* number of codes of each length */
+ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
+ static const unsigned short lbase[31] = { /* Length codes 257..285 base */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+ static const unsigned short lext[31] = { /* Length codes 257..285 extra */
+ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 77, 202};
+ static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+ 8193, 12289, 16385, 24577, 0, 0};
+ static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
+ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+ 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+ 28, 28, 29, 29, 64, 64};
+
+ /*
+ Process a set of code lengths to create a canonical Huffman code. The
+ code lengths are lens[0..codes-1]. Each length corresponds to the
+ symbols 0..codes-1. The Huffman code is generated by first sorting the
+ symbols by length from short to long, and retaining the symbol order
+ for codes with equal lengths. Then the code starts with all zero bits
+ for the first code of the shortest length, and the codes are integer
+ increments for the same length, and zeros are appended as the length
+ increases. For the deflate format, these bits are stored backwards
+ from their more natural integer increment ordering, and so when the
+ decoding tables are built in the large loop below, the integer codes
+ are incremented backwards.
+
+ This routine assumes, but does not check, that all of the entries in
+ lens[] are in the range 0..MAXBITS. The caller must assure this.
+ 1..MAXBITS is interpreted as that code length. zero means that that
+ symbol does not occur in this code.
+
+ The codes are sorted by computing a count of codes for each length,
+ creating from that a table of starting indices for each length in the
+ sorted table, and then entering the symbols in order in the sorted
+ table. The sorted table is work[], with that space being provided by
+ the caller.
+
+ The length counts are used for other purposes as well, i.e. finding
+ the minimum and maximum length codes, determining if there are any
+ codes at all, checking for a valid set of lengths, and looking ahead
+ at length counts to determine sub-table sizes when building the
+ decoding tables.
+ */
+
+ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+ for (len = 0; len <= MAXBITS; len++)
+ count[len] = 0;
+ for (sym = 0; sym < codes; sym++)
+ count[lens[sym]]++;
+
+ /* bound code lengths, force root to be within code lengths */
+ root = *bits;
+ for (max = MAXBITS; max >= 1; max--)
+ if (count[max] != 0) break;
+ if (root > max) root = max;
+ if (max == 0) { /* no symbols to code at all */
+ here.op = (unsigned char)64; /* invalid code marker */
+ here.bits = (unsigned char)1;
+ here.val = (unsigned short)0;
+ *(*table)++ = here; /* make a table to force an error */
+ *(*table)++ = here;
+ *bits = 1;
+ return 0; /* no symbols, but wait for decoding to report error */
+ }
+ for (min = 1; min < max; min++)
+ if (count[min] != 0) break;
+ if (root < min) root = min;
+
+ /* check for an over-subscribed or incomplete set of lengths */
+ left = 1;
+ for (len = 1; len <= MAXBITS; len++) {
+ left <<= 1;
+ left -= count[len];
+ if (left < 0) return -1; /* over-subscribed */
+ }
+ if (left > 0 && (type == CODES || max != 1))
+ return -1; /* incomplete set */
+
+ /* generate offsets into symbol table for each length for sorting */
+ offs[1] = 0;
+ for (len = 1; len < MAXBITS; len++)
+ offs[len + 1] = offs[len] + count[len];
+
+ /* sort symbols by length, by symbol order within each length */
+ for (sym = 0; sym < codes; sym++)
+ if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
+
+ /*
+ Create and fill in decoding tables. In this loop, the table being
+ filled is at next and has curr index bits. The code being used is huff
+ with length len. That code is converted to an index by dropping drop
+ bits off of the bottom. For codes where len is less than drop + curr,
+ those top drop + curr - len bits are incremented through all values to
+ fill the table with replicated entries.
+
+ root is the number of index bits for the root table. When len exceeds
+ root, sub-tables are created pointed to by the root entry with an index
+ of the low root bits of huff. This is saved in low to check for when a
+ new sub-table should be started. drop is zero when the root table is
+ being filled, and drop is root when sub-tables are being filled.
+
+ When a new sub-table is needed, it is necessary to look ahead in the
+ code lengths to determine what size sub-table is needed. The length
+ counts are used for this, and so count[] is decremented as codes are
+ entered in the tables.
+
+ used keeps track of how many table entries have been allocated from the
+ provided *table space. It is checked for LENS and DIST tables against
+ the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in
+ the initial root table size constants. See the comments in inftrees.h
+ for more information.
+
+ sym increments through all symbols, and the loop terminates when
+ all codes of length max, i.e. all codes, have been processed. This
+ routine permits incomplete codes, so another loop after this one fills
+ in the rest of the decoding tables with invalid code markers.
+ */
+
+ /* set up for code type */
+ switch (type) {
+ case CODES:
+ base = extra = work; /* dummy value--not used */
+ match = 20;
+ break;
+ case LENS:
+ base = lbase;
+ extra = lext;
+ match = 257;
+ break;
+ default: /* DISTS */
+ base = dbase;
+ extra = dext;
+ match = 0;
+ }
+
+ /* initialize state for loop */
+ huff = 0; /* starting code */
+ sym = 0; /* starting code symbol */
+ len = min; /* starting code length */
+ next = *table; /* current table to fill in */
+ curr = root; /* current table index bits */
+ drop = 0; /* current bits to drop from code for index */
+ low = (unsigned)(-1); /* trigger new sub-table when len > root */
+ used = 1U << root; /* use root table entries */
+ mask = used - 1; /* mask for comparing low */
+
+ /* check available table space */
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
+ return 1;
+
+ /* process all codes and make table entries */
+ for (;;) {
+ /* create table entry */
+ here.bits = (unsigned char)(len - drop);
+ if (work[sym] + 1U < match) {
+ here.op = (unsigned char)0;
+ here.val = work[sym];
+ }
+ else if (work[sym] >= match) {
+ here.op = (unsigned char)(extra[work[sym] - match]);
+ here.val = base[work[sym] - match];
+ }
+ else {
+ here.op = (unsigned char)(32 + 64); /* end of block */
+ here.val = 0;
+ }
+
+ /* replicate for those indices with low len bits equal to huff */
+ incr = 1U << (len - drop);
+ fill = 1U << curr;
+ min = fill; /* save offset to next table */
+ do {
+ fill -= incr;
+ next[(huff >> drop) + fill] = here;
+ } while (fill != 0);
+
+ /* backwards increment the len-bit code huff */
+ incr = 1U << (len - 1);
+ while (huff & incr)
+ incr >>= 1;
+ if (incr != 0) {
+ huff &= incr - 1;
+ huff += incr;
+ }
+ else
+ huff = 0;
+
+ /* go to next symbol, update count, len */
+ sym++;
+ if (--(count[len]) == 0) {
+ if (len == max) break;
+ len = lens[work[sym]];
+ }
+
+ /* create new sub-table if needed */
+ if (len > root && (huff & mask) != low) {
+ /* if first time, transition to sub-tables */
+ if (drop == 0)
+ drop = root;
+
+ /* increment past last table */
+ next += min; /* here min is 1 << curr */
+
+ /* determine length of next table */
+ curr = len - drop;
+ left = (int)(1 << curr);
+ while (curr + drop < max) {
+ left -= count[curr + drop];
+ if (left <= 0) break;
+ curr++;
+ left <<= 1;
+ }
+
+ /* check for enough space */
+ used += 1U << curr;
+ if ((type == LENS && used > ENOUGH_LENS) ||
+ (type == DISTS && used > ENOUGH_DISTS))
+ return 1;
+
+ /* point entry in root table to sub-table */
+ low = huff & mask;
+ (*table)[low].op = (unsigned char)curr;
+ (*table)[low].bits = (unsigned char)root;
+ (*table)[low].val = (unsigned short)(next - *table);
+ }
+ }
+
+ /* fill in remaining table entry if code is incomplete (guaranteed to have
+ at most one remaining entry, since if the code is incomplete, the
+ maximum code length that was allowed to get this far is one bit) */
+ if (huff != 0) {
+ here.op = (unsigned char)64; /* invalid code marker */
+ here.bits = (unsigned char)(len - drop);
+ here.val = (unsigned short)0;
+ next[huff] = here;
+ }
+
+ /* set return parameters */
+ *table += used;
+ *bits = root;
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.h
new file mode 100644
index 000000000..baa53a0b1
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/inftrees.h
@@ -0,0 +1,62 @@
+/* inftrees.h -- header to use inftrees.c
+ * Copyright (C) 1995-2005, 2010 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* Structure for decoding tables. Each entry provides either the
+ information needed to do the operation requested by the code that
+ indexed that table entry, or it provides a pointer to another
+ table that indexes more bits of the code. op indicates whether
+ the entry is a pointer to another table, a literal, a length or
+ distance, an end-of-block, or an invalid code. For a table
+ pointer, the low four bits of op is the number of index bits of
+ that table. For a length or distance, the low four bits of op
+ is the number of extra bits to get after the code. bits is
+ the number of bits in this code or part of the code to drop off
+ of the bit buffer. val is the actual byte to output in the case
+ of a literal, the base length or distance, or the offset from
+ the current table to the next table. Each entry is four bytes. */
+typedef struct {
+ unsigned char op; /* operation, extra bits, table bits */
+ unsigned char bits; /* bits in this part of the code */
+ unsigned short val; /* offset in table or code value */
+} code;
+
+/* op values as set by inflate_table():
+ 00000000 - literal
+ 0000tttt - table link, tttt != 0 is the number of table index bits
+ 0001eeee - length or distance, eeee is the number of extra bits
+ 01100000 - end of block
+ 01000000 - invalid code
+ */
+
+/* Maximum size of the dynamic table. The maximum number of code structures is
+ 1444, which is the sum of 852 for literal/length codes and 592 for distance
+ codes. These values were found by exhaustive searches using the program
+ examples/enough.c found in the zlib distribtution. The arguments to that
+ program are the number of symbols, the initial root table size, and the
+ maximum bit length of a code. "enough 286 9 15" for literal/length codes
+ returns returns 852, and "enough 30 6 15" for distance codes returns 592.
+ The initial root table size (9 or 6) is found in the fifth argument of the
+ inflate_table() calls in inflate.c and infback.c. If the root table size is
+ changed, then these maximum sizes would be need to be recalculated and
+ updated. */
+#define ENOUGH_LENS 852
+#define ENOUGH_DISTS 592
+#define ENOUGH (ENOUGH_LENS+ENOUGH_DISTS)
+
+/* Type of code to build for inflate_table() */
+typedef enum {
+ CODES,
+ LENS,
+ DISTS
+} codetype;
+
+int ZLIB_INTERNAL inflate_table OF((codetype type, unsigned short FAR *lens,
+ unsigned codes, code FAR * FAR *table,
+ unsigned FAR *bits, unsigned short FAR *work));
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/make_vms.com b/src/boost/libs/beast/test/extern/zlib-1.2.11/make_vms.com
new file mode 100644
index 000000000..65e9d0cbc
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/make_vms.com
@@ -0,0 +1,867 @@
+$! make libz under VMS written by
+$! Martin P.J. Zinser
+$!
+$! In case of problems with the install you might contact me at
+$! zinser@zinser.no-ip.info(preferred) or
+$! martin.zinser@eurexchange.com (work)
+$!
+$! Make procedure history for Zlib
+$!
+$!------------------------------------------------------------------------------
+$! Version history
+$! 0.01 20060120 First version to receive a number
+$! 0.02 20061008 Adapt to new Makefile.in
+$! 0.03 20091224 Add support for large file check
+$! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite
+$! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in
+$! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples
+$! subdir path, update module search in makefile.in
+$! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned
+$! shared image creation
+$! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared
+$! image
+$! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)).
+$! "" -> automatic, preference: MMK, MMS, built-in.
+$!
+$ on error then goto err_exit
+$!
+$ true = 1
+$ false = 0
+$ tmpnam = "temp_" + f$getjpi("","pid")
+$ tt = tmpnam + ".txt"
+$ tc = tmpnam + ".c"
+$ th = tmpnam + ".h"
+$ define/nolog tconfig 'th'
+$ its_decc = false
+$ its_vaxc = false
+$ its_gnuc = false
+$ s_case = False
+$!
+$! Setup variables holding "config" information
+$!
+$ Make = "''p1'"
+$ name = "Zlib"
+$ version = "?.?.?"
+$ v_string = "ZLIB_VERSION"
+$ v_file = "zlib.h"
+$ ccopt = "/include = []"
+$ lopts = ""
+$ dnsrl = ""
+$ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in"
+$ conf_check_string = ""
+$ linkonly = false
+$ optfile = name + ".opt"
+$ mapfile = name + ".map"
+$ libdefs = ""
+$ vax = f$getsyi("HW_MODEL").lt.1024
+$ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096
+$ ia64 = f$getsyi("HW_MODEL").ge.4096
+$!
+$! 2012-03-05 SMS.
+$! Why is this needed? And if it is needed, why not simply ".not. vax"?
+$!
+$!!! if axp .or. ia64 then set proc/parse=extended
+$!
+$ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL")
+$ mydef = F$parse(whoami,,,"DEVICE")
+$ mydir = f$parse(whoami,,,"DIRECTORY") - "]["
+$ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type")
+$!
+$! Check for MMK/MMS
+$!
+$ if (Make .eqs. "")
+$ then
+$ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS"
+$ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK"
+$ else
+$ Make = f$edit( Make, "trim")
+$ endif
+$!
+$ gosub find_version
+$!
+$ open/write topt tmp.opt
+$ open/write optf 'optfile'
+$!
+$ gosub check_opts
+$!
+$! Look for the compiler used
+$!
+$ gosub check_compiler
+$ close topt
+$ close optf
+$!
+$ if its_decc
+$ then
+$ ccopt = "/prefix=all" + ccopt
+$ if f$trnlnm("SYS") .eqs. ""
+$ then
+$ if axp
+$ then
+$ define sys sys$library:
+$ else
+$ ccopt = "/decc" + ccopt
+$ define sys decc$library_include:
+$ endif
+$ endif
+$!
+$! 2012-03-05 SMS.
+$! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX?
+$!
+$ if axp .or. ia64
+$ then
+$ ccopt = ccopt + "/name=as_is/opt=(inline=speed)"
+$ s_case = true
+$ endif
+$ endif
+$ if its_vaxc .or. its_gnuc
+$ then
+$ if f$trnlnm("SYS").eqs."" then define sys sys$library:
+$ endif
+$!
+$! Build a fake configure input header
+$!
+$ open/write conf_hin config.hin
+$ write conf_hin "#undef _LARGEFILE64_SOURCE"
+$ close conf_hin
+$!
+$!
+$ i = 0
+$FIND_ACONF:
+$ fname = f$element(i,"#",aconf_in_file)
+$ if fname .eqs. "#" then goto AMISS_ERR
+$ if f$search(fname) .eqs. ""
+$ then
+$ i = i + 1
+$ goto find_aconf
+$ endif
+$ open/read/err=aconf_err aconf_in 'fname'
+$ open/write aconf zconf.h
+$ACONF_LOOP:
+$ read/end_of_file=aconf_exit aconf_in line
+$ work = f$edit(line, "compress,trim")
+$ if f$extract(0,6,work) .nes. "#undef"
+$ then
+$ if f$extract(0,12,work) .nes. "#cmakedefine"
+$ then
+$ write aconf line
+$ endif
+$ else
+$ cdef = f$element(1," ",work)
+$ gosub check_config
+$ endif
+$ goto aconf_loop
+$ACONF_EXIT:
+$ write aconf ""
+$ write aconf "/* VMS specifics added by make_vms.com: */"
+$ write aconf "#define VMS 1"
+$ write aconf "#include <unistd.h>"
+$ write aconf "#include <unixio.h>"
+$ write aconf "#ifdef _LARGEFILE"
+$ write aconf "# define off64_t __off64_t"
+$ write aconf "# define fopen64 fopen"
+$ write aconf "# define fseeko64 fseeko"
+$ write aconf "# define lseek64 lseek"
+$ write aconf "# define ftello64 ftell"
+$ write aconf "#endif"
+$ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)"
+$ write aconf "# define HAVE_VSNPRINTF"
+$ write aconf "#endif"
+$ close aconf_in
+$ close aconf
+$ if f$search("''th'") .nes. "" then delete 'th';*
+$! Build the thing plain or with mms
+$!
+$ write sys$output "Compiling Zlib sources ..."
+$ if make.eqs.""
+$ then
+$ if (f$search( "example.obj;*") .nes. "") then delete example.obj;*
+$ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;*
+$ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" -
+ adler32.c zlib.h zconf.h
+$ CALL MAKE compress.OBJ "CC ''CCOPT' compress" -
+ compress.c zlib.h zconf.h
+$ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" -
+ crc32.c zlib.h zconf.h
+$ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" -
+ deflate.c deflate.h zutil.h zlib.h zconf.h
+$ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" -
+ gzclose.c zutil.h zlib.h zconf.h
+$ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" -
+ gzlib.c zutil.h zlib.h zconf.h
+$ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" -
+ gzread.c zutil.h zlib.h zconf.h
+$ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" -
+ gzwrite.c zutil.h zlib.h zconf.h
+$ CALL MAKE infback.OBJ "CC ''CCOPT' infback" -
+ infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h
+$ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" -
+ inffast.c zutil.h zlib.h zconf.h inffast.h
+$ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" -
+ inflate.c zutil.h zlib.h zconf.h infblock.h
+$ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" -
+ inftrees.c zutil.h zlib.h zconf.h inftrees.h
+$ CALL MAKE trees.OBJ "CC ''CCOPT' trees" -
+ trees.c deflate.h zutil.h zlib.h zconf.h
+$ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" -
+ uncompr.c zlib.h zconf.h
+$ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" -
+ zutil.c zutil.h zlib.h zconf.h
+$ write sys$output "Building Zlib ..."
+$ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ
+$ write sys$output "Building example..."
+$ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" -
+ [.test]example.c zlib.h zconf.h
+$ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb
+$ write sys$output "Building minigzip..."
+$ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" -
+ [.test]minigzip.c zlib.h zconf.h
+$ call make minigzip.exe -
+ "LINK minigzip,libz.olb/lib" -
+ minigzip.obj libz.olb
+$ else
+$ gosub crea_mms
+$ write sys$output "Make ''name' ''version' with ''Make' "
+$ 'make'
+$ endif
+$!
+$! Create shareable image
+$!
+$ gosub crea_olist
+$ write sys$output "Creating libzshr.exe"
+$ call map_2_shopt 'mapfile' 'optfile'
+$ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt
+$ write sys$output "Zlib build completed"
+$ delete/nolog tmp.opt;*
+$ exit
+$AMISS_ERR:
+$ write sys$output "No source for config.hin found."
+$ write sys$output "Tried any of ''aconf_in_file'"
+$ goto err_exit
+$CC_ERR:
+$ write sys$output "C compiler required to build ''name'"
+$ goto err_exit
+$ERR_EXIT:
+$ set message/facil/ident/sever/text
+$ close/nolog optf
+$ close/nolog topt
+$ close/nolog aconf_in
+$ close/nolog aconf
+$ close/nolog out
+$ close/nolog min
+$ close/nolog mod
+$ close/nolog h_in
+$ write sys$output "Exiting..."
+$ exit 2
+$!
+$!
+$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES
+$ V = 'F$Verify(0)
+$! P1 = What we are trying to make
+$! P2 = Command to make it
+$! P3 - P8 What it depends on
+$
+$ If F$Search(P1) .Eqs. "" Then Goto Makeit
+$ Time = F$CvTime(F$File(P1,"RDT"))
+$arg=3
+$Loop:
+$ Argument = P'arg
+$ If Argument .Eqs. "" Then Goto Exit
+$ El=0
+$Loop2:
+$ File = F$Element(El," ",Argument)
+$ If File .Eqs. " " Then Goto Endl
+$ AFile = ""
+$Loop3:
+$ OFile = AFile
+$ AFile = F$Search(File)
+$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
+$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
+$ Goto Loop3
+$NextEL:
+$ El = El + 1
+$ Goto Loop2
+$EndL:
+$ arg=arg+1
+$ If arg .Le. 8 Then Goto Loop
+$ Goto Exit
+$
+$Makeit:
+$ VV=F$VERIFY(0)
+$ write sys$output P2
+$ 'P2
+$ VV='F$Verify(VV)
+$Exit:
+$ If V Then Set Verify
+$ENDSUBROUTINE
+$!------------------------------------------------------------------------------
+$!
+$! Check command line options and set symbols accordingly
+$!
+$!------------------------------------------------------------------------------
+$! Version history
+$! 0.01 20041206 First version to receive a number
+$! 0.02 20060126 Add new "HELP" target
+$ CHECK_OPTS:
+$ i = 1
+$ OPT_LOOP:
+$ if i .lt. 9
+$ then
+$ cparm = f$edit(p'i',"upcase")
+$!
+$! Check if parameter actually contains something
+$!
+$ if f$edit(cparm,"trim") .nes. ""
+$ then
+$ if cparm .eqs. "DEBUG"
+$ then
+$ ccopt = ccopt + "/noopt/deb"
+$ lopts = lopts + "/deb"
+$ endif
+$ if f$locate("CCOPT=",cparm) .lt. f$length(cparm)
+$ then
+$ start = f$locate("=",cparm) + 1
+$ len = f$length(cparm) - start
+$ ccopt = ccopt + f$extract(start,len,cparm)
+$ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) -
+ then s_case = true
+$ endif
+$ if cparm .eqs. "LINK" then linkonly = true
+$ if f$locate("LOPTS=",cparm) .lt. f$length(cparm)
+$ then
+$ start = f$locate("=",cparm) + 1
+$ len = f$length(cparm) - start
+$ lopts = lopts + f$extract(start,len,cparm)
+$ endif
+$ if f$locate("CC=",cparm) .lt. f$length(cparm)
+$ then
+$ start = f$locate("=",cparm) + 1
+$ len = f$length(cparm) - start
+$ cc_com = f$extract(start,len,cparm)
+ if (cc_com .nes. "DECC") .and. -
+ (cc_com .nes. "VAXC") .and. -
+ (cc_com .nes. "GNUC")
+$ then
+$ write sys$output "Unsupported compiler choice ''cc_com' ignored"
+$ write sys$output "Use DECC, VAXC, or GNUC instead"
+$ else
+$ if cc_com .eqs. "DECC" then its_decc = true
+$ if cc_com .eqs. "VAXC" then its_vaxc = true
+$ if cc_com .eqs. "GNUC" then its_gnuc = true
+$ endif
+$ endif
+$ if f$locate("MAKE=",cparm) .lt. f$length(cparm)
+$ then
+$ start = f$locate("=",cparm) + 1
+$ len = f$length(cparm) - start
+$ mmks = f$extract(start,len,cparm)
+$ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS")
+$ then
+$ make = mmks
+$ else
+$ write sys$output "Unsupported make choice ''mmks' ignored"
+$ write sys$output "Use MMK or MMS instead"
+$ endif
+$ endif
+$ if cparm .eqs. "HELP" then gosub bhelp
+$ endif
+$ i = i + 1
+$ goto opt_loop
+$ endif
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Look for the compiler used
+$!
+$! Version history
+$! 0.01 20040223 First version to receive a number
+$! 0.02 20040229 Save/set value of decc$no_rooted_search_lists
+$! 0.03 20060202 Extend handling of GNU C
+$! 0.04 20090402 Compaq -> hp
+$CHECK_COMPILER:
+$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))
+$ then
+$ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "")
+$ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "")
+$ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "")
+$ endif
+$!
+$! Exit if no compiler available
+$!
+$ if (.not. (its_decc .or. its_vaxc .or. its_gnuc))
+$ then goto CC_ERR
+$ else
+$ if its_decc
+$ then
+$ write sys$output "CC compiler check ... hp C"
+$ if f$trnlnm("decc$no_rooted_search_lists") .nes. ""
+$ then
+$ dnrsl = f$trnlnm("decc$no_rooted_search_lists")
+$ endif
+$ define/nolog decc$no_rooted_search_lists 1
+$ else
+$ if its_vaxc then write sys$output "CC compiler check ... VAX C"
+$ if its_gnuc
+$ then
+$ write sys$output "CC compiler check ... GNU C"
+$ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib"
+$ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib"
+$ cc = "gcc"
+$ endif
+$ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share"
+$ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share"
+$ endif
+$ endif
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! If MMS/MMK are available dump out the descrip.mms if required
+$!
+$CREA_MMS:
+$ write sys$output "Creating descrip.mms..."
+$ create descrip.mms
+$ open/append out descrip.mms
+$ copy sys$input: out
+$ deck
+# descrip.mms: MMS description file for building zlib on VMS
+# written by Martin P.J. Zinser
+# <zinser@zinser.no-ip.info or martin.zinser@eurexchange.com>
+
+OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\
+ gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\
+ deflate.obj, trees.obj, zutil.obj, inflate.obj, \
+ inftrees.obj, inffast.obj
+
+$ eod
+$ write out "CFLAGS=", ccopt
+$ write out "LOPTS=", lopts
+$ write out "all : example.exe minigzip.exe libz.olb"
+$ copy sys$input: out
+$ deck
+ @ write sys$output " Example applications available"
+
+libz.olb : libz.olb($(OBJS))
+ @ write sys$output " libz available"
+
+example.exe : example.obj libz.olb
+ link $(LOPTS) example,libz.olb/lib
+
+minigzip.exe : minigzip.obj libz.olb
+ link $(LOPTS) minigzip,libz.olb/lib
+
+clean :
+ delete *.obj;*,libz.olb;*,*.opt;*,*.exe;*
+
+
+# Other dependencies.
+adler32.obj : adler32.c zutil.h zlib.h zconf.h
+compress.obj : compress.c zlib.h zconf.h
+crc32.obj : crc32.c zutil.h zlib.h zconf.h
+deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h
+example.obj : [.test]example.c zlib.h zconf.h
+gzclose.obj : gzclose.c zutil.h zlib.h zconf.h
+gzlib.obj : gzlib.c zutil.h zlib.h zconf.h
+gzread.obj : gzread.c zutil.h zlib.h zconf.h
+gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h
+inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h
+inflate.obj : inflate.c zutil.h zlib.h zconf.h
+inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h
+minigzip.obj : [.test]minigzip.c zlib.h zconf.h
+trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h
+uncompr.obj : uncompr.c zlib.h zconf.h
+zutil.obj : zutil.c zutil.h zlib.h zconf.h
+infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h
+$ eod
+$ close out
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Read list of core library sources from makefile.in and create options
+$! needed to build shareable image
+$!
+$CREA_OLIST:
+$ open/read min makefile.in
+$ open/write mod modules.opt
+$ src_check_list = "OBJZ =#OBJG ="
+$MRLOOP:
+$ read/end=mrdone min rec
+$ i = 0
+$SRC_CHECK_LOOP:
+$ src_check = f$element(i, "#", src_check_list)
+$ i = i+1
+$ if src_check .eqs. "#" then goto mrloop
+$ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop
+$ rec = rec - src_check
+$ gosub extra_filnam
+$ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop
+$MRSLOOP:
+$ read/end=mrdone min rec
+$ gosub extra_filnam
+$ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop
+$MRDONE:
+$ close min
+$ close mod
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Take record extracted in crea_olist and split it into single filenames
+$!
+$EXTRA_FILNAM:
+$ myrec = f$edit(rec - "\", "trim,compress")
+$ i = 0
+$FELOOP:
+$ srcfil = f$element(i," ", myrec)
+$ if (srcfil .nes. " ")
+$ then
+$ write mod f$parse(srcfil,,,"NAME"), ".obj"
+$ i = i + 1
+$ goto feloop
+$ endif
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Find current Zlib version number
+$!
+$FIND_VERSION:
+$ open/read h_in 'v_file'
+$hloop:
+$ read/end=hdone h_in rec
+$ rec = f$edit(rec,"TRIM")
+$ if (f$extract(0,1,rec) .nes. "#") then goto hloop
+$ rec = f$edit(rec - "#", "TRIM")
+$ if f$element(0," ",rec) .nes. "define" then goto hloop
+$ if f$element(1," ",rec) .eqs. v_string
+$ then
+$ version = 'f$element(2," ",rec)'
+$ goto hdone
+$ endif
+$ goto hloop
+$hdone:
+$ close h_in
+$ return
+$!------------------------------------------------------------------------------
+$!
+$CHECK_CONFIG:
+$!
+$ in_ldef = f$locate(cdef,libdefs)
+$ if (in_ldef .lt. f$length(libdefs))
+$ then
+$ write aconf "#define ''cdef' 1"
+$ libdefs = f$extract(0,in_ldef,libdefs) + -
+ f$extract(in_ldef + f$length(cdef) + 1, -
+ f$length(libdefs) - in_ldef - f$length(cdef) - 1, -
+ libdefs)
+$ else
+$ if (f$type('cdef') .eqs. "INTEGER")
+$ then
+$ write aconf "#define ''cdef' ", 'cdef'
+$ else
+$ if (f$type('cdef') .eqs. "STRING")
+$ then
+$ write aconf "#define ''cdef' ", """", '''cdef'', """"
+$ else
+$ gosub check_cc_def
+$ endif
+$ endif
+$ endif
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Check if this is a define relating to the properties of the C/C++
+$! compiler
+$!
+$ CHECK_CC_DEF:
+$ if (cdef .eqs. "_LARGEFILE64_SOURCE")
+$ then
+$ copy sys$input: 'tc'
+$ deck
+#include "tconfig"
+#define _LARGEFILE
+#include <stdio.h>
+
+int main(){
+FILE *fp;
+ fp = fopen("temp.txt","r");
+ fseeko(fp,1,SEEK_SET);
+ fclose(fp);
+}
+
+$ eod
+$ test_inv = false
+$ comm_h = false
+$ gosub cc_prop_check
+$ return
+$ endif
+$ write aconf "/* ", line, " */"
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Check for properties of C/C++ compiler
+$!
+$! Version history
+$! 0.01 20031020 First version to receive a number
+$! 0.02 20031022 Added logic for defines with value
+$! 0.03 20040309 Make sure local config file gets not deleted
+$! 0.04 20041230 Also write include for configure run
+$! 0.05 20050103 Add processing of "comment defines"
+$CC_PROP_CHECK:
+$ cc_prop = true
+$ is_need = false
+$ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true)
+$ if f$search(th) .eqs. "" then create 'th'
+$ set message/nofac/noident/nosever/notext
+$ on error then continue
+$ cc 'tmpnam'
+$ if .not. ($status) then cc_prop = false
+$ on error then continue
+$! The headers might lie about the capabilities of the RTL
+$ link 'tmpnam',tmp.opt/opt
+$ if .not. ($status) then cc_prop = false
+$ set message/fac/ident/sever/text
+$ on error then goto err_exit
+$ delete/nolog 'tmpnam'.*;*/exclude='th'
+$ if (cc_prop .and. .not. is_need) .or. -
+ (.not. cc_prop .and. is_need)
+$ then
+$ write sys$output "Checking for ''cdef'... yes"
+$ if f$type('cdef_val'_yes) .nes. ""
+$ then
+$ if f$type('cdef_val'_yes) .eqs. "INTEGER" -
+ then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes)
+$ if f$type('cdef_val'_yes) .eqs. "STRING" -
+ then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes)
+$ else
+$ call write_config f$fao("#define !AS 1",cdef)
+$ endif
+$ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. -
+ (cdef .eqs. "_LARGEFILE64_SOURCE") then -
+ call write_config f$string("#define _LARGEFILE 1")
+$ else
+$ write sys$output "Checking for ''cdef'... no"
+$ if (comm_h)
+$ then
+ call write_config f$fao("/* !AS */",line)
+$ else
+$ if f$type('cdef_val'_no) .nes. ""
+$ then
+$ if f$type('cdef_val'_no) .eqs. "INTEGER" -
+ then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no)
+$ if f$type('cdef_val'_no) .eqs. "STRING" -
+ then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no)
+$ else
+$ call write_config f$fao("#undef !AS",cdef)
+$ endif
+$ endif
+$ endif
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Check for properties of C/C++ compiler with multiple result values
+$!
+$! Version history
+$! 0.01 20040127 First version
+$! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05
+$CC_MPROP_CHECK:
+$ cc_prop = true
+$ i = 1
+$ idel = 1
+$ MT_LOOP:
+$ if f$type(result_'i') .eqs. "STRING"
+$ then
+$ set message/nofac/noident/nosever/notext
+$ on error then continue
+$ cc 'tmpnam'_'i'
+$ if .not. ($status) then cc_prop = false
+$ on error then continue
+$! The headers might lie about the capabilities of the RTL
+$ link 'tmpnam'_'i',tmp.opt/opt
+$ if .not. ($status) then cc_prop = false
+$ set message/fac/ident/sever/text
+$ on error then goto err_exit
+$ delete/nolog 'tmpnam'_'i'.*;*
+$ if (cc_prop)
+$ then
+$ write sys$output "Checking for ''cdef'... ", mdef_'i'
+$ if f$type(mdef_'i') .eqs. "INTEGER" -
+ then call write_config f$fao("#define !AS !UL",cdef,mdef_'i')
+$ if f$type('cdef_val'_yes) .eqs. "STRING" -
+ then call write_config f$fao("#define !AS !AS",cdef,mdef_'i')
+$ goto msym_clean
+$ else
+$ i = i + 1
+$ goto mt_loop
+$ endif
+$ endif
+$ write sys$output "Checking for ''cdef'... no"
+$ call write_config f$fao("#undef !AS",cdef)
+$ MSYM_CLEAN:
+$ if (idel .le. msym_max)
+$ then
+$ delete/sym mdef_'idel'
+$ idel = idel + 1
+$ goto msym_clean
+$ endif
+$ return
+$!------------------------------------------------------------------------------
+$!
+$! Write configuration to both permanent and temporary config file
+$!
+$! Version history
+$! 0.01 20031029 First version to receive a number
+$!
+$WRITE_CONFIG: SUBROUTINE
+$ write aconf 'p1'
+$ open/append confh 'th'
+$ write confh 'p1'
+$ close confh
+$ENDSUBROUTINE
+$!------------------------------------------------------------------------------
+$!
+$! Analyze the project map file and create the symbol vector for a shareable
+$! image from it
+$!
+$! Version history
+$! 0.01 20120128 First version
+$! 0.02 20120226 Add pre-load logic
+$!
+$ MAP_2_SHOPT: Subroutine
+$!
+$ SAY := "WRITE_ SYS$OUTPUT"
+$!
+$ IF F$SEARCH("''P1'") .EQS. ""
+$ THEN
+$ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available"
+$ goto exit_m2s
+$ ENDIF
+$ IF "''P2'" .EQS. ""
+$ THEN
+$ SAY "MAP_2_SHOPT: Error, no output file provided"
+$ goto exit_m2s
+$ ENDIF
+$!
+$ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary"
+$ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread"
+$ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary"
+$ module4 = "inflateSync#uncompress#zlibVersion#compress"
+$ open/read map 'p1
+$ if axp .or. ia64
+$ then
+$ open/write aopt a.opt
+$ open/write bopt b.opt
+$ write aopt " CASE_SENSITIVE=YES"
+$ write bopt "SYMBOL_VECTOR= (-"
+$ mod_sym_num = 1
+$ MOD_SYM_LOOP:
+$ if f$type(module'mod_sym_num') .nes. ""
+$ then
+$ mod_in = 0
+$ MOD_SYM_IN:
+$ shared_proc = f$element(mod_in, "#", module'mod_sym_num')
+$ if shared_proc .nes. "#"
+$ then
+$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",-
+ f$edit(shared_proc,"upcase"),shared_proc)
+$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc)
+$ mod_in = mod_in + 1
+$ goto mod_sym_in
+$ endif
+$ mod_sym_num = mod_sym_num + 1
+$ goto mod_sym_loop
+$ endif
+$MAP_LOOP:
+$ read/end=map_end map line
+$ if (f$locate("{",line).lt. f$length(line)) .or. -
+ (f$locate("global:", line) .lt. f$length(line))
+$ then
+$ proc = true
+$ goto map_loop
+$ endif
+$ if f$locate("}",line).lt. f$length(line) then proc = false
+$ if f$locate("local:", line) .lt. f$length(line) then proc = false
+$ if proc
+$ then
+$ shared_proc = f$edit(line,"collapse")
+$ chop_semi = f$locate(";", shared_proc)
+$ if chop_semi .lt. f$length(shared_proc) then -
+ shared_proc = f$extract(0, chop_semi, shared_proc)
+$ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",-
+ f$edit(shared_proc,"upcase"),shared_proc)
+$ write bopt f$fao("!AS=PROCEDURE,-",shared_proc)
+$ endif
+$ goto map_loop
+$MAP_END:
+$ close/nolog aopt
+$ close/nolog bopt
+$ open/append libopt 'p2'
+$ open/read aopt a.opt
+$ open/read bopt b.opt
+$ALOOP:
+$ read/end=aloop_end aopt line
+$ write libopt line
+$ goto aloop
+$ALOOP_END:
+$ close/nolog aopt
+$ sv = ""
+$BLOOP:
+$ read/end=bloop_end bopt svn
+$ if (svn.nes."")
+$ then
+$ if (sv.nes."") then write libopt sv
+$ sv = svn
+$ endif
+$ goto bloop
+$BLOOP_END:
+$ write libopt f$extract(0,f$length(sv)-2,sv), "-"
+$ write libopt ")"
+$ close/nolog bopt
+$ delete/nolog/noconf a.opt;*,b.opt;*
+$ else
+$ if vax
+$ then
+$ open/append libopt 'p2'
+$ mod_sym_num = 1
+$ VMOD_SYM_LOOP:
+$ if f$type(module'mod_sym_num') .nes. ""
+$ then
+$ mod_in = 0
+$ VMOD_SYM_IN:
+$ shared_proc = f$element(mod_in, "#", module'mod_sym_num')
+$ if shared_proc .nes. "#"
+$ then
+$ write libopt f$fao("UNIVERSAL=!AS",-
+ f$edit(shared_proc,"upcase"))
+$ mod_in = mod_in + 1
+$ goto vmod_sym_in
+$ endif
+$ mod_sym_num = mod_sym_num + 1
+$ goto vmod_sym_loop
+$ endif
+$VMAP_LOOP:
+$ read/end=vmap_end map line
+$ if (f$locate("{",line).lt. f$length(line)) .or. -
+ (f$locate("global:", line) .lt. f$length(line))
+$ then
+$ proc = true
+$ goto vmap_loop
+$ endif
+$ if f$locate("}",line).lt. f$length(line) then proc = false
+$ if f$locate("local:", line) .lt. f$length(line) then proc = false
+$ if proc
+$ then
+$ shared_proc = f$edit(line,"collapse")
+$ chop_semi = f$locate(";", shared_proc)
+$ if chop_semi .lt. f$length(shared_proc) then -
+ shared_proc = f$extract(0, chop_semi, shared_proc)
+$ write libopt f$fao("UNIVERSAL=!AS",-
+ f$edit(shared_proc,"upcase"))
+$ endif
+$ goto vmap_loop
+$VMAP_END:
+$ else
+$ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)"
+$ write sys$output "No options file created"
+$ endif
+$ endif
+$ EXIT_M2S:
+$ close/nolog map
+$ close/nolog libopt
+$ endsubroutine
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.bor b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.bor
new file mode 100644
index 000000000..3d12a2c25
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.bor
@@ -0,0 +1,115 @@
+# Makefile for zlib
+# Borland C++
+# Last updated: 15-Mar-2003
+
+# To use, do "make -fmakefile.bor"
+# To compile in small model, set below: MODEL=s
+
+# WARNING: the small model is supported but only for small values of
+# MAX_WBITS and MAX_MEM_LEVEL. For example:
+# -DMAX_WBITS=11 -DDEF_WBITS=11 -DMAX_MEM_LEVEL=3
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to the LOC macro below:
+# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------ Turbo C++, Borland C++ ------------
+
+# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
+# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
+# to the declaration of LOC here:
+LOC = $(LOCAL_ZLIB)
+
+# type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
+CPU_TYP = 0
+
+# memory model: one of s, m, c, l (small, medium, compact, large)
+MODEL=l
+
+# replace bcc with tcc for Turbo C++ 1.0, with bcc32 for the 32 bit version
+CC=bcc
+LD=bcc
+AR=tlib
+
+# compiler flags
+# replace "-O2" by "-O -G -a -d" for Turbo C++ 1.0
+CFLAGS=-O2 -Z -m$(MODEL) $(LOC)
+
+LDFLAGS=-m$(MODEL) -f-
+
+
+# variables
+ZLIB_LIB = zlib_$(MODEL).lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj
+OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj
+OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
+
+
+# targets
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+ $(CC) -c $(CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h
+
+gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h
+
+gzread.obj: gzread.c zlib.h zconf.h gzguts.h
+
+gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: test/example.c zlib.h zconf.h
+
+minigzip.obj: test/minigzip.c zlib.h zconf.h
+
+
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ -del $(ZLIB_LIB)
+ $(AR) $(ZLIB_LIB) $(OBJP1)
+ $(AR) $(ZLIB_LIB) $(OBJP2)
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+clean:
+ -del *.obj
+ -del *.lib
+ -del *.exe
+ -del zlib_*.bak
+ -del foo.gz
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.dj2 b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.dj2
new file mode 100644
index 000000000..59d2037d6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.dj2
@@ -0,0 +1,104 @@
+# Makefile for zlib. Modified for djgpp v2.0 by F. J. Donahoe, 3/15/96.
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.dj2; make test -fmakefile.dj2
+#
+# To install libz.a, zconf.h and zlib.h in the djgpp directories, type:
+#
+# make install -fmakefile.dj2
+#
+# after first defining LIBRARY_PATH and INCLUDE_PATH in djgpp.env as
+# in the sample below if the pattern of the DJGPP distribution is to
+# be followed. Remember that, while <sp>'es around <=> are ignored in
+# makefiles, they are *not* in batch files or in djgpp.env.
+# - - - - -
+# [make]
+# INCLUDE_PATH=%\>;INCLUDE_PATH%%\DJDIR%\include
+# LIBRARY_PATH=%\>;LIBRARY_PATH%%\DJDIR%\lib
+# BUTT=-m486
+# - - - - -
+# Alternately, these variables may be defined below, overriding the values
+# in djgpp.env, as
+# INCLUDE_PATH=c:\usr\include
+# LIBRARY_PATH=c:\usr\lib
+
+CC=gcc
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DZLIB_DEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lz
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=libz.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \
+ uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o
+
+OBJA =
+# to use the asm code: make OBJA=match.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+check: test
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+libz.a: $(OBJS) $(OBJA)
+ $(AR) $@ $(OBJS) $(OBJA)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+# INCLUDE_PATH and LIBRARY_PATH were set for [make] in djgpp.env .
+
+.PHONY : uninstall clean
+
+install: $(INCL) $(LIBS)
+ -@if not exist $(INCLUDE_PATH)\nul mkdir $(INCLUDE_PATH)
+ -@if not exist $(LIBRARY_PATH)\nul mkdir $(LIBRARY_PATH)
+ $(INSTALL) zlib.h $(INCLUDE_PATH)
+ $(INSTALL) zconf.h $(INCLUDE_PATH)
+ $(INSTALL) libz.a $(LIBRARY_PATH)
+
+uninstall:
+ $(RM) $(INCLUDE_PATH)\zlib.h
+ $(RM) $(INCLUDE_PATH)\zconf.h
+ $(RM) $(LIBRARY_PATH)\libz.a
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) libz.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.emx b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.emx
new file mode 100644
index 000000000..e30f67bed
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.emx
@@ -0,0 +1,69 @@
+# Makefile for zlib. Modified for emx 0.9c by Chr. Spieler, 6/17/98.
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.emx; make test -fmakefile.emx
+#
+
+CC=gcc
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DZLIB_DEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lzlib
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=zlib.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzclose.o gzlib.o gzread.o gzwrite.o \
+ uncompr.o deflate.o trees.o zutil.o inflate.o infback.o inftrees.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+zlib.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+
+.PHONY : clean
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) zlib.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.msc b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.msc
new file mode 100644
index 000000000..ae8378615
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.msc
@@ -0,0 +1,112 @@
+# Makefile for zlib
+# Microsoft C 5.1 or later
+# Last updated: 19-Mar-2003
+
+# To use, do "make makefile.msc"
+# To compile in small model, set below: MODEL=S
+
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to the LOC macro below:
+# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------- Microsoft C 5.1 and later -------------
+
+# Optional nonstandard preprocessor flags (e.g. -DMAX_MEM_LEVEL=7)
+# should be added to the environment via "set LOCAL_ZLIB=-DFOO" or added
+# to the declaration of LOC here:
+LOC = $(LOCAL_ZLIB)
+
+# Type for CPU required: 0: 8086, 1: 80186, 2: 80286, 3: 80386, etc.
+CPU_TYP = 0
+
+# Memory model: one of S, M, C, L (small, medium, compact, large)
+MODEL=L
+
+CC=cl
+CFLAGS=-nologo -A$(MODEL) -G$(CPU_TYP) -W3 -Oait -Gs $(LOC)
+#-Ox generates bad code with MSC 5.1
+LIB_CFLAGS=-Zl $(CFLAGS)
+
+LD=link
+LDFLAGS=/noi/e/st:0x1500/noe/farcall/packcode
+# "/farcall/packcode" are only useful for `large code' memory models
+# but should be a "no-op" for small code models.
+
+
+# variables
+ZLIB_LIB = zlib_$(MODEL).lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj
+OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+
+
+# targets
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+ $(CC) -c $(LIB_CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h
+
+gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h
+
+gzread.obj: gzread.c zlib.h zconf.h gzguts.h
+
+gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: test/example.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+minigzip.obj: test/minigzip.c zlib.h zconf.h
+ $(CC) -c $(CFLAGS) $*.c
+
+
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ if exist $(ZLIB_LIB) del $(ZLIB_LIB)
+ lib $(ZLIB_LIB) $(OBJ1);
+ lib $(ZLIB_LIB) $(OBJ2);
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) example.obj,,,$(ZLIB_LIB);
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) minigzip.obj,,,$(ZLIB_LIB);
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+clean:
+ -del *.obj
+ -del *.lib
+ -del *.exe
+ -del *.map
+ -del zlib_*.bak
+ -del foo.gz
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.tc b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.tc
new file mode 100644
index 000000000..5aec82a9d
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/msdos/Makefile.tc
@@ -0,0 +1,100 @@
+# Makefile for zlib
+# Turbo C 2.01, Turbo C++ 1.01
+# Last updated: 15-Mar-2003
+
+# To use, do "make -fmakefile.tc"
+# To compile in small model, set below: MODEL=s
+
+# WARNING: the small model is supported but only for small values of
+# MAX_WBITS and MAX_MEM_LEVEL. For example:
+# -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+# If you wish to reduce the memory requirements (default 256K for big
+# objects plus a few K), you can add to CFLAGS below:
+# -DMAX_MEM_LEVEL=7 -DMAX_WBITS=14
+# See zconf.h for details about the memory requirements.
+
+# ------------ Turbo C 2.01, Turbo C++ 1.01 ------------
+MODEL=l
+CC=tcc
+LD=tcc
+AR=tlib
+# CFLAGS=-O2 -G -Z -m$(MODEL) -DMAX_WBITS=11 -DMAX_MEM_LEVEL=3
+CFLAGS=-O2 -G -Z -m$(MODEL)
+LDFLAGS=-m$(MODEL) -f-
+
+
+# variables
+ZLIB_LIB = zlib_$(MODEL).lib
+
+OBJ1 = adler32.obj compress.obj crc32.obj deflate.obj gzclose.obj gzlib.obj gzread.obj
+OBJ2 = gzwrite.obj infback.obj inffast.obj inflate.obj inftrees.obj trees.obj uncompr.obj zutil.obj
+OBJP1 = +adler32.obj+compress.obj+crc32.obj+deflate.obj+gzclose.obj+gzlib.obj+gzread.obj
+OBJP2 = +gzwrite.obj+infback.obj+inffast.obj+inflate.obj+inftrees.obj+trees.obj+uncompr.obj+zutil.obj
+
+
+# targets
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+.c.obj:
+ $(CC) -c $(CFLAGS) $*.c
+
+adler32.obj: adler32.c zlib.h zconf.h
+
+compress.obj: compress.c zlib.h zconf.h
+
+crc32.obj: crc32.c zlib.h zconf.h crc32.h
+
+deflate.obj: deflate.c deflate.h zutil.h zlib.h zconf.h
+
+gzclose.obj: gzclose.c zlib.h zconf.h gzguts.h
+
+gzlib.obj: gzlib.c zlib.h zconf.h gzguts.h
+
+gzread.obj: gzread.c zlib.h zconf.h gzguts.h
+
+gzwrite.obj: gzwrite.c zlib.h zconf.h gzguts.h
+
+infback.obj: infback.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inffast.obj: inffast.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h
+
+inflate.obj: inflate.c zutil.h zlib.h zconf.h inftrees.h inflate.h \
+ inffast.h inffixed.h
+
+inftrees.obj: inftrees.c zutil.h zlib.h zconf.h inftrees.h
+
+trees.obj: trees.c zutil.h zlib.h zconf.h deflate.h trees.h
+
+uncompr.obj: uncompr.c zlib.h zconf.h
+
+zutil.obj: zutil.c zutil.h zlib.h zconf.h
+
+example.obj: test/example.c zlib.h zconf.h
+
+minigzip.obj: test/minigzip.c zlib.h zconf.h
+
+
+# the command line is cut to fit in the MS-DOS 128 byte limit:
+$(ZLIB_LIB): $(OBJ1) $(OBJ2)
+ -del $(ZLIB_LIB)
+ $(AR) $(ZLIB_LIB) $(OBJP1)
+ $(AR) $(ZLIB_LIB) $(OBJP2)
+
+example.exe: example.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) example.obj $(ZLIB_LIB)
+
+minigzip.exe: minigzip.obj $(ZLIB_LIB)
+ $(LD) $(LDFLAGS) minigzip.obj $(ZLIB_LIB)
+
+test: example.exe minigzip.exe
+ example
+ echo hello world | minigzip | minigzip -d
+
+clean:
+ -del *.obj
+ -del *.lib
+ -del *.exe
+ -del zlib_*.bak
+ -del foo.gz
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/Makefile b/src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/Makefile
new file mode 100644
index 000000000..21337d01a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/Makefile
@@ -0,0 +1,126 @@
+#---------------------------------------------------------------------------------
+.SUFFIXES:
+#---------------------------------------------------------------------------------
+
+ifeq ($(strip $(DEVKITARM)),)
+$(error "Please set DEVKITARM in your environment. export DEVKITARM=<path to>devkitARM")
+endif
+
+include $(DEVKITARM)/ds_rules
+
+#---------------------------------------------------------------------------------
+# TARGET is the name of the output
+# BUILD is the directory where object files & intermediate files will be placed
+# SOURCES is a list of directories containing source code
+# DATA is a list of directories containing data files
+# INCLUDES is a list of directories containing header files
+#---------------------------------------------------------------------------------
+TARGET := $(shell basename $(CURDIR))
+BUILD := build
+SOURCES := ../../
+DATA := data
+INCLUDES := include
+
+#---------------------------------------------------------------------------------
+# options for code generation
+#---------------------------------------------------------------------------------
+ARCH := -mthumb -mthumb-interwork
+
+CFLAGS := -Wall -O2\
+ -march=armv5te -mtune=arm946e-s \
+ -fomit-frame-pointer -ffast-math \
+ $(ARCH)
+
+CFLAGS += $(INCLUDE) -DARM9
+CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions
+
+ASFLAGS := $(ARCH) -march=armv5te -mtune=arm946e-s
+LDFLAGS = -specs=ds_arm9.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)
+
+#---------------------------------------------------------------------------------
+# list of directories containing libraries, this must be the top level containing
+# include and lib
+#---------------------------------------------------------------------------------
+LIBDIRS := $(LIBNDS)
+
+#---------------------------------------------------------------------------------
+# no real need to edit anything past this point unless you need to add additional
+# rules for different file extensions
+#---------------------------------------------------------------------------------
+ifneq ($(BUILD),$(notdir $(CURDIR)))
+#---------------------------------------------------------------------------------
+
+export OUTPUT := $(CURDIR)/lib/libz.a
+
+export VPATH := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
+ $(foreach dir,$(DATA),$(CURDIR)/$(dir))
+
+export DEPSDIR := $(CURDIR)/$(BUILD)
+
+CFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
+CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
+SFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
+BINFILES := $(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.*)))
+
+#---------------------------------------------------------------------------------
+# use CXX for linking C++ projects, CC for standard C
+#---------------------------------------------------------------------------------
+ifeq ($(strip $(CPPFILES)),)
+#---------------------------------------------------------------------------------
+ export LD := $(CC)
+#---------------------------------------------------------------------------------
+else
+#---------------------------------------------------------------------------------
+ export LD := $(CXX)
+#---------------------------------------------------------------------------------
+endif
+#---------------------------------------------------------------------------------
+
+export OFILES := $(addsuffix .o,$(BINFILES)) \
+ $(CPPFILES:.cpp=.o) $(CFILES:.c=.o) $(SFILES:.s=.o)
+
+export INCLUDE := $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
+ $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
+ -I$(CURDIR)/$(BUILD)
+
+.PHONY: $(BUILD) clean all
+
+#---------------------------------------------------------------------------------
+all: $(BUILD)
+ @[ -d $@ ] || mkdir -p include
+ @cp ../../*.h include
+
+lib:
+ @[ -d $@ ] || mkdir -p $@
+
+$(BUILD): lib
+ @[ -d $@ ] || mkdir -p $@
+ @$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile
+
+#---------------------------------------------------------------------------------
+clean:
+ @echo clean ...
+ @rm -fr $(BUILD) lib
+
+#---------------------------------------------------------------------------------
+else
+
+DEPENDS := $(OFILES:.o=.d)
+
+#---------------------------------------------------------------------------------
+# main targets
+#---------------------------------------------------------------------------------
+$(OUTPUT) : $(OFILES)
+
+#---------------------------------------------------------------------------------
+%.bin.o : %.bin
+#---------------------------------------------------------------------------------
+ @echo $(notdir $<)
+ @$(bin2o)
+
+
+-include $(DEPENDS)
+
+#---------------------------------------------------------------------------------------
+endif
+#---------------------------------------------------------------------------------------
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/README b/src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/README
new file mode 100644
index 000000000..ba7a37dbe
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/nintendods/README
@@ -0,0 +1,5 @@
+This Makefile requires devkitARM (http://www.devkitpro.org/category/devkitarm/) and works inside "contrib/nds". It is based on a devkitARM template.
+
+Eduardo Costa <eduardo.m.costa@gmail.com>
+January 3, 2009
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.emx b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.emx
new file mode 100644
index 000000000..612b03791
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.emx
@@ -0,0 +1,69 @@
+# Makefile for zlib. Modified for emx/rsxnt by Chr. Spieler, 6/16/98.
+# Copyright (C) 1995-1998 Jean-loup Gailly.
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile, or to compile and test, type:
+#
+# make -fmakefile.emx; make test -fmakefile.emx
+#
+
+CC=gcc -Zwin32
+
+#CFLAGS=-MMD -O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-MMD -g -DZLIB_DEBUG
+CFLAGS=-MMD -O3 $(BUTT) -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+ -Wstrict-prototypes -Wmissing-prototypes
+
+# If cp.exe is available, replace "copy /Y" with "cp -fp" .
+CP=copy /Y
+# If gnu install.exe is available, replace $(CP) with ginstall.
+INSTALL=$(CP)
+# The default value of RM is "rm -f." If "rm.exe" is found, comment out:
+RM=del
+LDLIBS=-L. -lzlib
+LD=$(CC) -s -o
+LDSHARED=$(CC)
+
+INCL=zlib.h zconf.h
+LIBS=zlib.a
+
+AR=ar rcs
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o deflate.o gzclose.o gzlib.o gzread.o \
+ gzwrite.o infback.o inffast.o inflate.o inftrees.o trees.o uncompr.o zutil.o
+
+TEST_OBJS = example.o minigzip.o
+
+all: example.exe minigzip.exe
+
+test: all
+ ./example
+ echo hello world | .\minigzip | .\minigzip -d
+
+%.o : %.c
+ $(CC) $(CFLAGS) -c $< -o $@
+
+zlib.a: $(OBJS)
+ $(AR) $@ $(OBJS)
+
+%.exe : %.o $(LIBS)
+ $(LD) $@ $< $(LDLIBS)
+
+
+.PHONY : clean
+
+clean:
+ $(RM) *.d
+ $(RM) *.o
+ $(RM) *.exe
+ $(RM) zlib.a
+ $(RM) foo.gz
+
+DEPS := $(wildcard *.d)
+ifneq ($(DEPS),)
+include $(DEPS)
+endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.riscos b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.riscos
new file mode 100644
index 000000000..57e29d3fb
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/Makefile.riscos
@@ -0,0 +1,151 @@
+# Project: zlib_1_03
+# Patched for zlib 1.1.2 rw@shadow.org.uk 19980430
+# test works out-of-the-box, installs `somewhere' on demand
+
+# Toolflags:
+CCflags = -c -depend !Depend -IC: -g -throwback -DRISCOS -fah
+C++flags = -c -depend !Depend -IC: -throwback
+Linkflags = -aif -c++ -o $@
+ObjAsmflags = -throwback -NoCache -depend !Depend
+CMHGflags =
+LibFileflags = -c -l -o $@
+Squeezeflags = -o $@
+
+# change the line below to where _you_ want the library installed.
+libdest = lib:zlib
+
+# Final targets:
+@.lib: @.o.adler32 @.o.compress @.o.crc32 @.o.deflate @.o.gzio \
+ @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil @.o.trees \
+ @.o.uncompr @.o.zutil
+ LibFile $(LibFileflags) @.o.adler32 @.o.compress @.o.crc32 @.o.deflate \
+ @.o.gzio @.o.infblock @.o.infcodes @.o.inffast @.o.inflate @.o.inftrees @.o.infutil \
+ @.o.trees @.o.uncompr @.o.zutil
+test: @.minigzip @.example @.lib
+ @copy @.lib @.libc A~C~DF~L~N~P~Q~RS~TV
+ @echo running tests: hang on.
+ @/@.minigzip -f -9 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -f -1 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -h -9 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -h -1 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -9 libc
+ @/@.minigzip -d libc-gz
+ @/@.minigzip -1 libc
+ @/@.minigzip -d libc-gz
+ @diff @.lib @.libc
+ @echo that should have reported '@.lib and @.libc identical' if you have diff.
+ @/@.example @.fred @.fred
+ @echo that will have given lots of hello!'s.
+
+@.minigzip: @.o.minigzip @.lib C:o.Stubs
+ Link $(Linkflags) @.o.minigzip @.lib C:o.Stubs
+@.example: @.o.example @.lib C:o.Stubs
+ Link $(Linkflags) @.o.example @.lib C:o.Stubs
+
+install: @.lib
+ cdir $(libdest)
+ cdir $(libdest).h
+ @copy @.h.zlib $(libdest).h.zlib A~C~DF~L~N~P~Q~RS~TV
+ @copy @.h.zconf $(libdest).h.zconf A~C~DF~L~N~P~Q~RS~TV
+ @copy @.lib $(libdest).lib A~C~DF~L~N~P~Q~RS~TV
+ @echo okay, installed zlib in $(libdest)
+
+clean:; remove @.minigzip
+ remove @.example
+ remove @.libc
+ -wipe @.o.* F~r~cV
+ remove @.fred
+
+# User-editable dependencies:
+.c.o:
+ cc $(ccflags) -o $@ $<
+
+# Static dependencies:
+
+# Dynamic dependencies:
+o.example: c.example
+o.example: h.zlib
+o.example: h.zconf
+o.minigzip: c.minigzip
+o.minigzip: h.zlib
+o.minigzip: h.zconf
+o.adler32: c.adler32
+o.adler32: h.zlib
+o.adler32: h.zconf
+o.compress: c.compress
+o.compress: h.zlib
+o.compress: h.zconf
+o.crc32: c.crc32
+o.crc32: h.zlib
+o.crc32: h.zconf
+o.deflate: c.deflate
+o.deflate: h.deflate
+o.deflate: h.zutil
+o.deflate: h.zlib
+o.deflate: h.zconf
+o.gzio: c.gzio
+o.gzio: h.zutil
+o.gzio: h.zlib
+o.gzio: h.zconf
+o.infblock: c.infblock
+o.infblock: h.zutil
+o.infblock: h.zlib
+o.infblock: h.zconf
+o.infblock: h.infblock
+o.infblock: h.inftrees
+o.infblock: h.infcodes
+o.infblock: h.infutil
+o.infcodes: c.infcodes
+o.infcodes: h.zutil
+o.infcodes: h.zlib
+o.infcodes: h.zconf
+o.infcodes: h.inftrees
+o.infcodes: h.infblock
+o.infcodes: h.infcodes
+o.infcodes: h.infutil
+o.infcodes: h.inffast
+o.inffast: c.inffast
+o.inffast: h.zutil
+o.inffast: h.zlib
+o.inffast: h.zconf
+o.inffast: h.inftrees
+o.inffast: h.infblock
+o.inffast: h.infcodes
+o.inffast: h.infutil
+o.inffast: h.inffast
+o.inflate: c.inflate
+o.inflate: h.zutil
+o.inflate: h.zlib
+o.inflate: h.zconf
+o.inflate: h.infblock
+o.inftrees: c.inftrees
+o.inftrees: h.zutil
+o.inftrees: h.zlib
+o.inftrees: h.zconf
+o.inftrees: h.inftrees
+o.inftrees: h.inffixed
+o.infutil: c.infutil
+o.infutil: h.zutil
+o.infutil: h.zlib
+o.infutil: h.zconf
+o.infutil: h.infblock
+o.infutil: h.inftrees
+o.infutil: h.infcodes
+o.infutil: h.infutil
+o.trees: c.trees
+o.trees: h.deflate
+o.trees: h.zutil
+o.trees: h.zlib
+o.trees: h.zconf
+o.trees: h.trees
+o.uncompr: c.uncompr
+o.uncompr: h.zlib
+o.uncompr: h.zconf
+o.zutil: c.zutil
+o.zutil: h.zutil
+o.zutil: h.zlib
+o.zutil: h.zconf
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/old/README b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/README
new file mode 100644
index 000000000..800bf0798
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/README
@@ -0,0 +1,3 @@
+This directory contains files that have not been updated for zlib 1.2.x
+
+(Volunteers are encouraged to help clean this up. Thanks.)
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/old/descrip.mms b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/descrip.mms
new file mode 100644
index 000000000..7066da5b5
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/descrip.mms
@@ -0,0 +1,48 @@
+# descrip.mms: MMS description file for building zlib on VMS
+# written by Martin P.J. Zinser <m.zinser@gsi.de>
+
+cc_defs =
+c_deb =
+
+.ifdef __DECC__
+pref = /prefix=all
+.endif
+
+OBJS = adler32.obj, compress.obj, crc32.obj, gzio.obj, uncompr.obj,\
+ deflate.obj, trees.obj, zutil.obj, inflate.obj, infblock.obj,\
+ inftrees.obj, infcodes.obj, infutil.obj, inffast.obj
+
+CFLAGS= $(C_DEB) $(CC_DEFS) $(PREF)
+
+all : example.exe minigzip.exe
+ @ write sys$output " Example applications available"
+libz.olb : libz.olb($(OBJS))
+ @ write sys$output " libz available"
+
+example.exe : example.obj libz.olb
+ link example,libz.olb/lib
+
+minigzip.exe : minigzip.obj libz.olb
+ link minigzip,libz.olb/lib,x11vms:xvmsutils.olb/lib
+
+clean :
+ delete *.obj;*,libz.olb;*
+
+
+# Other dependencies.
+adler32.obj : zutil.h zlib.h zconf.h
+compress.obj : zlib.h zconf.h
+crc32.obj : zutil.h zlib.h zconf.h
+deflate.obj : deflate.h zutil.h zlib.h zconf.h
+example.obj : zlib.h zconf.h
+gzio.obj : zutil.h zlib.h zconf.h
+infblock.obj : zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
+infcodes.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h infcodes.h inffast.h
+inffast.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h inffast.h
+inflate.obj : zutil.h zlib.h zconf.h infblock.h
+inftrees.obj : zutil.h zlib.h zconf.h inftrees.h
+infutil.obj : zutil.h zlib.h zconf.h inftrees.h infutil.h
+minigzip.obj : zlib.h zconf.h
+trees.obj : deflate.h zutil.h zlib.h zconf.h
+uncompr.obj : zlib.h zconf.h
+zutil.obj : zutil.h zlib.h zconf.h
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/Makefile.os2 b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/Makefile.os2
new file mode 100644
index 000000000..bb426c0d8
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/Makefile.os2
@@ -0,0 +1,136 @@
+# Makefile for zlib under OS/2 using GCC (PGCC)
+# For conditions of distribution and use, see copyright notice in zlib.h
+
+# To compile and test, type:
+# cp Makefile.os2 ..
+# cd ..
+# make -f Makefile.os2 test
+
+# This makefile will build a static library z.lib, a shared library
+# z.dll and a import library zdll.lib. You can use either z.lib or
+# zdll.lib by specifying either -lz or -lzdll on gcc's command line
+
+CC=gcc -Zomf -s
+
+CFLAGS=-O6 -Wall
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-g -DZLIB_DEBUG
+#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+# -Wstrict-prototypes -Wmissing-prototypes
+
+#################### BUG WARNING: #####################
+## infcodes.c hits a bug in pgcc-1.0, so you have to use either
+## -O# where # <= 4 or one of (-fno-ommit-frame-pointer or -fno-force-mem)
+## This bug is reportedly fixed in pgcc >1.0, but this was not tested
+CFLAGS+=-fno-force-mem
+
+LDFLAGS=-s -L. -lzdll -Zcrtdll
+LDSHARED=$(CC) -s -Zomf -Zdll -Zcrtdll
+
+VER=1.1.0
+ZLIB=z.lib
+SHAREDLIB=z.dll
+SHAREDLIBIMP=zdll.lib
+LIBS=$(ZLIB) $(SHAREDLIB) $(SHAREDLIBIMP)
+
+AR=emxomfar cr
+IMPLIB=emximp
+RANLIB=echo
+TAR=tar
+SHELL=bash
+
+prefix=/usr/local
+exec_prefix = $(prefix)
+
+OBJS = adler32.o compress.o crc32.o gzio.o uncompr.o deflate.o trees.o \
+ zutil.o inflate.o infblock.o inftrees.o infcodes.o infutil.o inffast.o
+
+TEST_OBJS = example.o minigzip.o
+
+DISTFILES = README INDEX ChangeLog configure Make*[a-z0-9] *.[ch] descrip.mms \
+ algorithm.txt zlib.3 msdos/Make*[a-z0-9] msdos/zlib.def msdos/zlib.rc \
+ nt/Makefile.nt nt/zlib.dnt contrib/README.contrib contrib/*.txt \
+ contrib/asm386/*.asm contrib/asm386/*.c \
+ contrib/asm386/*.bat contrib/asm386/zlibvc.d?? contrib/iostream/*.cpp \
+ contrib/iostream/*.h contrib/iostream2/*.h contrib/iostream2/*.cpp \
+ contrib/untgz/Makefile contrib/untgz/*.c contrib/untgz/*.w32
+
+all: example.exe minigzip.exe
+
+test: all
+ @LD_LIBRARY_PATH=.:$(LD_LIBRARY_PATH) ; export LD_LIBRARY_PATH; \
+ echo hello world | ./minigzip | ./minigzip -d || \
+ echo ' *** minigzip test FAILED ***' ; \
+ if ./example; then \
+ echo ' *** zlib test OK ***'; \
+ else \
+ echo ' *** zlib test FAILED ***'; \
+ fi
+
+$(ZLIB): $(OBJS)
+ $(AR) $@ $(OBJS)
+ -@ ($(RANLIB) $@ || true) >/dev/null 2>&1
+
+$(SHAREDLIB): $(OBJS) os2/z.def
+ $(LDSHARED) -o $@ $^
+
+$(SHAREDLIBIMP): os2/z.def
+ $(IMPLIB) -o $@ $^
+
+example.exe: example.o $(LIBS)
+ $(CC) $(CFLAGS) -o $@ example.o $(LDFLAGS)
+
+minigzip.exe: minigzip.o $(LIBS)
+ $(CC) $(CFLAGS) -o $@ minigzip.o $(LDFLAGS)
+
+clean:
+ rm -f *.o *~ example minigzip libz.a libz.so* foo.gz
+
+distclean: clean
+
+zip:
+ mv Makefile Makefile~; cp -p Makefile.in Makefile
+ rm -f test.c ztest*.c
+ v=`sed -n -e 's/\.//g' -e '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
+ zip -ul9 zlib$$v $(DISTFILES)
+ mv Makefile~ Makefile
+
+dist:
+ mv Makefile Makefile~; cp -p Makefile.in Makefile
+ rm -f test.c ztest*.c
+ d=zlib-`sed -n '/VERSION "/s/.*"\(.*\)".*/\1/p' < zlib.h`;\
+ rm -f $$d.tar.gz; \
+ if test ! -d ../$$d; then rm -f ../$$d; ln -s `pwd` ../$$d; fi; \
+ files=""; \
+ for f in $(DISTFILES); do files="$$files $$d/$$f"; done; \
+ cd ..; \
+ GZIP=-9 $(TAR) chofz $$d/$$d.tar.gz $$files; \
+ if test ! -d $$d; then rm -f $$d; fi
+ mv Makefile~ Makefile
+
+tags:
+ etags *.[ch]
+
+depend:
+ makedepend -- $(CFLAGS) -- *.[ch]
+
+# DO NOT DELETE THIS LINE -- make depend depends on it.
+
+adler32.o: zlib.h zconf.h
+compress.o: zlib.h zconf.h
+crc32.o: zlib.h zconf.h
+deflate.o: deflate.h zutil.h zlib.h zconf.h
+example.o: zlib.h zconf.h
+gzio.o: zutil.h zlib.h zconf.h
+infblock.o: infblock.h inftrees.h infcodes.h infutil.h zutil.h zlib.h zconf.h
+infcodes.o: zutil.h zlib.h zconf.h
+infcodes.o: inftrees.h infblock.h infcodes.h infutil.h inffast.h
+inffast.o: zutil.h zlib.h zconf.h inftrees.h
+inffast.o: infblock.h infcodes.h infutil.h inffast.h
+inflate.o: zutil.h zlib.h zconf.h infblock.h
+inftrees.o: zutil.h zlib.h zconf.h inftrees.h
+infutil.o: zutil.h zlib.h zconf.h infblock.h inftrees.h infcodes.h infutil.h
+minigzip.o: zlib.h zconf.h
+trees.o: deflate.h zutil.h zlib.h zconf.h trees.h
+uncompr.o: zlib.h zconf.h
+zutil.o: zutil.h zlib.h zconf.h
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/zlib.def b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/zlib.def
new file mode 100644
index 000000000..4c753f1a3
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/os2/zlib.def
@@ -0,0 +1,51 @@
+;
+; Slightly modified version of ../nt/zlib.dnt :-)
+;
+
+LIBRARY Z
+DESCRIPTION "Zlib compression library for OS/2"
+CODE PRELOAD MOVEABLE DISCARDABLE
+DATA PRELOAD MOVEABLE MULTIPLE
+
+EXPORTS
+ adler32
+ compress
+ crc32
+ deflate
+ deflateCopy
+ deflateEnd
+ deflateInit2_
+ deflateInit_
+ deflateParams
+ deflateReset
+ deflateSetDictionary
+ gzclose
+ gzdopen
+ gzerror
+ gzflush
+ gzopen
+ gzread
+ gzwrite
+ inflate
+ inflateEnd
+ inflateInit2_
+ inflateInit_
+ inflateReset
+ inflateSetDictionary
+ inflateSync
+ uncompress
+ zlibVersion
+ gzprintf
+ gzputc
+ gzgetc
+ gzseek
+ gzrewind
+ gztell
+ gzeof
+ gzsetparams
+ zError
+ inflateSyncPoint
+ get_crc_table
+ compress2
+ gzputs
+ gzgets
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/old/visual-basic.txt b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/visual-basic.txt
new file mode 100644
index 000000000..57efe5812
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/old/visual-basic.txt
@@ -0,0 +1,160 @@
+See below some functions declarations for Visual Basic.
+
+Frequently Asked Question:
+
+Q: Each time I use the compress function I get the -5 error (not enough
+ room in the output buffer).
+
+A: Make sure that the length of the compressed buffer is passed by
+ reference ("as any"), not by value ("as long"). Also check that
+ before the call of compress this length is equal to the total size of
+ the compressed buffer and not zero.
+
+
+From: "Jon Caruana" <jon-net@usa.net>
+Subject: Re: How to port zlib declares to vb?
+Date: Mon, 28 Oct 1996 18:33:03 -0600
+
+Got the answer! (I haven't had time to check this but it's what I got, and
+looks correct):
+
+He has the following routines working:
+ compress
+ uncompress
+ gzopen
+ gzwrite
+ gzread
+ gzclose
+
+Declares follow: (Quoted from Carlos Rios <c_rios@sonda.cl>, in Vb4 form)
+
+#If Win16 Then 'Use Win16 calls.
+Declare Function compress Lib "ZLIB.DLL" (ByVal compr As
+ String, comprLen As Any, ByVal buf As String, ByVal buflen
+ As Long) As Integer
+Declare Function uncompress Lib "ZLIB.DLL" (ByVal uncompr
+ As String, uncomprLen As Any, ByVal compr As String, ByVal
+ lcompr As Long) As Integer
+Declare Function gzopen Lib "ZLIB.DLL" (ByVal filePath As
+ String, ByVal mode As String) As Long
+Declare Function gzread Lib "ZLIB.DLL" (ByVal file As
+ Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
+ As Integer
+Declare Function gzwrite Lib "ZLIB.DLL" (ByVal file As
+ Long, ByVal uncompr As String, ByVal uncomprLen As Integer)
+ As Integer
+Declare Function gzclose Lib "ZLIB.DLL" (ByVal file As
+ Long) As Integer
+#Else
+Declare Function compress Lib "ZLIB32.DLL"
+ (ByVal compr As String, comprLen As Any, ByVal buf As
+ String, ByVal buflen As Long) As Integer
+Declare Function uncompress Lib "ZLIB32.DLL"
+ (ByVal uncompr As String, uncomprLen As Any, ByVal compr As
+ String, ByVal lcompr As Long) As Long
+Declare Function gzopen Lib "ZLIB32.DLL"
+ (ByVal file As String, ByVal mode As String) As Long
+Declare Function gzread Lib "ZLIB32.DLL"
+ (ByVal file As Long, ByVal uncompr As String, ByVal
+ uncomprLen As Long) As Long
+Declare Function gzwrite Lib "ZLIB32.DLL"
+ (ByVal file As Long, ByVal uncompr As String, ByVal
+ uncomprLen As Long) As Long
+Declare Function gzclose Lib "ZLIB32.DLL"
+ (ByVal file As Long) As Long
+#End If
+
+-Jon Caruana
+jon-net@usa.net
+Microsoft Sitebuilder Network Level 1 Member - HTML Writer's Guild Member
+
+
+Here is another example from Michael <michael_borgsys@hotmail.com> that he
+says conforms to the VB guidelines, and that solves the problem of not
+knowing the uncompressed size by storing it at the end of the file:
+
+'Calling the functions:
+'bracket meaning: <parameter> [optional] {Range of possible values}
+'Call subCompressFile(<path with filename to compress> [, <path with
+filename to write to>, [level of compression {1..9}]])
+'Call subUncompressFile(<path with filename to compress>)
+
+Option Explicit
+Private lngpvtPcnSml As Long 'Stores value for 'lngPercentSmaller'
+Private Const SUCCESS As Long = 0
+Private Const strFilExt As String = ".cpr"
+Private Declare Function lngfncCpr Lib "zlib.dll" Alias "compress2" (ByRef
+dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long,
+ByVal level As Integer) As Long
+Private Declare Function lngfncUcp Lib "zlib.dll" Alias "uncompress" (ByRef
+dest As Any, ByRef destLen As Any, ByRef src As Any, ByVal srcLen As Long)
+As Long
+
+Public Sub subCompressFile(ByVal strargOriFilPth As String, Optional ByVal
+strargCprFilPth As String, Optional ByVal intLvl As Integer = 9)
+ Dim strCprPth As String
+ Dim lngOriSiz As Long
+ Dim lngCprSiz As Long
+ Dim bytaryOri() As Byte
+ Dim bytaryCpr() As Byte
+ lngOriSiz = FileLen(strargOriFilPth)
+ ReDim bytaryOri(lngOriSiz - 1)
+ Open strargOriFilPth For Binary Access Read As #1
+ Get #1, , bytaryOri()
+ Close #1
+ strCprPth = IIf(strargCprFilPth = "", strargOriFilPth, strargCprFilPth)
+'Select file path and name
+ strCprPth = strCprPth & IIf(Right(strCprPth, Len(strFilExt)) =
+strFilExt, "", strFilExt) 'Add file extension if not exists
+ lngCprSiz = (lngOriSiz * 1.01) + 12 'Compression needs temporary a bit
+more space then original file size
+ ReDim bytaryCpr(lngCprSiz - 1)
+ If lngfncCpr(bytaryCpr(0), lngCprSiz, bytaryOri(0), lngOriSiz, intLvl) =
+SUCCESS Then
+ lngpvtPcnSml = (1# - (lngCprSiz / lngOriSiz)) * 100
+ ReDim Preserve bytaryCpr(lngCprSiz - 1)
+ Open strCprPth For Binary Access Write As #1
+ Put #1, , bytaryCpr()
+ Put #1, , lngOriSiz 'Add the the original size value to the end
+(last 4 bytes)
+ Close #1
+ Else
+ MsgBox "Compression error"
+ End If
+ Erase bytaryCpr
+ Erase bytaryOri
+End Sub
+
+Public Sub subUncompressFile(ByVal strargFilPth As String)
+ Dim bytaryCpr() As Byte
+ Dim bytaryOri() As Byte
+ Dim lngOriSiz As Long
+ Dim lngCprSiz As Long
+ Dim strOriPth As String
+ lngCprSiz = FileLen(strargFilPth)
+ ReDim bytaryCpr(lngCprSiz - 1)
+ Open strargFilPth For Binary Access Read As #1
+ Get #1, , bytaryCpr()
+ Close #1
+ 'Read the original file size value:
+ lngOriSiz = bytaryCpr(lngCprSiz - 1) * (2 ^ 24) _
+ + bytaryCpr(lngCprSiz - 2) * (2 ^ 16) _
+ + bytaryCpr(lngCprSiz - 3) * (2 ^ 8) _
+ + bytaryCpr(lngCprSiz - 4)
+ ReDim Preserve bytaryCpr(lngCprSiz - 5) 'Cut of the original size value
+ ReDim bytaryOri(lngOriSiz - 1)
+ If lngfncUcp(bytaryOri(0), lngOriSiz, bytaryCpr(0), lngCprSiz) = SUCCESS
+Then
+ strOriPth = Left(strargFilPth, Len(strargFilPth) - Len(strFilExt))
+ Open strOriPth For Binary Access Write As #1
+ Put #1, , bytaryOri()
+ Close #1
+ Else
+ MsgBox "Uncompression error"
+ End If
+ Erase bytaryCpr
+ Erase bytaryOri
+End Sub
+Public Property Get lngPercentSmaller() As Long
+ lngPercentSmaller = lngpvtPcnSml
+End Property
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/README400 b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/README400
new file mode 100644
index 000000000..4f98334f5
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/README400
@@ -0,0 +1,48 @@
+ ZLIB version 1.2.11 for OS/400 installation instructions
+
+1) Download and unpack the zlib tarball to some IFS directory.
+ (i.e.: /path/to/the/zlib/ifs/source/directory)
+
+ If the installed IFS command suppors gzip format, this is straightforward,
+else you have to unpack first to some directory on a system supporting it,
+then move the whole directory to the IFS via the network (via SMB or FTP).
+
+2) Edit the configuration parameters in the compilation script.
+
+ EDTF STMF('/path/to/the/zlib/ifs/source/directory/os400/make.sh')
+
+Tune the parameters according to your needs if not matching the defaults.
+Save the file and exit after edition.
+
+3) Enter qshell, then work in the zlib OS/400 specific directory.
+
+ QSH
+ cd /path/to/the/zlib/ifs/source/directory/os400
+
+4) Compile and install
+
+ sh make.sh
+
+The script will:
+- create the libraries, objects and IFS directories for the zlib environment,
+- compile all modules,
+- create a service program,
+- create a static and a dynamic binding directory,
+- install header files for C/C++ and for ILE/RPG, both for compilation in
+ DB2 and IFS environments.
+
+That's all.
+
+
+Notes: For OS/400 ILE RPG programmers, a /copy member defining the ZLIB
+ API prototypes for ILE RPG can be found in ZLIB/H(ZLIB.INC).
+ In the ILE environment, the same definitions are available from
+ file zlib.inc located in the same IFS include directory as the
+ C/C++ header files.
+ Please read comments in this member for more information.
+
+ Remember that most foreign textual data are ASCII coded: this
+ implementation does not handle conversion from/to ASCII, so
+ text data code conversions must be done explicitely.
+
+ Mainly for the reason above, always open zipped files in binary mode.
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/bndsrc b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/bndsrc
new file mode 100644
index 000000000..5e6e0a2f0
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/bndsrc
@@ -0,0 +1,119 @@
+STRPGMEXP PGMLVL(*CURRENT) SIGNATURE('ZLIB')
+
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+/* Version 1.1.3 entry points. */
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+
+ EXPORT SYMBOL("adler32")
+ EXPORT SYMBOL("compress")
+ EXPORT SYMBOL("compress2")
+ EXPORT SYMBOL("crc32")
+ EXPORT SYMBOL("get_crc_table")
+ EXPORT SYMBOL("deflate")
+ EXPORT SYMBOL("deflateEnd")
+ EXPORT SYMBOL("deflateSetDictionary")
+ EXPORT SYMBOL("deflateCopy")
+ EXPORT SYMBOL("deflateReset")
+ EXPORT SYMBOL("deflateParams")
+ EXPORT SYMBOL("deflatePrime")
+ EXPORT SYMBOL("deflateInit_")
+ EXPORT SYMBOL("deflateInit2_")
+ EXPORT SYMBOL("gzopen")
+ EXPORT SYMBOL("gzdopen")
+ EXPORT SYMBOL("gzsetparams")
+ EXPORT SYMBOL("gzread")
+ EXPORT SYMBOL("gzwrite")
+ EXPORT SYMBOL("gzprintf")
+ EXPORT SYMBOL("gzputs")
+ EXPORT SYMBOL("gzgets")
+ EXPORT SYMBOL("gzputc")
+ EXPORT SYMBOL("gzgetc")
+ EXPORT SYMBOL("gzflush")
+ EXPORT SYMBOL("gzseek")
+ EXPORT SYMBOL("gzrewind")
+ EXPORT SYMBOL("gztell")
+ EXPORT SYMBOL("gzeof")
+ EXPORT SYMBOL("gzclose")
+ EXPORT SYMBOL("gzerror")
+ EXPORT SYMBOL("inflate")
+ EXPORT SYMBOL("inflateEnd")
+ EXPORT SYMBOL("inflateSetDictionary")
+ EXPORT SYMBOL("inflateSync")
+ EXPORT SYMBOL("inflateReset")
+ EXPORT SYMBOL("inflateInit_")
+ EXPORT SYMBOL("inflateInit2_")
+ EXPORT SYMBOL("inflateSyncPoint")
+ EXPORT SYMBOL("uncompress")
+ EXPORT SYMBOL("zlibVersion")
+ EXPORT SYMBOL("zError")
+ EXPORT SYMBOL("z_errmsg")
+
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+/* Version 1.2.1 additional entry points. */
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+
+ EXPORT SYMBOL("compressBound")
+ EXPORT SYMBOL("deflateBound")
+ EXPORT SYMBOL("deflatePending")
+ EXPORT SYMBOL("gzungetc")
+ EXPORT SYMBOL("gzclearerr")
+ EXPORT SYMBOL("inflateBack")
+ EXPORT SYMBOL("inflateBackEnd")
+ EXPORT SYMBOL("inflateBackInit_")
+ EXPORT SYMBOL("inflateCopy")
+ EXPORT SYMBOL("zlibCompileFlags")
+
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+/* Version 1.2.4 additional entry points. */
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+
+ EXPORT SYMBOL("adler32_combine")
+ EXPORT SYMBOL("adler32_combine64")
+ EXPORT SYMBOL("crc32_combine")
+ EXPORT SYMBOL("crc32_combine64")
+ EXPORT SYMBOL("deflateSetHeader")
+ EXPORT SYMBOL("deflateTune")
+ EXPORT SYMBOL("gzbuffer")
+ EXPORT SYMBOL("gzclose_r")
+ EXPORT SYMBOL("gzclose_w")
+ EXPORT SYMBOL("gzdirect")
+ EXPORT SYMBOL("gzoffset")
+ EXPORT SYMBOL("gzoffset64")
+ EXPORT SYMBOL("gzopen64")
+ EXPORT SYMBOL("gzseek64")
+ EXPORT SYMBOL("gztell64")
+ EXPORT SYMBOL("inflateGetHeader")
+ EXPORT SYMBOL("inflateMark")
+ EXPORT SYMBOL("inflatePrime")
+ EXPORT SYMBOL("inflateReset2")
+ EXPORT SYMBOL("inflateUndermine")
+
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+/* Version 1.2.6 additional entry points. */
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+
+ EXPORT SYMBOL("deflateResetKeep")
+ EXPORT SYMBOL("gzgetc_")
+ EXPORT SYMBOL("inflateResetKeep")
+
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+/* Version 1.2.8 additional entry points. */
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+
+ EXPORT SYMBOL("gzvprintf")
+ EXPORT SYMBOL("inflateGetDictionary")
+
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+/* Version 1.2.9 additional entry points. */
+/*@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@*/
+
+ EXPORT SYMBOL("adler32_z")
+ EXPORT SYMBOL("crc32_z")
+ EXPORT SYMBOL("deflateGetDictionary")
+ EXPORT SYMBOL("gzfread")
+ EXPORT SYMBOL("gzfwrite")
+ EXPORT SYMBOL("inflateCodesUsed")
+ EXPORT SYMBOL("inflateValidate")
+ EXPORT SYMBOL("uncompress2")
+
+ENDPGMEXP
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/make.sh b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/make.sh
new file mode 100644
index 000000000..19eec117a
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/make.sh
@@ -0,0 +1,366 @@
+#!/bin/sh
+#
+# ZLIB compilation script for the OS/400.
+#
+#
+# This is a shell script since make is not a standard component of OS/400.
+
+
+################################################################################
+#
+# Tunable configuration parameters.
+#
+################################################################################
+
+TARGETLIB='ZLIB' # Target OS/400 program library
+STATBNDDIR='ZLIB_A' # Static binding directory.
+DYNBNDDIR='ZLIB' # Dynamic binding directory.
+SRVPGM="ZLIB" # Service program.
+IFSDIR='/zlib' # IFS support base directory.
+TGTCCSID='500' # Target CCSID of objects
+DEBUG='*NONE' # Debug level
+OPTIMIZE='40' # Optimisation level
+OUTPUT='*NONE' # Compilation output option.
+TGTRLS='V6R1M0' # Target OS release
+
+export TARGETLIB STATBNDDIR DYNBNDDIR SRVPGM IFSDIR
+export TGTCCSID DEBUG OPTIMIZE OUTPUT TGTRLS
+
+
+################################################################################
+#
+# OS/400 specific definitions.
+#
+################################################################################
+
+LIBIFSNAME="/QSYS.LIB/${TARGETLIB}.LIB"
+
+
+################################################################################
+#
+# Procedures.
+#
+################################################################################
+
+# action_needed dest [src]
+#
+# dest is an object to build
+# if specified, src is an object on which dest depends.
+#
+# exit 0 (succeeds) if some action has to be taken, else 1.
+
+action_needed()
+
+{
+ [ ! -e "${1}" ] && return 0
+ [ "${2}" ] || return 1
+ [ "${1}" -ot "${2}" ] && return 0
+ return 1
+}
+
+
+# make_module module_name source_name [additional_definitions]
+#
+# Compile source name into module if needed.
+# As side effect, append the module name to variable MODULES.
+# Set LINK to "YES" if the module has been compiled.
+
+make_module()
+
+{
+ MODULES="${MODULES} ${1}"
+ MODIFSNAME="${LIBIFSNAME}/${1}.MODULE"
+ CSRC="`basename \"${2}\"`"
+
+ if action_needed "${MODIFSNAME}" "${2}"
+ then :
+ elif [ ! "`sed -e \"/<source name=\\\"${CSRC}\\\">/,/<\\\\/source>/!d\" \
+ -e '/<depend /!d' \
+ -e 's/.* name=\"\\([^\"]*\\)\".*/\\1/' < \"${TOPDIR}/treebuild.xml\" |
+ while read HDR
+ do if action_needed \"${MODIFSNAME}\" \"${IFSDIR}/include/${HDR}\"
+ then echo recompile
+ break
+ fi
+ done`" ]
+ then return 0
+ fi
+
+ CMD="CRTCMOD MODULE(${TARGETLIB}/${1}) SRCSTMF('${2}')"
+ CMD="${CMD} SYSIFCOPT(*IFS64IO) OPTION(*INCDIRFIRST)"
+ CMD="${CMD} LOCALETYPE(*LOCALE) FLAG(10)"
+ CMD="${CMD} INCDIR('${IFSDIR}/include' ${INCLUDES})"
+ CMD="${CMD} TGTCCSID(${TGTCCSID}) TGTRLS(${TGTRLS})"
+ CMD="${CMD} OUTPUT(${OUTPUT})"
+ CMD="${CMD} OPTIMIZE(${OPTIMIZE})"
+ CMD="${CMD} DBGVIEW(${DEBUG})"
+ system "${CMD}"
+ LINK=YES
+}
+
+
+# Determine DB2 object name from IFS name.
+
+db2_name()
+
+{
+ basename "${1}" |
+ tr 'a-z-' 'A-Z_' |
+ sed -e 's/\..*//' \
+ -e 's/^\(.\).*\(.........\)$/\1\2/'
+}
+
+
+# Force enumeration types to be the same size as integers.
+
+copy_hfile()
+
+{
+ sed -e '1i\
+#pragma enum(int)\
+' "${@}" -e '$a\
+#pragma enum(pop)\
+'
+}
+
+
+################################################################################
+#
+# Script initialization.
+#
+################################################################################
+
+SCRIPTDIR=`dirname "${0}"`
+
+case "${SCRIPTDIR}" in
+/*) ;;
+*) SCRIPTDIR="`pwd`/${SCRIPTDIR}"
+esac
+
+while true
+do case "${SCRIPTDIR}" in
+ */.) SCRIPTDIR="${SCRIPTDIR%/.}";;
+ *) break;;
+ esac
+done
+
+# The script directory is supposed to be in ${TOPDIR}/os400.
+
+TOPDIR=`dirname "${SCRIPTDIR}"`
+export SCRIPTDIR TOPDIR
+cd "${TOPDIR}"
+
+
+# Extract the version from the master compilation XML file.
+
+VERSION=`sed -e '/^<package /!d' \
+ -e 's/^.* version="\([0-9.]*\)".*$/\1/' -e 'q' \
+ < treebuild.xml`
+export VERSION
+
+################################################################################
+
+
+# Create the OS/400 library if it does not exist.
+
+if action_needed "${LIBIFSNAME}"
+then CMD="CRTLIB LIB(${TARGETLIB}) TEXT('ZLIB: Data compression API')"
+ system "${CMD}"
+fi
+
+
+# Create the DOCS source file if it does not exist.
+
+if action_needed "${LIBIFSNAME}/DOCS.FILE"
+then CMD="CRTSRCPF FILE(${TARGETLIB}/DOCS) RCDLEN(112)"
+ CMD="${CMD} CCSID(${TGTCCSID}) TEXT('Documentation texts')"
+ system "${CMD}"
+fi
+
+# Copy some documentation files if needed.
+
+for TEXT in "${TOPDIR}/ChangeLog" "${TOPDIR}/FAQ" \
+ "${TOPDIR}/README" "${SCRIPTDIR}/README400"
+do MEMBER="${LIBIFSNAME}/DOCS.FILE/`db2_name \"${TEXT}\"`.MBR"
+
+ if action_needed "${MEMBER}" "${TEXT}"
+ then CMD="CPY OBJ('${TEXT}') TOOBJ('${MEMBER}') TOCCSID(${TGTCCSID})"
+ CMD="${CMD} DTAFMT(*TEXT) REPLACE(*YES)"
+ system "${CMD}"
+ fi
+done
+
+
+# Create the OS/400 source program file for the C header files.
+
+SRCPF="${LIBIFSNAME}/H.FILE"
+
+if action_needed "${SRCPF}"
+then CMD="CRTSRCPF FILE(${TARGETLIB}/H) RCDLEN(112)"
+ CMD="${CMD} CCSID(${TGTCCSID}) TEXT('ZLIB: C/C++ header files')"
+ system "${CMD}"
+fi
+
+
+# Create the IFS directory for the C header files.
+
+if action_needed "${IFSDIR}/include"
+then mkdir -p "${IFSDIR}/include"
+fi
+
+# Copy the header files to DB2 library. Link from IFS include directory.
+
+for HFILE in "${TOPDIR}/"*.h
+do DEST="${SRCPF}/`db2_name \"${HFILE}\"`.MBR"
+
+ if action_needed "${DEST}" "${HFILE}"
+ then copy_hfile < "${HFILE}" > tmphdrfile
+
+ # Need to translate to target CCSID.
+
+ CMD="CPY OBJ('`pwd`/tmphdrfile') TOOBJ('${DEST}')"
+ CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
+ system "${CMD}"
+ # touch -r "${HFILE}" "${DEST}"
+ rm -f tmphdrfile
+ fi
+
+ IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`"
+
+ if action_needed "${IFSFILE}" "${DEST}"
+ then rm -f "${IFSFILE}"
+ ln -s "${DEST}" "${IFSFILE}"
+ fi
+done
+
+
+# Install the ILE/RPG header file.
+
+
+HFILE="${SCRIPTDIR}/zlib.inc"
+DEST="${SRCPF}/ZLIB.INC.MBR"
+
+if action_needed "${DEST}" "${HFILE}"
+then CMD="CPY OBJ('${HFILE}') TOOBJ('${DEST}')"
+ CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
+ system "${CMD}"
+ # touch -r "${HFILE}" "${DEST}"
+fi
+
+IFSFILE="${IFSDIR}/include/`basename \"${HFILE}\"`"
+
+if action_needed "${IFSFILE}" "${DEST}"
+then rm -f "${IFSFILE}"
+ ln -s "${DEST}" "${IFSFILE}"
+fi
+
+
+# Create and compile the identification source file.
+
+echo '#pragma comment(user, "ZLIB version '"${VERSION}"'")' > os400.c
+echo '#pragma comment(user, __DATE__)' >> os400.c
+echo '#pragma comment(user, __TIME__)' >> os400.c
+echo '#pragma comment(copyright, "Copyright (C) 1995-2017 Jean-Loup Gailly, Mark Adler. OS/400 version by P. Monnerat.")' >> os400.c
+make_module OS400 os400.c
+LINK= # No need to rebuild service program yet.
+MODULES=
+
+
+# Get source list.
+
+CSOURCES=`sed -e '/<source name="/!d' \
+ -e 's/.* name="\([^"]*\)".*/\1/' < treebuild.xml`
+
+# Compile the sources into modules.
+
+for SRC in ${CSOURCES}
+do MODULE=`db2_name "${SRC}"`
+ make_module "${MODULE}" "${SRC}"
+done
+
+
+# If needed, (re)create the static binding directory.
+
+if action_needed "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR"
+then LINK=YES
+fi
+
+if [ "${LINK}" ]
+then rm -rf "${LIBIFSNAME}/${STATBNDDIR}.BNDDIR"
+ CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${STATBNDDIR})"
+ CMD="${CMD} TEXT('ZLIB static binding directory')"
+ system "${CMD}"
+
+ for MODULE in ${MODULES}
+ do CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${STATBNDDIR})"
+ CMD="${CMD} OBJ((${TARGETLIB}/${MODULE} *MODULE))"
+ system "${CMD}"
+ done
+fi
+
+
+# The exportation file for service program creation must be in a DB2
+# source file, so make sure it exists.
+
+if action_needed "${LIBIFSNAME}/TOOLS.FILE"
+then CMD="CRTSRCPF FILE(${TARGETLIB}/TOOLS) RCDLEN(112)"
+ CMD="${CMD} CCSID(${TGTCCSID}) TEXT('ZLIB: build tools')"
+ system "${CMD}"
+fi
+
+
+DEST="${LIBIFSNAME}/TOOLS.FILE/BNDSRC.MBR"
+
+if action_needed "${SCRIPTDIR}/bndsrc" "${DEST}"
+then CMD="CPY OBJ('${SCRIPTDIR}/bndsrc') TOOBJ('${DEST}')"
+ CMD="${CMD} TOCCSID(${TGTCCSID}) DTAFMT(*TEXT) REPLACE(*YES)"
+ system "${CMD}"
+ # touch -r "${SCRIPTDIR}/bndsrc" "${DEST}"
+ LINK=YES
+fi
+
+
+# Build the service program if needed.
+
+if action_needed "${LIBIFSNAME}/${SRVPGM}.SRVPGM"
+then LINK=YES
+fi
+
+if [ "${LINK}" ]
+then CMD="CRTSRVPGM SRVPGM(${TARGETLIB}/${SRVPGM})"
+ CMD="${CMD} SRCFILE(${TARGETLIB}/TOOLS) SRCMBR(BNDSRC)"
+ CMD="${CMD} MODULE(${TARGETLIB}/OS400)"
+ CMD="${CMD} BNDDIR(${TARGETLIB}/${STATBNDDIR})"
+ CMD="${CMD} TEXT('ZLIB ${VERSION} dynamic library')"
+ CMD="${CMD} TGTRLS(${TGTRLS})"
+ system "${CMD}"
+ LINK=YES
+
+ # Duplicate the service program for a versioned backup.
+
+ BACKUP=`echo "${SRVPGM}${VERSION}" |
+ sed -e 's/.*\(..........\)$/\1/' -e 's/\./_/g'`
+ BACKUP="`db2_name \"${BACKUP}\"`"
+ BKUPIFSNAME="${LIBIFSNAME}/${BACKUP}.SRVPGM"
+ rm -f "${BKUPIFSNAME}"
+ CMD="CRTDUPOBJ OBJ(${SRVPGM}) FROMLIB(${TARGETLIB})"
+ CMD="${CMD} OBJTYPE(*SRVPGM) NEWOBJ(${BACKUP})"
+ system "${CMD}"
+fi
+
+
+# If needed, (re)create the dynamic binding directory.
+
+if action_needed "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
+then LINK=YES
+fi
+
+if [ "${LINK}" ]
+then rm -rf "${LIBIFSNAME}/${DYNBNDDIR}.BNDDIR"
+ CMD="CRTBNDDIR BNDDIR(${TARGETLIB}/${DYNBNDDIR})"
+ CMD="${CMD} TEXT('ZLIB dynamic binding directory')"
+ system "${CMD}"
+ CMD="ADDBNDDIRE BNDDIR(${TARGETLIB}/${DYNBNDDIR})"
+ CMD="${CMD} OBJ((*LIBL/${SRVPGM} *SRVPGM))"
+ system "${CMD}"
+fi
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/zlib.inc b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/zlib.inc
new file mode 100644
index 000000000..c6aca2cbd
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/os400/zlib.inc
@@ -0,0 +1,527 @@
+ * ZLIB.INC - Interface to the general purpose compression library
+ *
+ * ILE RPG400 version by Patrick Monnerat, DATASPHERE.
+ * Version 1.2.11
+ *
+ *
+ * WARNING:
+ * Procedures inflateInit(), inflateInit2(), deflateInit(),
+ * deflateInit2() and inflateBackInit() need to be called with
+ * two additional arguments:
+ * the package version string and the stream control structure.
+ * size. This is needed because RPG lacks some macro feature.
+ * Call these procedures as:
+ * inflateInit(...: ZLIB_VERSION: %size(z_stream))
+ *
+ /if not defined(ZLIB_H_)
+ /define ZLIB_H_
+ *
+ **************************************************************************
+ * Constants
+ **************************************************************************
+ *
+ * Versioning information.
+ *
+ D ZLIB_VERSION C '1.2.11'
+ D ZLIB_VERNUM C X'12a0'
+ D ZLIB_VER_MAJOR C 1
+ D ZLIB_VER_MINOR C 2
+ D ZLIB_VER_REVISION...
+ D C 11
+ D ZLIB_VER_SUBREVISION...
+ D C 0
+ *
+ * Other equates.
+ *
+ D Z_NO_FLUSH C 0
+ D Z_PARTIAL_FLUSH...
+ D C 1
+ D Z_SYNC_FLUSH C 2
+ D Z_FULL_FLUSH C 3
+ D Z_FINISH C 4
+ D Z_BLOCK C 5
+ D Z_TREES C 6
+ *
+ D Z_OK C 0
+ D Z_STREAM_END C 1
+ D Z_NEED_DICT C 2
+ D Z_ERRNO C -1
+ D Z_STREAM_ERROR C -2
+ D Z_DATA_ERROR C -3
+ D Z_MEM_ERROR C -4
+ D Z_BUF_ERROR C -5
+ D Z_VERSION_ERROR C -6
+ *
+ D Z_NO_COMPRESSION...
+ D C 0
+ D Z_BEST_SPEED C 1
+ D Z_BEST_COMPRESSION...
+ D C 9
+ D Z_DEFAULT_COMPRESSION...
+ D C -1
+ *
+ D Z_FILTERED C 1
+ D Z_HUFFMAN_ONLY C 2
+ D Z_RLE C 3
+ D Z_DEFAULT_STRATEGY...
+ D C 0
+ *
+ D Z_BINARY C 0
+ D Z_ASCII C 1
+ D Z_UNKNOWN C 2
+ *
+ D Z_DEFLATED C 8
+ *
+ D Z_NULL C 0
+ *
+ **************************************************************************
+ * Types
+ **************************************************************************
+ *
+ D z_streamp S * Stream struct ptr
+ D gzFile S * File pointer
+ D gz_headerp S *
+ D z_off_t S 10i 0 Stream offsets
+ D z_off64_t S 20i 0 Stream offsets
+ *
+ **************************************************************************
+ * Structures
+ **************************************************************************
+ *
+ * The GZIP encode/decode stream support structure.
+ *
+ D z_stream DS align based(z_streamp)
+ D zs_next_in * Next input byte
+ D zs_avail_in 10U 0 Byte cnt at next_in
+ D zs_total_in 10U 0 Total bytes read
+ D zs_next_out * Output buffer ptr
+ D zs_avail_out 10U 0 Room left @ next_out
+ D zs_total_out 10U 0 Total bytes written
+ D zs_msg * Last errmsg or null
+ D zs_state * Internal state
+ D zs_zalloc * procptr Int. state allocator
+ D zs_free * procptr Int. state dealloc.
+ D zs_opaque * Private alloc. data
+ D zs_data_type 10i 0 ASC/BIN best guess
+ D zs_adler 10u 0 Uncompr. adler32 val
+ D 10U 0 Reserved
+ D 10U 0 Ptr. alignment
+ *
+ **************************************************************************
+ * Utility function prototypes
+ **************************************************************************
+ *
+ D compress PR 10I 0 extproc('compress')
+ D dest 65535 options(*varsize) Destination buffer
+ D destLen 10U 0 Destination length
+ D source 65535 const options(*varsize) Source buffer
+ D sourceLen 10u 0 value Source length
+ *
+ D compress2 PR 10I 0 extproc('compress2')
+ D dest 65535 options(*varsize) Destination buffer
+ D destLen 10U 0 Destination length
+ D source 65535 const options(*varsize) Source buffer
+ D sourceLen 10U 0 value Source length
+ D level 10I 0 value Compression level
+ *
+ D compressBound PR 10U 0 extproc('compressBound')
+ D sourceLen 10U 0 value
+ *
+ D uncompress PR 10I 0 extproc('uncompress')
+ D dest 65535 options(*varsize) Destination buffer
+ D destLen 10U 0 Destination length
+ D source 65535 const options(*varsize) Source buffer
+ D sourceLen 10U 0 value Source length
+ *
+ D uncompress2 PR 10I 0 extproc('uncompress2')
+ D dest 65535 options(*varsize) Destination buffer
+ D destLen 10U 0 Destination length
+ D source 65535 const options(*varsize) Source buffer
+ D sourceLen 10U 0 Source length
+ *
+ /if not defined(LARGE_FILES)
+ D gzopen PR extproc('gzopen')
+ D like(gzFile)
+ D path * value options(*string) File pathname
+ D mode * value options(*string) Open mode
+ /else
+ D gzopen PR extproc('gzopen64')
+ D like(gzFile)
+ D path * value options(*string) File pathname
+ D mode * value options(*string) Open mode
+ *
+ D gzopen64 PR extproc('gzopen64')
+ D like(gzFile)
+ D path * value options(*string) File pathname
+ D mode * value options(*string) Open mode
+ /endif
+ *
+ D gzdopen PR extproc('gzdopen')
+ D like(gzFile)
+ D fd 10I 0 value File descriptor
+ D mode * value options(*string) Open mode
+ *
+ D gzbuffer PR 10I 0 extproc('gzbuffer')
+ D file value like(gzFile) File pointer
+ D size 10U 0 value
+ *
+ D gzsetparams PR 10I 0 extproc('gzsetparams')
+ D file value like(gzFile) File pointer
+ D level 10I 0 value
+ D strategy 10I 0 value
+ *
+ D gzread PR 10I 0 extproc('gzread')
+ D file value like(gzFile) File pointer
+ D buf 65535 options(*varsize) Buffer
+ D len 10u 0 value Buffer length
+ *
+ D gzfread PR 20I 0 extproc('gzfread')
+ D buf 65535 options(*varsize) Buffer
+ D size 20u 0 value Buffer length
+ D nitems 20u 0 value Buffer length
+ D file value like(gzFile) File pointer
+ *
+ D gzwrite PR 10I 0 extproc('gzwrite')
+ D file value like(gzFile) File pointer
+ D buf 65535 const options(*varsize) Buffer
+ D len 10u 0 value Buffer length
+ *
+ D gzfwrite PR 20I 0 extproc('gzfwrite')
+ D buf 65535 options(*varsize) Buffer
+ D size 20u 0 value Buffer length
+ D nitems 20u 0 value Buffer length
+ D file value like(gzFile) File pointer
+ *
+ D gzputs PR 10I 0 extproc('gzputs')
+ D file value like(gzFile) File pointer
+ D s * value options(*string) String to output
+ *
+ D gzgets PR * extproc('gzgets')
+ D file value like(gzFile) File pointer
+ D buf 65535 options(*varsize) Read buffer
+ D len 10i 0 value Buffer length
+ *
+ D gzputc PR 10i 0 extproc('gzputc')
+ D file value like(gzFile) File pointer
+ D c 10I 0 value Character to write
+ *
+ D gzgetc PR 10i 0 extproc('gzgetc')
+ D file value like(gzFile) File pointer
+ *
+ D gzgetc_ PR 10i 0 extproc('gzgetc_')
+ D file value like(gzFile) File pointer
+ *
+ D gzungetc PR 10i 0 extproc('gzungetc')
+ D c 10I 0 value Character to push
+ D file value like(gzFile) File pointer
+ *
+ D gzflush PR 10i 0 extproc('gzflush')
+ D file value like(gzFile) File pointer
+ D flush 10I 0 value Type of flush
+ *
+ /if not defined(LARGE_FILES)
+ D gzseek PR extproc('gzseek')
+ D like(z_off_t)
+ D file value like(gzFile) File pointer
+ D offset value like(z_off_t) Offset
+ D whence 10i 0 value Origin
+ /else
+ D gzseek PR extproc('gzseek64')
+ D like(z_off_t)
+ D file value like(gzFile) File pointer
+ D offset value like(z_off_t) Offset
+ D whence 10i 0 value Origin
+ *
+ D gzseek64 PR extproc('gzseek64')
+ D like(z_off64_t)
+ D file value like(gzFile) File pointer
+ D offset value like(z_off64_t) Offset
+ D whence 10i 0 value Origin
+ /endif
+ *
+ D gzrewind PR 10i 0 extproc('gzrewind')
+ D file value like(gzFile) File pointer
+ *
+ /if not defined(LARGE_FILES)
+ D gztell PR extproc('gztell')
+ D like(z_off_t)
+ D file value like(gzFile) File pointer
+ /else
+ D gztell PR extproc('gztell64')
+ D like(z_off_t)
+ D file value like(gzFile) File pointer
+ *
+ D gztell64 PR extproc('gztell64')
+ D like(z_off64_t)
+ D file value like(gzFile) File pointer
+ /endif
+ *
+ /if not defined(LARGE_FILES)
+ D gzoffset PR extproc('gzoffset')
+ D like(z_off_t)
+ D file value like(gzFile) File pointer
+ /else
+ D gzoffset PR extproc('gzoffset64')
+ D like(z_off_t)
+ D file value like(gzFile) File pointer
+ *
+ D gzoffset64 PR extproc('gzoffset64')
+ D like(z_off64_t)
+ D file value like(gzFile) File pointer
+ /endif
+ *
+ D gzeof PR 10i 0 extproc('gzeof')
+ D file value like(gzFile) File pointer
+ *
+ D gzdirect PR 10i 0 extproc('gzdirect')
+ D file value like(gzFile) File pointer
+ *
+ D gzclose_r PR 10i 0 extproc('gzclose_r')
+ D file value like(gzFile) File pointer
+ *
+ D gzclose_w PR 10i 0 extproc('gzclose_w')
+ D file value like(gzFile) File pointer
+ *
+ D gzclose PR 10i 0 extproc('gzclose')
+ D file value like(gzFile) File pointer
+ *
+ D gzerror PR * extproc('gzerror') Error string
+ D file value like(gzFile) File pointer
+ D errnum 10I 0 Error code
+ *
+ D gzclearerr PR extproc('gzclearerr')
+ D file value like(gzFile) File pointer
+ *
+ **************************************************************************
+ * Basic function prototypes
+ **************************************************************************
+ *
+ D zlibVersion PR * extproc('zlibVersion') Version string
+ *
+ D deflateInit PR 10I 0 extproc('deflateInit_') Init. compression
+ D strm like(z_stream) Compression stream
+ D level 10I 0 value Compression level
+ D version * value options(*string) Version string
+ D stream_size 10i 0 value Stream struct. size
+ *
+ D deflate PR 10I 0 extproc('deflate') Compress data
+ D strm like(z_stream) Compression stream
+ D flush 10I 0 value Flush type required
+ *
+ D deflateEnd PR 10I 0 extproc('deflateEnd') Termin. compression
+ D strm like(z_stream) Compression stream
+ *
+ D inflateInit PR 10I 0 extproc('inflateInit_') Init. expansion
+ D strm like(z_stream) Expansion stream
+ D version * value options(*string) Version string
+ D stream_size 10i 0 value Stream struct. size
+ *
+ D inflate PR 10I 0 extproc('inflate') Expand data
+ D strm like(z_stream) Expansion stream
+ D flush 10I 0 value Flush type required
+ *
+ D inflateEnd PR 10I 0 extproc('inflateEnd') Termin. expansion
+ D strm like(z_stream) Expansion stream
+ *
+ **************************************************************************
+ * Advanced function prototypes
+ **************************************************************************
+ *
+ D deflateInit2 PR 10I 0 extproc('deflateInit2_') Init. compression
+ D strm like(z_stream) Compression stream
+ D level 10I 0 value Compression level
+ D method 10I 0 value Compression method
+ D windowBits 10I 0 value log2(window size)
+ D memLevel 10I 0 value Mem/cmpress tradeoff
+ D strategy 10I 0 value Compression strategy
+ D version * value options(*string) Version string
+ D stream_size 10i 0 value Stream struct. size
+ *
+ D deflateSetDictionary...
+ D PR 10I 0 extproc('deflateSetDictionary') Init. dictionary
+ D strm like(z_stream) Compression stream
+ D dictionary 65535 const options(*varsize) Dictionary bytes
+ D dictLength 10U 0 value Dictionary length
+ *
+ D deflateCopy PR 10I 0 extproc('deflateCopy') Compress strm 2 strm
+ D dest like(z_stream) Destination stream
+ D source like(z_stream) Source stream
+ *
+ D deflateReset PR 10I 0 extproc('deflateReset') End and init. stream
+ D strm like(z_stream) Compression stream
+ *
+ D deflateParams PR 10I 0 extproc('deflateParams') Change level & strat
+ D strm like(z_stream) Compression stream
+ D level 10I 0 value Compression level
+ D strategy 10I 0 value Compression strategy
+ *
+ D deflateTune PR 10I 0 extproc('deflateTune')
+ D strm like(z_stream) Compression stream
+ D good 10I 0 value
+ D lazy 10I 0 value
+ D nice 10I 0 value
+ D chain 10I 0 value
+ *
+ D deflateBound PR 10U 0 extproc('deflateBound') Change level & strat
+ D strm like(z_stream) Compression stream
+ D sourcelen 10U 0 value Compression level
+ *
+ D deflatePending PR 10I 0 extproc('deflatePending') Change level & strat
+ D strm like(z_stream) Compression stream
+ D pending 10U 0 Pending bytes
+ D bits 10I 0 Pending bits
+ *
+ D deflatePrime PR 10I 0 extproc('deflatePrime') Change level & strat
+ D strm like(z_stream) Compression stream
+ D bits 10I 0 value # of bits to insert
+ D value 10I 0 value Bits to insert
+ *
+ D inflateInit2 PR 10I 0 extproc('inflateInit2_') Init. expansion
+ D strm like(z_stream) Expansion stream
+ D windowBits 10I 0 value log2(window size)
+ D version * value options(*string) Version string
+ D stream_size 10i 0 value Stream struct. size
+ *
+ D inflateSetDictionary...
+ D PR 10I 0 extproc('inflateSetDictionary') Init. dictionary
+ D strm like(z_stream) Expansion stream
+ D dictionary 65535 const options(*varsize) Dictionary bytes
+ D dictLength 10U 0 value Dictionary length
+ *
+ D inflateGetDictionary...
+ D PR 10I 0 extproc('inflateGetDictionary') Get dictionary
+ D strm like(z_stream) Expansion stream
+ D dictionary 65535 options(*varsize) Dictionary bytes
+ D dictLength 10U 0 Dictionary length
+ *
+ D deflateGetDictionary...
+ D PR 10I 0 extproc('deflateGetDictionary') Get dictionary
+ D strm like(z_stream) Expansion stream
+ D dictionary 65535 options(*varsize) Dictionary bytes
+ D dictLength 10U 0 Dictionary length
+ *
+ D inflateSync PR 10I 0 extproc('inflateSync') Sync. expansion
+ D strm like(z_stream) Expansion stream
+ *
+ D inflateCopy PR 10I 0 extproc('inflateCopy')
+ D dest like(z_stream) Destination stream
+ D source like(z_stream) Source stream
+ *
+ D inflateReset PR 10I 0 extproc('inflateReset') End and init. stream
+ D strm like(z_stream) Expansion stream
+ *
+ D inflateReset2 PR 10I 0 extproc('inflateReset2') End and init. stream
+ D strm like(z_stream) Expansion stream
+ D windowBits 10I 0 value Log2(buffer size)
+ *
+ D inflatePrime PR 10I 0 extproc('inflatePrime') Insert bits
+ D strm like(z_stream) Expansion stream
+ D bits 10I 0 value Bit count
+ D value 10I 0 value Bits to insert
+ *
+ D inflateMark PR 10I 0 extproc('inflateMark') Get inflate info
+ D strm like(z_stream) Expansion stream
+ *
+ D inflateCodesUsed...
+ PR 20U 0 extproc('inflateCodesUsed')
+ D strm like(z_stream) Expansion stream
+ *
+ D inflateValidate...
+ PR 20U 0 extproc('inflateValidate')
+ D strm like(z_stream) Expansion stream
+ D check 10I 0 value
+ *
+ D inflateGetHeader...
+ PR 10U 0 extproc('inflateGetHeader')
+ D strm like(z_stream) Expansion stream
+ D head like(gz_headerp)
+ *
+ D deflateSetHeader...
+ PR 10U 0 extproc('deflateSetHeader')
+ D strm like(z_stream) Expansion stream
+ D head like(gz_headerp)
+ *
+ D inflateBackInit...
+ D PR 10I 0 extproc('inflateBackInit_')
+ D strm like(z_stream) Expansion stream
+ D windowBits 10I 0 value Log2(buffer size)
+ D window 65535 options(*varsize) Buffer
+ D version * value options(*string) Version string
+ D stream_size 10i 0 value Stream struct. size
+ *
+ D inflateBack PR 10I 0 extproc('inflateBack')
+ D strm like(z_stream) Expansion stream
+ D in * value procptr Input function
+ D in_desc * value Input descriptor
+ D out * value procptr Output function
+ D out_desc * value Output descriptor
+ *
+ D inflateBackEnd PR 10I 0 extproc('inflateBackEnd')
+ D strm like(z_stream) Expansion stream
+ *
+ D zlibCompileFlags...
+ D PR 10U 0 extproc('zlibCompileFlags')
+ *
+ **************************************************************************
+ * Checksum function prototypes
+ **************************************************************************
+ *
+ D adler32 PR 10U 0 extproc('adler32') New checksum
+ D adler 10U 0 value Old checksum
+ D buf 65535 const options(*varsize) Bytes to accumulate
+ D len 10U 0 value Buffer length
+ *
+ D adler32_combine...
+ PR 10U 0 extproc('adler32_combine') New checksum
+ D adler1 10U 0 value Old checksum
+ D adler2 10U 0 value Old checksum
+ D len2 20U 0 value Buffer length
+ *
+ D adler32_z PR 10U 0 extproc('adler32_z') New checksum
+ D adler 10U 0 value Old checksum
+ D buf 65535 const options(*varsize) Bytes to accumulate
+ D len 20U 0 value Buffer length
+ *
+ D crc32 PR 10U 0 extproc('crc32') New checksum
+ D crc 10U 0 value Old checksum
+ D buf 65535 const options(*varsize) Bytes to accumulate
+ D len 10U 0 value Buffer length
+ *
+ D crc32_combine...
+ PR 10U 0 extproc('crc32_combine') New checksum
+ D crc1 10U 0 value Old checksum
+ D crc2 10U 0 value Old checksum
+ D len2 20U 0 value Buffer length
+ *
+ D crc32_z PR 10U 0 extproc('crc32_z') New checksum
+ D crc 10U 0 value Old checksum
+ D buf 65535 const options(*varsize) Bytes to accumulate
+ D len 20U 0 value Buffer length
+ *
+ **************************************************************************
+ * Miscellaneous function prototypes
+ **************************************************************************
+ *
+ D zError PR * extproc('zError') Error string
+ D err 10I 0 value Error code
+ *
+ D inflateSyncPoint...
+ D PR 10I 0 extproc('inflateSyncPoint')
+ D strm like(z_stream) Expansion stream
+ *
+ D get_crc_table PR * extproc('get_crc_table') Ptr to ulongs
+ *
+ D inflateUndermine...
+ D PR 10I 0 extproc('inflateUndermine')
+ D strm like(z_stream) Expansion stream
+ D arg 10I 0 value Error code
+ *
+ D inflateResetKeep...
+ D PR 10I 0 extproc('inflateResetKeep') End and init. stream
+ D strm like(z_stream) Expansion stream
+ *
+ D deflateResetKeep...
+ D PR 10I 0 extproc('deflateResetKeep') End and init. stream
+ D strm like(z_stream) Expansion stream
+ *
+ /endif
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/qnx/package.qpg b/src/boost/libs/beast/test/extern/zlib-1.2.11/qnx/package.qpg
new file mode 100644
index 000000000..31e8e90db
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/qnx/package.qpg
@@ -0,0 +1,141 @@
+<QPG:Generation>
+ <QPG:Options>
+ <QPG:User unattended="no" verbosity="2" listfiles="yes"/>
+ <QPG:Defaults type="qnx_package"/>
+ <QPG:Source></QPG:Source>
+ <QPG:Release number="+"/>
+ <QPG:Build></QPG:Build>
+ <QPG:FileSorting strip="yes"/>
+ <QPG:Package targets="combine"/>
+ <QPG:Repository generate="yes"/>
+ <QPG:FinalDir></QPG:FinalDir>
+ <QPG:Cleanup></QPG:Cleanup>
+ </QPG:Options>
+
+ <QPG:Responsible>
+ <QPG:Company></QPG:Company>
+ <QPG:Department></QPG:Department>
+ <QPG:Group></QPG:Group>
+ <QPG:Team></QPG:Team>
+ <QPG:Employee></QPG:Employee>
+ <QPG:EmailAddress></QPG:EmailAddress>
+ </QPG:Responsible>
+
+ <QPG:Values>
+ <QPG:Files>
+ <QPG:Add file="../zconf.h" install="/opt/include/" user="root:sys" permission="644"/>
+ <QPG:Add file="../zlib.h" install="/opt/include/" user="root:sys" permission="644"/>
+ <QPG:Add file="../libz.so.1.2.11" install="/opt/lib/" user="root:bin" permission="644"/>
+ <QPG:Add file="libz.so" install="/opt/lib/" component="dev" filetype="symlink" linkto="libz.so.1.2.11"/>
+ <QPG:Add file="libz.so.1" install="/opt/lib/" filetype="symlink" linkto="libz.so.1.2.11"/>
+ <QPG:Add file="../libz.so.1.2.11" install="/opt/lib/" component="slib"/>
+ </QPG:Files>
+
+ <QPG:PackageFilter>
+ <QPM:PackageManifest>
+ <QPM:PackageDescription>
+ <QPM:PackageType>Library</QPM:PackageType>
+ <QPM:PackageReleaseNotes></QPM:PackageReleaseNotes>
+ <QPM:PackageReleaseUrgency>Medium</QPM:PackageReleaseUrgency>
+ <QPM:PackageRepository></QPM:PackageRepository>
+ <QPM:FileVersion>2.0</QPM:FileVersion>
+ </QPM:PackageDescription>
+
+ <QPM:ProductDescription>
+ <QPM:ProductName>zlib</QPM:ProductName>
+ <QPM:ProductIdentifier>zlib</QPM:ProductIdentifier>
+ <QPM:ProductEmail>alain.bonnefoy@icbt.com</QPM:ProductEmail>
+ <QPM:VendorName>Public</QPM:VendorName>
+ <QPM:VendorInstallName>public</QPM:VendorInstallName>
+ <QPM:VendorURL>www.gzip.org/zlib</QPM:VendorURL>
+ <QPM:VendorEmbedURL></QPM:VendorEmbedURL>
+ <QPM:VendorEmail></QPM:VendorEmail>
+ <QPM:AuthorName>Jean-Loup Gailly,Mark Adler</QPM:AuthorName>
+ <QPM:AuthorURL>www.gzip.org/zlib</QPM:AuthorURL>
+ <QPM:AuthorEmbedURL></QPM:AuthorEmbedURL>
+ <QPM:AuthorEmail>zlib@gzip.org</QPM:AuthorEmail>
+ <QPM:ProductIconSmall></QPM:ProductIconSmall>
+ <QPM:ProductIconLarge></QPM:ProductIconLarge>
+ <QPM:ProductDescriptionShort>A massively spiffy yet delicately unobtrusive compression library.</QPM:ProductDescriptionShort>
+ <QPM:ProductDescriptionLong>zlib is designed to be a free, general-purpose, legally unencumbered, lossless data compression library for use on virtually any computer hardware and operating system.</QPM:ProductDescriptionLong>
+ <QPM:ProductDescriptionURL>http://www.gzip.org/zlib</QPM:ProductDescriptionURL>
+ <QPM:ProductDescriptionEmbedURL></QPM:ProductDescriptionEmbedURL>
+ </QPM:ProductDescription>
+
+ <QPM:ReleaseDescription>
+ <QPM:ReleaseVersion>1.2.11</QPM:ReleaseVersion>
+ <QPM:ReleaseUrgency>Medium</QPM:ReleaseUrgency>
+ <QPM:ReleaseStability>Stable</QPM:ReleaseStability>
+ <QPM:ReleaseNoteMinor></QPM:ReleaseNoteMinor>
+ <QPM:ReleaseNoteMajor></QPM:ReleaseNoteMajor>
+ <QPM:ExcludeCountries>
+ <QPM:Country></QPM:Country>
+ </QPM:ExcludeCountries>
+
+ <QPM:ReleaseCopyright>No License</QPM:ReleaseCopyright>
+ </QPM:ReleaseDescription>
+
+ <QPM:ContentDescription>
+ <QPM:ContentTopic xmlmultiple="true">Software Development/Libraries and Extensions/C Libraries</QPM:ContentTopic>
+ <QPM:ContentKeyword>zlib,compression</QPM:ContentKeyword>
+ <QPM:TargetOS>qnx6</QPM:TargetOS>
+ <QPM:HostOS>qnx6</QPM:HostOS>
+ <QPM:DisplayEnvironment xmlmultiple="true">None</QPM:DisplayEnvironment>
+ <QPM:TargetAudience xmlmultiple="true">Developer</QPM:TargetAudience>
+ </QPM:ContentDescription>
+ </QPM:PackageManifest>
+ </QPG:PackageFilter>
+
+ <QPG:PackageFilter proc="none" target="none">
+ <QPM:PackageManifest>
+ <QPM:ProductInstallationDependencies>
+ <QPM:ProductRequirements></QPM:ProductRequirements>
+ </QPM:ProductInstallationDependencies>
+
+ <QPM:ProductInstallationProcedure>
+ <QPM:Script xmlmultiple="true">
+ <QPM:ScriptName></QPM:ScriptName>
+ <QPM:ScriptType>Install</QPM:ScriptType>
+ <QPM:ScriptTiming>Post</QPM:ScriptTiming>
+ <QPM:ScriptBlocking>No</QPM:ScriptBlocking>
+ <QPM:ScriptResult>Ignore</QPM:ScriptResult>
+ <QPM:ShortDescription></QPM:ShortDescription>
+ <QPM:UseBinaries>No</QPM:UseBinaries>
+ <QPM:Priority>Optional</QPM:Priority>
+ </QPM:Script>
+ </QPM:ProductInstallationProcedure>
+ </QPM:PackageManifest>
+
+ <QPM:Launch>
+ </QPM:Launch>
+ </QPG:PackageFilter>
+
+ <QPG:PackageFilter type="core" component="none">
+ <QPM:PackageManifest>
+ <QPM:ProductInstallationProcedure>
+ <QPM:OrderDependency xmlmultiple="true">
+ <QPM:Order>InstallOver</QPM:Order>
+ <QPM:Product>zlib</QPM:Product>
+ </QPM:OrderDependency>
+ </QPM:ProductInstallationProcedure>
+ </QPM:PackageManifest>
+
+ <QPM:Launch>
+ </QPM:Launch>
+ </QPG:PackageFilter>
+
+ <QPG:PackageFilter type="core" component="dev">
+ <QPM:PackageManifest>
+ <QPM:ProductInstallationProcedure>
+ <QPM:OrderDependency xmlmultiple="true">
+ <QPM:Order>InstallOver</QPM:Order>
+ <QPM:Product>zlib-dev</QPM:Product>
+ </QPM:OrderDependency>
+ </QPM:ProductInstallationProcedure>
+ </QPM:PackageManifest>
+
+ <QPM:Launch>
+ </QPM:Launch>
+ </QPG:PackageFilter>
+ </QPG:Values>
+</QPG:Generation>
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/test/example.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/test/example.c
new file mode 100644
index 000000000..eee17ce7c
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/test/example.c
@@ -0,0 +1,602 @@
+/* example.c -- usage example of the zlib compression library
+ * Copyright (C) 1995-2006, 2011, 2016 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zlib.h"
+#include <stdio.h>
+
+#ifdef STDC
+# include <string.h>
+# include <stdlib.h>
+#endif
+
+#if defined(VMS) || defined(RISCOS)
+# define TESTFILE "foo-gz"
+#else
+# define TESTFILE "foo.gz"
+#endif
+
+#define CHECK_ERR(err, msg) { \
+ if (err != Z_OK) { \
+ fprintf(stderr, "%s error: %d\n", msg, err); \
+ exit(1); \
+ } \
+}
+
+static z_const char hello[] = "hello, hello!";
+/* "hello world" would be more standard, but the repeated "hello"
+ * stresses the compression code better, sorry...
+ */
+
+static const char dictionary[] = "hello";
+static uLong dictId; /* Adler32 value of the dictionary */
+
+void test_deflate OF((Byte *compr, uLong comprLen));
+void test_inflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_large_deflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_large_inflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_flush OF((Byte *compr, uLong *comprLen));
+void test_sync OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_dict_deflate OF((Byte *compr, uLong comprLen));
+void test_dict_inflate OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+int main OF((int argc, char *argv[]));
+
+
+#ifdef Z_SOLO
+
+void *myalloc OF((void *, unsigned, unsigned));
+void myfree OF((void *, void *));
+
+void *myalloc(q, n, m)
+ void *q;
+ unsigned n, m;
+{
+ (void)q;
+ return calloc(n, m);
+}
+
+void myfree(void *q, void *p)
+{
+ (void)q;
+ free(p);
+}
+
+static alloc_func zalloc = myalloc;
+static free_func zfree = myfree;
+
+#else /* !Z_SOLO */
+
+static alloc_func zalloc = (alloc_func)0;
+static free_func zfree = (free_func)0;
+
+void test_compress OF((Byte *compr, uLong comprLen,
+ Byte *uncompr, uLong uncomprLen));
+void test_gzio OF((const char *fname,
+ Byte *uncompr, uLong uncomprLen));
+
+/* ===========================================================================
+ * Test compress() and uncompress()
+ */
+void test_compress(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ uLong len = (uLong)strlen(hello)+1;
+
+ err = compress(compr, &comprLen, (const Bytef*)hello, len);
+ CHECK_ERR(err, "compress");
+
+ strcpy((char*)uncompr, "garbage");
+
+ err = uncompress(uncompr, &uncomprLen, compr, comprLen);
+ CHECK_ERR(err, "uncompress");
+
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad uncompress\n");
+ exit(1);
+ } else {
+ printf("uncompress(): %s\n", (char *)uncompr);
+ }
+}
+
+/* ===========================================================================
+ * Test read/write of .gz files
+ */
+void test_gzio(fname, uncompr, uncomprLen)
+ const char *fname; /* compressed file name */
+ Byte *uncompr;
+ uLong uncomprLen;
+{
+#ifdef NO_GZCOMPRESS
+ fprintf(stderr, "NO_GZCOMPRESS -- gz* functions cannot compress\n");
+#else
+ int err;
+ int len = (int)strlen(hello)+1;
+ gzFile file;
+ z_off_t pos;
+
+ file = gzopen(fname, "wb");
+ if (file == NULL) {
+ fprintf(stderr, "gzopen error\n");
+ exit(1);
+ }
+ gzputc(file, 'h');
+ if (gzputs(file, "ello") != 4) {
+ fprintf(stderr, "gzputs err: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ if (gzprintf(file, ", %s!", "hello") != 8) {
+ fprintf(stderr, "gzprintf err: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ gzseek(file, 1L, SEEK_CUR); /* add one zero byte */
+ gzclose(file);
+
+ file = gzopen(fname, "rb");
+ if (file == NULL) {
+ fprintf(stderr, "gzopen error\n");
+ exit(1);
+ }
+ strcpy((char*)uncompr, "garbage");
+
+ if (gzread(file, uncompr, (unsigned)uncomprLen) != len) {
+ fprintf(stderr, "gzread err: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad gzread: %s\n", (char*)uncompr);
+ exit(1);
+ } else {
+ printf("gzread(): %s\n", (char*)uncompr);
+ }
+
+ pos = gzseek(file, -8L, SEEK_CUR);
+ if (pos != 6 || gztell(file) != pos) {
+ fprintf(stderr, "gzseek error, pos=%ld, gztell=%ld\n",
+ (long)pos, (long)gztell(file));
+ exit(1);
+ }
+
+ if (gzgetc(file) != ' ') {
+ fprintf(stderr, "gzgetc error\n");
+ exit(1);
+ }
+
+ if (gzungetc(' ', file) != ' ') {
+ fprintf(stderr, "gzungetc error\n");
+ exit(1);
+ }
+
+ gzgets(file, (char*)uncompr, (int)uncomprLen);
+ if (strlen((char*)uncompr) != 7) { /* " hello!" */
+ fprintf(stderr, "gzgets err after gzseek: %s\n", gzerror(file, &err));
+ exit(1);
+ }
+ if (strcmp((char*)uncompr, hello + 6)) {
+ fprintf(stderr, "bad gzgets after gzseek\n");
+ exit(1);
+ } else {
+ printf("gzgets() after gzseek: %s\n", (char*)uncompr);
+ }
+
+ gzclose(file);
+#endif
+}
+
+#endif /* Z_SOLO */
+
+/* ===========================================================================
+ * Test deflate() with small buffers
+ */
+void test_deflate(compr, comprLen)
+ Byte *compr;
+ uLong comprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+ uLong len = (uLong)strlen(hello)+1;
+
+ c_stream.zalloc = zalloc;
+ c_stream.zfree = zfree;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
+ CHECK_ERR(err, "deflateInit");
+
+ c_stream.next_in = (z_const unsigned char *)hello;
+ c_stream.next_out = compr;
+
+ while (c_stream.total_in != len && c_stream.total_out < comprLen) {
+ c_stream.avail_in = c_stream.avail_out = 1; /* force small buffers */
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+ }
+ /* Finish the stream, still forcing small buffers: */
+ for (;;) {
+ c_stream.avail_out = 1;
+ err = deflate(&c_stream, Z_FINISH);
+ if (err == Z_STREAM_END) break;
+ CHECK_ERR(err, "deflate");
+ }
+
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+}
+
+/* ===========================================================================
+ * Test inflate() with small buffers
+ */
+void test_inflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = zalloc;
+ d_stream.zfree = zfree;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = 0;
+ d_stream.next_out = uncompr;
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ while (d_stream.total_out < uncomprLen && d_stream.total_in < comprLen) {
+ d_stream.avail_in = d_stream.avail_out = 1; /* force small buffers */
+ err = inflate(&d_stream, Z_NO_FLUSH);
+ if (err == Z_STREAM_END) break;
+ CHECK_ERR(err, "inflate");
+ }
+
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad inflate\n");
+ exit(1);
+ } else {
+ printf("inflate(): %s\n", (char *)uncompr);
+ }
+}
+
+/* ===========================================================================
+ * Test deflate() with large buffers and dynamic change of compression level
+ */
+void test_large_deflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+
+ c_stream.zalloc = zalloc;
+ c_stream.zfree = zfree;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_BEST_SPEED);
+ CHECK_ERR(err, "deflateInit");
+
+ c_stream.next_out = compr;
+ c_stream.avail_out = (uInt)comprLen;
+
+ /* At this point, uncompr is still mostly zeroes, so it should compress
+ * very well:
+ */
+ c_stream.next_in = uncompr;
+ c_stream.avail_in = (uInt)uncomprLen;
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+ if (c_stream.avail_in != 0) {
+ fprintf(stderr, "deflate not greedy\n");
+ exit(1);
+ }
+
+ /* Feed in already compressed data and switch to no compression: */
+ deflateParams(&c_stream, Z_NO_COMPRESSION, Z_DEFAULT_STRATEGY);
+ c_stream.next_in = compr;
+ c_stream.avail_in = (uInt)comprLen/2;
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+
+ /* Switch back to compressing mode: */
+ deflateParams(&c_stream, Z_BEST_COMPRESSION, Z_FILTERED);
+ c_stream.next_in = uncompr;
+ c_stream.avail_in = (uInt)uncomprLen;
+ err = deflate(&c_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "deflate");
+
+ err = deflate(&c_stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ fprintf(stderr, "deflate should report Z_STREAM_END\n");
+ exit(1);
+ }
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+}
+
+/* ===========================================================================
+ * Test inflate() with large buffers
+ */
+void test_large_inflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = zalloc;
+ d_stream.zfree = zfree;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = (uInt)comprLen;
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ for (;;) {
+ d_stream.next_out = uncompr; /* discard the output */
+ d_stream.avail_out = (uInt)uncomprLen;
+ err = inflate(&d_stream, Z_NO_FLUSH);
+ if (err == Z_STREAM_END) break;
+ CHECK_ERR(err, "large inflate");
+ }
+
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ if (d_stream.total_out != 2*uncomprLen + comprLen/2) {
+ fprintf(stderr, "bad large inflate: %ld\n", d_stream.total_out);
+ exit(1);
+ } else {
+ printf("large_inflate(): OK\n");
+ }
+}
+
+/* ===========================================================================
+ * Test deflate() with full flush
+ */
+void test_flush(compr, comprLen)
+ Byte *compr;
+ uLong *comprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+ uInt len = (uInt)strlen(hello)+1;
+
+ c_stream.zalloc = zalloc;
+ c_stream.zfree = zfree;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_DEFAULT_COMPRESSION);
+ CHECK_ERR(err, "deflateInit");
+
+ c_stream.next_in = (z_const unsigned char *)hello;
+ c_stream.next_out = compr;
+ c_stream.avail_in = 3;
+ c_stream.avail_out = (uInt)*comprLen;
+ err = deflate(&c_stream, Z_FULL_FLUSH);
+ CHECK_ERR(err, "deflate");
+
+ compr[3]++; /* force an error in first compressed block */
+ c_stream.avail_in = len - 3;
+
+ err = deflate(&c_stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ CHECK_ERR(err, "deflate");
+ }
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+
+ *comprLen = c_stream.total_out;
+}
+
+/* ===========================================================================
+ * Test inflateSync()
+ */
+void test_sync(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = zalloc;
+ d_stream.zfree = zfree;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = 2; /* just read the zlib header */
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ d_stream.next_out = uncompr;
+ d_stream.avail_out = (uInt)uncomprLen;
+
+ err = inflate(&d_stream, Z_NO_FLUSH);
+ CHECK_ERR(err, "inflate");
+
+ d_stream.avail_in = (uInt)comprLen-2; /* read all compressed data */
+ err = inflateSync(&d_stream); /* but skip the damaged part */
+ CHECK_ERR(err, "inflateSync");
+
+ err = inflate(&d_stream, Z_FINISH);
+ if (err != Z_DATA_ERROR) {
+ fprintf(stderr, "inflate should report DATA_ERROR\n");
+ /* Because of incorrect adler32 */
+ exit(1);
+ }
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ printf("after inflateSync(): hel%s\n", (char *)uncompr);
+}
+
+/* ===========================================================================
+ * Test deflate() with preset dictionary
+ */
+void test_dict_deflate(compr, comprLen)
+ Byte *compr;
+ uLong comprLen;
+{
+ z_stream c_stream; /* compression stream */
+ int err;
+
+ c_stream.zalloc = zalloc;
+ c_stream.zfree = zfree;
+ c_stream.opaque = (voidpf)0;
+
+ err = deflateInit(&c_stream, Z_BEST_COMPRESSION);
+ CHECK_ERR(err, "deflateInit");
+
+ err = deflateSetDictionary(&c_stream,
+ (const Bytef*)dictionary, (int)sizeof(dictionary));
+ CHECK_ERR(err, "deflateSetDictionary");
+
+ dictId = c_stream.adler;
+ c_stream.next_out = compr;
+ c_stream.avail_out = (uInt)comprLen;
+
+ c_stream.next_in = (z_const unsigned char *)hello;
+ c_stream.avail_in = (uInt)strlen(hello)+1;
+
+ err = deflate(&c_stream, Z_FINISH);
+ if (err != Z_STREAM_END) {
+ fprintf(stderr, "deflate should report Z_STREAM_END\n");
+ exit(1);
+ }
+ err = deflateEnd(&c_stream);
+ CHECK_ERR(err, "deflateEnd");
+}
+
+/* ===========================================================================
+ * Test inflate() with a preset dictionary
+ */
+void test_dict_inflate(compr, comprLen, uncompr, uncomprLen)
+ Byte *compr, *uncompr;
+ uLong comprLen, uncomprLen;
+{
+ int err;
+ z_stream d_stream; /* decompression stream */
+
+ strcpy((char*)uncompr, "garbage");
+
+ d_stream.zalloc = zalloc;
+ d_stream.zfree = zfree;
+ d_stream.opaque = (voidpf)0;
+
+ d_stream.next_in = compr;
+ d_stream.avail_in = (uInt)comprLen;
+
+ err = inflateInit(&d_stream);
+ CHECK_ERR(err, "inflateInit");
+
+ d_stream.next_out = uncompr;
+ d_stream.avail_out = (uInt)uncomprLen;
+
+ for (;;) {
+ err = inflate(&d_stream, Z_NO_FLUSH);
+ if (err == Z_STREAM_END) break;
+ if (err == Z_NEED_DICT) {
+ if (d_stream.adler != dictId) {
+ fprintf(stderr, "unexpected dictionary");
+ exit(1);
+ }
+ err = inflateSetDictionary(&d_stream, (const Bytef*)dictionary,
+ (int)sizeof(dictionary));
+ }
+ CHECK_ERR(err, "inflate with dict");
+ }
+
+ err = inflateEnd(&d_stream);
+ CHECK_ERR(err, "inflateEnd");
+
+ if (strcmp((char*)uncompr, hello)) {
+ fprintf(stderr, "bad inflate with dict\n");
+ exit(1);
+ } else {
+ printf("inflate with dictionary: %s\n", (char *)uncompr);
+ }
+}
+
+/* ===========================================================================
+ * Usage: example [output.gz [input.gz]]
+ */
+
+int main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ Byte *compr, *uncompr;
+ uLong comprLen = 10000*sizeof(int); /* don't overflow on MSDOS */
+ uLong uncomprLen = comprLen;
+ static const char* myVersion = ZLIB_VERSION;
+
+ if (zlibVersion()[0] != myVersion[0]) {
+ fprintf(stderr, "incompatible zlib version\n");
+ exit(1);
+
+ } else if (strcmp(zlibVersion(), ZLIB_VERSION) != 0) {
+ fprintf(stderr, "warning: different zlib version\n");
+ }
+
+ printf("zlib version %s = 0x%04x, compile flags = 0x%lx\n",
+ ZLIB_VERSION, ZLIB_VERNUM, zlibCompileFlags());
+
+ compr = (Byte*)calloc((uInt)comprLen, 1);
+ uncompr = (Byte*)calloc((uInt)uncomprLen, 1);
+ /* compr and uncompr are cleared to avoid reading uninitialized
+ * data and to ensure that uncompr compresses well.
+ */
+ if (compr == Z_NULL || uncompr == Z_NULL) {
+ printf("out of memory\n");
+ exit(1);
+ }
+
+#ifdef Z_SOLO
+ (void)argc;
+ (void)argv;
+#else
+ test_compress(compr, comprLen, uncompr, uncomprLen);
+
+ test_gzio((argc > 1 ? argv[1] : TESTFILE),
+ uncompr, uncomprLen);
+#endif
+
+ test_deflate(compr, comprLen);
+ test_inflate(compr, comprLen, uncompr, uncomprLen);
+
+ test_large_deflate(compr, comprLen, uncompr, uncomprLen);
+ test_large_inflate(compr, comprLen, uncompr, uncomprLen);
+
+ test_flush(compr, &comprLen);
+ test_sync(compr, comprLen, uncompr, uncomprLen);
+ comprLen = uncomprLen;
+
+ test_dict_deflate(compr, comprLen);
+ test_dict_inflate(compr, comprLen, uncompr, uncomprLen);
+
+ free(compr);
+ free(uncompr);
+
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/test/infcover.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/test/infcover.c
new file mode 100644
index 000000000..2be01646c
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/test/infcover.c
@@ -0,0 +1,671 @@
+/* infcover.c -- test zlib's inflate routines with full code coverage
+ * Copyright (C) 2011, 2016 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* to use, do: ./configure --cover && make cover */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <assert.h>
+#include "zlib.h"
+
+/* get definition of internal structure so we can mess with it (see pull()),
+ and so we can call inflate_trees() (see cover5()) */
+#define ZLIB_INTERNAL
+#include "inftrees.h"
+#include "inflate.h"
+
+#define local static
+
+/* -- memory tracking routines -- */
+
+/*
+ These memory tracking routines are provided to zlib and track all of zlib's
+ allocations and deallocations, check for LIFO operations, keep a current
+ and high water mark of total bytes requested, optionally set a limit on the
+ total memory that can be allocated, and when done check for memory leaks.
+
+ They are used as follows:
+
+ z_stream strm;
+ mem_setup(&strm) initializes the memory tracking and sets the
+ zalloc, zfree, and opaque members of strm to use
+ memory tracking for all zlib operations on strm
+ mem_limit(&strm, limit) sets a limit on the total bytes requested -- a
+ request that exceeds this limit will result in an
+ allocation failure (returns NULL) -- setting the
+ limit to zero means no limit, which is the default
+ after mem_setup()
+ mem_used(&strm, "msg") prints to stderr "msg" and the total bytes used
+ mem_high(&strm, "msg") prints to stderr "msg" and the high water mark
+ mem_done(&strm, "msg") ends memory tracking, releases all allocations
+ for the tracking as well as leaked zlib blocks, if
+ any. If there was anything unusual, such as leaked
+ blocks, non-FIFO frees, or frees of addresses not
+ allocated, then "msg" and information about the
+ problem is printed to stderr. If everything is
+ normal, nothing is printed. mem_done resets the
+ strm members to Z_NULL to use the default memory
+ allocation routines on the next zlib initialization
+ using strm.
+ */
+
+/* these items are strung together in a linked list, one for each allocation */
+struct mem_item {
+ void *ptr; /* pointer to allocated memory */
+ size_t size; /* requested size of allocation */
+ struct mem_item *next; /* pointer to next item in list, or NULL */
+};
+
+/* this structure is at the root of the linked list, and tracks statistics */
+struct mem_zone {
+ struct mem_item *first; /* pointer to first item in list, or NULL */
+ size_t total, highwater; /* total allocations, and largest total */
+ size_t limit; /* memory allocation limit, or 0 if no limit */
+ int notlifo, rogue; /* counts of non-LIFO frees and rogue frees */
+};
+
+/* memory allocation routine to pass to zlib */
+local void *mem_alloc(void *mem, unsigned count, unsigned size)
+{
+ void *ptr;
+ struct mem_item *item;
+ struct mem_zone *zone = mem;
+ size_t len = count * (size_t)size;
+
+ /* induced allocation failure */
+ if (zone == NULL || (zone->limit && zone->total + len > zone->limit))
+ return NULL;
+
+ /* perform allocation using the standard library, fill memory with a
+ non-zero value to make sure that the code isn't depending on zeros */
+ ptr = malloc(len);
+ if (ptr == NULL)
+ return NULL;
+ memset(ptr, 0xa5, len);
+
+ /* create a new item for the list */
+ item = malloc(sizeof(struct mem_item));
+ if (item == NULL) {
+ free(ptr);
+ return NULL;
+ }
+ item->ptr = ptr;
+ item->size = len;
+
+ /* insert item at the beginning of the list */
+ item->next = zone->first;
+ zone->first = item;
+
+ /* update the statistics */
+ zone->total += item->size;
+ if (zone->total > zone->highwater)
+ zone->highwater = zone->total;
+
+ /* return the allocated memory */
+ return ptr;
+}
+
+/* memory free routine to pass to zlib */
+local void mem_free(void *mem, void *ptr)
+{
+ struct mem_item *item, *next;
+ struct mem_zone *zone = mem;
+
+ /* if no zone, just do a free */
+ if (zone == NULL) {
+ free(ptr);
+ return;
+ }
+
+ /* point next to the item that matches ptr, or NULL if not found -- remove
+ the item from the linked list if found */
+ next = zone->first;
+ if (next) {
+ if (next->ptr == ptr)
+ zone->first = next->next; /* first one is it, remove from list */
+ else {
+ do { /* search the linked list */
+ item = next;
+ next = item->next;
+ } while (next != NULL && next->ptr != ptr);
+ if (next) { /* if found, remove from linked list */
+ item->next = next->next;
+ zone->notlifo++; /* not a LIFO free */
+ }
+
+ }
+ }
+
+ /* if found, update the statistics and free the item */
+ if (next) {
+ zone->total -= next->size;
+ free(next);
+ }
+
+ /* if not found, update the rogue count */
+ else
+ zone->rogue++;
+
+ /* in any case, do the requested free with the standard library function */
+ free(ptr);
+}
+
+/* set up a controlled memory allocation space for monitoring, set the stream
+ parameters to the controlled routines, with opaque pointing to the space */
+local void mem_setup(z_stream *strm)
+{
+ struct mem_zone *zone;
+
+ zone = malloc(sizeof(struct mem_zone));
+ assert(zone != NULL);
+ zone->first = NULL;
+ zone->total = 0;
+ zone->highwater = 0;
+ zone->limit = 0;
+ zone->notlifo = 0;
+ zone->rogue = 0;
+ strm->opaque = zone;
+ strm->zalloc = mem_alloc;
+ strm->zfree = mem_free;
+}
+
+/* set a limit on the total memory allocation, or 0 to remove the limit */
+local void mem_limit(z_stream *strm, size_t limit)
+{
+ struct mem_zone *zone = strm->opaque;
+
+ zone->limit = limit;
+}
+
+/* show the current total requested allocations in bytes */
+local void mem_used(z_stream *strm, char *prefix)
+{
+ struct mem_zone *zone = strm->opaque;
+
+ fprintf(stderr, "%s: %lu allocated\n", prefix, zone->total);
+}
+
+/* show the high water allocation in bytes */
+local void mem_high(z_stream *strm, char *prefix)
+{
+ struct mem_zone *zone = strm->opaque;
+
+ fprintf(stderr, "%s: %lu high water mark\n", prefix, zone->highwater);
+}
+
+/* release the memory allocation zone -- if there are any surprises, notify */
+local void mem_done(z_stream *strm, char *prefix)
+{
+ int count = 0;
+ struct mem_item *item, *next;
+ struct mem_zone *zone = strm->opaque;
+
+ /* show high water mark */
+ mem_high(strm, prefix);
+
+ /* free leftover allocations and item structures, if any */
+ item = zone->first;
+ while (item != NULL) {
+ free(item->ptr);
+ next = item->next;
+ free(item);
+ item = next;
+ count++;
+ }
+
+ /* issue alerts about anything unexpected */
+ if (count || zone->total)
+ fprintf(stderr, "** %s: %lu bytes in %d blocks not freed\n",
+ prefix, zone->total, count);
+ if (zone->notlifo)
+ fprintf(stderr, "** %s: %d frees not LIFO\n", prefix, zone->notlifo);
+ if (zone->rogue)
+ fprintf(stderr, "** %s: %d frees not recognized\n",
+ prefix, zone->rogue);
+
+ /* free the zone and delete from the stream */
+ free(zone);
+ strm->opaque = Z_NULL;
+ strm->zalloc = Z_NULL;
+ strm->zfree = Z_NULL;
+}
+
+/* -- inflate test routines -- */
+
+/* Decode a hexadecimal string, set *len to length, in[] to the bytes. This
+ decodes liberally, in that hex digits can be adjacent, in which case two in
+ a row writes a byte. Or they can be delimited by any non-hex character,
+ where the delimiters are ignored except when a single hex digit is followed
+ by a delimiter, where that single digit writes a byte. The returned data is
+ allocated and must eventually be freed. NULL is returned if out of memory.
+ If the length is not needed, then len can be NULL. */
+local unsigned char *h2b(const char *hex, unsigned *len)
+{
+ unsigned char *in, *re;
+ unsigned next, val;
+
+ in = malloc((strlen(hex) + 1) >> 1);
+ if (in == NULL)
+ return NULL;
+ next = 0;
+ val = 1;
+ do {
+ if (*hex >= '0' && *hex <= '9')
+ val = (val << 4) + *hex - '0';
+ else if (*hex >= 'A' && *hex <= 'F')
+ val = (val << 4) + *hex - 'A' + 10;
+ else if (*hex >= 'a' && *hex <= 'f')
+ val = (val << 4) + *hex - 'a' + 10;
+ else if (val != 1 && val < 32) /* one digit followed by delimiter */
+ val += 240; /* make it look like two digits */
+ if (val > 255) { /* have two digits */
+ in[next++] = val & 0xff; /* save the decoded byte */
+ val = 1; /* start over */
+ }
+ } while (*hex++); /* go through the loop with the terminating null */
+ if (len != NULL)
+ *len = next;
+ re = realloc(in, next);
+ return re == NULL ? in : re;
+}
+
+/* generic inflate() run, where hex is the hexadecimal input data, what is the
+ text to include in an error message, step is how much input data to feed
+ inflate() on each call, or zero to feed it all, win is the window bits
+ parameter to inflateInit2(), len is the size of the output buffer, and err
+ is the error code expected from the first inflate() call (the second
+ inflate() call is expected to return Z_STREAM_END). If win is 47, then
+ header information is collected with inflateGetHeader(). If a zlib stream
+ is looking for a dictionary, then an empty dictionary is provided.
+ inflate() is run until all of the input data is consumed. */
+local void inf(char *hex, char *what, unsigned step, int win, unsigned len,
+ int err)
+{
+ int ret;
+ unsigned have;
+ unsigned char *in, *out;
+ z_stream strm, copy;
+ gz_header head;
+
+ mem_setup(&strm);
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit2(&strm, win);
+ if (ret != Z_OK) {
+ mem_done(&strm, what);
+ return;
+ }
+ out = malloc(len); assert(out != NULL);
+ if (win == 47) {
+ head.extra = out;
+ head.extra_max = len;
+ head.name = out;
+ head.name_max = len;
+ head.comment = out;
+ head.comm_max = len;
+ ret = inflateGetHeader(&strm, &head); assert(ret == Z_OK);
+ }
+ in = h2b(hex, &have); assert(in != NULL);
+ if (step == 0 || step > have)
+ step = have;
+ strm.avail_in = step;
+ have -= step;
+ strm.next_in = in;
+ do {
+ strm.avail_out = len;
+ strm.next_out = out;
+ ret = inflate(&strm, Z_NO_FLUSH); assert(err == 9 || ret == err);
+ if (ret != Z_OK && ret != Z_BUF_ERROR && ret != Z_NEED_DICT)
+ break;
+ if (ret == Z_NEED_DICT) {
+ ret = inflateSetDictionary(&strm, in, 1);
+ assert(ret == Z_DATA_ERROR);
+ mem_limit(&strm, 1);
+ ret = inflateSetDictionary(&strm, out, 0);
+ assert(ret == Z_MEM_ERROR);
+ mem_limit(&strm, 0);
+ ((struct inflate_state *)strm.state)->mode = DICT;
+ ret = inflateSetDictionary(&strm, out, 0);
+ assert(ret == Z_OK);
+ ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_BUF_ERROR);
+ }
+ ret = inflateCopy(&copy, &strm); assert(ret == Z_OK);
+ ret = inflateEnd(&copy); assert(ret == Z_OK);
+ err = 9; /* don't care next time around */
+ have += strm.avail_in;
+ strm.avail_in = step > have ? have : step;
+ have -= strm.avail_in;
+ } while (strm.avail_in);
+ free(in);
+ free(out);
+ ret = inflateReset2(&strm, -8); assert(ret == Z_OK);
+ ret = inflateEnd(&strm); assert(ret == Z_OK);
+ mem_done(&strm, what);
+}
+
+/* cover all of the lines in inflate.c up to inflate() */
+local void cover_support(void)
+{
+ int ret;
+ z_stream strm;
+
+ mem_setup(&strm);
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit(&strm); assert(ret == Z_OK);
+ mem_used(&strm, "inflate init");
+ ret = inflatePrime(&strm, 5, 31); assert(ret == Z_OK);
+ ret = inflatePrime(&strm, -1, 0); assert(ret == Z_OK);
+ ret = inflateSetDictionary(&strm, Z_NULL, 0);
+ assert(ret == Z_STREAM_ERROR);
+ ret = inflateEnd(&strm); assert(ret == Z_OK);
+ mem_done(&strm, "prime");
+
+ inf("63 0", "force window allocation", 0, -15, 1, Z_OK);
+ inf("63 18 5", "force window replacement", 0, -8, 259, Z_OK);
+ inf("63 18 68 30 d0 0 0", "force split window update", 4, -8, 259, Z_OK);
+ inf("3 0", "use fixed blocks", 0, -15, 1, Z_STREAM_END);
+ inf("", "bad window size", 0, 1, 0, Z_STREAM_ERROR);
+
+ mem_setup(&strm);
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit_(&strm, ZLIB_VERSION - 1, (int)sizeof(z_stream));
+ assert(ret == Z_VERSION_ERROR);
+ mem_done(&strm, "wrong version");
+
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit(&strm); assert(ret == Z_OK);
+ ret = inflateEnd(&strm); assert(ret == Z_OK);
+ fputs("inflate built-in memory routines\n", stderr);
+}
+
+/* cover all inflate() header and trailer cases and code after inflate() */
+local void cover_wrap(void)
+{
+ int ret;
+ z_stream strm, copy;
+ unsigned char dict[257];
+
+ ret = inflate(Z_NULL, 0); assert(ret == Z_STREAM_ERROR);
+ ret = inflateEnd(Z_NULL); assert(ret == Z_STREAM_ERROR);
+ ret = inflateCopy(Z_NULL, Z_NULL); assert(ret == Z_STREAM_ERROR);
+ fputs("inflate bad parameters\n", stderr);
+
+ inf("1f 8b 0 0", "bad gzip method", 0, 31, 0, Z_DATA_ERROR);
+ inf("1f 8b 8 80", "bad gzip flags", 0, 31, 0, Z_DATA_ERROR);
+ inf("77 85", "bad zlib method", 0, 15, 0, Z_DATA_ERROR);
+ inf("8 99", "set window size from header", 0, 0, 0, Z_OK);
+ inf("78 9c", "bad zlib window size", 0, 8, 0, Z_DATA_ERROR);
+ inf("78 9c 63 0 0 0 1 0 1", "check adler32", 0, 15, 1, Z_STREAM_END);
+ inf("1f 8b 8 1e 0 0 0 0 0 0 1 0 0 0 0 0 0", "bad header crc", 0, 47, 1,
+ Z_DATA_ERROR);
+ inf("1f 8b 8 2 0 0 0 0 0 0 1d 26 3 0 0 0 0 0 0 0 0 0", "check gzip length",
+ 0, 47, 0, Z_STREAM_END);
+ inf("78 90", "bad zlib header check", 0, 47, 0, Z_DATA_ERROR);
+ inf("8 b8 0 0 0 1", "need dictionary", 0, 8, 0, Z_NEED_DICT);
+ inf("78 9c 63 0", "compute adler32", 0, 15, 1, Z_OK);
+
+ mem_setup(&strm);
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit2(&strm, -8);
+ strm.avail_in = 2;
+ strm.next_in = (void *)"\x63";
+ strm.avail_out = 1;
+ strm.next_out = (void *)&ret;
+ mem_limit(&strm, 1);
+ ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR);
+ ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_MEM_ERROR);
+ mem_limit(&strm, 0);
+ memset(dict, 0, 257);
+ ret = inflateSetDictionary(&strm, dict, 257);
+ assert(ret == Z_OK);
+ mem_limit(&strm, (sizeof(struct inflate_state) << 1) + 256);
+ ret = inflatePrime(&strm, 16, 0); assert(ret == Z_OK);
+ strm.avail_in = 2;
+ strm.next_in = (void *)"\x80";
+ ret = inflateSync(&strm); assert(ret == Z_DATA_ERROR);
+ ret = inflate(&strm, Z_NO_FLUSH); assert(ret == Z_STREAM_ERROR);
+ strm.avail_in = 4;
+ strm.next_in = (void *)"\0\0\xff\xff";
+ ret = inflateSync(&strm); assert(ret == Z_OK);
+ (void)inflateSyncPoint(&strm);
+ ret = inflateCopy(&copy, &strm); assert(ret == Z_MEM_ERROR);
+ mem_limit(&strm, 0);
+ ret = inflateUndermine(&strm, 1); assert(ret == Z_DATA_ERROR);
+ (void)inflateMark(&strm);
+ ret = inflateEnd(&strm); assert(ret == Z_OK);
+ mem_done(&strm, "miscellaneous, force memory errors");
+}
+
+/* input and output functions for inflateBack() */
+local unsigned pull(void *desc, unsigned char **buf)
+{
+ static unsigned int next = 0;
+ static unsigned char dat[] = {0x63, 0, 2, 0};
+ struct inflate_state *state;
+
+ if (desc == Z_NULL) {
+ next = 0;
+ return 0; /* no input (already provided at next_in) */
+ }
+ state = (void *)((z_stream *)desc)->state;
+ if (state != Z_NULL)
+ state->mode = SYNC; /* force an otherwise impossible situation */
+ return next < sizeof(dat) ? (*buf = dat + next++, 1) : 0;
+}
+
+local int push(void *desc, unsigned char *buf, unsigned len)
+{
+ buf += len;
+ return desc != Z_NULL; /* force error if desc not null */
+}
+
+/* cover inflateBack() up to common deflate data cases and after those */
+local void cover_back(void)
+{
+ int ret;
+ z_stream strm;
+ unsigned char win[32768];
+
+ ret = inflateBackInit_(Z_NULL, 0, win, 0, 0);
+ assert(ret == Z_VERSION_ERROR);
+ ret = inflateBackInit(Z_NULL, 0, win); assert(ret == Z_STREAM_ERROR);
+ ret = inflateBack(Z_NULL, Z_NULL, Z_NULL, Z_NULL, Z_NULL);
+ assert(ret == Z_STREAM_ERROR);
+ ret = inflateBackEnd(Z_NULL); assert(ret == Z_STREAM_ERROR);
+ fputs("inflateBack bad parameters\n", stderr);
+
+ mem_setup(&strm);
+ ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK);
+ strm.avail_in = 2;
+ strm.next_in = (void *)"\x03";
+ ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
+ assert(ret == Z_STREAM_END);
+ /* force output error */
+ strm.avail_in = 3;
+ strm.next_in = (void *)"\x63\x00";
+ ret = inflateBack(&strm, pull, Z_NULL, push, &strm);
+ assert(ret == Z_BUF_ERROR);
+ /* force mode error by mucking with state */
+ ret = inflateBack(&strm, pull, &strm, push, Z_NULL);
+ assert(ret == Z_STREAM_ERROR);
+ ret = inflateBackEnd(&strm); assert(ret == Z_OK);
+ mem_done(&strm, "inflateBack bad state");
+
+ ret = inflateBackInit(&strm, 15, win); assert(ret == Z_OK);
+ ret = inflateBackEnd(&strm); assert(ret == Z_OK);
+ fputs("inflateBack built-in memory routines\n", stderr);
+}
+
+/* do a raw inflate of data in hexadecimal with both inflate and inflateBack */
+local int try(char *hex, char *id, int err)
+{
+ int ret;
+ unsigned len, size;
+ unsigned char *in, *out, *win;
+ char *prefix;
+ z_stream strm;
+
+ /* convert to hex */
+ in = h2b(hex, &len);
+ assert(in != NULL);
+
+ /* allocate work areas */
+ size = len << 3;
+ out = malloc(size);
+ assert(out != NULL);
+ win = malloc(32768);
+ assert(win != NULL);
+ prefix = malloc(strlen(id) + 6);
+ assert(prefix != NULL);
+
+ /* first with inflate */
+ strcpy(prefix, id);
+ strcat(prefix, "-late");
+ mem_setup(&strm);
+ strm.avail_in = 0;
+ strm.next_in = Z_NULL;
+ ret = inflateInit2(&strm, err < 0 ? 47 : -15);
+ assert(ret == Z_OK);
+ strm.avail_in = len;
+ strm.next_in = in;
+ do {
+ strm.avail_out = size;
+ strm.next_out = out;
+ ret = inflate(&strm, Z_TREES);
+ assert(ret != Z_STREAM_ERROR && ret != Z_MEM_ERROR);
+ if (ret == Z_DATA_ERROR || ret == Z_NEED_DICT)
+ break;
+ } while (strm.avail_in || strm.avail_out == 0);
+ if (err) {
+ assert(ret == Z_DATA_ERROR);
+ assert(strcmp(id, strm.msg) == 0);
+ }
+ inflateEnd(&strm);
+ mem_done(&strm, prefix);
+
+ /* then with inflateBack */
+ if (err >= 0) {
+ strcpy(prefix, id);
+ strcat(prefix, "-back");
+ mem_setup(&strm);
+ ret = inflateBackInit(&strm, 15, win);
+ assert(ret == Z_OK);
+ strm.avail_in = len;
+ strm.next_in = in;
+ ret = inflateBack(&strm, pull, Z_NULL, push, Z_NULL);
+ assert(ret != Z_STREAM_ERROR);
+ if (err) {
+ assert(ret == Z_DATA_ERROR);
+ assert(strcmp(id, strm.msg) == 0);
+ }
+ inflateBackEnd(&strm);
+ mem_done(&strm, prefix);
+ }
+
+ /* clean up */
+ free(prefix);
+ free(win);
+ free(out);
+ free(in);
+ return ret;
+}
+
+/* cover deflate data cases in both inflate() and inflateBack() */
+local void cover_inflate(void)
+{
+ try("0 0 0 0 0", "invalid stored block lengths", 1);
+ try("3 0", "fixed", 0);
+ try("6", "invalid block type", 1);
+ try("1 1 0 fe ff 0", "stored", 0);
+ try("fc 0 0", "too many length or distance symbols", 1);
+ try("4 0 fe ff", "invalid code lengths set", 1);
+ try("4 0 24 49 0", "invalid bit length repeat", 1);
+ try("4 0 24 e9 ff ff", "invalid bit length repeat", 1);
+ try("4 0 24 e9 ff 6d", "invalid code -- missing end-of-block", 1);
+ try("4 80 49 92 24 49 92 24 71 ff ff 93 11 0",
+ "invalid literal/lengths set", 1);
+ try("4 80 49 92 24 49 92 24 f b4 ff ff c3 84", "invalid distances set", 1);
+ try("4 c0 81 8 0 0 0 0 20 7f eb b 0 0", "invalid literal/length code", 1);
+ try("2 7e ff ff", "invalid distance code", 1);
+ try("c c0 81 0 0 0 0 0 90 ff 6b 4 0", "invalid distance too far back", 1);
+
+ /* also trailer mismatch just in inflate() */
+ try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 1", "incorrect data check", -1);
+ try("1f 8b 8 0 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 1",
+ "incorrect length check", -1);
+ try("5 c0 21 d 0 0 0 80 b0 fe 6d 2f 91 6c", "pull 17", 0);
+ try("5 e0 81 91 24 cb b2 2c 49 e2 f 2e 8b 9a 47 56 9f fb fe ec d2 ff 1f",
+ "long code", 0);
+ try("ed c0 1 1 0 0 0 40 20 ff 57 1b 42 2c 4f", "length extra", 0);
+ try("ed cf c1 b1 2c 47 10 c4 30 fa 6f 35 1d 1 82 59 3d fb be 2e 2a fc f c",
+ "long distance and extra", 0);
+ try("ed c0 81 0 0 0 0 80 a0 fd a9 17 a9 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 "
+ "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 6", "window end", 0);
+ inf("2 8 20 80 0 3 0", "inflate_fast TYPE return", 0, -15, 258,
+ Z_STREAM_END);
+ inf("63 18 5 40 c 0", "window wrap", 3, -8, 300, Z_OK);
+}
+
+/* cover remaining lines in inftrees.c */
+local void cover_trees(void)
+{
+ int ret;
+ unsigned bits;
+ unsigned short lens[16], work[16];
+ code *next, table[ENOUGH_DISTS];
+
+ /* we need to call inflate_table() directly in order to manifest not-
+ enough errors, since zlib insures that enough is always enough */
+ for (bits = 0; bits < 15; bits++)
+ lens[bits] = (unsigned short)(bits + 1);
+ lens[15] = 15;
+ next = table;
+ bits = 15;
+ ret = inflate_table(DISTS, lens, 16, &next, &bits, work);
+ assert(ret == 1);
+ next = table;
+ bits = 1;
+ ret = inflate_table(DISTS, lens, 16, &next, &bits, work);
+ assert(ret == 1);
+ fputs("inflate_table not enough errors\n", stderr);
+}
+
+/* cover remaining inffast.c decoding and window copying */
+local void cover_fast(void)
+{
+ inf("e5 e0 81 ad 6d cb b2 2c c9 01 1e 59 63 ae 7d ee fb 4d fd b5 35 41 68"
+ " ff 7f 0f 0 0 0", "fast length extra bits", 0, -8, 258, Z_DATA_ERROR);
+ inf("25 fd 81 b5 6d 59 b6 6a 49 ea af 35 6 34 eb 8c b9 f6 b9 1e ef 67 49"
+ " 50 fe ff ff 3f 0 0", "fast distance extra bits", 0, -8, 258,
+ Z_DATA_ERROR);
+ inf("3 7e 0 0 0 0 0", "fast invalid distance code", 0, -8, 258,
+ Z_DATA_ERROR);
+ inf("1b 7 0 0 0 0 0", "fast invalid literal/length code", 0, -8, 258,
+ Z_DATA_ERROR);
+ inf("d c7 1 ae eb 38 c 4 41 a0 87 72 de df fb 1f b8 36 b1 38 5d ff ff 0",
+ "fast 2nd level codes and too far back", 0, -8, 258, Z_DATA_ERROR);
+ inf("63 18 5 8c 10 8 0 0 0 0", "very common case", 0, -8, 259, Z_OK);
+ inf("63 60 60 18 c9 0 8 18 18 18 26 c0 28 0 29 0 0 0",
+ "contiguous and wrap around window", 6, -8, 259, Z_OK);
+ inf("63 0 3 0 0 0 0 0", "copy direct from output", 0, -8, 259,
+ Z_STREAM_END);
+}
+
+int main(void)
+{
+ fprintf(stderr, "%s\n", zlibVersion());
+ cover_support();
+ cover_wrap();
+ cover_back();
+ cover_inflate();
+ cover_trees();
+ cover_fast();
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/test/minigzip.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/test/minigzip.c
new file mode 100644
index 000000000..e22fb08c0
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/test/minigzip.c
@@ -0,0 +1,651 @@
+/* minigzip.c -- simulate gzip using the zlib compression library
+ * Copyright (C) 1995-2006, 2010, 2011, 2016 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * minigzip is a minimal implementation of the gzip utility. This is
+ * only an example of using zlib and isn't meant to replace the
+ * full-featured gzip. No attempt is made to deal with file systems
+ * limiting names to 14 or 8+3 characters, etc... Error checking is
+ * very limited. So use minigzip only for testing; use gzip for the
+ * real thing. On MSDOS, use only on file names without extension
+ * or in pipe mode.
+ */
+
+/* @(#) $Id$ */
+
+#include "zlib.h"
+#include <stdio.h>
+
+#ifdef STDC
+# include <string.h>
+# include <stdlib.h>
+#endif
+
+#ifdef USE_MMAP
+# include <sys/types.h>
+# include <sys/mman.h>
+# include <sys/stat.h>
+#endif
+
+#if defined(MSDOS) || defined(OS2) || defined(WIN32) || defined(__CYGWIN__)
+# include <fcntl.h>
+# include <io.h>
+# ifdef UNDER_CE
+# include <stdlib.h>
+# endif
+# define SET_BINARY_MODE(file) setmode(fileno(file), O_BINARY)
+#else
+# define SET_BINARY_MODE(file)
+#endif
+
+#if defined(_MSC_VER) && _MSC_VER < 1900
+# define snprintf _snprintf
+#endif
+
+#ifdef VMS
+# define unlink delete
+# define GZ_SUFFIX "-gz"
+#endif
+#ifdef RISCOS
+# define unlink remove
+# define GZ_SUFFIX "-gz"
+# define fileno(file) file->__file
+#endif
+#if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fileno */
+#endif
+
+#if !defined(Z_HAVE_UNISTD_H) && !defined(_LARGEFILE64_SOURCE)
+#ifndef WIN32 /* unlink already in stdio.h for WIN32 */
+ extern int unlink OF((const char *));
+#endif
+#endif
+
+#if defined(UNDER_CE)
+# include <windows.h>
+# define perror(s) pwinerror(s)
+
+/* Map the Windows error number in ERROR to a locale-dependent error
+ message string and return a pointer to it. Typically, the values
+ for ERROR come from GetLastError.
+
+ The string pointed to shall not be modified by the application,
+ but may be overwritten by a subsequent call to strwinerror
+
+ The strwinerror function does not change the current setting
+ of GetLastError. */
+
+static char *strwinerror (error)
+ DWORD error;
+{
+ static char buf[1024];
+
+ wchar_t *msgbuf;
+ DWORD lasterr = GetLastError();
+ DWORD chars = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM
+ | FORMAT_MESSAGE_ALLOCATE_BUFFER,
+ NULL,
+ error,
+ 0, /* Default language */
+ (LPVOID)&msgbuf,
+ 0,
+ NULL);
+ if (chars != 0) {
+ /* If there is an \r\n appended, zap it. */
+ if (chars >= 2
+ && msgbuf[chars - 2] == '\r' && msgbuf[chars - 1] == '\n') {
+ chars -= 2;
+ msgbuf[chars] = 0;
+ }
+
+ if (chars > sizeof (buf) - 1) {
+ chars = sizeof (buf) - 1;
+ msgbuf[chars] = 0;
+ }
+
+ wcstombs(buf, msgbuf, chars + 1);
+ LocalFree(msgbuf);
+ }
+ else {
+ sprintf(buf, "unknown win32 error (%ld)", error);
+ }
+
+ SetLastError(lasterr);
+ return buf;
+}
+
+static void pwinerror (s)
+ const char *s;
+{
+ if (s && *s)
+ fprintf(stderr, "%s: %s\n", s, strwinerror(GetLastError ()));
+ else
+ fprintf(stderr, "%s\n", strwinerror(GetLastError ()));
+}
+
+#endif /* UNDER_CE */
+
+#ifndef GZ_SUFFIX
+# define GZ_SUFFIX ".gz"
+#endif
+#define SUFFIX_LEN (sizeof(GZ_SUFFIX)-1)
+
+#define BUFLEN 16384
+#define MAX_NAME_LEN 1024
+
+#ifdef MAXSEG_64K
+# define local static
+ /* Needed for systems with limitation on stack size. */
+#else
+# define local
+#endif
+
+#ifdef Z_SOLO
+/* for Z_SOLO, create simplified gz* functions using deflate and inflate */
+
+#if defined(Z_HAVE_UNISTD_H) || defined(Z_LARGE)
+# include <unistd.h> /* for unlink() */
+#endif
+
+void *myalloc OF((void *, unsigned, unsigned));
+void myfree OF((void *, void *));
+
+void *myalloc(q, n, m)
+ void *q;
+ unsigned n, m;
+{
+ (void)q;
+ return calloc(n, m);
+}
+
+void myfree(q, p)
+ void *q, *p;
+{
+ (void)q;
+ free(p);
+}
+
+typedef struct gzFile_s {
+ FILE *file;
+ int write;
+ int err;
+ char *msg;
+ z_stream strm;
+} *gzFile;
+
+gzFile gzopen OF((const char *, const char *));
+gzFile gzdopen OF((int, const char *));
+gzFile gz_open OF((const char *, int, const char *));
+
+gzFile gzopen(path, mode)
+const char *path;
+const char *mode;
+{
+ return gz_open(path, -1, mode);
+}
+
+gzFile gzdopen(fd, mode)
+int fd;
+const char *mode;
+{
+ return gz_open(NULL, fd, mode);
+}
+
+gzFile gz_open(path, fd, mode)
+ const char *path;
+ int fd;
+ const char *mode;
+{
+ gzFile gz;
+ int ret;
+
+ gz = malloc(sizeof(struct gzFile_s));
+ if (gz == NULL)
+ return NULL;
+ gz->write = strchr(mode, 'w') != NULL;
+ gz->strm.zalloc = myalloc;
+ gz->strm.zfree = myfree;
+ gz->strm.opaque = Z_NULL;
+ if (gz->write)
+ ret = deflateInit2(&(gz->strm), -1, 8, 15 + 16, 8, 0);
+ else {
+ gz->strm.next_in = 0;
+ gz->strm.avail_in = Z_NULL;
+ ret = inflateInit2(&(gz->strm), 15 + 16);
+ }
+ if (ret != Z_OK) {
+ free(gz);
+ return NULL;
+ }
+ gz->file = path == NULL ? fdopen(fd, gz->write ? "wb" : "rb") :
+ fopen(path, gz->write ? "wb" : "rb");
+ if (gz->file == NULL) {
+ gz->write ? deflateEnd(&(gz->strm)) : inflateEnd(&(gz->strm));
+ free(gz);
+ return NULL;
+ }
+ gz->err = 0;
+ gz->msg = "";
+ return gz;
+}
+
+int gzwrite OF((gzFile, const void *, unsigned));
+
+int gzwrite(gz, buf, len)
+ gzFile gz;
+ const void *buf;
+ unsigned len;
+{
+ z_stream *strm;
+ unsigned char out[BUFLEN];
+
+ if (gz == NULL || !gz->write)
+ return 0;
+ strm = &(gz->strm);
+ strm->next_in = (void *)buf;
+ strm->avail_in = len;
+ do {
+ strm->next_out = out;
+ strm->avail_out = BUFLEN;
+ (void)deflate(strm, Z_NO_FLUSH);
+ fwrite(out, 1, BUFLEN - strm->avail_out, gz->file);
+ } while (strm->avail_out == 0);
+ return len;
+}
+
+int gzread OF((gzFile, void *, unsigned));
+
+int gzread(gz, buf, len)
+ gzFile gz;
+ void *buf;
+ unsigned len;
+{
+ int ret;
+ unsigned got;
+ unsigned char in[1];
+ z_stream *strm;
+
+ if (gz == NULL || gz->write)
+ return 0;
+ if (gz->err)
+ return 0;
+ strm = &(gz->strm);
+ strm->next_out = (void *)buf;
+ strm->avail_out = len;
+ do {
+ got = fread(in, 1, 1, gz->file);
+ if (got == 0)
+ break;
+ strm->next_in = in;
+ strm->avail_in = 1;
+ ret = inflate(strm, Z_NO_FLUSH);
+ if (ret == Z_DATA_ERROR) {
+ gz->err = Z_DATA_ERROR;
+ gz->msg = strm->msg;
+ return 0;
+ }
+ if (ret == Z_STREAM_END)
+ inflateReset(strm);
+ } while (strm->avail_out);
+ return len - strm->avail_out;
+}
+
+int gzclose OF((gzFile));
+
+int gzclose(gz)
+ gzFile gz;
+{
+ z_stream *strm;
+ unsigned char out[BUFLEN];
+
+ if (gz == NULL)
+ return Z_STREAM_ERROR;
+ strm = &(gz->strm);
+ if (gz->write) {
+ strm->next_in = Z_NULL;
+ strm->avail_in = 0;
+ do {
+ strm->next_out = out;
+ strm->avail_out = BUFLEN;
+ (void)deflate(strm, Z_FINISH);
+ fwrite(out, 1, BUFLEN - strm->avail_out, gz->file);
+ } while (strm->avail_out == 0);
+ deflateEnd(strm);
+ }
+ else
+ inflateEnd(strm);
+ fclose(gz->file);
+ free(gz);
+ return Z_OK;
+}
+
+const char *gzerror OF((gzFile, int *));
+
+const char *gzerror(gz, err)
+ gzFile gz;
+ int *err;
+{
+ *err = gz->err;
+ return gz->msg;
+}
+
+#endif
+
+static char *prog;
+
+void error OF((const char *msg));
+void gz_compress OF((FILE *in, gzFile out));
+#ifdef USE_MMAP
+int gz_compress_mmap OF((FILE *in, gzFile out));
+#endif
+void gz_uncompress OF((gzFile in, FILE *out));
+void file_compress OF((char *file, char *mode));
+void file_uncompress OF((char *file));
+int main OF((int argc, char *argv[]));
+
+/* ===========================================================================
+ * Display error message and exit
+ */
+void error(msg)
+ const char *msg;
+{
+ fprintf(stderr, "%s: %s\n", prog, msg);
+ exit(1);
+}
+
+/* ===========================================================================
+ * Compress input to output then close both files.
+ */
+
+void gz_compress(in, out)
+ FILE *in;
+ gzFile out;
+{
+ local char buf[BUFLEN];
+ int len;
+ int err;
+
+#ifdef USE_MMAP
+ /* Try first compressing with mmap. If mmap fails (minigzip used in a
+ * pipe), use the normal fread loop.
+ */
+ if (gz_compress_mmap(in, out) == Z_OK) return;
+#endif
+ for (;;) {
+ len = (int)fread(buf, 1, sizeof(buf), in);
+ if (ferror(in)) {
+ perror("fread");
+ exit(1);
+ }
+ if (len == 0) break;
+
+ if (gzwrite(out, buf, (unsigned)len) != len) error(gzerror(out, &err));
+ }
+ fclose(in);
+ if (gzclose(out) != Z_OK) error("failed gzclose");
+}
+
+#ifdef USE_MMAP /* MMAP version, Miguel Albrecht <malbrech@eso.org> */
+
+/* Try compressing the input file at once using mmap. Return Z_OK if
+ * if success, Z_ERRNO otherwise.
+ */
+int gz_compress_mmap(in, out)
+ FILE *in;
+ gzFile out;
+{
+ int len;
+ int err;
+ int ifd = fileno(in);
+ caddr_t buf; /* mmap'ed buffer for the entire input file */
+ off_t buf_len; /* length of the input file */
+ struct stat sb;
+
+ /* Determine the size of the file, needed for mmap: */
+ if (fstat(ifd, &sb) < 0) return Z_ERRNO;
+ buf_len = sb.st_size;
+ if (buf_len <= 0) return Z_ERRNO;
+
+ /* Now do the actual mmap: */
+ buf = mmap((caddr_t) 0, buf_len, PROT_READ, MAP_SHARED, ifd, (off_t)0);
+ if (buf == (caddr_t)(-1)) return Z_ERRNO;
+
+ /* Compress the whole file at once: */
+ len = gzwrite(out, (char *)buf, (unsigned)buf_len);
+
+ if (len != (int)buf_len) error(gzerror(out, &err));
+
+ munmap(buf, buf_len);
+ fclose(in);
+ if (gzclose(out) != Z_OK) error("failed gzclose");
+ return Z_OK;
+}
+#endif /* USE_MMAP */
+
+/* ===========================================================================
+ * Uncompress input to output then close both files.
+ */
+void gz_uncompress(in, out)
+ gzFile in;
+ FILE *out;
+{
+ local char buf[BUFLEN];
+ int len;
+ int err;
+
+ for (;;) {
+ len = gzread(in, buf, sizeof(buf));
+ if (len < 0) error (gzerror(in, &err));
+ if (len == 0) break;
+
+ if ((int)fwrite(buf, 1, (unsigned)len, out) != len) {
+ error("failed fwrite");
+ }
+ }
+ if (fclose(out)) error("failed fclose");
+
+ if (gzclose(in) != Z_OK) error("failed gzclose");
+}
+
+
+/* ===========================================================================
+ * Compress the given file: create a corresponding .gz file and remove the
+ * original.
+ */
+void file_compress(file, mode)
+ char *file;
+ char *mode;
+{
+ local char outfile[MAX_NAME_LEN];
+ FILE *in;
+ gzFile out;
+
+ if (strlen(file) + strlen(GZ_SUFFIX) >= sizeof(outfile)) {
+ fprintf(stderr, "%s: filename too long\n", prog);
+ exit(1);
+ }
+
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(outfile, sizeof(outfile), "%s%s", file, GZ_SUFFIX);
+#else
+ strcpy(outfile, file);
+ strcat(outfile, GZ_SUFFIX);
+#endif
+
+ in = fopen(file, "rb");
+ if (in == NULL) {
+ perror(file);
+ exit(1);
+ }
+ out = gzopen(outfile, mode);
+ if (out == NULL) {
+ fprintf(stderr, "%s: can't gzopen %s\n", prog, outfile);
+ exit(1);
+ }
+ gz_compress(in, out);
+
+ unlink(file);
+}
+
+
+/* ===========================================================================
+ * Uncompress the given file and remove the original.
+ */
+void file_uncompress(file)
+ char *file;
+{
+ local char buf[MAX_NAME_LEN];
+ char *infile, *outfile;
+ FILE *out;
+ gzFile in;
+ unsigned len = strlen(file);
+
+ if (len + strlen(GZ_SUFFIX) >= sizeof(buf)) {
+ fprintf(stderr, "%s: filename too long\n", prog);
+ exit(1);
+ }
+
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(buf, sizeof(buf), "%s", file);
+#else
+ strcpy(buf, file);
+#endif
+
+ if (len > SUFFIX_LEN && strcmp(file+len-SUFFIX_LEN, GZ_SUFFIX) == 0) {
+ infile = file;
+ outfile = buf;
+ outfile[len-3] = '\0';
+ } else {
+ outfile = file;
+ infile = buf;
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(buf + len, sizeof(buf) - len, "%s", GZ_SUFFIX);
+#else
+ strcat(infile, GZ_SUFFIX);
+#endif
+ }
+ in = gzopen(infile, "rb");
+ if (in == NULL) {
+ fprintf(stderr, "%s: can't gzopen %s\n", prog, infile);
+ exit(1);
+ }
+ out = fopen(outfile, "wb");
+ if (out == NULL) {
+ perror(file);
+ exit(1);
+ }
+
+ gz_uncompress(in, out);
+
+ unlink(infile);
+}
+
+
+/* ===========================================================================
+ * Usage: minigzip [-c] [-d] [-f] [-h] [-r] [-1 to -9] [files...]
+ * -c : write to standard output
+ * -d : decompress
+ * -f : compress with Z_FILTERED
+ * -h : compress with Z_HUFFMAN_ONLY
+ * -r : compress with Z_RLE
+ * -1 to -9 : compression level
+ */
+
+int main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ int copyout = 0;
+ int uncompr = 0;
+ gzFile file;
+ char *bname, outmode[20];
+
+#if !defined(NO_snprintf) && !defined(NO_vsnprintf)
+ snprintf(outmode, sizeof(outmode), "%s", "wb6 ");
+#else
+ strcpy(outmode, "wb6 ");
+#endif
+
+ prog = argv[0];
+ bname = strrchr(argv[0], '/');
+ if (bname)
+ bname++;
+ else
+ bname = argv[0];
+ argc--, argv++;
+
+ if (!strcmp(bname, "gunzip"))
+ uncompr = 1;
+ else if (!strcmp(bname, "zcat"))
+ copyout = uncompr = 1;
+
+ while (argc > 0) {
+ if (strcmp(*argv, "-c") == 0)
+ copyout = 1;
+ else if (strcmp(*argv, "-d") == 0)
+ uncompr = 1;
+ else if (strcmp(*argv, "-f") == 0)
+ outmode[3] = 'f';
+ else if (strcmp(*argv, "-h") == 0)
+ outmode[3] = 'h';
+ else if (strcmp(*argv, "-r") == 0)
+ outmode[3] = 'R';
+ else if ((*argv)[0] == '-' && (*argv)[1] >= '1' && (*argv)[1] <= '9' &&
+ (*argv)[2] == 0)
+ outmode[2] = (*argv)[1];
+ else
+ break;
+ argc--, argv++;
+ }
+ if (outmode[3] == ' ')
+ outmode[3] = 0;
+ if (argc == 0) {
+ SET_BINARY_MODE(stdin);
+ SET_BINARY_MODE(stdout);
+ if (uncompr) {
+ file = gzdopen(fileno(stdin), "rb");
+ if (file == NULL) error("can't gzdopen stdin");
+ gz_uncompress(file, stdout);
+ } else {
+ file = gzdopen(fileno(stdout), outmode);
+ if (file == NULL) error("can't gzdopen stdout");
+ gz_compress(stdin, file);
+ }
+ } else {
+ if (copyout) {
+ SET_BINARY_MODE(stdout);
+ }
+ do {
+ if (uncompr) {
+ if (copyout) {
+ file = gzopen(*argv, "rb");
+ if (file == NULL)
+ fprintf(stderr, "%s: can't gzopen %s\n", prog, *argv);
+ else
+ gz_uncompress(file, stdout);
+ } else {
+ file_uncompress(*argv);
+ }
+ } else {
+ if (copyout) {
+ FILE * in = fopen(*argv, "rb");
+
+ if (in == NULL) {
+ perror(*argv);
+ } else {
+ file = gzdopen(fileno(stdout), outmode);
+ if (file == NULL) error("can't gzdopen stdout");
+
+ gz_compress(in, file);
+ }
+
+ } else {
+ file_compress(*argv, outmode);
+ }
+ }
+ } while (argv++, --argc);
+ }
+ return 0;
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/treebuild.xml b/src/boost/libs/beast/test/extern/zlib-1.2.11/treebuild.xml
new file mode 100644
index 000000000..fd75525f9
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/treebuild.xml
@@ -0,0 +1,116 @@
+<?xml version="1.0" ?>
+<package name="zlib" version="1.2.11">
+ <library name="zlib" dlversion="1.2.11" dlname="z">
+ <property name="description"> zip compression library </property>
+ <property name="include-target-dir" value="$(@PACKAGE/install-includedir)" />
+
+ <!-- fixme: not implemented yet -->
+ <property name="compiler/c/inline" value="yes" />
+
+ <include-file name="zlib.h" scope="public" mode="644" />
+ <include-file name="zconf.h" scope="public" mode="644" />
+
+ <source name="adler32.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ </source>
+ <source name="compress.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ </source>
+ <source name="crc32.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="crc32.h" />
+ </source>
+ <source name="gzclose.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="gzguts.h" />
+ </source>
+ <source name="gzlib.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="gzguts.h" />
+ </source>
+ <source name="gzread.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="gzguts.h" />
+ </source>
+ <source name="gzwrite.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="gzguts.h" />
+ </source>
+ <source name="uncompr.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ </source>
+ <source name="deflate.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="zutil.h" />
+ <depend name="deflate.h" />
+ </source>
+ <source name="trees.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="zutil.h" />
+ <depend name="deflate.h" />
+ <depend name="trees.h" />
+ </source>
+ <source name="zutil.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="zutil.h" />
+ </source>
+ <source name="inflate.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="zutil.h" />
+ <depend name="inftrees.h" />
+ <depend name="inflate.h" />
+ <depend name="inffast.h" />
+ </source>
+ <source name="infback.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="zutil.h" />
+ <depend name="inftrees.h" />
+ <depend name="inflate.h" />
+ <depend name="inffast.h" />
+ </source>
+ <source name="inftrees.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="zutil.h" />
+ <depend name="inftrees.h" />
+ </source>
+ <source name="inffast.c">
+ <depend name="zlib.h" />
+ <depend name="zconf.h" />
+ <depend name="zutil.h" />
+ <depend name="inftrees.h" />
+ <depend name="inflate.h" />
+ <depend name="inffast.h" />
+ </source>
+ </library>
+</package>
+
+<!--
+CFLAGS=-O
+#CFLAGS=-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7
+#CFLAGS=-g -DZLIB_DEBUG
+#CFLAGS=-O3 -Wall -Wwrite-strings -Wpointer-arith -Wconversion \
+# -Wstrict-prototypes -Wmissing-prototypes
+
+# OBJA =
+# to use the asm code: make OBJA=match.o
+#
+match.o: match.S
+ $(CPP) match.S > _match.s
+ $(CC) -c _match.s
+ mv _match.o match.o
+ rm -f _match.s
+-->
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/trees.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/trees.c
new file mode 100644
index 000000000..50cf4b457
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/trees.c
@@ -0,0 +1,1203 @@
+/* trees.c -- output deflated data using Huffman coding
+ * Copyright (C) 1995-2017 Jean-loup Gailly
+ * detect_data_type() function provided freely by Cosmin Truta, 2006
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process uses several Huffman trees. The more
+ * common source values are represented by shorter bit sequences.
+ *
+ * Each code tree is stored in a compressed form which is itself
+ * a Huffman encoding of the lengths of all the code strings (in
+ * ascending order by source values). The actual code strings are
+ * reconstructed from the lengths in the inflate process, as described
+ * in the deflate specification.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
+ * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
+ *
+ * Storer, James A.
+ * Data Compression: Methods and Theory, pp. 49-50.
+ * Computer Science Press, 1988. ISBN 0-7167-8156-5.
+ *
+ * Sedgewick, R.
+ * Algorithms, p290.
+ * Addison-Wesley, 1983. ISBN 0-201-06672-6.
+ */
+
+/* @(#) $Id$ */
+
+/* #define GEN_TREES_H */
+
+#include "deflate.h"
+
+#ifdef ZLIB_DEBUG
+# include <ctype.h>
+#endif
+
+/* ===========================================================================
+ * Constants
+ */
+
+#define MAX_BL_BITS 7
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+#define END_BLOCK 256
+/* end of block literal code */
+
+#define REP_3_6 16
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+#define REPZ_3_10 17
+/* repeat a zero length 3-10 times (3 bits of repeat count) */
+
+#define REPZ_11_138 18
+/* repeat a zero length 11-138 times (7 bits of repeat count) */
+
+local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
+ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
+
+local const int extra_dbits[D_CODES] /* extra bits for each distance code */
+ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
+ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
+
+local const uch bl_order[BL_CODES]
+ = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+/* non ANSI compilers may not accept trees.h */
+
+local ct_data static_ltree[L_CODES+2];
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+local ct_data static_dtree[D_CODES];
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+uch _dist_code[DIST_CODE_LEN];
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+uch _length_code[MAX_MATCH-MIN_MATCH+1];
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+local int base_length[LENGTH_CODES];
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+local int base_dist[D_CODES];
+/* First normalized distance for each code (0 = distance of 1) */
+
+#else
+# include "trees.h"
+#endif /* GEN_TREES_H */
+
+struct static_tree_desc_s {
+ const ct_data *static_tree; /* static tree or NULL */
+ const intf *extra_bits; /* extra bits for each code or NULL */
+ int extra_base; /* base index for extra_bits */
+ int elems; /* max number of elements in the tree */
+ int max_length; /* max bit length for the codes */
+};
+
+local const static_tree_desc static_l_desc =
+{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
+
+local const static_tree_desc static_d_desc =
+{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
+
+local const static_tree_desc static_bl_desc =
+{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
+
+/* ===========================================================================
+ * Local (static) routines in this file.
+ */
+
+local void tr_static_init OF((void));
+local void init_block OF((deflate_state *s));
+local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
+local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
+local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
+local void build_tree OF((deflate_state *s, tree_desc *desc));
+local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local int build_bl_tree OF((deflate_state *s));
+local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
+ int blcodes));
+local void compress_block OF((deflate_state *s, const ct_data *ltree,
+ const ct_data *dtree));
+local int detect_data_type OF((deflate_state *s));
+local unsigned bi_reverse OF((unsigned value, int length));
+local void bi_windup OF((deflate_state *s));
+local void bi_flush OF((deflate_state *s));
+
+#ifdef GEN_TREES_H
+local void gen_trees_header OF((void));
+#endif
+
+#ifndef ZLIB_DEBUG
+# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
+ /* Send a code of the given tree. c and tree must not have side effects */
+
+#else /* !ZLIB_DEBUG */
+# define send_code(s, c, tree) \
+ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
+ send_bits(s, tree[c].Code, tree[c].Len); }
+#endif
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+ put_byte(s, (uch)((w) & 0xff)); \
+ put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+#ifdef ZLIB_DEBUG
+local void send_bits OF((deflate_state *s, int value, int length));
+
+local void send_bits(s, value, length)
+ deflate_state *s;
+ int value; /* value to send */
+ int length; /* number of bits */
+{
+ Tracevv((stderr," l %2d v %4x ", length, value));
+ Assert(length > 0 && length <= 15, "invalid length");
+ s->bits_sent += (ulg)length;
+
+ /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+ * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+ * unused bits in value.
+ */
+ if (s->bi_valid > (int)Buf_size - length) {
+ s->bi_buf |= (ush)value << s->bi_valid;
+ put_short(s, s->bi_buf);
+ s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
+ s->bi_valid += length - Buf_size;
+ } else {
+ s->bi_buf |= (ush)value << s->bi_valid;
+ s->bi_valid += length;
+ }
+}
+#else /* !ZLIB_DEBUG */
+
+#define send_bits(s, value, length) \
+{ int len = length;\
+ if (s->bi_valid > (int)Buf_size - len) {\
+ int val = (int)value;\
+ s->bi_buf |= (ush)val << s->bi_valid;\
+ put_short(s, s->bi_buf);\
+ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
+ s->bi_valid += len - Buf_size;\
+ } else {\
+ s->bi_buf |= (ush)(value) << s->bi_valid;\
+ s->bi_valid += len;\
+ }\
+}
+#endif /* ZLIB_DEBUG */
+
+
+/* the arguments must not have side effects */
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
+ */
+local void tr_static_init()
+{
+#if defined(GEN_TREES_H) || !defined(STDC)
+ static int static_init_done = 0;
+ int n; /* iterates over tree elements */
+ int bits; /* bit counter */
+ int length; /* length value */
+ int code; /* code value */
+ int dist; /* distance index */
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ if (static_init_done) return;
+
+ /* For some embedded targets, global variables are not initialized: */
+#ifdef NO_INIT_GLOBAL_POINTERS
+ static_l_desc.static_tree = static_ltree;
+ static_l_desc.extra_bits = extra_lbits;
+ static_d_desc.static_tree = static_dtree;
+ static_d_desc.extra_bits = extra_dbits;
+ static_bl_desc.extra_bits = extra_blbits;
+#endif
+
+ /* Initialize the mapping length (0..255) -> length code (0..28) */
+ length = 0;
+ for (code = 0; code < LENGTH_CODES-1; code++) {
+ base_length[code] = length;
+ for (n = 0; n < (1<<extra_lbits[code]); n++) {
+ _length_code[length++] = (uch)code;
+ }
+ }
+ Assert (length == 256, "tr_static_init: length != 256");
+ /* Note that the length 255 (match length 258) can be represented
+ * in two different ways: code 284 + 5 bits or code 285, so we
+ * overwrite length_code[255] to use the best encoding:
+ */
+ _length_code[length-1] = (uch)code;
+
+ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+ dist = 0;
+ for (code = 0 ; code < 16; code++) {
+ base_dist[code] = dist;
+ for (n = 0; n < (1<<extra_dbits[code]); n++) {
+ _dist_code[dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: dist != 256");
+ dist >>= 7; /* from now on, all distances are divided by 128 */
+ for ( ; code < D_CODES; code++) {
+ base_dist[code] = dist << 7;
+ for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+ _dist_code[256 + dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+ /* Construct the codes of the static literal tree */
+ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+ n = 0;
+ while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
+ while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
+ while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
+ while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
+ /* Codes 286 and 287 do not exist, but we must include them in the
+ * tree construction to get a canonical Huffman tree (longest code
+ * all ones)
+ */
+ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
+
+ /* The static distance tree is trivial: */
+ for (n = 0; n < D_CODES; n++) {
+ static_dtree[n].Len = 5;
+ static_dtree[n].Code = bi_reverse((unsigned)n, 5);
+ }
+ static_init_done = 1;
+
+# ifdef GEN_TREES_H
+ gen_trees_header();
+# endif
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */
+}
+
+/* ===========================================================================
+ * Genererate the file trees.h describing the static trees.
+ */
+#ifdef GEN_TREES_H
+# ifndef ZLIB_DEBUG
+# include <stdio.h>
+# endif
+
+# define SEPARATOR(i, last, width) \
+ ((i) == (last)? "\n};\n\n" : \
+ ((i) % (width) == (width)-1 ? ",\n" : ", "))
+
+void gen_trees_header()
+{
+ FILE *header = fopen("trees.h", "w");
+ int i;
+
+ Assert (header != NULL, "Can't open trees.h");
+ fprintf(header,
+ "/* header created automatically with -DGEN_TREES_H */\n\n");
+
+ fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
+ for (i = 0; i < L_CODES+2; i++) {
+ fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
+ static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
+ }
+
+ fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
+ static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
+ }
+
+ fprintf(header, "const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {\n");
+ for (i = 0; i < DIST_CODE_LEN; i++) {
+ fprintf(header, "%2u%s", _dist_code[i],
+ SEPARATOR(i, DIST_CODE_LEN-1, 20));
+ }
+
+ fprintf(header,
+ "const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
+ for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
+ fprintf(header, "%2u%s", _length_code[i],
+ SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
+ }
+
+ fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
+ for (i = 0; i < LENGTH_CODES; i++) {
+ fprintf(header, "%1u%s", base_length[i],
+ SEPARATOR(i, LENGTH_CODES-1, 20));
+ }
+
+ fprintf(header, "local const int base_dist[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "%5u%s", base_dist[i],
+ SEPARATOR(i, D_CODES-1, 10));
+ }
+
+ fclose(header);
+}
+#endif /* GEN_TREES_H */
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
+ */
+void ZLIB_INTERNAL _tr_init(s)
+ deflate_state *s;
+{
+ tr_static_init();
+
+ s->l_desc.dyn_tree = s->dyn_ltree;
+ s->l_desc.stat_desc = &static_l_desc;
+
+ s->d_desc.dyn_tree = s->dyn_dtree;
+ s->d_desc.stat_desc = &static_d_desc;
+
+ s->bl_desc.dyn_tree = s->bl_tree;
+ s->bl_desc.stat_desc = &static_bl_desc;
+
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+#ifdef ZLIB_DEBUG
+ s->compressed_len = 0L;
+ s->bits_sent = 0L;
+#endif
+
+ /* Initialize the first block of the first file: */
+ init_block(s);
+}
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(s)
+ deflate_state *s;
+{
+ int n; /* iterates over tree elements */
+
+ /* Initialize the trees. */
+ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
+ for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
+ for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+ s->dyn_ltree[END_BLOCK].Freq = 1;
+ s->opt_len = s->static_len = 0L;
+ s->last_lit = s->matches = 0;
+}
+
+#define SMALLEST 1
+/* Index within the heap array of least frequent node in the Huffman tree */
+
+
+/* ===========================================================================
+ * Remove the smallest element from the heap and recreate the heap with
+ * one less element. Updates heap and heap_len.
+ */
+#define pqremove(s, tree, top) \
+{\
+ top = s->heap[SMALLEST]; \
+ s->heap[SMALLEST] = s->heap[s->heap_len--]; \
+ pqdownheap(s, tree, SMALLEST); \
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+#define smaller(tree, n, m, depth) \
+ (tree[n].Freq < tree[m].Freq || \
+ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+local void pqdownheap(s, tree, k)
+ deflate_state *s;
+ ct_data *tree; /* the tree to restore */
+ int k; /* node to move down */
+{
+ int v = s->heap[k];
+ int j = k << 1; /* left son of k */
+ while (j <= s->heap_len) {
+ /* Set j to the smallest of the two sons: */
+ if (j < s->heap_len &&
+ smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+ j++;
+ }
+ /* Exit if v is smaller than both sons */
+ if (smaller(tree, v, s->heap[j], s->depth)) break;
+
+ /* Exchange v with the smallest son */
+ s->heap[k] = s->heap[j]; k = j;
+
+ /* And continue down the tree, setting j to the left son of k */
+ j <<= 1;
+ }
+ s->heap[k] = v;
+}
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ * above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ * array bl_count contains the frequencies for each bit length.
+ * The length opt_len is updated; static_len is also updated if stree is
+ * not null.
+ */
+local void gen_bitlen(s, desc)
+ deflate_state *s;
+ tree_desc *desc; /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ int max_code = desc->max_code;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ const intf *extra = desc->stat_desc->extra_bits;
+ int base = desc->stat_desc->extra_base;
+ int max_length = desc->stat_desc->max_length;
+ int h; /* heap index */
+ int n, m; /* iterate over the tree elements */
+ int bits; /* bit length */
+ int xbits; /* extra bits */
+ ush f; /* frequency */
+ int overflow = 0; /* number of elements with bit length too large */
+
+ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
+
+ /* In a first pass, compute the optimal bit lengths (which may
+ * overflow in the case of the bit length tree).
+ */
+ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
+
+ for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+ n = s->heap[h];
+ bits = tree[tree[n].Dad].Len + 1;
+ if (bits > max_length) bits = max_length, overflow++;
+ tree[n].Len = (ush)bits;
+ /* We overwrite tree[n].Dad which is no longer needed */
+
+ if (n > max_code) continue; /* not a leaf node */
+
+ s->bl_count[bits]++;
+ xbits = 0;
+ if (n >= base) xbits = extra[n-base];
+ f = tree[n].Freq;
+ s->opt_len += (ulg)f * (unsigned)(bits + xbits);
+ if (stree) s->static_len += (ulg)f * (unsigned)(stree[n].Len + xbits);
+ }
+ if (overflow == 0) return;
+
+ Tracev((stderr,"\nbit length overflow\n"));
+ /* This happens for example on obj2 and pic of the Calgary corpus */
+
+ /* Find the first bit length which could increase: */
+ do {
+ bits = max_length-1;
+ while (s->bl_count[bits] == 0) bits--;
+ s->bl_count[bits]--; /* move one leaf down the tree */
+ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+ s->bl_count[max_length]--;
+ /* The brother of the overflow item also moves one step up,
+ * but this does not affect bl_count[max_length]
+ */
+ overflow -= 2;
+ } while (overflow > 0);
+
+ /* Now recompute all bit lengths, scanning in increasing frequency.
+ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+ * lengths instead of fixing only the wrong ones. This idea is taken
+ * from 'ar' written by Haruhiko Okumura.)
+ */
+ for (bits = max_length; bits != 0; bits--) {
+ n = s->bl_count[bits];
+ while (n != 0) {
+ m = s->heap[--h];
+ if (m > max_code) continue;
+ if ((unsigned) tree[m].Len != (unsigned) bits) {
+ Tracev((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+ s->opt_len += ((ulg)bits - tree[m].Len) * tree[m].Freq;
+ tree[m].Len = (ush)bits;
+ }
+ n--;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ * zero code length.
+ */
+local void gen_codes (tree, max_code, bl_count)
+ ct_data *tree; /* the tree to decorate */
+ int max_code; /* largest code with non zero frequency */
+ ushf *bl_count; /* number of codes at each bit length */
+{
+ ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+ unsigned code = 0; /* running code value */
+ int bits; /* bit index */
+ int n; /* code index */
+
+ /* The distribution counts are first used to generate the code values
+ * without bit reversal.
+ */
+ for (bits = 1; bits <= MAX_BITS; bits++) {
+ code = (code + bl_count[bits-1]) << 1;
+ next_code[bits] = (ush)code;
+ }
+ /* Check that the bit counts in bl_count are consistent. The last code
+ * must be all ones.
+ */
+ Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+ "inconsistent bit counts");
+ Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+ for (n = 0; n <= max_code; n++) {
+ int len = tree[n].Len;
+ if (len == 0) continue;
+ /* Now reverse the bits */
+ tree[n].Code = (ush)bi_reverse(next_code[len]++, len);
+
+ Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+ }
+}
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ * and corresponding code. The length opt_len is updated; static_len is
+ * also updated if stree is not null. The field max_code is set.
+ */
+local void build_tree(s, desc)
+ deflate_state *s;
+ tree_desc *desc; /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ int elems = desc->stat_desc->elems;
+ int n, m; /* iterate over heap elements */
+ int max_code = -1; /* largest code with non zero frequency */
+ int node; /* new node being created */
+
+ /* Construct the initial heap, with least frequent element in
+ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+ * heap[0] is not used.
+ */
+ s->heap_len = 0, s->heap_max = HEAP_SIZE;
+
+ for (n = 0; n < elems; n++) {
+ if (tree[n].Freq != 0) {
+ s->heap[++(s->heap_len)] = max_code = n;
+ s->depth[n] = 0;
+ } else {
+ tree[n].Len = 0;
+ }
+ }
+
+ /* The pkzip format requires that at least one distance code exists,
+ * and that at least one bit should be sent even if there is only one
+ * possible code. So to avoid special checks later on we force at least
+ * two codes of non zero frequency.
+ */
+ while (s->heap_len < 2) {
+ node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
+ tree[node].Freq = 1;
+ s->depth[node] = 0;
+ s->opt_len--; if (stree) s->static_len -= stree[node].Len;
+ /* node is 0 or 1 so it does not have extra bits */
+ }
+ desc->max_code = max_code;
+
+ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+ * establish sub-heaps of increasing lengths:
+ */
+ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
+
+ /* Construct the Huffman tree by repeatedly combining the least two
+ * frequent nodes.
+ */
+ node = elems; /* next internal node of the tree */
+ do {
+ pqremove(s, tree, n); /* n = node of least frequency */
+ m = s->heap[SMALLEST]; /* m = node of next least frequency */
+
+ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
+ s->heap[--(s->heap_max)] = m;
+
+ /* Create a new node father of n and m */
+ tree[node].Freq = tree[n].Freq + tree[m].Freq;
+ s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?
+ s->depth[n] : s->depth[m]) + 1);
+ tree[n].Dad = tree[m].Dad = (ush)node;
+#ifdef DUMP_BL_TREE
+ if (tree == s->bl_tree) {
+ fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
+ node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
+ }
+#endif
+ /* and insert the new node in the heap */
+ s->heap[SMALLEST] = node++;
+ pqdownheap(s, tree, SMALLEST);
+
+ } while (s->heap_len >= 2);
+
+ s->heap[--(s->heap_max)] = s->heap[SMALLEST];
+
+ /* At this point, the fields freq and dad are set. We can now
+ * generate the bit lengths.
+ */
+ gen_bitlen(s, (tree_desc *)desc);
+
+ /* The field len is now set, we can generate the bit codes */
+ gen_codes ((ct_data *)tree, max_code, s->bl_count);
+}
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+local void scan_tree (s, tree, max_code)
+ deflate_state *s;
+ ct_data *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ if (nextlen == 0) max_count = 138, min_count = 3;
+ tree[max_code+1].Len = (ush)0xffff; /* guard */
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ s->bl_tree[curlen].Freq += count;
+ } else if (curlen != 0) {
+ if (curlen != prevlen) s->bl_tree[curlen].Freq++;
+ s->bl_tree[REP_3_6].Freq++;
+ } else if (count <= 10) {
+ s->bl_tree[REPZ_3_10].Freq++;
+ } else {
+ s->bl_tree[REPZ_11_138].Freq++;
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+local void send_tree (s, tree, max_code)
+ deflate_state *s;
+ ct_data *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ /* tree[max_code+1].Len = -1; */ /* guard already set */
+ if (nextlen == 0) max_count = 138, min_count = 3;
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
+
+ } else if (curlen != 0) {
+ if (curlen != prevlen) {
+ send_code(s, curlen, s->bl_tree); count--;
+ }
+ Assert(count >= 3 && count <= 6, " 3_6?");
+ send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+
+ } else if (count <= 10) {
+ send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+
+ } else {
+ send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+local int build_bl_tree(s)
+ deflate_state *s;
+{
+ int max_blindex; /* index of last bit length code of non zero freq */
+
+ /* Determine the bit length frequencies for literal and distance trees */
+ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
+ scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
+
+ /* Build the bit length tree: */
+ build_tree(s, (tree_desc *)(&(s->bl_desc)));
+ /* opt_len now includes the length of the tree representations, except
+ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+ */
+
+ /* Determine the number of bit length codes to send. The pkzip format
+ * requires that at least 4 bit length codes be sent. (appnote.txt says
+ * 3 but the actual value used is 4.)
+ */
+ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
+ if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
+ }
+ /* Update opt_len to include the bit length tree and counts */
+ s->opt_len += 3*((ulg)max_blindex+1) + 5+5+4;
+ Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+ s->opt_len, s->static_len));
+
+ return max_blindex;
+}
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+local void send_all_trees(s, lcodes, dcodes, blcodes)
+ deflate_state *s;
+ int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+ int rank; /* index in bl_order */
+
+ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+ Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+ "too many codes");
+ Tracev((stderr, "\nbl counts: "));
+ send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
+ send_bits(s, dcodes-1, 5);
+ send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
+ for (rank = 0; rank < blcodes; rank++) {
+ Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+ send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
+ }
+ Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+/* ===========================================================================
+ * Send a stored block
+ */
+void ZLIB_INTERNAL _tr_stored_block(s, buf, stored_len, last)
+ deflate_state *s;
+ charf *buf; /* input block */
+ ulg stored_len; /* length of input block */
+ int last; /* one if this is the last block for a file */
+{
+ send_bits(s, (STORED_BLOCK<<1)+last, 3); /* send block type */
+ bi_windup(s); /* align on byte boundary */
+ put_short(s, (ush)stored_len);
+ put_short(s, (ush)~stored_len);
+ zmemcpy(s->pending_buf + s->pending, (Bytef *)buf, stored_len);
+ s->pending += stored_len;
+#ifdef ZLIB_DEBUG
+ s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
+ s->compressed_len += (stored_len + 4) << 3;
+ s->bits_sent += 2*16;
+ s->bits_sent += stored_len<<3;
+#endif
+}
+
+/* ===========================================================================
+ * Flush the bits in the bit buffer to pending output (leaves at most 7 bits)
+ */
+void ZLIB_INTERNAL _tr_flush_bits(s)
+ deflate_state *s;
+{
+ bi_flush(s);
+}
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ */
+void ZLIB_INTERNAL _tr_align(s)
+ deflate_state *s;
+{
+ send_bits(s, STATIC_TREES<<1, 3);
+ send_code(s, END_BLOCK, static_ltree);
+#ifdef ZLIB_DEBUG
+ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
+#endif
+ bi_flush(s);
+}
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and write out the encoded block.
+ */
+void ZLIB_INTERNAL _tr_flush_block(s, buf, stored_len, last)
+ deflate_state *s;
+ charf *buf; /* input block, or NULL if too old */
+ ulg stored_len; /* length of input block */
+ int last; /* one if this is the last block for a file */
+{
+ ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
+ int max_blindex = 0; /* index of last bit length code of non zero freq */
+
+ /* Build the Huffman trees unless a stored block is forced */
+ if (s->level > 0) {
+
+ /* Check if the file is binary or text */
+ if (s->strm->data_type == Z_UNKNOWN)
+ s->strm->data_type = detect_data_type(s);
+
+ /* Construct the literal and distance trees */
+ build_tree(s, (tree_desc *)(&(s->l_desc)));
+ Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+
+ build_tree(s, (tree_desc *)(&(s->d_desc)));
+ Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+ /* At this point, opt_len and static_len are the total bit lengths of
+ * the compressed block data, excluding the tree representations.
+ */
+
+ /* Build the bit length tree for the above two trees, and get the index
+ * in bl_order of the last bit length code to send.
+ */
+ max_blindex = build_bl_tree(s);
+
+ /* Determine the best encoding. Compute the block lengths in bytes. */
+ opt_lenb = (s->opt_len+3+7)>>3;
+ static_lenb = (s->static_len+3+7)>>3;
+
+ Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+ opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+ s->last_lit));
+
+ if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+
+ } else {
+ Assert(buf != (char*)0, "lost buf");
+ opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+ }
+
+#ifdef FORCE_STORED
+ if (buf != (char*)0) { /* force stored block */
+#else
+ if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+ /* 4: two words for the lengths */
+#endif
+ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+ * Otherwise we can't have processed more than WSIZE input bytes since
+ * the last block flush, because compression would have been
+ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+ * transform a block into a stored block.
+ */
+ _tr_stored_block(s, buf, stored_len, last);
+
+#ifdef FORCE_STATIC
+ } else if (static_lenb >= 0) { /* force static trees */
+#else
+ } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
+#endif
+ send_bits(s, (STATIC_TREES<<1)+last, 3);
+ compress_block(s, (const ct_data *)static_ltree,
+ (const ct_data *)static_dtree);
+#ifdef ZLIB_DEBUG
+ s->compressed_len += 3 + s->static_len;
+#endif
+ } else {
+ send_bits(s, (DYN_TREES<<1)+last, 3);
+ send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
+ max_blindex+1);
+ compress_block(s, (const ct_data *)s->dyn_ltree,
+ (const ct_data *)s->dyn_dtree);
+#ifdef ZLIB_DEBUG
+ s->compressed_len += 3 + s->opt_len;
+#endif
+ }
+ Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+ /* The above check is made mod 2^32, for files larger than 512 MB
+ * and uLong implemented on 32 bits.
+ */
+ init_block(s);
+
+ if (last) {
+ bi_windup(s);
+#ifdef ZLIB_DEBUG
+ s->compressed_len += 7; /* align on byte boundary */
+#endif
+ }
+ Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+ s->compressed_len-7*last));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+int ZLIB_INTERNAL _tr_tally (s, dist, lc)
+ deflate_state *s;
+ unsigned dist; /* distance of matched string */
+ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+ s->d_buf[s->last_lit] = (ush)dist;
+ s->l_buf[s->last_lit++] = (uch)lc;
+ if (dist == 0) {
+ /* lc is the unmatched char */
+ s->dyn_ltree[lc].Freq++;
+ } else {
+ s->matches++;
+ /* Here, lc is the match length - MIN_MATCH */
+ dist--; /* dist = match distance - 1 */
+ Assert((ush)dist < (ush)MAX_DIST(s) &&
+ (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+ (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
+
+ s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+ s->dyn_dtree[d_code(dist)].Freq++;
+ }
+
+#ifdef TRUNCATE_BLOCK
+ /* Try to guess if it is profitable to stop the current block here */
+ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
+ /* Compute an upper bound for the compressed length */
+ ulg out_length = (ulg)s->last_lit*8L;
+ ulg in_length = (ulg)((long)s->strstart - s->block_start);
+ int dcode;
+ for (dcode = 0; dcode < D_CODES; dcode++) {
+ out_length += (ulg)s->dyn_dtree[dcode].Freq *
+ (5L+extra_dbits[dcode]);
+ }
+ out_length >>= 3;
+ Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+ s->last_lit, in_length, out_length,
+ 100L - out_length*100L/in_length));
+ if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
+ }
+#endif
+ return (s->last_lit == s->lit_bufsize-1);
+ /* We avoid equality with lit_bufsize because of wraparound at 64K
+ * on 16 bit machines and because stored blocks are restricted to
+ * 64K-1 bytes.
+ */
+}
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(s, ltree, dtree)
+ deflate_state *s;
+ const ct_data *ltree; /* literal tree */
+ const ct_data *dtree; /* distance tree */
+{
+ unsigned dist; /* distance of matched string */
+ int lc; /* match length or unmatched char (if dist == 0) */
+ unsigned lx = 0; /* running index in l_buf */
+ unsigned code; /* the code to send */
+ int extra; /* number of extra bits to send */
+
+ if (s->last_lit != 0) do {
+ dist = s->d_buf[lx];
+ lc = s->l_buf[lx++];
+ if (dist == 0) {
+ send_code(s, lc, ltree); /* send a literal byte */
+ Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+ } else {
+ /* Here, lc is the match length - MIN_MATCH */
+ code = _length_code[lc];
+ send_code(s, code+LITERALS+1, ltree); /* send the length code */
+ extra = extra_lbits[code];
+ if (extra != 0) {
+ lc -= base_length[code];
+ send_bits(s, lc, extra); /* send the extra length bits */
+ }
+ dist--; /* dist is now the match distance - 1 */
+ code = d_code(dist);
+ Assert (code < D_CODES, "bad d_code");
+
+ send_code(s, code, dtree); /* send the distance code */
+ extra = extra_dbits[code];
+ if (extra != 0) {
+ dist -= (unsigned)base_dist[code];
+ send_bits(s, dist, extra); /* send the extra distance bits */
+ }
+ } /* literal or match pair ? */
+
+ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
+ "pendingBuf overflow");
+
+ } while (lx < s->last_lit);
+
+ send_code(s, END_BLOCK, ltree);
+}
+
+/* ===========================================================================
+ * Check if the data type is TEXT or BINARY, using the following algorithm:
+ * - TEXT if the two conditions below are satisfied:
+ * a) There are no non-portable control characters belonging to the
+ * "black list" (0..6, 14..25, 28..31).
+ * b) There is at least one printable character belonging to the
+ * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255).
+ * - BINARY otherwise.
+ * - The following partially-portable control characters form a
+ * "gray list" that is ignored in this detection algorithm:
+ * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}).
+ * IN assertion: the fields Freq of dyn_ltree are set.
+ */
+local int detect_data_type(s)
+ deflate_state *s;
+{
+ /* black_mask is the bit mask of black-listed bytes
+ * set bits 0..6, 14..25, and 28..31
+ * 0xf3ffc07f = binary 11110011111111111100000001111111
+ */
+ unsigned long black_mask = 0xf3ffc07fUL;
+ int n;
+
+ /* Check for non-textual ("black-listed") bytes. */
+ for (n = 0; n <= 31; n++, black_mask >>= 1)
+ if ((black_mask & 1) && (s->dyn_ltree[n].Freq != 0))
+ return Z_BINARY;
+
+ /* Check for textual ("white-listed") bytes. */
+ if (s->dyn_ltree[9].Freq != 0 || s->dyn_ltree[10].Freq != 0
+ || s->dyn_ltree[13].Freq != 0)
+ return Z_TEXT;
+ for (n = 32; n < LITERALS; n++)
+ if (s->dyn_ltree[n].Freq != 0)
+ return Z_TEXT;
+
+ /* There are no "black-listed" or "white-listed" bytes:
+ * this stream either is empty or has tolerated ("gray-listed") bytes only.
+ */
+ return Z_BINARY;
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+local unsigned bi_reverse(code, len)
+ unsigned code; /* the value to invert */
+ int len; /* its bit length */
+{
+ register unsigned res = 0;
+ do {
+ res |= code & 1;
+ code >>= 1, res <<= 1;
+ } while (--len > 0);
+ return res >> 1;
+}
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(s)
+ deflate_state *s;
+{
+ if (s->bi_valid == 16) {
+ put_short(s, s->bi_buf);
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+ } else if (s->bi_valid >= 8) {
+ put_byte(s, (Byte)s->bi_buf);
+ s->bi_buf >>= 8;
+ s->bi_valid -= 8;
+ }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(s)
+ deflate_state *s;
+{
+ if (s->bi_valid > 8) {
+ put_short(s, s->bi_buf);
+ } else if (s->bi_valid > 0) {
+ put_byte(s, (Byte)s->bi_buf);
+ }
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+#ifdef ZLIB_DEBUG
+ s->bits_sent = (s->bits_sent+7) & ~7;
+#endif
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/trees.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/trees.h
new file mode 100644
index 000000000..d35639d82
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/trees.h
@@ -0,0 +1,128 @@
+/* header created automatically with -DGEN_TREES_H */
+
+local const ct_data static_ltree[L_CODES+2] = {
+{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},
+{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},
+{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},
+{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},
+{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},
+{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},
+{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},
+{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},
+{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},
+{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},
+{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},
+{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},
+{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},
+{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},
+{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},
+{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},
+{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},
+{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},
+{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},
+{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},
+{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},
+{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},
+{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},
+{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},
+{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},
+{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},
+{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},
+{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},
+{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},
+{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},
+{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},
+{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},
+{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},
+{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},
+{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},
+{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},
+{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},
+{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},
+{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},
+{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},
+{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},
+{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},
+{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},
+{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},
+{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},
+{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},
+{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},
+{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},
+{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},
+{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},
+{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},
+{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},
+{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},
+{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},
+{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},
+{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},
+{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},
+{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}
+};
+
+local const ct_data static_dtree[D_CODES] = {
+{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
+{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
+{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
+{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
+{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
+{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
+};
+
+const uch ZLIB_INTERNAL _dist_code[DIST_CODE_LEN] = {
+ 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
+ 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
+10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
+11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
+12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
+13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
+14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
+15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,
+18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
+28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
+29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
+};
+
+const uch ZLIB_INTERNAL _length_code[MAX_MATCH-MIN_MATCH+1]= {
+ 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
+13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
+17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
+19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
+21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
+22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
+23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
+25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
+26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
+27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
+};
+
+local const int base_length[LENGTH_CODES] = {
+0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
+64, 80, 96, 112, 128, 160, 192, 224, 0
+};
+
+local const int base_dist[D_CODES] = {
+ 0, 1, 2, 3, 4, 6, 8, 12, 16, 24,
+ 32, 48, 64, 96, 128, 192, 256, 384, 512, 768,
+ 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
+};
+
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/uncompr.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/uncompr.c
new file mode 100644
index 000000000..f03a1a865
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/uncompr.c
@@ -0,0 +1,93 @@
+/* uncompr.c -- decompress a memory buffer
+ * Copyright (C) 1995-2003, 2010, 2014, 2016 Jean-loup Gailly, Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+/* ===========================================================================
+ Decompresses the source buffer into the destination buffer. *sourceLen is
+ the byte length of the source buffer. Upon entry, *destLen is the total size
+ of the destination buffer, which must be large enough to hold the entire
+ uncompressed data. (The size of the uncompressed data must have been saved
+ previously by the compressor and transmitted to the decompressor by some
+ mechanism outside the scope of this compression library.) Upon exit,
+ *destLen is the size of the decompressed data and *sourceLen is the number
+ of source bytes consumed. Upon return, source + *sourceLen points to the
+ first unused input byte.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer, or
+ Z_DATA_ERROR if the input data was corrupted, including if the input data is
+ an incomplete zlib stream.
+*/
+int ZEXPORT uncompress2 (dest, destLen, source, sourceLen)
+ Bytef *dest;
+ uLongf *destLen;
+ const Bytef *source;
+ uLong *sourceLen;
+{
+ z_stream stream;
+ int err;
+ const uInt max = (uInt)-1;
+ uLong len, left;
+ Byte buf[1]; /* for detection of incomplete stream when *destLen == 0 */
+
+ len = *sourceLen;
+ if (*destLen) {
+ left = *destLen;
+ *destLen = 0;
+ }
+ else {
+ left = 1;
+ dest = buf;
+ }
+
+ stream.next_in = (z_const Bytef *)source;
+ stream.avail_in = 0;
+ stream.zalloc = (alloc_func)0;
+ stream.zfree = (free_func)0;
+ stream.opaque = (voidpf)0;
+
+ err = inflateInit(&stream);
+ if (err != Z_OK) return err;
+
+ stream.next_out = dest;
+ stream.avail_out = 0;
+
+ do {
+ if (stream.avail_out == 0) {
+ stream.avail_out = left > (uLong)max ? max : (uInt)left;
+ left -= stream.avail_out;
+ }
+ if (stream.avail_in == 0) {
+ stream.avail_in = len > (uLong)max ? max : (uInt)len;
+ len -= stream.avail_in;
+ }
+ err = inflate(&stream, Z_NO_FLUSH);
+ } while (err == Z_OK);
+
+ *sourceLen -= len + stream.avail_in;
+ if (dest != buf)
+ *destLen = stream.total_out;
+ else if (stream.total_out && err == Z_BUF_ERROR)
+ left = 1;
+
+ inflateEnd(&stream);
+ return err == Z_STREAM_END ? Z_OK :
+ err == Z_NEED_DICT ? Z_DATA_ERROR :
+ err == Z_BUF_ERROR && left + stream.avail_out ? Z_DATA_ERROR :
+ err;
+}
+
+int ZEXPORT uncompress (dest, destLen, source, sourceLen)
+ Bytef *dest;
+ uLongf *destLen;
+ const Bytef *source;
+ uLong sourceLen;
+{
+ return uncompress2(dest, destLen, source, &sourceLen);
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_f.mak b/src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_f.mak
new file mode 100644
index 000000000..37f4d74c1
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_f.mak
@@ -0,0 +1,43 @@
+# Makefile for zlib
+# OpenWatcom flat model
+# Last updated: 28-Dec-2005
+
+# To use, do "wmake -f watcom_f.mak"
+
+C_SOURCE = adler32.c compress.c crc32.c deflate.c &
+ gzclose.c gzlib.c gzread.c gzwrite.c &
+ infback.c inffast.c inflate.c inftrees.c &
+ trees.c uncompr.c zutil.c
+
+OBJS = adler32.obj compress.obj crc32.obj deflate.obj &
+ gzclose.obj gzlib.obj gzread.obj gzwrite.obj &
+ infback.obj inffast.obj inflate.obj inftrees.obj &
+ trees.obj uncompr.obj zutil.obj
+
+CC = wcc386
+LINKER = wcl386
+CFLAGS = -zq -mf -3r -fp3 -s -bt=dos -oilrtfm -fr=nul -wx
+ZLIB_LIB = zlib_f.lib
+
+.C.OBJ:
+ $(CC) $(CFLAGS) $[@
+
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+$(ZLIB_LIB): $(OBJS)
+ wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj
+ wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj
+ wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj
+ wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj
+ wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj
+
+example.exe: $(ZLIB_LIB) example.obj
+ $(LINKER) -ldos32a -fe=example.exe example.obj $(ZLIB_LIB)
+
+minigzip.exe: $(ZLIB_LIB) minigzip.obj
+ $(LINKER) -ldos32a -fe=minigzip.exe minigzip.obj $(ZLIB_LIB)
+
+clean: .SYMBOLIC
+ del *.obj
+ del $(ZLIB_LIB)
+ @echo Cleaning done
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_l.mak b/src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_l.mak
new file mode 100644
index 000000000..193eed7b3
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/watcom/watcom_l.mak
@@ -0,0 +1,43 @@
+# Makefile for zlib
+# OpenWatcom large model
+# Last updated: 28-Dec-2005
+
+# To use, do "wmake -f watcom_l.mak"
+
+C_SOURCE = adler32.c compress.c crc32.c deflate.c &
+ gzclose.c gzlib.c gzread.c gzwrite.c &
+ infback.c inffast.c inflate.c inftrees.c &
+ trees.c uncompr.c zutil.c
+
+OBJS = adler32.obj compress.obj crc32.obj deflate.obj &
+ gzclose.obj gzlib.obj gzread.obj gzwrite.obj &
+ infback.obj inffast.obj inflate.obj inftrees.obj &
+ trees.obj uncompr.obj zutil.obj
+
+CC = wcc
+LINKER = wcl
+CFLAGS = -zq -ml -s -bt=dos -oilrtfm -fr=nul -wx
+ZLIB_LIB = zlib_l.lib
+
+.C.OBJ:
+ $(CC) $(CFLAGS) $[@
+
+all: $(ZLIB_LIB) example.exe minigzip.exe
+
+$(ZLIB_LIB): $(OBJS)
+ wlib -b -c $(ZLIB_LIB) -+adler32.obj -+compress.obj -+crc32.obj
+ wlib -b -c $(ZLIB_LIB) -+gzclose.obj -+gzlib.obj -+gzread.obj -+gzwrite.obj
+ wlib -b -c $(ZLIB_LIB) -+deflate.obj -+infback.obj
+ wlib -b -c $(ZLIB_LIB) -+inffast.obj -+inflate.obj -+inftrees.obj
+ wlib -b -c $(ZLIB_LIB) -+trees.obj -+uncompr.obj -+zutil.obj
+
+example.exe: $(ZLIB_LIB) example.obj
+ $(LINKER) -fe=example.exe example.obj $(ZLIB_LIB)
+
+minigzip.exe: $(ZLIB_LIB) minigzip.obj
+ $(LINKER) -fe=minigzip.exe minigzip.obj $(ZLIB_LIB)
+
+clean: .SYMBOLIC
+ del *.obj
+ del $(ZLIB_LIB)
+ @echo Cleaning done
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h
new file mode 100644
index 000000000..5e1d68a00
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h
@@ -0,0 +1,534 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set
+ * this permanently in zconf.h using "./configure --zprefix".
+ */
+#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
+# define Z_PREFIX_SET
+
+/* all linked symbols and init macros */
+# define _dist_code z__dist_code
+# define _length_code z__length_code
+# define _tr_align z__tr_align
+# define _tr_flush_bits z__tr_flush_bits
+# define _tr_flush_block z__tr_flush_block
+# define _tr_init z__tr_init
+# define _tr_stored_block z__tr_stored_block
+# define _tr_tally z__tr_tally
+# define adler32 z_adler32
+# define adler32_combine z_adler32_combine
+# define adler32_combine64 z_adler32_combine64
+# define adler32_z z_adler32_z
+# ifndef Z_SOLO
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# endif
+# define crc32 z_crc32
+# define crc32_combine z_crc32_combine
+# define crc32_combine64 z_crc32_combine64
+# define crc32_z z_crc32_z
+# define deflate z_deflate
+# define deflateBound z_deflateBound
+# define deflateCopy z_deflateCopy
+# define deflateEnd z_deflateEnd
+# define deflateGetDictionary z_deflateGetDictionary
+# define deflateInit z_deflateInit
+# define deflateInit2 z_deflateInit2
+# define deflateInit2_ z_deflateInit2_
+# define deflateInit_ z_deflateInit_
+# define deflateParams z_deflateParams
+# define deflatePending z_deflatePending
+# define deflatePrime z_deflatePrime
+# define deflateReset z_deflateReset
+# define deflateResetKeep z_deflateResetKeep
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateSetHeader z_deflateSetHeader
+# define deflateTune z_deflateTune
+# define deflate_copyright z_deflate_copyright
+# define get_crc_table z_get_crc_table
+# ifndef Z_SOLO
+# define gz_error z_gz_error
+# define gz_intmax z_gz_intmax
+# define gz_strwinerror z_gz_strwinerror
+# define gzbuffer z_gzbuffer
+# define gzclearerr z_gzclearerr
+# define gzclose z_gzclose
+# define gzclose_r z_gzclose_r
+# define gzclose_w z_gzclose_w
+# define gzdirect z_gzdirect
+# define gzdopen z_gzdopen
+# define gzeof z_gzeof
+# define gzerror z_gzerror
+# define gzflush z_gzflush
+# define gzfread z_gzfread
+# define gzfwrite z_gzfwrite
+# define gzgetc z_gzgetc
+# define gzgetc_ z_gzgetc_
+# define gzgets z_gzgets
+# define gzoffset z_gzoffset
+# define gzoffset64 z_gzoffset64
+# define gzopen z_gzopen
+# define gzopen64 z_gzopen64
+# ifdef _WIN32
+# define gzopen_w z_gzopen_w
+# endif
+# define gzprintf z_gzprintf
+# define gzputc z_gzputc
+# define gzputs z_gzputs
+# define gzread z_gzread
+# define gzrewind z_gzrewind
+# define gzseek z_gzseek
+# define gzseek64 z_gzseek64
+# define gzsetparams z_gzsetparams
+# define gztell z_gztell
+# define gztell64 z_gztell64
+# define gzungetc z_gzungetc
+# define gzvprintf z_gzvprintf
+# define gzwrite z_gzwrite
+# endif
+# define inflate z_inflate
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define inflateBackInit z_inflateBackInit
+# define inflateBackInit_ z_inflateBackInit_
+# define inflateCodesUsed z_inflateCodesUsed
+# define inflateCopy z_inflateCopy
+# define inflateEnd z_inflateEnd
+# define inflateGetDictionary z_inflateGetDictionary
+# define inflateGetHeader z_inflateGetHeader
+# define inflateInit z_inflateInit
+# define inflateInit2 z_inflateInit2
+# define inflateInit2_ z_inflateInit2_
+# define inflateInit_ z_inflateInit_
+# define inflateMark z_inflateMark
+# define inflatePrime z_inflatePrime
+# define inflateReset z_inflateReset
+# define inflateReset2 z_inflateReset2
+# define inflateResetKeep z_inflateResetKeep
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateUndermine z_inflateUndermine
+# define inflateValidate z_inflateValidate
+# define inflate_copyright z_inflate_copyright
+# define inflate_fast z_inflate_fast
+# define inflate_table z_inflate_table
+# ifndef Z_SOLO
+# define uncompress z_uncompress
+# define uncompress2 z_uncompress2
+# endif
+# define zError z_zError
+# ifndef Z_SOLO
+# define zcalloc z_zcalloc
+# define zcfree z_zcfree
+# endif
+# define zlibCompileFlags z_zlibCompileFlags
+# define zlibVersion z_zlibVersion
+
+/* all zlib typedefs in zlib.h and zconf.h */
+# define Byte z_Byte
+# define Bytef z_Bytef
+# define alloc_func z_alloc_func
+# define charf z_charf
+# define free_func z_free_func
+# ifndef Z_SOLO
+# define gzFile z_gzFile
+# endif
+# define gz_header z_gz_header
+# define gz_headerp z_gz_headerp
+# define in_func z_in_func
+# define intf z_intf
+# define out_func z_out_func
+# define uInt z_uInt
+# define uIntf z_uIntf
+# define uLong z_uLong
+# define uLongf z_uLongf
+# define voidp z_voidp
+# define voidpc z_voidpc
+# define voidpf z_voidpf
+
+/* all zlib structs in zlib.h and zconf.h */
+# define gz_header_s z_gz_header_s
+# define internal_state z_internal_state
+
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+#if defined(ZLIB_CONST) && !defined(z_const)
+# define z_const const
+#else
+# define z_const
+#endif
+
+#ifdef Z_SOLO
+ typedef unsigned long z_size_t;
+#else
+# define z_longlong long long
+# if defined(NO_SIZE_T)
+ typedef unsigned NO_SIZE_T z_size_t;
+# elif defined(STDC)
+# include <stddef.h>
+ typedef size_t z_size_t;
+# else
+ typedef unsigned long z_size_t;
+# endif
+# undef z_longlong
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+#ifndef Z_ARG /* function prototypes for stdarg */
+# if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# define Z_ARG(args) args
+# else
+# define Z_ARG(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+# include <limits.h>
+# if (UINT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned
+# elif (ULONG_MAX == 0xffffffffUL)
+# define Z_U4 unsigned long
+# elif (USHRT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned short
+# endif
+#endif
+
+#ifdef Z_U4
+ typedef Z_U4 z_crc_t;
+#else
+ typedef unsigned long z_crc_t;
+#endif
+
+#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_UNISTD_H
+#endif
+
+#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_STDARG_H
+#endif
+
+#ifdef STDC
+# ifndef Z_SOLO
+# include <sys/types.h> /* for off_t */
+# endif
+#endif
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+# include <stdarg.h> /* for va_list */
+# endif
+#endif
+
+#ifdef _WIN32
+# ifndef Z_SOLO
+# include <stddef.h> /* for wchar_t */
+# endif
+#endif
+
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
+ * though the former does not conform to the LFS document), but considering
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
+ * equivalently requesting no 64-bit operations
+ */
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
+# undef _LARGEFILE64_SOURCE
+#endif
+
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+# define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# ifndef z_off_t
+# define z_off_t off_t
+# endif
+# endif
+#endif
+
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+# define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+# define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+# define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if !defined(_WIN32) && defined(Z_LARGE64)
+# define z_off64_t off64_t
+#else
+# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# define z_off64_t __int64
+# else
+# define z_off64_t z_off_t
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+ #pragma map(deflateInit_,"DEIN")
+ #pragma map(deflateInit2_,"DEIN2")
+ #pragma map(deflateEnd,"DEEND")
+ #pragma map(deflateBound,"DEBND")
+ #pragma map(inflateInit_,"ININ")
+ #pragma map(inflateInit2_,"ININ2")
+ #pragma map(inflateEnd,"INEND")
+ #pragma map(inflateSync,"INSY")
+ #pragma map(inflateSetDictionary,"INSEDI")
+ #pragma map(compressBound,"CMBND")
+ #pragma map(inflate_table,"INTABL")
+ #pragma map(inflate_fast,"INFA")
+ #pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.cmakein b/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.cmakein
new file mode 100644
index 000000000..a7f24cce6
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.cmakein
@@ -0,0 +1,536 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+#cmakedefine Z_PREFIX
+#cmakedefine Z_HAVE_UNISTD_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set
+ * this permanently in zconf.h using "./configure --zprefix".
+ */
+#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
+# define Z_PREFIX_SET
+
+/* all linked symbols and init macros */
+# define _dist_code z__dist_code
+# define _length_code z__length_code
+# define _tr_align z__tr_align
+# define _tr_flush_bits z__tr_flush_bits
+# define _tr_flush_block z__tr_flush_block
+# define _tr_init z__tr_init
+# define _tr_stored_block z__tr_stored_block
+# define _tr_tally z__tr_tally
+# define adler32 z_adler32
+# define adler32_combine z_adler32_combine
+# define adler32_combine64 z_adler32_combine64
+# define adler32_z z_adler32_z
+# ifndef Z_SOLO
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# endif
+# define crc32 z_crc32
+# define crc32_combine z_crc32_combine
+# define crc32_combine64 z_crc32_combine64
+# define crc32_z z_crc32_z
+# define deflate z_deflate
+# define deflateBound z_deflateBound
+# define deflateCopy z_deflateCopy
+# define deflateEnd z_deflateEnd
+# define deflateGetDictionary z_deflateGetDictionary
+# define deflateInit z_deflateInit
+# define deflateInit2 z_deflateInit2
+# define deflateInit2_ z_deflateInit2_
+# define deflateInit_ z_deflateInit_
+# define deflateParams z_deflateParams
+# define deflatePending z_deflatePending
+# define deflatePrime z_deflatePrime
+# define deflateReset z_deflateReset
+# define deflateResetKeep z_deflateResetKeep
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateSetHeader z_deflateSetHeader
+# define deflateTune z_deflateTune
+# define deflate_copyright z_deflate_copyright
+# define get_crc_table z_get_crc_table
+# ifndef Z_SOLO
+# define gz_error z_gz_error
+# define gz_intmax z_gz_intmax
+# define gz_strwinerror z_gz_strwinerror
+# define gzbuffer z_gzbuffer
+# define gzclearerr z_gzclearerr
+# define gzclose z_gzclose
+# define gzclose_r z_gzclose_r
+# define gzclose_w z_gzclose_w
+# define gzdirect z_gzdirect
+# define gzdopen z_gzdopen
+# define gzeof z_gzeof
+# define gzerror z_gzerror
+# define gzflush z_gzflush
+# define gzfread z_gzfread
+# define gzfwrite z_gzfwrite
+# define gzgetc z_gzgetc
+# define gzgetc_ z_gzgetc_
+# define gzgets z_gzgets
+# define gzoffset z_gzoffset
+# define gzoffset64 z_gzoffset64
+# define gzopen z_gzopen
+# define gzopen64 z_gzopen64
+# ifdef _WIN32
+# define gzopen_w z_gzopen_w
+# endif
+# define gzprintf z_gzprintf
+# define gzputc z_gzputc
+# define gzputs z_gzputs
+# define gzread z_gzread
+# define gzrewind z_gzrewind
+# define gzseek z_gzseek
+# define gzseek64 z_gzseek64
+# define gzsetparams z_gzsetparams
+# define gztell z_gztell
+# define gztell64 z_gztell64
+# define gzungetc z_gzungetc
+# define gzvprintf z_gzvprintf
+# define gzwrite z_gzwrite
+# endif
+# define inflate z_inflate
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define inflateBackInit z_inflateBackInit
+# define inflateBackInit_ z_inflateBackInit_
+# define inflateCodesUsed z_inflateCodesUsed
+# define inflateCopy z_inflateCopy
+# define inflateEnd z_inflateEnd
+# define inflateGetDictionary z_inflateGetDictionary
+# define inflateGetHeader z_inflateGetHeader
+# define inflateInit z_inflateInit
+# define inflateInit2 z_inflateInit2
+# define inflateInit2_ z_inflateInit2_
+# define inflateInit_ z_inflateInit_
+# define inflateMark z_inflateMark
+# define inflatePrime z_inflatePrime
+# define inflateReset z_inflateReset
+# define inflateReset2 z_inflateReset2
+# define inflateResetKeep z_inflateResetKeep
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateUndermine z_inflateUndermine
+# define inflateValidate z_inflateValidate
+# define inflate_copyright z_inflate_copyright
+# define inflate_fast z_inflate_fast
+# define inflate_table z_inflate_table
+# ifndef Z_SOLO
+# define uncompress z_uncompress
+# define uncompress2 z_uncompress2
+# endif
+# define zError z_zError
+# ifndef Z_SOLO
+# define zcalloc z_zcalloc
+# define zcfree z_zcfree
+# endif
+# define zlibCompileFlags z_zlibCompileFlags
+# define zlibVersion z_zlibVersion
+
+/* all zlib typedefs in zlib.h and zconf.h */
+# define Byte z_Byte
+# define Bytef z_Bytef
+# define alloc_func z_alloc_func
+# define charf z_charf
+# define free_func z_free_func
+# ifndef Z_SOLO
+# define gzFile z_gzFile
+# endif
+# define gz_header z_gz_header
+# define gz_headerp z_gz_headerp
+# define in_func z_in_func
+# define intf z_intf
+# define out_func z_out_func
+# define uInt z_uInt
+# define uIntf z_uIntf
+# define uLong z_uLong
+# define uLongf z_uLongf
+# define voidp z_voidp
+# define voidpc z_voidpc
+# define voidpf z_voidpf
+
+/* all zlib structs in zlib.h and zconf.h */
+# define gz_header_s z_gz_header_s
+# define internal_state z_internal_state
+
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+#if defined(ZLIB_CONST) && !defined(z_const)
+# define z_const const
+#else
+# define z_const
+#endif
+
+#ifdef Z_SOLO
+ typedef unsigned long z_size_t;
+#else
+# define z_longlong long long
+# if defined(NO_SIZE_T)
+ typedef unsigned NO_SIZE_T z_size_t;
+# elif defined(STDC)
+# include <stddef.h>
+ typedef size_t z_size_t;
+# else
+ typedef unsigned long z_size_t;
+# endif
+# undef z_longlong
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+#ifndef Z_ARG /* function prototypes for stdarg */
+# if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# define Z_ARG(args) args
+# else
+# define Z_ARG(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+# include <limits.h>
+# if (UINT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned
+# elif (ULONG_MAX == 0xffffffffUL)
+# define Z_U4 unsigned long
+# elif (USHRT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned short
+# endif
+#endif
+
+#ifdef Z_U4
+ typedef Z_U4 z_crc_t;
+#else
+ typedef unsigned long z_crc_t;
+#endif
+
+#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_UNISTD_H
+#endif
+
+#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_STDARG_H
+#endif
+
+#ifdef STDC
+# ifndef Z_SOLO
+# include <sys/types.h> /* for off_t */
+# endif
+#endif
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+# include <stdarg.h> /* for va_list */
+# endif
+#endif
+
+#ifdef _WIN32
+# ifndef Z_SOLO
+# include <stddef.h> /* for wchar_t */
+# endif
+#endif
+
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
+ * though the former does not conform to the LFS document), but considering
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
+ * equivalently requesting no 64-bit operations
+ */
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
+# undef _LARGEFILE64_SOURCE
+#endif
+
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+# define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# ifndef z_off_t
+# define z_off_t off_t
+# endif
+# endif
+#endif
+
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+# define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+# define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+# define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if !defined(_WIN32) && defined(Z_LARGE64)
+# define z_off64_t off64_t
+#else
+# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# define z_off64_t __int64
+# else
+# define z_off64_t z_off_t
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+ #pragma map(deflateInit_,"DEIN")
+ #pragma map(deflateInit2_,"DEIN2")
+ #pragma map(deflateEnd,"DEEND")
+ #pragma map(deflateBound,"DEBND")
+ #pragma map(inflateInit_,"ININ")
+ #pragma map(inflateInit2_,"ININ2")
+ #pragma map(inflateEnd,"INEND")
+ #pragma map(inflateSync,"INSY")
+ #pragma map(inflateSetDictionary,"INSEDI")
+ #pragma map(compressBound,"CMBND")
+ #pragma map(inflate_table,"INTABL")
+ #pragma map(inflate_fast,"INFA")
+ #pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.in b/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.in
new file mode 100644
index 000000000..5e1d68a00
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zconf.h.in
@@ -0,0 +1,534 @@
+/* zconf.h -- configuration of the zlib compression library
+ * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZCONF_H
+#define ZCONF_H
+
+/*
+ * If you *really* need a unique prefix for all types and library functions,
+ * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
+ * Even better than compiling with -DZ_PREFIX would be to use configure to set
+ * this permanently in zconf.h using "./configure --zprefix".
+ */
+#ifdef Z_PREFIX /* may be set to #if 1 by ./configure */
+# define Z_PREFIX_SET
+
+/* all linked symbols and init macros */
+# define _dist_code z__dist_code
+# define _length_code z__length_code
+# define _tr_align z__tr_align
+# define _tr_flush_bits z__tr_flush_bits
+# define _tr_flush_block z__tr_flush_block
+# define _tr_init z__tr_init
+# define _tr_stored_block z__tr_stored_block
+# define _tr_tally z__tr_tally
+# define adler32 z_adler32
+# define adler32_combine z_adler32_combine
+# define adler32_combine64 z_adler32_combine64
+# define adler32_z z_adler32_z
+# ifndef Z_SOLO
+# define compress z_compress
+# define compress2 z_compress2
+# define compressBound z_compressBound
+# endif
+# define crc32 z_crc32
+# define crc32_combine z_crc32_combine
+# define crc32_combine64 z_crc32_combine64
+# define crc32_z z_crc32_z
+# define deflate z_deflate
+# define deflateBound z_deflateBound
+# define deflateCopy z_deflateCopy
+# define deflateEnd z_deflateEnd
+# define deflateGetDictionary z_deflateGetDictionary
+# define deflateInit z_deflateInit
+# define deflateInit2 z_deflateInit2
+# define deflateInit2_ z_deflateInit2_
+# define deflateInit_ z_deflateInit_
+# define deflateParams z_deflateParams
+# define deflatePending z_deflatePending
+# define deflatePrime z_deflatePrime
+# define deflateReset z_deflateReset
+# define deflateResetKeep z_deflateResetKeep
+# define deflateSetDictionary z_deflateSetDictionary
+# define deflateSetHeader z_deflateSetHeader
+# define deflateTune z_deflateTune
+# define deflate_copyright z_deflate_copyright
+# define get_crc_table z_get_crc_table
+# ifndef Z_SOLO
+# define gz_error z_gz_error
+# define gz_intmax z_gz_intmax
+# define gz_strwinerror z_gz_strwinerror
+# define gzbuffer z_gzbuffer
+# define gzclearerr z_gzclearerr
+# define gzclose z_gzclose
+# define gzclose_r z_gzclose_r
+# define gzclose_w z_gzclose_w
+# define gzdirect z_gzdirect
+# define gzdopen z_gzdopen
+# define gzeof z_gzeof
+# define gzerror z_gzerror
+# define gzflush z_gzflush
+# define gzfread z_gzfread
+# define gzfwrite z_gzfwrite
+# define gzgetc z_gzgetc
+# define gzgetc_ z_gzgetc_
+# define gzgets z_gzgets
+# define gzoffset z_gzoffset
+# define gzoffset64 z_gzoffset64
+# define gzopen z_gzopen
+# define gzopen64 z_gzopen64
+# ifdef _WIN32
+# define gzopen_w z_gzopen_w
+# endif
+# define gzprintf z_gzprintf
+# define gzputc z_gzputc
+# define gzputs z_gzputs
+# define gzread z_gzread
+# define gzrewind z_gzrewind
+# define gzseek z_gzseek
+# define gzseek64 z_gzseek64
+# define gzsetparams z_gzsetparams
+# define gztell z_gztell
+# define gztell64 z_gztell64
+# define gzungetc z_gzungetc
+# define gzvprintf z_gzvprintf
+# define gzwrite z_gzwrite
+# endif
+# define inflate z_inflate
+# define inflateBack z_inflateBack
+# define inflateBackEnd z_inflateBackEnd
+# define inflateBackInit z_inflateBackInit
+# define inflateBackInit_ z_inflateBackInit_
+# define inflateCodesUsed z_inflateCodesUsed
+# define inflateCopy z_inflateCopy
+# define inflateEnd z_inflateEnd
+# define inflateGetDictionary z_inflateGetDictionary
+# define inflateGetHeader z_inflateGetHeader
+# define inflateInit z_inflateInit
+# define inflateInit2 z_inflateInit2
+# define inflateInit2_ z_inflateInit2_
+# define inflateInit_ z_inflateInit_
+# define inflateMark z_inflateMark
+# define inflatePrime z_inflatePrime
+# define inflateReset z_inflateReset
+# define inflateReset2 z_inflateReset2
+# define inflateResetKeep z_inflateResetKeep
+# define inflateSetDictionary z_inflateSetDictionary
+# define inflateSync z_inflateSync
+# define inflateSyncPoint z_inflateSyncPoint
+# define inflateUndermine z_inflateUndermine
+# define inflateValidate z_inflateValidate
+# define inflate_copyright z_inflate_copyright
+# define inflate_fast z_inflate_fast
+# define inflate_table z_inflate_table
+# ifndef Z_SOLO
+# define uncompress z_uncompress
+# define uncompress2 z_uncompress2
+# endif
+# define zError z_zError
+# ifndef Z_SOLO
+# define zcalloc z_zcalloc
+# define zcfree z_zcfree
+# endif
+# define zlibCompileFlags z_zlibCompileFlags
+# define zlibVersion z_zlibVersion
+
+/* all zlib typedefs in zlib.h and zconf.h */
+# define Byte z_Byte
+# define Bytef z_Bytef
+# define alloc_func z_alloc_func
+# define charf z_charf
+# define free_func z_free_func
+# ifndef Z_SOLO
+# define gzFile z_gzFile
+# endif
+# define gz_header z_gz_header
+# define gz_headerp z_gz_headerp
+# define in_func z_in_func
+# define intf z_intf
+# define out_func z_out_func
+# define uInt z_uInt
+# define uIntf z_uIntf
+# define uLong z_uLong
+# define uLongf z_uLongf
+# define voidp z_voidp
+# define voidpc z_voidpc
+# define voidpf z_voidpf
+
+/* all zlib structs in zlib.h and zconf.h */
+# define gz_header_s z_gz_header_s
+# define internal_state z_internal_state
+
+#endif
+
+#if defined(__MSDOS__) && !defined(MSDOS)
+# define MSDOS
+#endif
+#if (defined(OS_2) || defined(__OS2__)) && !defined(OS2)
+# define OS2
+#endif
+#if defined(_WINDOWS) && !defined(WINDOWS)
+# define WINDOWS
+#endif
+#if defined(_WIN32) || defined(_WIN32_WCE) || defined(__WIN32__)
+# ifndef WIN32
+# define WIN32
+# endif
+#endif
+#if (defined(MSDOS) || defined(OS2) || defined(WINDOWS)) && !defined(WIN32)
+# if !defined(__GNUC__) && !defined(__FLAT__) && !defined(__386__)
+# ifndef SYS16BIT
+# define SYS16BIT
+# endif
+# endif
+#endif
+
+/*
+ * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
+ * than 64k bytes at a time (needed on systems with 16-bit int).
+ */
+#ifdef SYS16BIT
+# define MAXSEG_64K
+#endif
+#ifdef MSDOS
+# define UNALIGNED_OK
+#endif
+
+#ifdef __STDC_VERSION__
+# ifndef STDC
+# define STDC
+# endif
+# if __STDC_VERSION__ >= 199901L
+# ifndef STDC99
+# define STDC99
+# endif
+# endif
+#endif
+#if !defined(STDC) && (defined(__STDC__) || defined(__cplusplus))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(__GNUC__) || defined(__BORLANDC__))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(MSDOS) || defined(WINDOWS) || defined(WIN32))
+# define STDC
+#endif
+#if !defined(STDC) && (defined(OS2) || defined(__HOS_AIX__))
+# define STDC
+#endif
+
+#if defined(__OS400__) && !defined(STDC) /* iSeries (formerly AS/400). */
+# define STDC
+#endif
+
+#ifndef STDC
+# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
+# define const /* note: need a more gentle solution here */
+# endif
+#endif
+
+#if defined(ZLIB_CONST) && !defined(z_const)
+# define z_const const
+#else
+# define z_const
+#endif
+
+#ifdef Z_SOLO
+ typedef unsigned long z_size_t;
+#else
+# define z_longlong long long
+# if defined(NO_SIZE_T)
+ typedef unsigned NO_SIZE_T z_size_t;
+# elif defined(STDC)
+# include <stddef.h>
+ typedef size_t z_size_t;
+# else
+ typedef unsigned long z_size_t;
+# endif
+# undef z_longlong
+#endif
+
+/* Maximum value for memLevel in deflateInit2 */
+#ifndef MAX_MEM_LEVEL
+# ifdef MAXSEG_64K
+# define MAX_MEM_LEVEL 8
+# else
+# define MAX_MEM_LEVEL 9
+# endif
+#endif
+
+/* Maximum value for windowBits in deflateInit2 and inflateInit2.
+ * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
+ * created by gzip. (Files created by minigzip can still be extracted by
+ * gzip.)
+ */
+#ifndef MAX_WBITS
+# define MAX_WBITS 15 /* 32K LZ77 window */
+#endif
+
+/* The memory requirements for deflate are (in bytes):
+ (1 << (windowBits+2)) + (1 << (memLevel+9))
+ that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
+ plus a few kilobytes for small objects. For example, if you want to reduce
+ the default memory requirements from 256K to 128K, compile with
+ make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
+ Of course this will generally degrade compression (there's no free lunch).
+
+ The memory requirements for inflate are (in bytes) 1 << windowBits
+ that is, 32K for windowBits=15 (default value) plus about 7 kilobytes
+ for small objects.
+*/
+
+ /* Type declarations */
+
+#ifndef OF /* function prototypes */
+# ifdef STDC
+# define OF(args) args
+# else
+# define OF(args) ()
+# endif
+#endif
+
+#ifndef Z_ARG /* function prototypes for stdarg */
+# if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# define Z_ARG(args) args
+# else
+# define Z_ARG(args) ()
+# endif
+#endif
+
+/* The following definitions for FAR are needed only for MSDOS mixed
+ * model programming (small or medium model with some far allocations).
+ * This was tested only with MSC; for other MSDOS compilers you may have
+ * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
+ * just define FAR to be empty.
+ */
+#ifdef SYS16BIT
+# if defined(M_I86SM) || defined(M_I86MM)
+ /* MSC small or medium model */
+# define SMALL_MEDIUM
+# ifdef _MSC_VER
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+# if (defined(__SMALL__) || defined(__MEDIUM__))
+ /* Turbo C small or medium model */
+# define SMALL_MEDIUM
+# ifdef __BORLANDC__
+# define FAR _far
+# else
+# define FAR far
+# endif
+# endif
+#endif
+
+#if defined(WINDOWS) || defined(WIN32)
+ /* If building or using zlib as a DLL, define ZLIB_DLL.
+ * This is not mandatory, but it offers a little performance increase.
+ */
+# ifdef ZLIB_DLL
+# if defined(WIN32) && (!defined(__BORLANDC__) || (__BORLANDC__ >= 0x500))
+# ifdef ZLIB_INTERNAL
+# define ZEXTERN extern __declspec(dllexport)
+# else
+# define ZEXTERN extern __declspec(dllimport)
+# endif
+# endif
+# endif /* ZLIB_DLL */
+ /* If building or using zlib with the WINAPI/WINAPIV calling convention,
+ * define ZLIB_WINAPI.
+ * Caution: the standard ZLIB1.DLL is NOT compiled using ZLIB_WINAPI.
+ */
+# ifdef ZLIB_WINAPI
+# ifdef FAR
+# undef FAR
+# endif
+# include <windows.h>
+ /* No need for _export, use ZLIB.DEF instead. */
+ /* For complete Windows compatibility, use WINAPI, not __stdcall. */
+# define ZEXPORT WINAPI
+# ifdef WIN32
+# define ZEXPORTVA WINAPIV
+# else
+# define ZEXPORTVA FAR CDECL
+# endif
+# endif
+#endif
+
+#if defined (__BEOS__)
+# ifdef ZLIB_DLL
+# ifdef ZLIB_INTERNAL
+# define ZEXPORT __declspec(dllexport)
+# define ZEXPORTVA __declspec(dllexport)
+# else
+# define ZEXPORT __declspec(dllimport)
+# define ZEXPORTVA __declspec(dllimport)
+# endif
+# endif
+#endif
+
+#ifndef ZEXTERN
+# define ZEXTERN extern
+#endif
+#ifndef ZEXPORT
+# define ZEXPORT
+#endif
+#ifndef ZEXPORTVA
+# define ZEXPORTVA
+#endif
+
+#ifndef FAR
+# define FAR
+#endif
+
+#if !defined(__MACTYPES__)
+typedef unsigned char Byte; /* 8 bits */
+#endif
+typedef unsigned int uInt; /* 16 bits or more */
+typedef unsigned long uLong; /* 32 bits or more */
+
+#ifdef SMALL_MEDIUM
+ /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
+# define Bytef Byte FAR
+#else
+ typedef Byte FAR Bytef;
+#endif
+typedef char FAR charf;
+typedef int FAR intf;
+typedef uInt FAR uIntf;
+typedef uLong FAR uLongf;
+
+#ifdef STDC
+ typedef void const *voidpc;
+ typedef void FAR *voidpf;
+ typedef void *voidp;
+#else
+ typedef Byte const *voidpc;
+ typedef Byte FAR *voidpf;
+ typedef Byte *voidp;
+#endif
+
+#if !defined(Z_U4) && !defined(Z_SOLO) && defined(STDC)
+# include <limits.h>
+# if (UINT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned
+# elif (ULONG_MAX == 0xffffffffUL)
+# define Z_U4 unsigned long
+# elif (USHRT_MAX == 0xffffffffUL)
+# define Z_U4 unsigned short
+# endif
+#endif
+
+#ifdef Z_U4
+ typedef Z_U4 z_crc_t;
+#else
+ typedef unsigned long z_crc_t;
+#endif
+
+#ifdef HAVE_UNISTD_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_UNISTD_H
+#endif
+
+#ifdef HAVE_STDARG_H /* may be set to #if 1 by ./configure */
+# define Z_HAVE_STDARG_H
+#endif
+
+#ifdef STDC
+# ifndef Z_SOLO
+# include <sys/types.h> /* for off_t */
+# endif
+#endif
+
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+# include <stdarg.h> /* for va_list */
+# endif
+#endif
+
+#ifdef _WIN32
+# ifndef Z_SOLO
+# include <stddef.h> /* for wchar_t */
+# endif
+#endif
+
+/* a little trick to accommodate both "#define _LARGEFILE64_SOURCE" and
+ * "#define _LARGEFILE64_SOURCE 1" as requesting 64-bit operations, (even
+ * though the former does not conform to the LFS document), but considering
+ * both "#undef _LARGEFILE64_SOURCE" and "#define _LARGEFILE64_SOURCE 0" as
+ * equivalently requesting no 64-bit operations
+ */
+#if defined(_LARGEFILE64_SOURCE) && -_LARGEFILE64_SOURCE - -1 == 1
+# undef _LARGEFILE64_SOURCE
+#endif
+
+#if defined(__WATCOMC__) && !defined(Z_HAVE_UNISTD_H)
+# define Z_HAVE_UNISTD_H
+#endif
+#ifndef Z_SOLO
+# if defined(Z_HAVE_UNISTD_H) || defined(_LARGEFILE64_SOURCE)
+# include <unistd.h> /* for SEEK_*, off_t, and _LFS64_LARGEFILE */
+# ifdef VMS
+# include <unixio.h> /* for off_t */
+# endif
+# ifndef z_off_t
+# define z_off_t off_t
+# endif
+# endif
+#endif
+
+#if defined(_LFS64_LARGEFILE) && _LFS64_LARGEFILE-0
+# define Z_LFS64
+#endif
+
+#if defined(_LARGEFILE64_SOURCE) && defined(Z_LFS64)
+# define Z_LARGE64
+#endif
+
+#if defined(_FILE_OFFSET_BITS) && _FILE_OFFSET_BITS-0 == 64 && defined(Z_LFS64)
+# define Z_WANT64
+#endif
+
+#if !defined(SEEK_SET) && !defined(Z_SOLO)
+# define SEEK_SET 0 /* Seek from beginning of file. */
+# define SEEK_CUR 1 /* Seek from current position. */
+# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
+#endif
+
+#ifndef z_off_t
+# define z_off_t long
+#endif
+
+#if !defined(_WIN32) && defined(Z_LARGE64)
+# define z_off64_t off64_t
+#else
+# if defined(_WIN32) && !defined(__GNUC__) && !defined(Z_SOLO)
+# define z_off64_t __int64
+# else
+# define z_off64_t z_off_t
+# endif
+#endif
+
+/* MVS linker does not support external names larger than 8 bytes */
+#if defined(__MVS__)
+ #pragma map(deflateInit_,"DEIN")
+ #pragma map(deflateInit2_,"DEIN2")
+ #pragma map(deflateEnd,"DEEND")
+ #pragma map(deflateBound,"DEBND")
+ #pragma map(inflateInit_,"ININ")
+ #pragma map(inflateInit2_,"ININ2")
+ #pragma map(inflateEnd,"INEND")
+ #pragma map(inflateSync,"INSY")
+ #pragma map(inflateSetDictionary,"INSEDI")
+ #pragma map(compressBound,"CMBND")
+ #pragma map(inflate_table,"INTABL")
+ #pragma map(inflate_fast,"INFA")
+ #pragma map(inflate_copyright,"INCOPY")
+#endif
+
+#endif /* ZCONF_H */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3 b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3
new file mode 100644
index 000000000..bda4eb073
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3
@@ -0,0 +1,149 @@
+.TH ZLIB 3 "15 Jan 2017"
+.SH NAME
+zlib \- compression/decompression library
+.SH SYNOPSIS
+[see
+.I zlib.h
+for full description]
+.SH DESCRIPTION
+The
+.I zlib
+library is a general purpose data compression library.
+The code is thread safe, assuming that the standard library functions
+used are thread safe, such as memory allocation routines.
+It provides in-memory compression and decompression functions,
+including integrity checks of the uncompressed data.
+This version of the library supports only one compression method (deflation)
+but other algorithms may be added later
+with the same stream interface.
+.LP
+Compression can be done in a single step if the buffers are large enough
+or can be done by repeated calls of the compression function.
+In the latter case,
+the application must provide more input and/or consume the output
+(providing more output space) before each call.
+.LP
+The library also supports reading and writing files in
+.IR gzip (1)
+(.gz) format
+with an interface similar to that of stdio.
+.LP
+The library does not install any signal handler.
+The decoder checks the consistency of the compressed data,
+so the library should never crash even in the case of corrupted input.
+.LP
+All functions of the compression library are documented in the file
+.IR zlib.h .
+The distribution source includes examples of use of the library
+in the files
+.I test/example.c
+and
+.IR test/minigzip.c,
+as well as other examples in the
+.IR examples/
+directory.
+.LP
+Changes to this version are documented in the file
+.I ChangeLog
+that accompanies the source.
+.LP
+.I zlib
+is built in to many languages and operating systems, including but not limited to
+Java, Python, .NET, PHP, Perl, Ruby, Swift, and Go.
+.LP
+An experimental package to read and write files in the .zip format,
+written on top of
+.I zlib
+by Gilles Vollant (info@winimage.com),
+is available at:
+.IP
+http://www.winimage.com/zLibDll/minizip.html
+and also in the
+.I contrib/minizip
+directory of the main
+.I zlib
+source distribution.
+.SH "SEE ALSO"
+The
+.I zlib
+web site can be found at:
+.IP
+http://zlib.net/
+.LP
+The data format used by the
+.I zlib
+library is described by RFC
+(Request for Comments) 1950 to 1952 in the files:
+.IP
+http://tools.ietf.org/html/rfc1950 (for the zlib header and trailer format)
+.br
+http://tools.ietf.org/html/rfc1951 (for the deflate compressed data format)
+.br
+http://tools.ietf.org/html/rfc1952 (for the gzip header and trailer format)
+.LP
+Mark Nelson wrote an article about
+.I zlib
+for the Jan. 1997 issue of Dr. Dobb's Journal;
+a copy of the article is available at:
+.IP
+http://marknelson.us/1997/01/01/zlib-engine/
+.SH "REPORTING PROBLEMS"
+Before reporting a problem,
+please check the
+.I zlib
+web site to verify that you have the latest version of
+.IR zlib ;
+otherwise,
+obtain the latest version and see if the problem still exists.
+Please read the
+.I zlib
+FAQ at:
+.IP
+http://zlib.net/zlib_faq.html
+.LP
+before asking for help.
+Send questions and/or comments to zlib@gzip.org,
+or (for the Windows DLL version) to Gilles Vollant (info@winimage.com).
+.SH AUTHORS AND LICENSE
+Version 1.2.11
+.LP
+Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+.LP
+This software is provided 'as-is', without any express or implied
+warranty. In no event will the authors be held liable for any damages
+arising from the use of this software.
+.LP
+Permission is granted to anyone to use this software for any purpose,
+including commercial applications, and to alter it and redistribute it
+freely, subject to the following restrictions:
+.LP
+.nr step 1 1
+.IP \n[step]. 3
+The origin of this software must not be misrepresented; you must not
+claim that you wrote the original software. If you use this software
+in a product, an acknowledgment in the product documentation would be
+appreciated but is not required.
+.IP \n+[step].
+Altered source versions must be plainly marked as such, and must not be
+misrepresented as being the original software.
+.IP \n+[step].
+This notice may not be removed or altered from any source distribution.
+.LP
+Jean-loup Gailly Mark Adler
+.br
+jloup@gzip.org madler@alumni.caltech.edu
+.LP
+The deflate format used by
+.I zlib
+was defined by Phil Katz.
+The deflate and
+.I zlib
+specifications were written by L. Peter Deutsch.
+Thanks to all the people who reported problems and suggested various
+improvements in
+.IR zlib ;
+who are too numerous to cite here.
+.LP
+UNIX manual page by R. P. C. Rodgers,
+U.S. National Library of Medicine (rodgers@nlm.nih.gov).
+.\" end of man page
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3.pdf b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3.pdf
new file mode 100644
index 000000000..6fa519c5b
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.3.pdf
Binary files differ
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.h
new file mode 100644
index 000000000..f09cdaf1e
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.h
@@ -0,0 +1,1912 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.11, January 15th, 2017
+
+ Copyright (C) 1995-2017 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files http://tools.ietf.org/html/rfc1950
+ (zlib format), rfc1951 (deflate format) and rfc1952 (gzip format).
+*/
+
+#ifndef ZLIB_H
+#define ZLIB_H
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.11"
+#define ZLIB_VERNUM 0x12b0
+#define ZLIB_VER_MAJOR 1
+#define ZLIB_VER_MINOR 2
+#define ZLIB_VER_REVISION 11
+#define ZLIB_VER_SUBREVISION 0
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed data.
+ This version of the library supports only one compression method (deflation)
+ but other algorithms will be added later and will have the same stream
+ interface.
+
+ Compression can be done in a single step if the buffers are large enough,
+ or can be done by repeated calls of the compression function. In the latter
+ case, the application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The compressed data format used by default by the in-memory functions is
+ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+ around a deflate stream, which is itself documented in RFC 1951.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio using the functions that start
+ with "gz". The gzip format is different from the zlib format. gzip is a
+ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+ This library can optionally read and write gzip and raw deflate streams in
+ memory as well.
+
+ The zlib format was designed to be compact and fast for use in memory
+ and on communications channels. The gzip format was designed for single-
+ file compression on file systems, has a larger header than zlib to maintain
+ directory information, and uses a different, slower check method than zlib.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never crash
+ even in the case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ z_const Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total number of input bytes read so far */
+
+ Bytef *next_out; /* next output byte will go here */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total number of bytes output so far */
+
+ z_const char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: binary or text
+ for deflate, or the decoding state for inflate */
+ uLong adler; /* Adler-32 or CRC-32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ gzip header information passed to and from zlib routines. See RFC 1952
+ for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+ int text; /* true if compressed data believed to be text */
+ uLong time; /* modification time */
+ int xflags; /* extra flags (not used when writing a gzip file) */
+ int os; /* operating system */
+ Bytef *extra; /* pointer to extra field or Z_NULL if none */
+ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
+ uInt extra_max; /* space at extra (only when reading header) */
+ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
+ uInt name_max; /* space at name (only when reading header) */
+ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
+ uInt comm_max; /* space at comment (only when reading header) */
+ int hcrc; /* true if there was or will be a header crc */
+ int done; /* true when done reading gzip header (not used
+ when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+ The application must update next_in and avail_in when avail_in has dropped
+ to zero. It must update next_out and avail_out when avail_out has dropped
+ to zero. The application must initialize zalloc, zfree and opaque before
+ calling the init function. All other fields are set by the compression
+ library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe. In that case, zlib is thread-safe. When zalloc and zfree are
+ Z_NULL on entry to the initialization function, they are set to internal
+ routines that use the standard library functions malloc() and free().
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this if
+ the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS, pointers
+ returned by zalloc for objects of exactly 65536 bytes *must* have their
+ offset normalized to zero. The default allocation function provided by this
+ library ensures this (see zutil.c). To reduce memory requirements and avoid
+ any allocation of 64K objects, at the expense of compression ratio, compile
+ the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or progress
+ reports. After compression, total_in holds the total size of the
+ uncompressed data and may be saved for use by the decompressor (particularly
+ if the decompressor wants to decompress everything in a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+#define Z_BLOCK 5
+#define Z_TREES 6
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative values
+ * are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_RLE 3
+#define Z_FIXED 4
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_TEXT 1
+#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field for deflate() */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+
+ /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is not
+ compatible with the zlib.h header file used by the application. This check
+ is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller. If
+ zalloc and zfree are set to Z_NULL, deflateInit updates them to use default
+ allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at all
+ (the input data is simply copied a block at a time). Z_DEFAULT_COMPRESSION
+ requests a default compromise between speed and compression (currently
+ equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if level is not a valid compression level, or
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION). msg is set to null
+ if there is no error message. deflateInit does not perform any compression:
+ this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Generate more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary. Some output may be provided even if
+ flush is zero.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating avail_in or avail_out accordingly; avail_out should
+ never be zero before the call. The application can consume the compressed
+ output when it wants, for example when the output buffer is full (avail_out
+ == 0), or after each call of deflate(). If deflate returns Z_OK and with
+ zero avail_out, it must be called again after making room in the output
+ buffer because there might be more output pending. See deflatePending(),
+ which can be used if desired to determine whether or not there is more ouput
+ in that case.
+
+ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+ decide how much data to accumulate before producing output, in order to
+ maximize compression.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In
+ particular avail_in is zero after the call if enough output space has been
+ provided before the call.) Flushing may degrade compression for some
+ compression algorithms and so it should be used only when necessary. This
+ completes the current deflate block and follows it with an empty stored block
+ that is three bits plus filler bits to the next byte, followed by four bytes
+ (00 00 ff ff).
+
+ If flush is set to Z_PARTIAL_FLUSH, all pending output is flushed to the
+ output buffer, but the output is not aligned to a byte boundary. All of the
+ input data so far will be available to the decompressor, as for Z_SYNC_FLUSH.
+ This completes the current deflate block and follows it with an empty fixed
+ codes block that is 10 bits long. This assures that enough bytes are output
+ in order for the decompressor to finish the block before the empty fixed
+ codes block.
+
+ If flush is set to Z_BLOCK, a deflate block is completed and emitted, as
+ for Z_SYNC_FLUSH, but the output is not aligned on a byte boundary, and up to
+ seven bits of the current block are held to be written as the next byte after
+ the next deflate block is completed. In this case, the decompressor may not
+ be provided enough bits at this point in order to complete decompression of
+ the data provided so far to the compressor. It may need to wait for the next
+ block to be emitted. This is for advanced applications that need to control
+ the emission of deflate blocks.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out is greater than six to avoid repeated flush markers due to
+ avail_out == 0 on return.
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there was
+ enough output space. If deflate returns with Z_OK or Z_BUF_ERROR, this
+ function must be called again with Z_FINISH and more output space (updated
+ avail_out) but no more input data, until it returns with Z_STREAM_END or an
+ error. After deflate has returned Z_STREAM_END, the only possible operations
+ on the stream are deflateReset or deflateEnd.
+
+ Z_FINISH can be used in the first deflate call after deflateInit if all the
+ compression is to be done in a single step. In order to complete in one
+ call, avail_out must be at least the value returned by deflateBound (see
+ below). Then deflate is guaranteed to return Z_STREAM_END. If not enough
+ output space is provided, deflate will not return Z_STREAM_END, and it must
+ be called again as described above.
+
+ deflate() sets strm->adler to the Adler-32 checksum of all input read
+ so far (that is, total_in bytes). If a gzip stream is being generated, then
+ strm->adler will be the CRC-32 checksum of the input read so far. (See
+ deflateInit2 below.)
+
+ deflate() may update strm->data_type if it can make a good guess about
+ the input data type (Z_BINARY or Z_TEXT). If in doubt, the data is
+ considered binary. This field is only for information purposes and does not
+ affect the compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was Z_NULL or the state was inadvertently written over
+ by the application), or Z_BUF_ERROR if no progress is possible (for example
+ avail_in or avail_out was zero). Note that Z_BUF_ERROR is not fatal, and
+ deflate() can be called again with more input and more output space to
+ continue compressing.
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any pending
+ output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case, msg
+ may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. In the current version of inflate, the provided input is not
+ read or consumed. The allocation of a sliding window will be deferred to
+ the first call of inflate (if the decompression does not complete on the
+ first call). If zalloc and zfree are set to Z_NULL, inflateInit updates
+ them to use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit does not perform any decompression.
+ Actual decompression will be done by inflate(). So next_in, and avail_in,
+ next_out, and avail_out are unused and unchanged. The current
+ implementation of inflateInit() does not process any header information --
+ that is deferred until inflate() is called.
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), then next_in and avail_in are updated
+ accordingly, and processing will resume at this point for the next call of
+ inflate().
+
+ - Generate more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there is
+ no more input data or no more space in the output buffer (see below about
+ the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming more
+ output, and updating the next_* and avail_* values accordingly. If the
+ caller of inflate() does not provide both available input and available
+ output space, it is possible that there will be no progress made. The
+ application can consume the uncompressed output when it wants, for example
+ when the output buffer is full (avail_out == 0), or after each call of
+ inflate(). If inflate returns Z_OK and with zero avail_out, it must be
+ called again after making room in the output buffer because there might be
+ more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH, Z_FINISH,
+ Z_BLOCK, or Z_TREES. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate()
+ stop if and when it gets to the next deflate block boundary. When decoding
+ the zlib or gzip format, this will cause inflate() to return immediately
+ after the header and before the first block. When doing a raw inflate,
+ inflate() will go ahead and process the first block, and will return when it
+ gets to the end of that block, or when it runs out of data.
+
+ The Z_BLOCK option assists in appending to or combining deflate streams.
+ To assist in this, on return inflate() always sets strm->data_type to the
+ number of unused bits in the last byte taken from strm->next_in, plus 64 if
+ inflate() is currently decoding the last block in the deflate stream, plus
+ 128 if inflate() returned immediately after decoding an end-of-block code or
+ decoding the complete header up to just before the first byte of the deflate
+ stream. The end-of-block will not be indicated until all of the uncompressed
+ data from that block has been written to strm->next_out. The number of
+ unused bits may in general be greater than seven, except when bit 7 of
+ data_type is set, in which case the number of unused bits will be less than
+ eight. data_type is set as noted here every time inflate() returns for all
+ flush options, and so can be used to determine the amount of currently
+ consumed input in bits.
+
+ The Z_TREES option behaves as Z_BLOCK does, but it also returns when the
+ end of each deflate block header is reached, before any actual data in that
+ block is decoded. This allows the caller to determine the length of the
+ deflate block header for later use in random access within a deflate block.
+ 256 is added to the value of strm->data_type when inflate() returns
+ immediately after reaching the end of the deflate block header.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step (a
+ single call of inflate), the parameter flush should be set to Z_FINISH. In
+ this case all pending input is processed and all pending output is flushed;
+ avail_out must be large enough to hold all of the uncompressed data for the
+ operation to complete. (The size of the uncompressed data may have been
+ saved by the compressor for this purpose.) The use of Z_FINISH is not
+ required to perform an inflation in one step. However it may be used to
+ inform inflate that a faster approach can be used for the single inflate()
+ call. Z_FINISH also informs inflate to not maintain a sliding window if the
+ stream completes, which reduces inflate's memory footprint. If the stream
+ does not complete, either because not all of the stream is provided or not
+ enough output space is provided, then a sliding window will be allocated and
+ inflate() can be called again to continue the operation as if Z_NO_FLUSH had
+ been used.
+
+ In this implementation, inflate() always flushes as much output as
+ possible to the output buffer, and always uses the faster approach on the
+ first call. So the effects of the flush parameter in this implementation are
+ on the return value of inflate() as noted below, when inflate() returns early
+ when Z_BLOCK or Z_TREES is used, and when inflate() avoids the allocation of
+ memory for a sliding window when Z_FINISH is used.
+
+ If a preset dictionary is needed after this call (see inflateSetDictionary
+ below), inflate sets strm->adler to the Adler-32 checksum of the dictionary
+ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+ strm->adler to the Adler-32 checksum of all output produced so far (that is,
+ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+ below. At the end of the stream, inflate() checks that its computed Adler-32
+ checksum is equal to that saved by the compressor and returns Z_STREAM_END
+ only if the checksum is correct.
+
+ inflate() can decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically, if requested when
+ initializing with inflateInit2(). Any information contained in the gzip
+ header is not retained unless inflateGetHeader() is used. When processing
+ gzip-wrapped deflate data, strm->adler32 is set to the CRC-32 of the output
+ produced so far. The CRC-32 is checked against the gzip trailer, as is the
+ uncompressed length, modulo 2^32.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect check
+ value, in which case strm->msg points to a string with a more specific
+ error), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ next_in or next_out was Z_NULL, or the state was inadvertently written over
+ by the application), Z_MEM_ERROR if there was not enough memory, Z_BUF_ERROR
+ if no progress was possible or if there was not enough room in the output
+ buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ inflate() can be called again with more input and more output space to
+ continue decompressing. If Z_DATA_ERROR is returned, the application may
+ then call inflateSync() to look for a good compression block if a partial
+ recovery of the data is to be attempted.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any pending
+ output.
+
+ inflateEnd returns Z_OK if success, or Z_STREAM_ERROR if the stream state
+ was inconsistent.
+*/
+
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by the
+ caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ For the current implementation of deflate(), a windowBits value of 8 (a
+ window size of 256 bytes) is not supported. As a result, a request for 8
+ will result in 9 (a 512-byte window). In that case, providing 8 to
+ inflateInit2() will result in an error when the zlib header with 9 is
+ checked against the initialization of inflate(). The remedy is to not use 8
+ with deflateInit2() with this initialization, or at least in that case use 9
+ with inflateInit2().
+
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
+ with no zlib header or trailer, and will not compute a check value.
+
+ windowBits can also be greater than 15 for optional gzip encoding. Add
+ 16 to windowBits to write a simple gzip header and trailer around the
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero), no
+ header crc, and the operating system will be set to the appropriate value,
+ if the operating system was determined at compile time. If a gzip stream is
+ being written, strm->adler is a CRC-32 instead of an Adler-32.
+
+ For raw deflate or gzip encoding, a request for a 256-byte window is
+ rejected as invalid, since only the zlib header provides a means of
+ transmitting the window size to the decompressor.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but is
+ slow and reduces compression ratio; memLevel=9 uses maximum memory for
+ optimal speed. The default value is 8. See zconf.h for total memory usage
+ as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match), or Z_RLE to limit match distances to one (run-length
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
+ coding and less string matching; it is somewhat intermediate between
+ Z_DEFAULT_STRATEGY and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as
+ fast as Z_HUFFMAN_ONLY, but give better compression for PNG image data. The
+ strategy parameter only affects the compression ratio but not the
+ correctness of the compressed output even if it is not set appropriately.
+ Z_FIXED prevents the use of dynamic Huffman codes, allowing for a simpler
+ decoder for special applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if any parameter is invalid (such as an invalid
+ method), or Z_VERSION_ERROR if the zlib library version (zlib_version) is
+ incompatible with the version assumed by the caller (ZLIB_VERSION). msg is
+ set to null if there is no error message. deflateInit2 does not perform any
+ compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. When using the zlib format, this
+ function must be called immediately after deflateInit, deflateInit2 or
+ deflateReset, and before any call of deflate. When doing raw deflate, this
+ function must be called either before any call of deflate, or immediately
+ after the completion of a deflate block, i.e. after all input has been
+ consumed and all output has been delivered when using any of the flush
+ options Z_BLOCK, Z_PARTIAL_FLUSH, Z_SYNC_FLUSH, or Z_FULL_FLUSH. The
+ compressor and decompressor must use exactly the same dictionary (see
+ inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size
+ provided in deflateInit or deflateInit2. Thus the strings most likely to be
+ useful should be put at the end of the dictionary, not at the front. In
+ addition, the current implementation of deflate will use at most the window
+ size minus 262 bytes of the provided dictionary.
+
+ Upon return of this function, strm->adler is set to the Adler-32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The Adler-32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.) If a raw deflate was requested, then the
+ Adler-32 value is not computed and strm->adler is not set.
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if not at a block boundary for raw deflate). deflateSetDictionary does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateGetDictionary OF((z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength));
+/*
+ Returns the sliding dictionary being maintained by deflate. dictLength is
+ set to the number of bytes in the dictionary, and that many bytes are copied
+ to dictionary. dictionary must have enough space, where 32768 bytes is
+ always enough. If deflateGetDictionary() is called with dictionary equal to
+ Z_NULL, then only the dictionary length is returned, and nothing is copied.
+ Similary, if dictLength is Z_NULL, then it is not set.
+
+ deflateGetDictionary() may return a length less than the window size, even
+ when more than the window size in input has been provided. It may return up
+ to 258 bytes less in that case, due to how zlib's implementation of deflate
+ manages the sliding window and lookahead for matches, where matches can be
+ up to 258 bytes long. If the application needs the last window-size bytes of
+ input, then that would need to be saved by the application outside of zlib.
+
+ deflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+ stream state is inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and can
+ consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit, but
+ does not free and reallocate the internal compression state. The stream
+ will leave the compression level and any other attributes that may have been
+ set unchanged.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2(). This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different strategy.
+ If the compression approach (which is a function of the level) or the
+ strategy is changed, and if any input has been consumed in a previous
+ deflate() call, then the input available so far is compressed with the old
+ level and strategy using deflate(strm, Z_BLOCK). There are three approaches
+ for the compression levels 0, 1..3, and 4..9 respectively. The new level
+ and strategy will take effect at the next call of deflate().
+
+ If a deflate(strm, Z_BLOCK) is performed by deflateParams(), and it does
+ not have enough output space to complete, then the parameter change will not
+ take effect. In this case, deflateParams() can be called again with the
+ same parameters and more output space to try again.
+
+ In order to assure a change in the parameters on the first try, the
+ deflate stream should be flushed using deflate() with Z_BLOCK or other flush
+ request until strm.avail_out is not zero, before calling deflateParams().
+ Then no more input data should be provided before the deflateParams() call.
+ If this is done, the old level and strategy will be applied to the data
+ compressed before deflateParams(), and the new level and strategy will be
+ applied to the the data compressed after deflateParams().
+
+ deflateParams returns Z_OK on success, Z_STREAM_ERROR if the source stream
+ state was inconsistent or if a parameter was invalid, or Z_BUF_ERROR if
+ there was not enough output space to complete the compression of the
+ available input data before a change in the strategy or approach. Note that
+ in the case of a Z_BUF_ERROR, the parameters are not changed. A return
+ value of Z_BUF_ERROR is not fatal, in which case deflateParams() can be
+ retried with more output space.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain));
+/*
+ Fine tune deflate's internal compression parameters. This should only be
+ used by someone who understands the algorithm used by zlib's deflate for
+ searching for the best matching string, and even then only by the most
+ fanatic optimizer trying to squeeze out the last compressed bit for their
+ specific input data. Read the deflate.c source code for the meaning of the
+ max_lazy, good_length, nice_length, and max_chain parameters.
+
+ deflateTune() can be called after deflateInit() or deflateInit2(), and
+ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+ uLong sourceLen));
+/*
+ deflateBound() returns an upper bound on the compressed size after
+ deflation of sourceLen bytes. It must be called after deflateInit() or
+ deflateInit2(), and after deflateSetHeader(), if used. This would be used
+ to allocate an output buffer for deflation in a single pass, and so would be
+ called before deflate(). If that first deflate() call is provided the
+ sourceLen input bytes, an output buffer allocated to the size returned by
+ deflateBound(), and the flush value Z_FINISH, then deflate() is guaranteed
+ to return Z_STREAM_END. Note that it is possible for the compressed size to
+ be larger than the value returned by deflateBound() if flush options other
+ than Z_FINISH or Z_NO_FLUSH are used.
+*/
+
+ZEXTERN int ZEXPORT deflatePending OF((z_streamp strm,
+ unsigned *pending,
+ int *bits));
+/*
+ deflatePending() returns the number of bytes and bits of output that have
+ been generated, but not yet provided in the available output. The bytes not
+ provided would be due to the available output space having being consumed.
+ The number of bits of output not provided are between 0 and 7, where they
+ await more bits to join them in order to fill out a full byte. If pending
+ or bits are Z_NULL, then those values are not set.
+
+ deflatePending returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+ */
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ deflatePrime() inserts bits in the deflate output stream. The intent
+ is that this function is used to start off the deflate output with the bits
+ leftover from a previous deflate stream when appending to it. As such, this
+ function can only be used for raw deflate, and must be used before the first
+ deflate() call after a deflateInit2() or deflateReset(). bits must be less
+ than or equal to 16, and that many of the least significant bits of value
+ will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, Z_BUF_ERROR if there was not enough
+ room in the internal buffer to insert the bits, or Z_STREAM_ERROR if the
+ source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ deflateSetHeader() provides gzip header information for when a gzip
+ stream is requested by deflateInit2(). deflateSetHeader() may be called
+ after deflateInit2() or deflateReset() and before the first call of
+ deflate(). The text, time, os, extra field, name, and comment information
+ in the provided gz_header structure are written to the gzip header (xflag is
+ ignored -- the extra flags are set according to the compression level). The
+ caller must assure that, if not Z_NULL, name and comment are terminated with
+ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+ available there. If hcrc is true, a gzip header crc is included. Note that
+ the current versions of the command-line version of gzip (up through version
+ 1.3.x) do not support header crc's, and will report that it is a "multi-part
+ gzip file" and give up.
+
+ If deflateSetHeader is not used, the default gzip header has text false,
+ the time set to zero, and os set to 255, with no extra, name, or comment
+ fields. The gzip header is returned to the default state by deflateReset().
+
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
+ provided to deflateInit2() while compressing, or it must be equal to 15 if
+ deflateInit2() was not used. If a compressed stream with a larger window
+ size is given as input, inflate() will return with the error code
+ Z_DATA_ERROR instead of trying to allocate a larger window.
+
+ windowBits can also be zero to request that inflate use the window size in
+ the zlib header of the compressed stream.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
+ not looking for a zlib or gzip header, not generating a check value, and not
+ looking for any check values for comparison at the end of the stream. This
+ is for use with other formats that use the deflate compressed data format
+ such as zip. Those formats provide their own check values. If a custom
+ format is developed using the raw deflate format for compressed data, it is
+ recommended that a check value such as an Adler-32 or a CRC-32 be applied to
+ the uncompressed data as is done in the zlib, gzip, and zip formats. For
+ most applications, the zlib format should be used as is. Note that comments
+ above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+ windowBits can also be greater than 15 for optional gzip decoding. Add
+ 32 to windowBits to enable zlib and gzip decoding with automatic header
+ detection, or add 16 to decode only the gzip format (the zlib format will
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is a
+ CRC-32 instead of an Adler-32. Unlike the gunzip utility and gzread() (see
+ below), inflate() will not automatically decode concatenated gzip streams.
+ inflate() will return Z_STREAM_END at the end of the gzip stream. The state
+ would need to be reset to continue decoding a subsequent gzip stream.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller, or Z_STREAM_ERROR if the parameters are
+ invalid, such as a null pointer to the structure. msg is set to null if
+ there is no error message. inflateInit2 does not perform any decompression
+ apart from possibly reading the zlib header if present: actual decompression
+ will be done by inflate(). (So next_in and avail_in may be modified, but
+ next_out and avail_out are unused and unchanged.) The current implementation
+ of inflateInit2() does not process any header information -- that is
+ deferred until inflate() is called.
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the Adler-32 value returned by that call of inflate.
+ The compressor and decompressor must use exactly the same dictionary (see
+ deflateSetDictionary). For raw inflate, this function can be called at any
+ time to set the dictionary. If the provided dictionary is smaller than the
+ window and there is already data in the window, then the provided dictionary
+ will amend what's there. The application must insure that the dictionary
+ that was used for compression is provided.
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (e.g. dictionary being Z_NULL) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect Adler-32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateGetDictionary OF((z_streamp strm,
+ Bytef *dictionary,
+ uInt *dictLength));
+/*
+ Returns the sliding dictionary being maintained by inflate. dictLength is
+ set to the number of bytes in the dictionary, and that many bytes are copied
+ to dictionary. dictionary must have enough space, where 32768 bytes is
+ always enough. If inflateGetDictionary() is called with dictionary equal to
+ Z_NULL, then only the dictionary length is returned, and nothing is copied.
+ Similary, if dictLength is Z_NULL, then it is not set.
+
+ inflateGetDictionary returns Z_OK on success, or Z_STREAM_ERROR if the
+ stream state is inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a possible full flush point (see above
+ for the description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync searches for a 00 00 FF FF pattern in the compressed data.
+ All full flush points have this pattern, but not all occurrences of this
+ pattern are full flush points.
+
+ inflateSync returns Z_OK if a possible full flush point has been found,
+ Z_BUF_ERROR if no more input was provided, Z_DATA_ERROR if no flush point
+ has been found, or Z_STREAM_ERROR if the stream structure was inconsistent.
+ In the success case, the application may save the current current value of
+ total_in which indicates where valid compressed data was found. In the
+ error case, the application may repeatedly call inflateSync, providing more
+ input each time, until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when randomly accessing a large stream. The
+ first pass through the stream can periodically record the inflate state,
+ allowing restarting inflate at those points when randomly accessing the
+ stream.
+
+ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being Z_NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate the internal decompression state. The
+ stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL).
+*/
+
+ZEXTERN int ZEXPORT inflateReset2 OF((z_streamp strm,
+ int windowBits));
+/*
+ This function is the same as inflateReset, but it also permits changing
+ the wrap and window size requests. The windowBits parameter is interpreted
+ the same as it is for inflateInit2. If the window size is changed, then the
+ memory allocated for the window is freed, and the window will be reallocated
+ by inflate() if needed.
+
+ inflateReset2 returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being Z_NULL), or if
+ the windowBits parameter is invalid.
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ This function inserts bits in the inflate input stream. The intent is
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ If bits is negative, then the input stream bit buffer is emptied. Then
+ inflatePrime() can be called again to put bits in the buffer. This is used
+ to clear out bits leftover after feeding inflate a block description prior
+ to feeding inflate codes.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN long ZEXPORT inflateMark OF((z_streamp strm));
+/*
+ This function returns two values, one in the lower 16 bits of the return
+ value, and the other in the remaining upper bits, obtained by shifting the
+ return value down 16 bits. If the upper value is -1 and the lower value is
+ zero, then inflate() is currently decoding information outside of a block.
+ If the upper value is -1 and the lower value is non-zero, then inflate is in
+ the middle of a stored block, with the lower value equaling the number of
+ bytes from the input remaining to copy. If the upper value is not -1, then
+ it is the number of bits back from the current bit position in the input of
+ the code (literal or length/distance pair) currently being processed. In
+ that case the lower value is the number of bytes already emitted for that
+ code.
+
+ A code is being processed if inflate is waiting for more input to complete
+ decoding of the code, or if it has completed decoding but is waiting for
+ more output space to write the literal or match data.
+
+ inflateMark() is used to mark locations in the input data for random
+ access, which may be at bit positions, and to note those cases where the
+ output of a code may span boundaries of random access blocks. The current
+ location in the input stream can be determined from avail_in and data_type
+ as noted in the description for the Z_BLOCK flush parameter for inflate.
+
+ inflateMark returns the value noted above, or -65536 if the provided
+ source stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ inflateGetHeader() requests that gzip header information be stored in the
+ provided gz_header structure. inflateGetHeader() may be called after
+ inflateInit2() or inflateReset(), and before the first call of inflate().
+ As inflate() processes the gzip stream, head->done is zero until the header
+ is completed, at which time head->done is set to one. If a zlib stream is
+ being decoded, then head->done is set to -1 to indicate that there will be
+ no gzip header information forthcoming. Note that Z_BLOCK or Z_TREES can be
+ used to force inflate() to return immediately after header processing is
+ complete and before any actual data is decompressed.
+
+ The text, time, xflags, and os fields are filled in with the gzip header
+ contents. hcrc is set to true if there is a header CRC. (The header CRC
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ contains the maximum number of bytes to write to extra. Once done is true,
+ extra_len contains the actual extra field length, and extra contains the
+ extra field, or that field truncated if extra_max is less than extra_len.
+ If name is not Z_NULL, then up to name_max characters are written there,
+ terminated with a zero unless the length is greater than name_max. If
+ comment is not Z_NULL, then up to comm_max characters are written there,
+ terminated with a zero unless the length is greater than comm_max. When any
+ of extra, name, or comment are not Z_NULL and the respective field is not
+ present in the header, then that field is set to Z_NULL to signal its
+ absence. This allows the use of deflateSetHeader() with the returned
+ structure to duplicate the header. However if those fields are set to
+ allocated memory, then the application will need to save those pointers
+ elsewhere so that they can be eventually freed.
+
+ If inflateGetHeader is not used, then the header information is simply
+ discarded. The header is always checked for validity, including the header
+ CRC if present. inflateReset() will reset the process to discard the header
+ information. The application would need to call inflateGetHeader() again to
+ retrieve the header from the next gzip stream.
+
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window));
+
+ Initialize the internal stream state for decompression using inflateBack()
+ calls. The fields zalloc, zfree and opaque in strm must be initialized
+ before the call. If zalloc and zfree are Z_NULL, then the default library-
+ derived memory allocation routines are used. windowBits is the base two
+ logarithm of the window size, in the range 8..15. window is a caller
+ supplied buffer of that size. Except for special applications where it is
+ assured that deflate was used with small window sizes, windowBits must be 15
+ and a 32K byte window must be supplied to be able to decompress general
+ deflate streams.
+
+ See inflateBack() for the usage of these routines.
+
+ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+ the parameters are invalid, Z_MEM_ERROR if the internal state could not be
+ allocated, or Z_VERSION_ERROR if the version of the library does not match
+ the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *,
+ z_const unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+/*
+ inflateBack() does a raw inflate with a single call using a call-back
+ interface for input and output. This is potentially more efficient than
+ inflate() for file i/o applications, in that it avoids copying between the
+ output and the sliding window by simply making the window itself the output
+ buffer. inflate() can be faster on modern CPUs when used with large
+ buffers. inflateBack() trusts the application to not change the output
+ buffer passed by the output function, at least until inflateBack() returns.
+
+ inflateBackInit() must be called first to allocate the internal state
+ and to initialize the state with the user-provided window buffer.
+ inflateBack() may then be used multiple times to inflate a complete, raw
+ deflate stream with each call. inflateBackEnd() is then called to free the
+ allocated state.
+
+ A raw deflate stream is one with no zlib or gzip header or trailer.
+ This routine would normally be used in a utility that reads zip or gzip
+ files and writes out uncompressed files. The utility would decode the
+ header and process the trailer on its own, hence this routine expects only
+ the raw deflate stream to decompress. This is different from the default
+ behavior of inflate(), which expects a zlib header and trailer around the
+ deflate stream.
+
+ inflateBack() uses two subroutines supplied by the caller that are then
+ called by inflateBack() for input and output. inflateBack() calls those
+ routines until it reads a complete deflate stream and writes out all of the
+ uncompressed data, or until it encounters an error. The function's
+ parameters and return types are defined above in the in_func and out_func
+ typedefs. inflateBack() will call in(in_desc, &buf) which should return the
+ number of bytes of provided input, and a pointer to that input in buf. If
+ there is no input available, in() must return zero -- buf is ignored in that
+ case -- and inflateBack() will return a buffer error. inflateBack() will
+ call out(out_desc, buf, len) to write the uncompressed data buf[0..len-1].
+ out() should return zero on success, or non-zero on failure. If out()
+ returns non-zero, inflateBack() will return with an error. Neither in() nor
+ out() are permitted to change the contents of the window provided to
+ inflateBackInit(), which is also the buffer that out() uses to write from.
+ The length written by out() will be at most the window size. Any non-zero
+ amount of input may be provided by in().
+
+ For convenience, inflateBack() can be provided input on the first call by
+ setting strm->next_in and strm->avail_in. If that input is exhausted, then
+ in() will be called. Therefore strm->next_in must be initialized before
+ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
+ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
+ must also be initialized, and then if strm->avail_in is not zero, input will
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+ The in_desc and out_desc parameters of inflateBack() is passed as the
+ first parameter of in() and out() respectively when they are called. These
+ descriptors can be optionally used to pass any information that the caller-
+ supplied in() and out() functions need to do their job.
+
+ On return, inflateBack() will set strm->next_in and strm->avail_in to
+ pass back any unused input that was provided by the last in() call. The
+ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format error
+ in the deflate stream (in which case strm->msg is set to indicate the nature
+ of the error), or Z_STREAM_ERROR if the stream was not properly initialized.
+ In the case of Z_BUF_ERROR, an input or output error can be distinguished
+ using strm->next_in which will be Z_NULL only if in() returned an error. If
+ strm->next_in is not Z_NULL, then the Z_BUF_ERROR was due to out() returning
+ non-zero. (in() will always be called before out(), so strm->next_in is
+ assured to be defined if out() returns non-zero.) Note that inflateBack()
+ cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+ All memory allocated by inflateBackInit() is freed.
+
+ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+ state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+ 1.0: size of uInt
+ 3.2: size of uLong
+ 5.4: size of voidpf (pointer)
+ 7.6: size of z_off_t
+
+ Compiler, assembler, and debug options:
+ 8: ZLIB_DEBUG
+ 9: ASMV or ASMINF -- use ASM code
+ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+ 11: 0 (reserved)
+
+ One-time table building (smaller code, but not thread-safe if true):
+ 12: BUILDFIXED -- build static block decoding tables when needed
+ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+ 14,15: 0 (reserved)
+
+ Library content (indicates missing functionality):
+ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+ deflate code when not needed)
+ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+ and decode gzip streams (to avoid linking crc code)
+ 18-19: 0 (reserved)
+
+ Operation variations (changes in library functionality):
+ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+ 21: FASTEST -- deflate algorithm with only one, lowest compression level
+ 22,23: 0 (reserved)
+
+ The sprintf variant used by gzprintf (zero is best):
+ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+ Remainder:
+ 27-31: 0 (reserved)
+ */
+
+#ifndef Z_SOLO
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the basic
+ stream-oriented functions. To simplify the interface, some default options
+ are assumed (compression level and memory usage, standard memory allocation
+ functions). The source code of these utility functions can be modified if
+ you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed data. compress() is equivalent to compress2() with a level
+ parameter of Z_DEFAULT_COMPRESSION.
+
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed data.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+ compressBound() returns an upper bound on the compressed size after
+ compress() or compress2() on sourceLen bytes. It would be used before a
+ compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total size
+ of the destination buffer, which must be large enough to hold the entire
+ uncompressed data. (The size of the uncompressed data must have been saved
+ previously by the compressor and transmitted to the decompressor by some
+ mechanism outside the scope of this compression library.) Upon exit, destLen
+ is the actual size of the uncompressed data.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete. In
+ the case where there is not enough room, uncompress() will fill the output
+ buffer with the uncompressed data up to that point.
+*/
+
+ZEXTERN int ZEXPORT uncompress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong *sourceLen));
+/*
+ Same as uncompress, except that sourceLen is a pointer, where the
+ length of the source is *sourceLen. On return, *sourceLen is the number of
+ source bytes consumed.
+*/
+
+ /* gzip file access functions */
+
+/*
+ This library supports reading and writing files in gzip (.gz) format with
+ an interface similar to that of stdio, using the functions that start with
+ "gz". The gzip format is different from the zlib format. gzip is a gzip
+ wrapper, documented in RFC 1952, wrapped around a deflate stream.
+*/
+
+typedef struct gzFile_s *gzFile; /* semi-opaque gzip file descriptor */
+
+/*
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+
+ Opens a gzip (.gz) file for reading or writing. The mode parameter is as
+ in fopen ("rb" or "wb") but can also include a compression level ("wb9") or
+ a strategy: 'f' for filtered data as in "wb6f", 'h' for Huffman-only
+ compression as in "wb1h", 'R' for run-length encoding as in "wb1R", or 'F'
+ for fixed code compression as in "wb9F". (See the description of
+ deflateInit2 for more information about the strategy parameter.) 'T' will
+ request transparent writing or appending with no compression and not using
+ the gzip format.
+
+ "a" can be used instead of "w" to request that the gzip stream that will
+ be written be appended to the file. "+" will result in an error, since
+ reading and writing to the same gzip file is not supported. The addition of
+ "x" when writing will create the file exclusively, which fails if the file
+ already exists. On systems that support it, the addition of "e" when
+ reading or writing will set the flag to close the file on an execve() call.
+
+ These functions, as well as gzip, will read and decode a sequence of gzip
+ streams in a file. The append function of gzopen() can be used to create
+ such a file. (Also see gzflush() for another way to do this.) When
+ appending, gzopen does not test whether the file begins with a gzip stream,
+ nor does it look for the end of the gzip streams to begin appending. gzopen
+ will simply append a gzip stream to the existing file.
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression. When
+ reading, this will be detected automatically by looking for the magic two-
+ byte gzip header.
+
+ gzopen returns NULL if the file could not be opened, if there was
+ insufficient memory to allocate the gzFile state, or if an invalid mode was
+ specified (an 'r', 'w', or 'a' was not provided, or '+' was provided).
+ errno can be checked to determine if the reason gzopen failed was that the
+ file could not be opened.
+*/
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen associates a gzFile with the file descriptor fd. File descriptors
+ are obtained from calls like open, dup, creat, pipe or fileno (if the file
+ has been previously opened with fopen). The mode parameter is as in gzopen.
+
+ The next call of gzclose on the returned gzFile will also close the file
+ descriptor fd, just like fclose(fdopen(fd, mode)) closes the file descriptor
+ fd. If you want to keep fd open, use fd = dup(fd_keep); gz = gzdopen(fd,
+ mode);. The duplicated descriptor should be saved to avoid a leak, since
+ gzdopen does not close fd if it fails. If you are using fileno() to get the
+ file descriptor from a FILE *, then you will have to use dup() to avoid
+ double-close()ing the file descriptor. Both gzclose() and fclose() will
+ close the associated file descriptor, so they need to have different file
+ descriptors.
+
+ gzdopen returns NULL if there was insufficient memory to allocate the
+ gzFile state, if an invalid mode was specified (an 'r', 'w', or 'a' was not
+ provided, or '+' was provided), or if fd is -1. The file descriptor is not
+ used until the next gz* read, write, seek, or close operation, so gzdopen
+ will not detect if fd is invalid (unless fd is -1).
+*/
+
+ZEXTERN int ZEXPORT gzbuffer OF((gzFile file, unsigned size));
+/*
+ Set the internal buffer size used by this library's functions. The
+ default buffer size is 8192 bytes. This function must be called after
+ gzopen() or gzdopen(), and before any other calls that read or write the
+ file. The buffer memory allocation is always deferred to the first read or
+ write. Three times that size in buffer space is allocated. A larger buffer
+ size of, for example, 64K or 128K bytes will noticeably increase the speed
+ of decompression (reading).
+
+ The new buffer size also affects the maximum length for gzprintf().
+
+ gzbuffer() returns 0 on success, or -1 on failure, such as being called
+ too late.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters. Previously provided
+ data is flushed before the parameter change.
+
+ gzsetparams returns Z_OK if success, Z_STREAM_ERROR if the file was not
+ opened for writing, Z_ERRNO if there is an error writing the flushed data,
+ or Z_MEM_ERROR if there is a memory allocation error.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file. If
+ the input file is not in gzip format, gzread copies the given number of
+ bytes into the buffer directly from the file.
+
+ After reaching the end of a gzip stream in the input, gzread will continue
+ to read, looking for another gzip stream. Any number of gzip streams may be
+ concatenated in the input file, and will all be decompressed by gzread().
+ If something other than a gzip stream is encountered after a gzip stream,
+ that remaining trailing garbage is ignored (and no error is returned).
+
+ gzread can be used to read a gzip file that is being concurrently written.
+ Upon reaching the end of the input, gzread will return with the available
+ data. If the error code returned by gzerror is Z_OK or Z_BUF_ERROR, then
+ gzclearerr can be used to clear the end of file indicator in order to permit
+ gzread to be tried again. Z_OK indicates that a gzip stream was completed
+ on the last gzread. Z_BUF_ERROR indicates that the input file ended in the
+ middle of a gzip stream. Note that gzread does not return -1 in the event
+ of an incomplete gzip stream. This error is deferred until gzclose(), which
+ will return Z_BUF_ERROR if the last gzread ended in the middle of a gzip
+ stream. Alternatively, gzerror can be used before gzclose to detect this
+ case.
+
+ gzread returns the number of uncompressed bytes actually read, less than
+ len for end of file, or -1 for error. If len is too large to fit in an int,
+ then nothing is read, -1 is returned, and the error state is set to
+ Z_STREAM_ERROR.
+*/
+
+ZEXTERN z_size_t ZEXPORT gzfread OF((voidp buf, z_size_t size, z_size_t nitems,
+ gzFile file));
+/*
+ Read up to nitems items of size size from file to buf, otherwise operating
+ as gzread() does. This duplicates the interface of stdio's fread(), with
+ size_t request and return types. If the library defines size_t, then
+ z_size_t is identical to size_t. If not, then z_size_t is an unsigned
+ integer type that can contain a pointer.
+
+ gzfread() returns the number of full items read of size size, or zero if
+ the end of the file was reached and a full item could not be read, or if
+ there was an error. gzerror() must be consulted if zero is returned in
+ order to determine if there was an error. If the multiplication of size and
+ nitems overflows, i.e. the product does not fit in a z_size_t, then nothing
+ is read, zero is returned, and the error state is set to Z_STREAM_ERROR.
+
+ In the event that the end of file is reached and only a partial item is
+ available at the end, i.e. the remaining uncompressed data length is not a
+ multiple of size, then the final partial item is nevetheless read into buf
+ and the end-of-file flag is set. The length of the partial item read is not
+ provided, but could be inferred from the result of gztell(). This behavior
+ is the same as the behavior of fread() implementations in common libraries,
+ but it prevents the direct use of gzfread() to read a concurrently written
+ file, reseting and retrying on end-of-file, when size is not 1.
+*/
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes written or 0 in case of
+ error.
+*/
+
+ZEXTERN z_size_t ZEXPORT gzfwrite OF((voidpc buf, z_size_t size,
+ z_size_t nitems, gzFile file));
+/*
+ gzfwrite() writes nitems items of size size from buf to file, duplicating
+ the interface of stdio's fwrite(), with size_t request and return types. If
+ the library defines size_t, then z_size_t is identical to size_t. If not,
+ then z_size_t is an unsigned integer type that can contain a pointer.
+
+ gzfwrite() returns the number of full items written of size size, or zero
+ if there was an error. If the multiplication of size and nitems overflows,
+ i.e. the product does not fit in a z_size_t, then nothing is written, zero
+ is returned, and the error state is set to Z_STREAM_ERROR.
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf Z_ARG((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the arguments to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written, or a negative zlib error code in case
+ of error. The number of uncompressed bytes written is limited to 8191, or
+ one less than the buffer size given to gzbuffer(). The caller should assure
+ that this limit is not exceeded. If it is exceeded, then gzprintf() will
+ return an error (0) with nothing written. In this case, there may also be a
+ buffer overflow with unpredictable consequences, which is possible only if
+ zlib was compiled with the insecure functions sprintf() or vsprintf()
+ because the secure snprintf() or vsnprintf() functions were not available.
+ This can be determined using zlibCompileFlags().
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or a
+ newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. If any characters are read or if len == 1, the
+ string is terminated with a null character. If no characters are read due
+ to an end-of-file or len < 1, then the buffer is left untouched.
+
+ gzgets returns buf which is a null-terminated string, or it returns NULL
+ for end-of-file or in case of error. If there was an error, the contents at
+ buf are indeterminate.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file. gzputc
+ returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte or -1
+ in case of end of file or error. This is implemented as a macro for speed.
+ As such, it does not do all of the checking the other functions do. I.e.
+ it does not check to see if file is NULL, nor whether the structure file
+ points to has been clobbered or not.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+ Push one character back onto the stream to be read as the first character
+ on the next read. At least one character of push-back is allowed.
+ gzungetc() returns the character pushed, or -1 on failure. gzungetc() will
+ fail if c is -1, and may fail if a character has been pushed but not read
+ yet. If gzungetc is used immediately after gzopen or gzdopen, at least the
+ output buffer size of pushed characters is allowed. (See gzbuffer above.)
+ The pushed character will be discarded if the stream is repositioned with
+ gzseek() or gzrewind().
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter flush
+ is as in the deflate() function. The return value is the zlib error number
+ (see function gzerror below). gzflush is only permitted when writing.
+
+ If the flush parameter is Z_FINISH, the remaining data is written and the
+ gzip stream is completed in the output. If gzwrite() is called again, a new
+ gzip stream will be started in the output. gzread() is able to read such
+ concatenated gzip streams.
+
+ gzflush should be called only when strictly necessary because it will
+ degrade compression if called too often.
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+
+ Sets the starting position for the next gzread or gzwrite on the given
+ compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+
+ Returns the starting position for the next gzread or gzwrite on the given
+ compressed file. This position represents a number of bytes in the
+ uncompressed data stream, and is zero when starting, even if appending or
+ reading a gzip stream from the middle of a file using gzdopen().
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+/*
+ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile file));
+
+ Returns the current offset in the file being read or written. This offset
+ includes the count of bytes that precede the gzip stream, for example when
+ appending or when using gzdopen() for reading. When reading, the offset
+ does not include as yet unused buffered input. This information can be used
+ for a progress indicator. On error, gzoffset() returns -1.
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns true (1) if the end-of-file indicator has been set while reading,
+ false (0) otherwise. Note that the end-of-file indicator is set only if the
+ read tried to go past the end of the input, but came up short. Therefore,
+ just like feof(), gzeof() may return false even if there is no more data to
+ read, in the event that the last read request was for the exact number of
+ bytes remaining in the input file. This will happen if the input file size
+ is an exact multiple of the buffer size.
+
+ If gzeof() returns true, then the read functions will return no more data,
+ unless the end-of-file indicator is reset by gzclearerr() and the input file
+ has grown since the previous end of file was detected.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+ Returns true (1) if file is being copied directly while reading, or false
+ (0) if file is a gzip stream being decompressed.
+
+ If the input file is empty, gzdirect() will return true, since the input
+ does not contain a gzip stream.
+
+ If gzdirect() is used immediately after gzopen() or gzdopen() it will
+ cause buffers to be allocated to allow reading the file to determine if it
+ is a gzip file. Therefore if gzbuffer() is used, it should be called before
+ gzdirect().
+
+ When writing, gzdirect() returns true (1) if transparent writing was
+ requested ("wT" for the gzopen() mode), or false (0) otherwise. (Note:
+ gzdirect() is not needed when writing. Transparent writing must be
+ explicitly requested, so the application already knows the answer. When
+ linking statically, using gzdirect() will include all of the zlib code for
+ gzip file reading and decompression, which may not be desired.)
+*/
+
+ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file and
+ deallocates the (de)compression state. Note that once file is closed, you
+ cannot call gzerror with file, since its structures have been deallocated.
+ gzclose must not be called more than once on the same file, just as free
+ must not be called more than once on the same allocation.
+
+ gzclose will return Z_STREAM_ERROR if file is not valid, Z_ERRNO on a
+ file operation error, Z_MEM_ERROR if out of memory, Z_BUF_ERROR if the
+ last read ended in the middle of a gzip stream, or Z_OK on success.
+*/
+
+ZEXTERN int ZEXPORT gzclose_r OF((gzFile file));
+ZEXTERN int ZEXPORT gzclose_w OF((gzFile file));
+/*
+ Same as gzclose(), but gzclose_r() is only for use when reading, and
+ gzclose_w() is only for use when writing or appending. The advantage to
+ using these instead of gzclose() is that they avoid linking in zlib
+ compression or decompression code that is not used when only reading or only
+ writing respectively. If gzclose() is used, then both compression and
+ decompression code will be included the application when linking to a static
+ zlib library.
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the given
+ compressed file. errnum is set to zlib error number. If an error occurred
+ in the file system and not in the compression library, errnum is set to
+ Z_ERRNO and the application may consult errno to get the exact error code.
+
+ The application must not modify the returned string. Future calls to
+ this function may invalidate the previously returned string. If file is
+ closed, then the string previously returned by gzerror will no longer be
+ available.
+
+ gzerror() should be used to distinguish errors from end-of-file for those
+ functions above that do not distinguish those cases in their return values.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
+ file that is being written concurrently.
+*/
+
+#endif /* !Z_SOLO */
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the compression
+ library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is Z_NULL, this function returns the
+ required initial value for the checksum.
+
+ An Adler-32 checksum is almost as reliable as a CRC-32 but can be computed
+ much faster.
+
+ Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT adler32_z OF((uLong adler, const Bytef *buf,
+ z_size_t len));
+/*
+ Same as adler32(), but with a size_t length.
+*/
+
+/*
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+ z_off_t len2));
+
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2. Note
+ that the z_off_t type (like off_t) is a signed integer. If len2 is
+ negative, the result has no meaning or utility.
+*/
+
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running CRC-32 with the bytes buf[0..len-1] and return the
+ updated CRC-32. If buf is Z_NULL, this function returns the required
+ initial value for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
+
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32_z OF((uLong adler, const Bytef *buf,
+ z_size_t len));
+/*
+ Same as crc32(), but with a size_t length.
+*/
+
+/*
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+ Combine two CRC-32 check values into one. For two sequences of bytes,
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+ len2.
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#ifdef Z_PREFIX_SET
+# define z_deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
+# define z_inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
+# define z_deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
+# define z_inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
+# define z_inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, (int)sizeof(z_stream))
+#else
+# define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, (int)sizeof(z_stream))
+# define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, (int)sizeof(z_stream))
+# define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, (int)sizeof(z_stream))
+# define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, \
+ (int)sizeof(z_stream))
+# define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, (int)sizeof(z_stream))
+#endif
+
+#ifndef Z_SOLO
+
+/* gzgetc() macro and its supporting function and exposed data structure. Note
+ * that the real internal state is much larger than the exposed structure.
+ * This abbreviated structure exposes just enough for the gzgetc() macro. The
+ * user should not mess with these exposed elements, since their names or
+ * behavior could change in the future, perhaps even capriciously. They can
+ * only be used by the gzgetc() macro. You have been warned.
+ */
+struct gzFile_s {
+ unsigned have;
+ unsigned char *next;
+ z_off64_t pos;
+};
+ZEXTERN int ZEXPORT gzgetc_ OF((gzFile file)); /* backward compatibility */
+#ifdef Z_PREFIX_SET
+# undef z_gzgetc
+# define z_gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g))
+#else
+# define gzgetc(g) \
+ ((g)->have ? ((g)->have--, (g)->pos++, *((g)->next)++) : (gzgetc)(g))
+#endif
+
+/* provide 64-bit offset functions if _LARGEFILE64_SOURCE defined, and/or
+ * change the regular functions to 64 bits if _FILE_OFFSET_BITS is 64 (if
+ * both are true, the application gets the *64 functions, and the regular
+ * functions are changed to 64 bits) -- in case these are set on systems
+ * without large file support, _LFS64_LARGEFILE must also be true
+ */
+#ifdef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off64_t ZEXPORT gzseek64 OF((gzFile, z_off64_t, int));
+ ZEXTERN z_off64_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off64_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off64_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off64_t));
+#endif
+
+#if !defined(ZLIB_INTERNAL) && defined(Z_WANT64)
+# ifdef Z_PREFIX_SET
+# define z_gzopen z_gzopen64
+# define z_gzseek z_gzseek64
+# define z_gztell z_gztell64
+# define z_gzoffset z_gzoffset64
+# define z_adler32_combine z_adler32_combine64
+# define z_crc32_combine z_crc32_combine64
+# else
+# define gzopen gzopen64
+# define gzseek gzseek64
+# define gztell gztell64
+# define gzoffset gzoffset64
+# define adler32_combine adler32_combine64
+# define crc32_combine crc32_combine64
+# endif
+# ifndef Z_LARGE64
+ ZEXTERN gzFile ZEXPORT gzopen64 OF((const char *, const char *));
+ ZEXTERN z_off_t ZEXPORT gzseek64 OF((gzFile, z_off_t, int));
+ ZEXTERN z_off_t ZEXPORT gztell64 OF((gzFile));
+ ZEXTERN z_off_t ZEXPORT gzoffset64 OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+# endif
+#else
+ ZEXTERN gzFile ZEXPORT gzopen OF((const char *, const char *));
+ ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile, z_off_t, int));
+ ZEXTERN z_off_t ZEXPORT gztell OF((gzFile));
+ ZEXTERN z_off_t ZEXPORT gzoffset OF((gzFile));
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+#endif
+
+#else /* Z_SOLO */
+
+ ZEXTERN uLong ZEXPORT adler32_combine OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine OF((uLong, uLong, z_off_t));
+
+#endif /* !Z_SOLO */
+
+/* undocumented functions */
+ZEXTERN const char * ZEXPORT zError OF((int));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp));
+ZEXTERN const z_crc_t FAR * ZEXPORT get_crc_table OF((void));
+ZEXTERN int ZEXPORT inflateUndermine OF((z_streamp, int));
+ZEXTERN int ZEXPORT inflateValidate OF((z_streamp, int));
+ZEXTERN unsigned long ZEXPORT inflateCodesUsed OF ((z_streamp));
+ZEXTERN int ZEXPORT inflateResetKeep OF((z_streamp));
+ZEXTERN int ZEXPORT deflateResetKeep OF((z_streamp));
+#if (defined(_WIN32) || defined(__CYGWIN__)) && !defined(Z_SOLO)
+ZEXTERN gzFile ZEXPORT gzopen_w OF((const wchar_t *path,
+ const char *mode));
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifndef Z_SOLO
+ZEXTERN int ZEXPORTVA gzvprintf Z_ARG((gzFile file,
+ const char *format,
+ va_list va));
+# endif
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* ZLIB_H */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.map b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.map
new file mode 100644
index 000000000..82ce98cf7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.map
@@ -0,0 +1,94 @@
+ZLIB_1.2.0 {
+ global:
+ compressBound;
+ deflateBound;
+ inflateBack;
+ inflateBackEnd;
+ inflateBackInit_;
+ inflateCopy;
+ local:
+ deflate_copyright;
+ inflate_copyright;
+ inflate_fast;
+ inflate_table;
+ zcalloc;
+ zcfree;
+ z_errmsg;
+ gz_error;
+ gz_intmax;
+ _*;
+};
+
+ZLIB_1.2.0.2 {
+ gzclearerr;
+ gzungetc;
+ zlibCompileFlags;
+} ZLIB_1.2.0;
+
+ZLIB_1.2.0.8 {
+ deflatePrime;
+} ZLIB_1.2.0.2;
+
+ZLIB_1.2.2 {
+ adler32_combine;
+ crc32_combine;
+ deflateSetHeader;
+ inflateGetHeader;
+} ZLIB_1.2.0.8;
+
+ZLIB_1.2.2.3 {
+ deflateTune;
+ gzdirect;
+} ZLIB_1.2.2;
+
+ZLIB_1.2.2.4 {
+ inflatePrime;
+} ZLIB_1.2.2.3;
+
+ZLIB_1.2.3.3 {
+ adler32_combine64;
+ crc32_combine64;
+ gzopen64;
+ gzseek64;
+ gztell64;
+ inflateUndermine;
+} ZLIB_1.2.2.4;
+
+ZLIB_1.2.3.4 {
+ inflateReset2;
+ inflateMark;
+} ZLIB_1.2.3.3;
+
+ZLIB_1.2.3.5 {
+ gzbuffer;
+ gzoffset;
+ gzoffset64;
+ gzclose_r;
+ gzclose_w;
+} ZLIB_1.2.3.4;
+
+ZLIB_1.2.5.1 {
+ deflatePending;
+} ZLIB_1.2.3.5;
+
+ZLIB_1.2.5.2 {
+ deflateResetKeep;
+ gzgetc_;
+ inflateResetKeep;
+} ZLIB_1.2.5.1;
+
+ZLIB_1.2.7.1 {
+ inflateGetDictionary;
+ gzvprintf;
+} ZLIB_1.2.5.2;
+
+ZLIB_1.2.9 {
+ inflateCodesUsed;
+ inflateValidate;
+ uncompress2;
+ gzfread;
+ gzfwrite;
+ deflateGetDictionary;
+ adler32_z;
+ crc32_z;
+} ZLIB_1.2.7.1;
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.cmakein b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.cmakein
new file mode 100644
index 000000000..a5e642938
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.cmakein
@@ -0,0 +1,13 @@
+prefix=@CMAKE_INSTALL_PREFIX@
+exec_prefix=@CMAKE_INSTALL_PREFIX@
+libdir=@INSTALL_LIB_DIR@
+sharedlibdir=@INSTALL_LIB_DIR@
+includedir=@INSTALL_INC_DIR@
+
+Name: zlib
+Description: zlib compression library
+Version: @VERSION@
+
+Requires:
+Libs: -L${libdir} -L${sharedlibdir} -lz
+Cflags: -I${includedir}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.in b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.in
new file mode 100644
index 000000000..7e5acf9c7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib.pc.in
@@ -0,0 +1,13 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+sharedlibdir=@sharedlibdir@
+includedir=@includedir@
+
+Name: zlib
+Description: zlib compression library
+Version: @VERSION@
+
+Requires:
+Libs: -L${libdir} -L${sharedlibdir} -lz
+Cflags: -I${includedir}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib2ansi b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib2ansi
new file mode 100644
index 000000000..15e3e165f
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zlib2ansi
@@ -0,0 +1,152 @@
+#!/usr/bin/perl
+
+# Transform K&R C function definitions into ANSI equivalent.
+#
+# Author: Paul Marquess
+# Version: 1.0
+# Date: 3 October 2006
+
+# TODO
+#
+# Asumes no function pointer parameters. unless they are typedefed.
+# Assumes no literal strings that look like function definitions
+# Assumes functions start at the beginning of a line
+
+use strict;
+use warnings;
+
+local $/;
+$_ = <>;
+
+my $sp = qr{ \s* (?: /\* .*? \*/ )? \s* }x; # assume no nested comments
+
+my $d1 = qr{ $sp (?: [\w\*\s]+ $sp)* $sp \w+ $sp [\[\]\s]* $sp }x ;
+my $decl = qr{ $sp (?: \w+ $sp )+ $d1 }xo ;
+my $dList = qr{ $sp $decl (?: $sp , $d1 )* $sp ; $sp }xo ;
+
+
+while (s/^
+ ( # Start $1
+ ( # Start $2
+ .*? # Minimal eat content
+ ( ^ \w [\w\s\*]+ ) # $3 -- function name
+ \s* # optional whitespace
+ ) # $2 - Matched up to before parameter list
+
+ \( \s* # Literal "(" + optional whitespace
+ ( [^\)]+ ) # $4 - one or more anythings except ")"
+ \s* \) # optional whitespace surrounding a Literal ")"
+
+ ( (?: $dList )+ ) # $5
+
+ $sp ^ { # literal "{" at start of line
+ ) # Remember to $1
+ //xsom
+ )
+{
+ my $all = $1 ;
+ my $prefix = $2;
+ my $param_list = $4 ;
+ my $params = $5;
+
+ StripComments($params);
+ StripComments($param_list);
+ $param_list =~ s/^\s+//;
+ $param_list =~ s/\s+$//;
+
+ my $i = 0 ;
+ my %pList = map { $_ => $i++ }
+ split /\s*,\s*/, $param_list;
+ my $pMatch = '(\b' . join('|', keys %pList) . '\b)\W*$' ;
+
+ my @params = split /\s*;\s*/, $params;
+ my @outParams = ();
+ foreach my $p (@params)
+ {
+ if ($p =~ /,/)
+ {
+ my @bits = split /\s*,\s*/, $p;
+ my $first = shift @bits;
+ $first =~ s/^\s*//;
+ push @outParams, $first;
+ $first =~ /^(\w+\s*)/;
+ my $type = $1 ;
+ push @outParams, map { $type . $_ } @bits;
+ }
+ else
+ {
+ $p =~ s/^\s+//;
+ push @outParams, $p;
+ }
+ }
+
+
+ my %tmp = map { /$pMatch/; $_ => $pList{$1} }
+ @outParams ;
+
+ @outParams = map { " $_" }
+ sort { $tmp{$a} <=> $tmp{$b} }
+ @outParams ;
+
+ print $prefix ;
+ print "(\n" . join(",\n", @outParams) . ")\n";
+ print "{" ;
+
+}
+
+# Output any trailing code.
+print ;
+exit 0;
+
+
+sub StripComments
+{
+
+ no warnings;
+
+ # Strip C & C++ coments
+ # From the perlfaq
+ $_[0] =~
+
+ s{
+ /\* ## Start of /* ... */ comment
+ [^*]*\*+ ## Non-* followed by 1-or-more *'s
+ (
+ [^/*][^*]*\*+
+ )* ## 0-or-more things which don't start with /
+ ## but do end with '*'
+ / ## End of /* ... */ comment
+
+ | ## OR C++ Comment
+ // ## Start of C++ comment //
+ [^\n]* ## followed by 0-or-more non end of line characters
+
+ | ## OR various things which aren't comments:
+
+ (
+ " ## Start of " ... " string
+ (
+ \\. ## Escaped char
+ | ## OR
+ [^"\\] ## Non "\
+ )*
+ " ## End of " ... " string
+
+ | ## OR
+
+ ' ## Start of ' ... ' string
+ (
+ \\. ## Escaped char
+ | ## OR
+ [^'\\] ## Non '\
+ )*
+ ' ## End of ' ... ' string
+
+ | ## OR
+
+ . ## Anything other char
+ [^/"'\\]* ## Chars which doesn't start a comment, string or escape
+ )
+ }{$2}gxs;
+
+}
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.c b/src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.c
new file mode 100644
index 000000000..a76c6b0c7
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.c
@@ -0,0 +1,325 @@
+/* zutil.c -- target dependent utility functions for the compression library
+ * Copyright (C) 1995-2017 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* @(#) $Id$ */
+
+#include "zutil.h"
+#ifndef Z_SOLO
+# include "gzguts.h"
+#endif
+
+z_const char * const z_errmsg[10] = {
+ (z_const char *)"need dictionary", /* Z_NEED_DICT 2 */
+ (z_const char *)"stream end", /* Z_STREAM_END 1 */
+ (z_const char *)"", /* Z_OK 0 */
+ (z_const char *)"file error", /* Z_ERRNO (-1) */
+ (z_const char *)"stream error", /* Z_STREAM_ERROR (-2) */
+ (z_const char *)"data error", /* Z_DATA_ERROR (-3) */
+ (z_const char *)"insufficient memory", /* Z_MEM_ERROR (-4) */
+ (z_const char *)"buffer error", /* Z_BUF_ERROR (-5) */
+ (z_const char *)"incompatible version",/* Z_VERSION_ERROR (-6) */
+ (z_const char *)""
+};
+
+
+const char * ZEXPORT zlibVersion()
+{
+ return ZLIB_VERSION;
+}
+
+uLong ZEXPORT zlibCompileFlags()
+{
+ uLong flags;
+
+ flags = 0;
+ switch ((int)(sizeof(uInt))) {
+ case 2: break;
+ case 4: flags += 1; break;
+ case 8: flags += 2; break;
+ default: flags += 3;
+ }
+ switch ((int)(sizeof(uLong))) {
+ case 2: break;
+ case 4: flags += 1 << 2; break;
+ case 8: flags += 2 << 2; break;
+ default: flags += 3 << 2;
+ }
+ switch ((int)(sizeof(voidpf))) {
+ case 2: break;
+ case 4: flags += 1 << 4; break;
+ case 8: flags += 2 << 4; break;
+ default: flags += 3 << 4;
+ }
+ switch ((int)(sizeof(z_off_t))) {
+ case 2: break;
+ case 4: flags += 1 << 6; break;
+ case 8: flags += 2 << 6; break;
+ default: flags += 3 << 6;
+ }
+#ifdef ZLIB_DEBUG
+ flags += 1 << 8;
+#endif
+#if defined(ASMV) || defined(ASMINF)
+ flags += 1 << 9;
+#endif
+#ifdef ZLIB_WINAPI
+ flags += 1 << 10;
+#endif
+#ifdef BUILDFIXED
+ flags += 1 << 12;
+#endif
+#ifdef DYNAMIC_CRC_TABLE
+ flags += 1 << 13;
+#endif
+#ifdef NO_GZCOMPRESS
+ flags += 1L << 16;
+#endif
+#ifdef NO_GZIP
+ flags += 1L << 17;
+#endif
+#ifdef PKZIP_BUG_WORKAROUND
+ flags += 1L << 20;
+#endif
+#ifdef FASTEST
+ flags += 1L << 21;
+#endif
+#if defined(STDC) || defined(Z_HAVE_STDARG_H)
+# ifdef NO_vsnprintf
+ flags += 1L << 25;
+# ifdef HAS_vsprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_vsnprintf_void
+ flags += 1L << 26;
+# endif
+# endif
+#else
+ flags += 1L << 24;
+# ifdef NO_snprintf
+ flags += 1L << 25;
+# ifdef HAS_sprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_snprintf_void
+ flags += 1L << 26;
+# endif
+# endif
+#endif
+ return flags;
+}
+
+#ifdef ZLIB_DEBUG
+#include <stdlib.h>
+# ifndef verbose
+# define verbose 0
+# endif
+int ZLIB_INTERNAL z_verbose = verbose;
+
+void ZLIB_INTERNAL z_error (m)
+ char *m;
+{
+ fprintf(stderr, "%s\n", m);
+ exit(1);
+}
+#endif
+
+/* exported to allow conversion of error code to string for compress() and
+ * uncompress()
+ */
+const char * ZEXPORT zError(err)
+ int err;
+{
+ return ERR_MSG(err);
+}
+
+#if defined(_WIN32_WCE)
+ /* The Microsoft C Run-Time Library for Windows CE doesn't have
+ * errno. We define it as a global variable to simplify porting.
+ * Its value is always 0 and should not be used.
+ */
+ int errno = 0;
+#endif
+
+#ifndef HAVE_MEMCPY
+
+void ZLIB_INTERNAL zmemcpy(dest, source, len)
+ Bytef* dest;
+ const Bytef* source;
+ uInt len;
+{
+ if (len == 0) return;
+ do {
+ *dest++ = *source++; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+
+int ZLIB_INTERNAL zmemcmp(s1, s2, len)
+ const Bytef* s1;
+ const Bytef* s2;
+ uInt len;
+{
+ uInt j;
+
+ for (j = 0; j < len; j++) {
+ if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+ }
+ return 0;
+}
+
+void ZLIB_INTERNAL zmemzero(dest, len)
+ Bytef* dest;
+ uInt len;
+{
+ if (len == 0) return;
+ do {
+ *dest++ = 0; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+#endif
+
+#ifndef Z_SOLO
+
+#ifdef SYS16BIT
+
+#ifdef __TURBOC__
+/* Turbo C in 16-bit mode */
+
+# define MY_ZCALLOC
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use zcfree().
+ */
+
+#define MAX_PTR 10
+/* 10*64K = 640K */
+
+local int next_ptr = 0;
+
+typedef struct ptr_table_s {
+ voidpf org_ptr;
+ voidpf new_ptr;
+} ptr_table;
+
+local ptr_table table[MAX_PTR];
+/* This table is used to remember the original form of pointers
+ * to large buffers (64K). Such pointers are normalized with a zero offset.
+ * Since MSDOS is not a preemptive multitasking OS, this table is not
+ * protected from concurrent access. This hack doesn't work anyway on
+ * a protected system like OS/2. Use Microsoft C instead.
+ */
+
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+ voidpf buf;
+ ulg bsize = (ulg)items*size;
+
+ (void)opaque;
+
+ /* If we allocate less than 65520 bytes, we assume that farmalloc
+ * will return a usable pointer which doesn't have to be normalized.
+ */
+ if (bsize < 65520L) {
+ buf = farmalloc(bsize);
+ if (*(ush*)&buf != 0) return buf;
+ } else {
+ buf = farmalloc(bsize + 16L);
+ }
+ if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
+ table[next_ptr].org_ptr = buf;
+
+ /* Normalize the pointer to seg:0 */
+ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
+ *(ush*)&buf = 0;
+ table[next_ptr++].new_ptr = buf;
+ return buf;
+}
+
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+{
+ int n;
+
+ (void)opaque;
+
+ if (*(ush*)&ptr != 0) { /* object < 64K */
+ farfree(ptr);
+ return;
+ }
+ /* Find the original pointer */
+ for (n = 0; n < next_ptr; n++) {
+ if (ptr != table[n].new_ptr) continue;
+
+ farfree(table[n].org_ptr);
+ while (++n < next_ptr) {
+ table[n-1] = table[n];
+ }
+ next_ptr--;
+ return;
+ }
+ Assert(0, "zcfree: ptr not found");
+}
+
+#endif /* __TURBOC__ */
+
+
+#ifdef M_I86
+/* Microsoft C in 16-bit mode */
+
+# define MY_ZCALLOC
+
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
+# define _halloc halloc
+# define _hfree hfree
+#endif
+
+voidpf ZLIB_INTERNAL zcalloc (voidpf opaque, uInt items, uInt size)
+{
+ (void)opaque;
+ return _halloc((long)items, size);
+}
+
+void ZLIB_INTERNAL zcfree (voidpf opaque, voidpf ptr)
+{
+ (void)opaque;
+ _hfree(ptr);
+}
+
+#endif /* M_I86 */
+
+#endif /* SYS16BIT */
+
+
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */
+
+#ifndef STDC
+extern voidp malloc OF((uInt size));
+extern voidp calloc OF((uInt items, uInt size));
+extern void free OF((voidpf ptr));
+#endif
+
+voidpf ZLIB_INTERNAL zcalloc (opaque, items, size)
+ voidpf opaque;
+ unsigned items;
+ unsigned size;
+{
+ (void)opaque;
+ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
+ (voidpf)calloc(items, size);
+}
+
+void ZLIB_INTERNAL zcfree (opaque, ptr)
+ voidpf opaque;
+ voidpf ptr;
+{
+ (void)opaque;
+ free(ptr);
+}
+
+#endif /* MY_ZCALLOC */
+
+#endif /* !Z_SOLO */
diff --git a/src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.h b/src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.h
new file mode 100644
index 000000000..b079ea6a8
--- /dev/null
+++ b/src/boost/libs/beast/test/extern/zlib-1.2.11/zutil.h
@@ -0,0 +1,271 @@
+/* zutil.h -- internal interface and configuration of the compression library
+ * Copyright (C) 1995-2016 Jean-loup Gailly, Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* @(#) $Id$ */
+
+#ifndef ZUTIL_H
+#define ZUTIL_H
+
+#ifdef HAVE_HIDDEN
+# define ZLIB_INTERNAL __attribute__((visibility ("hidden")))
+#else
+# define ZLIB_INTERNAL
+#endif
+
+#include "zlib.h"
+
+#if defined(STDC) && !defined(Z_SOLO)
+# if !(defined(_WIN32_WCE) && defined(_MSC_VER))
+# include <stddef.h>
+# endif
+# include <string.h>
+# include <stdlib.h>
+#endif
+
+#ifdef Z_SOLO
+ typedef long ptrdiff_t; /* guess -- will be caught if guess is wrong */
+#endif
+
+#ifndef local
+# define local static
+#endif
+/* since "static" is used to mean two completely different things in C, we
+ define "local" for the non-static meaning of "static", for readability
+ (compile with -Dlocal if your debugger can't find static symbols) */
+
+typedef unsigned char uch;
+typedef uch FAR uchf;
+typedef unsigned short ush;
+typedef ush FAR ushf;
+typedef unsigned long ulg;
+
+extern z_const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
+/* (size given to avoid silly warnings with Visual C++) */
+
+#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+
+#define ERR_RETURN(strm,err) \
+ return (strm->msg = ERR_MSG(err), (err))
+/* To be used only when the state is known to be valid */
+
+ /* common constants */
+
+#ifndef DEF_WBITS
+# define DEF_WBITS MAX_WBITS
+#endif
+/* default windowBits for decompression. MAX_WBITS is for compression only */
+
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+/* default memLevel */
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES 2
+/* The three kinds of block type */
+
+#define MIN_MATCH 3
+#define MAX_MATCH 258
+/* The minimum and maximum match lengths */
+
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
+
+ /* target dependencies */
+
+#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
+# define OS_CODE 0x00
+# ifndef Z_SOLO
+# if defined(__TURBOC__) || defined(__BORLANDC__)
+# if (__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+ /* Allow compilation with ANSI keywords only enabled */
+ void _Cdecl farfree( void *block );
+ void *_Cdecl farmalloc( unsigned long nbytes );
+# else
+# include <alloc.h>
+# endif
+# else /* MSC or DJGPP */
+# include <malloc.h>
+# endif
+# endif
+#endif
+
+#ifdef AMIGA
+# define OS_CODE 1
+#endif
+
+#if defined(VAXC) || defined(VMS)
+# define OS_CODE 2
+# define F_OPEN(name, mode) \
+ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
+#endif
+
+#ifdef __370__
+# if __TARGET_LIB__ < 0x20000000
+# define OS_CODE 4
+# elif __TARGET_LIB__ < 0x40000000
+# define OS_CODE 11
+# else
+# define OS_CODE 8
+# endif
+#endif
+
+#if defined(ATARI) || defined(atarist)
+# define OS_CODE 5
+#endif
+
+#ifdef OS2
+# define OS_CODE 6
+# if defined(M_I86) && !defined(Z_SOLO)
+# include <malloc.h>
+# endif
+#endif
+
+#if defined(MACOS) || defined(TARGET_OS_MAC)
+# define OS_CODE 7
+# ifndef Z_SOLO
+# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fdopen */
+# else
+# ifndef fdopen
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# endif
+# endif
+# endif
+#endif
+
+#ifdef __acorn
+# define OS_CODE 13
+#endif
+
+#if defined(WIN32) && !defined(__CYGWIN__)
+# define OS_CODE 10
+#endif
+
+#ifdef _BEOS_
+# define OS_CODE 16
+#endif
+
+#ifdef __TOS_OS400__
+# define OS_CODE 18
+#endif
+
+#ifdef __APPLE__
+# define OS_CODE 19
+#endif
+
+#if defined(_BEOS_) || defined(RISCOS)
+# define fdopen(fd,mode) NULL /* No fdopen() */
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER > 600)) && !defined __INTERIX
+# if defined(_WIN32_WCE)
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# ifndef _PTRDIFF_T_DEFINED
+ typedef int ptrdiff_t;
+# define _PTRDIFF_T_DEFINED
+# endif
+# else
+# define fdopen(fd,type) _fdopen(fd,type)
+# endif
+#endif
+
+#if defined(__BORLANDC__) && !defined(MSDOS)
+ #pragma warn -8004
+ #pragma warn -8008
+ #pragma warn -8066
+#endif
+
+/* provide prototypes for these when building zlib without LFS */
+#if !defined(_WIN32) && \
+ (!defined(_LARGEFILE64_SOURCE) || _LFS64_LARGEFILE-0 == 0)
+ ZEXTERN uLong ZEXPORT adler32_combine64 OF((uLong, uLong, z_off_t));
+ ZEXTERN uLong ZEXPORT crc32_combine64 OF((uLong, uLong, z_off_t));
+#endif
+
+ /* common defaults */
+
+#ifndef OS_CODE
+# define OS_CODE 3 /* assume Unix */
+#endif
+
+#ifndef F_OPEN
+# define F_OPEN(name, mode) fopen((name), (mode))
+#endif
+
+ /* functions */
+
+#if defined(pyr) || defined(Z_SOLO)
+# define NO_MEMCPY
+#endif
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+ * You may have to use the same strategy for Borland C (untested).
+ * The __SC__ check is for Symantec.
+ */
+# define NO_MEMCPY
+#endif
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
+# define HAVE_MEMCPY
+#endif
+#ifdef HAVE_MEMCPY
+# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
+# define zmemcpy _fmemcpy
+# define zmemcmp _fmemcmp
+# define zmemzero(dest, len) _fmemset(dest, 0, len)
+# else
+# define zmemcpy memcpy
+# define zmemcmp memcmp
+# define zmemzero(dest, len) memset(dest, 0, len)
+# endif
+#else
+ void ZLIB_INTERNAL zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
+ int ZLIB_INTERNAL zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
+ void ZLIB_INTERNAL zmemzero OF((Bytef* dest, uInt len));
+#endif
+
+/* Diagnostic functions */
+#ifdef ZLIB_DEBUG
+# include <stdio.h>
+ extern int ZLIB_INTERNAL z_verbose;
+ extern void ZLIB_INTERNAL z_error OF((char *m));
+# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
+# define Trace(x) {if (z_verbose>=0) fprintf x ;}
+# define Tracev(x) {if (z_verbose>0) fprintf x ;}
+# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
+# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
+# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
+#else
+# define Assert(cond,msg)
+# define Trace(x)
+# define Tracev(x)
+# define Tracevv(x)
+# define Tracec(c,x)
+# define Tracecv(c,x)
+#endif
+
+#ifndef Z_SOLO
+ voidpf ZLIB_INTERNAL zcalloc OF((voidpf opaque, unsigned items,
+ unsigned size));
+ void ZLIB_INTERNAL zcfree OF((voidpf opaque, voidpf ptr));
+#endif
+
+#define ZALLOC(strm, items, size) \
+ (*((strm)->zalloc))((strm)->opaque, (items), (size))
+#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+
+/* Reverse the bytes in a 32-bit value */
+#define ZSWAP32(q) ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
+ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+
+#endif /* ZUTIL_H */
diff --git a/src/boost/libs/beast/test/extras/README.md b/src/boost/libs/beast/test/extras/README.md
new file mode 100644
index 000000000..ea6ffce9d
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/README.md
@@ -0,0 +1,3 @@
+# Extras
+
+These are not part of the official public Beast interface but they are used by the tests and some third party programs.
diff --git a/src/boost/libs/beast/test/extras/include/boost/beast/doc_debug.hpp b/src/boost/libs/beast/test/extras/include/boost/beast/doc_debug.hpp
new file mode 100644
index 000000000..61c39b032
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/include/boost/beast/doc_debug.hpp
@@ -0,0 +1,170 @@
+//
+// Copyright (c) 2016-2019 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 BOOST_BEAST_DOC_DEBUG_HPP
+#define BOOST_BEAST_DOC_DEBUG_HPP
+
+namespace beast {
+
+#if BOOST_BEAST_DOXYGEN
+
+/// doc type (documentation debug helper)
+using doc_type = int;
+
+/// doc enum (documentation debug helper)
+enum doc_enum
+{
+ /// One (documentation debug helper)
+ one,
+
+ /// Two (documentation debug helper)
+ two
+};
+
+/// doc enum class (documentation debug helper)
+enum class doc_enum_class : unsigned
+{
+ /// one (documentation debug helper)
+ one,
+
+ /// two (documentation debug helper)
+ two
+};
+
+/// doc func (documentation debug helper)
+void doc_func();
+
+/// doc class (documentation debug helper)
+struct doc_class
+{
+ /// doc class member func (documentation debug helper)
+ void func();
+};
+
+/// (documentation debug helper)
+namespace nested {
+
+/// doc type (documentation debug helper)
+using nested_doc_type = int;
+
+/// doc enum (documentation debug helper)
+enum nested_doc_enum
+{
+ /// One (documentation debug helper)
+ one,
+
+ /// Two (documentation debug helper)
+ two
+};
+
+/// doc enum class (documentation debug helper)
+enum class nested_doc_enum_class : unsigned
+{
+ /// one (documentation debug helper)
+ one,
+
+ /// two (documentation debug helper)
+ two
+};
+
+/// doc func (documentation debug helper)
+void nested_doc_func();
+
+/// doc class (documentation debug helper)
+struct nested_doc_class
+{
+ /// doc class member func (documentation debug helper)
+ void func();
+};
+
+} // nested
+
+/** This is here to help troubleshoot doc/reference.xsl problems
+
+ Embedded references:
+
+ @li type @ref doc_type
+
+ @li enum @ref doc_enum
+
+ @li enum item @ref doc_enum::one
+
+ @li enum_class @ref doc_enum_class
+
+ @li enum_class item @ref doc_enum_class::one
+
+ @li func @ref doc_func
+
+ @li class @ref doc_class
+
+ @li class func @ref doc_class::func
+
+ @li nested type @ref nested::nested_doc_type
+
+ @li nested enum @ref nested::nested_doc_enum
+
+ @li nested enum item @ref nested::nested_doc_enum::one
+
+ @li nested enum_class @ref nested::nested_doc_enum_class
+
+ @li nested enum_class item @ref nested::nested_doc_enum_class::one
+
+ @li nested func @ref nested::nested_doc_func
+
+ @li nested class @ref nested::nested_doc_class
+
+ @li nested class func @ref nested::nested_doc_class::func
+*/
+void doc_debug();
+
+namespace nested {
+
+/** This is here to help troubleshoot doc/reference.xsl problems
+
+ Embedded references:
+
+ @li type @ref doc_type
+
+ @li enum @ref doc_enum
+
+ @li enum item @ref doc_enum::one
+
+ @li enum_class @ref doc_enum_class
+
+ @li enum_class item @ref doc_enum_class::one
+
+ @li func @ref doc_func
+
+ @li class @ref doc_class
+
+ @li class func @ref doc_class::func
+
+ @li nested type @ref nested_doc_type
+
+ @li nested enum @ref nested_doc_enum
+
+ @li nested enum item @ref nested_doc_enum::one
+
+ @li nested enum_class @ref nested_doc_enum_class
+
+ @li nested enum_class item @ref nested_doc_enum_class::one
+
+ @li nested func @ref nested_doc_func
+
+ @li nested class @ref nested_doc_class
+
+ @li nested class func @ref nested_doc_class::func
+*/
+void nested_doc_debug();
+
+} // nested
+
+#endif
+
+} // beast
+
+#endif
diff --git a/src/boost/libs/beast/test/extras/include/boost/beast/test/fuzz.hpp b/src/boost/libs/beast/test/extras/include/boost/beast/test/fuzz.hpp
new file mode 100644
index 000000000..5491b2e28
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/include/boost/beast/test/fuzz.hpp
@@ -0,0 +1,105 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_FUZZ_HPP
+#define BOOST_BEAST_TEST_FUZZ_HPP
+
+#include <boost/beast/core/static_string.hpp>
+#include <boost/beast/core/string.hpp>
+#include <random>
+
+namespace boost {
+namespace beast {
+namespace test {
+
+class fuzz_rand
+{
+ std::mt19937 rng_;
+
+public:
+ std::mt19937&
+ rng()
+ {
+ return rng_;
+ }
+
+ template<class Unsigned>
+ Unsigned
+ operator()(Unsigned n)
+ {
+ return static_cast<Unsigned>(
+ std::uniform_int_distribution<
+ Unsigned>{0, n-1}(rng_));
+ }
+};
+
+template<std::size_t N, class Rand, class F>
+static
+void
+fuzz(
+ static_string<N> const& input,
+ std::size_t repeat,
+ std::size_t depth,
+ Rand& r,
+ F const& f)
+{
+ static_string<N> mod{input};
+ for(auto i = repeat; i; --i)
+ {
+ switch(r(4))
+ {
+ case 0: // insert
+ if(mod.size() >= mod.max_size())
+ continue;
+ mod.insert(r(mod.size() + 1), 1,
+ static_cast<char>(r(256)));
+ break;
+
+ case 1: // erase
+ if(mod.size() == 0)
+ continue;
+ mod.erase(r(mod.size()), 1);
+ break;
+
+ case 2: // swap
+ {
+ if(mod.size() <= 1)
+ continue;
+ auto off = r(mod.size() - 1);
+ auto const temp = mod[off];
+ mod[off] = mod[off + 1];
+ mod[off + 1] = temp;
+ break;
+ }
+ case 3: // repeat
+ {
+ if(mod.empty())
+ continue;
+ auto n = (std::min)(
+ std::geometric_distribution<
+ std::size_t>{}(r.rng()),
+ mod.max_size() - mod.size());
+ if(n == 0)
+ continue;
+ auto off = r(mod.size());
+ mod.insert(off, n, mod[off + 1]);
+ break;
+ }
+ }
+ f(string_view{mod.data(), mod.size()});
+ if(depth > 0)
+ fuzz(mod, repeat, depth - 1, r, f);
+ }
+}
+
+} // test
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/extras/include/boost/beast/test/sig_wait.hpp b/src/boost/libs/beast/test/extras/include/boost/beast/test/sig_wait.hpp
new file mode 100644
index 000000000..96c41da16
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/include/boost/beast/test/sig_wait.hpp
@@ -0,0 +1,38 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_SIG_WAIT_HPP
+#define BOOST_BEAST_TEST_SIG_WAIT_HPP
+
+#include <boost/asio.hpp>
+
+namespace boost {
+namespace beast {
+namespace test {
+
+/// Block until SIGINT or SIGTERM is received.
+inline
+void
+sig_wait()
+{
+ net::io_context ioc;
+ net::signal_set signals(
+ ioc, SIGINT, SIGTERM);
+ signals.async_wait(
+ [&](boost::system::error_code const&, int)
+ {
+ });
+ ioc.run();
+}
+
+} // test
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/extras/include/boost/beast/test/test_allocator.hpp b/src/boost/libs/beast/test/extras/include/boost/beast/test/test_allocator.hpp
new file mode 100644
index 000000000..b985c539f
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/include/boost/beast/test/test_allocator.hpp
@@ -0,0 +1,310 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_TEST_ALLOCATOR_HPP
+#define BOOST_BEAST_TEST_TEST_ALLOCATOR_HPP
+
+#include <atomic>
+#include <cstddef>
+#include <cstdint>
+#include <memory>
+
+namespace boost {
+namespace beast {
+namespace test {
+
+struct test_allocator_info
+{
+ std::size_t id;
+ std::size_t ncopy = 0;
+ std::size_t nmove = 0;
+ std::size_t nmassign = 0;
+ std::size_t ncpassign = 0;
+ std::size_t nselect = 0;
+ std::size_t max_size = (
+ std::numeric_limits<std::size_t>::max)();
+
+ test_allocator_info()
+ : id([]
+ {
+ static std::atomic<std::size_t> sid(0);
+ return ++sid;
+ }())
+ {
+ }
+};
+
+template<
+ class T,
+ bool Equal,
+ bool Assign,
+ bool Move,
+ bool Swap,
+ bool Select>
+class test_allocator;
+
+template<
+ class T,
+ bool Equal,
+ bool Assign,
+ bool Move,
+ bool Swap,
+ bool Select>
+struct test_allocator_base
+{
+};
+
+// Select == true
+template<
+ class T,
+ bool Equal,
+ bool Assign,
+ bool Move,
+ bool Swap>
+struct test_allocator_base<
+ T, Equal, Assign, Move, Swap, true>
+{
+ static
+ test_allocator<T, Equal, Assign, Move, Swap, true>
+ select_on_container_copy_construction(test_allocator<
+ T, Equal, Assign, Move, Swap, true> const&)
+ {
+ return test_allocator<T,
+ Equal, Assign, Move, Swap, true>{};
+ }
+};
+
+template<
+ class T,
+ bool Equal,
+ bool Assign,
+ bool Move,
+ bool Swap,
+ bool Select>
+class test_allocator
+ : public test_allocator_base<
+ T, Equal, Assign, Move, Swap, Select>
+{
+ std::shared_ptr<test_allocator_info> info_;
+
+ template<class, bool, bool, bool, bool, bool>
+ friend class test_allocator;
+
+public:
+ using value_type = T;
+
+ using propagate_on_container_copy_assignment =
+ std::integral_constant<bool, Assign>;
+
+ using propagate_on_container_move_assignment =
+ std::integral_constant<bool, Move>;
+
+ using propagate_on_container_swap =
+ std::integral_constant<bool, Swap>;
+
+ template<class U>
+ struct rebind
+ {
+ using other = test_allocator<U, Equal, Assign, Move, Swap, Select>;
+ };
+
+ test_allocator()
+ : info_(std::make_shared<
+ test_allocator_info>())
+ {
+ }
+
+ test_allocator(test_allocator const& u) noexcept
+ : info_(u.info_)
+ {
+ ++info_->ncopy;
+ }
+
+ template<class U>
+ test_allocator(test_allocator<U,
+ Equal, Assign, Move, Swap, Select> const& u) noexcept
+ : info_(u.info_)
+ {
+ ++info_->ncopy;
+ }
+
+ test_allocator(test_allocator&& t)
+ : info_(t.info_)
+ {
+ ++info_->nmove;
+ }
+
+ test_allocator&
+ operator=(test_allocator const& u) noexcept
+ {
+ info_ = u.info_;
+ ++info_->ncpassign;
+ return *this;
+ }
+
+ test_allocator&
+ operator=(test_allocator&& u) noexcept
+ {
+ info_ = u.info_;
+ ++info_->nmassign;
+ return *this;
+ }
+
+ value_type*
+ allocate(std::size_t n)
+ {
+ return static_cast<value_type*>(
+ ::operator new (n*sizeof(value_type)));
+ }
+
+ void
+ deallocate(value_type* p, std::size_t) noexcept
+ {
+ ::operator delete(p);
+ }
+
+ std::size_t
+ max_size() const
+ {
+ return info_->max_size;
+ }
+
+ void
+ max_size(std::size_t n)
+ {
+ info_->max_size = n;
+ }
+
+ bool
+ operator==(test_allocator const& other) const
+ {
+ return id() == other.id() || Equal;
+ }
+
+ bool
+ operator!=(test_allocator const& other) const
+ {
+ return ! this->operator==(other);
+ }
+
+ std::size_t
+ id() const
+ {
+ return info_->id;
+ }
+
+ test_allocator_info*
+ operator->() const
+ {
+ return info_.get();
+ }
+};
+
+//------------------------------------------------------------------------------
+
+#if 0
+struct allocator_info
+{
+ std::size_t const id;
+
+ allocator_info()
+ : id([]
+ {
+ static std::atomic<std::size_t> sid(0);
+ return ++sid;
+ }())
+ {
+ }
+};
+
+struct allocator_defaults
+{
+ static std::size_t constexpr max_size =
+ (std::numeric_limits<std::size_t>::max)();
+};
+
+template<
+ class T,
+ class Traits = allocator_defaults>
+struct allocator
+{
+public:
+ using value_type = T;
+
+#if 0
+ template<class U>
+ struct rebind
+ {
+ using other =
+ test_allocator<U, Traits>;
+ };
+#endif
+
+ allocator() = default;
+ allocator(allocator&& t) = default;
+ allocator(allocator const& u) = default;
+
+ template<
+ class U,
+ class = typename std::enable_if<
+ ! std::is_same<U, T>::value>::type>
+ allocator(
+ allocator<U, Traits> const& u) noexcept
+ {
+ }
+
+ allocator&
+ operator=(allocator&& u) noexcept
+ {
+ return *this;
+ }
+
+ allocator&
+ operator=(allocator const& u) noexcept
+ {
+ return *this;
+ }
+
+ value_type*
+ allocate(std::size_t n)
+ {
+ return static_cast<value_type*>(
+ ::operator new(n * sizeof(value_type)));
+ }
+
+ void
+ deallocate(value_type* p, std::size_t) noexcept
+ {
+ ::operator delete(p);
+ }
+
+ std::size_t
+ max_size() const
+ {
+ }
+
+ bool
+ operator==(test_allocator const& other) const
+ {
+ return id() == other.id() || Equal;
+ }
+
+ bool
+ operator!=(test_allocator const& other) const
+ {
+ return ! this->operator==(other);
+ }
+};
+#endif
+
+} // test
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/extras/include/boost/beast/test/throughput.hpp b/src/boost/libs/beast/test/extras/include/boost/beast/test/throughput.hpp
new file mode 100644
index 000000000..c7eca048b
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/include/boost/beast/test/throughput.hpp
@@ -0,0 +1,57 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_THROUGHPUT_HPP
+#define BOOST_BEAST_TEST_THROUGHPUT_HPP
+
+#include <chrono>
+#include <cstdint>
+
+namespace boost {
+namespace beast {
+namespace test {
+
+class timer
+{
+ using clock_type =
+ std::chrono::system_clock;
+
+ clock_type::time_point when_;
+
+public:
+ using duration =
+ clock_type::duration;
+
+ timer()
+ : when_(clock_type::now())
+ {
+ }
+
+ duration
+ elapsed() const
+ {
+ return clock_type::now() - when_;
+ }
+};
+
+inline
+std::uint64_t
+throughput(std::chrono::duration<
+ double> const& elapsed, std::uint64_t items)
+{
+ using namespace std::chrono;
+ return static_cast<std::uint64_t>(
+ 1 / (elapsed/items).count());
+}
+
+} // test
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/extras/include/boost/beast/test/websocket.hpp b/src/boost/libs/beast/test/extras/include/boost/beast/test/websocket.hpp
new file mode 100644
index 000000000..20a541b54
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/include/boost/beast/test/websocket.hpp
@@ -0,0 +1,250 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_WEBSOCKET_HPP
+#define BOOST_BEAST_TEST_WEBSOCKET_HPP
+
+#include <boost/beast/core/multi_buffer.hpp>
+#include <boost/beast/websocket/stream.hpp>
+#include <boost/beast/_experimental/test/stream.hpp>
+#include <boost/asio/executor_work_guard.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/spawn.hpp>
+#include <cstdlib>
+#include <memory>
+#include <ostream>
+#include <thread>
+
+namespace boost {
+namespace beast {
+namespace test {
+
+// DEPRECATED
+class ws_echo_server
+{
+ std::ostream& log_;
+ net::io_context ioc_;
+ net::executor_work_guard<
+ net::io_context::executor_type> work_;
+ multi_buffer buffer_;
+ test::stream ts_;
+ std::thread t_;
+ websocket::stream<test::stream&> ws_;
+ bool close_ = false;
+
+public:
+ enum class kind
+ {
+ sync,
+ async,
+ async_client
+ };
+
+ explicit
+ ws_echo_server(
+ std::ostream& log,
+ kind k = kind::sync)
+ : log_(log)
+ , work_(ioc_.get_executor())
+ , ts_(ioc_)
+ , ws_(ts_)
+ {
+ beast::websocket::permessage_deflate pmd;
+ pmd.server_enable = true;
+ pmd.server_max_window_bits = 9;
+ pmd.compLevel = 1;
+ ws_.set_option(pmd);
+
+ switch(k)
+ {
+ case kind::sync:
+ t_ = std::thread{[&]{ do_sync(); }};
+ break;
+
+ case kind::async:
+ t_ = std::thread{[&]{ ioc_.run(); }};
+ do_accept();
+ break;
+
+ case kind::async_client:
+ t_ = std::thread{[&]{ ioc_.run(); }};
+ break;
+ }
+ }
+
+ ~ws_echo_server()
+ {
+ work_.reset();
+ t_.join();
+ }
+
+ test::stream&
+ stream()
+ {
+ return ts_;
+ }
+
+ void
+ async_handshake()
+ {
+ ws_.async_handshake("localhost", "/",
+ std::bind(
+ &ws_echo_server::on_handshake,
+ this,
+ std::placeholders::_1));
+ }
+
+ void
+ async_close()
+ {
+ net::post(ioc_,
+ [&]
+ {
+ if(ws_.is_open())
+ {
+ ws_.async_close({},
+ std::bind(
+ &ws_echo_server::on_close,
+ this,
+ std::placeholders::_1));
+ }
+ else
+ {
+ close_ = true;
+ }
+ });
+ }
+
+private:
+ void
+ do_sync()
+ {
+ try
+ {
+ ws_.accept();
+ for(;;)
+ {
+ ws_.read(buffer_);
+ ws_.text(ws_.got_text());
+ ws_.write(buffer_.data());
+ buffer_.consume(buffer_.size());
+ }
+ }
+ catch(system_error const& se)
+ {
+ boost::ignore_unused(se);
+#if 0
+ if( se.code() != error::closed &&
+ se.code() != error::failed &&
+ se.code() != net::error::eof)
+ log_ << "ws_echo_server: " << se.code().message() << std::endl;
+#endif
+ }
+ catch(std::exception const& e)
+ {
+ log_ << "ws_echo_server: " << e.what() << std::endl;
+ }
+ }
+
+ void
+ do_accept()
+ {
+ ws_.async_accept(std::bind(
+ &ws_echo_server::on_accept,
+ this,
+ std::placeholders::_1));
+ }
+
+ void
+ on_handshake(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+
+ do_read();
+ }
+
+ void
+ on_accept(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+
+ if(close_)
+ {
+ return ws_.async_close({},
+ std::bind(
+ &ws_echo_server::on_close,
+ this,
+ std::placeholders::_1));
+ }
+
+ do_read();
+ }
+
+ void
+ do_read()
+ {
+ ws_.async_read(buffer_,
+ std::bind(
+ &ws_echo_server::on_read,
+ this,
+ std::placeholders::_1));
+ }
+
+ void
+ on_read(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+ ws_.text(ws_.got_text());
+ ws_.async_write(buffer_.data(),
+ std::bind(
+ &ws_echo_server::on_write,
+ this,
+ std::placeholders::_1));
+ }
+
+ void
+ on_write(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+ buffer_.consume(buffer_.size());
+ do_read();
+ }
+
+ void
+ on_close(error_code ec)
+ {
+ if(ec)
+ return fail(ec);
+ }
+
+ void
+ fail(error_code ec)
+ {
+ boost::ignore_unused(ec);
+#if 0
+ if( ec != error::closed &&
+ ec != error::failed &&
+ ec != net::error::eof)
+ log_ <<
+ "echo_server_async: " <<
+ ec.message() <<
+ std::endl;
+#endif
+ }
+};
+
+} // test
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/extras/include/boost/beast/test/yield_to.hpp b/src/boost/libs/beast/test/extras/include/boost/beast/test/yield_to.hpp
new file mode 100644
index 000000000..e0064830b
--- /dev/null
+++ b/src/boost/libs/beast/test/extras/include/boost/beast/test/yield_to.hpp
@@ -0,0 +1,139 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+#ifndef BOOST_BEAST_TEST_YIELD_TO_HPP
+#define BOOST_BEAST_TEST_YIELD_TO_HPP
+
+#include <boost/asio/executor_work_guard.hpp>
+#include <boost/asio/io_context.hpp>
+#include <boost/asio/spawn.hpp>
+#include <condition_variable>
+#include <functional>
+#include <mutex>
+#include <thread>
+#include <vector>
+
+namespace boost {
+namespace beast {
+namespace test {
+
+/** Mix-in to support tests using asio coroutines.
+
+ Derive from this class and use yield_to to launch test
+ functions inside coroutines. This is handy for testing
+ asynchronous asio code.
+*/
+class enable_yield_to
+{
+protected:
+ net::io_context ioc_;
+
+private:
+ net::executor_work_guard<
+ net::io_context::executor_type> work_;
+ std::vector<std::thread> threads_;
+ std::mutex m_;
+ std::condition_variable cv_;
+ std::size_t running_ = 0;
+
+public:
+ /// The type of yield context passed to functions.
+ using yield_context =
+ net::yield_context;
+
+ explicit
+ enable_yield_to(std::size_t concurrency = 1)
+ : work_(ioc_.get_executor())
+ {
+ threads_.reserve(concurrency);
+ while(concurrency--)
+ threads_.emplace_back(
+ [&]{ ioc_.run(); });
+ }
+
+ ~enable_yield_to()
+ {
+ work_.reset();
+ for(auto& t : threads_)
+ t.join();
+ }
+
+ /// Return the `io_context` associated with the object
+ net::io_context&
+ get_io_service()
+ {
+ return ioc_;
+ }
+
+ /** Run one or more functions, each in a coroutine.
+
+ This call will block until all coroutines terminate.
+
+ Each functions should have this signature:
+ @code
+ void f(yield_context);
+ @endcode
+
+ @param fn... One or more functions to invoke.
+ */
+#if BOOST_BEAST_DOXYGEN
+ template<class... FN>
+ void
+ yield_to(FN&&... fn)
+#else
+ template<class F0, class... FN>
+ void
+ yield_to(F0&& f0, FN&&... fn);
+#endif
+
+private:
+ void
+ spawn()
+ {
+ }
+
+ template<class F0, class... FN>
+ void
+ spawn(F0&& f, FN&&... fn);
+};
+
+template<class F0, class... FN>
+void
+enable_yield_to::
+yield_to(F0&& f0, FN&&... fn)
+{
+ running_ = 1 + sizeof...(FN);
+ spawn(f0, fn...);
+ std::unique_lock<std::mutex> lock{m_};
+ cv_.wait(lock, [&]{ return running_ == 0; });
+}
+
+template<class F0, class... FN>
+inline
+void
+enable_yield_to::
+spawn(F0&& f, FN&&... fn)
+{
+ asio::spawn(ioc_,
+ [&](yield_context yield)
+ {
+ f(yield);
+ std::lock_guard<std::mutex> lock{m_};
+ if(--running_ == 0)
+ cv_.notify_all();
+ }
+ , boost::coroutines::attributes(2 * 1024 * 1024));
+ spawn(fn...);
+}
+
+} // test
+} // beast
+} // boost
+
+#endif
diff --git a/src/boost/libs/beast/test/lib_asio.cpp b/src/boost/libs/beast/test/lib_asio.cpp
new file mode 100644
index 000000000..e78743319
--- /dev/null
+++ b/src/boost/libs/beast/test/lib_asio.cpp
@@ -0,0 +1,12 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// This file is used to build a static library
+
+#include <boost/asio/impl/src.hpp>
diff --git a/src/boost/libs/beast/test/lib_asio_ssl.cpp b/src/boost/libs/beast/test/lib_asio_ssl.cpp
new file mode 100644
index 000000000..212003197
--- /dev/null
+++ b/src/boost/libs/beast/test/lib_asio_ssl.cpp
@@ -0,0 +1,12 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// This file is used to build a static library
+
+#include <boost/asio/ssl/impl/src.hpp>
diff --git a/src/boost/libs/beast/test/lib_beast.cpp b/src/boost/libs/beast/test/lib_beast.cpp
new file mode 100644
index 000000000..a9523a4ea
--- /dev/null
+++ b/src/boost/libs/beast/test/lib_beast.cpp
@@ -0,0 +1,12 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// This file is used to build a static library
+
+#include <boost/beast/src.hpp>
diff --git a/src/boost/libs/beast/test/lib_test.cpp b/src/boost/libs/beast/test/lib_test.cpp
new file mode 100644
index 000000000..12e6614d1
--- /dev/null
+++ b/src/boost/libs/beast/test/lib_test.cpp
@@ -0,0 +1,13 @@
+//
+// Copyright (c) 2016-2019 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)
+//
+// Official repository: https://github.com/boostorg/beast
+//
+
+// This file is used to build a static library
+
+#include <boost/beast/_experimental/unit_test/main.ipp>
+
diff --git a/src/boost/libs/beast/tools/blacklist.supp b/src/boost/libs/beast/tools/blacklist.supp
new file mode 100644
index 000000000..669f3eb64
--- /dev/null
+++ b/src/boost/libs/beast/tools/blacklist.supp
@@ -0,0 +1,30 @@
+
+# Remember that this blacklist file is GLOBAL to all sanitizers
+# Be therefore extremely careful when considering to add a sanitizer
+# filter here instead of using a runtime suppression
+#
+# Remember also that filters here quite literally completely
+# remove instrumentation altogether, so filtering here means
+# that sanitizers such as tsan will false positive on problems
+# introduced by code filtered here.
+#
+# The main use for this file is ubsan, as it's the only sanitizer
+# without a runtime suppression facility.
+#
+# Be ESPECIALLY careful when filtering out entire source files!
+# Try if at all possible to filter only functions using fun:regex
+# Remember you must use mangled symbol names with fun:regex
+
+# boost/lexical_cast.hpp:1625:43: runtime error: downcast of address 0x7fbb4fffbce8 which does not point to an object of type 'buffer_t' (aka 'parser_buf<std::basic_streambuf<char, char_traits<char> >, char>')
+# Fixed in Boost 1.63.0 https://svn.boost.org/trac/boost/ticket/12889
+#
+fun:*shl_input_streamable*
+
+## The well known ubsan failure in libstdc++ extant for years :)
+# Line 96:24: runtime error: load of value 4294967221, which is not a valid value for type 'std::_Ios_Fmtflags'
+#
+#fun:*_Ios_Fmtflags*
+
+# boost/any.hpp:259:16: runtime error: downcast of address 0x000004392e70 which does not point to an object of type 'any::holder<int>'
+#
+#fun:*any_cast* \ No newline at end of file
diff --git a/src/boost/libs/beast/tools/build-and-test.sh b/src/boost/libs/beast/tools/build-and-test.sh
new file mode 100755
index 000000000..7d95f6f3d
--- /dev/null
+++ b/src/boost/libs/beast/tools/build-and-test.sh
@@ -0,0 +1,162 @@
+#!/usr/bin/env bash
+
+# add 'x' for command tracing
+set -eu
+
+#-------------------------------------------------------------------------------
+#
+# Utilities
+#
+
+# For builds not triggered by a pull request TRAVIS_BRANCH is the name of the
+# branch currently being built; whereas for builds triggered by a pull request
+# it is the name of the branch targeted by the pull request (in many cases this
+# will be master).
+MAIN_BRANCH="0"
+if [[ $TRAVIS_BRANCH == "master" || $TRAVIS_BRANCH == "develop" ]]; then
+ MAIN_BRANCH="1"
+fi
+
+if [[ "${BEAST_RETRY}" == "true" ]]; then
+ JOBS=1
+elif [[ "${TRAVIS}" == "true" ]]; then
+ JOBS="2"
+elif [[ $(uname -s) == "Linux" ]]; then
+ # Physical cores
+ JOBS=$(lscpu -p | grep -v '^#' | sort -u -t, -k 2,4 | wc -l)
+elif [[ $(uname) == "Darwin" ]]; then
+ # Physical cores
+ JOBS=$(sysctl -n hw.physicalcpu)
+else
+ JOBS=1
+fi
+
+# run with a debugger
+function debug_run ()
+{
+ if [[ $TRAVIS_OS_NAME == "osx" ]]; then
+ # -o runs after loading the binary
+ # -k runs after any crash
+ # We use a ghetto appromixation of --return-child-result, exiting with
+ # 1 on a crash
+ lldb \
+ --batch \
+ -o 'run' \
+ -k 'thread backtrace all' \
+ -k 'script import os; os._exit(1)' \
+ $@
+ else
+ gdb \
+ --silent \
+ --batch \
+ --return-child-result \
+ -ex="set print thread-events off" \
+ -ex=run \
+ -ex="thread apply all bt full" \
+ --args $@
+ fi
+}
+
+function valgrind_run ()
+{
+ valgrind \
+ --track-origins=yes \
+ --max-stackframe=16000000 \
+ --suppressions=$BOOST_ROOT/libs/beast/tools/valgrind.supp \
+ --error-exitcode=1 \
+ $@
+}
+
+function run_tests_with_debugger ()
+{
+ find "$1" -name "$2" -print0 | while read -d $'\0' f
+ do
+ debug_run "$f"
+ done
+}
+
+function run_tests_with_valgrind ()
+{
+ find "$1" -name "$2" -print0 | while read -d $'\0' f
+ do
+ valgrind_run "$f"
+ done
+}
+
+function run_tests ()
+{
+ find "$1" -name "$2" -print0 | while read -d $'\0' f
+ do
+ "$f"
+ done
+}
+
+#-------------------------------------------------------------------------------
+
+BIN_DIR="$BOOST_ROOT/bin.v2/libs/beast/test"
+LIB_DIR="$BOOST_ROOT/libs/beast"
+INC_DIR="$BOOST_ROOT/boost/beast"
+
+function build_bjam ()
+{
+ if [[ $VARIANT == "beast_coverage" ]] || \
+ [[ $VARIANT == "beast_valgrind" ]] || \
+ [[ $VARIANT == "beast_ubasan" ]]; then
+ b2 \
+ define=BOOST_COROUTINES_NO_DEPRECATION_WARNING=1 \
+ cxxstd=$CXXSTD \
+ libs/beast/test/beast/core//fat-tests \
+ libs/beast/test/beast/http//fat-tests \
+ libs/beast/test/beast/websocket//fat-tests \
+ libs/beast/test/beast/zlib//fat-tests \
+ toolset=$TOOLSET \
+ variant=$VARIANT \
+ link=static \
+ -j${JOBS}
+ elif [[ $VARIANT == "debug" ]]; then
+ b2 \
+ define=BOOST_COROUTINES_NO_DEPRECATION_WARNING=1 \
+ cxxstd=$CXXSTD \
+ libs/beast/test//fat-tests \
+ libs/beast/example \
+ toolset=$TOOLSET \
+ variant=$VARIANT \
+ -j${JOBS}
+ else
+ b2 \
+ define=BOOST_COROUTINES_NO_DEPRECATION_WARNING=1 \
+ cxxstd=$CXXSTD \
+ libs/beast/test//fat-tests \
+ toolset=$TOOLSET \
+ variant=$VARIANT \
+ -j${JOBS}
+ fi
+}
+
+build_bjam
+
+if [[ $VARIANT == "beast_coverage" ]]; then
+ # for lcov to work effectively, the paths and includes
+ # passed to the compiler should not contain "." or "..".
+ # (this runs in $BOOST_ROOT)
+ lcov --version
+ find "$BOOST_ROOT" -name "*.gcda" | xargs rm -f
+ rm -f "$BOOST_ROOT/*.info"
+ lcov --no-external -c -i -d "$BOOST_ROOT" -o baseline.info > /dev/null
+ run_tests "$BIN_DIR" fat-tests
+ # https://bugs.launchpad.net/ubuntu/+source/lcov/+bug/1163758
+ lcov --no-external -c -d "$BOOST_ROOT" -o testrun-all.info > /dev/null 2>&1
+ lcov -a baseline.info -a testrun-all.info -o lcov-diff.info > /dev/null
+ lcov -e "lcov-diff.info" "$INC_DIR/*" -o lcov.info > /dev/null
+ lcov --remove "lcov.info" "$INC_DIR/_experimental/*" -o lcov.info > /dev/null
+ ~/.local/bin/codecov -X gcov -f lcov.info
+ find "$BOOST_ROOT" -name "*.gcda" | xargs rm -f
+
+elif [[ $VARIANT == "beast_valgrind" ]]; then
+ run_tests_with_valgrind "$BIN_DIR" fat-tests
+
+else
+ #run_tests_with_debugger "$BIN_DIR" fat-tests
+ run_tests "$BIN_DIR" fat-tests
+
+fi
diff --git a/src/boost/libs/beast/tools/coverage.sh b/src/boost/libs/beast/tools/coverage.sh
new file mode 100755
index 000000000..508e83d6b
--- /dev/null
+++ b/src/boost/libs/beast/tools/coverage.sh
@@ -0,0 +1,9 @@
+#! /bin/bash
+set -e
+lcov --directory bin.v2 --capture --no-external --directory $(pwd) --output-file coverage.info > /dev/null 2>&1
+lcov --extract coverage.info $(pwd)'/boost/beast/*' --output-file coverage.info > /dev/null
+lcov --remove coverage.info $(pwd)'/boost/beast/_experimental/*' --output-file coverage.info > /dev/null
+lcov --list coverage.info
+# Codecov improperly detects project root in AzP, so we need to upload from beast git repo
+cd libs/beast
+curl -s https://codecov.io/bash -o codecov && bash ./codecov -X gcov -f ../../coverage.info -t $CODECOV_TOKEN
diff --git a/src/boost/libs/beast/tools/field.txt b/src/boost/libs/beast/tools/field.txt
new file mode 100644
index 000000000..bc7926ce7
--- /dev/null
+++ b/src/boost/libs/beast/tools/field.txt
@@ -0,0 +1,352 @@
+Accept
+Accept-Additions
+Accept-Charset
+Accept-Datetime
+Accept-Encoding
+Accept-Features
+Accept-Language
+Accept-Patch
+Accept-Post
+Accept-Ranges
+Access-Control
+Access-Control-Allow-Credentials
+Access-Control-Allow-Headers
+Access-Control-Allow-Methods
+Access-Control-Allow-Origin
+Access-Control-Expose-Headers
+Access-Control-Max-Age
+Access-Control-Request-Headers
+Access-Control-Request-Method
+Age
+A-IM
+Allow
+ALPN
+Also-Control
+Alternate-Recipient
+Alternates
+Alt-Svc
+Alt-Used
+Apparently-To
+Apply-To-Redirect-Ref
+Approved
+Archive
+Archived-At
+Article-Names
+Article-Updates
+Authentication-Control
+Authentication-Info
+Authentication-Results
+Authorization
+Autoforwarded
+Autosubmitted
+Auto-Submitted
+Base
+Bcc
+Body
+Cache-Control
+CalDAV-Timezones
+Cancel-Key
+Cancel-Lock
+Cc
+C-Ext
+Close
+C-Man
+Comments
+Compliance
+Connection
+Content-Alternative
+Content-Base
+Content-Description
+Content-Disposition
+Content-Duration
+Content-Encoding
+Content-features
+Content-ID
+Content-Identifier
+Content-Language
+Content-Length
+Content-Location
+Content-MD5
+Content-Range
+Content-Return
+Content-Script-Type
+Content-Style-Type
+Content-Transfer-Encoding
+Content-Type
+Content-Version
+Control
+Conversion
+Conversion-With-Loss
+Cookie
+Cookie2
+C-Opt
+Cost
+C-PEP
+C-PEP-Info
+DASL
+Date
+Date-Received
+DAV
+Default-Style
+Deferred-Delivery
+Delivery-Date
+Delta-Base
+Depth
+Derived-From
+Destination
+Differential-ID
+Digest
+Discarded-X400-IPMS-Extensions
+Discarded-X400-MTS-Extensions
+Disclose-Recipients
+Disposition-Notification-Options
+Disposition-Notification-To
+Distribution
+DKIM-Signature
+DL-Expansion-History
+Downgraded-Bcc
+Downgraded-Cc
+Downgraded-Disposition-Notification-To
+Downgraded-Final-Recipient
+Downgraded-From
+Downgraded-In-Reply-To
+Downgraded-Mail-From
+Downgraded-Message-Id
+Downgraded-Original-Recipient
+Downgraded-Rcpt-To
+Downgraded-References
+Downgraded-Reply-To
+Downgraded-Resent-Bcc
+Downgraded-Resent-Cc
+Downgraded-Resent-From
+Downgraded-Resent-Reply-To
+Downgraded-Resent-Sender
+Downgraded-Resent-To
+Downgraded-Return-Path
+Downgraded-Sender
+Downgraded-To
+EDIINT-Features
+Eesst-Version
+Encoding
+Encrypted
+Errors-To
+ETag
+Expect
+Expires
+Expiry-Date
+Ext
+Followup-To
+Forwarded
+From
+Generate-Delivery-Report
+GetProfile
+Hobareg
+Host
+HTTP2-Settings
+If
+If-Match
+If-Modified-Since
+If-None-Match
+If-Range
+If-Schedule-Tag-Match
+If-Unmodified-Since
+IM
+Importance
+Incomplete-Copy
+Injection-Date
+Injection-Info
+In-Reply-To
+Jabber-ID
+Keep-Alive
+Keywords
+Label
+Language
+Last-Modified
+Latest-Delivery-Time
+Lines
+Link
+List-Archive
+List-Help
+List-ID
+List-Owner
+List-Post
+List-Subscribe
+List-Unsubscribe
+List-Unsubscribe-Post
+Location
+Lock-Token
+Man
+Max-Forwards
+Memento-Datetime
+Message-Context
+Message-ID
+Message-Type
+Meter
+Method-Check
+Method-Check-Expires
+MIME-Version
+MMHS-Acp127-Message-Identifier
+MMHS-Authorizing-Users
+MMHS-Codress-Message-Indicator
+MMHS-Copy-Precedence
+MMHS-Exempted-Address
+MMHS-Extended-Authorisation-Info
+MMHS-Handling-Instructions
+MMHS-Message-Instructions
+MMHS-Message-Type
+MMHS-Originator-PLAD
+MMHS-Originator-Reference
+MMHS-Other-Recipients-Indicator-CC
+MMHS-Other-Recipients-Indicator-To
+MMHS-Primary-Precedence
+MMHS-Subject-Indicator-Codes
+MT-Priority
+Negotiate
+Newsgroups
+NNTP-Posting-Date
+NNTP-Posting-Host
+Non-Compliance
+Obsoletes
+Opt
+Optional
+Optional-WWW-Authenticate
+Ordering-Type
+Organization
+Origin
+Original-Encoded-Information-Types
+Original-From
+Original-Message-ID
+Original-Recipient
+Original-Sender
+Original-Subject
+Originator-Return-Address
+Overwrite
+P3P
+Path
+PEP
+Pep-Info
+PICS-Label
+Position
+Posting-Version
+Pragma
+Prefer
+Preference-Applied
+Prevent-NonDelivery-Report
+Priority
+Privicon
+ProfileObject
+Protocol
+Protocol-Info
+Protocol-Query
+Protocol-Request
+Proxy-Authenticate
+Proxy-Authentication-Info
+Proxy-Authorization
+Proxy-Connection
+Proxy-Features
+Proxy-Instruction
+Public
+Public-Key-Pins
+Public-Key-Pins-Report-Only
+Range
+Received
+Received-SPF
+Redirect-Ref
+References
+Referer
+Referer-Root
+Relay-Version
+Reply-By
+Reply-To
+Require-Recipient-Valid-Since
+Resent-Bcc
+Resent-Cc
+Resent-Date
+Resent-From
+Resent-Message-ID
+Resent-Reply-To
+Resent-Sender
+Resent-To
+Resolution-Hint
+Resolver-Location
+Retry-After
+Return-Path
+Safe
+Schedule-Reply
+Schedule-Tag
+Security-Scheme
+Sec-WebSocket-Accept
+Sec-WebSocket-Extensions
+Sec-WebSocket-Key
+Sec-WebSocket-Protocol
+Sec-WebSocket-Version
+See-Also
+Sender
+Sensitivity
+Server
+Set-Cookie
+Set-Cookie2
+SetProfile
+SIO-Label
+SIO-Label-History
+SLUG
+SoapAction
+Solicitation
+Status-URI
+Strict-Transport-Security
+Subject
+SubOK
+Subst
+Summary
+Supersedes
+Surrogate-Capability
+Surrogate-Control
+TCN
+TE
+Timeout
+Title
+To
+Topic
+Trailer
+Transfer-Encoding
+TTL
+UA-Color
+UA-Media
+UA-Pixels
+UA-Resolution
+UA-Windowpixels
+Upgrade
+Urgency
+URI
+User-Agent
+Variant-Vary
+Vary
+VBR-Info
+Version
+Via
+Want-Digest
+Warning
+WWW-Authenticate
+X400-Content-Identifier
+X400-Content-Return
+X400-Content-Type
+X400-MTS-Identifier
+X400-Originator
+X400-Received
+X400-Recipients
+X400-Trace
+X-Archived-At
+X-Device-Accept
+X-Device-Accept-Charset
+X-Device-Accept-Encoding
+X-Device-Accept-Language
+X-Device-User-Agent
+X-Frame-Options
+X-Mittente
+X-PGP-Sig
+Xref
+X-Ricevuta
+X-Riferimento-Message-ID
+X-TipoRicevuta
+X-Trasporto
+X-VerificaSicurezza
diff --git a/src/boost/libs/beast/tools/get-boost.sh b/src/boost/libs/beast/tools/get-boost.sh
new file mode 100755
index 000000000..c614a486a
--- /dev/null
+++ b/src/boost/libs/beast/tools/get-boost.sh
@@ -0,0 +1,89 @@
+#! /bin/sh
+
+set -e
+
+build_dir=$2
+
+branch="master"
+
+if [ "$1" != "master" -a "$1" != "refs/heads/master" ]; then
+ branch="develop"
+fi
+
+echo "BUILD_DIR: $build_dir"
+echo "BRANCH: $branch"
+
+git clone -b $branch --depth 1 https://github.com/boostorg/boost.git boost-root
+cd boost-root
+
+# Use a reasonably large depth to prevent intermittent update failures due to
+# commits being on a submodule's master before the superproject is updated.
+git submodule update --init --depth 20 --jobs 4 \
+ libs/array \
+ libs/headers \
+ tools/build \
+ tools/boost_install \
+ tools/boostdep \
+ libs/align \
+ libs/asio \
+ libs/assert \
+ libs/config \
+ libs/core \
+ libs/endian \
+ libs/filesystem \
+ libs/intrusive \
+ libs/locale \
+ libs/optional \
+ libs/smart_ptr \
+ libs/static_assert \
+ libs/system \
+ libs/throw_exception \
+ libs/type_traits \
+ libs/utility \
+ libs/winapi \
+ libs/algorithm \
+ libs/array \
+ libs/atomic \
+ libs/bind \
+ libs/chrono \
+ libs/concept_check \
+ libs/container \
+ libs/container_hash \
+ libs/context \
+ libs/conversion \
+ libs/coroutine \
+ libs/date_time \
+ libs/detail \
+ libs/exception \
+ libs/function \
+ libs/function_types \
+ libs/functional \
+ libs/fusion \
+ libs/integer \
+ libs/io \
+ libs/iterator \
+ libs/lambda \
+ libs/lexical_cast \
+ libs/logic \
+ libs/math \
+ libs/move \
+ libs/mp11 \
+ libs/mpl \
+ libs/numeric/conversion \
+ libs/pool \
+ libs/predef \
+ libs/preprocessor \
+ libs/random \
+ libs/range \
+ libs/ratio \
+ libs/rational \
+ libs/thread \
+ libs/tuple \
+ libs/type_index \
+ libs/typeof \
+ libs/unordered
+
+echo Submodule update complete
+
+rm -rf libs/beast
+cp -r $build_dir libs/beast
diff --git a/src/boost/libs/beast/tools/install-dependencies.sh b/src/boost/libs/beast/tools/install-dependencies.sh
new file mode 100755
index 000000000..e865187ba
--- /dev/null
+++ b/src/boost/libs/beast/tools/install-dependencies.sh
@@ -0,0 +1,47 @@
+#!/usr/bin/env bash
+# Exit if anything fails.
+set -eux
+
+HERE=$PWD
+
+# Override gcc version to $GCC_VER.
+# Put an appropriate symlink at the front of the path.
+mkdir -pv $HOME/bin
+for g in gcc g++ gcov gcc-ar gcc-nm gcc-ranlib
+do
+ test -x $( type -p ${g}-$GCC_VER )
+ ln -sv $(type -p ${g}-$GCC_VER) $HOME/bin/${g}
+done
+
+if [[ -n ${CLANG_VER:-} ]]; then
+ # There are cases where the directory exists, but the exe is not available.
+ # Use this workaround for now.
+ if [[ ! -x llvm-${LLVM_VERSION}/bin/llvm-config ]] && [[ -d llvm-${LLVM_VERSION} ]]; then
+ rm -fr llvm-${LLVM_VERSION}
+ fi
+ if [[ ! -d llvm-${LLVM_VERSION} ]]; then
+ mkdir llvm-${LLVM_VERSION}
+ LLVM_URL="http://llvm.org/releases/${LLVM_VERSION}/clang+llvm-${LLVM_VERSION}-x86_64-linux-gnu-ubuntu-14.04.tar.xz"
+ wget -O - ${LLVM_URL} | tar -Jxvf - --strip 1 -C llvm-${LLVM_VERSION}
+ fi
+ llvm-${LLVM_VERSION}/bin/llvm-config --version;
+ export LLVM_CONFIG="llvm-${LLVM_VERSION}/bin/llvm-config";
+fi
+
+# NOTE, changed from PWD -> HOME
+export PATH=$HOME/bin:$PATH
+
+# What versions are we ACTUALLY running?
+if [ -x $HOME/bin/g++ ]; then
+ $HOME/bin/g++ -v
+fi
+if [ -x $HOME/bin/clang ]; then
+ $HOME/bin/clang -v
+fi
+
+# Avoid `spurious errors` caused by ~/.npm permission issues
+# Does it already exist? Who owns? What permissions?
+ls -lah ~/.npm || mkdir ~/.npm
+
+# Make sure we own it
+chown -Rc $USER ~/.npm
diff --git a/src/boost/libs/beast/tools/local-travis.sh b/src/boost/libs/beast/tools/local-travis.sh
new file mode 100755
index 000000000..8dd79da58
--- /dev/null
+++ b/src/boost/libs/beast/tools/local-travis.sh
@@ -0,0 +1,8 @@
+#!/bin/sh
+
+export VARIANT=ubasan
+export TOOLSET=clang
+export TRAVIS=0
+export BOOST_ROOT="`pwd`"
+
+"$1"
diff --git a/src/boost/libs/beast/tools/make_field.sh b/src/boost/libs/beast/tools/make_field.sh
new file mode 100755
index 000000000..8e54c1372
--- /dev/null
+++ b/src/boost/libs/beast/tools/make_field.sh
@@ -0,0 +1,22 @@
+#!/bin/sh
+
+export LC_COLLATE=C
+
+echo "// string constants"
+echo ' "<unknown-field>",'
+cat $1 | sort -f | uniq | sed 's/^/ \"/; s/$/\",/'
+echo
+
+echo "enum class field : unsigned short"
+echo "{"
+echo " unknown = 0,"
+echo
+#cat $1 | uniq | sort -f | sed 's/./\L&/g; s/^/\t/; s/$/,/'
+cat $1 | sort -f | uniq | sed 's/\(.*\)/ \L\1,/; s/-/_/g'
+echo "};"
+echo
+
+echo "// pairs"
+#cat $1 | uniq | sort -f | sed 's/\(.*\)/\tmatch\(field::\L\1, \"\E\1\"\);/; s/-/_/'
+cat $1 | sort -f | uniq | perl -nE 'chomp; $a=lc($_); $a=~s/-/_/g; say " match(field::$a, \"$_\");";' | tr -d "\015"
+
diff --git a/src/boost/libs/beast/tools/retry.sh b/src/boost/libs/beast/tools/retry.sh
new file mode 100755
index 000000000..13b30e8e1
--- /dev/null
+++ b/src/boost/libs/beast/tools/retry.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+for i in {1..3}
+do
+ $1 "${@:2:99}" && exit 0;
+ export BEAST_RETRY="true"
+done
+
+exit 1
diff --git a/src/boost/libs/beast/tools/user-config.jam b/src/boost/libs/beast/tools/user-config.jam
new file mode 100644
index 000000000..215e5adb7
--- /dev/null
+++ b/src/boost/libs/beast/tools/user-config.jam
@@ -0,0 +1,13 @@
+# Used on CI
+
+import os ;
+
+local OPENSSL_ROOT = [ os.environ OPENSSL_ROOT ] ;
+
+project
+ : requirements
+ <include>$(OPENSSL_ROOT)/include
+ <variant>debug:<library-path>$(OPENSSL_ROOT)/lib
+ <target-os>windows<variant>debug:<library-path>$(OPENSSL_ROOT)/debug/lib
+ <variant>release:<library-path>$(OPENSSL_ROOT)/lib
+ ;
diff --git a/src/boost/libs/beast/tools/valgrind.supp b/src/boost/libs/beast/tools/valgrind.supp
new file mode 100644
index 000000000..aa699b741
--- /dev/null
+++ b/src/boost/libs/beast/tools/valgrind.supp
@@ -0,0 +1,31 @@
+{
+ zlib_fill_window_no_init
+ Memcheck:Cond
+ fun:fill_window
+}
+
+{
+ zlib_deflate_fast
+ Memcheck:Cond
+ fun:deflate_fast
+}
+
+{
+ Ignore OpenSSL malloc
+ Memcheck:Leak
+ fun:malloc
+ fun:CRYPTO_malloc
+ obj:*libcrypto*
+}
+{
+ Ignore OpenSSL realloc
+ Memcheck:Leak
+ fun:realloc
+ fun:CRYPTO_realloc
+ obj:*libcrypto*
+}
+{
+ OpenSSL Non-Purify
+ Memcheck:Cond
+ obj:*libcrypto*
+}