libcouchbase 0.2.0 → 0.3.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +1 -1
  4. data/ext/libcouchbase/CMakeLists.txt +8 -6
  5. data/ext/libcouchbase/README.markdown +2 -2
  6. data/ext/libcouchbase/RELEASE_NOTES.markdown +0 -86
  7. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +0 -11
  8. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +0 -2
  9. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +1 -2
  10. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  11. data/ext/libcouchbase/cmake/config-cmake.h.in +0 -2
  12. data/ext/libcouchbase/cmake/defs.mk.in +2 -0
  13. data/ext/libcouchbase/cmake/source_files.cmake +5 -21
  14. data/ext/libcouchbase/include/libcouchbase/auth.h +0 -10
  15. data/ext/libcouchbase/include/libcouchbase/cntl.h +1 -27
  16. data/ext/libcouchbase/include/libcouchbase/error.h +1 -15
  17. data/ext/libcouchbase/include/libcouchbase/n1ql.h +1 -13
  18. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
  19. data/ext/libcouchbase/include/libcouchbase/subdoc.h +0 -9
  20. data/ext/libcouchbase/include/libcouchbase/views.h +1 -7
  21. data/ext/libcouchbase/include/libcouchbase/visibility.h +0 -1
  22. data/ext/libcouchbase/include/memcached/protocol_binary.h +1131 -29
  23. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  24. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  25. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +2 -3
  26. data/ext/libcouchbase/src/README.md +2 -0
  27. data/ext/libcouchbase/src/auth-priv.h +0 -1
  28. data/ext/libcouchbase/src/auth.cc +4 -10
  29. data/ext/libcouchbase/src/bootstrap.c +269 -0
  30. data/ext/libcouchbase/src/bootstrap.h +39 -50
  31. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +117 -84
  32. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  33. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  34. data/ext/libcouchbase/src/bucketconfig/bc_http.h +25 -50
  35. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  36. data/ext/libcouchbase/src/bucketconfig/clconfig.h +386 -407
  37. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  38. data/ext/libcouchbase/src/cbft.cc +27 -22
  39. data/ext/libcouchbase/src/cntl.cc +19 -30
  40. data/ext/libcouchbase/src/connspec.cc +1 -48
  41. data/ext/libcouchbase/src/connspec.h +0 -27
  42. data/ext/libcouchbase/src/dump.cc +2 -2
  43. data/ext/libcouchbase/src/getconfig.cc +33 -7
  44. data/ext/libcouchbase/src/handler.cc +2 -0
  45. data/ext/libcouchbase/src/hostlist.cc +36 -0
  46. data/ext/libcouchbase/src/hostlist.h +62 -41
  47. data/ext/libcouchbase/src/http/http-priv.h +112 -125
  48. data/ext/libcouchbase/src/http/http.cc +30 -15
  49. data/ext/libcouchbase/src/http/http.h +34 -1
  50. data/ext/libcouchbase/src/http/http_io.cc +26 -22
  51. data/ext/libcouchbase/src/instance.cc +23 -94
  52. data/ext/libcouchbase/src/internal.h +26 -52
  53. data/ext/libcouchbase/src/jsparse/parser.cc +202 -146
  54. data/ext/libcouchbase/src/jsparse/parser.h +98 -91
  55. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  56. data/ext/libcouchbase/src/lcbht/lcbht.h +163 -174
  57. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  58. data/ext/libcouchbase/src/lcbio/connect.h +2 -9
  59. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  60. data/ext/libcouchbase/src/lcbio/iotable.h +16 -61
  61. data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
  62. data/ext/libcouchbase/src/lcbio/manager.c +2 -2
  63. data/ext/libcouchbase/src/mc/mcreq.h +2 -9
  64. data/ext/libcouchbase/src/mcserver/mcserver.cc +34 -143
  65. data/ext/libcouchbase/src/mcserver/mcserver.h +12 -7
  66. data/ext/libcouchbase/src/mcserver/negotiate.cc +38 -132
  67. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
  68. data/ext/libcouchbase/src/n1ql/n1ql.cc +32 -56
  69. data/ext/libcouchbase/src/newconfig.cc +6 -6
  70. data/ext/libcouchbase/src/nodeinfo.cc +2 -2
  71. data/ext/libcouchbase/src/operations/{cbflush.cc → cbflush.c} +15 -7
  72. data/ext/libcouchbase/src/operations/{counter.cc → counter.c} +0 -0
  73. data/ext/libcouchbase/src/operations/durability.cc +26 -6
  74. data/ext/libcouchbase/src/operations/durability_internal.h +3 -6
  75. data/ext/libcouchbase/src/operations/{get.cc → get.c} +26 -24
  76. data/ext/libcouchbase/src/operations/{observe.cc → observe.c} +93 -68
  77. data/ext/libcouchbase/src/operations/{pktfwd.cc → pktfwd.c} +0 -0
  78. data/ext/libcouchbase/src/operations/{remove.cc → remove.c} +0 -0
  79. data/ext/libcouchbase/src/operations/stats.cc +8 -3
  80. data/ext/libcouchbase/src/operations/{store.cc → store.c} +32 -27
  81. data/ext/libcouchbase/src/operations/subdoc.cc +18 -38
  82. data/ext/libcouchbase/src/operations/{touch.cc → touch.c} +0 -0
  83. data/ext/libcouchbase/src/packetutils.c +37 -0
  84. data/ext/libcouchbase/src/packetutils.h +2 -2
  85. data/ext/libcouchbase/src/probes.d +1 -1
  86. data/ext/libcouchbase/src/{retrychk.cc → retrychk.c} +3 -2
  87. data/ext/libcouchbase/src/retryq.cc +4 -4
  88. data/ext/libcouchbase/src/settings.c +0 -3
  89. data/ext/libcouchbase/src/settings.h +0 -5
  90. data/ext/libcouchbase/src/simplestring.c +211 -0
  91. data/ext/libcouchbase/src/simplestring.h +228 -0
  92. data/ext/libcouchbase/src/ssl/ssl_c.c +0 -1
  93. data/ext/libcouchbase/src/ssl/ssl_common.c +0 -2
  94. data/ext/libcouchbase/src/ssl/ssl_e.c +1 -0
  95. data/ext/libcouchbase/src/ssobuf.h +82 -0
  96. data/ext/libcouchbase/src/trace.h +4 -4
  97. data/ext/libcouchbase/src/vbucket/vbucket.c +1 -0
  98. data/ext/libcouchbase/src/views/{docreq.cc → docreq.c} +54 -48
  99. data/ext/libcouchbase/src/views/docreq.h +30 -24
  100. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  101. data/ext/libcouchbase/src/views/viewreq.h +13 -43
  102. data/ext/libcouchbase/tests/basic/t_connstr.cc +50 -89
  103. data/ext/libcouchbase/tests/basic/t_host.cc +75 -67
  104. data/ext/libcouchbase/tests/basic/t_jsparse.cc +78 -27
  105. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  106. data/ext/libcouchbase/tests/htparse/t_basic.cc +78 -58
  107. data/ext/libcouchbase/tests/iotests/mock-environment.h +1 -2
  108. data/ext/libcouchbase/tests/iotests/t_confmon.cc +114 -96
  109. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  110. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
  111. data/lib/libcouchbase/ext/tasks.rb +6 -2
  112. data/lib/libcouchbase/query_view.rb +1 -1
  113. data/lib/libcouchbase/results_fiber.rb +6 -6
  114. data/lib/libcouchbase/version.rb +1 -1
  115. metadata +26 -26
  116. data/ext/libcouchbase/src/bootstrap.cc +0 -216
  117. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +0 -281
  118. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +0 -528
  119. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +0 -115
  120. data/ext/libcouchbase/src/bucketconfig/confmon.cc +0 -378
  121. data/ext/libcouchbase/src/dns-srv.cc +0 -142
  122. data/ext/libcouchbase/src/errmap.cc +0 -107
  123. data/ext/libcouchbase/src/errmap.h +0 -113
  124. data/ext/libcouchbase/src/lcbht/lcbht.cc +0 -177
  125. data/ext/libcouchbase/src/lcbio/connect.cc +0 -562
  126. data/ext/libcouchbase/src/lcbio/timer-cxx.h +0 -87
  127. data/ext/libcouchbase/src/mctx-helper.h +0 -51
  128. data/ext/libcouchbase/src/views/viewreq.cc +0 -318
  129. data/ext/libcouchbase/tests/iotests/t_errmap.cc +0 -97
@@ -1,142 +0,0 @@
1
- #include <libcouchbase/couchbase.h>
2
-
3
- #include "config.h"
4
- #include "hostlist.h"
5
- #include "connspec.h"
6
- #include "hostlist.h"
7
-
8
- #ifndef _WIN32
9
- #include <string>
10
-
11
- #ifdef HAVE_ARPA_NAMESER_H
12
- #include <arpa/nameser.h>
13
- #if __NAMESER < 19991006
14
- #undef HAVE_RES_SEARCH
15
- #endif /* __NAMESER < NNN */
16
- #endif /* HAVE_ARPA_NAMESER_H */
17
-
18
- #if defined(HAVE_ARPA_NAMESER_H) && defined(HAVE_RES_SEARCH)
19
- #define CAN_SRV_LOOKUP
20
- #include <cstdio>
21
- #include <sys/types.h>
22
- #include <netinet/in.h>
23
- #include <resolv.h>
24
-
25
- lcb_error_t
26
- lcb::dnssrv_query(const char* name, lcb::Hostlist& hostlist)
27
- {
28
- ns_msg msg;
29
-
30
- int rv = 0, nresp, ii;
31
- lcb_U16 dns_rv;
32
-
33
- std::vector<unsigned char> pkt(NS_PACKETSZ);
34
- nresp = res_search(name, ns_c_in, ns_t_srv, &pkt[0], NS_PACKETSZ);
35
- if (nresp < 0) {
36
- return LCB_UNKNOWN_HOST;
37
- }
38
-
39
- rv = ns_initparse(&pkt[0], nresp, &msg);
40
- if (rv != 0) {
41
- return LCB_PROTOCOL_ERROR;
42
- }
43
-
44
- dns_rv = ns_msg_getflag(msg, ns_f_rcode);
45
- if (dns_rv != ns_r_noerror) {
46
- return LCB_UNKNOWN_HOST;
47
- }
48
-
49
- if (!ns_msg_count(msg, ns_s_an)) {
50
- return LCB_UNKNOWN_HOST;
51
- }
52
-
53
- for (ii = 0; ii < ns_msg_count(msg, ns_s_an); ii++) {
54
- lcb_U16 srv_prio, srv_weight, srv_port;
55
- ns_rr rr;
56
- const lcb_U8 *rdata;
57
- size_t rdlen;
58
-
59
- if (ns_parserr(&msg, ns_s_an, ii, &rr) != 0) {
60
- continue;
61
- }
62
-
63
- if (ns_rr_type(rr) != ns_t_srv) {
64
- continue;
65
- }
66
-
67
- /* Get the rdata and length fields */
68
- rdata = ns_rr_rdata(rr);
69
- rdlen = ns_rr_rdlen(rr);
70
-
71
- if (rdlen < 6) {
72
- continue;
73
- }
74
-
75
- #define do_get16(t) t = ns_get16(rdata); rdata += 2; rdlen -=2
76
- do_get16(srv_prio);
77
- do_get16(srv_weight);
78
- do_get16(srv_port);
79
- #undef do_get_16
80
-
81
- (void)srv_prio; (void)srv_weight; /* Handle these in the future */
82
- std::vector<char> dname(NS_MAXDNAME + 1);
83
- ns_name_uncompress(
84
- ns_msg_base(msg), ns_msg_end(msg),
85
- rdata, &dname[0], NS_MAXDNAME);
86
- hostlist.add(&dname[0], srv_port);
87
- }
88
- return LCB_SUCCESS;
89
- }
90
- #endif /* HAVE_RES_SEARCH */
91
-
92
- #else
93
- #include <windns.h>
94
- #define CAN_SRV_LOOKUP
95
- /* Implement via DnsQuery() */
96
- lcb_error_t
97
- lcb::dnssrv_query(const char *addr, Hostlist& hs)
98
- {
99
- DNS_STATUS status;
100
- PDNS_RECORDA root, cur;
101
-
102
- status = DnsQuery_A(
103
- addr, DNS_TYPE_SRV, DNS_QUERY_STANDARD, NULL, (PDNS_RECORD*)&root, NULL);
104
- if (status != 0) {
105
- return LCB_UNKNOWN_HOST;
106
- }
107
-
108
- for (cur = root; cur; cur = cur->pNext) {
109
- // Use the ASCII version of the DNS lookup structure
110
- const DNS_SRV_DATAA *srv = &cur->Data.SRV;
111
- hs.add(srv->pNameTarget, srv->wPort);
112
- }
113
- DnsRecordListFree(root, DnsFreeRecordList);
114
- return LCB_SUCCESS;
115
- }
116
-
117
- #endif /* !WIN32 */
118
-
119
-
120
- #ifndef CAN_SRV_LOOKUP
121
- lcb_error_t lcb::dnssrv_query(const char *, Hostlist&) {
122
- return LCB_CLIENT_FEATURE_UNAVAILABLE;
123
- }
124
- #endif
125
-
126
- #define SVCNAME_PLAIN "_couchbase._tcp."
127
- #define SVCNAME_SSL "_couchbases._tcp."
128
-
129
- lcb::Hostlist*
130
- lcb::dnssrv_getbslist(const char *addr, bool is_ssl, lcb_error_t& errp) {
131
- std::string ss;
132
- Hostlist *ret = new Hostlist();
133
- ss.append(is_ssl ? SVCNAME_SSL : SVCNAME_PLAIN);
134
- ss.append(addr);
135
-
136
- errp = dnssrv_query(ss.c_str(), *ret);
137
- if (errp != LCB_SUCCESS) {
138
- delete ret;
139
- ret = NULL;
140
- }
141
- return ret;
142
- }
@@ -1,107 +0,0 @@
1
- #include "internal.h"
2
- #include "errmap.h"
3
- #include "contrib/lcb-jsoncpp/lcb-jsoncpp.h"
4
-
5
- using namespace lcb::errmap;
6
-
7
- ErrorMap::ErrorMap() : revision(0), version(0) {
8
- }
9
-
10
- static ErrorAttribute getAttribute(const std::string& s) {
11
- #define X(c, s_) if (s == s_) { return c; }
12
- LCB_XERRMAP_ATTRIBUTES(X)
13
- #undef X
14
- return INVALID_ATTRIBUTE;
15
- }
16
-
17
- const uint32_t ErrorMap::MAX_VERSION = 1;
18
-
19
- ErrorMap::ParseStatus
20
- ErrorMap::parse(const char *s, size_t n, std::string& errmsg) {
21
- Json::Value root_nonconst;
22
- Json::Reader reader;
23
- if (!reader.parse(s, s + n, root_nonconst)) {
24
- errmsg = "Invalid JSON";
25
- return PARSE_ERROR;
26
- }
27
-
28
- const Json::Value& root = root_nonconst;
29
- const Json::Value& verJson = root["version"];
30
- if (!verJson.isNumeric()) {
31
- errmsg = "'version' is not a number";
32
- return PARSE_ERROR;
33
- }
34
-
35
- if (verJson.asUInt() > MAX_VERSION) {
36
- errmsg = "'version' is unreasonably high";
37
- return UNKNOWN_VERSION;
38
- }
39
-
40
- const Json::Value& revJson = root["revision"];
41
- if (!revJson.isNumeric()) {
42
- errmsg = "'revision' is not a number";
43
- return PARSE_ERROR;
44
- }
45
-
46
- if (revJson.asUInt() <= revision) {
47
- return NOT_UPDATED;
48
- }
49
-
50
- const Json::Value& errsJson = root["errors"];
51
- if (!errsJson.isObject()) {
52
- errmsg = "'errors' is not an object";
53
- return PARSE_ERROR;
54
- }
55
-
56
- Json::Value::const_iterator ii = errsJson.begin();
57
- for (; ii != errsJson.end(); ++ii) {
58
- // Key is the version in hex
59
- unsigned ec = 0;
60
- if (sscanf(ii.key().asCString(), "%x", &ec) != 1) {
61
- errmsg = "key " + ii.key().asString() + " is not a hex number";
62
- return PARSE_ERROR;
63
- }
64
-
65
- const Json::Value& errorJson = *ii;
66
-
67
- // Descend into the error attributes
68
- Error error;
69
- error.code = static_cast<uint16_t>(ec);
70
-
71
- error.shortname = errorJson["name"].asString();
72
- error.description = errorJson["desc"].asString();
73
-
74
- const Json::Value& attrs = errorJson["attrs"];
75
- if (!attrs.isArray()) {
76
- errmsg = "'attrs' is not an array";
77
- return PARSE_ERROR;
78
- }
79
-
80
- Json::Value::const_iterator jj = attrs.begin();
81
- for (; jj != attrs.end(); ++jj) {
82
- ErrorAttribute attr = getAttribute(jj->asString());
83
- if (attr == INVALID_ATTRIBUTE) {
84
- errmsg = "unknown attribute received";
85
- return UNKNOWN_VERSION;
86
- }
87
- error.attributes.insert(attr);
88
- }
89
- errors.insert(MapType::value_type(ec, error));
90
- }
91
-
92
- return UPDATED;
93
- }
94
-
95
- const Error& ErrorMap::getError(uint16_t code) const {
96
- static const Error invalid;
97
- MapType::const_iterator it = errors.find(code);
98
-
99
- if (it != errors.end()) {
100
- return it->second;
101
- } else {
102
- return invalid;
103
- }
104
- }
105
-
106
- ErrorMap *lcb_errmap_new() { return new ErrorMap(); }
107
- void lcb_errmap_free(ErrorMap* m) { delete m; }
@@ -1,113 +0,0 @@
1
- #ifndef LCB_ERRMAP_H
2
- #define LCB_ERRMAP_H
3
-
4
- #ifdef __cplusplus
5
-
6
- #include <map>
7
- #include <set>
8
- #include <string>
9
-
10
- namespace lcb {
11
- namespace errmap {
12
-
13
- enum ErrorAttribute {
14
- #define LCB_XERRMAP_ATTRIBUTES(X) \
15
- X(TEMPORARY, "temp") \
16
- X(SUBDOC, "subdoc") \
17
- X(RETRY_NOW, "retry-now") \
18
- X(RETRY_LATER, "retry-later") \
19
- X(INVALID_INPUT, "invalid-input") \
20
- X(NOT_ENABLED, "support") \
21
- X(AUTH, "auth") \
22
- X(CONN_STATE_INVALIDATED, "conn-state-invalidated") \
23
- X(CONSTRAINT_FAILURE, "item-only") \
24
- X(RETRY_EXP_BACKOFF, "retry-exp-backoff") \
25
- X(RETRY_LINEAR_BACKOFF, "retry-linear-backoff") \
26
- X(INTERNAL, "internal") \
27
- X(DCP, "dcp") \
28
- X(FETCH_CONFIG, "fetch-config") \
29
- X(SPECIAL_HANDLING, "special-handling")
30
-
31
- #define X(c, s) c,
32
- LCB_XERRMAP_ATTRIBUTES(X)
33
- #undef X
34
-
35
- INVALID_ATTRIBUTE
36
- };
37
-
38
- struct Error {
39
- uint16_t code;
40
- std::string shortname;
41
- std::string description;
42
- std::set<ErrorAttribute> attributes;
43
-
44
- Error() : code(-1) {
45
- }
46
-
47
- bool isValid() const {
48
- return code != uint16_t(-1);
49
- }
50
-
51
- bool hasAttribute(ErrorAttribute attr) const {
52
- return attributes.find(attr) != attributes.end();
53
- }
54
- };
55
-
56
- class ErrorMap {
57
- public:
58
- enum ParseStatus {
59
- /** Couldn't parse JSON!*/
60
- PARSE_ERROR,
61
-
62
- /** Version is too high */
63
- UNKNOWN_VERSION,
64
-
65
- /** Current version/revision is higher or equal */
66
- NOT_UPDATED,
67
-
68
- /** Updated */
69
- UPDATED
70
- };
71
-
72
- ErrorMap();
73
- ParseStatus parse(const char *s, size_t n, std::string& errmsg);
74
- ParseStatus parse(const char *s, size_t n) {
75
- std::string tmp;
76
- return parse(s, n, tmp);
77
- }
78
- size_t getVersion() const { return version; }
79
- size_t getRevision() const { return revision; };
80
- const Error& getError(uint16_t code) const;
81
- bool isLoaded() const {
82
- return !errors.empty();
83
- }
84
-
85
- private:
86
- static const uint32_t MAX_VERSION;
87
- ErrorMap(const ErrorMap&);
88
- typedef std::map<uint16_t, Error> MapType;
89
- MapType errors;
90
- uint32_t revision;
91
- uint32_t version;
92
- };
93
-
94
- } // namespace
95
- } // namespace
96
-
97
- typedef lcb::errmap::ErrorMap* lcb_pERRMAP;
98
- #else
99
- typedef struct lcb_ERRMAP* lcb_pERRMAP;
100
- #endif /* __cplusplus */
101
-
102
- #ifdef __cplusplus
103
- extern "C" {
104
- #endif
105
-
106
- lcb_pERRMAP lcb_errmap_new(void);
107
- void lcb_errmap_free(lcb_pERRMAP);
108
-
109
- #ifdef __cplusplus
110
- }
111
- #endif
112
-
113
- #endif /* LCB_ERRMAP_H */
@@ -1,177 +0,0 @@
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 "lcbht.h"
19
- #include "contrib/http_parser/http_parser.h"
20
- #include "settings.h"
21
-
22
- using namespace lcb::htparse;
23
-
24
-
25
- Parser::Parser(lcb_settings_st *settings_)
26
- : http_parser(), settings(settings_), lastcall(CB_NONE),
27
- last_body(0), last_bodylen(0), paused(false), is_ex(false) {
28
- lcb_settings_ref(settings);
29
- reset();
30
- }
31
-
32
- Parser::~Parser() {
33
- lcb_settings_unref(settings);
34
- }
35
-
36
- static int on_hdr_key(http_parser *pb, const char *s, size_t n) {
37
- return Parser::from_htp(pb)->on_hdr_key(s, n);
38
- }
39
- int Parser::on_hdr_key(const char *s, size_t n) {
40
- if (lastcall != CB_HDR_KEY) {
41
- /* new key */
42
- resp.headers.push_back(MimeHeader());
43
- }
44
-
45
- resp.headers.back().key.append(s, n);
46
- lastcall = CB_HDR_KEY;
47
- return 0;
48
- }
49
-
50
- static int on_hdr_value(http_parser *pb, const char *s, size_t n) {
51
- return Parser::from_htp(pb)->on_hdr_value(s, n);
52
- }
53
-
54
- int Parser::on_hdr_value(const char *s, size_t n) {
55
- MimeHeader *header = &resp.headers.back();
56
- header->value.append(s, n);
57
- lastcall = CB_HDR_VALUE;
58
- return 0;
59
- }
60
-
61
- static int on_hdr_done(http_parser *pb) {
62
- return Parser::from_htp(pb)->on_hdr_done();
63
- }
64
- int Parser::on_hdr_done() {
65
- resp.state |= S_HTSTATUS|S_HEADER;
66
-
67
- /* extract the status */
68
- resp.status = http_parser::status_code;
69
- lastcall = CB_HDR_DONE;
70
- return 0;
71
- }
72
-
73
- static int on_body(http_parser *pb, const char *s, size_t n) {
74
- return Parser::from_htp(pb)->on_body(s, n);
75
- }
76
- int Parser::on_body(const char *s, size_t n) {
77
- if (is_ex) {
78
- last_body = s;
79
- last_bodylen = n;
80
- paused = true;
81
- _lcb_http_parser_pause(this, 1);
82
- } else {
83
- resp.body.append(s, n);
84
- }
85
-
86
- lastcall = CB_BODY;
87
- resp.state |= S_BODY;
88
- return 0;
89
- }
90
-
91
- static int on_msg_done(http_parser *pb) {
92
- return Parser::from_htp(pb)->on_msg_done();
93
- }
94
-
95
- int Parser::on_msg_done() {
96
- resp.state |= S_DONE;
97
- return 0;
98
- }
99
-
100
-
101
- static struct http_parser_settings Parser_Settings = {
102
- NULL, /* msg_begin */
103
- NULL, /* on_url */
104
- ::on_hdr_key,
105
- ::on_hdr_value,
106
- ::on_hdr_done,
107
- ::on_body,
108
- ::on_msg_done
109
- };
110
-
111
- unsigned
112
- Parser::parse(const void *data_, size_t ndata) {
113
- is_ex = false;
114
- size_t nb = _lcb_http_parser_execute(this,
115
- &Parser_Settings,
116
- reinterpret_cast<const char *>(data_), ndata);
117
-
118
- if (nb != ndata) {
119
- resp.state |= S_ERROR;
120
- }
121
-
122
- return resp.state;
123
- }
124
-
125
- unsigned
126
- Parser::parse_ex(const void *data_, unsigned ndata,
127
- unsigned *nused, unsigned *nbody, const char **pbody)
128
- {
129
- is_ex = true;
130
- size_t nb = _lcb_http_parser_execute(this,
131
- &Parser_Settings, reinterpret_cast<const char*>(data_), ndata);
132
- if (nb != ndata) {
133
- if (paused) {
134
- _lcb_http_parser_pause(this, 0);
135
- paused = false;
136
- } else {
137
- resp.state |= S_ERROR;
138
- return resp.state;
139
- }
140
- }
141
-
142
- *nused = nb;
143
- *nbody = last_bodylen;
144
- *pbody = last_body;
145
-
146
- last_body = NULL;
147
- last_bodylen = 0;
148
- return resp.state;
149
- }
150
-
151
- bool Parser::can_keepalive() const {
152
- if (!(resp.state & S_DONE)) {
153
- return 0;
154
- }
155
-
156
- if (resp.state & S_ERROR) {
157
- return 0;
158
- }
159
-
160
- return _lcb_http_should_keep_alive(
161
- const_cast<http_parser*>(static_cast<const http_parser*>(this)));
162
- }
163
-
164
- void Parser::reset() {
165
- resp.clear();
166
- _lcb_http_parser_init(this, HTTP_RESPONSE);
167
- }
168
-
169
- const MimeHeader* Response::get_header(const std::string& key) const {
170
- std::list<MimeHeader>::const_iterator it;
171
- for (it = headers.begin(); it != headers.end(); ++it) {
172
- if (it->key == key) {
173
- return &*it;
174
- }
175
- }
176
- return NULL;
177
- }