couchbase 3.8.2 → 3.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/ext/CMakeLists.txt +16 -1
- data/ext/cache/cpm/{CPM_0.42.0.cmake → CPM_0.43.1.cmake} +18 -2
- data/ext/cache/extconf_include.rb +6 -6
- data/ext/cache/mozilla-ca-bundle.crt +121 -55
- data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
- data/ext/couchbase/CMakeLists.txt +136 -23
- data/ext/couchbase/cmake/APKBUILD.in +25 -4
- data/ext/couchbase/cmake/Bundler.cmake +143 -34
- data/ext/couchbase/cmake/CPM.cmake +126 -12
- data/ext/couchbase/cmake/Cache.cmake +7 -1
- data/ext/couchbase/cmake/CompilerOptions.cmake +1 -1
- data/ext/couchbase/cmake/CompilerWarnings.cmake +17 -6
- data/ext/couchbase/cmake/GrpcProtobuf.cmake +481 -0
- data/ext/couchbase/cmake/OpenSSL.cmake +82 -7
- data/ext/couchbase/cmake/Packaging.cmake +519 -65
- data/ext/couchbase/cmake/Protostellar.cmake +250 -0
- data/ext/couchbase/cmake/Sanitizers.cmake +61 -50
- data/ext/couchbase/cmake/StaticAnalyzers.cmake +16 -5
- data/ext/couchbase/cmake/TestFramework.cmake +283 -0
- data/ext/couchbase/cmake/TestFrameworkAddTests.cmake +51 -0
- data/ext/couchbase/cmake/Testing.cmake +27 -9
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +141 -8
- data/ext/couchbase/cmake/VersionInfo.cmake +50 -0
- data/ext/couchbase/cmake/build_config.hxx.in +2 -1
- data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +101 -23
- data/ext/couchbase/cmake/couchbase_cxx_client_static-config.cmake.in +7 -0
- data/ext/couchbase/cmake/couchbase_cxx_client_static.pc.in +2 -0
- data/ext/couchbase/cmake/gRPC_Generate.cmake +58 -0
- data/ext/couchbase/cmake/protobuf_Generate.cmake +69 -0
- data/ext/couchbase/cmake/require-git-checkout.cmake +25 -0
- data/ext/couchbase/cmake/tarball_glob.txt +49 -0
- data/ext/couchbase/core/agent_group.cxx +0 -8
- data/ext/couchbase/core/agent_group.hxx +0 -4
- data/ext/couchbase/core/analytics_stream.cxx +314 -0
- data/ext/couchbase/core/analytics_stream.hxx +129 -0
- data/ext/couchbase/core/analytics_stream_component.cxx +245 -0
- data/ext/couchbase/core/analytics_stream_component.hxx +67 -0
- data/ext/couchbase/core/app_telemetry_meter.cxx +25 -3
- data/ext/couchbase/core/app_telemetry_meter.hxx +77 -0
- data/ext/couchbase/core/app_telemetry_reporter.cxx +7 -6
- data/ext/couchbase/core/bucket.cxx +381 -87
- data/ext/couchbase/core/bucket.hxx +105 -25
- data/ext/couchbase/core/bucket_unit_test_api.hxx +57 -0
- data/ext/couchbase/core/capella.hxx +91 -0
- data/ext/couchbase/core/cluster.cxx +1551 -397
- data/ext/couchbase/core/cluster.hxx +39 -8
- data/ext/couchbase/core/cluster_agent.cxx +0 -8
- data/ext/couchbase/core/cluster_agent.hxx +0 -4
- data/ext/couchbase/core/cluster_options.hxx +26 -3
- data/ext/couchbase/core/collections_component.cxx +39 -15
- data/ext/couchbase/core/config_profiles.cxx +1 -1
- data/ext/couchbase/core/crud_component.cxx +2 -2
- data/ext/couchbase/core/crud_options.hxx +34 -0
- data/ext/couchbase/core/crypto/cbcrypto.cc +18 -13
- data/ext/couchbase/core/document_id_redaction.hxx +81 -0
- data/ext/couchbase/core/error_context/base_error_context.hxx +7 -6
- data/ext/couchbase/core/error_context/key_value.cxx +25 -2
- data/ext/couchbase/core/error_context/key_value.hxx +60 -33
- data/ext/couchbase/core/error_context/key_value_error_context.hxx +16 -15
- data/ext/couchbase/core/error_context/search.hxx +5 -0
- data/ext/couchbase/core/error_context/search_json.hxx +3 -0
- data/ext/couchbase/core/error_context/subdocument_error_context.hxx +19 -18
- data/ext/couchbase/core/error_context/view.hxx +5 -0
- data/ext/couchbase/core/free_form_http_request.cxx +237 -4
- data/ext/couchbase/core/free_form_http_request.hxx +41 -8
- data/ext/couchbase/core/http_component.cxx +300 -284
- data/ext/couchbase/core/http_component.hxx +0 -4
- data/ext/couchbase/core/impl/analytics.cxx +38 -5
- data/ext/couchbase/core/impl/analytics.hxx +34 -0
- data/ext/couchbase/core/impl/bootstrap_error.hxx +0 -3
- data/ext/couchbase/core/impl/collection.cxx +215 -202
- data/ext/couchbase/core/impl/collection_manager.cxx +1 -1
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +45 -18
- data/ext/couchbase/core/impl/error.cxx +22 -2
- data/ext/couchbase/core/impl/internal_analytics_stream_result.hxx +111 -0
- data/ext/couchbase/core/impl/internal_query_stream_result.hxx +110 -0
- data/ext/couchbase/core/impl/invoke_with_node_id.hxx +15 -7
- data/ext/couchbase/core/impl/key_value_error_category.cxx +6 -0
- data/ext/couchbase/core/impl/lookup_in_replica.cxx +10 -10
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +4 -4
- data/ext/couchbase/core/impl/node_id.cxx +49 -13
- data/ext/couchbase/core/impl/observability_recorder.cxx +12 -2
- data/ext/couchbase/core/impl/observe_poll.cxx +63 -23
- data/ext/couchbase/core/impl/public_analytics_stream_result.cxx +372 -0
- data/ext/couchbase/core/impl/public_bucket.cxx +48 -2
- data/ext/couchbase/core/impl/public_cluster.cxx +229 -42
- data/ext/couchbase/core/impl/public_query_stream_result.cxx +380 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_replicas_from_preferred_server_group_result.cxx +42 -0
- data/ext/couchbase/core/impl/public_transaction_get_multi_result.cxx +42 -0
- data/ext/couchbase/core/impl/query.cxx +76 -7
- data/ext/couchbase/core/impl/query.hxx +36 -0
- data/ext/couchbase/core/impl/query_index_manager.cxx +54 -1
- data/ext/couchbase/core/impl/replica_utils.cxx +101 -0
- data/ext/couchbase/core/impl/replica_utils.hxx +64 -0
- data/ext/couchbase/core/impl/resolve_node_id.hxx +125 -0
- data/ext/couchbase/core/impl/scope.cxx +70 -0
- data/ext/couchbase/core/impl/search.cxx +31 -1
- data/ext/couchbase/core/impl/transactions.cxx +130 -0
- data/ext/couchbase/core/impl/wait_until_ready.cxx +439 -0
- data/ext/couchbase/core/impl/wait_until_ready.hxx +110 -0
- data/ext/couchbase/core/impl/with_bucket_config_or_timeout.hxx +180 -0
- data/ext/couchbase/core/impl/with_cancellation.hxx +11 -3
- data/ext/couchbase/core/io/configuration_belongs_to_session.hxx +1 -2
- data/ext/couchbase/core/io/dns_client.cxx +122 -45
- data/ext/couchbase/core/io/dns_codec.hxx +21 -21
- data/ext/couchbase/core/io/dns_config.cxx +21 -6
- data/ext/couchbase/core/io/http_command.hxx +149 -121
- data/ext/couchbase/core/io/http_error.hxx +107 -0
- data/ext/couchbase/core/io/http_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_session.cxx +606 -154
- data/ext/couchbase/core/io/http_session.hxx +147 -30
- data/ext/couchbase/core/io/http_session_manager.hxx +329 -382
- data/ext/couchbase/core/io/http_streaming_parser.cxx +4 -0
- data/ext/couchbase/core/io/http_streaming_response.cxx +328 -43
- data/ext/couchbase/core/io/http_streaming_response.hxx +37 -3
- data/ext/couchbase/core/io/mcbp_buffer_pool.hxx +122 -0
- data/ext/couchbase/core/io/mcbp_command.hxx +150 -51
- data/ext/couchbase/core/io/mcbp_command_id.hxx +45 -0
- data/ext/couchbase/core/io/mcbp_message.cxx +9 -1
- data/ext/couchbase/core/io/mcbp_message.hxx +19 -0
- data/ext/couchbase/core/io/mcbp_output_queue.hxx +150 -0
- data/ext/couchbase/core/io/mcbp_parser.cxx +24 -7
- data/ext/couchbase/core/io/mcbp_session.cxx +309 -301
- data/ext/couchbase/core/io/mcbp_session.hxx +27 -18
- data/ext/couchbase/core/io/opaque_ring_table.hxx +145 -0
- data/ext/couchbase/core/io/retry_orchestrator.hxx +6 -5
- data/ext/couchbase/core/io/stream_deadline.hxx +50 -0
- data/ext/couchbase/core/io/streams.cxx +151 -21
- data/ext/couchbase/core/io/streams.hxx +48 -1
- data/ext/couchbase/core/logger/logger.cxx +36 -0
- data/ext/couchbase/core/logger/logger.hxx +46 -6
- data/ext/couchbase/core/logger/redaction.hxx +503 -0
- data/ext/couchbase/core/management/eventing_status.hxx +10 -0
- data/ext/couchbase/core/management/eventing_status_json.hxx +4 -0
- data/ext/couchbase/core/mcbp/big_endian.cxx +1 -1
- data/ext/couchbase/core/mcbp/codec.cxx +27 -18
- data/ext/couchbase/core/mcbp/operation_queue.cxx +2 -2
- data/ext/couchbase/core/mcbp/packet.hxx +2 -2
- data/ext/couchbase/core/mcbp/queue_request.cxx +23 -6
- data/ext/couchbase/core/mcbp/queue_request.hxx +21 -0
- data/ext/couchbase/core/meta/features.hxx +13 -0
- data/ext/couchbase/core/meta/version.cxx +6 -3
- data/ext/couchbase/core/metrics/logging_meter.cxx +5 -10
- data/ext/couchbase/core/metrics/meter_wrapper.cxx +63 -33
- data/ext/couchbase/core/metrics/meter_wrapper.hxx +55 -3
- data/ext/couchbase/core/operations/analytics_response_parsing.cxx +177 -0
- data/ext/couchbase/core/operations/analytics_response_parsing.hxx +55 -0
- data/ext/couchbase/core/operations/document_analytics.cxx +48 -130
- data/ext/couchbase/core/operations/document_analytics.hxx +14 -2
- data/ext/couchbase/core/operations/document_get_all_replicas.hxx +15 -7
- data/ext/couchbase/core/operations/document_get_any_replica.hxx +19 -8
- data/ext/couchbase/core/operations/document_get_projected.cxx +1 -1
- data/ext/couchbase/core/{impl/get_replica.cxx → operations/document_get_replica.cxx} +21 -3
- data/ext/couchbase/core/{impl/get_replica.hxx → operations/document_get_replica.hxx} +31 -4
- data/ext/couchbase/core/operations/document_lookup_in.cxx +10 -10
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +228 -198
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +215 -217
- data/ext/couchbase/core/operations/document_query.cxx +108 -221
- data/ext/couchbase/core/operations/document_query.hxx +18 -4
- data/ext/couchbase/core/operations/document_search.cxx +52 -8
- data/ext/couchbase/core/operations/document_search.hxx +3 -0
- data/ext/couchbase/core/operations/document_view.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_dataset_create.cxx +15 -8
- data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +4 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_drop.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_dataset_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_dataverse_create.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_dataverse_drop.cxx +10 -5
- data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.cxx +2 -1
- data/ext/couchbase/core/operations/management/analytics_index_create.cxx +33 -8
- data/ext/couchbase/core/operations/management/analytics_index_drop.cxx +12 -7
- data/ext/couchbase/core/operations/management/analytics_index_get_all.cxx +3 -2
- data/ext/couchbase/core/operations/management/analytics_link_connect.cxx +11 -6
- data/ext/couchbase/core/operations/management/analytics_link_create.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_disconnect.cxx +10 -4
- data/ext/couchbase/core/operations/management/analytics_link_drop.cxx +6 -4
- data/ext/couchbase/core/operations/management/analytics_link_get_all.cxx +4 -3
- data/ext/couchbase/core/operations/management/analytics_link_replace.cxx +3 -3
- data/ext/couchbase/core/operations/management/analytics_link_utils.hxx +1 -1
- data/ext/couchbase/core/operations/management/change_password.cxx +2 -0
- data/ext/couchbase/core/operations/management/collection_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/error_utils.cxx +60 -6
- data/ext/couchbase/core/operations/management/error_utils.hxx +29 -1
- data/ext/couchbase/core/operations/management/eventing_deploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_drop_function.cxx +8 -3
- data/ext/couchbase/core/operations/management/eventing_get_all_functions.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_get_function.cxx +5 -3
- data/ext/couchbase/core/operations/management/eventing_get_status.cxx +4 -2
- data/ext/couchbase/core/operations/management/eventing_pause_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_resume_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_undeploy_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/eventing_upsert_function.cxx +9 -3
- data/ext/couchbase/core/operations/management/group_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/group_upsert.cxx +11 -8
- data/ext/couchbase/core/operations/management/query_index_build.cxx +5 -2
- data/ext/couchbase/core/operations/management/query_index_create.cxx +9 -3
- data/ext/couchbase/core/operations/management/query_index_drop.cxx +11 -4
- data/ext/couchbase/core/operations/management/query_index_get_all.cxx +1 -1
- data/ext/couchbase/core/operations/management/query_index_get_all_deferred.cxx +1 -1
- data/ext/couchbase/core/operations/management/scope_drop.cxx +5 -1
- data/ext/couchbase/core/operations/management/scope_get_all.cxx +6 -1
- data/ext/couchbase/core/operations/management/search_get_stats.cxx +10 -0
- data/ext/couchbase/core/operations/management/search_index_analyze_document.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_control_ingest.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_control_query.cxx +4 -3
- data/ext/couchbase/core/operations/management/search_index_drop.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get.cxx +2 -2
- data/ext/couchbase/core/operations/management/search_index_get_documents_count.cxx +3 -2
- data/ext/couchbase/core/operations/management/search_index_get_stats.cxx +3 -1
- data/ext/couchbase/core/operations/management/search_index_upsert.cxx +2 -2
- data/ext/couchbase/core/operations/management/user_drop.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_get.cxx +3 -1
- data/ext/couchbase/core/operations/management/user_upsert.cxx +12 -9
- data/ext/couchbase/core/operations/management/view_index_drop.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_get.cxx +1 -1
- data/ext/couchbase/core/operations/management/view_index_upsert.cxx +1 -1
- data/ext/couchbase/core/operations/operation_traits.hxx +18 -0
- data/ext/couchbase/core/operations/query_response_parsing.cxx +211 -0
- data/ext/couchbase/core/operations/query_response_parsing.hxx +60 -0
- data/ext/couchbase/core/operations_fwd.hxx +3 -3
- data/ext/couchbase/core/origin.cxx +54 -26
- data/ext/couchbase/core/origin.hxx +12 -0
- data/ext/couchbase/core/orphan_reporter.cxx +2 -1
- data/ext/couchbase/core/platform/random.cc +7 -7
- data/ext/couchbase/core/protocol/client_request.cxx +2 -2
- data/ext/couchbase/core/protocol/client_request.hxx +38 -21
- data/ext/couchbase/core/protocol/client_response.cxx +11 -3
- data/ext/couchbase/core/protocol/client_response.hxx +27 -6
- data/ext/couchbase/core/protocol/cmd_append.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_cluster_map_change_notification.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_decrement.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_get.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_and_lock.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_and_touch.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_cluster_config.cxx +6 -4
- data/ext/couchbase/core/protocol/cmd_get_collection_id.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_get_error_map.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_get_meta.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_get_replica.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_hello.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_increment.cxx +6 -6
- data/ext/couchbase/core/protocol/cmd_insert.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_lookup_in.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_lookup_in_replica.cxx +4 -3
- data/ext/couchbase/core/protocol/cmd_mutate_in.cxx +10 -9
- data/ext/couchbase/core/protocol/cmd_mutate_in.hxx +10 -10
- data/ext/couchbase/core/protocol/cmd_observe_seqno.cxx +7 -7
- data/ext/couchbase/core/protocol/cmd_prepend.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_remove.cxx +2 -2
- data/ext/couchbase/core/protocol/cmd_replace.cxx +4 -4
- data/ext/couchbase/core/protocol/cmd_touch.cxx +1 -1
- data/ext/couchbase/core/protocol/cmd_upsert.cxx +4 -4
- data/ext/couchbase/core/protocol/datatype.hxx +118 -1
- data/ext/couchbase/core/protocol/frame_info_utils.cxx +1 -1
- data/ext/couchbase/core/protocol/magic.hxx +4 -0
- data/ext/couchbase/core/protocol/magic_fmt.hxx +3 -0
- data/ext/couchbase/core/protocol/server_request.hxx +3 -1
- data/ext/couchbase/core/protocol/status.cxx +1 -1
- data/ext/couchbase/core/protostellar/analytics_converter.hxx +171 -0
- data/ext/couchbase/core/protostellar/bucket_admin_converter.hxx +301 -0
- data/ext/couchbase/core/protostellar/collection_admin_converter.hxx +92 -0
- data/ext/couchbase/core/protostellar/component.cxx +2445 -0
- data/ext/couchbase/core/protostellar/component.hxx +391 -0
- data/ext/couchbase/core/{columnar/bootstrap_notification_subscriber.hxx → protostellar/compression_settings.hxx} +11 -10
- data/ext/couchbase/core/protostellar/credentials.cxx +233 -0
- data/ext/couchbase/core/protostellar/credentials.hxx +88 -0
- data/ext/couchbase/core/protostellar/dispatcher.cxx +57 -0
- data/ext/couchbase/core/protostellar/dispatcher.hxx +482 -0
- data/ext/couchbase/core/protostellar/error_utils.cxx +293 -0
- data/ext/couchbase/core/protostellar/error_utils.hxx +97 -0
- data/ext/couchbase/core/protostellar/json_payload.hxx +49 -0
- data/ext/couchbase/core/protostellar/kv_converter.cxx +70 -0
- data/ext/couchbase/core/protostellar/kv_converter.hxx +600 -0
- data/ext/couchbase/core/protostellar/query_converter.hxx +265 -0
- data/ext/couchbase/core/protostellar/query_index_admin_converter.hxx +291 -0
- data/ext/couchbase/core/protostellar/query_proto.hxx +73 -0
- data/ext/couchbase/core/protostellar/search_converter.hxx +244 -0
- data/ext/couchbase/core/protostellar/search_index_admin_converter.hxx +156 -0
- data/ext/couchbase/core/protostellar/view_converter.hxx +158 -0
- data/ext/couchbase/core/query_stream.cxx +447 -0
- data/ext/couchbase/core/query_stream.hxx +141 -0
- data/ext/couchbase/core/query_stream_component.cxx +243 -0
- data/ext/couchbase/core/query_stream_component.hxx +68 -0
- data/ext/couchbase/core/range_scan_load_balancer.cxx +15 -8
- data/ext/couchbase/core/range_scan_orchestrator.cxx +15 -3
- data/ext/couchbase/core/response_handler.hxx +41 -4
- data/ext/couchbase/core/row_streamer.cxx +332 -46
- data/ext/couchbase/core/row_streamer.hxx +31 -1
- data/ext/couchbase/core/row_streamer_options.hxx +55 -0
- data/ext/couchbase/core/sasl/client.h +3 -0
- data/ext/couchbase/core/search_scoring.hxx +66 -0
- data/ext/couchbase/core/stream_error_details.hxx +69 -0
- data/ext/couchbase/core/timeout_defaults.hxx +0 -1
- data/ext/couchbase/core/topology/capabilities.hxx +6 -0
- data/ext/couchbase/core/topology/capabilities_fmt.hxx +3 -0
- data/ext/couchbase/core/topology/configuration.cxx +21 -6
- data/ext/couchbase/core/topology/configuration.hxx +29 -8
- data/ext/couchbase/core/topology/configuration_json.hxx +3 -0
- data/ext/couchbase/core/topology/error_map_json.hxx +3 -1
- data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +70 -4
- data/ext/couchbase/core/tracing/threshold_logging_tracer.hxx +10 -0
- data/ext/couchbase/core/transactions/active_transaction_record.cxx +0 -34
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +108 -63
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +19 -2
- data/ext/couchbase/core/transactions/error_list.hxx +2 -2
- data/ext/couchbase/core/transactions/get_multi_fetch.hxx +160 -0
- data/ext/couchbase/core/transactions/get_multi_orchestrator.cxx +326 -125
- data/ext/couchbase/core/transactions/get_multi_transaction_id.hxx +62 -0
- data/ext/couchbase/core/transactions/internal/atr_entry.hxx +22 -2
- data/ext/couchbase/core/transactions/internal/transaction_context.hxx +2 -2
- data/ext/couchbase/core/transactions/internal/transactions_cleanup.hxx +23 -1
- data/ext/couchbase/core/transactions/internal/utils.hxx +50 -14
- data/ext/couchbase/core/transactions/staged_mutation.cxx +23 -18
- data/ext/couchbase/core/transactions/staged_mutation.hxx +15 -4
- data/ext/couchbase/core/transactions/transaction_context.cxx +55 -40
- data/ext/couchbase/core/transactions/transaction_get_result.hxx +16 -0
- data/ext/couchbase/core/transactions/transactions.cxx +3 -55
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +165 -72
- data/ext/couchbase/core/transactions/transactions_config.cxx +0 -11
- data/ext/couchbase/core/transactions/utils.cxx +10 -0
- data/ext/couchbase/core/transactions/waitable_op_list.hxx +2 -2
- data/ext/couchbase/core/transactions.hxx +9 -9
- data/ext/couchbase/core/utils/byteswap.hxx +166 -9
- data/ext/couchbase/core/utils/connection_string.cxx +50 -85
- data/ext/couchbase/core/utils/connection_string.hxx +15 -0
- data/ext/couchbase/core/{columnar/backoff_calculator.hxx → utils/deadline.hxx} +13 -13
- data/ext/couchbase/core/utils/duration_parser.cxx +1 -1
- data/ext/couchbase/core/utils/json_streaming_lexer.cxx +48 -5
- data/ext/couchbase/core/utils/json_streaming_lexer.hxx +4 -1
- data/ext/couchbase/core/utils/movable_function.hxx +301 -52
- data/ext/couchbase/core/utils/name_codec.hxx +154 -11
- data/ext/couchbase/core/{columnar/retry_info.hxx → utils/process_id.hxx} +18 -13
- data/ext/couchbase/core/utils/url_codec.cxx +12 -51
- data/ext/couchbase/core/websocket_codec.cxx +13 -37
- data/ext/couchbase/couchbase/analytics_options.hxx +21 -10
- data/ext/couchbase/couchbase/analytics_row.hxx +105 -0
- data/ext/couchbase/couchbase/analytics_stream_result.hxx +266 -0
- data/ext/couchbase/couchbase/boolean_query.hxx +3 -3
- data/ext/couchbase/couchbase/bucket.hxx +57 -0
- data/ext/couchbase/couchbase/cluster.hxx +183 -5
- data/ext/couchbase/{core/columnar/security_options.hxx → couchbase/cluster_state.hxx} +18 -14
- data/ext/couchbase/couchbase/codec/lenient_json_transcoder.hxx +69 -0
- data/ext/couchbase/couchbase/collection.hxx +234 -14
- data/ext/couchbase/couchbase/common_durability_options.hxx +18 -3
- data/ext/couchbase/couchbase/conjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/create_dataset_analytics_options.hxx +6 -1
- data/ext/couchbase/couchbase/date_range_query.hxx +2 -2
- data/ext/couchbase/couchbase/decrement_options.hxx +1 -1
- data/ext/couchbase/couchbase/disjunction_query.hxx +1 -1
- data/ext/couchbase/couchbase/error.hxx +32 -0
- data/ext/couchbase/couchbase/error_codes.hxx +33 -1
- data/ext/couchbase/couchbase/geo_bounding_box_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_distance_query.hxx +1 -1
- data/ext/couchbase/couchbase/geo_polygon_query.hxx +1 -1
- data/ext/couchbase/couchbase/get_replica_options.hxx +68 -0
- data/ext/couchbase/couchbase/get_replica_result.hxx +5 -3
- data/ext/couchbase/couchbase/get_replica_strategy.hxx +161 -0
- data/ext/couchbase/couchbase/get_result.hxx +1 -0
- data/ext/couchbase/couchbase/increment_options.hxx +1 -1
- data/ext/couchbase/couchbase/insert_options.hxx +1 -1
- data/ext/couchbase/couchbase/match_phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/match_query.hxx +1 -1
- data/ext/couchbase/couchbase/mutate_in_options.hxx +3 -3
- data/ext/couchbase/couchbase/network_options.hxx +1 -1
- data/ext/couchbase/couchbase/node_id.hxx +42 -14
- data/ext/couchbase/couchbase/node_id_for_options.hxx +7 -1
- data/ext/couchbase/couchbase/node_ids_options.hxx +8 -2
- data/ext/couchbase/couchbase/numeric_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/phrase_query.hxx +1 -1
- data/ext/couchbase/couchbase/prefix_query.hxx +1 -1
- data/ext/couchbase/couchbase/query_options.hxx +23 -12
- data/ext/couchbase/couchbase/query_row.hxx +111 -0
- data/ext/couchbase/couchbase/query_stream_result.hxx +302 -0
- data/ext/couchbase/couchbase/query_string_query.hxx +3 -3
- data/ext/couchbase/couchbase/regexp_query.hxx +1 -1
- data/ext/couchbase/couchbase/replace_options.hxx +3 -3
- data/ext/couchbase/couchbase/result.hxx +14 -3
- data/ext/couchbase/couchbase/scan_result_item.hxx +1 -0
- data/ext/couchbase/couchbase/scope.hxx +85 -2
- data/ext/couchbase/couchbase/search_options.hxx +58 -8
- data/ext/couchbase/couchbase/search_scoring.hxx +94 -0
- data/ext/couchbase/couchbase/search_scoring_none.hxx +51 -0
- data/ext/couchbase/couchbase/search_scoring_reciprocal_rank_fusion.hxx +88 -0
- data/ext/couchbase/couchbase/search_scoring_relative_score_fusion.hxx +70 -0
- data/ext/couchbase/couchbase/term_range_query.hxx +1 -1
- data/ext/couchbase/couchbase/tracing/request_span.hxx +46 -0
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_replicas_from_preferred_server_group_result.hxx +23 -21
- data/ext/couchbase/couchbase/transactions/transaction_get_multi_result.hxx +24 -19
- data/ext/couchbase/couchbase/transactions/transaction_get_result.hxx +17 -3
- data/ext/couchbase/couchbase/transactions/transactions_config.hxx +4 -2
- data/ext/couchbase/couchbase/transactions.hxx +27 -18
- data/ext/couchbase/couchbase/upsert_options.hxx +3 -3
- data/ext/couchbase/couchbase/vector_query.hxx +1 -1
- data/ext/couchbase/couchbase/wait_until_ready_options.hxx +111 -0
- data/ext/couchbase/couchbase/wildcard_query.hxx +1 -1
- data/ext/extconf.rb +15 -10
- data/ext/rcb_analytics.cxx +82 -102
- data/ext/rcb_backend.cxx +42 -36
- data/ext/rcb_backend.hxx +2 -0
- data/ext/rcb_buckets.cxx +47 -59
- data/ext/rcb_collections.cxx +42 -52
- data/ext/rcb_crud.cxx +345 -224
- data/ext/rcb_diagnostics.cxx +117 -27
- data/ext/rcb_exceptions.cxx +152 -99
- data/ext/rcb_exceptions.hxx +25 -0
- data/ext/rcb_extras.cxx +18 -19
- data/ext/rcb_hdr_histogram.cxx +19 -4
- data/ext/rcb_logger.cxx +202 -27
- data/ext/rcb_logger.hxx +12 -0
- data/ext/rcb_multi.cxx +40 -40
- data/ext/rcb_observability.cxx +7 -5
- data/ext/rcb_query.cxx +99 -142
- data/ext/rcb_range_scan.cxx +41 -35
- data/ext/rcb_search.cxx +98 -99
- data/ext/rcb_users.cxx +36 -56
- data/ext/rcb_utils.cxx +100 -37
- data/ext/rcb_utils.hxx +287 -33
- data/ext/rcb_version.cxx +1 -1
- data/ext/rcb_views.cxx +55 -51
- data/lib/active_support/cache/couchbase_store.rb +77 -12
- data/lib/couchbase/bucket.rb +20 -0
- data/lib/couchbase/cluster.rb +17 -0
- data/lib/couchbase/collection.rb +36 -1
- data/lib/couchbase/errors.rb +18 -0
- data/lib/couchbase/fork_hooks.rb +16 -7
- data/lib/couchbase/get_replica_strategy.rb +89 -0
- data/lib/couchbase/logger.rb +1 -1
- data/lib/couchbase/management/analytics_index_manager.rb +15 -15
- data/lib/couchbase/management/bucket_manager.rb +6 -6
- data/lib/couchbase/management/collection_manager.rb +6 -6
- data/lib/couchbase/management/query_index_manager.rb +7 -7
- data/lib/couchbase/management/search_index_manager.rb +13 -13
- data/lib/couchbase/management/user_manager.rb +10 -10
- data/lib/couchbase/management/view_index_manager.rb +5 -5
- data/lib/couchbase/options.rb +174 -42
- data/lib/couchbase/protostellar/bucket.rb +4 -0
- data/lib/couchbase/protostellar/cluster.rb +4 -0
- data/lib/couchbase/protostellar/collection.rb +4 -0
- data/lib/couchbase/protostellar/error_handling.rb +2 -1
- data/lib/couchbase/protostellar/request.rb +1 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +16 -2
- data/lib/couchbase/protostellar/request_generator/search.rb +17 -1
- data/lib/couchbase/protostellar/retry/orchestrator.rb +3 -2
- data/lib/couchbase/protostellar/retry/strategies/fail_fast.rb +33 -0
- data/lib/couchbase/protostellar/retry/strategies.rb +1 -0
- data/lib/couchbase/search_options.rb +95 -6
- data/lib/couchbase/version.rb +1 -1
- metadata +91 -33
- data/ext/0001-fix-build-for-mingw-w64-ucrt-x86_64-toolchain.patch +0 -40
- data/ext/couchbase/core/columnar/agent.hxx +0 -71
- data/ext/couchbase/core/columnar/agent_config.hxx +0 -59
- data/ext/couchbase/core/columnar/background_bootstrap_listener.hxx +0 -42
- data/ext/couchbase/core/columnar/backoff_calculator.cxx +0 -62
- data/ext/couchbase/core/columnar/columnar_agent.cxx +0 -147
- data/ext/couchbase/core/columnar/columnar_agent_config.cxx +0 -48
- data/ext/couchbase/core/columnar/columnar_error.cxx +0 -51
- data/ext/couchbase/core/columnar/database_management_options.hxx +0 -56
- data/ext/couchbase/core/columnar/error.hxx +0 -51
- data/ext/couchbase/core/columnar/error_codes.cxx +0 -107
- data/ext/couchbase/core/columnar/error_codes.hxx +0 -75
- data/ext/couchbase/core/columnar/management_component.cxx +0 -300
- data/ext/couchbase/core/columnar/management_component.hxx +0 -56
- data/ext/couchbase/core/columnar/query_component.cxx +0 -523
- data/ext/couchbase/core/columnar/query_component.hxx +0 -57
- data/ext/couchbase/core/columnar/query_options.hxx +0 -59
- data/ext/couchbase/core/columnar/query_result.cxx +0 -130
- data/ext/couchbase/core/columnar/query_result.hxx +0 -78
- data/ext/couchbase/core/io/config_tracker.cxx +0 -687
- data/ext/couchbase/core/io/config_tracker.hxx +0 -123
|
@@ -28,6 +28,10 @@ auto
|
|
|
28
28
|
extract_common_error_code(std::uint32_t status_code, const std::string& response_body)
|
|
29
29
|
-> std::error_code
|
|
30
30
|
{
|
|
31
|
+
// RFC-58: a 400 that reaches this fallback is invalid_argument.
|
|
32
|
+
if (status_code == 400) {
|
|
33
|
+
return errc::common::invalid_argument;
|
|
34
|
+
}
|
|
31
35
|
if (status_code == 429) {
|
|
32
36
|
if (response_body.find("Limit(s) exceeded") != std::string::npos) {
|
|
33
37
|
return errc::common::rate_limited;
|
|
@@ -59,6 +63,7 @@ extract_common_query_error_code(std::uint64_t code, const std::string& message)
|
|
|
59
63
|
|
|
60
64
|
case 13014: /* ICode: E_DATASTORE_INSUFFICIENT_CREDENTIALS, IKey:
|
|
61
65
|
"datastore.couchbase.insufficient_credentials" */
|
|
66
|
+
case 2120: /* ICode: E_ADMIN_AUTH, IKey: "admin.clustering.authorize" */
|
|
62
67
|
return errc::common::authentication_failure;
|
|
63
68
|
|
|
64
69
|
case 5000:
|
|
@@ -73,15 +78,26 @@ extract_common_query_error_code(std::uint64_t code, const std::string& message)
|
|
|
73
78
|
break;
|
|
74
79
|
}
|
|
75
80
|
|
|
81
|
+
// RFC-58 maps these ranges whatever the HTTP status, so a 400 carrying one is not
|
|
82
|
+
// invalid_argument.
|
|
83
|
+
if (code >= 5000 && code < 6000) {
|
|
84
|
+
return errc::common::internal_server_failure;
|
|
85
|
+
}
|
|
86
|
+
if (code >= 10000 && code < 11000) {
|
|
87
|
+
return errc::common::authentication_failure;
|
|
88
|
+
}
|
|
76
89
|
return {};
|
|
77
90
|
}
|
|
78
91
|
|
|
79
92
|
auto
|
|
80
|
-
extract_eventing_error_code(const tao::json::value& response)
|
|
93
|
+
extract_eventing_error_code(const tao::json::value& response, std::uint32_t status_code)
|
|
81
94
|
-> std::pair<std::error_code, eventing_problem>
|
|
82
95
|
{
|
|
96
|
+
// RFC-58: a 400 that names no specific problem is invalid_argument.
|
|
97
|
+
const std::error_code unmatched_400 =
|
|
98
|
+
status_code == 400 ? errc::common::invalid_argument : std::error_code{};
|
|
83
99
|
if (!response.is_object()) {
|
|
84
|
-
return {};
|
|
100
|
+
return { unmatched_400, {} };
|
|
85
101
|
}
|
|
86
102
|
if (const auto& name = response.find("name"); name != nullptr && name->is_string()) {
|
|
87
103
|
std::string description;
|
|
@@ -93,7 +109,7 @@ extract_eventing_error_code(const tao::json::value& response)
|
|
|
93
109
|
name->get_string(),
|
|
94
110
|
description,
|
|
95
111
|
};
|
|
96
|
-
if (problem.name == "ERR_APP_NOT_FOUND_TS") {
|
|
112
|
+
if (problem.name == "ERR_APP_NOT_FOUND_TS" || problem.name == "ERR_APP_NOT_FOUND") {
|
|
97
113
|
return { errc::management::eventing_function_not_found, problem };
|
|
98
114
|
}
|
|
99
115
|
if (problem.name == "ERR_APP_NOT_DEPLOYED") {
|
|
@@ -131,9 +147,9 @@ extract_eventing_error_code(const tao::json::value& response)
|
|
|
131
147
|
if (problem.name == "ERR_INVALID_CONFIG" || problem.name == "ERR_INTER_FUNCTION_RECURSION") {
|
|
132
148
|
return { errc::common::invalid_argument, problem };
|
|
133
149
|
}
|
|
134
|
-
return { errc::common::internal_server_failure, problem };
|
|
150
|
+
return { unmatched_400 ? unmatched_400 : errc::common::internal_server_failure, problem };
|
|
135
151
|
}
|
|
136
|
-
return {};
|
|
152
|
+
return { unmatched_400, {} };
|
|
137
153
|
}
|
|
138
154
|
|
|
139
155
|
auto
|
|
@@ -215,6 +231,31 @@ translate_query_error_code(std::uint64_t error, const std::string& message, std:
|
|
|
215
231
|
return extract_common_query_error_code(error, message);
|
|
216
232
|
}
|
|
217
233
|
|
|
234
|
+
auto
|
|
235
|
+
extract_query_error_code(std::uint32_t status_code, const std::string& response_body)
|
|
236
|
+
-> std::error_code
|
|
237
|
+
{
|
|
238
|
+
tao::json::value payload{};
|
|
239
|
+
try {
|
|
240
|
+
payload = utils::json::parse(response_body);
|
|
241
|
+
} catch (const tao::pegtl::parse_error&) {
|
|
242
|
+
return extract_common_error_code(status_code, response_body);
|
|
243
|
+
}
|
|
244
|
+
if (const auto* errors = payload.is_object() ? payload.find("errors") : nullptr;
|
|
245
|
+
errors != nullptr && errors->is_array() && !errors->get_array().empty()) {
|
|
246
|
+
const auto& first = errors->get_array().front();
|
|
247
|
+
if (const auto* code = first.is_object() ? first.find("code") : nullptr;
|
|
248
|
+
code != nullptr && code->is_integer()) {
|
|
249
|
+
if (auto ec = translate_query_error_code(code->as<std::uint64_t>(),
|
|
250
|
+
first.optional<std::string>("msg").value_or(""));
|
|
251
|
+
ec) {
|
|
252
|
+
return ec.value();
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
}
|
|
256
|
+
return extract_common_error_code(status_code, response_body);
|
|
257
|
+
}
|
|
258
|
+
|
|
218
259
|
auto
|
|
219
260
|
translate_analytics_error_code(std::uint64_t error, const std::string& /* message */)
|
|
220
261
|
-> std::optional<std::error_code>
|
|
@@ -229,6 +270,13 @@ translate_analytics_error_code(std::uint64_t error, const std::string& /* messag
|
|
|
229
270
|
case 24006: /* Link [string] does not exist | Link [string] does not exist */
|
|
230
271
|
return errc::analytics::link_not_found;
|
|
231
272
|
|
|
273
|
+
case 24000: /* RFC-58: ParsingFailure */
|
|
274
|
+
return errc::common::parsing_failure;
|
|
275
|
+
|
|
276
|
+
case 23000: /* RFC-58: TemporaryFailure */
|
|
277
|
+
case 23003: /* RFC-58: TemporaryFailure */
|
|
278
|
+
return errc::common::temporary_failure;
|
|
279
|
+
|
|
232
280
|
case 23007: /* Job queue is full with [string] jobs */
|
|
233
281
|
return errc::analytics::job_queue_full;
|
|
234
282
|
|
|
@@ -262,9 +310,15 @@ translate_analytics_error_code(std::uint64_t error, const std::string& /* messag
|
|
|
262
310
|
if (error >= 24000 && error < 25000) {
|
|
263
311
|
return errc::analytics::compilation_failure;
|
|
264
312
|
}
|
|
313
|
+
if (error >= 20000 && error < 21000) {
|
|
314
|
+
return errc::common::authentication_failure;
|
|
315
|
+
}
|
|
316
|
+
if (error >= 25000 && error < 26000) {
|
|
317
|
+
return errc::common::internal_server_failure;
|
|
318
|
+
}
|
|
265
319
|
break;
|
|
266
320
|
}
|
|
267
|
-
return
|
|
321
|
+
return {};
|
|
268
322
|
}
|
|
269
323
|
|
|
270
324
|
auto
|
|
@@ -23,7 +23,10 @@
|
|
|
23
23
|
|
|
24
24
|
#include <tao/json/forward.hpp>
|
|
25
25
|
|
|
26
|
+
#include <cstdint>
|
|
26
27
|
#include <optional>
|
|
28
|
+
#include <string>
|
|
29
|
+
#include <system_error>
|
|
27
30
|
|
|
28
31
|
namespace couchbase::core::operations::management
|
|
29
32
|
{
|
|
@@ -35,16 +38,41 @@ std::optional<std::error_code>
|
|
|
35
38
|
extract_common_query_error_code(std::uint64_t code, const std::string& message);
|
|
36
39
|
|
|
37
40
|
std::pair<std::error_code, eventing_problem>
|
|
38
|
-
extract_eventing_error_code(const tao::json::value& response);
|
|
41
|
+
extract_eventing_error_code(const tao::json::value& response, std::uint32_t status_code);
|
|
39
42
|
|
|
40
43
|
std::optional<std::error_code>
|
|
41
44
|
translate_query_error_code(std::uint64_t error,
|
|
42
45
|
const std::string& message,
|
|
43
46
|
std::uint64_t reason = 0);
|
|
44
47
|
|
|
48
|
+
/**
|
|
49
|
+
* RFC-58: the first query error code in the body decides, as for a query statement. Only a code
|
|
50
|
+
* without a mapping of its own, or a body without one, falls back on the HTTP status.
|
|
51
|
+
*/
|
|
52
|
+
[[nodiscard]] std::error_code
|
|
53
|
+
extract_query_error_code(std::uint32_t status_code, const std::string& response_body);
|
|
54
|
+
|
|
45
55
|
std::optional<std::error_code>
|
|
46
56
|
translate_analytics_error_code(std::uint64_t error, const std::string& message);
|
|
47
57
|
|
|
58
|
+
/**
|
|
59
|
+
* RFC-58: the first analytics error code decides, through translate_analytics_error_code(). Only a
|
|
60
|
+
* code without a mapping of its own falls back on the HTTP status.
|
|
61
|
+
*/
|
|
62
|
+
template<typename Problems>
|
|
63
|
+
[[nodiscard]] auto
|
|
64
|
+
extract_analytics_error_code(std::uint32_t status_code,
|
|
65
|
+
const Problems& errors,
|
|
66
|
+
const std::string& response_body) -> std::error_code
|
|
67
|
+
{
|
|
68
|
+
if (!errors.empty()) {
|
|
69
|
+
if (auto ec = translate_analytics_error_code(errors.front().code, errors.front().message); ec) {
|
|
70
|
+
return ec.value();
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
return extract_common_error_code(status_code, response_body);
|
|
74
|
+
}
|
|
75
|
+
|
|
48
76
|
std::optional<std::error_code>
|
|
49
77
|
translate_search_error_code(std::uint32_t status_code, const std::string& response_body);
|
|
50
78
|
|
|
@@ -30,7 +30,8 @@ eventing_deploy_function_request::encode_to(encoded_request_type& encoded,
|
|
|
30
30
|
http_context& /* context */) const -> std::error_code
|
|
31
31
|
{
|
|
32
32
|
encoded.method = "POST";
|
|
33
|
-
encoded.path =
|
|
33
|
+
encoded.path =
|
|
34
|
+
fmt::format("/api/v1/functions/{}/deploy", utils::string_codec::v2::path_escape(name));
|
|
34
35
|
if (bucket_name.has_value() && scope_name.has_value()) {
|
|
35
36
|
encoded.path += fmt::format("?bucket={}&scope={}",
|
|
36
37
|
utils::string_codec::v2::path_escape(bucket_name.value()),
|
|
@@ -47,6 +48,9 @@ eventing_deploy_function_request::make_response(error_context::http&& ctx,
|
|
|
47
48
|
eventing_deploy_function_response response{ std::move(ctx) };
|
|
48
49
|
if (!response.ctx.ec) {
|
|
49
50
|
if (encoded.body.data().empty()) {
|
|
51
|
+
if (encoded.status_code == 400) {
|
|
52
|
+
response.ctx.ec = errc::common::invalid_argument;
|
|
53
|
+
}
|
|
50
54
|
return response;
|
|
51
55
|
}
|
|
52
56
|
tao::json::value payload{};
|
|
@@ -56,10 +60,12 @@ eventing_deploy_function_request::make_response(error_context::http&& ctx,
|
|
|
56
60
|
response.ctx.ec = errc::common::parsing_failure;
|
|
57
61
|
return response;
|
|
58
62
|
}
|
|
59
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
63
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
60
64
|
if (ec) {
|
|
61
65
|
response.ctx.ec = ec;
|
|
62
|
-
|
|
66
|
+
if (!problem.name.empty()) {
|
|
67
|
+
response.error.emplace(problem);
|
|
68
|
+
}
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
return response;
|
|
@@ -30,7 +30,7 @@ eventing_drop_function_request::encode_to(encoded_request_type& encoded,
|
|
|
30
30
|
http_context& /* context */) const -> std::error_code
|
|
31
31
|
{
|
|
32
32
|
encoded.method = "DELETE";
|
|
33
|
-
encoded.path = fmt::format("/api/v1/functions/{}", name);
|
|
33
|
+
encoded.path = fmt::format("/api/v1/functions/{}", utils::string_codec::v2::path_escape(name));
|
|
34
34
|
if (bucket_name.has_value() && scope_name.has_value()) {
|
|
35
35
|
encoded.path += fmt::format("?bucket={}&scope={}",
|
|
36
36
|
utils::string_codec::v2::path_escape(bucket_name.value()),
|
|
@@ -47,6 +47,9 @@ eventing_drop_function_request::make_response(error_context::http&& ctx,
|
|
|
47
47
|
eventing_drop_function_response response{ std::move(ctx) };
|
|
48
48
|
if (!response.ctx.ec) {
|
|
49
49
|
if (encoded.body.data().empty()) {
|
|
50
|
+
if (encoded.status_code == 400) {
|
|
51
|
+
response.ctx.ec = errc::common::invalid_argument;
|
|
52
|
+
}
|
|
50
53
|
return response;
|
|
51
54
|
}
|
|
52
55
|
tao::json::value payload{};
|
|
@@ -56,10 +59,12 @@ eventing_drop_function_request::make_response(error_context::http&& ctx,
|
|
|
56
59
|
response.ctx.ec = errc::common::parsing_failure;
|
|
57
60
|
return response;
|
|
58
61
|
}
|
|
59
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
62
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
60
63
|
if (ec) {
|
|
61
64
|
response.ctx.ec = ec;
|
|
62
|
-
|
|
65
|
+
if (!problem.name.empty()) {
|
|
66
|
+
response.error.emplace(problem);
|
|
67
|
+
}
|
|
63
68
|
return response;
|
|
64
69
|
}
|
|
65
70
|
}
|
|
@@ -48,10 +48,12 @@ eventing_get_all_functions_request::make_response(error_context::http&& ctx,
|
|
|
48
48
|
response.ctx.ec = errc::common::parsing_failure;
|
|
49
49
|
return response;
|
|
50
50
|
}
|
|
51
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
51
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
52
52
|
if (ec) {
|
|
53
53
|
response.ctx.ec = ec;
|
|
54
|
-
|
|
54
|
+
if (!problem.name.empty()) {
|
|
55
|
+
response.error.emplace(problem);
|
|
56
|
+
}
|
|
55
57
|
return response;
|
|
56
58
|
}
|
|
57
59
|
if (!payload.is_array()) {
|
|
@@ -31,7 +31,7 @@ eventing_get_function_request::encode_to(encoded_request_type& encoded,
|
|
|
31
31
|
http_context& /* context */) const -> std::error_code
|
|
32
32
|
{
|
|
33
33
|
encoded.method = "GET";
|
|
34
|
-
encoded.path = fmt::format("/api/v1/functions/{}", name);
|
|
34
|
+
encoded.path = fmt::format("/api/v1/functions/{}", utils::string_codec::v2::path_escape(name));
|
|
35
35
|
if (bucket_name.has_value() && scope_name.has_value()) {
|
|
36
36
|
encoded.path += fmt::format("?bucket={}&scope={}",
|
|
37
37
|
utils::string_codec::v2::path_escape(bucket_name.value()),
|
|
@@ -54,10 +54,12 @@ eventing_get_function_request::make_response(error_context::http&& ctx,
|
|
|
54
54
|
response.ctx.ec = errc::common::parsing_failure;
|
|
55
55
|
return response;
|
|
56
56
|
}
|
|
57
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
57
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
58
58
|
if (ec) {
|
|
59
59
|
response.ctx.ec = ec;
|
|
60
|
-
|
|
60
|
+
if (!problem.name.empty()) {
|
|
61
|
+
response.error.emplace(problem);
|
|
62
|
+
}
|
|
61
63
|
return response;
|
|
62
64
|
}
|
|
63
65
|
response.function = payload.as<couchbase::core::management::eventing::function>();
|
|
@@ -48,10 +48,12 @@ eventing_get_status_request::make_response(error_context::http&& ctx,
|
|
|
48
48
|
response.ctx.ec = errc::common::parsing_failure;
|
|
49
49
|
return response;
|
|
50
50
|
}
|
|
51
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
51
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
52
52
|
if (ec) {
|
|
53
53
|
response.ctx.ec = ec;
|
|
54
|
-
|
|
54
|
+
if (!problem.name.empty()) {
|
|
55
|
+
response.error.emplace(problem);
|
|
56
|
+
}
|
|
55
57
|
return response;
|
|
56
58
|
}
|
|
57
59
|
response.status = payload.as<core::management::eventing::status>();
|
|
@@ -31,7 +31,8 @@ eventing_pause_function_request::encode_to(encoded_request_type& encoded,
|
|
|
31
31
|
http_context& /* context */) const -> std::error_code
|
|
32
32
|
{
|
|
33
33
|
encoded.method = "POST";
|
|
34
|
-
encoded.path =
|
|
34
|
+
encoded.path =
|
|
35
|
+
fmt::format("/api/v1/functions/{}/pause", utils::string_codec::v2::path_escape(name));
|
|
35
36
|
if (bucket_name.has_value() && scope_name.has_value()) {
|
|
36
37
|
encoded.path += fmt::format("?bucket={}&scope={}",
|
|
37
38
|
utils::string_codec::v2::path_escape(bucket_name.value()),
|
|
@@ -48,6 +49,9 @@ eventing_pause_function_request::make_response(error_context::http&& ctx,
|
|
|
48
49
|
eventing_pause_function_response response{ std::move(ctx) };
|
|
49
50
|
if (!response.ctx.ec) {
|
|
50
51
|
if (encoded.body.data().empty()) {
|
|
52
|
+
if (encoded.status_code == 400) {
|
|
53
|
+
response.ctx.ec = errc::common::invalid_argument;
|
|
54
|
+
}
|
|
51
55
|
return response;
|
|
52
56
|
}
|
|
53
57
|
tao::json::value payload{};
|
|
@@ -57,10 +61,12 @@ eventing_pause_function_request::make_response(error_context::http&& ctx,
|
|
|
57
61
|
response.ctx.ec = errc::common::parsing_failure;
|
|
58
62
|
return response;
|
|
59
63
|
}
|
|
60
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
64
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
61
65
|
if (ec) {
|
|
62
66
|
response.ctx.ec = ec;
|
|
63
|
-
|
|
67
|
+
if (!problem.name.empty()) {
|
|
68
|
+
response.error.emplace(problem);
|
|
69
|
+
}
|
|
64
70
|
}
|
|
65
71
|
}
|
|
66
72
|
return response;
|
|
@@ -30,7 +30,8 @@ eventing_resume_function_request::encode_to(encoded_request_type& encoded,
|
|
|
30
30
|
http_context& /* context */) const -> std::error_code
|
|
31
31
|
{
|
|
32
32
|
encoded.method = "POST";
|
|
33
|
-
encoded.path =
|
|
33
|
+
encoded.path =
|
|
34
|
+
fmt::format("/api/v1/functions/{}/resume", utils::string_codec::v2::path_escape(name));
|
|
34
35
|
if (bucket_name.has_value() && scope_name.has_value()) {
|
|
35
36
|
encoded.path += fmt::format("?bucket={}&scope={}",
|
|
36
37
|
utils::string_codec::v2::path_escape(bucket_name.value()),
|
|
@@ -47,6 +48,9 @@ eventing_resume_function_request::make_response(error_context::http&& ctx,
|
|
|
47
48
|
eventing_resume_function_response response{ std::move(ctx) };
|
|
48
49
|
if (!response.ctx.ec) {
|
|
49
50
|
if (encoded.body.data().empty()) {
|
|
51
|
+
if (encoded.status_code == 400) {
|
|
52
|
+
response.ctx.ec = errc::common::invalid_argument;
|
|
53
|
+
}
|
|
50
54
|
return response;
|
|
51
55
|
}
|
|
52
56
|
tao::json::value payload{};
|
|
@@ -56,10 +60,12 @@ eventing_resume_function_request::make_response(error_context::http&& ctx,
|
|
|
56
60
|
response.ctx.ec = errc::common::parsing_failure;
|
|
57
61
|
return response;
|
|
58
62
|
}
|
|
59
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
63
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
60
64
|
if (ec) {
|
|
61
65
|
response.ctx.ec = ec;
|
|
62
|
-
|
|
66
|
+
if (!problem.name.empty()) {
|
|
67
|
+
response.error.emplace(problem);
|
|
68
|
+
}
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
return response;
|
|
@@ -30,7 +30,8 @@ eventing_undeploy_function_request::encode_to(encoded_request_type& encoded,
|
|
|
30
30
|
http_context& /* context */) const -> std::error_code
|
|
31
31
|
{
|
|
32
32
|
encoded.method = "POST";
|
|
33
|
-
encoded.path =
|
|
33
|
+
encoded.path =
|
|
34
|
+
fmt::format("/api/v1/functions/{}/undeploy", utils::string_codec::v2::path_escape(name));
|
|
34
35
|
if (bucket_name.has_value() && scope_name.has_value()) {
|
|
35
36
|
encoded.path += fmt::format("?bucket={}&scope={}",
|
|
36
37
|
utils::string_codec::v2::path_escape(bucket_name.value()),
|
|
@@ -47,6 +48,9 @@ eventing_undeploy_function_request::make_response(error_context::http&& ctx,
|
|
|
47
48
|
eventing_undeploy_function_response response{ std::move(ctx) };
|
|
48
49
|
if (!response.ctx.ec) {
|
|
49
50
|
if (encoded.body.data().empty()) {
|
|
51
|
+
if (encoded.status_code == 400) {
|
|
52
|
+
response.ctx.ec = errc::common::invalid_argument;
|
|
53
|
+
}
|
|
50
54
|
return response;
|
|
51
55
|
}
|
|
52
56
|
tao::json::value payload{};
|
|
@@ -56,10 +60,12 @@ eventing_undeploy_function_request::make_response(error_context::http&& ctx,
|
|
|
56
60
|
response.ctx.ec = errc::common::parsing_failure;
|
|
57
61
|
return response;
|
|
58
62
|
}
|
|
59
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
63
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
60
64
|
if (ec) {
|
|
61
65
|
response.ctx.ec = ec;
|
|
62
|
-
|
|
66
|
+
if (!problem.name.empty()) {
|
|
67
|
+
response.error.emplace(problem);
|
|
68
|
+
}
|
|
63
69
|
}
|
|
64
70
|
}
|
|
65
71
|
return response;
|
|
@@ -332,7 +332,8 @@ eventing_upsert_function_request::encode_to(encoded_request_type& encoded,
|
|
|
332
332
|
|
|
333
333
|
encoded.headers["content-type"] = "application/json";
|
|
334
334
|
encoded.method = "POST";
|
|
335
|
-
encoded.path =
|
|
335
|
+
encoded.path =
|
|
336
|
+
fmt::format("/api/v1/functions/{}", utils::string_codec::v2::path_escape(function.name));
|
|
336
337
|
if (bucket_name.has_value() && scope_name.has_value()) {
|
|
337
338
|
encoded.path += fmt::format("?bucket={}&scope={}",
|
|
338
339
|
utils::string_codec::v2::path_escape(bucket_name.value()),
|
|
@@ -350,6 +351,9 @@ eventing_upsert_function_request::make_response(error_context::http&& ctx,
|
|
|
350
351
|
eventing_upsert_function_response response{ std::move(ctx) };
|
|
351
352
|
if (!response.ctx.ec) {
|
|
352
353
|
if (encoded.body.data().empty()) {
|
|
354
|
+
if (encoded.status_code == 400) {
|
|
355
|
+
response.ctx.ec = errc::common::invalid_argument;
|
|
356
|
+
}
|
|
353
357
|
return response;
|
|
354
358
|
}
|
|
355
359
|
tao::json::value payload{};
|
|
@@ -359,10 +363,12 @@ eventing_upsert_function_request::make_response(error_context::http&& ctx,
|
|
|
359
363
|
response.ctx.ec = errc::common::parsing_failure;
|
|
360
364
|
return response;
|
|
361
365
|
}
|
|
362
|
-
auto [ec, problem] = extract_eventing_error_code(payload);
|
|
366
|
+
auto [ec, problem] = extract_eventing_error_code(payload, encoded.status_code);
|
|
363
367
|
if (ec) {
|
|
364
368
|
response.ctx.ec = ec;
|
|
365
|
-
|
|
369
|
+
if (!problem.name.empty()) {
|
|
370
|
+
response.error.emplace(problem);
|
|
371
|
+
}
|
|
366
372
|
return response;
|
|
367
373
|
}
|
|
368
374
|
}
|
|
@@ -17,6 +17,7 @@
|
|
|
17
17
|
|
|
18
18
|
#include "group_drop.hxx"
|
|
19
19
|
|
|
20
|
+
#include "core/utils/url_codec.hxx"
|
|
20
21
|
#include "error_utils.hxx"
|
|
21
22
|
|
|
22
23
|
#include <spdlog/fmt/bundled/core.h>
|
|
@@ -28,7 +29,8 @@ group_drop_request::encode_to(encoded_request_type& encoded,
|
|
|
28
29
|
http_context& /* context */) const -> std::error_code
|
|
29
30
|
{
|
|
30
31
|
encoded.method = "DELETE";
|
|
31
|
-
encoded.path =
|
|
32
|
+
encoded.path =
|
|
33
|
+
fmt::format("/settings/rbac/groups/{}", utils::string_codec::v2::path_escape(name));
|
|
32
34
|
return {};
|
|
33
35
|
}
|
|
34
36
|
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
|
|
20
20
|
#include "core/management/rbac_json.hxx"
|
|
21
21
|
#include "core/utils/json.hxx"
|
|
22
|
+
#include "core/utils/url_codec.hxx"
|
|
22
23
|
#include "error_utils.hxx"
|
|
23
24
|
|
|
24
25
|
#include <spdlog/fmt/bundled/core.h>
|
|
@@ -31,7 +32,8 @@ group_get_request::encode_to(encoded_request_type& encoded,
|
|
|
31
32
|
http_context& /* context */) const -> std::error_code
|
|
32
33
|
{
|
|
33
34
|
encoded.method = "GET";
|
|
34
|
-
encoded.path =
|
|
35
|
+
encoded.path =
|
|
36
|
+
fmt::format("/settings/rbac/groups/{}", utils::string_codec::v2::path_escape(name));
|
|
35
37
|
encoded.headers["content-type"] = "application/x-www-form-urlencoded";
|
|
36
38
|
return {};
|
|
37
39
|
}
|
|
@@ -31,35 +31,38 @@ group_upsert_request::encode_to(encoded_request_type& encoded,
|
|
|
31
31
|
http_context& /* context */) const -> std::error_code
|
|
32
32
|
{
|
|
33
33
|
encoded.method = "PUT";
|
|
34
|
-
encoded.path =
|
|
34
|
+
encoded.path =
|
|
35
|
+
fmt::format("/settings/rbac/groups/{}", utils::string_codec::v2::path_escape(group.name));
|
|
35
36
|
std::vector<std::string> params{};
|
|
36
37
|
if (group.description) {
|
|
37
38
|
params.push_back(
|
|
38
|
-
fmt::format("description={}", utils::string_codec::
|
|
39
|
+
fmt::format("description={}", utils::string_codec::form_encode(group.description.value())));
|
|
39
40
|
}
|
|
40
41
|
if (group.ldap_group_reference) {
|
|
41
42
|
params.push_back(fmt::format(
|
|
42
|
-
"ldap_group_ref={}", utils::string_codec::
|
|
43
|
+
"ldap_group_ref={}", utils::string_codec::form_encode(group.ldap_group_reference.value())));
|
|
43
44
|
}
|
|
45
|
+
// Names go into the spec unescaped: the server does not percent-decode role parameters after
|
|
46
|
+
// form-decoding the body, so the spec is form-encoded exactly once, as a whole.
|
|
44
47
|
std::vector<std::string> encoded_roles{};
|
|
45
48
|
encoded_roles.reserve(group.roles.size());
|
|
46
49
|
for (const auto& role : group.roles) {
|
|
47
50
|
std::string spec = role.name;
|
|
48
51
|
if (role.bucket) {
|
|
49
|
-
spec += fmt::format("[{}",
|
|
52
|
+
spec += fmt::format("[{}", role.bucket.value());
|
|
50
53
|
if (role.scope) {
|
|
51
|
-
spec += fmt::format(":{}",
|
|
54
|
+
spec += fmt::format(":{}", role.scope.value());
|
|
52
55
|
if (role.collection) {
|
|
53
|
-
spec += fmt::format(":{}",
|
|
56
|
+
spec += fmt::format(":{}", role.collection.value());
|
|
54
57
|
}
|
|
55
58
|
}
|
|
56
|
-
spec +=
|
|
59
|
+
spec += ']';
|
|
57
60
|
}
|
|
58
61
|
encoded_roles.push_back(spec);
|
|
59
62
|
}
|
|
60
63
|
if (!encoded_roles.empty()) {
|
|
61
64
|
const std::string concatenated = fmt::format("{}", utils::join_strings(encoded_roles, ","));
|
|
62
|
-
params.push_back(fmt::format("roles={}", utils::string_codec::
|
|
65
|
+
params.push_back(fmt::format("roles={}", utils::string_codec::form_encode(concatenated)));
|
|
63
66
|
}
|
|
64
67
|
encoded.body = utils::join_strings(params, "&");
|
|
65
68
|
encoded.headers["content-type"] = "application/x-www-form-urlencoded";
|
|
@@ -81,14 +81,17 @@ query_index_build_request::make_response(error_context::http&& ctx,
|
|
|
81
81
|
return response;
|
|
82
82
|
}
|
|
83
83
|
response.status = payload.at("status").get_string();
|
|
84
|
-
|
|
84
|
+
// RFC-58: a 400 is a failure whatever status the body reports.
|
|
85
|
+
if (response.status != "success" || encoded.status_code == 400) {
|
|
85
86
|
std::optional<std::error_code> common_ec{};
|
|
86
87
|
for (const auto& entry : payload.at("errors").get_array()) {
|
|
87
88
|
query_index_build_response::query_problem error;
|
|
88
89
|
error.code = entry.at("code").get_unsigned();
|
|
89
90
|
error.message = entry.at("msg").get_string();
|
|
90
91
|
response.errors.emplace_back(error);
|
|
91
|
-
|
|
92
|
+
if (!common_ec) {
|
|
93
|
+
common_ec = management::extract_common_query_error_code(error.code, error.message);
|
|
94
|
+
}
|
|
92
95
|
}
|
|
93
96
|
|
|
94
97
|
response.ctx.ec =
|
|
@@ -104,7 +104,8 @@ query_index_create_request::make_response(error_context::http&& ctx,
|
|
|
104
104
|
}
|
|
105
105
|
response.status = payload.at("status").get_string();
|
|
106
106
|
|
|
107
|
-
|
|
107
|
+
// RFC-58: a 400 is a failure whatever status the body reports.
|
|
108
|
+
if (response.status != "success" || encoded.status_code == 400) {
|
|
108
109
|
bool index_already_exists = false;
|
|
109
110
|
bool bucket_not_found = false;
|
|
110
111
|
bool collection_not_found = false;
|
|
@@ -125,6 +126,9 @@ query_index_create_request::make_response(error_context::http&& ctx,
|
|
|
125
126
|
if (error.message.find("Bucket Not Found") != std::string::npos) {
|
|
126
127
|
bucket_not_found = true;
|
|
127
128
|
}
|
|
129
|
+
if (!common_ec) {
|
|
130
|
+
common_ec = management::extract_common_query_error_code(error.code, error.message);
|
|
131
|
+
}
|
|
128
132
|
} break;
|
|
129
133
|
|
|
130
134
|
case 12003: /* IKey: "datastore.couchbase.keyspace_not_found" */
|
|
@@ -149,7 +153,9 @@ query_index_create_request::make_response(error_context::http&& ctx,
|
|
|
149
153
|
break;
|
|
150
154
|
|
|
151
155
|
default:
|
|
152
|
-
|
|
156
|
+
if (!common_ec) {
|
|
157
|
+
common_ec = management::extract_common_query_error_code(error.code, error.message);
|
|
158
|
+
}
|
|
153
159
|
break;
|
|
154
160
|
}
|
|
155
161
|
response.errors.emplace_back(error);
|
|
@@ -168,7 +174,7 @@ query_index_create_request::make_response(error_context::http&& ctx,
|
|
|
168
174
|
response.ctx.ec = errc::common::authentication_failure;
|
|
169
175
|
} else if (common_ec) {
|
|
170
176
|
response.ctx.ec = common_ec.value();
|
|
171
|
-
} else
|
|
177
|
+
} else {
|
|
172
178
|
response.ctx.ec = extract_common_error_code(encoded.status_code, encoded.body.data());
|
|
173
179
|
}
|
|
174
180
|
}
|
|
@@ -73,7 +73,8 @@ query_index_drop_request::make_response(error_context::http&& ctx,
|
|
|
73
73
|
}
|
|
74
74
|
response.status = payload.at("status").get_string();
|
|
75
75
|
|
|
76
|
-
|
|
76
|
+
// RFC-58: a 400 is a failure whatever status the body reports.
|
|
77
|
+
if (response.status != "success" || encoded.status_code == 400) {
|
|
77
78
|
bool bucket_not_found = false;
|
|
78
79
|
bool index_not_found = false;
|
|
79
80
|
bool collection_not_found = false;
|
|
@@ -88,9 +89,13 @@ query_index_drop_request::make_response(error_context::http&& ctx,
|
|
|
88
89
|
case 5000: /* IKey: "Internal Error" */
|
|
89
90
|
{
|
|
90
91
|
if (utils::contains_string(error.message, "index", true) &&
|
|
91
|
-
utils::contains_string(error.message, "not found", true)
|
|
92
|
+
(utils::contains_string(error.message, "not found", true) ||
|
|
93
|
+
utils::contains_string(error.message, "does not exist", true))) {
|
|
92
94
|
index_not_found = true;
|
|
93
95
|
}
|
|
96
|
+
if (!common_ec) {
|
|
97
|
+
common_ec = management::extract_common_query_error_code(error.code, error.message);
|
|
98
|
+
}
|
|
94
99
|
} break;
|
|
95
100
|
|
|
96
101
|
case 12003: /* IKey: "datastore.couchbase.keyspace_not_found" */
|
|
@@ -117,7 +122,9 @@ query_index_drop_request::make_response(error_context::http&& ctx,
|
|
|
117
122
|
break;
|
|
118
123
|
|
|
119
124
|
default:
|
|
120
|
-
|
|
125
|
+
if (!common_ec) {
|
|
126
|
+
common_ec = management::extract_common_query_error_code(error.code, error.message);
|
|
127
|
+
}
|
|
121
128
|
break;
|
|
122
129
|
}
|
|
123
130
|
response.errors.emplace_back(error);
|
|
@@ -136,7 +143,7 @@ query_index_drop_request::make_response(error_context::http&& ctx,
|
|
|
136
143
|
response.ctx.ec = errc::common::authentication_failure;
|
|
137
144
|
} else if (common_ec) {
|
|
138
145
|
response.ctx.ec = common_ec.value();
|
|
139
|
-
} else
|
|
146
|
+
} else {
|
|
140
147
|
response.ctx.ec = extract_common_error_code(encoded.status_code, encoded.body.data());
|
|
141
148
|
}
|
|
142
149
|
}
|
|
@@ -80,7 +80,7 @@ query_index_get_all_request::make_response(couchbase::core::error_context::http&
|
|
|
80
80
|
query_index_get_all_response response{ std::move(ctx) };
|
|
81
81
|
if (!response.ctx.ec) {
|
|
82
82
|
if (encoded.status_code != 200) {
|
|
83
|
-
response.ctx.ec =
|
|
83
|
+
response.ctx.ec = extract_query_error_code(encoded.status_code, encoded.body.data());
|
|
84
84
|
return response;
|
|
85
85
|
}
|
|
86
86
|
tao::json::value payload{};
|