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

Sign up to get free protection for your applications and to get access to all the features.
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