libcouchbase 0.0.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 +7 -0
- data/.gitignore +18 -0
- data/.gitmodules +3 -0
- data/.rspec +1 -0
- data/.travis.yml +35 -0
- data/Gemfile +4 -0
- data/LICENSE +24 -0
- data/README.md +389 -0
- data/Rakefile +75 -0
- data/ext/README.md +6 -0
- data/ext/Rakefile +20 -0
- data/ext/libcouchbase/.gitignore +130 -0
- data/ext/libcouchbase/.travis.yml +19 -0
- data/ext/libcouchbase/CMakeLists.txt +429 -0
- data/ext/libcouchbase/CONTRIBUTING.md +124 -0
- data/ext/libcouchbase/LICENSE +202 -0
- data/ext/libcouchbase/README.markdown +163 -0
- data/ext/libcouchbase/RELEASE_NOTES.markdown +2691 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +27 -0
- data/ext/libcouchbase/cmake/Modules/CopyPDB.cmake +42 -0
- data/ext/libcouchbase/cmake/Modules/DistScript.cmake +17 -0
- data/ext/libcouchbase/cmake/Modules/DownloadLcbDep.cmake +20 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseHdrHistogram.cmake +15 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibev.cmake +73 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibevent.cmake +52 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseLibuv.cmake +56 -0
- data/ext/libcouchbase/cmake/Modules/FindCouchbaseSnappy.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +29 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +133 -0
- data/ext/libcouchbase/cmake/Modules/GetPlatformCCInfo.cmake +45 -0
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +70 -0
- data/ext/libcouchbase/cmake/config-cmake.h.in +60 -0
- data/ext/libcouchbase/cmake/configure +357 -0
- data/ext/libcouchbase/cmake/defs.mk.in +8 -0
- data/ext/libcouchbase/cmake/dtrace-instr-link.pl +38 -0
- data/ext/libcouchbase/cmake/source_files.cmake +73 -0
- data/ext/libcouchbase/configure.pl +1 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.c +624 -0
- data/ext/libcouchbase/contrib/cJSON/cJSON.h +158 -0
- data/ext/libcouchbase/contrib/cbsasl/CMakeLists.txt +9 -0
- data/ext/libcouchbase/contrib/cbsasl/COPYING +202 -0
- data/ext/libcouchbase/contrib/cbsasl/include/cbsasl/cbsasl.h +217 -0
- data/ext/libcouchbase/contrib/cbsasl/src/client.c +205 -0
- data/ext/libcouchbase/contrib/cbsasl/src/common.c +46 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.c +67 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/hmac.h +33 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.c +296 -0
- data/ext/libcouchbase/contrib/cbsasl/src/cram-md5/md5.h +45 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.c +573 -0
- data/ext/libcouchbase/contrib/cbsasl/src/hash.h +15 -0
- data/ext/libcouchbase/contrib/cbsasl/src/util.h +31 -0
- data/ext/libcouchbase/contrib/cliopts/CMakeLists.txt +2 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.c +747 -0
- data/ext/libcouchbase/contrib/cliopts/cliopts.h +493 -0
- data/ext/libcouchbase/contrib/genhash/genhash.c +372 -0
- data/ext/libcouchbase/contrib/genhash/genhash.h +235 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CHANGES +157 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CMakeLists.txt +252 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/CONTRIBUTORS +37 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/LICENSE +28 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/MINIFY.sh +15 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/README +435 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/cmake/internal_utils.cmake +227 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-death-test.h +294 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-message.h +250 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h +1421 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-param-test.h.pump +487 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-printers.h +855 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-spi.h +232 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-test-part.h +179 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest-typed-test.h +259 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest.h +2291 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_pred_impl.h +358 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/gtest_prod.h +58 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-death-test-internal.h +319 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-filepath.h +206 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-internal.h +1158 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-linked_ptr.h +233 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h +5143 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util-generated.h.pump +301 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-param-util.h +619 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-port.h +1947 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-string.h +167 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h +1012 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-tuple.h.pump +339 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h +3331 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/include/gtest/internal/gtest-type-util.h.pump +297 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-all.cc +48 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-death-test.cc +1344 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-filepath.cc +382 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-internal-inl.h +1218 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-port.cc +805 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-printers.cc +363 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-test-part.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest-typed-test.cc +110 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest.cc +5015 -0
- data/ext/libcouchbase/contrib/gtest-1.7.0/src/gtest_main.cc +38 -0
- data/ext/libcouchbase/contrib/http_parser/LICENSE-MIT +23 -0
- data/ext/libcouchbase/contrib/http_parser/README.md +178 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.c +2060 -0
- data/ext/libcouchbase/contrib/http_parser/http_parser.h +321 -0
- data/ext/libcouchbase/contrib/jsonsl/LICENSE +20 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.c +1452 -0
- data/ext/libcouchbase/contrib/jsonsl/jsonsl.h +971 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/CMakeLists.txt +6 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/LICENSE +55 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp-forwards.h +255 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.cpp +4892 -0
- data/ext/libcouchbase/contrib/lcb-jsoncpp/lcb-jsoncpp.h +1961 -0
- data/ext/libcouchbase/contrib/snappy/CMakeLists.txt +8 -0
- data/ext/libcouchbase/contrib/snappy/COPYING +28 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.cc +90 -0
- data/ext/libcouchbase/contrib/snappy/snappy-c.h +138 -0
- data/ext/libcouchbase/contrib/snappy/snappy-internal.h +150 -0
- data/ext/libcouchbase/contrib/snappy/snappy-lcb-msvc.h +5 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.cc +71 -0
- data/ext/libcouchbase/contrib/snappy/snappy-sinksource.h +137 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.cc +42 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-internal.h +491 -0
- data/ext/libcouchbase/contrib/snappy/snappy-stubs-public.h +98 -0
- data/ext/libcouchbase/contrib/snappy/snappy.cc +1307 -0
- data/ext/libcouchbase/contrib/snappy/snappy.h +184 -0
- data/ext/libcouchbase/contrib/win32-defs/iocpdefs.h +133 -0
- data/ext/libcouchbase/contrib/win32-defs/mingwdefs.h +4396 -0
- data/ext/libcouchbase/contrib/win32-defs/win_stdint.h +258 -0
- data/ext/libcouchbase/example/CMakeLists.txt +37 -0
- data/ext/libcouchbase/example/README.markdown +47 -0
- data/ext/libcouchbase/example/db/db.c +167 -0
- data/ext/libcouchbase/example/db/vb.c +227 -0
- data/ext/libcouchbase/example/instancepool/main.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.cc +102 -0
- data/ext/libcouchbase/example/instancepool/pool.h +69 -0
- data/ext/libcouchbase/example/libeventdirect/main.c +148 -0
- data/ext/libcouchbase/example/mcc/mcc.cc +246 -0
- data/ext/libcouchbase/example/minimal/minimal.c +130 -0
- data/ext/libcouchbase/example/observe/observe.c +146 -0
- data/ext/libcouchbase/example/subdoc/subdoc-multi.cc +132 -0
- data/ext/libcouchbase/example/subdoc/subdoc-simple.cc +191 -0
- data/ext/libcouchbase/example/tick/tick.c +119 -0
- data/ext/libcouchbase/example/views/views-example.cc +83 -0
- data/ext/libcouchbase/include/libcouchbase/_cxxwrap.h +150 -0
- data/ext/libcouchbase/include/libcouchbase/api-legacy.h +1689 -0
- data/ext/libcouchbase/include/libcouchbase/api3.h +2 -0
- data/ext/libcouchbase/include/libcouchbase/assert.h +44 -0
- data/ext/libcouchbase/include/libcouchbase/cbft.h +109 -0
- data/ext/libcouchbase/include/libcouchbase/cntl-private.h +356 -0
- data/ext/libcouchbase/include/libcouchbase/cntl.h +937 -0
- data/ext/libcouchbase/include/libcouchbase/configuration.h.in +23 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +3677 -0
- data/ext/libcouchbase/include/libcouchbase/deprecated.h +300 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +595 -0
- data/ext/libcouchbase/include/libcouchbase/http.h +1 -0
- data/ext/libcouchbase/include/libcouchbase/iops.h +1050 -0
- data/ext/libcouchbase/include/libcouchbase/ixmgmt.h +263 -0
- data/ext/libcouchbase/include/libcouchbase/kvbuf.h +132 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +364 -0
- data/ext/libcouchbase/include/libcouchbase/pktfwd.h +270 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +367 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr-inl.c +76 -0
- data/ext/libcouchbase/include/libcouchbase/plugins/io/wsaerr.h +199 -0
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +312 -0
- data/ext/libcouchbase/include/libcouchbase/sysdefs.h +98 -0
- data/ext/libcouchbase/include/libcouchbase/vbucket.h +643 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +298 -0
- data/ext/libcouchbase/include/libcouchbase/visibility.h +65 -0
- data/ext/libcouchbase/include/memcached/COPYING +30 -0
- data/ext/libcouchbase/include/memcached/README +10 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +1916 -0
- data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
- data/ext/libcouchbase/packaging/README +7 -0
- data/ext/libcouchbase/packaging/abicheck/.gitignore +4 -0
- data/ext/libcouchbase/packaging/abicheck/Makefile +17 -0
- data/ext/libcouchbase/packaging/abicheck/README.md +27 -0
- data/ext/libcouchbase/packaging/abicheck/template.xml +3 -0
- data/ext/libcouchbase/packaging/deb/compat +1 -0
- data/ext/libcouchbase/packaging/deb/control +73 -0
- data/ext/libcouchbase/packaging/deb/copyright +10 -0
- data/ext/libcouchbase/packaging/deb/libcouchbase-dev.docs +3 -0
- data/ext/libcouchbase/packaging/deb/package.mk +31 -0
- data/ext/libcouchbase/packaging/deb/rules +46 -0
- data/ext/libcouchbase/packaging/deb/source/format +1 -0
- data/ext/libcouchbase/packaging/distinfo/README +1 -0
- data/ext/libcouchbase/packaging/distinfo/distinfo.cmake.in +4 -0
- data/ext/libcouchbase/packaging/dllversion.rc.in +39 -0
- data/ext/libcouchbase/packaging/libcouchbase.pc.in +10 -0
- data/ext/libcouchbase/packaging/nuget/libcouchbase.autopkg +76 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +166 -0
- data/ext/libcouchbase/packaging/rpm/libcouchbase.spec.in +108 -0
- data/ext/libcouchbase/packaging/rpm/package.mk +40 -0
- data/ext/libcouchbase/plugins/io/iocp/CMakeLists.txt +9 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.c +466 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_iops.h +217 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_loop.c +295 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_timer.c +79 -0
- data/ext/libcouchbase/plugins/io/iocp/iocp_util.c +229 -0
- data/ext/libcouchbase/plugins/io/libev/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +65 -0
- data/ext/libcouchbase/plugins/io/libev/plugin-libev.c +289 -0
- data/ext/libcouchbase/plugins/io/libevent/CMakeLists.txt +29 -0
- data/ext/libcouchbase/plugins/io/libevent/libevent_io_opts.h +67 -0
- data/ext/libcouchbase/plugins/io/libevent/plugin-libevent.c +292 -0
- data/ext/libcouchbase/plugins/io/libuv/CMakeLists.txt +42 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_compat.h +212 -0
- data/ext/libcouchbase/plugins/io/libuv/libuv_io_opts.h +118 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-internal.h +148 -0
- data/ext/libcouchbase/plugins/io/libuv/plugin-libuv.c +648 -0
- data/ext/libcouchbase/plugins/io/select/CMakeLists.txt +11 -0
- data/ext/libcouchbase/plugins/io/select/plugin-select.c +448 -0
- data/ext/libcouchbase/plugins/io/select/select_io_opts.h +39 -0
- data/ext/libcouchbase/src/README.md +103 -0
- data/ext/libcouchbase/src/aspend.h +106 -0
- data/ext/libcouchbase/src/auth.cc +74 -0
- data/ext/libcouchbase/src/auth.h +54 -0
- data/ext/libcouchbase/src/bootstrap.c +269 -0
- data/ext/libcouchbase/src/bootstrap.h +129 -0
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +495 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +82 -0
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +681 -0
- data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
- data/ext/libcouchbase/src/callbacks.c +378 -0
- data/ext/libcouchbase/src/cbft.cc +210 -0
- data/ext/libcouchbase/src/cntl.cc +847 -0
- data/ext/libcouchbase/src/config_static.h +159 -0
- data/ext/libcouchbase/src/connspec.cc +462 -0
- data/ext/libcouchbase/src/connspec.h +105 -0
- data/ext/libcouchbase/src/ctx-log-inl.h +27 -0
- data/ext/libcouchbase/src/dump.c +98 -0
- data/ext/libcouchbase/src/getconfig.c +100 -0
- data/ext/libcouchbase/src/gethrtime.c +109 -0
- data/ext/libcouchbase/src/handler.c +922 -0
- data/ext/libcouchbase/src/hashset.c +164 -0
- data/ext/libcouchbase/src/hashset.h +86 -0
- data/ext/libcouchbase/src/hashtable.c +75 -0
- data/ext/libcouchbase/src/hdr_timings.c +92 -0
- data/ext/libcouchbase/src/hostlist.cc +301 -0
- data/ext/libcouchbase/src/hostlist.h +171 -0
- data/ext/libcouchbase/src/http/http-priv.h +307 -0
- data/ext/libcouchbase/src/http/http.cc +633 -0
- data/ext/libcouchbase/src/http/http.h +34 -0
- data/ext/libcouchbase/src/http/http_io.cc +307 -0
- data/ext/libcouchbase/src/instance.cc +722 -0
- data/ext/libcouchbase/src/internal.h +244 -0
- data/ext/libcouchbase/src/iofactory.c +575 -0
- data/ext/libcouchbase/src/jsparse/parser.cc +519 -0
- data/ext/libcouchbase/src/jsparse/parser.h +173 -0
- data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +199 -0
- data/ext/libcouchbase/src/lcbio/connect.c +557 -0
- data/ext/libcouchbase/src/lcbio/connect.h +364 -0
- data/ext/libcouchbase/src/lcbio/ctx.c +611 -0
- data/ext/libcouchbase/src/lcbio/ctx.h +405 -0
- data/ext/libcouchbase/src/lcbio/iotable.c +290 -0
- data/ext/libcouchbase/src/lcbio/iotable.h +84 -0
- data/ext/libcouchbase/src/lcbio/ioutils.c +350 -0
- data/ext/libcouchbase/src/lcbio/ioutils.h +203 -0
- data/ext/libcouchbase/src/lcbio/lcbio.h +51 -0
- data/ext/libcouchbase/src/lcbio/manager.c +584 -0
- data/ext/libcouchbase/src/lcbio/manager.h +156 -0
- data/ext/libcouchbase/src/lcbio/protoctx.c +84 -0
- data/ext/libcouchbase/src/lcbio/rw-inl.h +115 -0
- data/ext/libcouchbase/src/lcbio/ssl.h +149 -0
- data/ext/libcouchbase/src/lcbio/timer-ng.h +179 -0
- data/ext/libcouchbase/src/lcbio/timer.c +132 -0
- data/ext/libcouchbase/src/legacy.c +430 -0
- data/ext/libcouchbase/src/list.c +144 -0
- data/ext/libcouchbase/src/list.h +127 -0
- data/ext/libcouchbase/src/logging.c +244 -0
- data/ext/libcouchbase/src/logging.h +86 -0
- data/ext/libcouchbase/src/mc/compress.c +90 -0
- data/ext/libcouchbase/src/mc/compress.h +61 -0
- data/ext/libcouchbase/src/mc/forward.c +186 -0
- data/ext/libcouchbase/src/mc/forward.h +90 -0
- data/ext/libcouchbase/src/mc/iovcursor-inl.h +279 -0
- data/ext/libcouchbase/src/mc/iovcursor.h +66 -0
- data/ext/libcouchbase/src/mc/mcreq-flush-inl.h +111 -0
- data/ext/libcouchbase/src/mc/mcreq.c +954 -0
- data/ext/libcouchbase/src/mc/mcreq.h +977 -0
- data/ext/libcouchbase/src/mcserver/mcserver.c +784 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +121 -0
- data/ext/libcouchbase/src/mcserver/negotiate.c +656 -0
- data/ext/libcouchbase/src/mcserver/negotiate.h +119 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +860 -0
- data/ext/libcouchbase/src/n1ql/n1ql-internal.h +22 -0
- data/ext/libcouchbase/src/n1ql/n1ql.cc +729 -0
- data/ext/libcouchbase/src/n1ql/params.cc +215 -0
- data/ext/libcouchbase/src/netbuf/netbuf-defs.h +89 -0
- data/ext/libcouchbase/src/netbuf/netbuf-mblock.h +235 -0
- data/ext/libcouchbase/src/netbuf/netbuf.c +929 -0
- data/ext/libcouchbase/src/netbuf/netbuf.h +452 -0
- data/ext/libcouchbase/src/newconfig.c +385 -0
- data/ext/libcouchbase/src/nodeinfo.cc +194 -0
- data/ext/libcouchbase/src/operations/cbflush.c +71 -0
- data/ext/libcouchbase/src/operations/counter.c +116 -0
- data/ext/libcouchbase/src/operations/durability-cas.c +224 -0
- data/ext/libcouchbase/src/operations/durability-seqno.c +157 -0
- data/ext/libcouchbase/src/operations/durability.c +668 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +199 -0
- data/ext/libcouchbase/src/operations/get.c +409 -0
- data/ext/libcouchbase/src/operations/observe-seqno.c +96 -0
- data/ext/libcouchbase/src/operations/observe.c +340 -0
- data/ext/libcouchbase/src/operations/pktfwd.c +86 -0
- data/ext/libcouchbase/src/operations/remove.c +83 -0
- data/ext/libcouchbase/src/operations/stats.c +461 -0
- data/ext/libcouchbase/src/operations/store.c +360 -0
- data/ext/libcouchbase/src/operations/subdoc.cc +510 -0
- data/ext/libcouchbase/src/operations/touch.c +81 -0
- data/ext/libcouchbase/src/packetutils.c +60 -0
- data/ext/libcouchbase/src/packetutils.h +147 -0
- data/ext/libcouchbase/src/probes.d +211 -0
- data/ext/libcouchbase/src/rdb/bigalloc.c +225 -0
- data/ext/libcouchbase/src/rdb/bigalloc.h +73 -0
- data/ext/libcouchbase/src/rdb/chunkalloc.c +174 -0
- data/ext/libcouchbase/src/rdb/libcalloc.c +94 -0
- data/ext/libcouchbase/src/rdb/rope.c +419 -0
- data/ext/libcouchbase/src/rdb/rope.h +488 -0
- data/ext/libcouchbase/src/retrychk.c +113 -0
- data/ext/libcouchbase/src/retryq.c +424 -0
- data/ext/libcouchbase/src/retryq.h +157 -0
- data/ext/libcouchbase/src/ringbuffer.c +442 -0
- data/ext/libcouchbase/src/ringbuffer.h +100 -0
- data/ext/libcouchbase/src/settings.c +95 -0
- data/ext/libcouchbase/src/settings.h +188 -0
- data/ext/libcouchbase/src/simplestring.c +211 -0
- data/ext/libcouchbase/src/simplestring.h +228 -0
- data/ext/libcouchbase/src/sllist-inl.h +197 -0
- data/ext/libcouchbase/src/sllist.h +76 -0
- data/ext/libcouchbase/src/ssl/CMakeLists.txt +23 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +415 -0
- data/ext/libcouchbase/src/ssl/ssl_common.c +454 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +408 -0
- data/ext/libcouchbase/src/ssl/ssl_iot_common.h +180 -0
- data/ext/libcouchbase/src/ssobuf.h +82 -0
- data/ext/libcouchbase/src/strcodecs/base64.c +123 -0
- data/ext/libcouchbase/src/strcodecs/strcodecs.h +285 -0
- data/ext/libcouchbase/src/timings.c +208 -0
- data/ext/libcouchbase/src/trace.h +105 -0
- data/ext/libcouchbase/src/utilities.c +171 -0
- data/ext/libcouchbase/src/vbucket/CMakeLists.txt +2 -0
- data/ext/libcouchbase/src/vbucket/aliases.h +35 -0
- data/ext/libcouchbase/src/vbucket/crc32.h +83 -0
- data/ext/libcouchbase/src/vbucket/hash.h +30 -0
- data/ext/libcouchbase/src/vbucket/json-inl.h +112 -0
- data/ext/libcouchbase/src/vbucket/ketama.c +66 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/global.h +32 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5.h +35 -0
- data/ext/libcouchbase/src/vbucket/rfc1321/md5c-inl.h +335 -0
- data/ext/libcouchbase/src/vbucket/vbucket.c +1543 -0
- data/ext/libcouchbase/src/views/docreq.c +194 -0
- data/ext/libcouchbase/src/views/docreq.h +83 -0
- data/ext/libcouchbase/src/views/viewreq.c +358 -0
- data/ext/libcouchbase/src/views/viewreq.h +36 -0
- data/ext/libcouchbase/src/wait.c +161 -0
- data/ext/libcouchbase/tests/CMakeLists.txt +140 -0
- data/ext/libcouchbase/tests/basic/t_base64.cc +81 -0
- data/ext/libcouchbase/tests/basic/t_ccbc103.cc +95 -0
- data/ext/libcouchbase/tests/basic/t_connstr.cc +404 -0
- data/ext/libcouchbase/tests/basic/t_creds.cc +32 -0
- data/ext/libcouchbase/tests/basic/t_ctlcodes.cc +92 -0
- data/ext/libcouchbase/tests/basic/t_hashset.cc +262 -0
- data/ext/libcouchbase/tests/basic/t_host.cc +198 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +137 -0
- data/ext/libcouchbase/tests/basic/t_jsparse.h +589 -0
- data/ext/libcouchbase/tests/basic/t_list.cc +155 -0
- data/ext/libcouchbase/tests/basic/t_logger.cc +65 -0
- data/ext/libcouchbase/tests/basic/t_misc.cc +24 -0
- data/ext/libcouchbase/tests/basic/t_n1qlstrings.cc +18 -0
- data/ext/libcouchbase/tests/basic/t_netbuf.cc +446 -0
- data/ext/libcouchbase/tests/basic/t_packet.cc +222 -0
- data/ext/libcouchbase/tests/basic/t_ringbuffer.cc +278 -0
- data/ext/libcouchbase/tests/basic/t_slist.cc +429 -0
- data/ext/libcouchbase/tests/basic/t_strerror.cc +64 -0
- data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
- data/ext/libcouchbase/tests/basic/t_urlencode.cc +132 -0
- data/ext/libcouchbase/tests/check-all.cc +608 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +193 -0
- data/ext/libcouchbase/tests/ioserver/connection.cc +166 -0
- data/ext/libcouchbase/tests/ioserver/future.cc +50 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.cc +104 -0
- data/ext/libcouchbase/tests/ioserver/ioserver.h +478 -0
- data/ext/libcouchbase/tests/ioserver/socket.cc +88 -0
- data/ext/libcouchbase/tests/ioserver/ssl_connection.cc +145 -0
- data/ext/libcouchbase/tests/ioserver/threads-pthreads.cc +119 -0
- data/ext/libcouchbase/tests/ioserver/threads-win32.cc +117 -0
- data/ext/libcouchbase/tests/ioserver/threads.h +66 -0
- data/ext/libcouchbase/tests/iotests/iotests.h +15 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.cc +524 -0
- data/ext/libcouchbase/tests/iotests/mock-environment.h +385 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.cc +67 -0
- data/ext/libcouchbase/tests/iotests/mock-unit-test.h +61 -0
- data/ext/libcouchbase/tests/iotests/serverparams.h +76 -0
- data/ext/libcouchbase/tests/iotests/t_arithmetic.cc +143 -0
- data/ext/libcouchbase/tests/iotests/t_behavior.cc +226 -0
- data/ext/libcouchbase/tests/iotests/t_configcache.cc +117 -0
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +241 -0
- data/ext/libcouchbase/tests/iotests/t_durability.cc +1059 -0
- data/ext/libcouchbase/tests/iotests/t_forward.cc +110 -0
- data/ext/libcouchbase/tests/iotests/t_get.cc +512 -0
- data/ext/libcouchbase/tests/iotests/t_http.cc +438 -0
- data/ext/libcouchbase/tests/iotests/t_iops.cc +175 -0
- data/ext/libcouchbase/tests/iotests/t_lock.cc +275 -0
- data/ext/libcouchbase/tests/iotests/t_misc.cc +713 -0
- data/ext/libcouchbase/tests/iotests/t_mutate.cc +609 -0
- data/ext/libcouchbase/tests/iotests/t_n1ql.cc +270 -0
- data/ext/libcouchbase/tests/iotests/t_netfail.cc +654 -0
- data/ext/libcouchbase/tests/iotests/t_obseqno.cc +157 -0
- data/ext/libcouchbase/tests/iotests/t_regression.cc +321 -0
- data/ext/libcouchbase/tests/iotests/t_sched.cc +88 -0
- data/ext/libcouchbase/tests/iotests/t_serverops.cc +230 -0
- data/ext/libcouchbase/tests/iotests/t_smoke.cc +528 -0
- data/ext/libcouchbase/tests/iotests/t_subdoc.cc +822 -0
- data/ext/libcouchbase/tests/iotests/t_syncmode.cc +64 -0
- data/ext/libcouchbase/tests/iotests/t_views.cc +405 -0
- data/ext/libcouchbase/tests/iotests/testutil.cc +250 -0
- data/ext/libcouchbase/tests/iotests/testutil.h +163 -0
- data/ext/libcouchbase/tests/mc/mctest.h +119 -0
- data/ext/libcouchbase/tests/mc/pktmaker.h +101 -0
- data/ext/libcouchbase/tests/mc/t_alloc.cc +269 -0
- data/ext/libcouchbase/tests/mc/t_context.cc +100 -0
- data/ext/libcouchbase/tests/mc/t_flush.cc +185 -0
- data/ext/libcouchbase/tests/mc/t_forward.cc +239 -0
- data/ext/libcouchbase/tests/mc/t_ioflush.cc +102 -0
- data/ext/libcouchbase/tests/mc/t_iovcursor.cc +173 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.c +305 -0
- data/ext/libcouchbase/tests/mocksupport/procutil.h +89 -0
- data/ext/libcouchbase/tests/mocksupport/server.c +391 -0
- data/ext/libcouchbase/tests/mocksupport/server.h +72 -0
- data/ext/libcouchbase/tests/mocksupport/timeout.c +69 -0
- data/ext/libcouchbase/tests/nonio_tests.cc +23 -0
- data/ext/libcouchbase/tests/rdb/rdbtest.h +133 -0
- data/ext/libcouchbase/tests/rdb/t_basic.cc +128 -0
- data/ext/libcouchbase/tests/rdb/t_bigalloc.cc +93 -0
- data/ext/libcouchbase/tests/rdb/t_refs.cc +112 -0
- data/ext/libcouchbase/tests/socktests/socktest.cc +347 -0
- data/ext/libcouchbase/tests/socktests/socktest.h +448 -0
- data/ext/libcouchbase/tests/socktests/t_basic.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ctx.cc +73 -0
- data/ext/libcouchbase/tests/socktests/t_manager.cc +179 -0
- data/ext/libcouchbase/tests/socktests/t_putex.cc +256 -0
- data/ext/libcouchbase/tests/socktests/t_read.cc +187 -0
- data/ext/libcouchbase/tests/socktests/t_reentrant.cc +143 -0
- data/ext/libcouchbase/tests/socktests/t_ssl.cc +80 -0
- data/ext/libcouchbase/tests/socktests/t_write.cc +95 -0
- data/ext/libcouchbase/tests/start_mock.bat +15 -0
- data/ext/libcouchbase/tests/start_mock.sh +42 -0
- data/ext/libcouchbase/tests/unit_tests.cc +43 -0
- data/ext/libcouchbase/tests/vbucket/confdata/bad.json +101 -0
- data/ext/libcouchbase/tests/vbucket/confdata/full_25.json +363 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_25.json +90 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/memd_45.json +1 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_25.json +291 -0
- data/ext/libcouchbase/tests/vbucket/confdata/terse_30.json +1 -0
- data/ext/libcouchbase/tests/vbucket/t_config.cc +341 -0
- data/ext/libcouchbase/tools/CMakeLists.txt +51 -0
- data/ext/libcouchbase/tools/cbc-handlers.h +462 -0
- data/ext/libcouchbase/tools/cbc-n1qlback.cc +439 -0
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +822 -0
- data/ext/libcouchbase/tools/cbc.cc +1541 -0
- data/ext/libcouchbase/tools/common/histogram.cc +43 -0
- data/ext/libcouchbase/tools/common/histogram.h +23 -0
- data/ext/libcouchbase/tools/common/my_inttypes.h +22 -0
- data/ext/libcouchbase/tools/common/options.cc +420 -0
- data/ext/libcouchbase/tools/common/options.h +81 -0
- data/ext/libcouchbase/tools/docgen/docgen.h +469 -0
- data/ext/libcouchbase/tools/docgen/loc.h +210 -0
- data/ext/libcouchbase/tools/docgen/placeholders.h +211 -0
- data/ext/libcouchbase/tools/docgen/seqgen.h +94 -0
- data/lib/libcouchbase.rb +36 -0
- data/lib/libcouchbase/bucket.rb +819 -0
- data/lib/libcouchbase/callbacks.rb +72 -0
- data/lib/libcouchbase/connection.rb +790 -0
- data/lib/libcouchbase/design_docs.rb +86 -0
- data/lib/libcouchbase/error.rb +68 -0
- data/lib/libcouchbase/ext/libcouchbase.rb +1135 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdbase.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdcounter.rb +36 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdendure.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdfts.rb +24 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdget.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdgetreplica.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdhttp.rb +58 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdn1ql.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobseqno.rb +33 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdobserve.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstore.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdstoredur.rb +45 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdsubdoc.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdverbosity.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/cmdviewquery.rb +61 -0
- data/lib/libcouchbase/ext/libcouchbase/contigbuf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st.rb +15 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st0.rb +23 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st1.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st2.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/create_st3.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/crst_u.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_st_v.rb +11 -0
- data/lib/libcouchbase/ext/libcouchbase/durability_opts_t.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/durabilityopt_sv0.rb +63 -0
- data/lib/libcouchbase/ext/libcouchbase/enums.rb +991 -0
- data/lib/libcouchbase/ext/libcouchbase/fragbuf.rb +18 -0
- data/lib/libcouchbase/ext/libcouchbase/ftshandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/histogram.rb +34 -0
- data/lib/libcouchbase/ext/libcouchbase/http_request_t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/keybuf.rb +20 -0
- data/lib/libcouchbase/ext/libcouchbase/multicmd_ctx.rb +30 -0
- data/lib/libcouchbase/ext/libcouchbase/mutation_token.rb +17 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/n1qlparams.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/respbase.rb +29 -0
- data/lib/libcouchbase/ext/libcouchbase/respcounter.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respendure.rb +49 -0
- data/lib/libcouchbase/ext/libcouchbase/respfts.rb +40 -0
- data/lib/libcouchbase/ext/libcouchbase/respget.rb +44 -0
- data/lib/libcouchbase/ext/libcouchbase/resphttp.rb +48 -0
- data/lib/libcouchbase/ext/libcouchbase/respmcversion.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respn1ql.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respobseqno.rb +52 -0
- data/lib/libcouchbase/ext/libcouchbase/respobserve.rb +41 -0
- data/lib/libcouchbase/ext/libcouchbase/respserverbase.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstats.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respstore.rb +32 -0
- data/lib/libcouchbase/ext/libcouchbase/respstoredur.rb +38 -0
- data/lib/libcouchbase/ext/libcouchbase/respsubdoc.rb +35 -0
- data/lib/libcouchbase/ext/libcouchbase/respviewquery.rb +67 -0
- data/lib/libcouchbase/ext/libcouchbase/sdentry.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/sdspec.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase/t.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf.rb +22 -0
- data/lib/libcouchbase/ext/libcouchbase/valbuf_u_buf.rb +14 -0
- data/lib/libcouchbase/ext/libcouchbase/viewhandle.rb +7 -0
- data/lib/libcouchbase/ext/libcouchbase_iocp.rb +26 -0
- data/lib/libcouchbase/ext/libcouchbase_libuv.rb +18 -0
- data/lib/libcouchbase/ext/tasks.rb +87 -0
- data/lib/libcouchbase/n1ql.rb +73 -0
- data/lib/libcouchbase/query_full_text.rb +147 -0
- data/lib/libcouchbase/query_n1ql.rb +121 -0
- data/lib/libcouchbase/query_view.rb +129 -0
- data/lib/libcouchbase/results_fiber.rb +262 -0
- data/lib/libcouchbase/results_native.rb +211 -0
- data/lib/libcouchbase/version.rb +5 -0
- data/libcouchbase.gemspec +61 -0
- data/spec/bucket_spec.rb +270 -0
- data/spec/connection_spec.rb +277 -0
- data/spec/design_docs_spec.rb +23 -0
- data/spec/error_spec.rb +26 -0
- data/spec/fts_spec.rb +129 -0
- data/spec/n1ql_spec.rb +201 -0
- data/spec/results_libuv_spec.rb +229 -0
- data/spec/results_native_spec.rb +259 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/design.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/data-0000.cbb +0 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/failover.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/meta.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/seqno.json +1 -0
- data/spec/seed/2016-10-25T043505Z/2016-10-25T043505Z-full/bucket-default/node-127.0.0.1%3A8091/snapshot_markers.json +1 -0
- data/spec/view_spec.rb +195 -0
- metadata +775 -0
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 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
|
+
#ifndef LCB_HTTP_H
|
|
19
|
+
#define LCB_HTTP_H
|
|
20
|
+
|
|
21
|
+
#include <libcouchbase/couchbase.h>
|
|
22
|
+
#include "simplestring.h"
|
|
23
|
+
#include "sllist.h"
|
|
24
|
+
struct lcb_settings_st;
|
|
25
|
+
|
|
26
|
+
#ifdef __cplusplus
|
|
27
|
+
extern "C" {
|
|
28
|
+
#endif
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* @file
|
|
33
|
+
* HTTP Response parsing.
|
|
34
|
+
*
|
|
35
|
+
* This file provides HTTP/1.0 compatible response parsing semantics, supporting
|
|
36
|
+
* the Content-Length header.
|
|
37
|
+
*
|
|
38
|
+
* Specifically this may be used to parse incoming HTTP streams into a single
|
|
39
|
+
* body.
|
|
40
|
+
*/
|
|
41
|
+
|
|
42
|
+
/** Response state */
|
|
43
|
+
typedef enum {
|
|
44
|
+
LCBHT_S_HTSTATUS = 1 << 0, /**< Have HTTP status */
|
|
45
|
+
LCBHT_S_HEADER = 1 << 1, /**< Have HTTP header */
|
|
46
|
+
LCBHT_S_BODY = 1 << 2, /**< Have HTTP body */
|
|
47
|
+
LCBHT_S_DONE = 1 << 3, /**< Have a full message */
|
|
48
|
+
|
|
49
|
+
/**Have a parse error. Note this is not the same as a HTTP error */
|
|
50
|
+
LCBHT_S_ERROR = 1 << 4
|
|
51
|
+
} lcbht_RESPSTATE;
|
|
52
|
+
|
|
53
|
+
typedef struct {
|
|
54
|
+
sllist_node slnode; /**< Next header in list */
|
|
55
|
+
const char *key;
|
|
56
|
+
const char *value;
|
|
57
|
+
lcb_string buf_; /**< Storage for the key and value */
|
|
58
|
+
} lcbht_MIMEHDR;
|
|
59
|
+
|
|
60
|
+
typedef struct {
|
|
61
|
+
unsigned short status; /**< HTTP Status code */
|
|
62
|
+
lcbht_RESPSTATE state;
|
|
63
|
+
sllist_root headers; /**< List of response headers */
|
|
64
|
+
lcb_string body; /**< Body */
|
|
65
|
+
} lcbht_RESPONSE;
|
|
66
|
+
|
|
67
|
+
typedef struct lcbht_PARSER *lcbht_pPARSER;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Initialize the parser object
|
|
71
|
+
* @param settings the settings structure used for logging
|
|
72
|
+
* @return a new parser object
|
|
73
|
+
*/
|
|
74
|
+
lcbht_pPARSER
|
|
75
|
+
lcbht_new(struct lcb_settings_st *settings);
|
|
76
|
+
|
|
77
|
+
/** Free the parser object */
|
|
78
|
+
void
|
|
79
|
+
lcbht_free(lcbht_pPARSER);
|
|
80
|
+
|
|
81
|
+
void
|
|
82
|
+
lcbht_reset(lcbht_pPARSER);
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Parse incoming data into a message
|
|
86
|
+
* @param parser The parser
|
|
87
|
+
* @param data Pointer to new data
|
|
88
|
+
* @param ndata Size of the data
|
|
89
|
+
*
|
|
90
|
+
* @return The current state of the parser. If `state & LCBHT_S_DONE` then
|
|
91
|
+
* the current response should be handled before continuing.
|
|
92
|
+
* If `state & LCBHT_S_ERROR` then there was an error parsing the contents
|
|
93
|
+
* as it violated the HTTP protocol.
|
|
94
|
+
*/
|
|
95
|
+
lcbht_RESPSTATE
|
|
96
|
+
lcbht_parse(lcbht_pPARSER parser, const void *data, unsigned ndata);
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Parse incoming data without buffering
|
|
100
|
+
* @param parser The parser to use
|
|
101
|
+
* @param data The data to parse
|
|
102
|
+
* @param ndata Length of the data
|
|
103
|
+
* @param[out] nused How much of the data was actually consumed
|
|
104
|
+
* @param[out] nbody Size of the body pointer
|
|
105
|
+
* @param[out] pbody a pointer for the body
|
|
106
|
+
*
|
|
107
|
+
* @return See lcbht_set_bufmode for the meaning of this value
|
|
108
|
+
*
|
|
109
|
+
* @note It is not an error if `pbody` is NULL. It may mean that the parse state
|
|
110
|
+
* is still within the headers and there is no body to parse yet.
|
|
111
|
+
*
|
|
112
|
+
* This function is intended to be used in a loop, until there is no input
|
|
113
|
+
* remaining. The use of the `nused` pointer is to determine by how much the
|
|
114
|
+
* `data` pointer should be incremented (and the `ndata` decremented) for the
|
|
115
|
+
* next call. When this function returns with a non-error status, `pbody`
|
|
116
|
+
* will contain a pointer to a buffer of data (but see note above) which can
|
|
117
|
+
* then be processed by the application.
|
|
118
|
+
*
|
|
119
|
+
* @code{.c}
|
|
120
|
+
* char **body, *input;
|
|
121
|
+
* unsigned inlen = get_input_len(), nused, bodylen;
|
|
122
|
+
* lcbht_RESPSTATE res;
|
|
123
|
+
* do {
|
|
124
|
+
* res = lcbht_parse_ex(parser, input, inlen, &nused, &nbody, &body);
|
|
125
|
+
* if (res & LCBHT_S_ERROR) {
|
|
126
|
+
* // handle error
|
|
127
|
+
* break;
|
|
128
|
+
* }
|
|
129
|
+
* if (nbody) {
|
|
130
|
+
* // handle body
|
|
131
|
+
* }
|
|
132
|
+
* input += nused;
|
|
133
|
+
* inlen -= nused;
|
|
134
|
+
* } while (!(res & LCBHT_S_DONE));
|
|
135
|
+
* @endcode
|
|
136
|
+
*/
|
|
137
|
+
lcbht_RESPSTATE
|
|
138
|
+
lcbht_parse_ex(lcbht_pPARSER parser, const void *data, unsigned ndata,
|
|
139
|
+
unsigned *nused, unsigned *nbody, const char **pbody);
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Obtain the current response being processed.
|
|
144
|
+
* @param parser The parser
|
|
145
|
+
* @return a pointer to a response object. The response object is only valid
|
|
146
|
+
* until the next call into another parser API
|
|
147
|
+
*/
|
|
148
|
+
lcbht_RESPONSE *
|
|
149
|
+
lcbht_get_response(lcbht_pPARSER parser);
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Determine whether HTTP/1.1 keepalive is enabled on the connection
|
|
153
|
+
* @param parser The parser
|
|
154
|
+
* @return true if keepalive is enabled, false otherwise.
|
|
155
|
+
*/
|
|
156
|
+
int
|
|
157
|
+
lcbht_can_keepalive(lcbht_pPARSER parser);
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Clear the response object
|
|
161
|
+
* @param resp the response to clear
|
|
162
|
+
*/
|
|
163
|
+
void
|
|
164
|
+
lcbht_clear_response(lcbht_RESPONSE *resp);
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Get a header value for a key
|
|
168
|
+
* @param response The response
|
|
169
|
+
* @param key The key to look up
|
|
170
|
+
* @return A string containing the value. If the header has no value then the
|
|
171
|
+
* empty string will be returned. If the header does not exist NULL will be
|
|
172
|
+
* returned.
|
|
173
|
+
*/
|
|
174
|
+
const char *
|
|
175
|
+
lcbht_get_resphdr(const lcbht_RESPONSE *response, const char *key);
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Return a list of headers
|
|
179
|
+
* @param response The response
|
|
180
|
+
* @return A list of headers. Iterate over this value like so:
|
|
181
|
+
* @code{.c}
|
|
182
|
+
* char **hdrlist = lcbht_make_resphdrlist(response);
|
|
183
|
+
* for (char **cur = hdrlist; *cur; cur += 2) {
|
|
184
|
+
* char *key = cur[0];
|
|
185
|
+
* char *value = cur[1];
|
|
186
|
+
* // do something
|
|
187
|
+
* free(key);
|
|
188
|
+
* free(value);
|
|
189
|
+
* }
|
|
190
|
+
* free(hdrlist);
|
|
191
|
+
* @endcode
|
|
192
|
+
*/
|
|
193
|
+
char **
|
|
194
|
+
lcbht_make_resphdrlist(lcbht_RESPONSE *response);
|
|
195
|
+
|
|
196
|
+
#ifdef __cplusplus
|
|
197
|
+
}
|
|
198
|
+
#endif
|
|
199
|
+
#endif
|
|
@@ -0,0 +1,557 @@
|
|
|
1
|
+
/* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2014 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
|
+
#include "config.h"
|
|
19
|
+
#include "connect.h"
|
|
20
|
+
#include "ioutils.h"
|
|
21
|
+
#include "iotable.h"
|
|
22
|
+
#include "settings.h"
|
|
23
|
+
#include "timer-ng.h"
|
|
24
|
+
#include <errno.h>
|
|
25
|
+
|
|
26
|
+
/* win32 lacks EAI_SYSTEM */
|
|
27
|
+
#ifndef EAI_SYSTEM
|
|
28
|
+
#define EAI_SYSTEM 0
|
|
29
|
+
#endif
|
|
30
|
+
#define LOGARGS(conn, lvl) conn->settings, "connection", LCB_LOG_##lvl, __FILE__, __LINE__
|
|
31
|
+
static const lcb_host_t *get_loghost(lcbio_SOCKET *s) {
|
|
32
|
+
static lcb_host_t host = { "NOHOST", "NOPORT" };
|
|
33
|
+
if (!s) { return &host; }
|
|
34
|
+
if (!s->info) { return &host; }
|
|
35
|
+
return &s->info->ep;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Format string arguments for %p%s:%s */
|
|
39
|
+
#define CSLOGID(sock) get_loghost(sock)->host, get_loghost(sock)->port, (void*)s
|
|
40
|
+
#define CSLOGFMT "<%s:%s> (SOCK=%p) "
|
|
41
|
+
|
|
42
|
+
typedef enum {
|
|
43
|
+
CS_PENDING = 0,
|
|
44
|
+
CS_CANCELLED,
|
|
45
|
+
CS_TIMEDOUT,
|
|
46
|
+
CS_CONNECTED,
|
|
47
|
+
CS_ERROR
|
|
48
|
+
} connect_state;
|
|
49
|
+
|
|
50
|
+
typedef struct lcbio_CONNSTART {
|
|
51
|
+
lcbio_CONNDONE_cb handler;
|
|
52
|
+
lcbio_SOCKET *sock;
|
|
53
|
+
lcbio_OSERR syserr;
|
|
54
|
+
void *arg;
|
|
55
|
+
void *event;
|
|
56
|
+
short ev_active; /* whether the event pointer is active (Event only) */
|
|
57
|
+
short in_uhandler; /* Whether we're inside the user-defined handler */
|
|
58
|
+
struct addrinfo *ai_root;
|
|
59
|
+
struct addrinfo *ai;
|
|
60
|
+
connect_state state;
|
|
61
|
+
lcb_error_t pending;
|
|
62
|
+
lcbio_ASYNC *async;
|
|
63
|
+
char *hoststr;
|
|
64
|
+
} lcbio_CONNSTART;
|
|
65
|
+
|
|
66
|
+
static void
|
|
67
|
+
cs_unwatch(lcbio_CONNSTART *cs)
|
|
68
|
+
{
|
|
69
|
+
lcbio_SOCKET *s = cs->sock;
|
|
70
|
+
if (s && cs->ev_active) {
|
|
71
|
+
lcb_assert(s->u.fd != INVALID_SOCKET);
|
|
72
|
+
IOT_V0EV(s->io).cancel(IOT_ARG(s->io), s->u.fd, cs->event);
|
|
73
|
+
cs->ev_active = 0;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Handler invoked to deliver final status for a connection. This will invoke
|
|
79
|
+
* the user supplied callback with the relevant status (if it has not been
|
|
80
|
+
* cancelled) and then free the CONNSTART object.
|
|
81
|
+
*/
|
|
82
|
+
static void
|
|
83
|
+
cs_handler(void *cookie)
|
|
84
|
+
{
|
|
85
|
+
lcbio_CONNSTART *cs = cookie;
|
|
86
|
+
lcb_error_t err;
|
|
87
|
+
lcbio_SOCKET *s = cs->sock;
|
|
88
|
+
|
|
89
|
+
if (s && cs->event) {
|
|
90
|
+
cs_unwatch(cs);
|
|
91
|
+
IOT_V0EV(s->io).destroy(IOT_ARG(s->io), cs->event);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
if (cs->state == CS_PENDING) {
|
|
95
|
+
/* state was not changed since initial scheduling */
|
|
96
|
+
err = LCB_ETIMEDOUT;
|
|
97
|
+
} else if (cs->state == CS_CONNECTED) {
|
|
98
|
+
/* clear pending error */
|
|
99
|
+
err = LCB_SUCCESS;
|
|
100
|
+
} else {
|
|
101
|
+
if (s != NULL && cs->pending == LCB_CONNECT_ERROR) {
|
|
102
|
+
err = lcbio_mklcberr(cs->syserr, s->settings);
|
|
103
|
+
} else {
|
|
104
|
+
err = cs->pending;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
if (cs->state == CS_CANCELLED) {
|
|
109
|
+
/* ignore everything. Clean up resources */
|
|
110
|
+
goto GT_DTOR;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (s) {
|
|
114
|
+
lcbio__load_socknames(s);
|
|
115
|
+
if (err == LCB_SUCCESS) {
|
|
116
|
+
lcb_log(LOGARGS(s, INFO), CSLOGFMT "Connected ", CSLOGID(s));
|
|
117
|
+
|
|
118
|
+
if (s->settings->tcp_nodelay) {
|
|
119
|
+
lcb_error_t ndrc = lcbio_disable_nagle(s);
|
|
120
|
+
if (ndrc != LCB_SUCCESS) {
|
|
121
|
+
lcb_log(LOGARGS(s, INFO), CSLOGFMT "Couldn't set TCP_NODELAY", CSLOGID(s));
|
|
122
|
+
} else {
|
|
123
|
+
lcb_log(LOGARGS(s, DEBUG), CSLOGFMT "Successfuly set TCP_NODELAY", CSLOGID(s));
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
} else {
|
|
127
|
+
lcb_log(LOGARGS(s, ERR), CSLOGFMT "Failed: lcb_err=0x%x, os_errno=%u", CSLOGID(s), err, cs->syserr);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** Handler section */
|
|
132
|
+
cs->in_uhandler = 1;
|
|
133
|
+
cs->handler(err == LCB_SUCCESS ? s : NULL, cs->arg, err, cs->syserr);
|
|
134
|
+
|
|
135
|
+
GT_DTOR:
|
|
136
|
+
if (cs->async) {
|
|
137
|
+
lcbio_timer_destroy(cs->async);
|
|
138
|
+
}
|
|
139
|
+
if (cs->sock) {
|
|
140
|
+
lcbio_unref(cs->sock);
|
|
141
|
+
}
|
|
142
|
+
if (cs->ai_root) {
|
|
143
|
+
freeaddrinfo(cs->ai_root);
|
|
144
|
+
}
|
|
145
|
+
free(cs);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
static void
|
|
149
|
+
cs_state_signal(lcbio_CONNSTART *cs, connect_state state, lcb_error_t err)
|
|
150
|
+
{
|
|
151
|
+
if (cs->state != CS_PENDING) {
|
|
152
|
+
/** State already set */
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
|
|
157
|
+
if (state == CS_CONNECTED) {
|
|
158
|
+
/* clear last errors if we're successful */
|
|
159
|
+
cs->pending = LCB_SUCCESS;
|
|
160
|
+
} else if (cs->pending == LCB_SUCCESS) {
|
|
161
|
+
/* set error code only if previous code was not a failure */
|
|
162
|
+
cs->pending = err;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
cs->state = state;
|
|
166
|
+
lcbio_async_signal(cs->async);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/** Cancels and mutes any pending event */
|
|
170
|
+
void
|
|
171
|
+
lcbio_connect_cancel(lcbio_pCONNSTART cs)
|
|
172
|
+
{
|
|
173
|
+
if (cs->in_uhandler) {
|
|
174
|
+
/* already inside user-defined handler */
|
|
175
|
+
return;
|
|
176
|
+
}
|
|
177
|
+
cs->state = CS_CANCELLED;
|
|
178
|
+
cs_handler(cs);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
static int
|
|
183
|
+
ensure_sock(lcbio_CONNSTART *cs)
|
|
184
|
+
{
|
|
185
|
+
lcbio_SOCKET *s = cs->sock;
|
|
186
|
+
lcbio_TABLE *io = s->io;
|
|
187
|
+
int errtmp = 0;
|
|
188
|
+
|
|
189
|
+
if (cs->ai == NULL) {
|
|
190
|
+
return -1;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (IOT_IS_EVENT(io)) {
|
|
194
|
+
if (s->u.fd != INVALID_SOCKET) {
|
|
195
|
+
/* already have one? */
|
|
196
|
+
return 0;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
while (s->u.fd == INVALID_SOCKET && cs->ai != NULL) {
|
|
200
|
+
s->u.fd = lcbio_E_ai2sock(io, &cs->ai, &errtmp);
|
|
201
|
+
if (s->u.fd != INVALID_SOCKET) {
|
|
202
|
+
return 0;
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
} else {
|
|
206
|
+
if (s->u.sd) {
|
|
207
|
+
return 0;
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
while (s->u.sd == NULL && cs->ai != NULL) {
|
|
211
|
+
s->u.sd = lcbio_C_ai2sock(io, &cs->ai, &errtmp);
|
|
212
|
+
if (s->u.sd) {
|
|
213
|
+
s->u.sd->lcbconn = (void *) cs->sock;
|
|
214
|
+
s->u.sd->parent = IOT_ARG(io);
|
|
215
|
+
return 0;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
if (cs->ai == NULL) {
|
|
221
|
+
lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
|
|
222
|
+
return -1;
|
|
223
|
+
}
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
static void
|
|
228
|
+
destroy_cursock(lcbio_CONNSTART *cs)
|
|
229
|
+
{
|
|
230
|
+
lcbio_SOCKET *s = cs->sock;
|
|
231
|
+
lcbio_TABLE *iot = s->io;
|
|
232
|
+
if (cs->ai) {
|
|
233
|
+
cs->ai = cs->ai->ai_next;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (!cs->ai) {
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
if (IOT_IS_EVENT(iot)) {
|
|
241
|
+
if (cs->ev_active) {
|
|
242
|
+
lcb_assert(s->u.fd != INVALID_SOCKET);
|
|
243
|
+
IOT_V0EV(iot).cancel(IOT_ARG(iot), s->u.fd, cs->event);
|
|
244
|
+
cs->ev_active = 0;
|
|
245
|
+
}
|
|
246
|
+
IOT_V0IO(iot).close(IOT_ARG(iot), s->u.fd);
|
|
247
|
+
s->u.fd = INVALID_SOCKET;
|
|
248
|
+
} else {
|
|
249
|
+
if (s->u.sd) {
|
|
250
|
+
IOT_V1(iot).close(IOT_ARG(iot), s->u.sd);
|
|
251
|
+
s->u.sd = NULL;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static void
|
|
257
|
+
E_connect(lcb_socket_t sock, short events, void *arg)
|
|
258
|
+
{
|
|
259
|
+
lcbio_CONNSTART *cs = arg;
|
|
260
|
+
lcbio_SOCKET *s = cs->sock;
|
|
261
|
+
lcbio_TABLE *io = s->io;
|
|
262
|
+
int retry_once = 0;
|
|
263
|
+
lcbio_CSERR connstatus;
|
|
264
|
+
|
|
265
|
+
(void)sock;
|
|
266
|
+
|
|
267
|
+
lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Got event handler for new connection", CSLOGID(s));
|
|
268
|
+
|
|
269
|
+
GT_NEXTSOCK:
|
|
270
|
+
if (ensure_sock(cs) == -1) {
|
|
271
|
+
cs_state_signal(cs, CS_ERROR, LCB_CONNECT_ERROR);
|
|
272
|
+
return;
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
if (events & LCB_ERROR_EVENT) {
|
|
276
|
+
socklen_t errlen = sizeof(int);
|
|
277
|
+
int sockerr = 0;
|
|
278
|
+
lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Received ERROR_EVENT", CSLOGID(s));
|
|
279
|
+
getsockopt(s->u.fd, SOL_SOCKET, SO_ERROR, (char *)&sockerr, &errlen);
|
|
280
|
+
lcbio_mksyserr(sockerr, &cs->syserr);
|
|
281
|
+
destroy_cursock(cs);
|
|
282
|
+
goto GT_NEXTSOCK;
|
|
283
|
+
|
|
284
|
+
} else {
|
|
285
|
+
int rv = 0;
|
|
286
|
+
struct addrinfo *ai = cs->ai;
|
|
287
|
+
|
|
288
|
+
GT_CONNECT:
|
|
289
|
+
rv = IOT_V0IO(io).connect0(
|
|
290
|
+
IOT_ARG(io), s->u.fd, ai->ai_addr, (unsigned)ai->ai_addrlen);
|
|
291
|
+
|
|
292
|
+
if (rv == 0) {
|
|
293
|
+
cs_unwatch(cs);
|
|
294
|
+
cs_state_signal(cs, CS_CONNECTED, LCB_SUCCESS);
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
connstatus = lcbio_mkcserr(IOT_ERRNO(io));
|
|
300
|
+
lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
|
|
301
|
+
|
|
302
|
+
|
|
303
|
+
switch (connstatus) {
|
|
304
|
+
|
|
305
|
+
case LCBIO_CSERR_INTR:
|
|
306
|
+
goto GT_CONNECT;
|
|
307
|
+
|
|
308
|
+
case LCBIO_CSERR_CONNECTED:
|
|
309
|
+
cs_unwatch(cs);
|
|
310
|
+
cs_state_signal(cs, CS_CONNECTED, LCB_SUCCESS);
|
|
311
|
+
return;
|
|
312
|
+
|
|
313
|
+
case LCBIO_CSERR_BUSY:
|
|
314
|
+
lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Scheduling asynchronous watch for socket.", CSLOGID(s));
|
|
315
|
+
IOT_V0EV(io).watch(
|
|
316
|
+
IOT_ARG(io), s->u.fd, cs->event, LCB_WRITE_EVENT, cs, E_connect);
|
|
317
|
+
cs->ev_active = 1;
|
|
318
|
+
return;
|
|
319
|
+
|
|
320
|
+
case LCBIO_CSERR_EINVAL:
|
|
321
|
+
if (!retry_once) {
|
|
322
|
+
retry_once = 1;
|
|
323
|
+
goto GT_CONNECT;
|
|
324
|
+
}
|
|
325
|
+
/* fallthrough */
|
|
326
|
+
|
|
327
|
+
case LCBIO_CSERR_EFAIL:
|
|
328
|
+
default:
|
|
329
|
+
/* close the current socket and try again */
|
|
330
|
+
lcb_log(LOGARGS(s, TRACE), CSLOGFMT "connect() failed. os_error=%d [%s]", CSLOGID(s), IOT_ERRNO(io), strerror(IOT_ERRNO(io)));
|
|
331
|
+
destroy_cursock(cs);
|
|
332
|
+
goto GT_NEXTSOCK;
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
static void C_connect(lcbio_CONNSTART *cs);
|
|
337
|
+
|
|
338
|
+
static void
|
|
339
|
+
C_conncb(lcb_sockdata_t *sock, int status)
|
|
340
|
+
{
|
|
341
|
+
lcbio_SOCKET *s = (void *)sock->lcbconn;
|
|
342
|
+
lcbio_CONNSTART *cs = (void *)s->ctx;
|
|
343
|
+
|
|
344
|
+
lcb_log(LOGARGS(s, TRACE), CSLOGFMT "Received completion handler. Status=%d. errno=%d", CSLOGID(s), status, IOT_ERRNO(s->io));
|
|
345
|
+
|
|
346
|
+
if (!--s->refcount) {
|
|
347
|
+
lcbio__destroy(s);
|
|
348
|
+
return;
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
if (!status) {
|
|
352
|
+
if (cs->state == CS_PENDING) {
|
|
353
|
+
cs->state = CS_CONNECTED;
|
|
354
|
+
}
|
|
355
|
+
cs_handler(cs);
|
|
356
|
+
} else {
|
|
357
|
+
lcbio_mksyserr(IOT_ERRNO(s->io), &cs->syserr);
|
|
358
|
+
destroy_cursock(cs);
|
|
359
|
+
C_connect(cs);
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
static void
|
|
364
|
+
C_connect(lcbio_CONNSTART *cs)
|
|
365
|
+
{
|
|
366
|
+
int rv;
|
|
367
|
+
lcbio_SOCKET *s = cs->sock;
|
|
368
|
+
int retry_once = 0;
|
|
369
|
+
lcbio_CSERR status;
|
|
370
|
+
lcbio_TABLE *io = s->io;
|
|
371
|
+
|
|
372
|
+
GT_NEXTSOCK:
|
|
373
|
+
if (ensure_sock(cs) != 0) {
|
|
374
|
+
lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
|
|
375
|
+
cs_state_signal(cs, CS_ERROR, LCB_CONNECT_ERROR);
|
|
376
|
+
return;
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
GT_CONNECT:
|
|
380
|
+
rv = IOT_V1(io).connect(IOT_ARG(io), s->u.sd, cs->ai->ai_addr,
|
|
381
|
+
(unsigned)cs->ai->ai_addrlen, C_conncb);
|
|
382
|
+
if (rv == 0) {
|
|
383
|
+
lcbio_ref(s);
|
|
384
|
+
return;
|
|
385
|
+
}
|
|
386
|
+
|
|
387
|
+
lcbio_mksyserr(IOT_ERRNO(io), &cs->syserr);
|
|
388
|
+
status = lcbio_mkcserr(IOT_ERRNO(io));
|
|
389
|
+
switch (status) {
|
|
390
|
+
|
|
391
|
+
case LCBIO_CSERR_INTR:
|
|
392
|
+
goto GT_CONNECT;
|
|
393
|
+
|
|
394
|
+
case LCBIO_CSERR_CONNECTED:
|
|
395
|
+
cs_state_signal(cs, CS_CONNECTED, LCB_SUCCESS);
|
|
396
|
+
return;
|
|
397
|
+
|
|
398
|
+
case LCBIO_CSERR_BUSY:
|
|
399
|
+
return;
|
|
400
|
+
|
|
401
|
+
case LCBIO_CSERR_EINVAL:
|
|
402
|
+
if (!retry_once) {
|
|
403
|
+
retry_once = 1;
|
|
404
|
+
goto GT_CONNECT;
|
|
405
|
+
}
|
|
406
|
+
/* fallthrough */
|
|
407
|
+
|
|
408
|
+
case LCBIO_CSERR_EFAIL:
|
|
409
|
+
default:
|
|
410
|
+
destroy_cursock(cs);
|
|
411
|
+
goto GT_NEXTSOCK;
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
|
|
415
|
+
struct lcbio_CONNSTART *
|
|
416
|
+
lcbio_connect(lcbio_TABLE *iot, lcb_settings *settings, const lcb_host_t *dest,
|
|
417
|
+
uint32_t timeout, lcbio_CONNDONE_cb handler, void *arg)
|
|
418
|
+
{
|
|
419
|
+
lcbio_SOCKET *s;
|
|
420
|
+
lcbio_CONNSTART *ret;
|
|
421
|
+
struct addrinfo hints;
|
|
422
|
+
int rv;
|
|
423
|
+
|
|
424
|
+
s = calloc(1, sizeof(*s));
|
|
425
|
+
ret = calloc(1, sizeof(*ret));
|
|
426
|
+
|
|
427
|
+
/** Initialize the socket first */
|
|
428
|
+
s->io = iot;
|
|
429
|
+
s->settings = settings;
|
|
430
|
+
s->ctx = ret;
|
|
431
|
+
s->refcount = 1;
|
|
432
|
+
s->info = calloc(1, sizeof(*s->info));
|
|
433
|
+
s->info->ep = *dest;
|
|
434
|
+
lcbio_table_ref(s->io);
|
|
435
|
+
lcb_settings_ref(s->settings);
|
|
436
|
+
lcb_list_init(&s->protos);
|
|
437
|
+
|
|
438
|
+
if (IOT_IS_EVENT(iot)) {
|
|
439
|
+
s->u.fd = INVALID_SOCKET;
|
|
440
|
+
ret->event = IOT_V0EV(iot).create(IOT_ARG(iot));
|
|
441
|
+
}
|
|
442
|
+
|
|
443
|
+
/** Initialize the connstart structure */
|
|
444
|
+
ret->handler = handler;
|
|
445
|
+
ret->arg = arg;
|
|
446
|
+
ret->sock = s;
|
|
447
|
+
ret->async = lcbio_timer_new(iot, ret, cs_handler);
|
|
448
|
+
|
|
449
|
+
lcbio_timer_rearm(ret->async, timeout);
|
|
450
|
+
lcb_log(LOGARGS(s, INFO), CSLOGFMT "Starting. Timeout=%uus", CSLOGID(s), timeout);
|
|
451
|
+
|
|
452
|
+
/** Hostname lookup: */
|
|
453
|
+
memset(&hints, 0, sizeof(hints));
|
|
454
|
+
hints.ai_flags = AI_PASSIVE;
|
|
455
|
+
hints.ai_socktype = SOCK_STREAM;
|
|
456
|
+
if (settings->ipv6 == LCB_IPV6_DISABLED) {
|
|
457
|
+
hints.ai_family = AF_INET;
|
|
458
|
+
} else if (settings->ipv6 == LCB_IPV6_ONLY) {
|
|
459
|
+
hints.ai_family = AF_INET6;
|
|
460
|
+
} else {
|
|
461
|
+
hints.ai_family = AF_UNSPEC;
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
if ((rv = getaddrinfo(dest->host, dest->port, &hints, &ret->ai_root))) {
|
|
465
|
+
const char *errstr = rv != EAI_SYSTEM ? gai_strerror(rv) : "";
|
|
466
|
+
lcb_log(LOGARGS(s, ERR), CSLOGFMT "Couldn't look up %s (%s) [EAI=%d]", CSLOGID(s), dest->host, errstr, rv);
|
|
467
|
+
cs_state_signal(ret, CS_ERROR, LCB_UNKNOWN_HOST);
|
|
468
|
+
} else {
|
|
469
|
+
ret->ai = ret->ai_root;
|
|
470
|
+
|
|
471
|
+
/** Figure out how to connect */
|
|
472
|
+
if (IOT_IS_EVENT(iot)) {
|
|
473
|
+
E_connect(-1, LCB_WRITE_EVENT, ret);
|
|
474
|
+
} else {
|
|
475
|
+
C_connect(ret);
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
return ret;
|
|
479
|
+
}
|
|
480
|
+
|
|
481
|
+
lcbio_CONNSTART *
|
|
482
|
+
lcbio_connect_hl(lcbio_TABLE *iot, lcb_settings *settings,
|
|
483
|
+
hostlist_t hl, int rollover, uint32_t timeout,
|
|
484
|
+
lcbio_CONNDONE_cb handler, void *arg)
|
|
485
|
+
{
|
|
486
|
+
const lcb_host_t *cur;
|
|
487
|
+
unsigned ii, hlmax;
|
|
488
|
+
ii = 0;
|
|
489
|
+
hlmax = hostlist_size(hl);
|
|
490
|
+
|
|
491
|
+
while ( (cur = hostlist_shift_next(hl, rollover)) && ii++ < hlmax) {
|
|
492
|
+
lcbio_CONNSTART *ret = lcbio_connect(
|
|
493
|
+
iot, settings, cur, timeout, handler, arg);
|
|
494
|
+
if (ret) {
|
|
495
|
+
return ret;
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return NULL;
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
lcbio_SOCKET *
|
|
503
|
+
lcbio_wrap_fd(lcbio_pTABLE iot, lcb_settings *settings, lcb_socket_t fd)
|
|
504
|
+
{
|
|
505
|
+
lcbio_SOCKET *ret = calloc(1, sizeof(*ret));
|
|
506
|
+
lcbio_CONNDONE_cb *ci = calloc(1, sizeof(*ci));
|
|
507
|
+
|
|
508
|
+
if (ret == NULL || ci == NULL) {
|
|
509
|
+
free(ret);
|
|
510
|
+
free(ci);
|
|
511
|
+
return NULL;
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
assert(iot->model = LCB_IOMODEL_EVENT);
|
|
515
|
+
|
|
516
|
+
lcb_list_init(&ret->protos);
|
|
517
|
+
ret->settings = settings;
|
|
518
|
+
ret->io = iot;
|
|
519
|
+
ret->refcount = 1;
|
|
520
|
+
ret->u.fd = fd;
|
|
521
|
+
|
|
522
|
+
lcbio_table_ref(ret->io);
|
|
523
|
+
lcb_settings_ref(ret->settings);
|
|
524
|
+
lcbio__load_socknames(ret);
|
|
525
|
+
return ret;
|
|
526
|
+
}
|
|
527
|
+
|
|
528
|
+
void
|
|
529
|
+
lcbio_shutdown(lcbio_SOCKET *s)
|
|
530
|
+
{
|
|
531
|
+
lcbio_TABLE *io = s->io;
|
|
532
|
+
|
|
533
|
+
lcbio__protoctx_delall(s);
|
|
534
|
+
if (IOT_IS_EVENT(io)) {
|
|
535
|
+
if (s->u.fd != INVALID_SOCKET) {
|
|
536
|
+
IOT_V0IO(io).close(IOT_ARG(io), s->u.fd);
|
|
537
|
+
s->u.fd = INVALID_SOCKET;
|
|
538
|
+
}
|
|
539
|
+
} else {
|
|
540
|
+
if (s->u.sd) {
|
|
541
|
+
IOT_V1(io).close(IOT_ARG(io), s->u.sd);
|
|
542
|
+
s->u.sd = NULL;
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
}
|
|
546
|
+
|
|
547
|
+
void
|
|
548
|
+
lcbio__destroy(lcbio_SOCKET *s)
|
|
549
|
+
{
|
|
550
|
+
lcbio_shutdown(s);
|
|
551
|
+
if (s->info) {
|
|
552
|
+
free(s->info);
|
|
553
|
+
}
|
|
554
|
+
lcbio_table_unref(s->io);
|
|
555
|
+
lcb_settings_unref(s->settings);
|
|
556
|
+
free(s);
|
|
557
|
+
}
|