couchbase 3.0.0.alpha.1-universal-darwin-19 → 3.0.0.beta.1-universal-darwin-19

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (912) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/Gemfile +12 -2
  4. data/README.md +57 -2
  5. data/Rakefile +22 -0
  6. data/couchbase.gemspec +44 -11
  7. data/examples/analytics.rb +221 -0
  8. data/examples/crud.rb +1 -2
  9. data/examples/managing_analytics_indexes.rb +72 -0
  10. data/examples/managing_buckets.rb +47 -0
  11. data/examples/managing_collections.rb +58 -0
  12. data/examples/managing_query_indexes.rb +63 -0
  13. data/examples/managing_search_indexes.rb +62 -0
  14. data/examples/managing_view_indexes.rb +54 -0
  15. data/examples/query.rb +3 -2
  16. data/examples/query_with_consistency.rb +76 -0
  17. data/examples/search.rb +187 -0
  18. data/examples/search_with_consistency.rb +84 -0
  19. data/examples/subdocument.rb +25 -3
  20. data/examples/view.rb +50 -0
  21. data/ext/.clang-format +1 -1
  22. data/ext/.clang-tidy +2 -0
  23. data/ext/.idea/dictionaries/couchbase_terms.xml +2 -0
  24. data/ext/.idea/misc.xml +12 -0
  25. data/ext/.idea/vcs.xml +1 -0
  26. data/ext/CMakeLists.txt +40 -13
  27. data/ext/{couchbase/io/binary_message.hxx → build_config.hxx.in} +1 -19
  28. data/ext/build_version.hxx.in +26 -0
  29. data/ext/couchbase/bucket.hxx +105 -19
  30. data/ext/couchbase/cluster.hxx +148 -90
  31. data/ext/couchbase/cluster_options.hxx +53 -0
  32. data/ext/couchbase/collections_manifest.hxx +3 -3
  33. data/ext/couchbase/configuration.hxx +234 -2
  34. data/ext/couchbase/couchbase.cxx +4833 -476
  35. data/ext/couchbase/{operations/document_id.hxx → document_id.hxx} +5 -4
  36. data/ext/couchbase/io/dns_client.hxx +217 -0
  37. data/ext/couchbase/io/dns_codec.hxx +207 -0
  38. data/ext/couchbase/io/dns_config.hxx +116 -0
  39. data/ext/couchbase/io/dns_message.hxx +555 -0
  40. data/ext/couchbase/io/http_command.hxx +91 -0
  41. data/ext/couchbase/io/http_message.hxx +5 -1
  42. data/ext/couchbase/io/http_parser.hxx +2 -1
  43. data/ext/couchbase/io/http_session.hxx +120 -41
  44. data/ext/couchbase/io/{session_manager.hxx → http_session_manager.hxx} +43 -28
  45. data/ext/couchbase/io/mcbp_command.hxx +180 -0
  46. data/ext/couchbase/io/mcbp_message.hxx +63 -0
  47. data/ext/couchbase/io/mcbp_parser.hxx +101 -0
  48. data/ext/couchbase/io/mcbp_session.hxx +1046 -0
  49. data/ext/couchbase/io/streams.hxx +165 -0
  50. data/ext/couchbase/mutation_token.hxx +2 -1
  51. data/ext/couchbase/operations.hxx +70 -8
  52. data/ext/couchbase/operations/analytics_dataset_create.hxx +117 -0
  53. data/ext/couchbase/operations/analytics_dataset_drop.hxx +103 -0
  54. data/ext/couchbase/operations/analytics_dataset_get_all.hxx +107 -0
  55. data/ext/couchbase/operations/analytics_dataverse_create.hxx +104 -0
  56. data/ext/couchbase/operations/analytics_dataverse_drop.hxx +104 -0
  57. data/ext/couchbase/operations/analytics_get_pending_mutations.hxx +91 -0
  58. data/ext/couchbase/operations/analytics_index_create.hxx +128 -0
  59. data/ext/couchbase/operations/analytics_index_drop.hxx +110 -0
  60. data/ext/couchbase/operations/analytics_index_get_all.hxx +106 -0
  61. data/ext/couchbase/operations/analytics_link_connect.hxx +102 -0
  62. data/ext/couchbase/operations/analytics_link_disconnect.hxx +101 -0
  63. data/ext/couchbase/operations/bucket_create.hxx +141 -0
  64. data/ext/couchbase/operations/bucket_drop.hxx +68 -0
  65. data/ext/couchbase/operations/bucket_flush.hxx +68 -0
  66. data/ext/couchbase/operations/bucket_get.hxx +72 -0
  67. data/ext/couchbase/operations/bucket_get_all.hxx +65 -0
  68. data/ext/couchbase/operations/bucket_settings.hxx +111 -0
  69. data/ext/couchbase/operations/bucket_update.hxx +118 -0
  70. data/ext/couchbase/operations/cluster_developer_preview_enable.hxx +63 -0
  71. data/ext/couchbase/operations/collection_create.hxx +93 -0
  72. data/ext/couchbase/operations/collection_drop.hxx +85 -0
  73. data/ext/couchbase/operations/design_document.hxx +59 -0
  74. data/ext/couchbase/operations/document_analytics.hxx +288 -0
  75. data/ext/couchbase/operations/document_decrement.hxx +85 -0
  76. data/ext/couchbase/operations/document_exists.hxx +82 -0
  77. data/ext/couchbase/operations/{get.hxx → document_get.hxx} +10 -3
  78. data/ext/couchbase/operations/document_get_and_lock.hxx +69 -0
  79. data/ext/couchbase/operations/document_get_and_touch.hxx +69 -0
  80. data/ext/couchbase/operations/document_get_projected.hxx +247 -0
  81. data/ext/couchbase/operations/document_increment.hxx +87 -0
  82. data/ext/couchbase/operations/document_insert.hxx +79 -0
  83. data/ext/couchbase/operations/{lookup_in.hxx → document_lookup_in.hxx} +27 -3
  84. data/ext/couchbase/operations/{mutate_in.hxx → document_mutate_in.hxx} +58 -3
  85. data/ext/couchbase/operations/{query.hxx → document_query.hxx} +117 -12
  86. data/ext/couchbase/operations/{remove.hxx → document_remove.hxx} +17 -3
  87. data/ext/couchbase/operations/document_replace.hxx +81 -0
  88. data/ext/couchbase/operations/document_search.hxx +355 -0
  89. data/ext/couchbase/operations/document_touch.hxx +65 -0
  90. data/ext/couchbase/operations/{upsert.hxx → document_unlock.hxx} +17 -12
  91. data/ext/couchbase/operations/document_upsert.hxx +79 -0
  92. data/ext/couchbase/operations/document_view.hxx +228 -0
  93. data/ext/couchbase/operations/query_index_build_deferred.hxx +86 -0
  94. data/ext/couchbase/operations/query_index_create.hxx +135 -0
  95. data/ext/couchbase/operations/query_index_drop.hxx +109 -0
  96. data/ext/couchbase/operations/query_index_get_all.hxx +107 -0
  97. data/ext/couchbase/operations/scope_create.hxx +84 -0
  98. data/ext/couchbase/operations/scope_drop.hxx +82 -0
  99. data/ext/couchbase/operations/scope_get_all.hxx +76 -0
  100. data/ext/couchbase/operations/search_index.hxx +79 -0
  101. data/ext/couchbase/operations/search_index_analyze_document.hxx +92 -0
  102. data/ext/couchbase/operations/search_index_control_ingest.hxx +80 -0
  103. data/ext/couchbase/operations/search_index_control_plan_freeze.hxx +80 -0
  104. data/ext/couchbase/operations/search_index_control_query.hxx +80 -0
  105. data/ext/couchbase/operations/search_index_drop.hxx +77 -0
  106. data/ext/couchbase/operations/search_index_get.hxx +80 -0
  107. data/ext/couchbase/operations/search_index_get_all.hxx +82 -0
  108. data/ext/couchbase/operations/search_index_get_documents_count.hxx +81 -0
  109. data/ext/couchbase/operations/search_index_upsert.hxx +106 -0
  110. data/ext/couchbase/operations/view_index_drop.hxx +67 -0
  111. data/ext/couchbase/operations/view_index_get.hxx +90 -0
  112. data/ext/couchbase/operations/view_index_get_all.hxx +125 -0
  113. data/ext/couchbase/operations/view_index_upsert.hxx +87 -0
  114. data/ext/couchbase/origin.hxx +148 -0
  115. data/ext/couchbase/protocol/client_opcode.hxx +52 -3
  116. data/ext/couchbase/protocol/client_request.hxx +56 -9
  117. data/ext/couchbase/protocol/client_response.hxx +53 -16
  118. data/ext/couchbase/protocol/cmd_cluster_map_change_notification.hxx +76 -0
  119. data/ext/couchbase/protocol/cmd_decrement.hxx +187 -0
  120. data/ext/couchbase/protocol/cmd_exists.hxx +171 -0
  121. data/ext/couchbase/protocol/cmd_get.hxx +31 -8
  122. data/ext/couchbase/protocol/cmd_get_and_lock.hxx +142 -0
  123. data/ext/couchbase/protocol/cmd_get_and_touch.hxx +142 -0
  124. data/ext/couchbase/protocol/cmd_get_cluster_config.hxx +16 -8
  125. data/ext/couchbase/protocol/cmd_get_collection_id.hxx +117 -0
  126. data/ext/couchbase/protocol/cmd_get_collections_manifest.hxx +16 -3
  127. data/ext/couchbase/protocol/cmd_get_error_map.hxx +16 -3
  128. data/ext/couchbase/protocol/cmd_hello.hxx +34 -8
  129. data/ext/couchbase/protocol/cmd_increment.hxx +187 -0
  130. data/ext/couchbase/protocol/cmd_info.hxx +1 -11
  131. data/ext/couchbase/protocol/cmd_insert.hxx +172 -0
  132. data/ext/couchbase/protocol/cmd_lookup_in.hxx +29 -13
  133. data/ext/couchbase/protocol/cmd_mutate_in.hxx +116 -16
  134. data/ext/couchbase/protocol/cmd_remove.hxx +59 -4
  135. data/ext/couchbase/protocol/cmd_replace.hxx +172 -0
  136. data/ext/couchbase/protocol/cmd_sasl_auth.hxx +15 -3
  137. data/ext/couchbase/protocol/cmd_sasl_list_mechs.hxx +15 -3
  138. data/ext/couchbase/protocol/cmd_sasl_step.hxx +15 -3
  139. data/ext/couchbase/protocol/cmd_select_bucket.hxx +14 -2
  140. data/ext/couchbase/protocol/cmd_touch.hxx +102 -0
  141. data/ext/couchbase/protocol/cmd_unlock.hxx +95 -0
  142. data/ext/couchbase/protocol/cmd_upsert.hxx +54 -18
  143. data/ext/couchbase/protocol/durability_level.hxx +67 -0
  144. data/ext/couchbase/protocol/frame_info_id.hxx +187 -0
  145. data/ext/couchbase/protocol/hello_feature.hxx +137 -0
  146. data/ext/couchbase/protocol/server_opcode.hxx +57 -0
  147. data/ext/couchbase/protocol/server_request.hxx +122 -0
  148. data/ext/couchbase/protocol/unsigned_leb128.h +15 -15
  149. data/ext/couchbase/service_type.hxx +38 -1
  150. data/ext/couchbase/timeout_defaults.hxx +41 -0
  151. data/ext/couchbase/utils/byteswap.hxx +1 -2
  152. data/ext/couchbase/utils/connection_string.hxx +370 -0
  153. data/ext/couchbase/utils/url_codec.hxx +225 -0
  154. data/ext/couchbase/version.hxx +3 -1
  155. data/ext/extconf.rb +46 -10
  156. data/ext/test/main.cxx +111 -118
  157. data/ext/third_party/http_parser/Makefile +160 -0
  158. data/ext/third_party/json/Makefile +77 -0
  159. data/ext/third_party/snappy/.appveyor.yml +36 -0
  160. data/ext/third_party/snappy/.gitignore +8 -0
  161. data/ext/third_party/snappy/.travis.yml +98 -0
  162. data/ext/third_party/snappy/AUTHORS +1 -0
  163. data/ext/third_party/snappy/CMakeLists.txt +345 -0
  164. data/ext/third_party/snappy/CONTRIBUTING.md +26 -0
  165. data/ext/third_party/snappy/COPYING +54 -0
  166. data/ext/third_party/snappy/NEWS +188 -0
  167. data/ext/third_party/snappy/README.md +148 -0
  168. data/ext/third_party/snappy/cmake/SnappyConfig.cmake.in +33 -0
  169. data/ext/third_party/snappy/cmake/config.h.in +59 -0
  170. data/ext/third_party/snappy/docs/README.md +72 -0
  171. data/ext/third_party/snappy/format_description.txt +110 -0
  172. data/ext/third_party/snappy/framing_format.txt +135 -0
  173. data/ext/third_party/snappy/snappy-c.cc +90 -0
  174. data/ext/third_party/snappy/snappy-c.h +138 -0
  175. data/ext/third_party/snappy/snappy-internal.h +315 -0
  176. data/ext/third_party/snappy/snappy-sinksource.cc +121 -0
  177. data/ext/third_party/snappy/snappy-sinksource.h +182 -0
  178. data/ext/third_party/snappy/snappy-stubs-internal.cc +42 -0
  179. data/ext/third_party/snappy/snappy-stubs-internal.h +493 -0
  180. data/ext/third_party/snappy/snappy-stubs-public.h.in +63 -0
  181. data/ext/third_party/snappy/snappy-test.cc +613 -0
  182. data/ext/third_party/snappy/snappy-test.h +526 -0
  183. data/ext/third_party/snappy/snappy.cc +1770 -0
  184. data/ext/third_party/snappy/snappy.h +209 -0
  185. data/ext/third_party/snappy/snappy_compress_fuzzer.cc +60 -0
  186. data/ext/third_party/snappy/snappy_uncompress_fuzzer.cc +58 -0
  187. data/ext/third_party/snappy/snappy_unittest.cc +1512 -0
  188. data/lib/couchbase/analytics_options.rb +179 -0
  189. data/lib/couchbase/binary_collection.rb +37 -76
  190. data/lib/couchbase/binary_collection_options.rb +98 -0
  191. data/lib/couchbase/bucket.rb +63 -5
  192. data/lib/couchbase/cluster.rb +189 -113
  193. data/lib/couchbase/collection.rb +153 -200
  194. data/lib/couchbase/collection_options.rb +496 -0
  195. data/{bin/console → lib/couchbase/datastructures.rb} +4 -7
  196. data/lib/couchbase/datastructures/couchbase_list.rb +171 -0
  197. data/lib/couchbase/datastructures/couchbase_map.rb +205 -0
  198. data/lib/couchbase/datastructures/couchbase_queue.rb +145 -0
  199. data/lib/couchbase/datastructures/couchbase_set.rb +138 -0
  200. data/lib/couchbase/errors.rb +140 -135
  201. data/{bin/setup → lib/couchbase/json_transcoder.rb} +17 -8
  202. data/lib/couchbase/libcouchbase.bundle +0 -0
  203. data/lib/couchbase/management/analytics_index_manager.rb +309 -19
  204. data/lib/couchbase/management/bucket_manager.rb +98 -33
  205. data/lib/couchbase/management/collection_manager.rb +175 -1
  206. data/lib/couchbase/management/query_index_manager.rb +271 -0
  207. data/lib/couchbase/management/search_index_manager.rb +338 -0
  208. data/lib/couchbase/management/user_manager.rb +13 -11
  209. data/lib/couchbase/management/view_index_manager.rb +204 -1
  210. data/lib/couchbase/mutation_state.rb +12 -1
  211. data/lib/couchbase/query_options.rb +242 -0
  212. data/lib/couchbase/scope.rb +3 -10
  213. data/lib/couchbase/search_options.rb +1499 -0
  214. data/lib/couchbase/subdoc.rb +80 -19
  215. data/lib/couchbase/version.rb +1 -1
  216. data/lib/couchbase/view_options.rb +156 -0
  217. metadata +164 -777
  218. data/.gitignore +0 -20
  219. data/.gitmodules +0 -15
  220. data/.idea/.gitignore +0 -5
  221. data/.idea/dictionaries/gem_terms.xml +0 -13
  222. data/.idea/inspectionProfiles/Project_Default.xml +0 -7
  223. data/.idea/vcs.xml +0 -11
  224. data/.travis.yml +0 -7
  225. data/ext/couchbase/configuration_monitor.hxx +0 -93
  226. data/ext/couchbase/io/binary_parser.hxx +0 -64
  227. data/ext/couchbase/io/key_value_session.hxx +0 -754
  228. data/ext/couchbase/operations/command.hxx +0 -77
  229. data/ext/third_party/asio/asio/src/examples/cpp03/Makefile.am +0 -251
  230. data/ext/third_party/asio/asio/src/examples/cpp03/allocation/.gitignore +0 -10
  231. data/ext/third_party/asio/asio/src/examples/cpp03/allocation/server.cpp +0 -285
  232. data/ext/third_party/asio/asio/src/examples/cpp03/buffers/.gitignore +0 -10
  233. data/ext/third_party/asio/asio/src/examples/cpp03/buffers/reference_counted.cpp +0 -131
  234. data/ext/third_party/asio/asio/src/examples/cpp03/chat/.gitignore +0 -11
  235. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_client.cpp +0 -177
  236. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_message.hpp +0 -93
  237. data/ext/third_party/asio/asio/src/examples/cpp03/chat/chat_server.cpp +0 -249
  238. data/ext/third_party/asio/asio/src/examples/cpp03/chat/posix_chat_client.cpp +0 -204
  239. data/ext/third_party/asio/asio/src/examples/cpp03/echo/.gitignore +0 -11
  240. data/ext/third_party/asio/asio/src/examples/cpp03/echo/async_tcp_echo_server.cpp +0 -137
  241. data/ext/third_party/asio/asio/src/examples/cpp03/echo/async_udp_echo_server.cpp +0 -92
  242. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_tcp_echo_client.cpp +0 -59
  243. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_tcp_echo_server.cpp +0 -79
  244. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_udp_echo_client.cpp +0 -59
  245. data/ext/third_party/asio/asio/src/examples/cpp03/echo/blocking_udp_echo_server.cpp +0 -53
  246. data/ext/third_party/asio/asio/src/examples/cpp03/fork/.gitignore +0 -11
  247. data/ext/third_party/asio/asio/src/examples/cpp03/fork/daemon.cpp +0 -190
  248. data/ext/third_party/asio/asio/src/examples/cpp03/fork/process_per_connection.cpp +0 -161
  249. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/.gitignore +0 -10
  250. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/async_client.cpp +0 -204
  251. data/ext/third_party/asio/asio/src/examples/cpp03/http/client/sync_client.cpp +0 -106
  252. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_1K.html +0 -28
  253. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_2K.html +0 -49
  254. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_4K.html +0 -91
  255. data/ext/third_party/asio/asio/src/examples/cpp03/http/doc_root/data_8K.html +0 -175
  256. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/.gitignore +0 -11
  257. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection.cpp +0 -99
  258. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection.hpp +0 -83
  259. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection_manager.cpp +0 -38
  260. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/connection_manager.hpp +0 -44
  261. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/header.hpp +0 -28
  262. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/main.cpp +0 -44
  263. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/mime_types.cpp +0 -46
  264. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/mime_types.hpp +0 -27
  265. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/reply.cpp +0 -256
  266. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/reply.hpp +0 -64
  267. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request.hpp +0 -34
  268. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_handler.cpp +0 -122
  269. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_handler.hpp +0 -46
  270. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_parser.cpp +0 -315
  271. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/request_parser.hpp +0 -95
  272. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/server.cpp +0 -94
  273. data/ext/third_party/asio/asio/src/examples/cpp03/http/server/server.hpp +0 -69
  274. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/.gitignore +0 -11
  275. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/connection.cpp +0 -93
  276. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/connection.hpp +0 -75
  277. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/header.hpp +0 -28
  278. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/io_context_pool.cpp +0 -69
  279. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/io_context_pool.hpp +0 -58
  280. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/main.cpp +0 -46
  281. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/mime_types.cpp +0 -46
  282. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/mime_types.hpp +0 -27
  283. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/reply.cpp +0 -256
  284. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/reply.hpp +0 -64
  285. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request.hpp +0 -34
  286. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_handler.cpp +0 -122
  287. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_handler.hpp +0 -46
  288. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_parser.cpp +0 -315
  289. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/request_parser.hpp +0 -95
  290. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/server.cpp +0 -77
  291. data/ext/third_party/asio/asio/src/examples/cpp03/http/server2/server.hpp +0 -68
  292. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/.gitignore +0 -11
  293. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/connection.cpp +0 -94
  294. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/connection.hpp +0 -78
  295. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/header.hpp +0 -28
  296. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/main.cpp +0 -46
  297. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/mime_types.cpp +0 -46
  298. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/mime_types.hpp +0 -27
  299. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/reply.cpp +0 -256
  300. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/reply.hpp +0 -64
  301. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request.hpp +0 -34
  302. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_handler.cpp +0 -122
  303. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_handler.hpp +0 -46
  304. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_parser.cpp +0 -315
  305. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/request_parser.hpp +0 -95
  306. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/server.cpp +0 -89
  307. data/ext/third_party/asio/asio/src/examples/cpp03/http/server3/server.hpp +0 -70
  308. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/.gitignore +0 -11
  309. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/file_handler.cpp +0 -122
  310. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/file_handler.hpp +0 -44
  311. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/header.hpp +0 -28
  312. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/main.cpp +0 -58
  313. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/mime_types.cpp +0 -46
  314. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/mime_types.hpp +0 -27
  315. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/reply.cpp +0 -256
  316. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/reply.hpp +0 -64
  317. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request.hpp +0 -46
  318. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request_parser.cpp +0 -226
  319. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/request_parser.hpp +0 -78
  320. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/server.cpp +0 -122
  321. data/ext/third_party/asio/asio/src/examples/cpp03/http/server4/server.hpp +0 -73
  322. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/.gitignore +0 -10
  323. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/icmp_header.hpp +0 -94
  324. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/ipv4_header.hpp +0 -102
  325. data/ext/third_party/asio/asio/src/examples/cpp03/icmp/ping.cpp +0 -163
  326. data/ext/third_party/asio/asio/src/examples/cpp03/invocation/.gitignore +0 -10
  327. data/ext/third_party/asio/asio/src/examples/cpp03/invocation/prioritised_handlers.cpp +0 -171
  328. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/.gitignore +0 -11
  329. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/daytime_client.cpp +0 -44
  330. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/daytime_server.cpp +0 -51
  331. data/ext/third_party/asio/asio/src/examples/cpp03/iostreams/http_client.cpp +0 -91
  332. data/ext/third_party/asio/asio/src/examples/cpp03/local/.gitignore +0 -13
  333. data/ext/third_party/asio/asio/src/examples/cpp03/local/connect_pair.cpp +0 -141
  334. data/ext/third_party/asio/asio/src/examples/cpp03/local/iostream_client.cpp +0 -62
  335. data/ext/third_party/asio/asio/src/examples/cpp03/local/stream_client.cpp +0 -61
  336. data/ext/third_party/asio/asio/src/examples/cpp03/local/stream_server.cpp +0 -141
  337. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/.gitignore +0 -11
  338. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/receiver.cpp +0 -93
  339. data/ext/third_party/asio/asio/src/examples/cpp03/multicast/sender.cpp +0 -98
  340. data/ext/third_party/asio/asio/src/examples/cpp03/nonblocking/.gitignore +0 -10
  341. data/ext/third_party/asio/asio/src/examples/cpp03/nonblocking/third_party_lib.cpp +0 -240
  342. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/.gitignore +0 -11
  343. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/client.cpp +0 -192
  344. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/protocol.hpp +0 -156
  345. data/ext/third_party/asio/asio/src/examples/cpp03/porthopper/server.cpp +0 -187
  346. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/.gitignore +0 -11
  347. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/client.cpp +0 -125
  348. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/connection.hpp +0 -188
  349. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/server.cpp +0 -123
  350. data/ext/third_party/asio/asio/src/examples/cpp03/serialization/stock.hpp +0 -50
  351. data/ext/third_party/asio/asio/src/examples/cpp03/services/.gitignore +0 -11
  352. data/ext/third_party/asio/asio/src/examples/cpp03/services/basic_logger.hpp +0 -83
  353. data/ext/third_party/asio/asio/src/examples/cpp03/services/daytime_client.cpp +0 -97
  354. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger.hpp +0 -24
  355. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger_service.cpp +0 -11
  356. data/ext/third_party/asio/asio/src/examples/cpp03/services/logger_service.hpp +0 -145
  357. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/.gitignore +0 -10
  358. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/socks4.hpp +0 -144
  359. data/ext/third_party/asio/asio/src/examples/cpp03/socks4/sync_client.cpp +0 -94
  360. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/.gitignore +0 -12
  361. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/echo_server.cpp +0 -122
  362. data/ext/third_party/asio/asio/src/examples/cpp03/spawn/parallel_grep.cpp +0 -89
  363. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/.gitignore +0 -11
  364. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/README +0 -8
  365. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/ca.pem +0 -49
  366. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/client.cpp +0 -157
  367. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/dh2048.pem +0 -8
  368. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/server.cpp +0 -170
  369. data/ext/third_party/asio/asio/src/examples/cpp03/ssl/server.pem +0 -71
  370. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/.gitignore +0 -11
  371. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/async_tcp_client.cpp +0 -311
  372. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_tcp_client.cpp +0 -191
  373. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_token_tcp_client.cpp +0 -200
  374. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/blocking_udp_client.cpp +0 -154
  375. data/ext/third_party/asio/asio/src/examples/cpp03/timeouts/server.cpp +0 -433
  376. data/ext/third_party/asio/asio/src/examples/cpp03/timers/.gitignore +0 -10
  377. data/ext/third_party/asio/asio/src/examples/cpp03/timers/time_t_timer.cpp +0 -106
  378. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime1/.gitignore +0 -10
  379. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime1/client.cpp +0 -57
  380. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime2/.gitignore +0 -10
  381. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime2/server.cpp +0 -50
  382. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime3/.gitignore +0 -10
  383. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime3/server.cpp +0 -119
  384. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime4/.gitignore +0 -10
  385. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime4/client.cpp +0 -52
  386. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime5/.gitignore +0 -10
  387. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime5/server.cpp +0 -53
  388. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime6/.gitignore +0 -10
  389. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime6/server.cpp +0 -89
  390. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime7/.gitignore +0 -10
  391. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime7/server.cpp +0 -160
  392. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/daytime_dox.txt +0 -500
  393. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/index_dox.txt +0 -48
  394. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer1/.gitignore +0 -10
  395. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer1/timer.cpp +0 -24
  396. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer2/.gitignore +0 -10
  397. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer2/timer.cpp +0 -29
  398. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer3/.gitignore +0 -10
  399. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer3/timer.cpp +0 -43
  400. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer4/.gitignore +0 -10
  401. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer4/timer.cpp +0 -54
  402. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer5/.gitignore +0 -10
  403. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer5/timer.cpp +0 -80
  404. data/ext/third_party/asio/asio/src/examples/cpp03/tutorial/timer_dox.txt +0 -378
  405. data/ext/third_party/asio/asio/src/examples/cpp03/windows/.gitignore +0 -10
  406. data/ext/third_party/asio/asio/src/examples/cpp03/windows/transmit_file.cpp +0 -177
  407. data/ext/third_party/asio/asio/src/examples/cpp11/Makefile.am +0 -161
  408. data/ext/third_party/asio/asio/src/examples/cpp11/allocation/.gitignore +0 -10
  409. data/ext/third_party/asio/asio/src/examples/cpp11/allocation/server.cpp +0 -255
  410. data/ext/third_party/asio/asio/src/examples/cpp11/buffers/.gitignore +0 -10
  411. data/ext/third_party/asio/asio/src/examples/cpp11/buffers/reference_counted.cpp +0 -122
  412. data/ext/third_party/asio/asio/src/examples/cpp11/chat/.gitignore +0 -11
  413. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_client.cpp +0 -167
  414. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_message.hpp +0 -91
  415. data/ext/third_party/asio/asio/src/examples/cpp11/chat/chat_server.cpp +0 -227
  416. data/ext/third_party/asio/asio/src/examples/cpp11/echo/.gitignore +0 -11
  417. data/ext/third_party/asio/asio/src/examples/cpp11/echo/async_tcp_echo_server.cpp +0 -114
  418. data/ext/third_party/asio/asio/src/examples/cpp11/echo/async_udp_echo_server.cpp +0 -82
  419. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_tcp_echo_client.cpp +0 -55
  420. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_tcp_echo_server.cpp +0 -74
  421. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_udp_echo_client.cpp +0 -58
  422. data/ext/third_party/asio/asio/src/examples/cpp11/echo/blocking_udp_echo_server.cpp +0 -52
  423. data/ext/third_party/asio/asio/src/examples/cpp11/executors/.gitignore +0 -5
  424. data/ext/third_party/asio/asio/src/examples/cpp11/executors/actor.cpp +0 -286
  425. data/ext/third_party/asio/asio/src/examples/cpp11/executors/bank_account_1.cpp +0 -54
  426. data/ext/third_party/asio/asio/src/examples/cpp11/executors/bank_account_2.cpp +0 -54
  427. data/ext/third_party/asio/asio/src/examples/cpp11/executors/fork_join.cpp +0 -328
  428. data/ext/third_party/asio/asio/src/examples/cpp11/executors/pipeline.cpp +0 -299
  429. data/ext/third_party/asio/asio/src/examples/cpp11/executors/priority_scheduler.cpp +0 -174
  430. data/ext/third_party/asio/asio/src/examples/cpp11/fork/.gitignore +0 -11
  431. data/ext/third_party/asio/asio/src/examples/cpp11/fork/daemon.cpp +0 -189
  432. data/ext/third_party/asio/asio/src/examples/cpp11/fork/process_per_connection.cpp +0 -162
  433. data/ext/third_party/asio/asio/src/examples/cpp11/futures/.gitignore +0 -11
  434. data/ext/third_party/asio/asio/src/examples/cpp11/futures/daytime_client.cpp +0 -94
  435. data/ext/third_party/asio/asio/src/examples/cpp11/handler_tracking/custom_tracking.hpp +0 -201
  436. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/.gitignore +0 -11
  437. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection.cpp +0 -94
  438. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection.hpp +0 -79
  439. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection_manager.cpp +0 -40
  440. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/connection_manager.hpp +0 -48
  441. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/header.hpp +0 -28
  442. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/main.cpp +0 -43
  443. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/mime_types.cpp +0 -45
  444. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/mime_types.hpp +0 -27
  445. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/reply.cpp +0 -255
  446. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/reply.hpp +0 -64
  447. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request.hpp +0 -34
  448. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_handler.cpp +0 -121
  449. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_handler.hpp +0 -47
  450. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_parser.cpp +0 -315
  451. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/request_parser.hpp +0 -96
  452. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/server.cpp +0 -94
  453. data/ext/third_party/asio/asio/src/examples/cpp11/http/server/server.hpp +0 -64
  454. data/ext/third_party/asio/asio/src/examples/cpp11/invocation/.gitignore +0 -10
  455. data/ext/third_party/asio/asio/src/examples/cpp11/invocation/prioritised_handlers.cpp +0 -202
  456. data/ext/third_party/asio/asio/src/examples/cpp11/iostreams/.gitignore +0 -11
  457. data/ext/third_party/asio/asio/src/examples/cpp11/iostreams/http_client.cpp +0 -91
  458. data/ext/third_party/asio/asio/src/examples/cpp11/local/.gitignore +0 -13
  459. data/ext/third_party/asio/asio/src/examples/cpp11/local/connect_pair.cpp +0 -129
  460. data/ext/third_party/asio/asio/src/examples/cpp11/local/iostream_client.cpp +0 -61
  461. data/ext/third_party/asio/asio/src/examples/cpp11/local/stream_client.cpp +0 -60
  462. data/ext/third_party/asio/asio/src/examples/cpp11/local/stream_server.cpp +0 -121
  463. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/.gitignore +0 -11
  464. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/receiver.cpp +0 -88
  465. data/ext/third_party/asio/asio/src/examples/cpp11/multicast/sender.cpp +0 -91
  466. data/ext/third_party/asio/asio/src/examples/cpp11/nonblocking/.gitignore +0 -10
  467. data/ext/third_party/asio/asio/src/examples/cpp11/nonblocking/third_party_lib.cpp +0 -212
  468. data/ext/third_party/asio/asio/src/examples/cpp11/operations/.gitignore +0 -10
  469. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_1.cpp +0 -113
  470. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_2.cpp +0 -131
  471. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_3.cpp +0 -192
  472. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_4.cpp +0 -207
  473. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_5.cpp +0 -243
  474. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_6.cpp +0 -302
  475. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_7.cpp +0 -222
  476. data/ext/third_party/asio/asio/src/examples/cpp11/operations/composed_8.cpp +0 -217
  477. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/.gitignore +0 -10
  478. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/socks4.hpp +0 -143
  479. data/ext/third_party/asio/asio/src/examples/cpp11/socks4/sync_client.cpp +0 -93
  480. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/.gitignore +0 -12
  481. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/echo_server.cpp +0 -111
  482. data/ext/third_party/asio/asio/src/examples/cpp11/spawn/parallel_grep.cpp +0 -84
  483. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/.gitignore +0 -11
  484. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/README +0 -8
  485. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/ca.pem +0 -49
  486. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/client.cpp +0 -165
  487. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/dh2048.pem +0 -8
  488. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/server.cpp +0 -143
  489. data/ext/third_party/asio/asio/src/examples/cpp11/ssl/server.pem +0 -71
  490. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/.gitignore +0 -11
  491. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/async_tcp_client.cpp +0 -311
  492. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_tcp_client.cpp +0 -192
  493. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_token_tcp_client.cpp +0 -197
  494. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/blocking_udp_client.cpp +0 -155
  495. data/ext/third_party/asio/asio/src/examples/cpp11/timeouts/server.cpp +0 -433
  496. data/ext/third_party/asio/asio/src/examples/cpp11/timers/.gitignore +0 -10
  497. data/ext/third_party/asio/asio/src/examples/cpp11/timers/time_t_timer.cpp +0 -106
  498. data/ext/third_party/asio/asio/src/examples/cpp14/Makefile.am +0 -64
  499. data/ext/third_party/asio/asio/src/examples/cpp14/echo/.gitignore +0 -11
  500. data/ext/third_party/asio/asio/src/examples/cpp14/echo/async_tcp_echo_server.cpp +0 -117
  501. data/ext/third_party/asio/asio/src/examples/cpp14/echo/async_udp_echo_server.cpp +0 -83
  502. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_tcp_echo_client.cpp +0 -55
  503. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_tcp_echo_server.cpp +0 -77
  504. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_udp_echo_client.cpp +0 -59
  505. data/ext/third_party/asio/asio/src/examples/cpp14/echo/blocking_udp_echo_server.cpp +0 -53
  506. data/ext/third_party/asio/asio/src/examples/cpp14/executors/.gitignore +0 -6
  507. data/ext/third_party/asio/asio/src/examples/cpp14/executors/actor.cpp +0 -281
  508. data/ext/third_party/asio/asio/src/examples/cpp14/executors/async_1.cpp +0 -47
  509. data/ext/third_party/asio/asio/src/examples/cpp14/executors/async_2.cpp +0 -68
  510. data/ext/third_party/asio/asio/src/examples/cpp14/executors/bank_account_1.cpp +0 -54
  511. data/ext/third_party/asio/asio/src/examples/cpp14/executors/bank_account_2.cpp +0 -53
  512. data/ext/third_party/asio/asio/src/examples/cpp14/executors/fork_join.cpp +0 -327
  513. data/ext/third_party/asio/asio/src/examples/cpp14/executors/pipeline.cpp +0 -294
  514. data/ext/third_party/asio/asio/src/examples/cpp14/executors/priority_scheduler.cpp +0 -173
  515. data/ext/third_party/asio/asio/src/examples/cpp14/iostreams/.gitignore +0 -11
  516. data/ext/third_party/asio/asio/src/examples/cpp14/iostreams/http_client.cpp +0 -91
  517. data/ext/third_party/asio/asio/src/examples/cpp14/operations/.gitignore +0 -10
  518. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_1.cpp +0 -113
  519. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_2.cpp +0 -131
  520. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_3.cpp +0 -186
  521. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_4.cpp +0 -201
  522. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_5.cpp +0 -238
  523. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_6.cpp +0 -298
  524. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_7.cpp +0 -219
  525. data/ext/third_party/asio/asio/src/examples/cpp14/operations/composed_8.cpp +0 -212
  526. data/ext/third_party/asio/asio/src/examples/cpp17/Makefile.am +0 -8
  527. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/chat_server.cpp +0 -225
  528. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/echo_server.cpp +0 -76
  529. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/echo_server_with_default.cpp +0 -78
  530. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/range_based_for.cpp +0 -107
  531. data/ext/third_party/asio/asio/src/examples/cpp17/coroutines_ts/refactored_echo_server.cpp +0 -85
  532. data/ext/third_party/asio/asio/src/tests/.gitignore +0 -11
  533. data/ext/third_party/asio/asio/src/tests/Makefile.am +0 -432
  534. data/ext/third_party/asio/asio/src/tests/latency/.gitignore +0 -11
  535. data/ext/third_party/asio/asio/src/tests/latency/allocator.hpp +0 -52
  536. data/ext/third_party/asio/asio/src/tests/latency/high_res_clock.hpp +0 -53
  537. data/ext/third_party/asio/asio/src/tests/latency/tcp_client.cpp +0 -124
  538. data/ext/third_party/asio/asio/src/tests/latency/tcp_server.cpp +0 -114
  539. data/ext/third_party/asio/asio/src/tests/latency/udp_client.cpp +0 -104
  540. data/ext/third_party/asio/asio/src/tests/latency/udp_server.cpp +0 -125
  541. data/ext/third_party/asio/asio/src/tests/performance/.gitignore +0 -11
  542. data/ext/third_party/asio/asio/src/tests/performance/client.cpp +0 -286
  543. data/ext/third_party/asio/asio/src/tests/performance/handler_allocator.hpp +0 -112
  544. data/ext/third_party/asio/asio/src/tests/performance/server.cpp +0 -233
  545. data/ext/third_party/asio/asio/src/tests/unit/.gitignore +0 -75
  546. data/ext/third_party/asio/asio/src/tests/unit/archetypes/async_ops.hpp +0 -415
  547. data/ext/third_party/asio/asio/src/tests/unit/archetypes/async_result.hpp +0 -94
  548. data/ext/third_party/asio/asio/src/tests/unit/archetypes/gettable_socket_option.hpp +0 -54
  549. data/ext/third_party/asio/asio/src/tests/unit/archetypes/io_control_command.hpp +0 -32
  550. data/ext/third_party/asio/asio/src/tests/unit/archetypes/settable_socket_option.hpp +0 -49
  551. data/ext/third_party/asio/asio/src/tests/unit/associated_allocator.cpp +0 -25
  552. data/ext/third_party/asio/asio/src/tests/unit/associated_executor.cpp +0 -25
  553. data/ext/third_party/asio/asio/src/tests/unit/async_result.cpp +0 -25
  554. data/ext/third_party/asio/asio/src/tests/unit/awaitable.cpp +0 -25
  555. data/ext/third_party/asio/asio/src/tests/unit/basic_datagram_socket.cpp +0 -25
  556. data/ext/third_party/asio/asio/src/tests/unit/basic_deadline_timer.cpp +0 -25
  557. data/ext/third_party/asio/asio/src/tests/unit/basic_raw_socket.cpp +0 -25
  558. data/ext/third_party/asio/asio/src/tests/unit/basic_seq_packet_socket.cpp +0 -25
  559. data/ext/third_party/asio/asio/src/tests/unit/basic_serial_port.cpp +0 -26
  560. data/ext/third_party/asio/asio/src/tests/unit/basic_signal_set.cpp +0 -25
  561. data/ext/third_party/asio/asio/src/tests/unit/basic_socket.cpp +0 -25
  562. data/ext/third_party/asio/asio/src/tests/unit/basic_socket_acceptor.cpp +0 -25
  563. data/ext/third_party/asio/asio/src/tests/unit/basic_stream_socket.cpp +0 -25
  564. data/ext/third_party/asio/asio/src/tests/unit/basic_streambuf.cpp +0 -25
  565. data/ext/third_party/asio/asio/src/tests/unit/basic_waitable_timer.cpp +0 -25
  566. data/ext/third_party/asio/asio/src/tests/unit/bind_executor.cpp +0 -25
  567. data/ext/third_party/asio/asio/src/tests/unit/buffer.cpp +0 -830
  568. data/ext/third_party/asio/asio/src/tests/unit/buffered_read_stream.cpp +0 -338
  569. data/ext/third_party/asio/asio/src/tests/unit/buffered_stream.cpp +0 -364
  570. data/ext/third_party/asio/asio/src/tests/unit/buffered_write_stream.cpp +0 -353
  571. data/ext/third_party/asio/asio/src/tests/unit/buffers_iterator.cpp +0 -292
  572. data/ext/third_party/asio/asio/src/tests/unit/co_spawn.cpp +0 -25
  573. data/ext/third_party/asio/asio/src/tests/unit/completion_condition.cpp +0 -25
  574. data/ext/third_party/asio/asio/src/tests/unit/compose.cpp +0 -185
  575. data/ext/third_party/asio/asio/src/tests/unit/connect.cpp +0 -1190
  576. data/ext/third_party/asio/asio/src/tests/unit/coroutine.cpp +0 -112
  577. data/ext/third_party/asio/asio/src/tests/unit/deadline_timer.cpp +0 -392
  578. data/ext/third_party/asio/asio/src/tests/unit/defer.cpp +0 -25
  579. data/ext/third_party/asio/asio/src/tests/unit/detached.cpp +0 -25
  580. data/ext/third_party/asio/asio/src/tests/unit/dispatch.cpp +0 -25
  581. data/ext/third_party/asio/asio/src/tests/unit/error.cpp +0 -89
  582. data/ext/third_party/asio/asio/src/tests/unit/execution_context.cpp +0 -25
  583. data/ext/third_party/asio/asio/src/tests/unit/executor.cpp +0 -25
  584. data/ext/third_party/asio/asio/src/tests/unit/executor_work_guard.cpp +0 -25
  585. data/ext/third_party/asio/asio/src/tests/unit/generic/.gitignore +0 -14
  586. data/ext/third_party/asio/asio/src/tests/unit/generic/basic_endpoint.cpp +0 -25
  587. data/ext/third_party/asio/asio/src/tests/unit/generic/datagram_protocol.cpp +0 -263
  588. data/ext/third_party/asio/asio/src/tests/unit/generic/raw_protocol.cpp +0 -263
  589. data/ext/third_party/asio/asio/src/tests/unit/generic/seq_packet_protocol.cpp +0 -205
  590. data/ext/third_party/asio/asio/src/tests/unit/generic/stream_protocol.cpp +0 -248
  591. data/ext/third_party/asio/asio/src/tests/unit/high_resolution_timer.cpp +0 -30
  592. data/ext/third_party/asio/asio/src/tests/unit/io_context.cpp +0 -362
  593. data/ext/third_party/asio/asio/src/tests/unit/io_context_strand.cpp +0 -325
  594. data/ext/third_party/asio/asio/src/tests/unit/ip/.gitignore +0 -27
  595. data/ext/third_party/asio/asio/src/tests/unit/ip/address.cpp +0 -144
  596. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_endpoint.cpp +0 -25
  597. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver.cpp +0 -25
  598. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_entry.cpp +0 -25
  599. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_iterator.cpp +0 -25
  600. data/ext/third_party/asio/asio/src/tests/unit/ip/basic_resolver_query.cpp +0 -25
  601. data/ext/third_party/asio/asio/src/tests/unit/ip/host_name.cpp +0 -55
  602. data/ext/third_party/asio/asio/src/tests/unit/ip/icmp.cpp +0 -577
  603. data/ext/third_party/asio/asio/src/tests/unit/ip/multicast.cpp +0 -363
  604. data/ext/third_party/asio/asio/src/tests/unit/ip/network_v4.cpp +0 -314
  605. data/ext/third_party/asio/asio/src/tests/unit/ip/network_v6.cpp +0 -238
  606. data/ext/third_party/asio/asio/src/tests/unit/ip/resolver_query_base.cpp +0 -25
  607. data/ext/third_party/asio/asio/src/tests/unit/ip/tcp.cpp +0 -1346
  608. data/ext/third_party/asio/asio/src/tests/unit/ip/udp.cpp +0 -673
  609. data/ext/third_party/asio/asio/src/tests/unit/ip/unicast.cpp +0 -171
  610. data/ext/third_party/asio/asio/src/tests/unit/ip/v6_only.cpp +0 -135
  611. data/ext/third_party/asio/asio/src/tests/unit/is_read_buffered.cpp +0 -129
  612. data/ext/third_party/asio/asio/src/tests/unit/is_write_buffered.cpp +0 -129
  613. data/ext/third_party/asio/asio/src/tests/unit/local/.gitignore +0 -13
  614. data/ext/third_party/asio/asio/src/tests/unit/local/basic_endpoint.cpp +0 -25
  615. data/ext/third_party/asio/asio/src/tests/unit/local/connect_pair.cpp +0 -76
  616. data/ext/third_party/asio/asio/src/tests/unit/local/datagram_protocol.cpp +0 -242
  617. data/ext/third_party/asio/asio/src/tests/unit/local/stream_protocol.cpp +0 -219
  618. data/ext/third_party/asio/asio/src/tests/unit/packaged_task.cpp +0 -25
  619. data/ext/third_party/asio/asio/src/tests/unit/placeholders.cpp +0 -25
  620. data/ext/third_party/asio/asio/src/tests/unit/posix/.gitignore +0 -14
  621. data/ext/third_party/asio/asio/src/tests/unit/posix/basic_descriptor.cpp +0 -25
  622. data/ext/third_party/asio/asio/src/tests/unit/posix/basic_stream_descriptor.cpp +0 -25
  623. data/ext/third_party/asio/asio/src/tests/unit/posix/descriptor.cpp +0 -25
  624. data/ext/third_party/asio/asio/src/tests/unit/posix/descriptor_base.cpp +0 -25
  625. data/ext/third_party/asio/asio/src/tests/unit/posix/stream_descriptor.cpp +0 -183
  626. data/ext/third_party/asio/asio/src/tests/unit/post.cpp +0 -25
  627. data/ext/third_party/asio/asio/src/tests/unit/read.cpp +0 -4997
  628. data/ext/third_party/asio/asio/src/tests/unit/read_at.cpp +0 -7502
  629. data/ext/third_party/asio/asio/src/tests/unit/read_until.cpp +0 -1658
  630. data/ext/third_party/asio/asio/src/tests/unit/redirect_error.cpp +0 -25
  631. data/ext/third_party/asio/asio/src/tests/unit/serial_port.cpp +0 -173
  632. data/ext/third_party/asio/asio/src/tests/unit/serial_port_base.cpp +0 -99
  633. data/ext/third_party/asio/asio/src/tests/unit/signal_set.cpp +0 -95
  634. data/ext/third_party/asio/asio/src/tests/unit/socket_base.cpp +0 -650
  635. data/ext/third_party/asio/asio/src/tests/unit/ssl/.gitignore +0 -15
  636. data/ext/third_party/asio/asio/src/tests/unit/ssl/context.cpp +0 -25
  637. data/ext/third_party/asio/asio/src/tests/unit/ssl/context_base.cpp +0 -25
  638. data/ext/third_party/asio/asio/src/tests/unit/ssl/error.cpp +0 -25
  639. data/ext/third_party/asio/asio/src/tests/unit/ssl/host_name_verification.cpp +0 -25
  640. data/ext/third_party/asio/asio/src/tests/unit/ssl/rfc2818_verification.cpp +0 -25
  641. data/ext/third_party/asio/asio/src/tests/unit/ssl/stream.cpp +0 -191
  642. data/ext/third_party/asio/asio/src/tests/unit/ssl/stream_base.cpp +0 -25
  643. data/ext/third_party/asio/asio/src/tests/unit/steady_timer.cpp +0 -30
  644. data/ext/third_party/asio/asio/src/tests/unit/strand.cpp +0 -263
  645. data/ext/third_party/asio/asio/src/tests/unit/streambuf.cpp +0 -62
  646. data/ext/third_party/asio/asio/src/tests/unit/system_context.cpp +0 -30
  647. data/ext/third_party/asio/asio/src/tests/unit/system_executor.cpp +0 -30
  648. data/ext/third_party/asio/asio/src/tests/unit/system_timer.cpp +0 -399
  649. data/ext/third_party/asio/asio/src/tests/unit/this_coro.cpp +0 -25
  650. data/ext/third_party/asio/asio/src/tests/unit/thread.cpp +0 -25
  651. data/ext/third_party/asio/asio/src/tests/unit/time_traits.cpp +0 -25
  652. data/ext/third_party/asio/asio/src/tests/unit/ts/.gitignore +0 -17
  653. data/ext/third_party/asio/asio/src/tests/unit/ts/buffer.cpp +0 -30
  654. data/ext/third_party/asio/asio/src/tests/unit/ts/executor.cpp +0 -30
  655. data/ext/third_party/asio/asio/src/tests/unit/ts/internet.cpp +0 -30
  656. data/ext/third_party/asio/asio/src/tests/unit/ts/io_context.cpp +0 -30
  657. data/ext/third_party/asio/asio/src/tests/unit/ts/net.cpp +0 -30
  658. data/ext/third_party/asio/asio/src/tests/unit/ts/netfwd.cpp +0 -33
  659. data/ext/third_party/asio/asio/src/tests/unit/ts/socket.cpp +0 -30
  660. data/ext/third_party/asio/asio/src/tests/unit/ts/timer.cpp +0 -30
  661. data/ext/third_party/asio/asio/src/tests/unit/unit_test.hpp +0 -175
  662. data/ext/third_party/asio/asio/src/tests/unit/use_awaitable.cpp +0 -25
  663. data/ext/third_party/asio/asio/src/tests/unit/use_future.cpp +0 -670
  664. data/ext/third_party/asio/asio/src/tests/unit/uses_executor.cpp +0 -25
  665. data/ext/third_party/asio/asio/src/tests/unit/wait_traits.cpp +0 -25
  666. data/ext/third_party/asio/asio/src/tests/unit/windows/.gitignore +0 -18
  667. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_object_handle.cpp +0 -25
  668. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_overlapped_handle.cpp +0 -25
  669. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_random_access_handle.cpp +0 -25
  670. data/ext/third_party/asio/asio/src/tests/unit/windows/basic_stream_handle.cpp +0 -25
  671. data/ext/third_party/asio/asio/src/tests/unit/windows/object_handle.cpp +0 -130
  672. data/ext/third_party/asio/asio/src/tests/unit/windows/overlapped_handle.cpp +0 -26
  673. data/ext/third_party/asio/asio/src/tests/unit/windows/overlapped_ptr.cpp +0 -107
  674. data/ext/third_party/asio/asio/src/tests/unit/windows/random_access_handle.cpp +0 -155
  675. data/ext/third_party/asio/asio/src/tests/unit/windows/stream_handle.cpp +0 -148
  676. data/ext/third_party/asio/asio/src/tests/unit/write.cpp +0 -4904
  677. data/ext/third_party/asio/asio/src/tests/unit/write_at.cpp +0 -7563
  678. data/ext/third_party/asio/asio/src/tools/handlerviz.pl +0 -299
  679. data/ext/third_party/gsl/tests/CMakeLists.txt +0 -267
  680. data/ext/third_party/gsl/tests/CMakeLists.txt.in +0 -14
  681. data/ext/third_party/gsl/tests/algorithm_tests.cpp +0 -227
  682. data/ext/third_party/gsl/tests/assertion_tests.cpp +0 -61
  683. data/ext/third_party/gsl/tests/at_tests.cpp +0 -135
  684. data/ext/third_party/gsl/tests/bounds_tests.cpp +0 -102
  685. data/ext/third_party/gsl/tests/byte_tests.cpp +0 -129
  686. data/ext/third_party/gsl/tests/multi_span_tests.cpp +0 -1866
  687. data/ext/third_party/gsl/tests/no_exception_ensure_tests.cpp +0 -48
  688. data/ext/third_party/gsl/tests/notnull_tests.cpp +0 -535
  689. data/ext/third_party/gsl/tests/owner_tests.cpp +0 -43
  690. data/ext/third_party/gsl/tests/span_compatibility_tests.cpp +0 -1021
  691. data/ext/third_party/gsl/tests/span_ext_tests.cpp +0 -360
  692. data/ext/third_party/gsl/tests/span_tests.cpp +0 -1244
  693. data/ext/third_party/gsl/tests/strict_notnull_tests.cpp +0 -190
  694. data/ext/third_party/gsl/tests/strided_span_tests.cpp +0 -790
  695. data/ext/third_party/gsl/tests/string_span_tests.cpp +0 -1217
  696. data/ext/third_party/gsl/tests/utils_tests.cpp +0 -129
  697. data/ext/third_party/http_parser/contrib/parsertrace.c +0 -157
  698. data/ext/third_party/http_parser/contrib/url_parser.c +0 -47
  699. data/ext/third_party/http_parser/fuzzers/fuzz_parser.c +0 -26
  700. data/ext/third_party/http_parser/fuzzers/fuzz_url.c +0 -14
  701. data/ext/third_party/json/contrib/nlohmann.cpp +0 -48
  702. data/ext/third_party/json/contrib/nlohmann/from_value.hpp +0 -62
  703. data/ext/third_party/json/contrib/nlohmann/json.hpp +0 -18928
  704. data/ext/third_party/json/contrib/nlohmann/to_value.hpp +0 -109
  705. data/ext/third_party/json/doc/Advanced-Use-Cases.md +0 -83
  706. data/ext/third_party/json/doc/Batteries-Included.md +0 -212
  707. data/ext/third_party/json/doc/Binding-Traits.md +0 -319
  708. data/ext/third_party/json/doc/Changelog.md +0 -31
  709. data/ext/third_party/json/doc/Common-Use-Cases.md +0 -148
  710. data/ext/third_party/json/doc/Design-Decisions.md +0 -36
  711. data/ext/third_party/json/doc/Events-Interface.md +0 -140
  712. data/ext/third_party/json/doc/Getting-Started.md +0 -19
  713. data/ext/third_party/json/doc/Instance-Sharing.md +0 -163
  714. data/ext/third_party/json/doc/Interoperability.md +0 -75
  715. data/ext/third_party/json/doc/Overview.md +0 -24
  716. data/ext/third_party/json/doc/Overview.png +0 -0
  717. data/ext/third_party/json/doc/Parser-Interface.md +0 -84
  718. data/ext/third_party/json/doc/README.md +0 -78
  719. data/ext/third_party/json/doc/Scratchpad.md +0 -25
  720. data/ext/third_party/json/doc/Type-Traits.md +0 -364
  721. data/ext/third_party/json/doc/Types.png +0 -0
  722. data/ext/third_party/json/doc/Value-Class.md +0 -525
  723. data/ext/third_party/json/src/example/json/CMakeLists.txt +0 -67
  724. data/ext/third_party/json/src/example/json/cbor_to_jaxn.cpp +0 -18
  725. data/ext/third_party/json/src/example/json/cbor_to_json.cpp +0 -18
  726. data/ext/third_party/json/src/example/json/cbor_to_msgpack.cpp +0 -18
  727. data/ext/third_party/json/src/example/json/cbor_to_pretty_jaxn.cpp +0 -18
  728. data/ext/third_party/json/src/example/json/cbor_to_pretty_json.cpp +0 -18
  729. data/ext/third_party/json/src/example/json/cbor_to_ubjson.cpp +0 -18
  730. data/ext/third_party/json/src/example/json/jaxn_to_cbor.cpp +0 -18
  731. data/ext/third_party/json/src/example/json/jaxn_to_cplusplus.cpp +0 -249
  732. data/ext/third_party/json/src/example/json/jaxn_to_jaxn.cpp +0 -18
  733. data/ext/third_party/json/src/example/json/jaxn_to_msgpack.cpp +0 -18
  734. data/ext/third_party/json/src/example/json/jaxn_to_pretty_jaxn.cpp +0 -18
  735. data/ext/third_party/json/src/example/json/jaxn_to_ubjson.cpp +0 -18
  736. data/ext/third_party/json/src/example/json/json_to_cbor.cpp +0 -18
  737. data/ext/third_party/json/src/example/json/json_to_json.cpp +0 -18
  738. data/ext/third_party/json/src/example/json/json_to_msgpack.cpp +0 -18
  739. data/ext/third_party/json/src/example/json/json_to_pretty_json.cpp +0 -18
  740. data/ext/third_party/json/src/example/json/json_to_ubjson.cpp +0 -18
  741. data/ext/third_party/json/src/example/json/msgpack_to_cbor.cpp +0 -18
  742. data/ext/third_party/json/src/example/json/msgpack_to_jaxn.cpp +0 -18
  743. data/ext/third_party/json/src/example/json/msgpack_to_json.cpp +0 -18
  744. data/ext/third_party/json/src/example/json/msgpack_to_pretty_jaxn.cpp +0 -18
  745. data/ext/third_party/json/src/example/json/msgpack_to_pretty_json.cpp +0 -18
  746. data/ext/third_party/json/src/example/json/msgpack_to_ubjson.cpp +0 -18
  747. data/ext/third_party/json/src/example/json/printf_doubles.cpp +0 -51
  748. data/ext/third_party/json/src/example/json/ubjson_to_cbor.cpp +0 -18
  749. data/ext/third_party/json/src/example/json/ubjson_to_jaxn.cpp +0 -18
  750. data/ext/third_party/json/src/example/json/ubjson_to_json.cpp +0 -18
  751. data/ext/third_party/json/src/example/json/ubjson_to_msgpack.cpp +0 -18
  752. data/ext/third_party/json/src/example/json/ubjson_to_pretty_jaxn.cpp +0 -18
  753. data/ext/third_party/json/src/example/json/ubjson_to_pretty_json.cpp +0 -18
  754. data/ext/third_party/json/src/example/json/validate_event_order.cpp +0 -27
  755. data/ext/third_party/json/src/example/json/validate_integer.cpp +0 -56
  756. data/ext/third_party/json/src/perf/json/bench_mark.hpp +0 -43
  757. data/ext/third_party/json/src/perf/json/benchmark.cpp +0 -34
  758. data/ext/third_party/json/src/perf/json/parse_file.cpp +0 -17
  759. data/ext/third_party/json/src/perf/json/pretty_print_file.cpp +0 -19
  760. data/ext/third_party/json/src/perf/json/print_double.cpp +0 -34
  761. data/ext/third_party/json/src/perf/json/print_file.cpp +0 -19
  762. data/ext/third_party/json/src/perf/json/sizes.cpp +0 -24
  763. data/ext/third_party/json/src/perf/json/syntax_only.cpp +0 -27
  764. data/ext/third_party/json/src/test/json/CMakeLists.txt +0 -97
  765. data/ext/third_party/json/src/test/json/big_list_of_naughty_strings.cpp +0 -43
  766. data/ext/third_party/json/src/test/json/binding_array.cpp +0 -549
  767. data/ext/third_party/json/src/test/json/binding_factory.cpp +0 -265
  768. data/ext/third_party/json/src/test/json/binding_object.cpp +0 -208
  769. data/ext/third_party/json/src/test/json/binding_versions.cpp +0 -95
  770. data/ext/third_party/json/src/test/json/cbor.cpp +0 -149
  771. data/ext/third_party/json/src/test/json/cbor_parts_parser.cpp +0 -36
  772. data/ext/third_party/json/src/test/json/contrib_diff.cpp +0 -43
  773. data/ext/third_party/json/src/test/json/contrib_get.cpp +0 -42
  774. data/ext/third_party/json/src/test/json/contrib_patch_add.cpp +0 -75
  775. data/ext/third_party/json/src/test/json/contrib_patch_copy.cpp +0 -113
  776. data/ext/third_party/json/src/test/json/contrib_patch_move.cpp +0 -97
  777. data/ext/third_party/json/src/test/json/contrib_patch_remove.cpp +0 -85
  778. data/ext/third_party/json/src/test/json/contrib_patch_replace.cpp +0 -79
  779. data/ext/third_party/json/src/test/json/contrib_patch_test.cpp +0 -69
  780. data/ext/third_party/json/src/test/json/contrib_position.cpp +0 -48
  781. data/ext/third_party/json/src/test/json/contrib_reference.cpp +0 -44
  782. data/ext/third_party/json/src/test/json/contrib_schema.cpp +0 -132
  783. data/ext/third_party/json/src/test/json/contrib_traits.cpp +0 -258
  784. data/ext/third_party/json/src/test/json/double.cpp +0 -182
  785. data/ext/third_party/json/src/test/json/enable_implicit_constructor.cpp +0 -54
  786. data/ext/third_party/json/src/test/json/escape.cpp +0 -42
  787. data/ext/third_party/json/src/test/json/events_binary_to.cpp +0 -56
  788. data/ext/third_party/json/src/test/json/events_compare.cpp +0 -433
  789. data/ext/third_party/json/src/test/json/events_debug.cpp +0 -24
  790. data/ext/third_party/json/src/test/json/events_hash.cpp +0 -65
  791. data/ext/third_party/json/src/test/json/events_to_stream.cpp +0 -28
  792. data/ext/third_party/json/src/test/json/events_to_string.cpp +0 -25
  793. data/ext/third_party/json/src/test/json/include_json.cpp +0 -14
  794. data/ext/third_party/json/src/test/json/integer.cpp +0 -118
  795. data/ext/third_party/json/src/test/json/jaxn_ostream.cpp +0 -76
  796. data/ext/third_party/json/src/test/json/jaxn_parse.cpp +0 -239
  797. data/ext/third_party/json/src/test/json/jaxn_parts_parser.cpp +0 -220
  798. data/ext/third_party/json/src/test/json/json_ostream.cpp +0 -102
  799. data/ext/third_party/json/src/test/json/json_parse.cpp +0 -153
  800. data/ext/third_party/json/src/test/json/json_parts_parser.cpp +0 -124
  801. data/ext/third_party/json/src/test/json/json_pointer.cpp +0 -176
  802. data/ext/third_party/json/src/test/json/key_camel_case_to_snake_case.cpp +0 -38
  803. data/ext/third_party/json/src/test/json/key_snake_case_to_camel_case.cpp +0 -33
  804. data/ext/third_party/json/src/test/json/literal.cpp +0 -18
  805. data/ext/third_party/json/src/test/json/main.hpp +0 -20
  806. data/ext/third_party/json/src/test/json/make_events.hpp +0 -362
  807. data/ext/third_party/json/src/test/json/msgpack.cpp +0 -136
  808. data/ext/third_party/json/src/test/json/object_construction.cpp +0 -167
  809. data/ext/third_party/json/src/test/json/opaque_pointer.cpp +0 -192
  810. data/ext/third_party/json/src/test/json/operators.cpp +0 -494
  811. data/ext/third_party/json/src/test/json/optional.cpp +0 -79
  812. data/ext/third_party/json/src/test/json/public_base.cpp +0 -142
  813. data/ext/third_party/json/src/test/json/self_contained.cpp +0 -106
  814. data/ext/third_party/json/src/test/json/sha256.cpp +0 -38
  815. data/ext/third_party/json/src/test/json/string_view.cpp +0 -70
  816. data/ext/third_party/json/src/test/json/temporary_parsing.cpp +0 -339
  817. data/ext/third_party/json/src/test/json/test.hpp +0 -74
  818. data/ext/third_party/json/src/test/json/test_events.hpp +0 -250
  819. data/ext/third_party/json/src/test/json/test_types.hpp +0 -557
  820. data/ext/third_party/json/src/test/json/test_unhex.hpp +0 -42
  821. data/ext/third_party/json/src/test/json/type.cpp +0 -35
  822. data/ext/third_party/json/src/test/json/ubjson.cpp +0 -119
  823. data/ext/third_party/json/src/test/json/uri_fragment.cpp +0 -52
  824. data/ext/third_party/json/src/test/json/validate_event_interfaces.cpp +0 -177
  825. data/ext/third_party/json/src/test/json/validate_utf8.cpp +0 -37
  826. data/ext/third_party/json/src/test/json/value_access.cpp +0 -144
  827. data/ext/third_party/json/src/test/json/value_basics.cpp +0 -241
  828. data/ext/third_party/json/src/test/json/value_create.cpp +0 -372
  829. data/ext/third_party/json/src/test/json/value_ptr.cpp +0 -33
  830. data/ext/third_party/json/src/test/json/value_subscript.cpp +0 -89
  831. data/ext/third_party/json/src/test/json/with_arguments.cpp +0 -98
  832. data/ext/third_party/json/tests/blns.json +0 -496
  833. data/ext/third_party/json/tests/canada.json +0 -9
  834. data/ext/third_party/json/tests/citm_catalog.json +0 -50469
  835. data/ext/third_party/json/tests/draft4/additionalItems.json +0 -82
  836. data/ext/third_party/json/tests/draft4/additionalProperties.json +0 -88
  837. data/ext/third_party/json/tests/draft4/allOf.json +0 -112
  838. data/ext/third_party/json/tests/draft4/anyOf.json +0 -68
  839. data/ext/third_party/json/tests/draft4/default.json +0 -49
  840. data/ext/third_party/json/tests/draft4/definitions.json +0 -32
  841. data/ext/third_party/json/tests/draft4/dependencies.json +0 -113
  842. data/ext/third_party/json/tests/draft4/enum.json +0 -72
  843. data/ext/third_party/json/tests/draft4/items.json +0 -46
  844. data/ext/third_party/json/tests/draft4/maxItems.json +0 -28
  845. data/ext/third_party/json/tests/draft4/maxLength.json +0 -33
  846. data/ext/third_party/json/tests/draft4/maxProperties.json +0 -28
  847. data/ext/third_party/json/tests/draft4/maximum.json +0 -42
  848. data/ext/third_party/json/tests/draft4/minItems.json +0 -28
  849. data/ext/third_party/json/tests/draft4/minLength.json +0 -33
  850. data/ext/third_party/json/tests/draft4/minProperties.json +0 -28
  851. data/ext/third_party/json/tests/draft4/minimum.json +0 -42
  852. data/ext/third_party/json/tests/draft4/multipleOf.json +0 -60
  853. data/ext/third_party/json/tests/draft4/not.json +0 -96
  854. data/ext/third_party/json/tests/draft4/oneOf.json +0 -68
  855. data/ext/third_party/json/tests/draft4/optional/bignum.json +0 -107
  856. data/ext/third_party/json/tests/draft4/optional/format.json +0 -148
  857. data/ext/third_party/json/tests/draft4/optional/zeroTerminatedFloats.json +0 -15
  858. data/ext/third_party/json/tests/draft4/pattern.json +0 -34
  859. data/ext/third_party/json/tests/draft4/patternProperties.json +0 -110
  860. data/ext/third_party/json/tests/draft4/properties.json +0 -92
  861. data/ext/third_party/json/tests/draft4/ref.json +0 -179
  862. data/ext/third_party/json/tests/draft4/refRemote.json +0 -74
  863. data/ext/third_party/json/tests/draft4/required.json +0 -44
  864. data/ext/third_party/json/tests/draft4/type.json +0 -345
  865. data/ext/third_party/json/tests/draft4/uniqueItems.json +0 -79
  866. data/ext/third_party/json/tests/taocpp/binary.jaxn +0 -4
  867. data/ext/third_party/json/tests/taocpp/dateTime.json +0 -108
  868. data/ext/third_party/json/tests/taocpp/make_events.cbor +0 -0
  869. data/ext/third_party/json/tests/taocpp/number.json +0 -682
  870. data/ext/third_party/json/tests/taocpp/position.json +0 -8
  871. data/ext/third_party/json/tests/taocpp/schema.json +0 -378
  872. data/ext/third_party/json/tests/twitter.json +0 -15482
  873. data/ext/third_party/spdlog/bench/CMakeLists.txt +0 -25
  874. data/ext/third_party/spdlog/bench/async_bench.cpp +0 -179
  875. data/ext/third_party/spdlog/bench/bench.cpp +0 -238
  876. data/ext/third_party/spdlog/bench/formatter-bench.cpp +0 -80
  877. data/ext/third_party/spdlog/bench/latency.cpp +0 -166
  878. data/ext/third_party/spdlog/bench/utils.h +0 -34
  879. data/ext/third_party/spdlog/example/CMakeLists.txt +0 -23
  880. data/ext/third_party/spdlog/example/example.cpp +0 -282
  881. data/ext/third_party/spdlog/logos/jetbrains-variant-4.svg +0 -43
  882. data/ext/third_party/spdlog/scripts/extract_version.py +0 -17
  883. data/ext/third_party/spdlog/scripts/format.sh +0 -16
  884. data/ext/third_party/spdlog/tests/CMakeLists.txt +0 -70
  885. data/ext/third_party/spdlog/tests/catch.hpp +0 -15372
  886. data/ext/third_party/spdlog/tests/catch.license +0 -23
  887. data/ext/third_party/spdlog/tests/includes.h +0 -26
  888. data/ext/third_party/spdlog/tests/main.cpp +0 -2
  889. data/ext/third_party/spdlog/tests/test_async.cpp +0 -188
  890. data/ext/third_party/spdlog/tests/test_backtrace.cpp +0 -65
  891. data/ext/third_party/spdlog/tests/test_cfg.cpp +0 -93
  892. data/ext/third_party/spdlog/tests/test_create_dir.cpp +0 -80
  893. data/ext/third_party/spdlog/tests/test_daily_logger.cpp +0 -149
  894. data/ext/third_party/spdlog/tests/test_dup_filter.cpp +0 -88
  895. data/ext/third_party/spdlog/tests/test_errors.cpp +0 -118
  896. data/ext/third_party/spdlog/tests/test_eventlog.cpp +0 -71
  897. data/ext/third_party/spdlog/tests/test_file_helper.cpp +0 -102
  898. data/ext/third_party/spdlog/tests/test_file_logging.cpp +0 -98
  899. data/ext/third_party/spdlog/tests/test_fmt_helper.cpp +0 -86
  900. data/ext/third_party/spdlog/tests/test_macros.cpp +0 -60
  901. data/ext/third_party/spdlog/tests/test_misc.cpp +0 -271
  902. data/ext/third_party/spdlog/tests/test_mpmc_q.cpp +0 -106
  903. data/ext/third_party/spdlog/tests/test_pattern_formatter.cpp +0 -443
  904. data/ext/third_party/spdlog/tests/test_registry.cpp +0 -116
  905. data/ext/third_party/spdlog/tests/test_sink.h +0 -79
  906. data/ext/third_party/spdlog/tests/test_stdout_api.cpp +0 -98
  907. data/ext/third_party/spdlog/tests/test_systemd.cpp +0 -15
  908. data/ext/third_party/spdlog/tests/test_time_point.cpp +0 -36
  909. data/ext/third_party/spdlog/tests/utils.cpp +0 -125
  910. data/ext/third_party/spdlog/tests/utils.h +0 -18
  911. data/lib/couchbase/results.rb +0 -307
  912. data/rbi/couchbase.rbi +0 -79
@@ -0,0 +1,180 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <io/mcbp_session.hxx>
21
+ #include <protocol/cmd_get_collection_id.hxx>
22
+ #include <functional>
23
+ #include <utility>
24
+
25
+ namespace couchbase::operations
26
+ {
27
+
28
+ using mcbp_command_handler = std::function<void(std::error_code, std::optional<io::mcbp_message>)>;
29
+
30
+ template<typename Request>
31
+ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Request>> {
32
+ using encoded_request_type = typename Request::encoded_request_type;
33
+ using encoded_response_type = typename Request::encoded_response_type;
34
+ asio::steady_timer deadline;
35
+ asio::steady_timer retry_backoff;
36
+ Request request;
37
+ encoded_request_type encoded;
38
+ std::optional<std::uint32_t> opaque_{};
39
+ std::shared_ptr<io::mcbp_session> session_{};
40
+ mcbp_command_handler handler_{};
41
+
42
+ mcbp_command(asio::io_context& ctx, Request req)
43
+ : deadline(ctx)
44
+ , retry_backoff(ctx)
45
+ , request(req)
46
+ {
47
+ }
48
+
49
+ void start(mcbp_command_handler&& handler)
50
+ {
51
+ handler_ = handler;
52
+ deadline.expires_after(request.timeout);
53
+ deadline.async_wait([self = this->shared_from_this()](std::error_code ec) {
54
+ if (ec == asio::error::operation_aborted) {
55
+ return;
56
+ }
57
+ self->cancel();
58
+ });
59
+ }
60
+
61
+ void cancel()
62
+ {
63
+ if (opaque_ && session_) {
64
+ session_->cancel(opaque_.value(), asio::error::operation_aborted);
65
+ }
66
+ handler_ = nullptr;
67
+ }
68
+
69
+ void invoke_handler(std::error_code ec, std::optional<io::mcbp_message> msg = {})
70
+ {
71
+ if (handler_) {
72
+ handler_(ec, std::move(msg));
73
+ }
74
+ handler_ = nullptr;
75
+ }
76
+
77
+ void request_collection_id()
78
+ {
79
+ protocol::client_request<protocol::get_collection_id_request_body> req;
80
+ req.opaque(session_->next_opaque());
81
+ req.body().collection_path(request.id.collection);
82
+ session_->write_and_subscribe(req.opaque(),
83
+ req.data(session_->supports_feature(protocol::hello_feature::snappy)),
84
+ [self = this->shared_from_this()](std::error_code ec, io::mcbp_message&& msg) mutable {
85
+ if (ec == asio::error::operation_aborted) {
86
+ return self->invoke_handler(std::make_error_code(error::common_errc::ambiguous_timeout));
87
+ }
88
+ if (ec == std::make_error_code(error::common_errc::collection_not_found)) {
89
+ if (self->request.id.collection_uid) {
90
+ return self->handle_unknown_collection();
91
+ }
92
+ return self->invoke_handler(ec);
93
+ }
94
+ if (ec) {
95
+ return self->invoke_handler(ec);
96
+ }
97
+ protocol::client_response<protocol::get_collection_id_response_body> resp(msg);
98
+ self->session_->update_collection_uid(self->request.id.collection, resp.body().collection_uid());
99
+ self->request.id.collection_uid = resp.body().collection_uid();
100
+ return self->send();
101
+ });
102
+ }
103
+
104
+ void handle_unknown_collection()
105
+ {
106
+ auto backoff = std::chrono::milliseconds(500);
107
+ auto time_left = deadline.expiry() - std::chrono::steady_clock::now();
108
+ spdlog::debug("{} unknown collection response for \"{}/{}/{}\", time_left={}ms",
109
+ session_->log_prefix(),
110
+ request.id.bucket,
111
+ request.id.collection,
112
+ request.id.key,
113
+ std::chrono::duration_cast<std::chrono::milliseconds>(time_left).count());
114
+ if (time_left < backoff) {
115
+ return invoke_handler(std::make_error_code(error::common_errc::ambiguous_timeout));
116
+ }
117
+ retry_backoff.expires_after(backoff);
118
+ retry_backoff.async_wait([self = this->shared_from_this()](std::error_code ec) mutable {
119
+ if (ec == asio::error::operation_aborted) {
120
+ return;
121
+ }
122
+ self->request_collection_id();
123
+ });
124
+ }
125
+
126
+ void send()
127
+ {
128
+ opaque_ = session_->next_opaque();
129
+ request.opaque = *opaque_;
130
+ if (!request.id.collection_uid) {
131
+ if (session_->supports_feature(protocol::hello_feature::collections)) {
132
+ auto collection_id = session_->get_collection_uid(request.id.collection);
133
+ if (collection_id) {
134
+ request.id.collection_uid = *collection_id;
135
+ } else {
136
+ spdlog::debug("{} no cache entry for collection, resolve collection id for \"{}/{}/{}\", timeout={}ms",
137
+ session_->log_prefix(),
138
+ request.id.bucket,
139
+ request.id.collection,
140
+ request.id.key,
141
+ request.timeout.count());
142
+ return request_collection_id();
143
+ }
144
+ } else {
145
+ if (!request.id.collection.empty() && request.id.collection != "_default._default") {
146
+ return invoke_handler(std::make_error_code(error::common_errc::unsupported_operation));
147
+ }
148
+ }
149
+ }
150
+ request.encode_to(encoded);
151
+
152
+ session_->write_and_subscribe(request.opaque,
153
+ encoded.data(session_->supports_feature(protocol::hello_feature::snappy)),
154
+ [self = this->shared_from_this()](std::error_code ec, io::mcbp_message&& msg) mutable {
155
+ self->retry_backoff.cancel();
156
+ if (ec == asio::error::operation_aborted) {
157
+ return self->invoke_handler(std::make_error_code(error::common_errc::ambiguous_timeout));
158
+ }
159
+ if (ec == std::make_error_code(error::common_errc::request_canceled)) {
160
+ return self->invoke_handler(ec);
161
+ }
162
+ if (msg.header.status() == static_cast<std::uint16_t>(protocol::status::unknown_collection)) {
163
+ return self->handle_unknown_collection();
164
+ }
165
+ self->deadline.cancel();
166
+ self->invoke_handler(ec, msg);
167
+ });
168
+ }
169
+
170
+ void send_to(std::shared_ptr<io::mcbp_session> session)
171
+ {
172
+ if (!handler_) {
173
+ return;
174
+ }
175
+ session_ = std::move(session);
176
+ send();
177
+ }
178
+ };
179
+
180
+ } // namespace couchbase::operations
@@ -0,0 +1,63 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <cstdint>
21
+ #include <vector>
22
+ #include <array>
23
+
24
+ namespace couchbase
25
+ {
26
+ namespace protocol
27
+ {
28
+ static const size_t header_size = 24;
29
+ using header_buffer = std::array<std::uint8_t, header_size>;
30
+ } // namespace protocol
31
+
32
+ namespace io
33
+ {
34
+ struct binary_header {
35
+ std::uint8_t magic;
36
+ std::uint8_t opcode;
37
+ std::uint16_t keylen;
38
+ std::uint8_t extlen;
39
+ std::uint8_t datatype;
40
+ std::uint16_t specific;
41
+ std::uint32_t bodylen;
42
+ std::uint32_t opaque;
43
+ std::uint64_t cas;
44
+
45
+ std::uint16_t status()
46
+ {
47
+ return htons(specific);
48
+ }
49
+ };
50
+
51
+ struct mcbp_message {
52
+ binary_header header;
53
+ std::vector<std::uint8_t> body;
54
+
55
+ protocol::header_buffer header_data()
56
+ {
57
+ protocol::header_buffer buf;
58
+ std::memcpy(buf.data(), &header, sizeof(header));
59
+ return buf;
60
+ }
61
+ };
62
+ } // namespace io
63
+ } // namespace couchbase
@@ -0,0 +1,101 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <snappy.h>
21
+
22
+ #include <gsl/gsl_assert>
23
+ #include <protocol/magic.hxx>
24
+ #include <protocol/datatype.hxx>
25
+
26
+ #include <spdlog/fmt/bin_to_hex.h>
27
+
28
+ namespace couchbase::io
29
+ {
30
+ struct mcbp_parser {
31
+ enum result { ok, need_data, failure };
32
+
33
+ template<typename Iterator>
34
+ void feed(Iterator begin, Iterator end)
35
+ {
36
+ buf.reserve(buf.size() + static_cast<size_t>(std::distance(begin, end)));
37
+ std::copy(begin, end, std::back_inserter(buf));
38
+ }
39
+
40
+ void reset()
41
+ {
42
+ buf.clear();
43
+ }
44
+
45
+ result next(mcbp_message& msg)
46
+ {
47
+ static const size_t header_size = 24;
48
+ if (buf.size() < header_size) {
49
+ return need_data;
50
+ }
51
+ std::memcpy(&msg.header, buf.data(), header_size);
52
+ uint32_t body_size = ntohl(msg.header.bodylen);
53
+ if (body_size > 0 && buf.size() - header_size < body_size) {
54
+ return need_data;
55
+ }
56
+ msg.body.clear();
57
+ msg.body.reserve(body_size);
58
+ uint32_t key_size = ntohs(msg.header.keylen);
59
+ uint32_t prefix_size = uint32_t(msg.header.extlen) + key_size;
60
+ if (msg.header.magic == static_cast<uint8_t>(protocol::magic::alt_client_response)) {
61
+ uint8_t framing_extras_size = msg.header.keylen & 0xfU;
62
+ key_size = (msg.header.keylen & 0xf0U) >> 8U;
63
+ prefix_size = uint32_t(framing_extras_size) + uint32_t(msg.header.extlen) + key_size;
64
+ }
65
+ std::copy(buf.begin() + header_size, buf.begin() + header_size + prefix_size, std::back_inserter(msg.body));
66
+
67
+ bool is_compressed = (msg.header.datatype & static_cast<uint8_t>(protocol::datatype::snappy)) != 0;
68
+ bool use_raw_value = true;
69
+ if (is_compressed) {
70
+ std::string uncompressed;
71
+ size_t offset = header_size + prefix_size;
72
+ bool success = snappy::Uncompress(reinterpret_cast<const char*>(buf.data() + offset), body_size - prefix_size, &uncompressed);
73
+ if (success) {
74
+ std::copy(uncompressed.begin(), uncompressed.end(), std::back_inserter(msg.body));
75
+ use_raw_value = false;
76
+ // patch header with new body size
77
+ msg.header.bodylen = htonl(static_cast<std::uint32_t>(prefix_size + uncompressed.size()));
78
+ }
79
+ }
80
+ if (use_raw_value) {
81
+ std::copy(buf.begin() + header_size + prefix_size, buf.begin() + header_size + body_size, std::back_inserter(msg.body));
82
+ }
83
+ buf.erase(buf.begin(), buf.begin() + header_size + body_size);
84
+ if (!protocol::is_valid_magic(buf[0])) {
85
+ spdlog::warn("parsed frame for magic={:x}, opcode={:x}, opaque={}, body_len={}. Invalid magic of the next frame: {:x}, {} "
86
+ "bytes to parse{}",
87
+ msg.header.magic,
88
+ msg.header.opcode,
89
+ msg.header.opaque,
90
+ body_size,
91
+ buf[0],
92
+ buf.size(),
93
+ spdlog::to_hex(buf));
94
+ reset();
95
+ }
96
+ return ok;
97
+ }
98
+
99
+ std::vector<std::uint8_t> buf;
100
+ };
101
+ } // namespace couchbase::io
@@ -0,0 +1,1046 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2020 Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <utility>
21
+
22
+ #include <tao/json.hpp>
23
+
24
+ #include <asio.hpp>
25
+
26
+ #include <platform/uuid.h>
27
+
28
+ #include <io/mcbp_message.hxx>
29
+ #include <io/mcbp_parser.hxx>
30
+ #include <io/streams.hxx>
31
+
32
+ #include <timeout_defaults.hxx>
33
+
34
+ #include <protocol/hello_feature.hxx>
35
+ #include <protocol/client_request.hxx>
36
+ #include <protocol/client_response.hxx>
37
+ #include <protocol/server_request.hxx>
38
+ #include <protocol/cmd_hello.hxx>
39
+ #include <protocol/cmd_sasl_list_mechs.hxx>
40
+ #include <protocol/cmd_sasl_auth.hxx>
41
+ #include <protocol/cmd_sasl_step.hxx>
42
+ #include <protocol/cmd_select_bucket.hxx>
43
+ #include <protocol/cmd_get_cluster_config.hxx>
44
+ #include <protocol/cmd_get_error_map.hxx>
45
+ #include <protocol/cmd_get.hxx>
46
+ #include <protocol/cmd_cluster_map_change_notification.hxx>
47
+
48
+ #include <cbsasl/client.h>
49
+
50
+ #include <spdlog/fmt/bin_to_hex.h>
51
+
52
+ #include <origin.hxx>
53
+ #include <errors.hxx>
54
+ #include <version.hxx>
55
+
56
+ namespace couchbase::io
57
+ {
58
+
59
+ class mcbp_session : public std::enable_shared_from_this<mcbp_session>
60
+ {
61
+ class collection_cache
62
+ {
63
+ private:
64
+ std::map<std::string, std::uint32_t> cid_map_{ { "_default._default", 0 } };
65
+
66
+ public:
67
+ [[nodiscard]] std::optional<std::uint32_t> get(const std::string& path)
68
+ {
69
+ Expects(!path.empty());
70
+ auto ptr = cid_map_.find(path);
71
+ if (ptr != cid_map_.end()) {
72
+ return ptr->second;
73
+ }
74
+ return {};
75
+ }
76
+
77
+ void update(const std::string& path, std::uint32_t id)
78
+ {
79
+ Expects(!path.empty());
80
+ cid_map_[path] = id;
81
+ }
82
+
83
+ void reset()
84
+ {
85
+ cid_map_.clear();
86
+ cid_map_["_default._default"] = 0;
87
+ }
88
+ };
89
+
90
+ class message_handler
91
+ {
92
+ public:
93
+ virtual void handle(mcbp_message&& msg) = 0;
94
+
95
+ virtual ~message_handler() = default;
96
+
97
+ virtual void stop()
98
+ {
99
+ }
100
+ };
101
+
102
+ class bootstrap_handler : public message_handler
103
+ {
104
+ private:
105
+ std::shared_ptr<mcbp_session> session_;
106
+ sasl::ClientContext sasl_;
107
+ std::atomic_bool stopped_{ false };
108
+
109
+ public:
110
+ ~bootstrap_handler() override = default;
111
+
112
+ void stop() override
113
+ {
114
+ if (stopped_) {
115
+ return;
116
+ }
117
+ stopped_ = true;
118
+ session_.reset();
119
+ }
120
+
121
+ explicit bootstrap_handler(std::shared_ptr<mcbp_session> session)
122
+ : session_(session)
123
+ , sasl_([origin = session_->origin_]() -> std::string { return origin.get_username(); },
124
+ [origin = session_->origin_]() -> std::string { return origin.get_password(); },
125
+ { "SCRAM-SHA512", "SCRAM-SHA256", "SCRAM-SHA1", "PLAIN" })
126
+ {
127
+ tao::json::value user_agent{
128
+ { "a",
129
+ fmt::format(
130
+ "ruby/{}.{}.{}/{}", BACKEND_VERSION_MAJOR, BACKEND_VERSION_MINOR, BACKEND_VERSION_PATCH, BACKEND_GIT_REVISION) },
131
+ { "i", fmt::format("{}/{}", session_->client_id_, session_->id_) }
132
+ };
133
+ protocol::client_request<protocol::hello_request_body> hello_req;
134
+ hello_req.opaque(session_->next_opaque());
135
+ hello_req.body().user_agent(tao::json::to_string(user_agent));
136
+ spdlog::debug("{} user_agent={}, requested_features=[{}]",
137
+ session_->log_prefix_,
138
+ hello_req.body().user_agent(),
139
+ fmt::join(hello_req.body().features(), ", "));
140
+ session_->write(hello_req.data());
141
+
142
+ protocol::client_request<protocol::sasl_list_mechs_request_body> list_req;
143
+ list_req.opaque(session_->next_opaque());
144
+ session_->write(list_req.data());
145
+
146
+ protocol::client_request<protocol::sasl_auth_request_body> auth_req;
147
+ sasl::error sasl_code;
148
+ std::string_view sasl_payload;
149
+ std::tie(sasl_code, sasl_payload) = sasl_.start();
150
+ auth_req.opaque(session_->next_opaque());
151
+ auth_req.body().mechanism(sasl_.get_name());
152
+ auth_req.body().sasl_data(sasl_payload);
153
+ session_->write(auth_req.data());
154
+
155
+ session_->flush();
156
+ }
157
+
158
+ void complete(std::error_code ec)
159
+ {
160
+ stopped_ = true;
161
+ session_->invoke_bootstrap_handler(ec);
162
+ }
163
+
164
+ void auth_success()
165
+ {
166
+ session_->authenticated_ = true;
167
+ if (session_->supports_feature(protocol::hello_feature::xerror)) {
168
+ protocol::client_request<protocol::get_error_map_request_body> errmap_req;
169
+ errmap_req.opaque(session_->next_opaque());
170
+ session_->write(errmap_req.data());
171
+ }
172
+ if (session_->bucket_name_) {
173
+ protocol::client_request<protocol::select_bucket_request_body> sb_req;
174
+ sb_req.opaque(session_->next_opaque());
175
+ sb_req.body().bucket_name(session_->bucket_name_.value());
176
+ session_->write(sb_req.data());
177
+ }
178
+ protocol::client_request<protocol::get_cluster_config_request_body> cfg_req;
179
+ cfg_req.opaque(session_->next_opaque());
180
+ session_->write(cfg_req.data());
181
+ session_->flush();
182
+ }
183
+
184
+ void handle(mcbp_message&& msg) override
185
+ {
186
+ if (stopped_ || !session_) {
187
+ return;
188
+ }
189
+ Expects(protocol::is_valid_client_opcode(msg.header.opcode));
190
+ auto opcode = static_cast<protocol::client_opcode>(msg.header.opcode);
191
+ switch (opcode) {
192
+ case protocol::client_opcode::hello: {
193
+ protocol::client_response<protocol::hello_response_body> resp(msg);
194
+ if (resp.status() == protocol::status::success) {
195
+ session_->supported_features_ = resp.body().supported_features();
196
+ spdlog::debug("{} supported_features=[{}]", session_->log_prefix_, fmt::join(session_->supported_features_, ", "));
197
+ } else {
198
+ spdlog::warn("{} unexpected message status during bootstrap: {}", session_->log_prefix_, resp.error_message());
199
+ return complete(std::make_error_code(error::network_errc::handshake_failure));
200
+ }
201
+ } break;
202
+ case protocol::client_opcode::sasl_list_mechs: {
203
+ protocol::client_response<protocol::sasl_list_mechs_response_body> resp(msg);
204
+ if (resp.status() != protocol::status::success) {
205
+ spdlog::warn("{} unexpected message status during bootstrap: {}", session_->log_prefix_, resp.error_message());
206
+ return complete(std::make_error_code(error::common_errc::authentication_failure));
207
+ }
208
+ } break;
209
+ case protocol::client_opcode::sasl_auth: {
210
+ protocol::client_response<protocol::sasl_auth_response_body> resp(msg);
211
+ if (resp.status() == protocol::status::success) {
212
+ return auth_success();
213
+ }
214
+ if (resp.status() == protocol::status::auth_continue) {
215
+ sasl::error sasl_code;
216
+ std::string_view sasl_payload;
217
+ std::tie(sasl_code, sasl_payload) = sasl_.step(resp.body().value());
218
+ if (sasl_code == sasl::error::OK) {
219
+ return auth_success();
220
+ }
221
+ if (sasl_code == sasl::error::CONTINUE) {
222
+ protocol::client_request<protocol::sasl_step_request_body> req;
223
+ req.opaque(session_->next_opaque());
224
+ req.body().mechanism(sasl_.get_name());
225
+ req.body().sasl_data(sasl_payload);
226
+ session_->write_and_flush(req.data());
227
+ } else {
228
+ spdlog::error("{} unable to authenticate: sasl_code={}", session_->log_prefix_, sasl_code);
229
+ return complete(std::make_error_code(error::common_errc::authentication_failure));
230
+ }
231
+ } else {
232
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opcode={})",
233
+ session_->log_prefix_,
234
+ resp.error_message(),
235
+ opcode);
236
+ return complete(std::make_error_code(error::common_errc::authentication_failure));
237
+ }
238
+ } break;
239
+ case protocol::client_opcode::sasl_step: {
240
+ protocol::client_response<protocol::sasl_step_response_body> resp(msg);
241
+ if (resp.status() == protocol::status::success) {
242
+ return auth_success();
243
+ }
244
+ return complete(std::make_error_code(error::common_errc::authentication_failure));
245
+ }
246
+ case protocol::client_opcode::get_error_map: {
247
+ protocol::client_response<protocol::get_error_map_response_body> resp(msg);
248
+ if (resp.status() == protocol::status::success) {
249
+ session_->errmap_.emplace(resp.body().errmap());
250
+ } else {
251
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opcode={})",
252
+ session_->log_prefix_,
253
+ resp.error_message(),
254
+ opcode);
255
+ return complete(std::make_error_code(error::network_errc::protocol_error));
256
+ }
257
+ } break;
258
+ case protocol::client_opcode::select_bucket: {
259
+ protocol::client_response<protocol::select_bucket_response_body> resp(msg);
260
+ if (resp.status() == protocol::status::success) {
261
+ spdlog::debug("{} selected bucket: {}", session_->log_prefix_, session_->bucket_name_.value_or(""));
262
+ session_->bucket_selected_ = true;
263
+ } else if (resp.status() == protocol::status::no_access) {
264
+ spdlog::debug("{} unable to select bucket: {}, probably the bucket does not exist",
265
+ session_->log_prefix_,
266
+ session_->bucket_name_.value_or(""));
267
+ session_->bucket_selected_ = false;
268
+ return complete(std::make_error_code(error::common_errc::bucket_not_found));
269
+ } else {
270
+ spdlog::warn("{} unexpected message status during bootstrap: {}", session_->log_prefix_, resp.error_message());
271
+ return complete(std::make_error_code(error::common_errc::bucket_not_found));
272
+ }
273
+ } break;
274
+ case protocol::client_opcode::get_cluster_config: {
275
+ protocol::client_response<protocol::get_cluster_config_response_body> resp(msg);
276
+ if (resp.status() == protocol::status::success) {
277
+ session_->update_configuration(resp.body().config());
278
+ complete({});
279
+ } else if (resp.status() == protocol::status::no_bucket && !session_->bucket_name_) {
280
+ // bucket-less session, but the server wants bucket
281
+ session_->supports_gcccp_ = false;
282
+ spdlog::warn("{} this server does not support GCCCP, open bucket before making any cluster-level command",
283
+ session_->log_prefix_);
284
+ session_->update_configuration(
285
+ make_blank_configuration(session_->endpoint_address_, session_->endpoint_.port(), 0));
286
+ complete({});
287
+ } else {
288
+ spdlog::warn("{} unexpected message status during bootstrap: {} (opcode={})",
289
+ session_->log_prefix_,
290
+ resp.error_message(),
291
+ opcode);
292
+ return complete(std::make_error_code(error::network_errc::protocol_error));
293
+ }
294
+ } break;
295
+ default:
296
+ spdlog::warn("{} unexpected message during bootstrap: {}", session_->log_prefix_, opcode);
297
+ return complete(std::make_error_code(error::network_errc::protocol_error));
298
+ }
299
+ }
300
+ };
301
+
302
+ class normal_handler : public message_handler
303
+ {
304
+ private:
305
+ std::shared_ptr<mcbp_session> session_;
306
+ asio::steady_timer heartbeat_timer_;
307
+ std::atomic_bool stopped_{ false };
308
+
309
+ public:
310
+ ~normal_handler() override = default;
311
+
312
+ explicit normal_handler(std::shared_ptr<mcbp_session> session)
313
+ : session_(session)
314
+ , heartbeat_timer_(session_->ctx_)
315
+ {
316
+ if (session_->supports_gcccp_) {
317
+ fetch_config({});
318
+ }
319
+ }
320
+
321
+ void stop() override
322
+ {
323
+ if (stopped_) {
324
+ return;
325
+ }
326
+ stopped_ = true;
327
+ heartbeat_timer_.cancel();
328
+ session_.reset();
329
+ }
330
+
331
+ void handle(mcbp_message&& msg) override
332
+ {
333
+ if (stopped_ || !session_) {
334
+ return;
335
+ }
336
+ Expects(protocol::is_valid_magic(msg.header.magic));
337
+ switch (auto magic = static_cast<protocol::magic>(msg.header.magic)) {
338
+ case protocol::magic::client_response:
339
+ case protocol::magic::alt_client_response:
340
+ Expects(protocol::is_valid_client_opcode(msg.header.opcode));
341
+ switch (auto opcode = static_cast<protocol::client_opcode>(msg.header.opcode)) {
342
+ case protocol::client_opcode::get_cluster_config: {
343
+ protocol::client_response<protocol::get_cluster_config_response_body> resp(msg);
344
+ if (resp.status() == protocol::status::success) {
345
+ if (session_) {
346
+ session_->update_configuration(resp.body().config());
347
+ }
348
+ } else {
349
+ spdlog::warn("{} unexpected message status: {}", session_->log_prefix_, resp.error_message());
350
+ }
351
+ } break;
352
+ case protocol::client_opcode::get_collection_id:
353
+ case protocol::client_opcode::get:
354
+ case protocol::client_opcode::get_and_lock:
355
+ case protocol::client_opcode::get_and_touch:
356
+ case protocol::client_opcode::touch:
357
+ case protocol::client_opcode::insert:
358
+ case protocol::client_opcode::replace:
359
+ case protocol::client_opcode::upsert:
360
+ case protocol::client_opcode::remove:
361
+ case protocol::client_opcode::observe:
362
+ case protocol::client_opcode::unlock:
363
+ case protocol::client_opcode::increment:
364
+ case protocol::client_opcode::decrement:
365
+ case protocol::client_opcode::subdoc_multi_lookup:
366
+ case protocol::client_opcode::subdoc_multi_mutation: {
367
+ std::uint32_t opaque = msg.header.opaque;
368
+ std::uint16_t status = ntohs(msg.header.specific);
369
+ auto handler = session_->command_handlers_.find(opaque);
370
+ if (handler != session_->command_handlers_.end()) {
371
+ auto ec = session_->map_status_code(opcode, status);
372
+ spdlog::debug("{} MCBP invoke operation handler, opaque={}, status={}, ec={}",
373
+ session_->log_prefix_,
374
+ opaque,
375
+ status,
376
+ ec.message());
377
+ auto fun = handler->second;
378
+ session_->command_handlers_.erase(handler);
379
+ fun(ec, std::move(msg));
380
+ } else {
381
+ spdlog::debug("{} unexpected orphan response opcode={}, opaque={}",
382
+ session_->log_prefix_,
383
+ msg.header.opcode,
384
+ msg.header.opaque);
385
+ }
386
+ } break;
387
+ default:
388
+ spdlog::warn("{} unexpected client response: {}", session_->log_prefix_, opcode);
389
+ }
390
+ break;
391
+ case protocol::magic::server_request:
392
+ Expects(protocol::is_valid_server_request_opcode(msg.header.opcode));
393
+ switch (auto opcode = static_cast<protocol::server_opcode>(msg.header.opcode)) {
394
+ case protocol::server_opcode::cluster_map_change_notification: {
395
+ protocol::server_request<protocol::cluster_map_change_notification_request_body> req(msg);
396
+ if (session_) {
397
+ if ((!req.body().config().bucket.has_value() && req.body().bucket().empty()) ||
398
+ (session_->bucket_name_.has_value() && !req.body().bucket().empty() &&
399
+ session_->bucket_name_.value() == req.body().bucket())) {
400
+ session_->update_configuration(req.body().config());
401
+ }
402
+ }
403
+ } break;
404
+ default:
405
+ spdlog::warn("{} unexpected server request: {}", session_->log_prefix_, opcode);
406
+ }
407
+ break;
408
+ case protocol::magic::client_request:
409
+ case protocol::magic::alt_client_request:
410
+ case protocol::magic::server_response:
411
+ spdlog::warn(
412
+ "{} unexpected magic: {}, opcode={}, opaque={}", session_->log_prefix_, magic, msg.header.opcode, msg.header.opaque);
413
+ break;
414
+ }
415
+ }
416
+
417
+ void fetch_config(std::error_code ec)
418
+ {
419
+ if (ec == asio::error::operation_aborted || stopped_ || !session_) {
420
+ return;
421
+ }
422
+ protocol::client_request<protocol::get_cluster_config_request_body> req;
423
+ req.opaque(session_->next_opaque());
424
+ session_->write_and_flush(req.data());
425
+ heartbeat_timer_.expires_after(std::chrono::milliseconds(2500));
426
+ heartbeat_timer_.async_wait(std::bind(&normal_handler::fetch_config, this, std::placeholders::_1));
427
+ }
428
+ };
429
+
430
+ public:
431
+ mcbp_session() = delete;
432
+ mcbp_session(const std::string& client_id,
433
+ asio::io_context& ctx,
434
+ const couchbase::origin& origin,
435
+ std::optional<std::string> bucket_name = {},
436
+ std::vector<protocol::hello_feature> known_features = {})
437
+ : client_id_(client_id)
438
+ , id_(uuid::to_string(uuid::random()))
439
+ , ctx_(ctx)
440
+ , resolver_(ctx_)
441
+ , stream_(std::make_unique<plain_stream_impl>(ctx_))
442
+ , bootstrap_deadline_(ctx_)
443
+ , connection_deadline_(ctx_)
444
+ , retry_backoff_(ctx_)
445
+ , origin_(origin)
446
+ , bucket_name_(std::move(bucket_name))
447
+ , supported_features_(known_features)
448
+ {
449
+ log_prefix_ = fmt::format("[{}/{}/{}/{}]", stream_->log_prefix(), client_id_, id_, bucket_name_.value_or("-"));
450
+ }
451
+
452
+ mcbp_session(const std::string& client_id,
453
+ asio::io_context& ctx,
454
+ asio::ssl::context& tls,
455
+ const couchbase::origin& origin,
456
+ std::optional<std::string> bucket_name = {},
457
+ std::vector<protocol::hello_feature> known_features = {})
458
+ : client_id_(client_id)
459
+ , id_(uuid::to_string(uuid::random()))
460
+ , ctx_(ctx)
461
+ , resolver_(ctx_)
462
+ , stream_(std::make_unique<tls_stream_impl>(ctx_, tls))
463
+ , bootstrap_deadline_(ctx_)
464
+ , connection_deadline_(ctx_)
465
+ , retry_backoff_(ctx_)
466
+ , origin_(origin)
467
+ , bucket_name_(std::move(bucket_name))
468
+ , supported_features_(known_features)
469
+ {
470
+ log_prefix_ = fmt::format("[{}/{}/{}/{}]", stream_->log_prefix(), client_id_, id_, bucket_name_.value_or("-"));
471
+ }
472
+
473
+ ~mcbp_session()
474
+ {
475
+ stop();
476
+ }
477
+
478
+ [[nodiscard]] const std::string& log_prefix() const
479
+ {
480
+ return log_prefix_;
481
+ }
482
+
483
+ void bootstrap(std::function<void(std::error_code, configuration)>&& handler)
484
+ {
485
+ bootstrap_handler_ = std::move(handler);
486
+ bootstrap_deadline_.expires_after(timeout_defaults::bootstrap_timeout);
487
+ bootstrap_deadline_.async_wait([self = shared_from_this()](std::error_code ec) {
488
+ if (ec == asio::error::operation_aborted || self->stopped_) {
489
+ return;
490
+ }
491
+ spdlog::warn("{} unable to bootstrap in time", self->log_prefix_);
492
+ self->bootstrap_handler_(std::make_error_code(error::common_errc::unambiguous_timeout), {});
493
+ self->bootstrap_handler_ = nullptr;
494
+ self->stop();
495
+ });
496
+ initiate_bootstrap();
497
+ }
498
+
499
+ void initiate_bootstrap()
500
+ {
501
+ if (stopped_) {
502
+ return;
503
+ }
504
+ if (origin_.exhausted()) {
505
+ auto backoff = std::chrono::milliseconds(500);
506
+ spdlog::debug("{} reached the end of list of bootstrap nodes, waiting for {}ms before restart", log_prefix_, backoff.count());
507
+ retry_backoff_.expires_after(backoff);
508
+ retry_backoff_.async_wait([self = shared_from_this()](std::error_code ec) mutable {
509
+ if (ec == asio::error::operation_aborted || self->stopped_) {
510
+ return;
511
+ }
512
+ self->origin_.restart();
513
+ self->initiate_bootstrap();
514
+ });
515
+ return;
516
+ }
517
+ std::string service;
518
+ std::tie(bootstrap_hostname_, service) = origin_.next_address();
519
+ log_prefix_ = fmt::format(
520
+ "[{}/{}/{}/{}] <{}:{}>", stream_->log_prefix(), client_id_, id_, bucket_name_.value_or("-"), bootstrap_hostname_, service);
521
+ spdlog::debug("{} attempt to establish MCBP connection", log_prefix_);
522
+ resolver_.async_resolve(bootstrap_hostname_,
523
+ service,
524
+ std::bind(&mcbp_session::on_resolve, shared_from_this(), std::placeholders::_1, std::placeholders::_2));
525
+ }
526
+
527
+ [[nodiscard]] const std::string& id() const
528
+ {
529
+ return id_;
530
+ }
531
+
532
+ void stop()
533
+ {
534
+ if (stopped_) {
535
+ return;
536
+ }
537
+ stopped_ = true;
538
+ bootstrap_deadline_.cancel();
539
+ connection_deadline_.cancel();
540
+ retry_backoff_.cancel();
541
+ resolver_.cancel();
542
+ if (stream_->is_open()) {
543
+ stream_->close();
544
+ }
545
+ auto ec = std::make_error_code(error::common_errc::request_canceled);
546
+ if (!bootstrapped_ && bootstrap_handler_) {
547
+ bootstrap_handler_(ec, {});
548
+ bootstrap_handler_ = nullptr;
549
+ }
550
+ if (handler_) {
551
+ handler_->stop();
552
+ }
553
+ for (auto& handler : command_handlers_) {
554
+ spdlog::debug("{} MCBP cancel operation during session close, opaque={}, ec={}", log_prefix_, handler.first, ec.message());
555
+ handler.second(ec, {});
556
+ }
557
+ command_handlers_.clear();
558
+ }
559
+
560
+ void write(const std::vector<uint8_t>& buf)
561
+ {
562
+ if (stopped_) {
563
+ return;
564
+ }
565
+ std::uint32_t opaque{ 0 };
566
+ std::memcpy(&opaque, buf.data() + 12, sizeof(opaque));
567
+ spdlog::debug("{} MCBP send, opaque={}, {:n}", log_prefix_, opaque, spdlog::to_hex(buf.begin(), buf.begin() + 24));
568
+ SPDLOG_TRACE("{} MCBP send, opaque={}{:a}", log_prefix_, opaque, spdlog::to_hex(data));
569
+ std::scoped_lock lock(output_buffer_mutex_);
570
+ output_buffer_.push_back(buf);
571
+ }
572
+
573
+ void flush()
574
+ {
575
+ if (stopped_) {
576
+ return;
577
+ }
578
+ do_write();
579
+ }
580
+
581
+ void write_and_flush(const std::vector<uint8_t>& buf)
582
+ {
583
+ if (stopped_) {
584
+ return;
585
+ }
586
+ write(buf);
587
+ flush();
588
+ }
589
+
590
+ void write_and_subscribe(uint32_t opaque,
591
+ std::vector<std::uint8_t>& data,
592
+ std::function<void(std::error_code, io::mcbp_message&&)> handler)
593
+ {
594
+ if (stopped_) {
595
+ spdlog::warn("{} MCBP cancel operation, while trying to write to closed session opaque={}", log_prefix_, opaque);
596
+ handler(std::make_error_code(error::common_errc::request_canceled), {});
597
+ return;
598
+ }
599
+ command_handlers_.emplace(opaque, std::move(handler));
600
+ if (bootstrapped_ && stream_->is_open()) {
601
+ write_and_flush(data);
602
+ } else {
603
+ std::scoped_lock lock(pending_buffer_mutex_);
604
+ pending_buffer_.push_back(data);
605
+ }
606
+ }
607
+
608
+ void cancel(uint32_t opaque, std::error_code ec)
609
+ {
610
+ if (stopped_) {
611
+ return;
612
+ }
613
+ auto handler = command_handlers_.find(opaque);
614
+ if (handler != command_handlers_.end()) {
615
+ spdlog::debug("{} MCBP cancel operation, opaque={}, ec={}", log_prefix_, opaque, ec.message());
616
+ handler->second(ec, {});
617
+ command_handlers_.erase(handler);
618
+ }
619
+ }
620
+
621
+ [[nodiscard]] bool supports_feature(protocol::hello_feature feature)
622
+ {
623
+ return std::find(supported_features_.begin(), supported_features_.end(), feature) != supported_features_.end();
624
+ }
625
+
626
+ [[nodiscard]] std::vector<protocol::hello_feature> supported_features() const
627
+ {
628
+ return supported_features_;
629
+ }
630
+
631
+ [[nodiscard]] bool supports_gcccp()
632
+ {
633
+ return supports_gcccp_;
634
+ }
635
+
636
+ [[nodiscard]] bool has_config() const
637
+ {
638
+ return config_.has_value();
639
+ }
640
+
641
+ [[nodiscard]] configuration config() const
642
+ {
643
+ return config_.value();
644
+ }
645
+
646
+ [[nodiscard]] size_t index() const
647
+ {
648
+ Expects(config_.has_value());
649
+ return config_->index_for_this_node();
650
+ }
651
+
652
+ [[nodiscard]] const std::string& bootstrap_hostname() const
653
+ {
654
+ return bootstrap_hostname_;
655
+ }
656
+
657
+ [[nodiscard]] uint32_t next_opaque()
658
+ {
659
+ return ++opaque_;
660
+ }
661
+
662
+ std::error_code map_status_code(protocol::client_opcode opcode, uint16_t status)
663
+ {
664
+ switch (static_cast<protocol::status>(status)) {
665
+ case protocol::status::success:
666
+ case protocol::status::subdoc_multi_path_failure:
667
+ case protocol::status::subdoc_success_deleted:
668
+ case protocol::status::subdoc_multi_path_failure_deleted:
669
+ return {};
670
+
671
+ case protocol::status::not_found:
672
+ case protocol::status::not_stored:
673
+ return std::make_error_code(error::key_value_errc::document_not_found);
674
+
675
+ case protocol::status::exists:
676
+ if (opcode == protocol::client_opcode::insert) {
677
+ return std::make_error_code(error::key_value_errc::document_exists);
678
+ }
679
+ return std::make_error_code(error::common_errc::cas_mismatch);
680
+
681
+ case protocol::status::too_big:
682
+ return std::make_error_code(error::key_value_errc::value_too_large);
683
+
684
+ case protocol::status::invalid:
685
+ case protocol::status::xattr_invalid:
686
+ case protocol::status::subdoc_invalid_combo:
687
+ return std::make_error_code(error::common_errc::invalid_argument);
688
+
689
+ case protocol::status::delta_bad_value:
690
+ return std::make_error_code(error::key_value_errc::delta_invalid);
691
+
692
+ case protocol::status::no_bucket:
693
+ return std::make_error_code(error::common_errc::bucket_not_found);
694
+
695
+ case protocol::status::locked:
696
+ return std::make_error_code(error::key_value_errc::document_locked);
697
+
698
+ case protocol::status::auth_stale:
699
+ case protocol::status::auth_error:
700
+ case protocol::status::no_access:
701
+ return std::make_error_code(error::common_errc::authentication_failure);
702
+
703
+ case protocol::status::not_supported:
704
+ case protocol::status::unknown_command:
705
+ return std::make_error_code(error::common_errc::unsupported_operation);
706
+
707
+ case protocol::status::internal:
708
+ return std::make_error_code(error::common_errc::internal_server_failure);
709
+
710
+ case protocol::status::busy:
711
+ case protocol::status::temp_failure:
712
+ case protocol::status::no_memory:
713
+ case protocol::status::not_initialized:
714
+ return std::make_error_code(error::common_errc::temporary_failure);
715
+
716
+ case protocol::status::unknown_collection:
717
+ return std::make_error_code(error::common_errc::collection_not_found);
718
+
719
+ case protocol::status::unknown_scope:
720
+ return std::make_error_code(error::common_errc::scope_not_found);
721
+
722
+ case protocol::status::durability_invalid_level:
723
+ return std::make_error_code(error::key_value_errc::durability_level_not_available);
724
+
725
+ case protocol::status::durability_impossible:
726
+ return std::make_error_code(error::key_value_errc::durability_impossible);
727
+
728
+ case protocol::status::sync_write_in_progress:
729
+ return std::make_error_code(error::key_value_errc::durable_write_in_progress);
730
+
731
+ case protocol::status::sync_write_ambiguous:
732
+ return std::make_error_code(error::key_value_errc::durability_ambiguous);
733
+
734
+ case protocol::status::sync_write_re_commit_in_progress:
735
+ return std::make_error_code(error::key_value_errc::durable_write_re_commit_in_progress);
736
+
737
+ case protocol::status::subdoc_path_not_found:
738
+ return std::make_error_code(error::key_value_errc::path_not_found);
739
+
740
+ case protocol::status::subdoc_path_mismatch:
741
+ return std::make_error_code(error::key_value_errc::path_mismatch);
742
+
743
+ case protocol::status::subdoc_path_invalid:
744
+ return std::make_error_code(error::key_value_errc::path_invalid);
745
+
746
+ case protocol::status::subdoc_path_too_big:
747
+ return std::make_error_code(error::key_value_errc::path_too_big);
748
+
749
+ case protocol::status::subdoc_doc_too_deep:
750
+ return std::make_error_code(error::key_value_errc::value_too_deep);
751
+
752
+ case protocol::status::subdoc_value_cannot_insert:
753
+ return std::make_error_code(error::key_value_errc::value_invalid);
754
+
755
+ case protocol::status::subdoc_doc_not_json:
756
+ return std::make_error_code(error::key_value_errc::document_not_json);
757
+
758
+ case protocol::status::subdoc_num_range_error:
759
+ return std::make_error_code(error::key_value_errc::number_too_big);
760
+
761
+ case protocol::status::subdoc_delta_invalid:
762
+ return std::make_error_code(error::key_value_errc::delta_invalid);
763
+
764
+ case protocol::status::subdoc_path_exists:
765
+ return std::make_error_code(error::key_value_errc::path_exists);
766
+
767
+ case protocol::status::subdoc_value_too_deep:
768
+ return std::make_error_code(error::key_value_errc::value_too_deep);
769
+
770
+ case protocol::status::subdoc_xattr_invalid_flag_combo:
771
+ case protocol::status::subdoc_xattr_invalid_key_combo:
772
+ return std::make_error_code(error::key_value_errc::xattr_invalid_key_combo);
773
+
774
+ case protocol::status::subdoc_xattr_unknown_macro:
775
+ return std::make_error_code(error::key_value_errc::xattr_unknown_macro);
776
+
777
+ case protocol::status::subdoc_xattr_unknown_vattr:
778
+ return std::make_error_code(error::key_value_errc::xattr_unknown_virtual_attribute);
779
+
780
+ case protocol::status::subdoc_xattr_cannot_modify_vattr:
781
+ return std::make_error_code(error::key_value_errc::xattr_cannot_modify_virtual_attribute);
782
+
783
+ case protocol::status::subdoc_invalid_xattr_order:
784
+ case protocol::status::not_my_vbucket:
785
+ case protocol::status::auth_continue:
786
+ case protocol::status::range_error:
787
+ case protocol::status::rollback:
788
+ case protocol::status::unknown_frame_info:
789
+ case protocol::status::no_collections_manifest:
790
+ case protocol::status::cannot_apply_collections_manifest:
791
+ case protocol::status::collections_manifest_is_ahead:
792
+ case protocol::status::dcp_stream_id_invalid:
793
+ break;
794
+ }
795
+ // FIXME: use error map here
796
+ spdlog::warn("{} unknown status code: {} (opcode={})", log_prefix_, status, opcode);
797
+ return std::make_error_code(error::network_errc::protocol_error);
798
+ }
799
+
800
+ void update_configuration(configuration&& config)
801
+ {
802
+ if (stopped_) {
803
+ return;
804
+ }
805
+ if (!config_ || config.rev > config_->rev) {
806
+ for (auto& node : config.nodes) {
807
+ if (node.this_node && node.hostname.empty()) {
808
+ node.hostname = endpoint_address_;
809
+ }
810
+ }
811
+ config_.emplace(config);
812
+ spdlog::debug("{} received new configuration: {}", log_prefix_, config_.value());
813
+ }
814
+ }
815
+
816
+ std::optional<std::uint32_t> get_collection_uid(const std::string& collection_path)
817
+ {
818
+ return collection_cache_.get(collection_path);
819
+ }
820
+
821
+ void update_collection_uid(const std::string& path, std::uint32_t uid)
822
+ {
823
+ if (stopped_) {
824
+ return;
825
+ }
826
+ collection_cache_.update(path, uid);
827
+ }
828
+
829
+ private:
830
+ void invoke_bootstrap_handler(std::error_code ec)
831
+ {
832
+ if (!bootstrapped_ && bootstrap_handler_) {
833
+ bootstrap_deadline_.cancel();
834
+ bootstrap_handler_(ec, config_.value_or(configuration{}));
835
+ bootstrap_handler_ = nullptr;
836
+ }
837
+ if (ec) {
838
+ return stop();
839
+ }
840
+ bootstrapped_ = true;
841
+ handler_ = std::make_unique<normal_handler>(shared_from_this());
842
+ std::scoped_lock lock(pending_buffer_mutex_);
843
+ if (!pending_buffer_.empty()) {
844
+ for (const auto& buf : pending_buffer_) {
845
+ write(buf);
846
+ }
847
+ pending_buffer_.clear();
848
+ flush();
849
+ }
850
+ }
851
+
852
+ void on_resolve(std::error_code ec, const asio::ip::tcp::resolver::results_type& endpoints)
853
+ {
854
+ if (stopped_) {
855
+ return;
856
+ }
857
+ if (ec) {
858
+ spdlog::error("{} error on resolve: {}", log_prefix_, ec.message());
859
+ return initiate_bootstrap();
860
+ }
861
+ endpoints_ = endpoints;
862
+ do_connect(endpoints_.begin());
863
+ connection_deadline_.expires_after(timeout_defaults::connect_timeout);
864
+ connection_deadline_.async_wait(std::bind(&mcbp_session::check_deadline, shared_from_this(), std::placeholders::_1));
865
+ }
866
+
867
+ void do_connect(asio::ip::tcp::resolver::results_type::iterator it)
868
+ {
869
+ if (stopped_) {
870
+ return;
871
+ }
872
+ if (it != endpoints_.end()) {
873
+ spdlog::debug("{} connecting to {}:{}", log_prefix_, it->endpoint().address().to_string(), it->endpoint().port());
874
+ connection_deadline_.expires_after(timeout_defaults::connect_timeout);
875
+ stream_->async_connect(it->endpoint(), std::bind(&mcbp_session::on_connect, shared_from_this(), std::placeholders::_1, it));
876
+ } else {
877
+ spdlog::error("{} no more endpoints left to connect, will try another address", log_prefix_);
878
+ return initiate_bootstrap();
879
+ }
880
+ }
881
+
882
+ void on_connect(const std::error_code& ec, asio::ip::tcp::resolver::results_type::iterator it)
883
+ {
884
+ if (stopped_) {
885
+ return;
886
+ }
887
+ if (!stream_->is_open() || ec) {
888
+ spdlog::warn(
889
+ "{} unable to connect to {}:{}: {}", log_prefix_, it->endpoint().address().to_string(), it->endpoint().port(), ec.message());
890
+ do_connect(++it);
891
+ } else {
892
+ stream_->set_options();
893
+ endpoint_ = it->endpoint();
894
+ endpoint_address_ = endpoint_.address().to_string();
895
+ spdlog::debug("{} connected to {}:{}", log_prefix_, endpoint_address_, it->endpoint().port());
896
+ log_prefix_ = fmt::format("[{}/{}/{}/{}] <{}/{}:{}>",
897
+ stream_->log_prefix(),
898
+ client_id_,
899
+ id_,
900
+ bucket_name_.value_or("-"),
901
+ bootstrap_hostname_,
902
+ endpoint_address_,
903
+ endpoint_.port());
904
+ handler_ = std::make_unique<bootstrap_handler>(shared_from_this());
905
+ connection_deadline_.expires_at(asio::steady_timer::time_point::max());
906
+ connection_deadline_.cancel();
907
+ }
908
+ }
909
+
910
+ void check_deadline(std::error_code ec)
911
+ {
912
+ if (ec == asio::error::operation_aborted || stopped_) {
913
+ return;
914
+ }
915
+ if (connection_deadline_.expiry() <= asio::steady_timer::clock_type::now()) {
916
+ stream_->close();
917
+ connection_deadline_.expires_at(asio::steady_timer::time_point::max());
918
+ }
919
+ connection_deadline_.async_wait(std::bind(&mcbp_session::check_deadline, shared_from_this(), std::placeholders::_1));
920
+ }
921
+
922
+ void do_read()
923
+ {
924
+ if (stopped_) {
925
+ return;
926
+ }
927
+ if (reading_) {
928
+ return;
929
+ }
930
+ reading_ = true;
931
+ stream_->async_read_some(
932
+ asio::buffer(input_buffer_), [self = shared_from_this()](std::error_code ec, std::size_t bytes_transferred) {
933
+ if (ec == asio::error::operation_aborted || self->stopped_) {
934
+ return;
935
+ }
936
+ if (ec) {
937
+ spdlog::error("{} IO error while reading from the socket: {}", self->log_prefix_, ec.message());
938
+ return self->stop();
939
+ }
940
+ self->parser_.feed(self->input_buffer_.data(), self->input_buffer_.data() + ssize_t(bytes_transferred));
941
+
942
+ for (;;) {
943
+ mcbp_message msg{};
944
+ switch (self->parser_.next(msg)) {
945
+ case mcbp_parser::ok:
946
+ spdlog::debug(
947
+ "{} MCBP recv, opaque={}, {:n}", self->log_prefix_, msg.header.opaque, spdlog::to_hex(msg.header_data()));
948
+ SPDLOG_TRACE("{} MCBP recv, opaque={}{:a}{:a}",
949
+ self->log_prefix_,
950
+ msg.header.opaque,
951
+ spdlog::to_hex(msg.header_data()),
952
+ spdlog::to_hex(msg.body));
953
+ self->handler_->handle(std::move(msg));
954
+ if (self->stopped_) {
955
+ return;
956
+ }
957
+ break;
958
+ case mcbp_parser::need_data:
959
+ self->reading_ = false;
960
+ if (!self->stopped_) {
961
+ self->do_read();
962
+ }
963
+ return;
964
+ case mcbp_parser::failure:
965
+ return self->stop();
966
+ }
967
+ }
968
+ });
969
+ }
970
+
971
+ void do_write()
972
+ {
973
+ if (stopped_) {
974
+ return;
975
+ }
976
+ std::scoped_lock lock(writing_buffer_mutex_, output_buffer_mutex_);
977
+ if (!writing_buffer_.empty() || output_buffer_.empty()) {
978
+ return;
979
+ }
980
+ std::swap(writing_buffer_, output_buffer_);
981
+ std::vector<asio::const_buffer> buffers;
982
+ buffers.reserve(writing_buffer_.size());
983
+ for (auto& buf : writing_buffer_) {
984
+ buffers.emplace_back(asio::buffer(buf));
985
+ }
986
+ stream_->async_write(buffers, [self = shared_from_this()](std::error_code ec, std::size_t /*unused*/) {
987
+ if (ec == asio::error::operation_aborted || self->stopped_) {
988
+ return;
989
+ }
990
+ if (ec) {
991
+ spdlog::error("{} IO error while writing to the socket: {}", self->log_prefix_, ec.message());
992
+ return self->stop();
993
+ }
994
+ {
995
+ std::scoped_lock inner_lock(self->writing_buffer_mutex_);
996
+ self->writing_buffer_.clear();
997
+ }
998
+ self->do_write();
999
+ self->do_read();
1000
+ });
1001
+ }
1002
+
1003
+ std::string client_id_;
1004
+ std::string id_;
1005
+ asio::io_context& ctx_;
1006
+ asio::ip::tcp::resolver resolver_;
1007
+ std::unique_ptr<stream_impl> stream_;
1008
+ asio::steady_timer bootstrap_deadline_;
1009
+ asio::steady_timer connection_deadline_;
1010
+ asio::steady_timer retry_backoff_;
1011
+ couchbase::origin origin_;
1012
+ std::optional<std::string> bucket_name_;
1013
+ mcbp_parser parser_;
1014
+ std::unique_ptr<message_handler> handler_;
1015
+ std::function<void(std::error_code, const configuration&)> bootstrap_handler_{};
1016
+ std::map<uint32_t, std::function<void(std::error_code, io::mcbp_message&&)>> command_handlers_{};
1017
+
1018
+ bool bootstrapped_{ false };
1019
+ std::atomic_bool stopped_{ false };
1020
+ bool authenticated_{ false };
1021
+ bool bucket_selected_{ false };
1022
+ bool supports_gcccp_{ true };
1023
+
1024
+ std::atomic<std::uint32_t> opaque_{ 0 };
1025
+
1026
+ std::array<std::uint8_t, 16384> input_buffer_{};
1027
+ std::vector<std::vector<std::uint8_t>> output_buffer_{};
1028
+ std::vector<std::vector<std::uint8_t>> pending_buffer_{};
1029
+ std::vector<std::vector<std::uint8_t>> writing_buffer_{};
1030
+ std::mutex output_buffer_mutex_{};
1031
+ std::mutex pending_buffer_mutex_{};
1032
+ std::mutex writing_buffer_mutex_{};
1033
+ std::string bootstrap_hostname_{};
1034
+ asio::ip::tcp::endpoint endpoint_{}; // connected endpoint
1035
+ std::string endpoint_address_{}; // cached string with endpoint address
1036
+ asio::ip::tcp::resolver::results_type endpoints_;
1037
+ std::vector<protocol::hello_feature> supported_features_;
1038
+ std::optional<configuration> config_;
1039
+ std::optional<error_map> errmap_;
1040
+ collection_cache collection_cache_;
1041
+
1042
+ std::atomic_bool reading_{ false };
1043
+
1044
+ std::string log_prefix_{};
1045
+ };
1046
+ } // namespace couchbase::io