passenger 6.0.18 → 6.0.20

Sign up to get free protection for your applications and to get access to all the features.
Files changed (907) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG +48 -2
  3. data/CONTRIBUTORS +2 -0
  4. data/build/integration_tests.rb +2 -1
  5. data/build/test_basics.rb +6 -2
  6. data/dev/copy_boost_headers +77 -61
  7. data/package.json +15 -15
  8. data/src/agent/Core/Config.h +1 -1
  9. data/src/agent/Core/Controller/Config.h +1 -1
  10. data/src/agent/Core/SecurityUpdateChecker.h +4 -4
  11. data/src/agent/Watchdog/Config.h +1 -1
  12. data/src/cxx_supportlib/Constants.h +1 -1
  13. data/src/cxx_supportlib/ServerKit/HttpHeaderParser.h +3 -0
  14. data/src/cxx_supportlib/ServerKit/http_parser.cpp +740 -430
  15. data/src/cxx_supportlib/ServerKit/http_parser.h +156 -34
  16. data/src/cxx_supportlib/vendor-modified/boost/asio/any_completion_executor.hpp +1 -1
  17. data/src/cxx_supportlib/vendor-modified/boost/asio/any_completion_handler.hpp +142 -3
  18. data/src/cxx_supportlib/vendor-modified/boost/asio/any_io_executor.hpp +1 -1
  19. data/src/cxx_supportlib/vendor-modified/boost/asio/append.hpp +1 -1
  20. data/src/cxx_supportlib/vendor-modified/boost/asio/as_tuple.hpp +1 -1
  21. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_allocator.hpp +1 -1
  22. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_cancellation_slot.hpp +2 -2
  23. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_executor.hpp +3 -7
  24. data/src/cxx_supportlib/vendor-modified/boost/asio/associated_immediate_executor.hpp +299 -0
  25. data/src/cxx_supportlib/vendor-modified/boost/asio/associator.hpp +1 -1
  26. data/src/cxx_supportlib/vendor-modified/boost/asio/async_result.hpp +49 -5
  27. data/src/cxx_supportlib/vendor-modified/boost/asio/awaitable.hpp +1 -1
  28. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_datagram_socket.hpp +1 -1
  29. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_deadline_timer.hpp +1 -1
  30. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_file.hpp +1 -1
  31. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_io_object.hpp +1 -1
  32. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_random_access_file.hpp +1 -1
  33. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_raw_socket.hpp +1 -1
  34. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_readable_pipe.hpp +1 -1
  35. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_seq_packet_socket.hpp +1 -1
  36. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_serial_port.hpp +1 -1
  37. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_signal_set.hpp +55 -2
  38. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket.hpp +1 -1
  39. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_acceptor.hpp +9 -5
  40. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_iostream.hpp +1 -1
  41. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_socket_streambuf.hpp +1 -1
  42. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_file.hpp +1 -1
  43. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_stream_socket.hpp +1 -1
  44. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_streambuf.hpp +1 -1
  45. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_streambuf_fwd.hpp +1 -1
  46. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_waitable_timer.hpp +1 -1
  47. data/src/cxx_supportlib/vendor-modified/boost/asio/basic_writable_pipe.hpp +1 -1
  48. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_allocator.hpp +32 -15
  49. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_cancellation_slot.hpp +32 -15
  50. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_executor.hpp +7 -6
  51. data/src/cxx_supportlib/vendor-modified/boost/asio/bind_immediate_executor.hpp +753 -0
  52. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer.hpp +234 -1
  53. data/src/cxx_supportlib/vendor-modified/boost/asio/buffer_registration.hpp +1 -1
  54. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_read_stream.hpp +6 -5
  55. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_read_stream_fwd.hpp +1 -1
  56. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_stream.hpp +6 -6
  57. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_stream_fwd.hpp +1 -1
  58. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_write_stream.hpp +6 -5
  59. data/src/cxx_supportlib/vendor-modified/boost/asio/buffered_write_stream_fwd.hpp +1 -1
  60. data/src/cxx_supportlib/vendor-modified/boost/asio/buffers_iterator.hpp +1 -1
  61. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_signal.hpp +1 -1
  62. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_state.hpp +1 -1
  63. data/src/cxx_supportlib/vendor-modified/boost/asio/cancellation_type.hpp +1 -1
  64. data/src/cxx_supportlib/vendor-modified/boost/asio/co_spawn.hpp +1 -1
  65. data/src/cxx_supportlib/vendor-modified/boost/asio/completion_condition.hpp +1 -1
  66. data/src/cxx_supportlib/vendor-modified/boost/asio/compose.hpp +8 -1
  67. data/src/cxx_supportlib/vendor-modified/boost/asio/connect.hpp +1 -1
  68. data/src/cxx_supportlib/vendor-modified/boost/asio/connect_pipe.hpp +1 -1
  69. data/src/cxx_supportlib/vendor-modified/boost/asio/consign.hpp +1 -1
  70. data/src/cxx_supportlib/vendor-modified/boost/asio/coroutine.hpp +1 -1
  71. data/src/cxx_supportlib/vendor-modified/boost/asio/deadline_timer.hpp +1 -1
  72. data/src/cxx_supportlib/vendor-modified/boost/asio/defer.hpp +19 -12
  73. data/src/cxx_supportlib/vendor-modified/boost/asio/deferred.hpp +184 -57
  74. data/src/cxx_supportlib/vendor-modified/boost/asio/detached.hpp +1 -1
  75. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/array.hpp +1 -1
  76. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/array_fwd.hpp +1 -1
  77. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/assert.hpp +1 -1
  78. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/atomic_count.hpp +1 -1
  79. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/base_from_cancellation_state.hpp +1 -1
  80. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/base_from_completion_cond.hpp +1 -1
  81. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/bind_handler.hpp +1 -1
  82. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/blocking_executor_op.hpp +2 -1
  83. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffer_resize_guard.hpp +1 -1
  84. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffer_sequence_adapter.hpp +1 -1
  85. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/buffered_stream_storage.hpp +1 -1
  86. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/bulk_executor_op.hpp +2 -1
  87. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/call_stack.hpp +1 -1
  88. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/chrono.hpp +1 -1
  89. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/chrono_time_traits.hpp +1 -1
  90. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/completion_handler.hpp +1 -1
  91. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/composed_work.hpp +1 -1
  92. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/concurrency_hint.hpp +1 -1
  93. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/conditionally_enabled_event.hpp +1 -1
  94. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/conditionally_enabled_mutex.hpp +1 -1
  95. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/config.hpp +79 -3
  96. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/consuming_buffers.hpp +1 -1
  97. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/cstddef.hpp +1 -1
  98. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/cstdint.hpp +1 -1
  99. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/date_time_fwd.hpp +1 -1
  100. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/deadline_timer_service.hpp +1 -1
  101. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/dependent_type.hpp +1 -1
  102. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_ops.hpp +1 -1
  103. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_read_op.hpp +39 -1
  104. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/descriptor_write_op.hpp +38 -1
  105. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/dev_poll_reactor.hpp +20 -3
  106. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/epoll_reactor.hpp +20 -3
  107. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/event.hpp +1 -1
  108. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/eventfd_select_interrupter.hpp +1 -1
  109. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/exception.hpp +1 -1
  110. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/executor_function.hpp +1 -1
  111. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/executor_op.hpp +2 -1
  112. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/fd_set_adapter.hpp +1 -1
  113. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/fenced_block.hpp +1 -1
  114. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/functional.hpp +1 -1
  115. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/future.hpp +1 -1
  116. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_arm_fenced_block.hpp +1 -1
  117. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_hppa_fenced_block.hpp +1 -1
  118. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_sync_fenced_block.hpp +1 -1
  119. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/gcc_x86_fenced_block.hpp +1 -1
  120. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/global.hpp +1 -1
  121. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_alloc_helpers.hpp +1 -1
  122. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_cont_helpers.hpp +1 -1
  123. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_invoke_helpers.hpp +1 -1
  124. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_tracking.hpp +1 -1
  125. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_type_requirements.hpp +1 -1
  126. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/handler_work.hpp +33 -1
  127. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/hash_map.hpp +1 -1
  128. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/buffer_sequence_adapter.ipp +1 -1
  129. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/descriptor_ops.ipp +3 -3
  130. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.hpp +2 -2
  131. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/dev_poll_reactor.ipp +13 -4
  132. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/epoll_reactor.hpp +2 -2
  133. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/epoll_reactor.ipp +17 -8
  134. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/eventfd_select_interrupter.ipp +1 -1
  135. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/handler_tracking.ipp +1 -1
  136. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_descriptor_service.ipp +1 -1
  137. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_file_service.ipp +1 -1
  138. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_service.hpp +1 -1
  139. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_service.ipp +69 -35
  140. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/io_uring_socket_service_base.ipp +1 -1
  141. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/kqueue_reactor.hpp +2 -2
  142. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/kqueue_reactor.ipp +15 -6
  143. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/null_event.ipp +1 -1
  144. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/pipe_select_interrupter.ipp +1 -1
  145. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_event.ipp +1 -1
  146. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_mutex.ipp +1 -1
  147. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_serial_port_service.ipp +1 -1
  148. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_thread.ipp +1 -1
  149. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/posix_tss_ptr.ipp +1 -1
  150. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_descriptor_service.ipp +8 -8
  151. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/reactive_socket_service_base.ipp +25 -17
  152. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/resolver_service_base.ipp +1 -1
  153. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/scheduler.ipp +2 -1
  154. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/select_reactor.hpp +2 -2
  155. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/select_reactor.ipp +12 -4
  156. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/service_registry.hpp +1 -1
  157. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/service_registry.ipp +1 -1
  158. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/signal_set_service.ipp +57 -4
  159. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_ops.ipp +1 -1
  160. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/socket_select_interrupter.ipp +1 -1
  161. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_executor_service.hpp +1 -1
  162. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_executor_service.ipp +1 -1
  163. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_service.hpp +1 -1
  164. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/strand_service.ipp +1 -1
  165. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/thread_context.ipp +1 -1
  166. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/throw_error.ipp +1 -1
  167. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/timer_queue_ptime.ipp +1 -1
  168. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/impl/timer_queue_set.ipp +1 -1
  169. data/src/cxx_supportlib/vendor-modified/boost/asio/{impl/defer.hpp → detail/initiate_defer.hpp} +6 -52
  170. data/src/cxx_supportlib/vendor-modified/boost/asio/{impl/dispatch.hpp → detail/initiate_dispatch.hpp} +6 -50
  171. data/src/cxx_supportlib/vendor-modified/boost/asio/{impl/post.hpp → detail/initiate_post.hpp} +6 -52
  172. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_control.hpp +1 -1
  173. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_object_impl.hpp +1 -1
  174. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_read_at_op.hpp +4 -1
  175. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_read_op.hpp +4 -1
  176. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_service.hpp +9 -1
  177. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_write_at_op.hpp +4 -1
  178. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_descriptor_write_op.hpp +4 -1
  179. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_file_service.hpp +2 -3
  180. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_null_buffers_op.hpp +3 -1
  181. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_operation.hpp +1 -1
  182. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_service.hpp +4 -3
  183. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_accept_op.hpp +5 -1
  184. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_connect_op.hpp +3 -1
  185. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recv_op.hpp +4 -1
  186. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recvfrom_op.hpp +4 -1
  187. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_recvmsg_op.hpp +4 -1
  188. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_send_op.hpp +4 -1
  189. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_sendto_op.hpp +4 -1
  190. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_service.hpp +1 -1
  191. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_socket_service_base.hpp +1 -1
  192. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/io_uring_wait_op.hpp +3 -1
  193. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_buffer_sequence.hpp +1 -1
  194. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/is_executor.hpp +1 -1
  195. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/keyword_tss_ptr.hpp +1 -1
  196. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/kqueue_reactor.hpp +20 -3
  197. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/local_free_on_block_exit.hpp +1 -1
  198. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/macos_fenced_block.hpp +1 -1
  199. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/memory.hpp +3 -1
  200. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/mutex.hpp +1 -1
  201. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/non_const_lvalue.hpp +1 -1
  202. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/noncopyable.hpp +1 -1
  203. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_event.hpp +1 -1
  204. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_fenced_block.hpp +1 -1
  205. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_global.hpp +1 -1
  206. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_mutex.hpp +1 -1
  207. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_reactor.hpp +1 -1
  208. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_signal_blocker.hpp +1 -1
  209. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_socket_service.hpp +1 -1
  210. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_static_mutex.hpp +1 -1
  211. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_thread.hpp +1 -1
  212. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/null_tss_ptr.hpp +1 -1
  213. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/object_pool.hpp +1 -1
  214. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/old_win_sdk_compat.hpp +1 -1
  215. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/op_queue.hpp +1 -1
  216. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/operation.hpp +1 -1
  217. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/pipe_select_interrupter.hpp +1 -1
  218. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/pop_options.hpp +1 -1
  219. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_event.hpp +1 -1
  220. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_fd_set_adapter.hpp +1 -1
  221. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_global.hpp +1 -1
  222. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_mutex.hpp +1 -1
  223. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_serial_port_service.hpp +1 -1
  224. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_signal_blocker.hpp +1 -1
  225. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_static_mutex.hpp +1 -1
  226. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_thread.hpp +1 -1
  227. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/posix_tss_ptr.hpp +1 -1
  228. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/push_options.hpp +1 -1
  229. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_descriptor_service.hpp +55 -19
  230. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_null_buffers_op.hpp +35 -1
  231. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_accept_op.hpp +83 -1
  232. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_connect_op.hpp +39 -1
  233. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recv_op.hpp +38 -1
  234. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recvfrom_op.hpp +39 -1
  235. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_recvmsg_op.hpp +39 -1
  236. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_send_op.hpp +39 -1
  237. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_sendto_op.hpp +38 -1
  238. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service.hpp +10 -8
  239. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_socket_service_base.hpp +127 -30
  240. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactive_wait_op.hpp +35 -1
  241. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor.hpp +1 -1
  242. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor_op.hpp +1 -1
  243. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/reactor_op_queue.hpp +1 -1
  244. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/recycling_allocator.hpp +1 -1
  245. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/regex_fwd.hpp +1 -1
  246. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_endpoint_op.hpp +2 -1
  247. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_op.hpp +1 -1
  248. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolve_query_op.hpp +2 -1
  249. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolver_service.hpp +1 -1
  250. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/resolver_service_base.hpp +1 -1
  251. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler.hpp +1 -1
  252. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_operation.hpp +1 -1
  253. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_task.hpp +1 -1
  254. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scheduler_thread_info.hpp +1 -1
  255. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scoped_lock.hpp +1 -1
  256. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/scoped_ptr.hpp +1 -1
  257. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/select_interrupter.hpp +1 -1
  258. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/select_reactor.hpp +20 -3
  259. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/service_registry.hpp +1 -1
  260. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_blocker.hpp +1 -1
  261. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_handler.hpp +1 -1
  262. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_init.hpp +1 -1
  263. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_op.hpp +1 -1
  264. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/signal_set_service.hpp +11 -2
  265. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_holder.hpp +1 -1
  266. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_ops.hpp +1 -1
  267. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_option.hpp +1 -1
  268. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_select_interrupter.hpp +1 -1
  269. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/socket_types.hpp +11 -1
  270. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/solaris_fenced_block.hpp +1 -1
  271. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/source_location.hpp +1 -1
  272. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/static_mutex.hpp +1 -1
  273. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_event.hpp +1 -1
  274. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_fenced_block.hpp +1 -1
  275. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_global.hpp +1 -1
  276. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_mutex.hpp +1 -1
  277. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_static_mutex.hpp +1 -1
  278. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/std_thread.hpp +1 -1
  279. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/strand_executor_service.hpp +1 -1
  280. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/strand_service.hpp +1 -1
  281. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/string_view.hpp +1 -1
  282. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread.hpp +1 -1
  283. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_context.hpp +1 -1
  284. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_group.hpp +1 -1
  285. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/thread_info_base.hpp +1 -1
  286. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/throw_error.hpp +1 -1
  287. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/throw_exception.hpp +1 -1
  288. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue.hpp +1 -1
  289. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_base.hpp +1 -1
  290. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_ptime.hpp +1 -1
  291. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_queue_set.hpp +1 -1
  292. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_scheduler.hpp +1 -1
  293. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/timer_scheduler_fwd.hpp +1 -1
  294. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/tss_ptr.hpp +1 -1
  295. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/type_traits.hpp +1 -1
  296. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/utility.hpp +1 -1
  297. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/variadic_templates.hpp +1 -1
  298. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wait_handler.hpp +1 -1
  299. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wait_op.hpp +1 -1
  300. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/winsock_init.hpp +1 -1
  301. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/work_dispatcher.hpp +1 -1
  302. data/src/cxx_supportlib/vendor-modified/boost/asio/detail/wrapped_handler.hpp +1 -1
  303. data/src/cxx_supportlib/vendor-modified/boost/asio/dispatch.hpp +19 -12
  304. data/src/cxx_supportlib/vendor-modified/boost/asio/error.hpp +1 -1
  305. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/allocator.hpp +1 -1
  306. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/any_executor.hpp +73 -6
  307. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bad_executor.hpp +1 -1
  308. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking.hpp +1 -1
  309. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/blocking_adaptation.hpp +1 -1
  310. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bulk_execute.hpp +1 -1
  311. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/bulk_guarantee.hpp +1 -1
  312. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/connect.hpp +1 -1
  313. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context.hpp +1 -1
  314. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/context_as.hpp +1 -1
  315. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_invocable.hpp +1 -1
  316. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_operation.hpp +1 -1
  317. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/as_receiver.hpp +1 -1
  318. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/bulk_sender.hpp +1 -1
  319. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/submit_receiver.hpp +1 -1
  320. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/detail/void_receiver.hpp +1 -1
  321. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/execute.hpp +1 -1
  322. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/executor.hpp +1 -1
  323. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/impl/bad_executor.ipp +1 -1
  324. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/impl/receiver_invocation_error.ipp +1 -1
  325. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/invocable_archetype.hpp +1 -1
  326. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/mapping.hpp +1 -1
  327. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/occupancy.hpp +1 -1
  328. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/operation_state.hpp +1 -1
  329. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/outstanding_work.hpp +1 -1
  330. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/prefer_only.hpp +1 -1
  331. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/receiver.hpp +1 -1
  332. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/receiver_invocation_error.hpp +1 -1
  333. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/relationship.hpp +1 -1
  334. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/schedule.hpp +1 -1
  335. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/scheduler.hpp +1 -1
  336. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/sender.hpp +1 -1
  337. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_done.hpp +1 -1
  338. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_error.hpp +1 -1
  339. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/set_value.hpp +1 -1
  340. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/start.hpp +1 -1
  341. data/src/cxx_supportlib/vendor-modified/boost/asio/execution/submit.hpp +1 -1
  342. data/src/cxx_supportlib/vendor-modified/boost/asio/execution.hpp +1 -1
  343. data/src/cxx_supportlib/vendor-modified/boost/asio/execution_context.hpp +1 -1
  344. data/src/cxx_supportlib/vendor-modified/boost/asio/executor.hpp +1 -1
  345. data/src/cxx_supportlib/vendor-modified/boost/asio/executor_work_guard.hpp +1 -1
  346. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/append.hpp +1 -1
  347. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/as_single.hpp +1 -1
  348. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/as_tuple.hpp +1 -1
  349. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/awaitable_operators.hpp +1 -1
  350. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_channel.hpp +2 -2
  351. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/basic_concurrent_channel.hpp +2 -2
  352. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/cancellation_condition.hpp +1 -1
  353. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel.hpp +1 -1
  354. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel_error.hpp +1 -1
  355. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/channel_traits.hpp +1 -1
  356. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_composed.hpp +4 -3
  357. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/co_spawn.hpp +1 -1
  358. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/concurrent_channel.hpp +1 -1
  359. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/coro.hpp +1 -1
  360. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/coro_traits.hpp +1 -1
  361. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/deferred.hpp +1 -1
  362. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_handler.hpp +1 -1
  363. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_message.hpp +10 -3
  364. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_operation.hpp +87 -9
  365. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_payload.hpp +65 -19
  366. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_receive_op.hpp +11 -3
  367. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_functions.hpp +13 -1
  368. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_send_op.hpp +10 -2
  369. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/channel_service.hpp +3 -3
  370. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_completion_handler.hpp +3 -3
  371. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/coro_promise_allocator.hpp +1 -1
  372. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/has_signature.hpp +1 -1
  373. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/impl/channel_service.hpp +11 -8
  374. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/detail/partial_promise.hpp +1 -1
  375. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/as_single.hpp +1 -1
  376. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/channel_error.ipp +1 -1
  377. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/co_composed.hpp +47 -4
  378. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/coro.hpp +34 -31
  379. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/parallel_group.hpp +1 -1
  380. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/promise.hpp +15 -2
  381. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/use_coro.hpp +5 -5
  382. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/impl/use_promise.hpp +1 -1
  383. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/parallel_group.hpp +1 -1
  384. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/prepend.hpp +1 -1
  385. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/promise.hpp +1 -1
  386. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_coro.hpp +1 -1
  387. data/src/cxx_supportlib/vendor-modified/boost/asio/experimental/use_promise.hpp +2 -2
  388. data/src/cxx_supportlib/vendor-modified/boost/asio/file_base.hpp +1 -1
  389. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/basic_endpoint.hpp +1 -1
  390. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/datagram_protocol.hpp +1 -1
  391. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/detail/endpoint.hpp +1 -1
  392. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/detail/impl/endpoint.ipp +1 -1
  393. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/raw_protocol.hpp +1 -1
  394. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/seq_packet_protocol.hpp +1 -1
  395. data/src/cxx_supportlib/vendor-modified/boost/asio/generic/stream_protocol.hpp +1 -1
  396. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_alloc_hook.hpp +1 -1
  397. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_continuation_hook.hpp +1 -1
  398. data/src/cxx_supportlib/vendor-modified/boost/asio/handler_invoke_hook.hpp +1 -1
  399. data/src/cxx_supportlib/vendor-modified/boost/asio/high_resolution_timer.hpp +1 -1
  400. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/any_completion_executor.ipp +1 -1
  401. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/any_io_executor.ipp +1 -1
  402. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/append.hpp +1 -1
  403. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/as_tuple.hpp +78 -11
  404. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/awaitable.hpp +46 -6
  405. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/buffered_read_stream.hpp +1 -1
  406. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/buffered_write_stream.hpp +1 -1
  407. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/cancellation_signal.ipp +1 -1
  408. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/co_spawn.hpp +92 -50
  409. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect.hpp +1 -1
  410. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect_pipe.hpp +1 -1
  411. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/connect_pipe.ipp +1 -1
  412. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/consign.hpp +1 -1
  413. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/deferred.hpp +58 -7
  414. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/detached.hpp +1 -1
  415. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/error.ipp +1 -1
  416. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/execution_context.hpp +1 -1
  417. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/execution_context.ipp +1 -1
  418. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/executor.hpp +1 -1
  419. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/executor.ipp +1 -1
  420. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/handler_alloc_hook.ipp +1 -1
  421. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.hpp +1 -1
  422. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/io_context.ipp +2 -1
  423. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/multiple_exceptions.ipp +1 -1
  424. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/prepend.hpp +1 -1
  425. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read.hpp +1 -1
  426. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_at.hpp +1 -1
  427. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/read_until.hpp +1 -1
  428. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/redirect_error.hpp +47 -31
  429. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/serial_port_base.hpp +1 -1
  430. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/serial_port_base.ipp +1 -1
  431. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/spawn.hpp +3 -3
  432. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/src.hpp +1 -1
  433. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_context.hpp +1 -1
  434. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_context.ipp +1 -1
  435. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/system_executor.hpp +1 -1
  436. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/thread_pool.hpp +1 -1
  437. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/thread_pool.ipp +5 -4
  438. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_awaitable.hpp +1 -1
  439. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/use_future.hpp +3 -3
  440. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write.hpp +1 -1
  441. data/src/cxx_supportlib/vendor-modified/boost/asio/impl/write_at.hpp +1 -1
  442. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context.hpp +1 -1
  443. data/src/cxx_supportlib/vendor-modified/boost/asio/io_context_strand.hpp +1 -1
  444. data/src/cxx_supportlib/vendor-modified/boost/asio/io_service.hpp +1 -1
  445. data/src/cxx_supportlib/vendor-modified/boost/asio/io_service_strand.hpp +1 -1
  446. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address.hpp +1 -1
  447. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4.hpp +4 -3
  448. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4_iterator.hpp +1 -1
  449. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v4_range.hpp +1 -1
  450. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6.hpp +1 -1
  451. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6_iterator.hpp +1 -1
  452. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/address_v6_range.hpp +1 -1
  453. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/bad_address_cast.hpp +11 -1
  454. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_endpoint.hpp +1 -1
  455. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver.hpp +1 -1
  456. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_entry.hpp +1 -1
  457. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_iterator.hpp +1 -1
  458. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_query.hpp +1 -1
  459. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/basic_resolver_results.hpp +1 -1
  460. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/endpoint.hpp +1 -1
  461. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/impl/endpoint.ipp +1 -1
  462. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/detail/socket_option.hpp +1 -1
  463. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/host_name.hpp +1 -1
  464. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/icmp.hpp +1 -1
  465. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address.hpp +1 -1
  466. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address.ipp +1 -1
  467. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v4.hpp +1 -1
  468. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v4.ipp +1 -1
  469. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.hpp +1 -1
  470. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/address_v6.ipp +1 -1
  471. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/basic_endpoint.hpp +1 -1
  472. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/host_name.ipp +1 -1
  473. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v4.hpp +1 -1
  474. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v4.ipp +1 -1
  475. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v6.hpp +1 -1
  476. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/impl/network_v6.ipp +1 -1
  477. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/multicast.hpp +1 -1
  478. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/network_v4.hpp +1 -1
  479. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/network_v6.hpp +1 -1
  480. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/resolver_base.hpp +1 -1
  481. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/resolver_query_base.hpp +1 -1
  482. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/tcp.hpp +1 -1
  483. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/udp.hpp +1 -1
  484. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/unicast.hpp +1 -1
  485. data/src/cxx_supportlib/vendor-modified/boost/asio/ip/v6_only.hpp +1 -1
  486. data/src/cxx_supportlib/vendor-modified/boost/asio/is_applicable_property.hpp +1 -1
  487. data/src/cxx_supportlib/vendor-modified/boost/asio/is_contiguous_iterator.hpp +1 -1
  488. data/src/cxx_supportlib/vendor-modified/boost/asio/is_executor.hpp +1 -1
  489. data/src/cxx_supportlib/vendor-modified/boost/asio/is_read_buffered.hpp +1 -1
  490. data/src/cxx_supportlib/vendor-modified/boost/asio/is_write_buffered.hpp +1 -1
  491. data/src/cxx_supportlib/vendor-modified/boost/asio/local/basic_endpoint.hpp +1 -1
  492. data/src/cxx_supportlib/vendor-modified/boost/asio/local/connect_pair.hpp +1 -1
  493. data/src/cxx_supportlib/vendor-modified/boost/asio/local/datagram_protocol.hpp +1 -1
  494. data/src/cxx_supportlib/vendor-modified/boost/asio/local/detail/endpoint.hpp +1 -1
  495. data/src/cxx_supportlib/vendor-modified/boost/asio/local/detail/impl/endpoint.ipp +1 -1
  496. data/src/cxx_supportlib/vendor-modified/boost/asio/local/seq_packet_protocol.hpp +86 -0
  497. data/src/cxx_supportlib/vendor-modified/boost/asio/local/stream_protocol.hpp +1 -1
  498. data/src/cxx_supportlib/vendor-modified/boost/asio/multiple_exceptions.hpp +1 -1
  499. data/src/cxx_supportlib/vendor-modified/boost/asio/packaged_task.hpp +1 -1
  500. data/src/cxx_supportlib/vendor-modified/boost/asio/placeholders.hpp +1 -1
  501. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_descriptor.hpp +1 -1
  502. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/basic_stream_descriptor.hpp +1 -1
  503. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/descriptor.hpp +1 -1
  504. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/descriptor_base.hpp +1 -1
  505. data/src/cxx_supportlib/vendor-modified/boost/asio/posix/stream_descriptor.hpp +1 -1
  506. data/src/cxx_supportlib/vendor-modified/boost/asio/post.hpp +19 -12
  507. data/src/cxx_supportlib/vendor-modified/boost/asio/prefer.hpp +1 -1
  508. data/src/cxx_supportlib/vendor-modified/boost/asio/prepend.hpp +1 -1
  509. data/src/cxx_supportlib/vendor-modified/boost/asio/query.hpp +1 -1
  510. data/src/cxx_supportlib/vendor-modified/boost/asio/random_access_file.hpp +1 -1
  511. data/src/cxx_supportlib/vendor-modified/boost/asio/read.hpp +1 -1
  512. data/src/cxx_supportlib/vendor-modified/boost/asio/read_at.hpp +1 -1
  513. data/src/cxx_supportlib/vendor-modified/boost/asio/read_until.hpp +1 -1
  514. data/src/cxx_supportlib/vendor-modified/boost/asio/readable_pipe.hpp +1 -1
  515. data/src/cxx_supportlib/vendor-modified/boost/asio/recycling_allocator.hpp +1 -1
  516. data/src/cxx_supportlib/vendor-modified/boost/asio/redirect_error.hpp +1 -1
  517. data/src/cxx_supportlib/vendor-modified/boost/asio/registered_buffer.hpp +1 -1
  518. data/src/cxx_supportlib/vendor-modified/boost/asio/require.hpp +1 -1
  519. data/src/cxx_supportlib/vendor-modified/boost/asio/require_concept.hpp +1 -1
  520. data/src/cxx_supportlib/vendor-modified/boost/asio/serial_port.hpp +1 -1
  521. data/src/cxx_supportlib/vendor-modified/boost/asio/serial_port_base.hpp +1 -1
  522. data/src/cxx_supportlib/vendor-modified/boost/asio/signal_set.hpp +1 -1
  523. data/src/cxx_supportlib/vendor-modified/boost/asio/signal_set_base.hpp +184 -0
  524. data/src/cxx_supportlib/vendor-modified/boost/asio/socket_base.hpp +1 -1
  525. data/src/cxx_supportlib/vendor-modified/boost/asio/spawn.hpp +1 -1
  526. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context.hpp +1 -1
  527. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/context_base.hpp +24 -24
  528. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/buffered_handshake_op.hpp +1 -1
  529. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/engine.hpp +1 -1
  530. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/handshake_op.hpp +1 -1
  531. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/engine.ipp +1 -1
  532. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/impl/openssl_init.ipp +1 -1
  533. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/io.hpp +1 -1
  534. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/openssl_init.hpp +1 -1
  535. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/openssl_types.hpp +1 -1
  536. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/password_callback.hpp +1 -1
  537. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/read_op.hpp +1 -1
  538. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/shutdown_op.hpp +1 -1
  539. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/stream_core.hpp +1 -1
  540. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/verify_callback.hpp +1 -1
  541. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/detail/write_op.hpp +1 -1
  542. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/error.hpp +1 -1
  543. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/host_name_verification.hpp +1 -1
  544. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.hpp +1 -1
  545. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/context.ipp +1 -1
  546. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/error.ipp +1 -1
  547. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/host_name_verification.ipp +1 -1
  548. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/rfc2818_verification.ipp +1 -1
  549. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/impl/src.hpp +1 -1
  550. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/rfc2818_verification.hpp +1 -1
  551. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream.hpp +1 -1
  552. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/stream_base.hpp +1 -1
  553. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/verify_context.hpp +1 -1
  554. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl/verify_mode.hpp +1 -1
  555. data/src/cxx_supportlib/vendor-modified/boost/asio/ssl.hpp +1 -1
  556. data/src/cxx_supportlib/vendor-modified/boost/asio/static_thread_pool.hpp +1 -1
  557. data/src/cxx_supportlib/vendor-modified/boost/asio/steady_timer.hpp +1 -1
  558. data/src/cxx_supportlib/vendor-modified/boost/asio/strand.hpp +1 -1
  559. data/src/cxx_supportlib/vendor-modified/boost/asio/stream_file.hpp +1 -1
  560. data/src/cxx_supportlib/vendor-modified/boost/asio/streambuf.hpp +1 -1
  561. data/src/cxx_supportlib/vendor-modified/boost/asio/system_context.hpp +1 -1
  562. data/src/cxx_supportlib/vendor-modified/boost/asio/system_executor.hpp +1 -1
  563. data/src/cxx_supportlib/vendor-modified/boost/asio/system_timer.hpp +1 -1
  564. data/src/cxx_supportlib/vendor-modified/boost/asio/this_coro.hpp +3 -3
  565. data/src/cxx_supportlib/vendor-modified/boost/asio/thread_pool.hpp +1 -1
  566. data/src/cxx_supportlib/vendor-modified/boost/asio/time_traits.hpp +1 -1
  567. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/bulk_execute_free.hpp +1 -1
  568. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/bulk_execute_member.hpp +1 -1
  569. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/connect_free.hpp +1 -1
  570. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/connect_member.hpp +1 -1
  571. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/equality_comparable.hpp +1 -1
  572. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/execute_free.hpp +1 -1
  573. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/execute_member.hpp +1 -1
  574. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/prefer_free.hpp +1 -1
  575. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/prefer_member.hpp +1 -1
  576. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_free.hpp +1 -1
  577. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_member.hpp +1 -1
  578. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/query_static_constexpr_member.hpp +1 -1
  579. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_concept_free.hpp +1 -1
  580. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_concept_member.hpp +1 -1
  581. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_free.hpp +1 -1
  582. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/require_member.hpp +1 -1
  583. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/schedule_free.hpp +1 -1
  584. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/schedule_member.hpp +1 -1
  585. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_done_free.hpp +1 -1
  586. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_done_member.hpp +1 -1
  587. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_error_free.hpp +1 -1
  588. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_error_member.hpp +1 -1
  589. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_value_free.hpp +1 -1
  590. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/set_value_member.hpp +1 -1
  591. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/start_free.hpp +1 -1
  592. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/start_member.hpp +1 -1
  593. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_query.hpp +1 -1
  594. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_require.hpp +1 -1
  595. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/static_require_concept.hpp +1 -1
  596. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/submit_free.hpp +1 -1
  597. data/src/cxx_supportlib/vendor-modified/boost/asio/traits/submit_member.hpp +1 -1
  598. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/buffer.hpp +1 -1
  599. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/executor.hpp +1 -1
  600. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/internet.hpp +1 -1
  601. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/io_context.hpp +1 -1
  602. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/net.hpp +1 -1
  603. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/netfwd.hpp +1 -1
  604. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/socket.hpp +1 -1
  605. data/src/cxx_supportlib/vendor-modified/boost/asio/ts/timer.hpp +1 -1
  606. data/src/cxx_supportlib/vendor-modified/boost/asio/unyield.hpp +1 -1
  607. data/src/cxx_supportlib/vendor-modified/boost/asio/use_awaitable.hpp +1 -1
  608. data/src/cxx_supportlib/vendor-modified/boost/asio/use_future.hpp +1 -1
  609. data/src/cxx_supportlib/vendor-modified/boost/asio/uses_executor.hpp +1 -1
  610. data/src/cxx_supportlib/vendor-modified/boost/asio/version.hpp +2 -2
  611. data/src/cxx_supportlib/vendor-modified/boost/asio/wait_traits.hpp +1 -1
  612. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_object_handle.hpp +1 -1
  613. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_overlapped_handle.hpp +1 -1
  614. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_random_access_handle.hpp +1 -1
  615. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/basic_stream_handle.hpp +1 -1
  616. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/object_handle.hpp +1 -1
  617. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/overlapped_handle.hpp +1 -1
  618. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/overlapped_ptr.hpp +1 -1
  619. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/random_access_handle.hpp +1 -1
  620. data/src/cxx_supportlib/vendor-modified/boost/asio/windows/stream_handle.hpp +1 -1
  621. data/src/cxx_supportlib/vendor-modified/boost/asio/writable_pipe.hpp +1 -1
  622. data/src/cxx_supportlib/vendor-modified/boost/asio/write.hpp +1 -1
  623. data/src/cxx_supportlib/vendor-modified/boost/asio/write_at.hpp +1 -1
  624. data/src/cxx_supportlib/vendor-modified/boost/asio/yield.hpp +1 -1
  625. data/src/cxx_supportlib/vendor-modified/boost/asio.hpp +6 -2
  626. data/src/cxx_supportlib/vendor-modified/boost/assert/source_location.hpp +4 -1
  627. data/src/cxx_supportlib/vendor-modified/boost/atomic/atomic.hpp +0 -13
  628. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/atomic_ref_impl.hpp +4 -2
  629. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/bitwise_cast.hpp +6 -4
  630. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/config.hpp +0 -49
  631. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_gcc_x86.hpp +107 -40
  632. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/core_arch_ops_msvc_x86.hpp +32 -5
  633. data/src/cxx_supportlib/vendor-modified/boost/atomic/detail/type_traits/remove_cv.hpp +42 -0
  634. data/src/cxx_supportlib/vendor-modified/boost/bind/apply.hpp +1 -0
  635. data/src/cxx_supportlib/vendor-modified/boost/bind/bind.hpp +4 -3
  636. data/src/cxx_supportlib/vendor-modified/boost/bind/bind_mf_cc.hpp +18 -18
  637. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/is_same.hpp +36 -0
  638. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/requires_cxx11.hpp +22 -0
  639. data/src/cxx_supportlib/vendor-modified/boost/bind/detail/result_traits.hpp +1 -0
  640. data/src/cxx_supportlib/vendor-modified/boost/bind/mem_fn.hpp +3 -2
  641. data/src/cxx_supportlib/vendor-modified/boost/bind/protect.hpp +1 -0
  642. data/src/cxx_supportlib/vendor-modified/boost/bind/std_placeholders.hpp +1 -0
  643. data/src/cxx_supportlib/vendor-modified/boost/bind/storage.hpp +1 -0
  644. data/src/cxx_supportlib/vendor-modified/boost/chrono/config.hpp +1 -0
  645. data/src/cxx_supportlib/vendor-modified/boost/chrono/detail/requires_cxx11.hpp +23 -0
  646. data/src/cxx_supportlib/vendor-modified/boost/chrono/duration.hpp +1 -1
  647. data/src/cxx_supportlib/vendor-modified/boost/chrono/io/duration_get.hpp +1 -1
  648. data/src/cxx_supportlib/vendor-modified/boost/chrono/io_v1/chrono_io.hpp +3 -3
  649. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/borland.hpp +1 -0
  650. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/clang.hpp +4 -0
  651. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/codegear.hpp +1 -0
  652. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/common_edg.hpp +1 -0
  653. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/cray.hpp +1 -0
  654. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/digitalmars.hpp +1 -0
  655. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc.hpp +1 -0
  656. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/gcc_xml.hpp +1 -0
  657. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/hp_acc.hpp +1 -0
  658. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/intel.hpp +1 -0
  659. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/metrowerks.hpp +1 -0
  660. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/mpw.hpp +1 -0
  661. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/pathscale.hpp +1 -0
  662. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/sunpro_cc.hpp +1 -0
  663. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/vacpp.hpp +1 -0
  664. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/visualc.hpp +6 -3
  665. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp.hpp +4 -0
  666. data/src/cxx_supportlib/vendor-modified/boost/config/compiler/xlcpp_zos.hpp +1 -0
  667. data/src/cxx_supportlib/vendor-modified/boost/config/detail/suffix.hpp +16 -0
  668. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/dinkumware.hpp +32 -0
  669. data/src/cxx_supportlib/vendor-modified/boost/config/stdlib/libstdcpp3.hpp +16 -1
  670. data/src/cxx_supportlib/vendor-modified/boost/container/container_fwd.hpp +0 -29
  671. data/src/cxx_supportlib/vendor-modified/boost/container/deque.hpp +32 -33
  672. data/src/cxx_supportlib/vendor-modified/boost/container/detail/adaptive_node_pool_impl.hpp +4 -5
  673. data/src/cxx_supportlib/vendor-modified/boost/container/detail/advanced_insert_int.hpp +8 -9
  674. data/src/cxx_supportlib/vendor-modified/boost/container/detail/allocator_version_traits.hpp +14 -15
  675. data/src/cxx_supportlib/vendor-modified/boost/container/detail/config_begin.hpp +1 -0
  676. data/src/cxx_supportlib/vendor-modified/boost/container/detail/copy_move_algo.hpp +41 -44
  677. data/src/cxx_supportlib/vendor-modified/boost/container/detail/dispatch_uses_allocator.hpp +32 -34
  678. data/src/cxx_supportlib/vendor-modified/boost/container/detail/flat_tree.hpp +36 -24
  679. data/src/cxx_supportlib/vendor-modified/boost/container/detail/mutex.hpp +48 -12
  680. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_alloc_holder.hpp +12 -14
  681. data/src/cxx_supportlib/vendor-modified/boost/container/detail/node_pool_impl.hpp +10 -11
  682. data/src/cxx_supportlib/vendor-modified/boost/container/detail/placement_new.hpp +0 -8
  683. data/src/cxx_supportlib/vendor-modified/boost/container/detail/tree.hpp +6 -7
  684. data/src/cxx_supportlib/vendor-modified/boost/container/detail/workaround.hpp +33 -0
  685. data/src/cxx_supportlib/vendor-modified/boost/container/devector.hpp +3 -7
  686. data/src/cxx_supportlib/vendor-modified/boost/container/flat_map.hpp +0 -2
  687. data/src/cxx_supportlib/vendor-modified/boost/container/flat_set.hpp +1 -1
  688. data/src/cxx_supportlib/vendor-modified/boost/container/map.hpp +0 -1
  689. data/src/cxx_supportlib/vendor-modified/boost/container/node_handle.hpp +11 -9
  690. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/memory_resource.hpp +1 -1
  691. data/src/cxx_supportlib/vendor-modified/boost/container/pmr/polymorphic_allocator.hpp +1 -0
  692. data/src/cxx_supportlib/vendor-modified/boost/container/scoped_allocator.hpp +0 -2
  693. data/src/cxx_supportlib/vendor-modified/boost/container/slist.hpp +0 -2
  694. data/src/cxx_supportlib/vendor-modified/boost/container/small_vector.hpp +35 -16
  695. data/src/cxx_supportlib/vendor-modified/boost/container/stable_vector.hpp +8 -9
  696. data/src/cxx_supportlib/vendor-modified/boost/container/string.hpp +23 -12
  697. data/src/cxx_supportlib/vendor-modified/boost/container/throw_exception.hpp +4 -5
  698. data/src/cxx_supportlib/vendor-modified/boost/container/vector.hpp +101 -37
  699. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_range.hpp +285 -48
  700. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_tuple_like.hpp +156 -0
  701. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/mulx.hpp +79 -0
  702. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/requires_cxx11.hpp +22 -0
  703. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash.hpp +17 -2
  704. data/src/cxx_supportlib/vendor-modified/boost/container_hash/hash_fwd.hpp +1 -0
  705. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_contiguous_range.hpp +1 -0
  706. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_range.hpp +1 -0
  707. data/src/cxx_supportlib/vendor-modified/boost/container_hash/is_tuple_like.hpp +42 -0
  708. data/src/cxx_supportlib/vendor-modified/boost/core/alignof.hpp +57 -0
  709. data/src/cxx_supportlib/vendor-modified/boost/core/allocator_access.hpp +4 -4
  710. data/src/cxx_supportlib/vendor-modified/boost/core/bit.hpp +344 -31
  711. data/src/cxx_supportlib/vendor-modified/boost/core/checked_delete.hpp +20 -3
  712. data/src/cxx_supportlib/vendor-modified/boost/core/data.hpp +46 -0
  713. data/src/cxx_supportlib/vendor-modified/boost/core/detail/is_same.hpp +39 -0
  714. data/src/cxx_supportlib/vendor-modified/boost/core/detail/lwt_unattended.hpp +66 -0
  715. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_pause.hpp +71 -0
  716. data/src/cxx_supportlib/vendor-modified/boost/{smart_ptr → core}/detail/sp_thread_sleep.hpp +39 -21
  717. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_thread_yield.hpp +100 -0
  718. data/src/cxx_supportlib/vendor-modified/boost/core/detail/sp_win32_sleep.hpp +54 -0
  719. data/src/cxx_supportlib/vendor-modified/boost/core/detail/string_view.hpp +6 -6
  720. data/src/cxx_supportlib/vendor-modified/boost/core/identity.hpp +61 -0
  721. data/src/cxx_supportlib/vendor-modified/boost/core/is_same.hpp +10 -15
  722. data/src/cxx_supportlib/vendor-modified/boost/core/launder.hpp +55 -0
  723. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test.hpp +33 -36
  724. data/src/cxx_supportlib/vendor-modified/boost/core/lightweight_test_trait.hpp +3 -3
  725. data/src/cxx_supportlib/vendor-modified/boost/core/make_span.hpp +59 -0
  726. data/src/cxx_supportlib/vendor-modified/boost/core/max_align.hpp +82 -0
  727. data/src/cxx_supportlib/vendor-modified/boost/core/memory_resource.hpp +108 -0
  728. data/src/cxx_supportlib/vendor-modified/boost/core/ref.hpp +23 -16
  729. data/src/cxx_supportlib/vendor-modified/boost/core/serialization.hpp +131 -0
  730. data/src/cxx_supportlib/vendor-modified/boost/core/size.hpp +31 -0
  731. data/src/cxx_supportlib/vendor-modified/boost/core/snprintf.hpp +173 -0
  732. data/src/cxx_supportlib/vendor-modified/boost/core/span.hpp +17 -17
  733. data/src/cxx_supportlib/vendor-modified/boost/core/swap.hpp +27 -8
  734. data/src/cxx_supportlib/vendor-modified/boost/core/type_name.hpp +29 -5
  735. data/src/cxx_supportlib/vendor-modified/boost/core/yield_primitives.hpp +12 -0
  736. data/src/cxx_supportlib/vendor-modified/boost/describe/members.hpp +2 -0
  737. data/src/cxx_supportlib/vendor-modified/boost/exception/detail/exception_ptr.hpp +20 -8
  738. data/src/cxx_supportlib/vendor-modified/boost/exception/diagnostic_information.hpp +3 -3
  739. data/src/cxx_supportlib/vendor-modified/boost/exception/to_string.hpp +1 -1
  740. data/src/cxx_supportlib/vendor-modified/boost/function/detail/epilogue.hpp +39 -0
  741. data/src/cxx_supportlib/vendor-modified/boost/function/detail/prologue.hpp +1 -0
  742. data/src/cxx_supportlib/vendor-modified/boost/function/detail/requires_cxx11.hpp +22 -0
  743. data/src/cxx_supportlib/vendor-modified/boost/function/function_base.hpp +28 -32
  744. data/src/cxx_supportlib/vendor-modified/boost/function/function_template.hpp +10 -2
  745. data/src/cxx_supportlib/vendor-modified/boost/function.hpp +2 -0
  746. data/src/cxx_supportlib/vendor-modified/boost/intrusive/circular_list_algorithms.hpp +5 -5
  747. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/array_initializer.hpp +5 -5
  748. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/common_slist_algorithms.hpp +5 -5
  749. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/hook_traits.hpp +1 -0
  750. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/slist_iterator.hpp +1 -0
  751. data/src/cxx_supportlib/vendor-modified/boost/intrusive/detail/workaround.hpp +26 -0
  752. data/src/cxx_supportlib/vendor-modified/boost/intrusive/list.hpp +1 -1
  753. data/src/cxx_supportlib/vendor-modified/boost/intrusive/slist.hpp +1 -1
  754. data/src/cxx_supportlib/vendor-modified/boost/iterator/detail/facade_iterator_category.hpp +10 -11
  755. data/src/cxx_supportlib/vendor-modified/boost/iterator/is_iterator.hpp +148 -0
  756. data/src/cxx_supportlib/vendor-modified/boost/iterator/iterator_concepts.hpp +2 -2
  757. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/bad_lexical_cast.hpp +1 -1
  758. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical.hpp +1 -1
  759. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_lexical_streams.hpp +5 -16
  760. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/converter_numeric.hpp +1 -1
  761. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/inf_nan.hpp +1 -1
  762. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/is_character.hpp +1 -1
  763. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_char_constants.hpp +1 -1
  764. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/lcast_unsigned_converters.hpp +1 -1
  765. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/detail/widest_char.hpp +1 -1
  766. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast/try_lexical_convert.hpp +1 -1
  767. data/src/cxx_supportlib/vendor-modified/boost/lexical_cast.hpp +19 -1
  768. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/posix_api.cpp +10 -18
  769. data/src/cxx_supportlib/vendor-modified/boost/libs/regex/src/wide_posix_api.cpp +13 -14
  770. data/src/cxx_supportlib/vendor-modified/boost/limits.hpp +12 -12
  771. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_merge.hpp +4 -3
  772. data/src/cxx_supportlib/vendor-modified/boost/move/algo/adaptive_sort.hpp +19 -19
  773. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/adaptive_sort_merge.hpp +36 -37
  774. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/basic_op.hpp +1 -0
  775. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/heap_sort.hpp +2 -1
  776. data/src/cxx_supportlib/vendor-modified/boost/move/algo/detail/merge.hpp +17 -19
  777. data/src/cxx_supportlib/vendor-modified/boost/move/algo/move.hpp +4 -5
  778. data/src/cxx_supportlib/vendor-modified/boost/move/algo/predicate.hpp +1 -1
  779. data/src/cxx_supportlib/vendor-modified/boost/move/algorithm.hpp +0 -1
  780. data/src/cxx_supportlib/vendor-modified/boost/move/default_delete.hpp +5 -6
  781. data/src/cxx_supportlib/vendor-modified/boost/move/detail/nsec_clock.hpp +65 -24
  782. data/src/cxx_supportlib/vendor-modified/boost/move/detail/type_traits.hpp +5 -6
  783. data/src/cxx_supportlib/vendor-modified/boost/move/detail/workaround.hpp +77 -0
  784. data/src/cxx_supportlib/vendor-modified/boost/move/unique_ptr.hpp +17 -18
  785. data/src/cxx_supportlib/vendor-modified/boost/move/utility.hpp +2 -2
  786. data/src/cxx_supportlib/vendor-modified/boost/move/utility_core.hpp +8 -6
  787. data/src/cxx_supportlib/vendor-modified/boost/mp11/algorithm.hpp +38 -17
  788. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/config.hpp +11 -0
  789. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_append.hpp +140 -4
  790. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_defer.hpp +119 -0
  791. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_fold.hpp +105 -3
  792. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_front.hpp +13 -1
  793. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_is_value_list.hpp +41 -0
  794. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_list_v.hpp +27 -0
  795. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_map_find.hpp +1 -1
  796. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_plus.hpp +4 -1
  797. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_rename.hpp +18 -5
  798. data/src/cxx_supportlib/vendor-modified/boost/mp11/detail/mp_value.hpp +25 -0
  799. data/src/cxx_supportlib/vendor-modified/boost/mp11/integral.hpp +1 -0
  800. data/src/cxx_supportlib/vendor-modified/boost/mp11/list.hpp +171 -3
  801. data/src/cxx_supportlib/vendor-modified/boost/mp11/utility.hpp +2 -96
  802. data/src/cxx_supportlib/vendor-modified/boost/mp11/version.hpp +1 -1
  803. data/src/cxx_supportlib/vendor-modified/boost/mpl/assert.hpp +3 -3
  804. data/src/cxx_supportlib/vendor-modified/boost/next_prior.hpp +3 -44
  805. data/src/cxx_supportlib/vendor-modified/boost/nondet_random.hpp +22 -0
  806. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/old_optional_implementation.hpp +3 -3
  807. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_config.hpp +3 -3
  808. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_reference_spec.hpp +2 -2
  809. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_relops.hpp +1 -1
  810. data/src/cxx_supportlib/vendor-modified/boost/optional/detail/optional_trivially_copyable_base.hpp +3 -3
  811. data/src/cxx_supportlib/vendor-modified/boost/optional/optional.hpp +2 -2
  812. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/tag_keyword_arg_ref.hpp +2 -2
  813. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/pack/unmatched_argument.hpp +1 -1
  814. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/preprocessor/overloads.hpp +1 -1
  815. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/tag.hpp +4 -4
  816. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/unwrap_cv_reference.hpp +1 -1
  817. data/src/cxx_supportlib/vendor-modified/boost/parameter/aux_/void.hpp +1 -1
  818. data/src/cxx_supportlib/vendor-modified/boost/parameter/binding.hpp +3 -3
  819. data/src/cxx_supportlib/vendor-modified/boost/parameter/match.hpp +1 -1
  820. data/src/cxx_supportlib/vendor-modified/boost/parameter/template_keyword.hpp +1 -1
  821. data/src/cxx_supportlib/vendor-modified/boost/parameter/value_type.hpp +3 -3
  822. data/src/cxx_supportlib/vendor-modified/boost/pool/simple_segregated_storage.hpp +13 -0
  823. data/src/cxx_supportlib/vendor-modified/boost/ratio/config.hpp +7 -2
  824. data/src/cxx_supportlib/vendor-modified/boost/ratio/detail/requires_cxx11.hpp +22 -0
  825. data/src/cxx_supportlib/vendor-modified/boost/ratio/mpl/plus.hpp +1 -1
  826. data/src/cxx_supportlib/vendor-modified/boost/regex/v4/regex_workaround.hpp +7 -7
  827. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/icu.hpp +9 -9
  828. data/src/cxx_supportlib/vendor-modified/boost/regex/v5/regex_workaround.hpp +7 -7
  829. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/allocate_shared_array.hpp +1 -0
  830. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/requires_cxx11.hpp +23 -0
  831. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_counted_base_gcc_atomic.hpp +1 -1
  832. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/yield_k.hpp +4 -6
  833. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/enable_shared_from_this.hpp +1 -0
  834. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/intrusive_ptr.hpp +2 -0
  835. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared.hpp +1 -0
  836. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_array.hpp +1 -0
  837. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/make_shared_object.hpp +1 -0
  838. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_array.hpp +1 -0
  839. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/scoped_ptr.hpp +1 -0
  840. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_array.hpp +2 -0
  841. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/shared_ptr.hpp +1 -0
  842. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/weak_ptr.hpp +1 -0
  843. data/src/cxx_supportlib/vendor-modified/boost/system/detail/config.hpp +4 -1
  844. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category.hpp +10 -2
  845. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_category_impl.hpp +11 -26
  846. data/src/cxx_supportlib/vendor-modified/boost/system/detail/error_code.hpp +13 -2
  847. data/src/cxx_supportlib/vendor-modified/boost/system/detail/mutex.hpp +121 -0
  848. data/src/cxx_supportlib/vendor-modified/boost/system/detail/requires_cxx11.hpp +21 -0
  849. data/src/cxx_supportlib/vendor-modified/boost/system/detail/std_category.hpp +13 -8
  850. data/src/cxx_supportlib/vendor-modified/boost/throw_exception.hpp +2 -2
  851. data/src/cxx_supportlib/vendor-modified/boost/type_traits/detail/is_swappable_cxx_11.hpp +70 -0
  852. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_integral.hpp +3 -0
  853. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_nothrow_swappable.hpp +4 -24
  854. data/src/cxx_supportlib/vendor-modified/boost/type_traits/is_swappable.hpp +92 -0
  855. data/src/cxx_supportlib/vendor-modified/boost/typeof/detail/requires_cxx11.hpp +18 -0
  856. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/functional.hpp +6 -1
  857. data/src/cxx_supportlib/vendor-modified/boost/typeof/std/memory.hpp +6 -1
  858. data/src/cxx_supportlib/vendor-modified/boost/typeof/typeof.hpp +1 -0
  859. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map.hpp +818 -0
  860. data/src/cxx_supportlib/vendor-modified/boost/unordered/concurrent_flat_map_fwd.hpp +54 -0
  861. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/concurrent_table.hpp +1324 -0
  862. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/{foa.hpp → foa/core.hpp} +901 -703
  863. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/element_type.hpp +60 -0
  864. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/flat_map_types.hpp +73 -0
  865. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/flat_set_types.hpp +44 -0
  866. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/ignore_wshadow.hpp +35 -0
  867. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_handle.hpp +210 -0
  868. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_map_types.hpp +132 -0
  869. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/node_set_types.hpp +95 -0
  870. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/restore_wshadow.hpp +11 -0
  871. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/rw_spinlock.hpp +179 -0
  872. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/table.hpp +556 -0
  873. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/foa/tuple_rotate_right.hpp +52 -0
  874. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/fwd.hpp +86 -0
  875. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/implementation.hpp +24 -93
  876. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/mulx.hpp +129 -0
  877. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/narrow_cast.hpp +44 -0
  878. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/prime_fmod.hpp +2 -7
  879. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/requires_cxx11.hpp +21 -0
  880. data/src/cxx_supportlib/vendor-modified/boost/unordered/detail/type_traits.hpp +15 -2
  881. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map.hpp +111 -62
  882. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_map_fwd.hpp +0 -1
  883. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set.hpp +29 -23
  884. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_flat_set_fwd.hpp +0 -1
  885. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map.hpp +192 -12
  886. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_map_fwd.hpp +0 -1
  887. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map.hpp +884 -0
  888. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_map_fwd.hpp +48 -0
  889. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set.hpp +688 -0
  890. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_node_set_fwd.hpp +48 -0
  891. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set.hpp +35 -0
  892. data/src/cxx_supportlib/vendor-modified/boost/unordered/unordered_set_fwd.hpp +0 -1
  893. data/src/cxx_supportlib/vendor-modified/boost/version.hpp +2 -2
  894. data/src/cxx_supportlib/vendor-modified/modp_b64_strict_aliasing.cpp +1 -1
  895. data/src/helper-scripts/wsgi-loader.py +34 -17
  896. data/src/ruby_supportlib/phusion_passenger/loader_shared_helpers.rb +3 -1
  897. data/src/ruby_supportlib/phusion_passenger/platform_info/apache.rb +5 -3
  898. data/src/ruby_supportlib/phusion_passenger/rack/thread_handler_extension.rb +3 -1
  899. data/src/ruby_supportlib/phusion_passenger/ruby_core_enhancements.rb +5 -0
  900. data/src/ruby_supportlib/phusion_passenger.rb +1 -1
  901. metadata +72 -15
  902. data/src/cxx_supportlib/vendor-modified/boost/container/detail/hash_table.hpp +0 -1278
  903. data/src/cxx_supportlib/vendor-modified/boost/container_hash/detail/hash_tuple.hpp +0 -133
  904. data/src/cxx_supportlib/vendor-modified/boost/smart_ptr/detail/sp_thread_pause.hpp +0 -51
  905. data/src/cxx_supportlib/vendor-modified/boost/type_index/stl_type_index.hpp +0 -278
  906. data/src/cxx_supportlib/vendor-modified/boost/type_index/type_index_facade.hpp +0 -297
  907. data/src/cxx_supportlib/vendor-modified/boost/type_index.hpp +0 -265
@@ -1,7 +1,4 @@
1
- /* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev
2
- *
3
- * Additional changes are licensed under the same terms as NGINX and
4
- * copyright Joyent, Inc. and other Node contributors. All rights reserved.
1
+ /* Copyright Joyent, Inc. and other Node contributors.
5
2
  *
6
3
  * Permission is hereby granted, free of charge, to any person obtaining a copy
7
4
  * of this software and associated documentation files (the "Software"), to
@@ -25,12 +22,13 @@
25
22
  #include <assert.h>
26
23
  #include <stddef.h>
27
24
  #include <ctype.h>
28
- #include <stdlib.h>
29
25
  #include <string.h>
30
26
  #include <limits.h>
31
27
 
28
+ static uint32_t max_header_size = HTTP_MAX_HEADER_SIZE;
29
+
32
30
  #ifndef ULLONG_MAX
33
- # define ULLONG_MAX ((boost::uint64_t) -1) /* 2^64-1 */
31
+ # define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */
34
32
  #endif
35
33
 
36
34
  #ifndef MIN
@@ -53,22 +51,45 @@
53
51
 
54
52
  #define SET_ERRNO(e) \
55
53
  do { \
54
+ parser->nread = nread; \
56
55
  parser->http_errno = (e); \
57
56
  } while(0)
58
57
 
58
+ #define CURRENT_STATE() p_state
59
+ #define UPDATE_STATE(V) p_state = (enum state) (V);
60
+ #define RETURN(V) \
61
+ do { \
62
+ parser->nread = nread; \
63
+ parser->state = CURRENT_STATE(); \
64
+ return (V); \
65
+ } while (0);
66
+ #define REEXECUTE() \
67
+ goto reexecute; \
68
+
69
+
70
+ #ifdef __GNUC__
71
+ # define LIKELY(X) __builtin_expect(!!(X), 1)
72
+ # define UNLIKELY(X) __builtin_expect(!!(X), 0)
73
+ #else
74
+ # define LIKELY(X) (X)
75
+ # define UNLIKELY(X) (X)
76
+ #endif
77
+
59
78
 
60
79
  /* Run the notify callback FOR, returning ER if it fails */
61
80
  #define CALLBACK_NOTIFY_(FOR, ER) \
62
81
  do { \
63
82
  assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
64
83
  \
65
- if (settings->on_##FOR) { \
66
- if (0 != settings->on_##FOR(parser)) { \
84
+ if (LIKELY(settings->on_##FOR)) { \
85
+ parser->state = CURRENT_STATE(); \
86
+ if (UNLIKELY(0 != settings->on_##FOR(parser))) { \
67
87
  SET_ERRNO(HPE_CB_##FOR); \
68
88
  } \
89
+ UPDATE_STATE(parser->state); \
69
90
  \
70
91
  /* We either errored above or got paused; get out */ \
71
- if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \
92
+ if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \
72
93
  return (ER); \
73
94
  } \
74
95
  } \
@@ -86,13 +107,16 @@ do { \
86
107
  assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \
87
108
  \
88
109
  if (FOR##_mark) { \
89
- if (settings->on_##FOR) { \
90
- if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \
110
+ if (LIKELY(settings->on_##FOR)) { \
111
+ parser->state = CURRENT_STATE(); \
112
+ if (UNLIKELY(0 != \
113
+ settings->on_##FOR(parser, FOR##_mark, (LEN)))) { \
91
114
  SET_ERRNO(HPE_CB_##FOR); \
92
115
  } \
116
+ UPDATE_STATE(parser->state); \
93
117
  \
94
118
  /* We either errored above or got paused; get out */ \
95
- if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \
119
+ if (UNLIKELY(HTTP_PARSER_ERRNO(parser) != HPE_OK)) { \
96
120
  return (ER); \
97
121
  } \
98
122
  } \
@@ -116,6 +140,26 @@ do { \
116
140
  } \
117
141
  } while (0)
118
142
 
143
+ /* Don't allow the total size of the HTTP headers (including the status
144
+ * line) to exceed max_header_size. This check is here to protect
145
+ * embedders against denial-of-service attacks where the attacker feeds
146
+ * us a never-ending header that the embedder keeps buffering.
147
+ *
148
+ * This check is arguably the responsibility of embedders but we're doing
149
+ * it on the embedder's behalf because most won't bother and this way we
150
+ * make the web a little safer. max_header_size is still far bigger
151
+ * than any reasonable request or response so this should never affect
152
+ * day-to-day operation.
153
+ */
154
+ #define COUNT_HEADER_SIZE(V) \
155
+ do { \
156
+ nread += (uint32_t)(V); \
157
+ if (UNLIKELY(nread > max_header_size)) { \
158
+ SET_ERRNO(HPE_HEADER_OVERFLOW); \
159
+ goto error; \
160
+ } \
161
+ } while (0)
162
+
119
163
 
120
164
  #define PROXY_CONNECTION "proxy-connection"
121
165
  #define CONNECTION "connection"
@@ -152,7 +196,7 @@ static const char tokens[256] = {
152
196
  /* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */
153
197
  0, 0, 0, 0, 0, 0, 0, 0,
154
198
  /* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */
155
- 0, '!', 0, '#', '$', '%', '&', '\'',
199
+ ' ', '!', 0, '#', '$', '%', '&', '\'',
156
200
  /* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */
157
201
  0, 0, '*', '+', 0, '-', '.', 0,
158
202
  /* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */
@@ -196,7 +240,7 @@ static const int8_t unhex[256] =
196
240
  #endif
197
241
 
198
242
 
199
- static const boost::uint8_t normal_url_char[32] = {
243
+ static const uint8_t normal_url_char[32] = {
200
244
  /* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */
201
245
  0 | 0 | 0 | 0 | 0 | 0 | 0 | 0,
202
246
  /* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */
@@ -242,10 +286,10 @@ enum state
242
286
  , s_res_HT
243
287
  , s_res_HTT
244
288
  , s_res_HTTP
245
- , s_res_first_http_major
246
289
  , s_res_http_major
247
- , s_res_first_http_minor
290
+ , s_res_http_dot
248
291
  , s_res_http_minor
292
+ , s_res_http_end
249
293
  , s_res_first_status_code
250
294
  , s_res_status_code
251
295
  , s_res_status_start
@@ -272,10 +316,12 @@ enum state
272
316
  , s_req_http_HT
273
317
  , s_req_http_HTT
274
318
  , s_req_http_HTTP
275
- , s_req_first_http_major
319
+ , s_req_http_I
320
+ , s_req_http_IC
276
321
  , s_req_http_major
277
- , s_req_first_http_minor
322
+ , s_req_http_dot
278
323
  , s_req_http_minor
324
+ , s_req_http_end
279
325
  , s_req_line_almost_done
280
326
 
281
327
  , s_header_field_start
@@ -330,16 +376,25 @@ enum header_states
330
376
 
331
377
  , h_connection
332
378
  , h_content_length
379
+ , h_content_length_num
380
+ , h_content_length_ws
333
381
  , h_transfer_encoding
334
382
  , h_upgrade
335
383
 
384
+ , h_matching_transfer_encoding_token_start
336
385
  , h_matching_transfer_encoding_chunked
386
+ , h_matching_transfer_encoding_token
387
+
388
+ , h_matching_connection_token_start
337
389
  , h_matching_connection_keep_alive
338
390
  , h_matching_connection_close
391
+ , h_matching_connection_upgrade
392
+ , h_matching_connection_token
339
393
 
340
394
  , h_transfer_encoding_chunked
341
395
  , h_connection_keep_alive
342
396
  , h_connection_close
397
+ , h_connection_upgrade
343
398
  };
344
399
 
345
400
  enum http_host_state
@@ -352,6 +407,8 @@ enum http_host_state
352
407
  , s_http_host
353
408
  , s_http_host_v6
354
409
  , s_http_host_v6_end
410
+ , s_http_host_v6_zone_start
411
+ , s_http_host_v6_zone
355
412
  , s_http_host_port_start
356
413
  , s_http_host_port
357
414
  };
@@ -371,18 +428,26 @@ enum http_host_state
371
428
  (c) == ';' || (c) == ':' || (c) == '&' || (c) == '=' || (c) == '+' || \
372
429
  (c) == '$' || (c) == ',')
373
430
 
431
+ #define STRICT_TOKEN(c) ((c == ' ') ? 0 : tokens[(unsigned char)c])
432
+
374
433
  #if HTTP_PARSER_STRICT
375
- #define TOKEN(c) (tokens[(unsigned char)c])
434
+ #define TOKEN(c) STRICT_TOKEN(c)
376
435
  #define IS_URL_CHAR(c) (BIT_AT(normal_url_char, (unsigned char)c))
377
436
  #define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-')
378
437
  #else
379
- #define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c])
438
+ #define TOKEN(c) tokens[(unsigned char)c]
380
439
  #define IS_URL_CHAR(c) \
381
440
  (BIT_AT(normal_url_char, (unsigned char)c) || ((c) & 0x80))
382
441
  #define IS_HOST_CHAR(c) \
383
442
  (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_')
384
443
  #endif
385
444
 
445
+ /**
446
+ * Verify that a char is a valid visible (printable) US-ASCII
447
+ * character or %x80-FF
448
+ **/
449
+ #define IS_HEADER_CHAR(ch) \
450
+ (ch == CR || ch == LF || ch == 9 || ((unsigned char)ch > 31 && ch != 127))
386
451
 
387
452
  #define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res)
388
453
 
@@ -484,7 +549,7 @@ parse_url_char(enum state s, const char ch)
484
549
  return s_dead;
485
550
  }
486
551
 
487
- /* FALLTHROUGH */
552
+ /* fall through */
488
553
  case s_req_server_start:
489
554
  case s_req_server:
490
555
  if (ch == '/') {
@@ -586,6 +651,11 @@ size_t http_parser_execute (http_parser *parser,
586
651
  const char *url_mark = 0;
587
652
  const char *body_mark = 0;
588
653
  const char *status_mark = 0;
654
+ enum state p_state = (enum state) parser->state;
655
+ const unsigned int lenient = parser->lenient_http_headers;
656
+ const unsigned int allow_chunked_length = parser->allow_chunked_length;
657
+
658
+ uint32_t nread = parser->nread;
589
659
 
590
660
  /* We're in an error state. Don't bother doing anything. */
591
661
  if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {
@@ -593,7 +663,7 @@ size_t http_parser_execute (http_parser *parser,
593
663
  }
594
664
 
595
665
  if (len == 0) {
596
- switch (parser->state) {
666
+ switch (CURRENT_STATE()) {
597
667
  case s_body_identity_eof:
598
668
  /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if
599
669
  * we got paused.
@@ -614,11 +684,11 @@ size_t http_parser_execute (http_parser *parser,
614
684
  }
615
685
 
616
686
 
617
- if (parser->state == s_header_field)
687
+ if (CURRENT_STATE() == s_header_field)
618
688
  header_field_mark = data;
619
- if (parser->state == s_header_value)
689
+ if (CURRENT_STATE() == s_header_value)
620
690
  header_value_mark = data;
621
- switch (parser->state) {
691
+ switch (CURRENT_STATE()) {
622
692
  case s_req_path:
623
693
  case s_req_schema:
624
694
  case s_req_schema_slash:
@@ -635,38 +705,24 @@ size_t http_parser_execute (http_parser *parser,
635
705
  case s_res_status:
636
706
  status_mark = data;
637
707
  break;
708
+ default:
709
+ break;
638
710
  }
639
711
 
640
712
  for (p=data; p != data + len; p++) {
641
713
  ch = *p;
642
714
 
643
- if (PARSING_HEADER(parser->state)) {
644
- ++parser->nread;
645
- /* Don't allow the total size of the HTTP headers (including the status
646
- * line) to exceed HTTP_MAX_HEADER_SIZE. This check is here to protect
647
- * embedders against denial-of-service attacks where the attacker feeds
648
- * us a never-ending header that the embedder keeps buffering.
649
- *
650
- * This check is arguably the responsibility of embedders but we're doing
651
- * it on the embedder's behalf because most won't bother and this way we
652
- * make the web a little safer. HTTP_MAX_HEADER_SIZE is still far bigger
653
- * than any reasonable request or response so this should never affect
654
- * day-to-day operation.
655
- */
656
- if (parser->nread > (HTTP_MAX_HEADER_SIZE)) {
657
- SET_ERRNO(HPE_HEADER_OVERFLOW);
658
- goto error;
659
- }
660
- }
715
+ if (PARSING_HEADER(CURRENT_STATE()))
716
+ COUNT_HEADER_SIZE(1);
661
717
 
662
- reexecute_byte:
663
- switch (parser->state) {
718
+ reexecute:
719
+ switch (CURRENT_STATE()) {
664
720
 
665
721
  case s_dead:
666
722
  /* this state is used after a 'Connection: close' message
667
723
  * the parser will error out if it reads another message
668
724
  */
669
- if (ch == CR || ch == LF)
725
+ if (LIKELY(ch == CR || ch == LF))
670
726
  break;
671
727
 
672
728
  SET_ERRNO(HPE_CLOSED_CONNECTION);
@@ -677,16 +733,17 @@ size_t http_parser_execute (http_parser *parser,
677
733
  if (ch == CR || ch == LF)
678
734
  break;
679
735
  parser->flags = 0;
736
+ parser->uses_transfer_encoding = 0;
680
737
  parser->content_length = ULLONG_MAX;
681
738
 
682
739
  if (ch == 'H') {
683
- parser->state = s_res_or_resp_H;
740
+ UPDATE_STATE(s_res_or_resp_H);
684
741
 
685
742
  CALLBACK_NOTIFY(message_begin);
686
743
  } else {
687
744
  parser->type = HTTP_REQUEST;
688
- parser->state = s_start_req;
689
- goto reexecute_byte;
745
+ UPDATE_STATE(s_start_req);
746
+ REEXECUTE();
690
747
  }
691
748
 
692
749
  break;
@@ -695,9 +752,9 @@ size_t http_parser_execute (http_parser *parser,
695
752
  case s_res_or_resp_H:
696
753
  if (ch == 'T') {
697
754
  parser->type = HTTP_RESPONSE;
698
- parser->state = s_res_HT;
755
+ UPDATE_STATE(s_res_HT);
699
756
  } else {
700
- if (ch != 'E') {
757
+ if (UNLIKELY(ch != 'E')) {
701
758
  SET_ERRNO(HPE_INVALID_CONSTANT);
702
759
  goto error;
703
760
  }
@@ -705,27 +762,23 @@ size_t http_parser_execute (http_parser *parser,
705
762
  parser->type = HTTP_REQUEST;
706
763
  parser->method = HTTP_HEAD;
707
764
  parser->index = 2;
708
- parser->state = s_req_method;
765
+ UPDATE_STATE(s_req_method);
709
766
  }
710
767
  break;
711
768
 
712
769
  case s_start_res:
713
770
  {
771
+ if (ch == CR || ch == LF)
772
+ break;
714
773
  parser->flags = 0;
774
+ parser->uses_transfer_encoding = 0;
715
775
  parser->content_length = ULLONG_MAX;
716
776
 
717
- switch (ch) {
718
- case 'H':
719
- parser->state = s_res_H;
720
- break;
721
-
722
- case CR:
723
- case LF:
724
- break;
725
-
726
- default:
727
- SET_ERRNO(HPE_INVALID_CONSTANT);
728
- goto error;
777
+ if (ch == 'H') {
778
+ UPDATE_STATE(s_res_H);
779
+ } else {
780
+ SET_ERRNO(HPE_INVALID_CONSTANT);
781
+ goto error;
729
782
  }
730
783
 
731
784
  CALLBACK_NOTIFY(message_begin);
@@ -734,90 +787,63 @@ size_t http_parser_execute (http_parser *parser,
734
787
 
735
788
  case s_res_H:
736
789
  STRICT_CHECK(ch != 'T');
737
- parser->state = s_res_HT;
790
+ UPDATE_STATE(s_res_HT);
738
791
  break;
739
792
 
740
793
  case s_res_HT:
741
794
  STRICT_CHECK(ch != 'T');
742
- parser->state = s_res_HTT;
795
+ UPDATE_STATE(s_res_HTT);
743
796
  break;
744
797
 
745
798
  case s_res_HTT:
746
799
  STRICT_CHECK(ch != 'P');
747
- parser->state = s_res_HTTP;
800
+ UPDATE_STATE(s_res_HTTP);
748
801
  break;
749
802
 
750
803
  case s_res_HTTP:
751
804
  STRICT_CHECK(ch != '/');
752
- parser->state = s_res_first_http_major;
805
+ UPDATE_STATE(s_res_http_major);
753
806
  break;
754
807
 
755
- case s_res_first_http_major:
756
- if (ch < '0' || ch > '9') {
808
+ case s_res_http_major:
809
+ if (UNLIKELY(!IS_NUM(ch))) {
757
810
  SET_ERRNO(HPE_INVALID_VERSION);
758
811
  goto error;
759
812
  }
760
813
 
761
814
  parser->http_major = ch - '0';
762
- parser->state = s_res_http_major;
815
+ UPDATE_STATE(s_res_http_dot);
763
816
  break;
764
817
 
765
- /* major HTTP version or dot */
766
- case s_res_http_major:
818
+ case s_res_http_dot:
767
819
  {
768
- if (ch == '.') {
769
- parser->state = s_res_first_http_minor;
770
- break;
771
- }
772
-
773
- if (!IS_NUM(ch)) {
774
- SET_ERRNO(HPE_INVALID_VERSION);
775
- goto error;
776
- }
777
-
778
- parser->http_major *= 10;
779
- parser->http_major += ch - '0';
780
-
781
- if (parser->http_major > 999) {
820
+ if (UNLIKELY(ch != '.')) {
782
821
  SET_ERRNO(HPE_INVALID_VERSION);
783
822
  goto error;
784
823
  }
785
824
 
825
+ UPDATE_STATE(s_res_http_minor);
786
826
  break;
787
827
  }
788
828
 
789
- /* first digit of minor HTTP version */
790
- case s_res_first_http_minor:
791
- if (!IS_NUM(ch)) {
829
+ case s_res_http_minor:
830
+ if (UNLIKELY(!IS_NUM(ch))) {
792
831
  SET_ERRNO(HPE_INVALID_VERSION);
793
832
  goto error;
794
833
  }
795
834
 
796
835
  parser->http_minor = ch - '0';
797
- parser->state = s_res_http_minor;
836
+ UPDATE_STATE(s_res_http_end);
798
837
  break;
799
838
 
800
- /* minor HTTP version or end of request line */
801
- case s_res_http_minor:
839
+ case s_res_http_end:
802
840
  {
803
- if (ch == ' ') {
804
- parser->state = s_res_first_status_code;
805
- break;
806
- }
807
-
808
- if (!IS_NUM(ch)) {
809
- SET_ERRNO(HPE_INVALID_VERSION);
810
- goto error;
811
- }
812
-
813
- parser->http_minor *= 10;
814
- parser->http_minor += ch - '0';
815
-
816
- if (parser->http_minor > 999) {
841
+ if (UNLIKELY(ch != ' ')) {
817
842
  SET_ERRNO(HPE_INVALID_VERSION);
818
843
  goto error;
819
844
  }
820
845
 
846
+ UPDATE_STATE(s_res_first_status_code);
821
847
  break;
822
848
  }
823
849
 
@@ -832,7 +858,7 @@ size_t http_parser_execute (http_parser *parser,
832
858
  goto error;
833
859
  }
834
860
  parser->status_code = ch - '0';
835
- parser->state = s_res_status_code;
861
+ UPDATE_STATE(s_res_status_code);
836
862
  break;
837
863
  }
838
864
 
@@ -841,13 +867,12 @@ size_t http_parser_execute (http_parser *parser,
841
867
  if (!IS_NUM(ch)) {
842
868
  switch (ch) {
843
869
  case ' ':
844
- parser->state = s_res_status_start;
870
+ UPDATE_STATE(s_res_status_start);
845
871
  break;
846
872
  case CR:
847
- parser->state = s_res_line_almost_done;
848
- break;
849
873
  case LF:
850
- parser->state = s_header_field_start;
874
+ UPDATE_STATE(s_res_status_start);
875
+ REEXECUTE();
851
876
  break;
852
877
  default:
853
878
  SET_ERRNO(HPE_INVALID_STATUS);
@@ -859,7 +884,7 @@ size_t http_parser_execute (http_parser *parser,
859
884
  parser->status_code *= 10;
860
885
  parser->status_code += ch - '0';
861
886
 
862
- if (parser->status_code > 999) {
887
+ if (UNLIKELY(parser->status_code > 999)) {
863
888
  SET_ERRNO(HPE_INVALID_STATUS);
864
889
  goto error;
865
890
  }
@@ -869,31 +894,25 @@ size_t http_parser_execute (http_parser *parser,
869
894
 
870
895
  case s_res_status_start:
871
896
  {
872
- if (ch == CR) {
873
- parser->state = s_res_line_almost_done;
874
- break;
875
- }
876
-
877
- if (ch == LF) {
878
- parser->state = s_header_field_start;
879
- break;
880
- }
881
-
882
897
  MARK(status);
883
- parser->state = s_res_status;
898
+ UPDATE_STATE(s_res_status);
884
899
  parser->index = 0;
900
+
901
+ if (ch == CR || ch == LF)
902
+ REEXECUTE();
903
+
885
904
  break;
886
905
  }
887
906
 
888
907
  case s_res_status:
889
908
  if (ch == CR) {
890
- parser->state = s_res_line_almost_done;
909
+ UPDATE_STATE(s_res_line_almost_done);
891
910
  CALLBACK_DATA(status);
892
911
  break;
893
912
  }
894
913
 
895
914
  if (ch == LF) {
896
- parser->state = s_header_field_start;
915
+ UPDATE_STATE(s_header_field_start);
897
916
  CALLBACK_DATA(status);
898
917
  break;
899
918
  }
@@ -902,7 +921,7 @@ size_t http_parser_execute (http_parser *parser,
902
921
 
903
922
  case s_res_line_almost_done:
904
923
  STRICT_CHECK(ch != LF);
905
- parser->state = s_header_field_start;
924
+ UPDATE_STATE(s_header_field_start);
906
925
  break;
907
926
 
908
927
  case s_start_req:
@@ -910,9 +929,10 @@ size_t http_parser_execute (http_parser *parser,
910
929
  if (ch == CR || ch == LF)
911
930
  break;
912
931
  parser->flags = 0;
932
+ parser->uses_transfer_encoding = 0;
913
933
  parser->content_length = ULLONG_MAX;
914
934
 
915
- if (!IS_ALPHA(ch)) {
935
+ if (UNLIKELY(!IS_ALPHA(ch))) {
916
936
  SET_ERRNO(HPE_INVALID_METHOD);
917
937
  goto error;
918
938
  }
@@ -920,26 +940,28 @@ size_t http_parser_execute (http_parser *parser,
920
940
  parser->method = (enum http_method) 0;
921
941
  parser->index = 1;
922
942
  switch (ch) {
943
+ case 'A': parser->method = HTTP_ACL; break;
944
+ case 'B': parser->method = HTTP_BIND; break;
923
945
  case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break;
924
946
  case 'D': parser->method = HTTP_DELETE; break;
925
947
  case 'G': parser->method = HTTP_GET; break;
926
948
  case 'H': parser->method = HTTP_HEAD; break;
927
- case 'L': parser->method = HTTP_LOCK; break;
949
+ case 'L': parser->method = HTTP_LOCK; /* or LINK */ break;
928
950
  case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH, MKCALENDAR */ break;
929
951
  case 'N': parser->method = HTTP_NOTIFY; break;
930
952
  case 'O': parser->method = HTTP_OPTIONS; break;
931
953
  case 'P': parser->method = HTTP_POST;
932
954
  /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */
933
955
  break;
934
- case 'R': parser->method = HTTP_REPORT; break;
935
- case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break;
956
+ case 'R': parser->method = HTTP_REPORT; /* or REBIND */ break;
957
+ case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH, SOURCE */ break;
936
958
  case 'T': parser->method = HTTP_TRACE; break;
937
- case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break;
959
+ case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE, UNBIND, UNLINK */ break;
938
960
  default:
939
961
  SET_ERRNO(HPE_INVALID_METHOD);
940
962
  goto error;
941
963
  }
942
- parser->state = s_req_method;
964
+ UPDATE_STATE(s_req_method);
943
965
 
944
966
  CALLBACK_NOTIFY(message_begin);
945
967
 
@@ -949,79 +971,47 @@ size_t http_parser_execute (http_parser *parser,
949
971
  case s_req_method:
950
972
  {
951
973
  const char *matcher;
952
- if (ch == '\0') {
974
+ if (UNLIKELY(ch == '\0')) {
953
975
  SET_ERRNO(HPE_INVALID_METHOD);
954
976
  goto error;
955
977
  }
956
978
 
957
979
  matcher = method_strings[parser->method];
958
980
  if (ch == ' ' && matcher[parser->index] == '\0') {
959
- parser->state = s_req_spaces_before_url;
981
+ UPDATE_STATE(s_req_spaces_before_url);
960
982
  } else if (ch == matcher[parser->index]) {
961
983
  ; /* nada */
962
- } else if (parser->method == HTTP_CONNECT) {
963
- if (parser->index == 1 && ch == 'H') {
964
- parser->method = HTTP_CHECKOUT;
965
- } else if (parser->index == 2 && ch == 'P') {
966
- parser->method = HTTP_COPY;
967
- } else {
968
- SET_ERRNO(HPE_INVALID_METHOD);
969
- goto error;
970
- }
971
- } else if (parser->method == HTTP_MKCOL) {
972
- if (parser->index == 1 && ch == 'O') {
973
- parser->method = HTTP_MOVE;
974
- } else if (parser->index == 1 && ch == 'E') {
975
- parser->method = HTTP_MERGE;
976
- } else if (parser->index == 1 && ch == '-') {
977
- parser->method = HTTP_MSEARCH;
978
- } else if (parser->index == 2 && ch == 'A') {
979
- parser->method = HTTP_MKACTIVITY;
980
- } else if (parser->index == 3 && ch == 'A') {
981
- parser->method = HTTP_MKCALENDAR;
982
- } else {
983
- SET_ERRNO(HPE_INVALID_METHOD);
984
- goto error;
985
- }
986
- } else if (parser->method == HTTP_SUBSCRIBE) {
987
- if (parser->index == 1 && ch == 'E') {
988
- parser->method = HTTP_SEARCH;
989
- } else {
990
- SET_ERRNO(HPE_INVALID_METHOD);
991
- goto error;
992
- }
993
- } else if (parser->index == 1 && parser->method == HTTP_POST) {
994
- if (ch == 'R') {
995
- parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */
996
- } else if (ch == 'U') {
997
- parser->method = HTTP_PUT; /* or HTTP_PURGE */
998
- } else if (ch == 'A') {
999
- parser->method = HTTP_PATCH;
1000
- } else {
1001
- SET_ERRNO(HPE_INVALID_METHOD);
1002
- goto error;
1003
- }
1004
- } else if (parser->index == 2) {
1005
- if (parser->method == HTTP_PUT) {
1006
- if (ch == 'R') {
1007
- parser->method = HTTP_PURGE;
1008
- } else {
1009
- SET_ERRNO(HPE_INVALID_METHOD);
1010
- goto error;
1011
- }
1012
- } else if (parser->method == HTTP_UNLOCK) {
1013
- if (ch == 'S') {
1014
- parser->method = HTTP_UNSUBSCRIBE;
1015
- } else {
984
+ } else if ((ch >= 'A' && ch <= 'Z') || ch == '-') {
985
+
986
+ switch (parser->method << 16 | parser->index << 8 | ch) {
987
+ #define XX(meth, pos, ch, new_meth) \
988
+ case (HTTP_##meth << 16 | pos << 8 | ch): \
989
+ parser->method = HTTP_##new_meth; break;
990
+
991
+ XX(POST, 1, 'U', PUT)
992
+ XX(POST, 1, 'A', PATCH)
993
+ XX(POST, 1, 'R', PROPFIND)
994
+ XX(PUT, 2, 'R', PURGE)
995
+ XX(CONNECT, 1, 'H', CHECKOUT)
996
+ XX(CONNECT, 2, 'P', COPY)
997
+ XX(MKCOL, 1, 'O', MOVE)
998
+ XX(MKCOL, 1, 'E', MERGE)
999
+ XX(MKCOL, 1, '-', MSEARCH)
1000
+ XX(MKCOL, 2, 'A', MKACTIVITY)
1001
+ XX(MKCOL, 3, 'A', MKCALENDAR)
1002
+ XX(SUBSCRIBE, 1, 'E', SEARCH)
1003
+ XX(SUBSCRIBE, 1, 'O', SOURCE)
1004
+ XX(REPORT, 2, 'B', REBIND)
1005
+ XX(PROPFIND, 4, 'P', PROPPATCH)
1006
+ XX(LOCK, 1, 'I', LINK)
1007
+ XX(UNLOCK, 2, 'S', UNSUBSCRIBE)
1008
+ XX(UNLOCK, 2, 'B', UNBIND)
1009
+ XX(UNLOCK, 3, 'I', UNLINK)
1010
+ #undef XX
1011
+ default:
1016
1012
  SET_ERRNO(HPE_INVALID_METHOD);
1017
1013
  goto error;
1018
- }
1019
- } else {
1020
- SET_ERRNO(HPE_INVALID_METHOD);
1021
- goto error;
1022
1014
  }
1023
- } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') {
1024
- parser->method = HTTP_PROPPATCH;
1025
1015
  } else {
1026
1016
  SET_ERRNO(HPE_INVALID_METHOD);
1027
1017
  goto error;
@@ -1037,11 +1027,11 @@ size_t http_parser_execute (http_parser *parser,
1037
1027
 
1038
1028
  MARK(url);
1039
1029
  if (parser->method == HTTP_CONNECT) {
1040
- parser->state = s_req_server_start;
1030
+ UPDATE_STATE(s_req_server_start);
1041
1031
  }
1042
1032
 
1043
- parser->state = parse_url_char((enum state)parser->state, ch);
1044
- if (parser->state == s_dead) {
1033
+ UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
1034
+ if (UNLIKELY(CURRENT_STATE() == s_dead)) {
1045
1035
  SET_ERRNO(HPE_INVALID_URL);
1046
1036
  goto error;
1047
1037
  }
@@ -1062,8 +1052,8 @@ size_t http_parser_execute (http_parser *parser,
1062
1052
  SET_ERRNO(HPE_INVALID_URL);
1063
1053
  goto error;
1064
1054
  default:
1065
- parser->state = parse_url_char((enum state)parser->state, ch);
1066
- if (parser->state == s_dead) {
1055
+ UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
1056
+ if (UNLIKELY(CURRENT_STATE() == s_dead)) {
1067
1057
  SET_ERRNO(HPE_INVALID_URL);
1068
1058
  goto error;
1069
1059
  }
@@ -1082,21 +1072,21 @@ size_t http_parser_execute (http_parser *parser,
1082
1072
  {
1083
1073
  switch (ch) {
1084
1074
  case ' ':
1085
- parser->state = s_req_http_start;
1075
+ UPDATE_STATE(s_req_http_start);
1086
1076
  CALLBACK_DATA(url);
1087
1077
  break;
1088
1078
  case CR:
1089
1079
  case LF:
1090
1080
  parser->http_major = 0;
1091
1081
  parser->http_minor = 9;
1092
- parser->state = (ch == CR) ?
1082
+ UPDATE_STATE((ch == CR) ?
1093
1083
  s_req_line_almost_done :
1094
- s_header_field_start;
1084
+ s_header_field_start);
1095
1085
  CALLBACK_DATA(url);
1096
1086
  break;
1097
1087
  default:
1098
- parser->state = parse_url_char((enum state)parser->state, ch);
1099
- if (parser->state == s_dead) {
1088
+ UPDATE_STATE(parse_url_char(CURRENT_STATE(), ch));
1089
+ if (UNLIKELY(CURRENT_STATE() == s_dead)) {
1100
1090
  SET_ERRNO(HPE_INVALID_URL);
1101
1091
  goto error;
1102
1092
  }
@@ -1106,11 +1096,17 @@ size_t http_parser_execute (http_parser *parser,
1106
1096
 
1107
1097
  case s_req_http_start:
1108
1098
  switch (ch) {
1109
- case 'H':
1110
- parser->state = s_req_http_H;
1111
- break;
1112
1099
  case ' ':
1113
1100
  break;
1101
+ case 'H':
1102
+ UPDATE_STATE(s_req_http_H);
1103
+ break;
1104
+ case 'I':
1105
+ if (parser->method == HTTP_SOURCE) {
1106
+ UPDATE_STATE(s_req_http_I);
1107
+ break;
1108
+ }
1109
+ /* fall through */
1114
1110
  default:
1115
1111
  SET_ERRNO(HPE_INVALID_CONSTANT);
1116
1112
  goto error;
@@ -1119,130 +1115,111 @@ size_t http_parser_execute (http_parser *parser,
1119
1115
 
1120
1116
  case s_req_http_H:
1121
1117
  STRICT_CHECK(ch != 'T');
1122
- parser->state = s_req_http_HT;
1118
+ UPDATE_STATE(s_req_http_HT);
1123
1119
  break;
1124
1120
 
1125
1121
  case s_req_http_HT:
1126
1122
  STRICT_CHECK(ch != 'T');
1127
- parser->state = s_req_http_HTT;
1123
+ UPDATE_STATE(s_req_http_HTT);
1128
1124
  break;
1129
1125
 
1130
1126
  case s_req_http_HTT:
1131
1127
  STRICT_CHECK(ch != 'P');
1132
- parser->state = s_req_http_HTTP;
1128
+ UPDATE_STATE(s_req_http_HTTP);
1129
+ break;
1130
+
1131
+ case s_req_http_I:
1132
+ STRICT_CHECK(ch != 'C');
1133
+ UPDATE_STATE(s_req_http_IC);
1134
+ break;
1135
+
1136
+ case s_req_http_IC:
1137
+ STRICT_CHECK(ch != 'E');
1138
+ UPDATE_STATE(s_req_http_HTTP); /* Treat "ICE" as "HTTP". */
1133
1139
  break;
1134
1140
 
1135
1141
  case s_req_http_HTTP:
1136
1142
  STRICT_CHECK(ch != '/');
1137
- parser->state = s_req_first_http_major;
1143
+ UPDATE_STATE(s_req_http_major);
1138
1144
  break;
1139
1145
 
1140
- /* first digit of major HTTP version */
1141
- case s_req_first_http_major:
1142
- if (ch < '1' || ch > '9') {
1146
+ case s_req_http_major:
1147
+ if (UNLIKELY(!IS_NUM(ch))) {
1143
1148
  SET_ERRNO(HPE_INVALID_VERSION);
1144
1149
  goto error;
1145
1150
  }
1146
1151
 
1147
1152
  parser->http_major = ch - '0';
1148
- parser->state = s_req_http_major;
1153
+ UPDATE_STATE(s_req_http_dot);
1149
1154
  break;
1150
1155
 
1151
- /* major HTTP version or dot */
1152
- case s_req_http_major:
1156
+ case s_req_http_dot:
1153
1157
  {
1154
- if (ch == '.') {
1155
- parser->state = s_req_first_http_minor;
1156
- break;
1157
- }
1158
-
1159
- if (!IS_NUM(ch)) {
1160
- SET_ERRNO(HPE_INVALID_VERSION);
1161
- goto error;
1162
- }
1163
-
1164
- parser->http_major *= 10;
1165
- parser->http_major += ch - '0';
1166
-
1167
- if (parser->http_major > 999) {
1158
+ if (UNLIKELY(ch != '.')) {
1168
1159
  SET_ERRNO(HPE_INVALID_VERSION);
1169
1160
  goto error;
1170
1161
  }
1171
1162
 
1163
+ UPDATE_STATE(s_req_http_minor);
1172
1164
  break;
1173
1165
  }
1174
1166
 
1175
- /* first digit of minor HTTP version */
1176
- case s_req_first_http_minor:
1177
- if (!IS_NUM(ch)) {
1167
+ case s_req_http_minor:
1168
+ if (UNLIKELY(!IS_NUM(ch))) {
1178
1169
  SET_ERRNO(HPE_INVALID_VERSION);
1179
1170
  goto error;
1180
1171
  }
1181
1172
 
1182
1173
  parser->http_minor = ch - '0';
1183
- parser->state = s_req_http_minor;
1174
+ UPDATE_STATE(s_req_http_end);
1184
1175
  break;
1185
1176
 
1186
- /* minor HTTP version or end of request line */
1187
- case s_req_http_minor:
1177
+ case s_req_http_end:
1188
1178
  {
1189
1179
  if (ch == CR) {
1190
- parser->state = s_req_line_almost_done;
1180
+ UPDATE_STATE(s_req_line_almost_done);
1191
1181
  break;
1192
1182
  }
1193
1183
 
1194
1184
  if (ch == LF) {
1195
- parser->state = s_header_field_start;
1185
+ UPDATE_STATE(s_header_field_start);
1196
1186
  break;
1197
1187
  }
1198
1188
 
1199
- /* XXX allow spaces after digit? */
1200
-
1201
- if (!IS_NUM(ch)) {
1202
- SET_ERRNO(HPE_INVALID_VERSION);
1203
- goto error;
1204
- }
1205
-
1206
- parser->http_minor *= 10;
1207
- parser->http_minor += ch - '0';
1208
-
1209
- if (parser->http_minor > 999) {
1210
- SET_ERRNO(HPE_INVALID_VERSION);
1211
- goto error;
1212
- }
1213
-
1189
+ SET_ERRNO(HPE_INVALID_VERSION);
1190
+ goto error;
1214
1191
  break;
1215
1192
  }
1216
1193
 
1217
1194
  /* end of request line */
1218
1195
  case s_req_line_almost_done:
1219
1196
  {
1220
- if (ch != LF) {
1197
+ if (UNLIKELY(ch != LF)) {
1221
1198
  SET_ERRNO(HPE_LF_EXPECTED);
1222
1199
  goto error;
1223
1200
  }
1224
1201
 
1225
- parser->state = s_header_field_start;
1202
+ UPDATE_STATE(s_header_field_start);
1226
1203
  break;
1227
1204
  }
1228
1205
 
1229
1206
  case s_header_field_start:
1230
1207
  {
1231
1208
  if (ch == CR) {
1232
- parser->state = s_headers_almost_done;
1209
+ UPDATE_STATE(s_headers_almost_done);
1233
1210
  break;
1234
1211
  }
1235
1212
 
1236
1213
  if (ch == LF) {
1237
1214
  /* they might be just sending \n instead of \r\n so this would be
1238
1215
  * the second \n to denote the end of headers*/
1239
- parser->state = s_headers_almost_done;
1240
- goto reexecute_byte;
1216
+ UPDATE_STATE(s_headers_almost_done);
1217
+ REEXECUTE();
1241
1218
  }
1242
1219
 
1243
1220
  c = TOKEN(ch);
1244
1221
 
1245
- if (!c) {
1222
+ if (UNLIKELY(!c)) {
1246
1223
  SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
1247
1224
  goto error;
1248
1225
  }
@@ -1250,7 +1227,7 @@ size_t http_parser_execute (http_parser *parser,
1250
1227
  MARK(header_field);
1251
1228
 
1252
1229
  parser->index = 0;
1253
- parser->state = s_header_field;
1230
+ UPDATE_STATE(s_header_field);
1254
1231
 
1255
1232
  switch (c) {
1256
1233
  case 'c':
@@ -1278,12 +1255,23 @@ size_t http_parser_execute (http_parser *parser,
1278
1255
 
1279
1256
  case s_header_field:
1280
1257
  {
1281
- c = TOKEN(ch);
1258
+ const char* start = p;
1259
+ for (; p != data + len; p++) {
1260
+ ch = *p;
1261
+ c = TOKEN(ch);
1262
+
1263
+ if (!c)
1264
+ break;
1282
1265
 
1283
- if (c) {
1284
1266
  switch (parser->header_state) {
1285
- case h_general:
1267
+ case h_general: {
1268
+ size_t left = data + len - p;
1269
+ const char* pe = p + MIN(left, max_header_size);
1270
+ while (p+1 < pe && TOKEN(p[1])) {
1271
+ p++;
1272
+ }
1286
1273
  break;
1274
+ }
1287
1275
 
1288
1276
  case h_C:
1289
1277
  parser->index++;
@@ -1355,6 +1343,7 @@ size_t http_parser_execute (http_parser *parser,
1355
1343
  parser->header_state = h_general;
1356
1344
  } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) {
1357
1345
  parser->header_state = h_transfer_encoding;
1346
+ parser->uses_transfer_encoding = 1;
1358
1347
  }
1359
1348
  break;
1360
1349
 
@@ -1381,23 +1370,18 @@ size_t http_parser_execute (http_parser *parser,
1381
1370
  assert(0 && "Unknown header_state");
1382
1371
  break;
1383
1372
  }
1384
- break;
1385
1373
  }
1386
1374
 
1387
- if (ch == ':') {
1388
- parser->state = s_header_value_discard_ws;
1389
- CALLBACK_DATA(header_field);
1375
+ if (p == data + len) {
1376
+ --p;
1377
+ COUNT_HEADER_SIZE(p - start);
1390
1378
  break;
1391
1379
  }
1392
1380
 
1393
- if (ch == CR) {
1394
- parser->state = s_header_almost_done;
1395
- CALLBACK_DATA(header_field);
1396
- break;
1397
- }
1381
+ COUNT_HEADER_SIZE(p - start);
1398
1382
 
1399
- if (ch == LF) {
1400
- parser->state = s_header_field_start;
1383
+ if (ch == ':') {
1384
+ UPDATE_STATE(s_header_value_discard_ws);
1401
1385
  CALLBACK_DATA(header_field);
1402
1386
  break;
1403
1387
  }
@@ -1410,22 +1394,22 @@ size_t http_parser_execute (http_parser *parser,
1410
1394
  if (ch == ' ' || ch == '\t') break;
1411
1395
 
1412
1396
  if (ch == CR) {
1413
- parser->state = s_header_value_discard_ws_almost_done;
1397
+ UPDATE_STATE(s_header_value_discard_ws_almost_done);
1414
1398
  break;
1415
1399
  }
1416
1400
 
1417
1401
  if (ch == LF) {
1418
- parser->state = s_header_value_discard_lws;
1402
+ UPDATE_STATE(s_header_value_discard_lws);
1419
1403
  break;
1420
1404
  }
1421
1405
 
1422
- /* FALLTHROUGH */
1406
+ /* fall through */
1423
1407
 
1424
1408
  case s_header_value_start:
1425
1409
  {
1426
1410
  MARK(header_value);
1427
1411
 
1428
- parser->state = s_header_value;
1412
+ UPDATE_STATE(s_header_value);
1429
1413
  parser->index = 0;
1430
1414
 
1431
1415
  c = LOWER(ch);
@@ -1441,17 +1425,33 @@ size_t http_parser_execute (http_parser *parser,
1441
1425
  if ('c' == c) {
1442
1426
  parser->header_state = h_matching_transfer_encoding_chunked;
1443
1427
  } else {
1444
- parser->header_state = h_general;
1428
+ parser->header_state = h_matching_transfer_encoding_token;
1445
1429
  }
1446
1430
  break;
1447
1431
 
1432
+ /* Multi-value `Transfer-Encoding` header */
1433
+ case h_matching_transfer_encoding_token_start:
1434
+ break;
1435
+
1448
1436
  case h_content_length:
1449
- if (!IS_NUM(ch)) {
1437
+ if (UNLIKELY(!IS_NUM(ch))) {
1450
1438
  SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1451
1439
  goto error;
1452
1440
  }
1453
1441
 
1442
+ if (parser->flags & F_CONTENTLENGTH) {
1443
+ SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
1444
+ goto error;
1445
+ }
1446
+
1447
+ parser->flags |= F_CONTENTLENGTH;
1454
1448
  parser->content_length = ch - '0';
1449
+ parser->header_state = h_content_length_num;
1450
+ break;
1451
+
1452
+ /* when obsolete line folding is encountered for content length
1453
+ * continue to the s_header_value state */
1454
+ case h_content_length_ws:
1455
1455
  break;
1456
1456
 
1457
1457
  case h_connection:
@@ -1461,11 +1461,17 @@ size_t http_parser_execute (http_parser *parser,
1461
1461
  /* looking for 'Connection: close' */
1462
1462
  } else if (c == 'c') {
1463
1463
  parser->header_state = h_matching_connection_close;
1464
+ } else if (c == 'u') {
1465
+ parser->header_state = h_matching_connection_upgrade;
1464
1466
  } else {
1465
- parser->header_state = h_general;
1467
+ parser->header_state = h_matching_connection_token;
1466
1468
  }
1467
1469
  break;
1468
1470
 
1471
+ /* Multi-value `Connection` header */
1472
+ case h_matching_connection_token_start:
1473
+ break;
1474
+
1469
1475
  default:
1470
1476
  parser->header_state = h_general;
1471
1477
  break;
@@ -1475,114 +1481,250 @@ size_t http_parser_execute (http_parser *parser,
1475
1481
 
1476
1482
  case s_header_value:
1477
1483
  {
1484
+ const char* start = p;
1485
+ enum header_states h_state = (enum header_states) parser->header_state;
1486
+ for (; p != data + len; p++) {
1487
+ ch = *p;
1488
+ if (ch == CR) {
1489
+ UPDATE_STATE(s_header_almost_done);
1490
+ parser->header_state = h_state;
1491
+ CALLBACK_DATA(header_value);
1492
+ break;
1493
+ }
1478
1494
 
1479
- if (ch == CR) {
1480
- parser->state = s_header_almost_done;
1481
- CALLBACK_DATA(header_value);
1482
- break;
1483
- }
1495
+ if (ch == LF) {
1496
+ UPDATE_STATE(s_header_almost_done);
1497
+ COUNT_HEADER_SIZE(p - start);
1498
+ parser->header_state = h_state;
1499
+ CALLBACK_DATA_NOADVANCE(header_value);
1500
+ REEXECUTE();
1501
+ }
1484
1502
 
1485
- if (ch == LF) {
1486
- parser->state = s_header_almost_done;
1487
- CALLBACK_DATA_NOADVANCE(header_value);
1488
- goto reexecute_byte;
1489
- }
1503
+ if (!lenient && !IS_HEADER_CHAR(ch)) {
1504
+ SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
1505
+ goto error;
1506
+ }
1490
1507
 
1491
- c = LOWER(ch);
1508
+ c = LOWER(ch);
1492
1509
 
1493
- switch (parser->header_state) {
1494
- case h_general:
1495
- break;
1510
+ switch (h_state) {
1511
+ case h_general:
1512
+ {
1513
+ size_t left = data + len - p;
1514
+ const char* pe = p + MIN(left, max_header_size);
1515
+
1516
+ for (; p != pe; p++) {
1517
+ ch = *p;
1518
+ if (ch == CR || ch == LF) {
1519
+ --p;
1520
+ break;
1521
+ }
1522
+ if (!lenient && !IS_HEADER_CHAR(ch)) {
1523
+ SET_ERRNO(HPE_INVALID_HEADER_TOKEN);
1524
+ goto error;
1525
+ }
1526
+ }
1527
+ if (p == data + len)
1528
+ --p;
1529
+ break;
1530
+ }
1496
1531
 
1497
- case h_connection:
1498
- case h_transfer_encoding:
1499
- assert(0 && "Shouldn't get here.");
1500
- break;
1532
+ case h_connection:
1533
+ case h_transfer_encoding:
1534
+ assert(0 && "Shouldn't get here.");
1535
+ break;
1501
1536
 
1502
- case h_content_length:
1503
- {
1504
- boost::uint64_t t;
1537
+ case h_content_length:
1538
+ if (ch == ' ') break;
1539
+ h_state = h_content_length_num;
1540
+ /* fall through */
1505
1541
 
1506
- if (ch == ' ') break;
1542
+ case h_content_length_num:
1543
+ {
1544
+ uint64_t t;
1507
1545
 
1508
- if (!IS_NUM(ch)) {
1509
- SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1510
- goto error;
1511
- }
1546
+ if (ch == ' ') {
1547
+ h_state = h_content_length_ws;
1548
+ break;
1549
+ }
1550
+
1551
+ if (UNLIKELY(!IS_NUM(ch))) {
1552
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1553
+ parser->header_state = h_state;
1554
+ goto error;
1555
+ }
1556
+
1557
+ t = parser->content_length;
1558
+ t *= 10;
1559
+ t += ch - '0';
1560
+
1561
+ /* Overflow? Test against a conservative limit for simplicity. */
1562
+ if (UNLIKELY((ULLONG_MAX - 10) / 10 < parser->content_length)) {
1563
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1564
+ parser->header_state = h_state;
1565
+ goto error;
1566
+ }
1512
1567
 
1513
- t = parser->content_length;
1514
- t *= 10;
1515
- t += ch - '0';
1568
+ parser->content_length = t;
1569
+ break;
1570
+ }
1516
1571
 
1517
- /* Overflow? Test against a conservative limit for simplicity. */
1518
- if ((ULLONG_MAX - 10) / 10 < parser->content_length) {
1572
+ case h_content_length_ws:
1573
+ if (ch == ' ') break;
1519
1574
  SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1575
+ parser->header_state = h_state;
1520
1576
  goto error;
1521
- }
1522
1577
 
1523
- parser->content_length = t;
1524
- break;
1525
- }
1578
+ /* Transfer-Encoding: chunked */
1579
+ case h_matching_transfer_encoding_token_start:
1580
+ /* looking for 'Transfer-Encoding: chunked' */
1581
+ if ('c' == c) {
1582
+ h_state = h_matching_transfer_encoding_chunked;
1583
+ } else if (STRICT_TOKEN(c)) {
1584
+ /* TODO(indutny): similar code below does this, but why?
1585
+ * At the very least it seems to be inconsistent given that
1586
+ * h_matching_transfer_encoding_token does not check for
1587
+ * `STRICT_TOKEN`
1588
+ */
1589
+ h_state = h_matching_transfer_encoding_token;
1590
+ } else if (c == ' ' || c == '\t') {
1591
+ /* Skip lws */
1592
+ } else {
1593
+ h_state = h_general;
1594
+ }
1595
+ break;
1526
1596
 
1527
- /* Transfer-Encoding: chunked */
1528
- case h_matching_transfer_encoding_chunked:
1529
- parser->index++;
1530
- if (parser->index > sizeof(CHUNKED)-1
1531
- || c != CHUNKED[parser->index]) {
1532
- parser->header_state = h_general;
1533
- } else if (parser->index == sizeof(CHUNKED)-2) {
1534
- parser->header_state = h_transfer_encoding_chunked;
1535
- }
1536
- break;
1597
+ case h_matching_transfer_encoding_chunked:
1598
+ parser->index++;
1599
+ if (parser->index > sizeof(CHUNKED)-1
1600
+ || c != CHUNKED[parser->index]) {
1601
+ h_state = h_matching_transfer_encoding_token;
1602
+ } else if (parser->index == sizeof(CHUNKED)-2) {
1603
+ h_state = h_transfer_encoding_chunked;
1604
+ }
1605
+ break;
1537
1606
 
1538
- /* looking for 'Connection: keep-alive' */
1539
- case h_matching_connection_keep_alive:
1540
- parser->index++;
1541
- if (parser->index > sizeof(KEEP_ALIVE)-1
1542
- || c != KEEP_ALIVE[parser->index]) {
1543
- parser->header_state = h_general;
1544
- } else if (parser->index == sizeof(KEEP_ALIVE)-2) {
1545
- parser->header_state = h_connection_keep_alive;
1546
- }
1547
- break;
1607
+ case h_matching_transfer_encoding_token:
1608
+ if (ch == ',') {
1609
+ h_state = h_matching_transfer_encoding_token_start;
1610
+ parser->index = 0;
1611
+ }
1612
+ break;
1548
1613
 
1549
- /* looking for 'Connection: close' */
1550
- case h_matching_connection_close:
1551
- parser->index++;
1552
- if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) {
1553
- parser->header_state = h_general;
1554
- } else if (parser->index == sizeof(CLOSE)-2) {
1555
- parser->header_state = h_connection_close;
1556
- }
1557
- break;
1614
+ case h_matching_connection_token_start:
1615
+ /* looking for 'Connection: keep-alive' */
1616
+ if (c == 'k') {
1617
+ h_state = h_matching_connection_keep_alive;
1618
+ /* looking for 'Connection: close' */
1619
+ } else if (c == 'c') {
1620
+ h_state = h_matching_connection_close;
1621
+ } else if (c == 'u') {
1622
+ h_state = h_matching_connection_upgrade;
1623
+ } else if (STRICT_TOKEN(c)) {
1624
+ h_state = h_matching_connection_token;
1625
+ } else if (c == ' ' || c == '\t') {
1626
+ /* Skip lws */
1627
+ } else {
1628
+ h_state = h_general;
1629
+ }
1630
+ break;
1558
1631
 
1559
- case h_transfer_encoding_chunked:
1560
- case h_connection_keep_alive:
1561
- case h_connection_close:
1562
- if (ch != ' ') parser->header_state = h_general;
1563
- break;
1632
+ /* looking for 'Connection: keep-alive' */
1633
+ case h_matching_connection_keep_alive:
1634
+ parser->index++;
1635
+ if (parser->index > sizeof(KEEP_ALIVE)-1
1636
+ || c != KEEP_ALIVE[parser->index]) {
1637
+ h_state = h_matching_connection_token;
1638
+ } else if (parser->index == sizeof(KEEP_ALIVE)-2) {
1639
+ h_state = h_connection_keep_alive;
1640
+ }
1641
+ break;
1564
1642
 
1565
- default:
1566
- parser->state = s_header_value;
1567
- parser->header_state = h_general;
1568
- break;
1643
+ /* looking for 'Connection: close' */
1644
+ case h_matching_connection_close:
1645
+ parser->index++;
1646
+ if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) {
1647
+ h_state = h_matching_connection_token;
1648
+ } else if (parser->index == sizeof(CLOSE)-2) {
1649
+ h_state = h_connection_close;
1650
+ }
1651
+ break;
1652
+
1653
+ /* looking for 'Connection: upgrade' */
1654
+ case h_matching_connection_upgrade:
1655
+ parser->index++;
1656
+ if (parser->index > sizeof(UPGRADE) - 1 ||
1657
+ c != UPGRADE[parser->index]) {
1658
+ h_state = h_matching_connection_token;
1659
+ } else if (parser->index == sizeof(UPGRADE)-2) {
1660
+ h_state = h_connection_upgrade;
1661
+ }
1662
+ break;
1663
+
1664
+ case h_matching_connection_token:
1665
+ if (ch == ',') {
1666
+ h_state = h_matching_connection_token_start;
1667
+ parser->index = 0;
1668
+ }
1669
+ break;
1670
+
1671
+ case h_transfer_encoding_chunked:
1672
+ if (ch != ' ') h_state = h_matching_transfer_encoding_token;
1673
+ break;
1674
+
1675
+ case h_connection_keep_alive:
1676
+ case h_connection_close:
1677
+ case h_connection_upgrade:
1678
+ if (ch == ',') {
1679
+ if (h_state == h_connection_keep_alive) {
1680
+ parser->flags |= F_CONNECTION_KEEP_ALIVE;
1681
+ } else if (h_state == h_connection_close) {
1682
+ parser->flags |= F_CONNECTION_CLOSE;
1683
+ } else if (h_state == h_connection_upgrade) {
1684
+ parser->flags |= F_CONNECTION_UPGRADE;
1685
+ }
1686
+ h_state = h_matching_connection_token_start;
1687
+ parser->index = 0;
1688
+ } else if (ch != ' ') {
1689
+ h_state = h_matching_connection_token;
1690
+ }
1691
+ break;
1692
+
1693
+ default:
1694
+ UPDATE_STATE(s_header_value);
1695
+ h_state = h_general;
1696
+ break;
1697
+ }
1569
1698
  }
1699
+ parser->header_state = h_state;
1700
+
1701
+ if (p == data + len)
1702
+ --p;
1703
+
1704
+ COUNT_HEADER_SIZE(p - start);
1570
1705
  break;
1571
1706
  }
1572
1707
 
1573
1708
  case s_header_almost_done:
1574
1709
  {
1575
- STRICT_CHECK(ch != LF);
1710
+ if (UNLIKELY(ch != LF)) {
1711
+ SET_ERRNO(HPE_LF_EXPECTED);
1712
+ goto error;
1713
+ }
1576
1714
 
1577
- parser->state = s_header_value_lws;
1715
+ UPDATE_STATE(s_header_value_lws);
1578
1716
  break;
1579
1717
  }
1580
1718
 
1581
1719
  case s_header_value_lws:
1582
1720
  {
1583
1721
  if (ch == ' ' || ch == '\t') {
1584
- parser->state = s_header_value_start;
1585
- goto reexecute_byte;
1722
+ if (parser->header_state == h_content_length_num) {
1723
+ /* treat obsolete line folding as space */
1724
+ parser->header_state = h_content_length_ws;
1725
+ }
1726
+ UPDATE_STATE(s_header_value_start);
1727
+ REEXECUTE();
1586
1728
  }
1587
1729
 
1588
1730
  /* finished the header */
@@ -1596,32 +1738,57 @@ size_t http_parser_execute (http_parser *parser,
1596
1738
  case h_transfer_encoding_chunked:
1597
1739
  parser->flags |= F_CHUNKED;
1598
1740
  break;
1741
+ case h_connection_upgrade:
1742
+ parser->flags |= F_CONNECTION_UPGRADE;
1743
+ break;
1599
1744
  default:
1600
1745
  break;
1601
1746
  }
1602
1747
 
1603
- parser->state = s_header_field_start;
1604
- goto reexecute_byte;
1748
+ UPDATE_STATE(s_header_field_start);
1749
+ REEXECUTE();
1605
1750
  }
1606
1751
 
1607
1752
  case s_header_value_discard_ws_almost_done:
1608
1753
  {
1609
1754
  STRICT_CHECK(ch != LF);
1610
- parser->state = s_header_value_discard_lws;
1755
+ UPDATE_STATE(s_header_value_discard_lws);
1611
1756
  break;
1612
1757
  }
1613
1758
 
1614
1759
  case s_header_value_discard_lws:
1615
1760
  {
1616
1761
  if (ch == ' ' || ch == '\t') {
1617
- parser->state = s_header_value_discard_ws;
1762
+ UPDATE_STATE(s_header_value_discard_ws);
1618
1763
  break;
1619
1764
  } else {
1765
+ switch (parser->header_state) {
1766
+ case h_connection_keep_alive:
1767
+ parser->flags |= F_CONNECTION_KEEP_ALIVE;
1768
+ break;
1769
+ case h_connection_close:
1770
+ parser->flags |= F_CONNECTION_CLOSE;
1771
+ break;
1772
+ case h_connection_upgrade:
1773
+ parser->flags |= F_CONNECTION_UPGRADE;
1774
+ break;
1775
+ case h_transfer_encoding_chunked:
1776
+ parser->flags |= F_CHUNKED;
1777
+ break;
1778
+ case h_content_length:
1779
+ /* do not allow empty content length */
1780
+ SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1781
+ goto error;
1782
+ break;
1783
+ default:
1784
+ break;
1785
+ }
1786
+
1620
1787
  /* header value was empty */
1621
1788
  MARK(header_value);
1622
- parser->state = s_header_field_start;
1789
+ UPDATE_STATE(s_header_field_start);
1623
1790
  CALLBACK_DATA_NOADVANCE(header_value);
1624
- goto reexecute_byte;
1791
+ REEXECUTE();
1625
1792
  }
1626
1793
  }
1627
1794
 
@@ -1631,16 +1798,43 @@ size_t http_parser_execute (http_parser *parser,
1631
1798
 
1632
1799
  if (parser->flags & F_TRAILING) {
1633
1800
  /* End of a chunked request */
1634
- parser->state = NEW_MESSAGE();
1635
- CALLBACK_NOTIFY(message_complete);
1636
- break;
1801
+ UPDATE_STATE(s_message_done);
1802
+ CALLBACK_NOTIFY_NOADVANCE(chunk_complete);
1803
+ REEXECUTE();
1804
+ }
1805
+
1806
+ /* Cannot use transfer-encoding and a content-length header together
1807
+ per the HTTP specification. (RFC 7230 Section 3.3.3) */
1808
+ if ((parser->uses_transfer_encoding == 1) &&
1809
+ (parser->flags & F_CONTENTLENGTH)) {
1810
+ /* Allow it for lenient parsing as long as `Transfer-Encoding` is
1811
+ * not `chunked` or allow_length_with_encoding is set
1812
+ */
1813
+ if (parser->flags & F_CHUNKED) {
1814
+ if (!allow_chunked_length) {
1815
+ SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
1816
+ goto error;
1817
+ }
1818
+ } else if (!lenient) {
1819
+ SET_ERRNO(HPE_UNEXPECTED_CONTENT_LENGTH);
1820
+ goto error;
1821
+ }
1637
1822
  }
1638
1823
 
1639
- parser->state = s_headers_done;
1824
+ UPDATE_STATE(s_headers_done);
1640
1825
 
1641
1826
  /* Set this here so that on_headers_complete() callbacks can see it */
1642
- parser->upgrade =
1643
- (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT);
1827
+ if ((parser->flags & F_UPGRADE) &&
1828
+ (parser->flags & F_CONNECTION_UPGRADE)) {
1829
+ /* For responses, "Upgrade: foo" and "Connection: upgrade" are
1830
+ * mandatory only when it is a 101 Switching Protocols response,
1831
+ * otherwise it is purely informational, to announce support.
1832
+ */
1833
+ parser->upgrade =
1834
+ (parser->type == HTTP_REQUEST || parser->status_code == 101);
1835
+ } else {
1836
+ parser->upgrade = (parser->method == HTTP_CONNECT);
1837
+ }
1644
1838
 
1645
1839
  /* Here we call the headers_complete callback. This is somewhat
1646
1840
  * different than other callbacks because if the user returns 1, we
@@ -1656,59 +1850,90 @@ size_t http_parser_execute (http_parser *parser,
1656
1850
  case 0:
1657
1851
  break;
1658
1852
 
1853
+ case 2:
1854
+ parser->upgrade = 1;
1855
+
1856
+ /* fall through */
1659
1857
  case 1:
1660
1858
  parser->flags |= F_SKIPBODY;
1661
1859
  break;
1662
1860
 
1663
1861
  default:
1664
1862
  SET_ERRNO(HPE_CB_headers_complete);
1665
- return p - data; /* Error */
1863
+ RETURN(p - data); /* Error */
1666
1864
  }
1667
1865
  }
1668
1866
 
1669
1867
  if (HTTP_PARSER_ERRNO(parser) != HPE_OK) {
1670
- return p - data;
1868
+ RETURN(p - data);
1671
1869
  }
1672
1870
 
1673
- goto reexecute_byte;
1871
+ REEXECUTE();
1674
1872
  }
1675
1873
 
1676
1874
  case s_headers_done:
1677
1875
  {
1876
+ int hasBody;
1678
1877
  STRICT_CHECK(ch != LF);
1679
1878
 
1680
1879
  parser->nread = 0;
1681
-
1682
- /* Exit, the rest of the connect is in a different protocol. */
1683
- if (parser->upgrade) {
1684
- parser->state = NEW_MESSAGE();
1880
+ nread = 0;
1881
+
1882
+ hasBody = parser->flags & F_CHUNKED ||
1883
+ (parser->content_length > 0 && parser->content_length != ULLONG_MAX);
1884
+ if (parser->upgrade && (parser->method == HTTP_CONNECT ||
1885
+ (parser->flags & F_SKIPBODY) || !hasBody)) {
1886
+ /* Exit, the rest of the message is in a different protocol. */
1887
+ UPDATE_STATE(NEW_MESSAGE());
1685
1888
  CALLBACK_NOTIFY(message_complete);
1686
- return (p - data) + 1;
1889
+ RETURN((p - data) + 1);
1687
1890
  }
1688
1891
 
1689
1892
  if (parser->flags & F_SKIPBODY) {
1690
- parser->state = NEW_MESSAGE();
1893
+ UPDATE_STATE(NEW_MESSAGE());
1691
1894
  CALLBACK_NOTIFY(message_complete);
1692
1895
  } else if (parser->flags & F_CHUNKED) {
1693
- /* chunked encoding - ignore Content-Length header */
1694
- parser->state = s_chunk_size_start;
1896
+ /* chunked encoding - ignore Content-Length header,
1897
+ * prepare for a chunk */
1898
+ UPDATE_STATE(s_chunk_size_start);
1899
+ } else if (parser->uses_transfer_encoding == 1) {
1900
+ if (parser->type == HTTP_REQUEST && !lenient) {
1901
+ /* RFC 7230 3.3.3 */
1902
+
1903
+ /* If a Transfer-Encoding header field
1904
+ * is present in a request and the chunked transfer coding is not
1905
+ * the final encoding, the message body length cannot be determined
1906
+ * reliably; the server MUST respond with the 400 (Bad Request)
1907
+ * status code and then close the connection.
1908
+ */
1909
+ SET_ERRNO(HPE_INVALID_TRANSFER_ENCODING);
1910
+ RETURN(p - data); /* Error */
1911
+ } else {
1912
+ /* RFC 7230 3.3.3 */
1913
+
1914
+ /* If a Transfer-Encoding header field is present in a response and
1915
+ * the chunked transfer coding is not the final encoding, the
1916
+ * message body length is determined by reading the connection until
1917
+ * it is closed by the server.
1918
+ */
1919
+ UPDATE_STATE(s_body_identity_eof);
1920
+ }
1695
1921
  } else {
1696
1922
  if (parser->content_length == 0) {
1697
1923
  /* Content-Length header given but zero: Content-Length: 0\r\n */
1698
- parser->state = NEW_MESSAGE();
1924
+ UPDATE_STATE(NEW_MESSAGE());
1699
1925
  CALLBACK_NOTIFY(message_complete);
1700
1926
  } else if (parser->content_length != ULLONG_MAX) {
1701
1927
  /* Content-Length header given and non-zero */
1702
- parser->state = s_body_identity;
1928
+ UPDATE_STATE(s_body_identity);
1703
1929
  } else {
1704
- if (parser->type == HTTP_REQUEST ||
1705
- !http_message_needs_eof(parser)) {
1930
+ if (!http_message_needs_eof(parser)) {
1706
1931
  /* Assume content-length 0 - read the next */
1707
- parser->state = NEW_MESSAGE();
1932
+ UPDATE_STATE(NEW_MESSAGE());
1708
1933
  CALLBACK_NOTIFY(message_complete);
1709
1934
  } else {
1710
1935
  /* Read body until EOF */
1711
- parser->state = s_body_identity_eof;
1936
+ UPDATE_STATE(s_body_identity_eof);
1712
1937
  }
1713
1938
  }
1714
1939
  }
@@ -1718,8 +1943,8 @@ size_t http_parser_execute (http_parser *parser,
1718
1943
 
1719
1944
  case s_body_identity:
1720
1945
  {
1721
- boost::uint64_t to_read = MIN(parser->content_length,
1722
- (boost::uint64_t) ((data + len) - p));
1946
+ uint64_t to_read = MIN(parser->content_length,
1947
+ (uint64_t) ((data + len) - p));
1723
1948
 
1724
1949
  assert(parser->content_length != 0
1725
1950
  && parser->content_length != ULLONG_MAX);
@@ -1734,7 +1959,7 @@ size_t http_parser_execute (http_parser *parser,
1734
1959
  p += to_read - 1;
1735
1960
 
1736
1961
  if (parser->content_length == 0) {
1737
- parser->state = s_message_done;
1962
+ UPDATE_STATE(s_message_done);
1738
1963
 
1739
1964
  /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte.
1740
1965
  *
@@ -1746,7 +1971,7 @@ size_t http_parser_execute (http_parser *parser,
1746
1971
  * important for applications, but let's keep it for now.
1747
1972
  */
1748
1973
  CALLBACK_DATA_(body, p - body_mark + 1, p - data);
1749
- goto reexecute_byte;
1974
+ REEXECUTE();
1750
1975
  }
1751
1976
 
1752
1977
  break;
@@ -1760,34 +1985,38 @@ size_t http_parser_execute (http_parser *parser,
1760
1985
  break;
1761
1986
 
1762
1987
  case s_message_done:
1763
- parser->state = NEW_MESSAGE();
1988
+ UPDATE_STATE(NEW_MESSAGE());
1764
1989
  CALLBACK_NOTIFY(message_complete);
1990
+ if (parser->upgrade) {
1991
+ /* Exit, the rest of the message is in a different protocol. */
1992
+ RETURN((p - data) + 1);
1993
+ }
1765
1994
  break;
1766
1995
 
1767
1996
  case s_chunk_size_start:
1768
1997
  {
1769
- assert(parser->nread == 1);
1998
+ assert(nread == 1);
1770
1999
  assert(parser->flags & F_CHUNKED);
1771
2000
 
1772
2001
  unhex_val = unhex[(unsigned char)ch];
1773
- if (unhex_val == -1) {
2002
+ if (UNLIKELY(unhex_val == -1)) {
1774
2003
  SET_ERRNO(HPE_INVALID_CHUNK_SIZE);
1775
2004
  goto error;
1776
2005
  }
1777
2006
 
1778
2007
  parser->content_length = unhex_val;
1779
- parser->state = s_chunk_size;
2008
+ UPDATE_STATE(s_chunk_size);
1780
2009
  break;
1781
2010
  }
1782
2011
 
1783
2012
  case s_chunk_size:
1784
2013
  {
1785
- boost::uint64_t t;
2014
+ uint64_t t;
1786
2015
 
1787
2016
  assert(parser->flags & F_CHUNKED);
1788
2017
 
1789
2018
  if (ch == CR) {
1790
- parser->state = s_chunk_size_almost_done;
2019
+ UPDATE_STATE(s_chunk_size_almost_done);
1791
2020
  break;
1792
2021
  }
1793
2022
 
@@ -1795,7 +2024,7 @@ size_t http_parser_execute (http_parser *parser,
1795
2024
 
1796
2025
  if (unhex_val == -1) {
1797
2026
  if (ch == ';' || ch == ' ') {
1798
- parser->state = s_chunk_parameters;
2027
+ UPDATE_STATE(s_chunk_parameters);
1799
2028
  break;
1800
2029
  }
1801
2030
 
@@ -1808,7 +2037,7 @@ size_t http_parser_execute (http_parser *parser,
1808
2037
  t += unhex_val;
1809
2038
 
1810
2039
  /* Overflow? Test against a conservative limit for simplicity. */
1811
- if ((ULLONG_MAX - 16) / 16 < parser->content_length) {
2040
+ if (UNLIKELY((ULLONG_MAX - 16) / 16 < parser->content_length)) {
1812
2041
  SET_ERRNO(HPE_INVALID_CONTENT_LENGTH);
1813
2042
  goto error;
1814
2043
  }
@@ -1822,7 +2051,7 @@ size_t http_parser_execute (http_parser *parser,
1822
2051
  assert(parser->flags & F_CHUNKED);
1823
2052
  /* just ignore this shit. TODO check for overflow */
1824
2053
  if (ch == CR) {
1825
- parser->state = s_chunk_size_almost_done;
2054
+ UPDATE_STATE(s_chunk_size_almost_done);
1826
2055
  break;
1827
2056
  }
1828
2057
  break;
@@ -1834,20 +2063,22 @@ size_t http_parser_execute (http_parser *parser,
1834
2063
  STRICT_CHECK(ch != LF);
1835
2064
 
1836
2065
  parser->nread = 0;
2066
+ nread = 0;
1837
2067
 
1838
2068
  if (parser->content_length == 0) {
1839
2069
  parser->flags |= F_TRAILING;
1840
- parser->state = s_header_field_start;
2070
+ UPDATE_STATE(s_header_field_start);
1841
2071
  } else {
1842
- parser->state = s_chunk_data;
2072
+ UPDATE_STATE(s_chunk_data);
1843
2073
  }
2074
+ CALLBACK_NOTIFY(chunk_header);
1844
2075
  break;
1845
2076
  }
1846
2077
 
1847
2078
  case s_chunk_data:
1848
2079
  {
1849
- boost::uint64_t to_read = MIN(parser->content_length,
1850
- (boost::uint64_t) ((data + len) - p));
2080
+ uint64_t to_read = MIN(parser->content_length,
2081
+ (uint64_t) ((data + len) - p));
1851
2082
 
1852
2083
  assert(parser->flags & F_CHUNKED);
1853
2084
  assert(parser->content_length != 0
@@ -1861,7 +2092,7 @@ size_t http_parser_execute (http_parser *parser,
1861
2092
  p += to_read - 1;
1862
2093
 
1863
2094
  if (parser->content_length == 0) {
1864
- parser->state = s_chunk_data_almost_done;
2095
+ UPDATE_STATE(s_chunk_data_almost_done);
1865
2096
  }
1866
2097
 
1867
2098
  break;
@@ -1871,7 +2102,7 @@ size_t http_parser_execute (http_parser *parser,
1871
2102
  assert(parser->flags & F_CHUNKED);
1872
2103
  assert(parser->content_length == 0);
1873
2104
  STRICT_CHECK(ch != CR);
1874
- parser->state = s_chunk_data_done;
2105
+ UPDATE_STATE(s_chunk_data_done);
1875
2106
  CALLBACK_DATA(body);
1876
2107
  break;
1877
2108
 
@@ -1879,7 +2110,9 @@ size_t http_parser_execute (http_parser *parser,
1879
2110
  assert(parser->flags & F_CHUNKED);
1880
2111
  STRICT_CHECK(ch != LF);
1881
2112
  parser->nread = 0;
1882
- parser->state = s_chunk_size_start;
2113
+ nread = 0;
2114
+ UPDATE_STATE(s_chunk_size_start);
2115
+ CALLBACK_NOTIFY(chunk_complete);
1883
2116
  break;
1884
2117
 
1885
2118
  default:
@@ -1889,7 +2122,7 @@ size_t http_parser_execute (http_parser *parser,
1889
2122
  }
1890
2123
  }
1891
2124
 
1892
- /* Run callbacks for any marks that we have leftover after we ran our of
2125
+ /* Run callbacks for any marks that we have leftover after we ran out of
1893
2126
  * bytes. There should be at most one of these set, so it's OK to invoke
1894
2127
  * them in series (unset marks will not result in callbacks).
1895
2128
  *
@@ -1911,14 +2144,14 @@ size_t http_parser_execute (http_parser *parser,
1911
2144
  CALLBACK_DATA_NOADVANCE(body);
1912
2145
  CALLBACK_DATA_NOADVANCE(status);
1913
2146
 
1914
- return len;
2147
+ RETURN(len);
1915
2148
 
1916
2149
  error:
1917
2150
  if (HTTP_PARSER_ERRNO(parser) == HPE_OK) {
1918
2151
  SET_ERRNO(HPE_UNKNOWN);
1919
2152
  }
1920
2153
 
1921
- return (p - data);
2154
+ RETURN(p - data);
1922
2155
  }
1923
2156
 
1924
2157
 
@@ -1938,6 +2171,12 @@ http_message_needs_eof (const http_parser *parser)
1938
2171
  return 0;
1939
2172
  }
1940
2173
 
2174
+ /* RFC 7230 3.3.3, see `s_headers_almost_done` */
2175
+ if ((parser->uses_transfer_encoding == 1) &&
2176
+ (parser->flags & F_CHUNKED) == 0) {
2177
+ return 1;
2178
+ }
2179
+
1941
2180
  if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) {
1942
2181
  return 0;
1943
2182
  }
@@ -1971,6 +2210,16 @@ http_method_str (enum http_method m)
1971
2210
  return ELEM_AT(method_strings, m, "<unknown>");
1972
2211
  }
1973
2212
 
2213
+ const char *
2214
+ http_status_str (enum http_status s)
2215
+ {
2216
+ switch (s) {
2217
+ #define XX(num, name, string) case HTTP_STATUS_##name: return #string;
2218
+ HTTP_STATUS_MAP(XX)
2219
+ #undef XX
2220
+ default: return "<unknown>";
2221
+ }
2222
+ }
1974
2223
 
1975
2224
  void
1976
2225
  http_parser_init (http_parser *parser, enum http_parser_type t)
@@ -1983,15 +2232,21 @@ http_parser_init (http_parser *parser, enum http_parser_type t)
1983
2232
  parser->http_errno = HPE_OK;
1984
2233
  }
1985
2234
 
2235
+ void
2236
+ http_parser_settings_init(http_parser_settings *settings)
2237
+ {
2238
+ memset(settings, 0, sizeof(*settings));
2239
+ }
2240
+
1986
2241
  const char *
1987
2242
  http_errno_name(enum http_errno err) {
1988
- assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));
2243
+ assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab));
1989
2244
  return http_strerror_tab[err].name;
1990
2245
  }
1991
2246
 
1992
2247
  const char *
1993
2248
  http_errno_description(enum http_errno err) {
1994
- assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0])));
2249
+ assert(((size_t) err) < ARRAY_SIZE(http_strerror_tab));
1995
2250
  return http_strerror_tab[err].description;
1996
2251
  }
1997
2252
 
@@ -2025,7 +2280,7 @@ http_parse_host_char(enum http_host_state s, const char ch) {
2025
2280
  return s_http_host;
2026
2281
  }
2027
2282
 
2028
- /* FALLTHROUGH */
2283
+ /* fall through */
2029
2284
  case s_http_host_v6_end:
2030
2285
  if (ch == ':') {
2031
2286
  return s_http_host_port_start;
@@ -2038,12 +2293,29 @@ http_parse_host_char(enum http_host_state s, const char ch) {
2038
2293
  return s_http_host_v6_end;
2039
2294
  }
2040
2295
 
2041
- /* FALLTHROUGH */
2296
+ /* fall through */
2042
2297
  case s_http_host_v6_start:
2043
2298
  if (IS_HEX(ch) || ch == ':' || ch == '.') {
2044
2299
  return s_http_host_v6;
2045
2300
  }
2046
2301
 
2302
+ if (s == s_http_host_v6 && ch == '%') {
2303
+ return s_http_host_v6_zone_start;
2304
+ }
2305
+ break;
2306
+
2307
+ case s_http_host_v6_zone:
2308
+ if (ch == ']') {
2309
+ return s_http_host_v6_end;
2310
+ }
2311
+
2312
+ /* fall through */
2313
+ case s_http_host_v6_zone_start:
2314
+ /* RFC 6874 Zone ID consists of 1*( unreserved / pct-encoded) */
2315
+ if (IS_ALPHANUM(ch) || ch == '%' || ch == '.' || ch == '-' || ch == '_' ||
2316
+ ch == '~') {
2317
+ return s_http_host_v6_zone;
2318
+ }
2047
2319
  break;
2048
2320
 
2049
2321
  case s_http_host_port:
@@ -2062,12 +2334,13 @@ http_parse_host_char(enum http_host_state s, const char ch) {
2062
2334
 
2063
2335
  static int
2064
2336
  http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
2065
- assert(u->field_set & (1 << UF_HOST));
2066
2337
  enum http_host_state s;
2067
2338
 
2068
2339
  const char *p;
2069
2340
  size_t buflen = u->field_data[UF_HOST].off + u->field_data[UF_HOST].len;
2070
2341
 
2342
+ assert(u->field_set & (1 << UF_HOST));
2343
+
2071
2344
  u->field_data[UF_HOST].len = 0;
2072
2345
 
2073
2346
  s = found_at ? s_http_userinfo_start : s_http_host_start;
@@ -2082,21 +2355,26 @@ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
2082
2355
  switch(new_s) {
2083
2356
  case s_http_host:
2084
2357
  if (s != s_http_host) {
2085
- u->field_data[UF_HOST].off = p - buf;
2358
+ u->field_data[UF_HOST].off = (uint16_t)(p - buf);
2086
2359
  }
2087
2360
  u->field_data[UF_HOST].len++;
2088
2361
  break;
2089
2362
 
2090
2363
  case s_http_host_v6:
2091
2364
  if (s != s_http_host_v6) {
2092
- u->field_data[UF_HOST].off = p - buf;
2365
+ u->field_data[UF_HOST].off = (uint16_t)(p - buf);
2093
2366
  }
2094
2367
  u->field_data[UF_HOST].len++;
2095
2368
  break;
2096
2369
 
2370
+ case s_http_host_v6_zone_start:
2371
+ case s_http_host_v6_zone:
2372
+ u->field_data[UF_HOST].len++;
2373
+ break;
2374
+
2097
2375
  case s_http_host_port:
2098
2376
  if (s != s_http_host_port) {
2099
- u->field_data[UF_PORT].off = p - buf;
2377
+ u->field_data[UF_PORT].off = (uint16_t)(p - buf);
2100
2378
  u->field_data[UF_PORT].len = 0;
2101
2379
  u->field_set |= (1 << UF_PORT);
2102
2380
  }
@@ -2105,7 +2383,7 @@ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
2105
2383
 
2106
2384
  case s_http_userinfo:
2107
2385
  if (s != s_http_userinfo) {
2108
- u->field_data[UF_USERINFO].off = p - buf ;
2386
+ u->field_data[UF_USERINFO].off = (uint16_t)(p - buf);
2109
2387
  u->field_data[UF_USERINFO].len = 0;
2110
2388
  u->field_set |= (1 << UF_USERINFO);
2111
2389
  }
@@ -2123,6 +2401,8 @@ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
2123
2401
  case s_http_host_start:
2124
2402
  case s_http_host_v6_start:
2125
2403
  case s_http_host_v6:
2404
+ case s_http_host_v6_zone_start:
2405
+ case s_http_host_v6_zone:
2126
2406
  case s_http_host_port_start:
2127
2407
  case s_http_userinfo:
2128
2408
  case s_http_userinfo_start:
@@ -2134,6 +2414,11 @@ http_parse_host(const char * buf, struct http_parser_url *u, int found_at) {
2134
2414
  return 0;
2135
2415
  }
2136
2416
 
2417
+ void
2418
+ http_parser_url_init(struct http_parser_url *u) {
2419
+ memset(u, 0, sizeof(*u));
2420
+ }
2421
+
2137
2422
  int
2138
2423
  http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
2139
2424
  struct http_parser_url *u)
@@ -2143,6 +2428,10 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
2143
2428
  enum http_parser_url_fields uf, old_uf;
2144
2429
  int found_at = 0;
2145
2430
 
2431
+ if (buflen == 0) {
2432
+ return 1;
2433
+ }
2434
+
2146
2435
  u->port = u->field_set = 0;
2147
2436
  s = is_connect ? s_req_server_start : s_req_spaces_before_url;
2148
2437
  old_uf = UF_MAX;
@@ -2170,7 +2459,7 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
2170
2459
  case s_req_server_with_at:
2171
2460
  found_at = 1;
2172
2461
 
2173
- /* FALLTROUGH */
2462
+ /* fall through */
2174
2463
  case s_req_server:
2175
2464
  uf = UF_HOST;
2176
2465
  break;
@@ -2198,7 +2487,7 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
2198
2487
  continue;
2199
2488
  }
2200
2489
 
2201
- u->field_data[uf].off = p - buf;
2490
+ u->field_data[uf].off = (uint16_t)(p - buf);
2202
2491
  u->field_data[uf].len = 1;
2203
2492
 
2204
2493
  u->field_set |= (1 << uf);
@@ -2224,15 +2513,30 @@ http_parser_parse_url(const char *buf, size_t buflen, int is_connect,
2224
2513
  }
2225
2514
 
2226
2515
  if (u->field_set & (1 << UF_PORT)) {
2227
- /* Don't bother with endp; we've already validated the string */
2228
- unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10);
2229
-
2230
- /* Ports have a max value of 2^16 */
2231
- if (v > 0xffff) {
2232
- return 1;
2516
+ uint16_t off;
2517
+ uint16_t len;
2518
+ const char* p;
2519
+ const char* end;
2520
+ unsigned long v;
2521
+
2522
+ off = u->field_data[UF_PORT].off;
2523
+ len = u->field_data[UF_PORT].len;
2524
+ end = buf + off + len;
2525
+
2526
+ /* NOTE: The characters are already validated and are in the [0-9] range */
2527
+ assert((size_t) (off + len) <= buflen && "Port number overflow");
2528
+ v = 0;
2529
+ for (p = buf + off; p < end; p++) {
2530
+ v *= 10;
2531
+ v += *p - '0';
2532
+
2533
+ /* Ports have a max value of 2^16 */
2534
+ if (v > 0xffff) {
2535
+ return 1;
2536
+ }
2233
2537
  }
2234
2538
 
2235
- u->port = (boost::uint16_t) v;
2539
+ u->port = (uint16_t) v;
2236
2540
  }
2237
2541
 
2238
2542
  return 0;
@@ -2246,6 +2550,7 @@ http_parser_pause(http_parser *parser, int paused) {
2246
2550
  */
2247
2551
  if (HTTP_PARSER_ERRNO(parser) == HPE_OK ||
2248
2552
  HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) {
2553
+ uint32_t nread = parser->nread; /* used by the SET_ERRNO macro */
2249
2554
  SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK);
2250
2555
  } else {
2251
2556
  assert(0 && "Attempting to pause parser in error state");
@@ -2263,3 +2568,8 @@ http_parser_version(void) {
2263
2568
  HTTP_PARSER_VERSION_MINOR * 0x00100 |
2264
2569
  HTTP_PARSER_VERSION_PATCH * 0x00001;
2265
2570
  }
2571
+
2572
+ void
2573
+ http_parser_set_max_header_size(uint32_t size) {
2574
+ max_header_size = size;
2575
+ }