libcouchbase 0.0.7 → 0.0.8
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/ext/libcouchbase/.gitignore +2 -0
- data/ext/libcouchbase/CMakeLists.txt +5 -7
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +49 -0
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +11 -0
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +2 -0
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +2 -1
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +2 -0
- data/ext/libcouchbase/cmake/defs.mk.in +0 -2
- data/ext/libcouchbase/cmake/source_files.cmake +34 -14
- data/ext/libcouchbase/configure.pl +1 -1
- data/ext/libcouchbase/contrib/genhash/genhash.h +6 -0
- data/ext/libcouchbase/include/libcouchbase/auth.h +10 -0
- data/ext/libcouchbase/include/libcouchbase/couchbase.h +10 -0
- data/ext/libcouchbase/include/libcouchbase/error.h +7 -0
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +13 -1
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +9 -0
- data/ext/libcouchbase/include/libcouchbase/views.h +7 -1
- data/ext/libcouchbase/include/libcouchbase/visibility.h +1 -0
- data/ext/libcouchbase/include/memcached/protocol_binary.h +21 -1132
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +3 -2
- data/ext/libcouchbase/src/README.md +0 -2
- data/ext/libcouchbase/src/auth-priv.h +1 -0
- data/ext/libcouchbase/src/auth.cc +10 -0
- data/ext/libcouchbase/src/bootstrap.cc +216 -0
- data/ext/libcouchbase/src/bootstrap.h +50 -39
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +455 -0
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +281 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +528 -0
- data/ext/libcouchbase/src/bucketconfig/bc_http.h +50 -25
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +115 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +407 -386
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +378 -0
- data/ext/libcouchbase/src/cbft.cc +22 -27
- data/ext/libcouchbase/src/cntl.cc +24 -24
- data/ext/libcouchbase/src/connspec.cc +30 -1
- data/ext/libcouchbase/src/connspec.h +17 -0
- data/ext/libcouchbase/src/dns-srv.cc +143 -0
- data/ext/libcouchbase/src/{dump.c → dump.cc} +8 -11
- data/ext/libcouchbase/src/getconfig.cc +73 -0
- data/ext/libcouchbase/src/handler.cc +84 -85
- data/ext/libcouchbase/src/hostlist.cc +0 -1
- data/ext/libcouchbase/src/hostlist.h +6 -1
- data/ext/libcouchbase/src/http/http-priv.h +125 -112
- data/ext/libcouchbase/src/http/http.cc +9 -29
- data/ext/libcouchbase/src/http/http.h +1 -34
- data/ext/libcouchbase/src/http/http_io.cc +22 -26
- data/ext/libcouchbase/src/instance.cc +102 -28
- data/ext/libcouchbase/src/internal.h +47 -29
- data/ext/libcouchbase/src/jsparse/parser.cc +146 -202
- data/ext/libcouchbase/src/jsparse/parser.h +91 -98
- data/ext/libcouchbase/src/lcbht/lcbht.cc +177 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +174 -163
- data/ext/libcouchbase/src/lcbio/connect.cc +562 -0
- data/ext/libcouchbase/src/lcbio/connect.h +9 -2
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +61 -16
- data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
- data/ext/libcouchbase/src/lcbio/manager.c +2 -2
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +87 -0
- data/ext/libcouchbase/src/mc/mcreq.h +9 -2
- data/ext/libcouchbase/src/mcserver/mcserver.cc +723 -0
- data/ext/libcouchbase/src/mcserver/mcserver.h +160 -70
- data/ext/libcouchbase/src/mcserver/negotiate.cc +118 -152
- data/ext/libcouchbase/src/mcserver/negotiate.h +85 -74
- data/ext/libcouchbase/src/mctx-helper.h +51 -0
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +1 -2
- data/ext/libcouchbase/src/n1ql/n1ql.cc +56 -32
- data/ext/libcouchbase/src/{newconfig.c → newconfig.cc} +42 -70
- data/ext/libcouchbase/src/nodeinfo.cc +4 -8
- data/ext/libcouchbase/src/operations/{cbflush.c → cbflush.cc} +7 -15
- data/ext/libcouchbase/src/operations/{counter.c → counter.cc} +0 -0
- data/ext/libcouchbase/src/operations/{durability-cas.c → durability-cas.cc} +92 -76
- data/ext/libcouchbase/src/operations/{durability-seqno.c → durability-seqno.cc} +55 -49
- data/ext/libcouchbase/src/operations/durability.cc +643 -0
- data/ext/libcouchbase/src/operations/durability_internal.h +212 -124
- data/ext/libcouchbase/src/operations/{get.c → get.cc} +24 -26
- data/ext/libcouchbase/src/operations/{observe-seqno.c → observe-seqno.cc} +5 -8
- data/ext/libcouchbase/src/operations/{observe.c → observe.cc} +69 -94
- data/ext/libcouchbase/src/operations/{pktfwd.c → pktfwd.cc} +0 -0
- data/ext/libcouchbase/src/operations/{remove.c → remove.cc} +0 -0
- data/ext/libcouchbase/src/operations/{stats.c → stats.cc} +66 -78
- data/ext/libcouchbase/src/operations/{store.c → store.cc} +27 -32
- data/ext/libcouchbase/src/operations/subdoc.cc +38 -18
- data/ext/libcouchbase/src/operations/{touch.c → touch.cc} +0 -0
- data/ext/libcouchbase/src/packetutils.h +200 -137
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/{retrychk.c → retrychk.cc} +3 -4
- data/ext/libcouchbase/src/retryq.cc +394 -0
- data/ext/libcouchbase/src/retryq.h +116 -104
- data/ext/libcouchbase/src/settings.h +2 -1
- data/ext/libcouchbase/src/ssl/ssl_c.c +1 -0
- data/ext/libcouchbase/src/ssl/ssl_e.c +0 -1
- data/ext/libcouchbase/src/trace.h +8 -8
- data/ext/libcouchbase/src/vbucket/vbucket.c +0 -1
- data/ext/libcouchbase/src/views/{docreq.c → docreq.cc} +48 -54
- data/ext/libcouchbase/src/views/docreq.h +24 -30
- data/ext/libcouchbase/src/views/viewreq.cc +318 -0
- data/ext/libcouchbase/src/views/viewreq.h +43 -13
- data/ext/libcouchbase/src/{wait.c → wait.cc} +12 -17
- data/ext/libcouchbase/tests/basic/t_connstr.cc +89 -50
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +27 -78
- data/ext/libcouchbase/tests/basic/t_packet.cc +35 -42
- data/ext/libcouchbase/tests/htparse/t_basic.cc +58 -78
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +94 -111
- data/ext/libcouchbase/tests/iotests/t_sched.cc +1 -2
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
- data/lib/libcouchbase/version.rb +1 -1
- metadata +36 -39
- data/ext/libcouchbase/include/memcached/vbucket.h +0 -42
- data/ext/libcouchbase/src/bootstrap.c +0 -269
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.c +0 -495
- data/ext/libcouchbase/src/bucketconfig/bc_file.c +0 -347
- data/ext/libcouchbase/src/bucketconfig/bc_http.c +0 -630
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +0 -150
- data/ext/libcouchbase/src/bucketconfig/confmon.c +0 -474
- data/ext/libcouchbase/src/getconfig.c +0 -100
- data/ext/libcouchbase/src/lcbht/lcbht.c +0 -282
- data/ext/libcouchbase/src/lcbio/connect.c +0 -557
- data/ext/libcouchbase/src/mcserver/mcserver.c +0 -784
- data/ext/libcouchbase/src/operations/durability.c +0 -668
- data/ext/libcouchbase/src/packetutils.c +0 -60
- data/ext/libcouchbase/src/retryq.c +0 -424
- data/ext/libcouchbase/src/simplestring.c +0 -211
- data/ext/libcouchbase/src/simplestring.h +0 -228
- data/ext/libcouchbase/src/ssobuf.h +0 -82
- data/ext/libcouchbase/src/views/viewreq.c +0 -358
- data/ext/libcouchbase/tests/basic/t_string.cc +0 -112
|
@@ -8,8 +8,13 @@
|
|
|
8
8
|
class JsonParseTest : public ::testing::Test {
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
+
using namespace lcb::jsparse;
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
static std::string iov2s(const lcb_IOV& iov) {
|
|
14
|
+
return std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
struct Context : Parser::Actions {
|
|
13
18
|
lcb_error_t rc;
|
|
14
19
|
bool received_done;
|
|
15
20
|
std::string meta;
|
|
@@ -23,115 +28,59 @@ struct Context {
|
|
|
23
28
|
meta.clear();
|
|
24
29
|
rows.clear();
|
|
25
30
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
class Parser {
|
|
29
|
-
public:
|
|
30
|
-
Parser(int mode_) : mode(mode_), inner(NULL) {
|
|
31
|
-
reset();
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
void reset() {
|
|
35
|
-
if (inner != NULL) {
|
|
36
|
-
lcbjsp_free(inner);
|
|
37
|
-
}
|
|
38
|
-
inner = lcbjsp_create(mode);
|
|
31
|
+
void JSPARSE_on_row(const Row& row) {
|
|
32
|
+
rows.push_back(iov2s(row.row));
|
|
39
33
|
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
lcbjsp_free(inner);
|
|
44
|
-
}
|
|
34
|
+
void JSPARSE_on_complete(const std::string& s) {
|
|
35
|
+
meta.assign(s);
|
|
36
|
+
received_done = true;
|
|
45
37
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
lcbjsp_PARSER *getInner() {
|
|
52
|
-
return inner;
|
|
38
|
+
void JSPARSE_on_error(const std::string&) {
|
|
39
|
+
rc = LCB_PROTOCOL_ERROR;
|
|
40
|
+
received_done = true;
|
|
53
41
|
}
|
|
54
|
-
|
|
55
|
-
private:
|
|
56
|
-
int mode;
|
|
57
|
-
lcbjsp_PARSER *inner;
|
|
58
|
-
Parser(Parser&);
|
|
59
42
|
};
|
|
60
43
|
|
|
61
|
-
static
|
|
62
|
-
return std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
extern "C" {
|
|
66
|
-
static void rowCallback(lcbjsp_PARSER *parser, const lcbjsp_ROW *row) {
|
|
67
|
-
Context *ctx = reinterpret_cast<Context*>(parser->data);
|
|
68
|
-
if (row->type == LCBJSP_TYPE_ERROR) {
|
|
69
|
-
ctx->rc = LCB_PROTOCOL_ERROR;
|
|
70
|
-
ctx->received_done = true;
|
|
71
|
-
} else if (row->type == LCBJSP_TYPE_ROW) {
|
|
72
|
-
ctx->rows.push_back(iov2s(row->row));
|
|
73
|
-
} else if (row->type == LCBJSP_TYPE_COMPLETE) {
|
|
74
|
-
ctx->meta = iov2s(row->row);
|
|
75
|
-
ctx->received_done = true;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
static bool validateJsonRows(const char *txt, size_t ntxt, int mode)
|
|
44
|
+
static bool validateJsonRows(const char *txt, size_t ntxt, Parser::Mode mode)
|
|
81
45
|
{
|
|
82
|
-
Parser parser(mode);
|
|
83
|
-
EXPECT_TRUE(parser != NULL);
|
|
84
|
-
if (parser == NULL) {
|
|
85
|
-
return false;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Feed it once
|
|
89
46
|
Context cx;
|
|
90
|
-
parser
|
|
91
|
-
parser.getInner()->data = &cx;
|
|
47
|
+
Parser parser(mode, &cx);
|
|
92
48
|
|
|
93
49
|
for (size_t ii = 0; ii < ntxt; ii++) {
|
|
94
|
-
|
|
50
|
+
parser.feed(txt + ii, 1);
|
|
95
51
|
}
|
|
96
52
|
EXPECT_EQ(LCB_SUCCESS, cx.rc);
|
|
97
53
|
|
|
98
54
|
lcb_IOV out;
|
|
99
|
-
|
|
55
|
+
parser.get_postmortem(out);
|
|
100
56
|
EXPECT_EQ(cx.meta, iov2s(out));
|
|
101
57
|
Json::Value root;
|
|
102
58
|
EXPECT_TRUE(Json::Reader().parse(cx.meta, root));
|
|
103
59
|
return true;
|
|
104
60
|
}
|
|
105
61
|
|
|
106
|
-
static bool validateBadParse(const char *txt, size_t ntxt,
|
|
62
|
+
static bool validateBadParse(const char *txt, size_t ntxt, Parser::Mode mode)
|
|
107
63
|
{
|
|
108
|
-
Parser p(mode);
|
|
109
64
|
Context cx;
|
|
110
|
-
p
|
|
111
|
-
p.
|
|
112
|
-
lcbjsp_feed(p, JSON_fts_bad, sizeof(JSON_fts_bad));
|
|
65
|
+
Parser p(mode, &cx);
|
|
66
|
+
p.feed(JSON_fts_bad, sizeof(JSON_fts_bad));
|
|
113
67
|
EXPECT_EQ(LCB_PROTOCOL_ERROR, cx.rc);
|
|
114
68
|
|
|
115
69
|
p.reset();
|
|
116
70
|
cx.reset();
|
|
117
71
|
|
|
118
|
-
p.getInner()->callback = rowCallback;
|
|
119
|
-
p.getInner()->data = &cx;
|
|
120
|
-
|
|
121
|
-
for (size_t ii = 0; ii < ntxt; ++ii) {
|
|
122
|
-
}
|
|
123
72
|
return true;
|
|
124
73
|
}
|
|
125
74
|
|
|
126
75
|
TEST_F(JsonParseTest, testFTS)
|
|
127
76
|
{
|
|
128
|
-
ASSERT_TRUE(validateJsonRows(JSON_fts_good, sizeof(JSON_fts_good),
|
|
129
|
-
ASSERT_TRUE(validateBadParse(JSON_fts_bad, sizeof(JSON_fts_bad),
|
|
130
|
-
ASSERT_TRUE(validateBadParse(JSON_fts_bad2, sizeof(JSON_fts_bad2),
|
|
77
|
+
ASSERT_TRUE(validateJsonRows(JSON_fts_good, sizeof(JSON_fts_good), Parser::MODE_FTS));
|
|
78
|
+
ASSERT_TRUE(validateBadParse(JSON_fts_bad, sizeof(JSON_fts_bad), Parser::MODE_FTS));
|
|
79
|
+
ASSERT_TRUE(validateBadParse(JSON_fts_bad2, sizeof(JSON_fts_bad2), Parser::MODE_FTS));
|
|
131
80
|
}
|
|
132
81
|
|
|
133
82
|
TEST_F(JsonParseTest, testN1QL) {
|
|
134
|
-
ASSERT_TRUE(validateJsonRows(JSON_n1ql_nonempty, sizeof(JSON_n1ql_nonempty),
|
|
135
|
-
ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty),
|
|
136
|
-
ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad),
|
|
83
|
+
ASSERT_TRUE(validateJsonRows(JSON_n1ql_nonempty, sizeof(JSON_n1ql_nonempty), Parser::MODE_N1QL));
|
|
84
|
+
ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty), Parser::MODE_N1QL));
|
|
85
|
+
ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad), Parser::MODE_N1QL));
|
|
137
86
|
}
|
|
@@ -135,23 +135,22 @@ TEST_F(Packet, testParseBasic)
|
|
|
135
135
|
pkt.getq(value, 0);
|
|
136
136
|
pkt.rbWrite(&ior);
|
|
137
137
|
|
|
138
|
-
|
|
138
|
+
lcb::MemcachedResponse pi;
|
|
139
139
|
memset(&pi, 0, sizeof(pi));
|
|
140
140
|
unsigned wanted;
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
ASSERT_EQ(
|
|
145
|
-
ASSERT_EQ(
|
|
146
|
-
ASSERT_EQ(
|
|
147
|
-
ASSERT_EQ(
|
|
148
|
-
ASSERT_EQ(
|
|
149
|
-
ASSERT_EQ(
|
|
150
|
-
ASSERT_EQ(
|
|
151
|
-
ASSERT_EQ(
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
lcb_pktinfo_ior_done(&pi, &ior);
|
|
141
|
+
ASSERT_TRUE(pi.load(&ior, &wanted));
|
|
142
|
+
|
|
143
|
+
ASSERT_EQ(0, pi.status());
|
|
144
|
+
ASSERT_EQ(PROTOCOL_BINARY_CMD_GETQ, pi.opcode());
|
|
145
|
+
ASSERT_EQ(0, pi.opaque());
|
|
146
|
+
ASSERT_EQ(7, pi.bodylen());
|
|
147
|
+
ASSERT_EQ(3, pi.vallen());
|
|
148
|
+
ASSERT_EQ(0, pi.keylen());
|
|
149
|
+
ASSERT_EQ(4, pi.extlen());
|
|
150
|
+
ASSERT_EQ(pi.bodylen(), rdb_get_nused(&ior));
|
|
151
|
+
ASSERT_EQ(0, strncmp(value.c_str(), pi.value(), 3));
|
|
152
|
+
|
|
153
|
+
pi.release(&ior);
|
|
155
154
|
ASSERT_EQ(0, rdb_get_nused(&ior));
|
|
156
155
|
rdb_cleanup(&ior);
|
|
157
156
|
}
|
|
@@ -165,26 +164,22 @@ TEST_F(Packet, testParsePartial)
|
|
|
165
164
|
std::string value;
|
|
166
165
|
value.insert(0, 1024, '*');
|
|
167
166
|
|
|
168
|
-
|
|
169
|
-
int rv;
|
|
167
|
+
lcb::MemcachedResponse pi;
|
|
170
168
|
|
|
171
169
|
// Test where we're missing just one byte
|
|
172
170
|
pkt.writeGenericHeader(10, &ior);
|
|
173
171
|
unsigned wanted;
|
|
174
|
-
|
|
175
|
-
ASSERT_EQ(0, rv);
|
|
172
|
+
ASSERT_FALSE(pi.load(&ior, &wanted));
|
|
176
173
|
|
|
177
174
|
for (int ii = 0; ii < 9; ii++) {
|
|
178
175
|
char c = 'O';
|
|
179
176
|
rdb_copywrite(&ior, &c, 1);
|
|
180
|
-
|
|
181
|
-
ASSERT_EQ(0, rv);
|
|
177
|
+
ASSERT_FALSE(pi.load(&ior, &wanted));
|
|
182
178
|
}
|
|
183
179
|
char tmp = 'O';
|
|
184
180
|
rdb_copywrite(&ior, &tmp, 1);
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
lcb_pktinfo_ior_done(&pi, &ior);
|
|
181
|
+
ASSERT_TRUE(pi.load(&ior, &wanted));
|
|
182
|
+
pi.release(&ior);
|
|
188
183
|
rdb_cleanup(&ior);
|
|
189
184
|
}
|
|
190
185
|
|
|
@@ -199,24 +194,22 @@ TEST_F(Packet, testKeys)
|
|
|
199
194
|
pkt.get(key, value, 1000, PROTOCOL_BINARY_RESPONSE_ETMPFAIL, 0xdeadbeef, 50);
|
|
200
195
|
pkt.rbWrite(&ior);
|
|
201
196
|
|
|
202
|
-
|
|
203
|
-
memset(&pi, 0, sizeof(pi));
|
|
197
|
+
lcb::MemcachedResponse pi;
|
|
204
198
|
unsigned wanted;
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
ASSERT_EQ(key.
|
|
209
|
-
ASSERT_EQ(
|
|
210
|
-
ASSERT_EQ(value.
|
|
211
|
-
ASSERT_EQ(
|
|
212
|
-
ASSERT_EQ(
|
|
213
|
-
ASSERT_EQ(
|
|
214
|
-
ASSERT_EQ(
|
|
215
|
-
ASSERT_EQ(4,
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
lcb_pktinfo_ior_done(&pi, &ior);
|
|
199
|
+
ASSERT_TRUE(pi.load(&ior, &wanted));
|
|
200
|
+
|
|
201
|
+
ASSERT_EQ(key.size(), pi.keylen());
|
|
202
|
+
ASSERT_EQ(0, memcmp(key.c_str(), pi.key(), pi.keylen()));
|
|
203
|
+
ASSERT_EQ(value.size(), pi.vallen());
|
|
204
|
+
ASSERT_EQ(0, memcmp(value.c_str(), pi.value(), pi.vallen()));
|
|
205
|
+
ASSERT_EQ(0xdeadbeef, pi.cas());
|
|
206
|
+
ASSERT_EQ(PROTOCOL_BINARY_RESPONSE_ETMPFAIL, pi.status());
|
|
207
|
+
ASSERT_EQ(PROTOCOL_BINARY_CMD_GET, pi.opcode());
|
|
208
|
+
ASSERT_EQ(4, pi.extlen());
|
|
209
|
+
ASSERT_EQ(4 + key.size() + value.size(), pi.bodylen());
|
|
210
|
+
ASSERT_NE(pi.body<const char*>(), pi.value());
|
|
211
|
+
ASSERT_EQ(4 + key.size(), pi.value() - pi.body<const char*>());
|
|
212
|
+
|
|
213
|
+
pi.release(&ior);
|
|
221
214
|
rdb_cleanup(&ior);
|
|
222
215
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
#include "settings.h"
|
|
6
6
|
|
|
7
7
|
using std::string;
|
|
8
|
+
using namespace lcb::htparse;
|
|
8
9
|
|
|
9
10
|
class HtparseTest : public ::testing::Test {
|
|
10
11
|
};
|
|
@@ -13,52 +14,51 @@ TEST_F(HtparseTest, testBasic)
|
|
|
13
14
|
{
|
|
14
15
|
lcb_settings *settings = lcb_settings_new();
|
|
15
16
|
// Allocate a parser
|
|
16
|
-
|
|
17
|
+
Parser *parser = new Parser(settings);
|
|
17
18
|
ASSERT_FALSE(parser == NULL);
|
|
18
19
|
|
|
19
20
|
// Feed the parser some stuff
|
|
20
|
-
|
|
21
|
+
unsigned state;
|
|
21
22
|
|
|
22
23
|
string buf;
|
|
23
24
|
buf = "HTTP/1.0 200 OK\r\n";
|
|
24
25
|
|
|
25
|
-
state =
|
|
26
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
26
27
|
ASSERT_EQ(0, state);
|
|
27
28
|
|
|
28
29
|
buf = "Connec";
|
|
29
|
-
state =
|
|
30
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
30
31
|
ASSERT_EQ(0, state);
|
|
31
32
|
buf = "tion: Keep-Alive\r\n";
|
|
32
|
-
state =
|
|
33
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
33
34
|
ASSERT_EQ(0, state);
|
|
34
35
|
buf += "Content-Length: 5\r\n\r\n";
|
|
35
|
-
state =
|
|
36
|
-
ASSERT_EQ(
|
|
36
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
37
|
+
ASSERT_EQ(Parser::S_HEADER|Parser::S_HTSTATUS, state);
|
|
37
38
|
|
|
38
|
-
|
|
39
|
-
ASSERT_EQ(200, resp
|
|
39
|
+
Response& resp = parser->get_cur_response();
|
|
40
|
+
ASSERT_EQ(200, resp.status);
|
|
40
41
|
|
|
41
42
|
// Add some data into the body
|
|
42
43
|
buf = "H";
|
|
43
|
-
state =
|
|
44
|
-
ASSERT_EQ(0, state &
|
|
45
|
-
|
|
44
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
45
|
+
ASSERT_EQ(0, state & Parser::S_ERROR);
|
|
46
|
+
ASSERT_EQ("H", resp.body);
|
|
46
47
|
|
|
47
48
|
buf = "ello";
|
|
48
|
-
state =
|
|
49
|
-
ASSERT_NE(0, state &
|
|
50
|
-
|
|
49
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
50
|
+
ASSERT_NE(0, state & Parser::S_DONE);
|
|
51
|
+
ASSERT_EQ("Hello", resp.body);
|
|
51
52
|
|
|
52
53
|
// Now find the header
|
|
53
|
-
|
|
54
|
-
lcbht_free(parser);
|
|
54
|
+
delete parser;
|
|
55
55
|
lcb_settings_unref(settings);
|
|
56
56
|
}
|
|
57
57
|
|
|
58
58
|
TEST_F(HtparseTest, testHeaderFunctions)
|
|
59
59
|
{
|
|
60
60
|
lcb_settings *settings = lcb_settings_new();
|
|
61
|
-
|
|
61
|
+
Parser *parser = new Parser(settings);
|
|
62
62
|
|
|
63
63
|
string buf = "HTTP/1.0 200 OK\r\n"
|
|
64
64
|
"Connection: keep-alive\r\n"
|
|
@@ -66,45 +66,28 @@ TEST_F(HtparseTest, testHeaderFunctions)
|
|
|
66
66
|
"Content-Type: application/json\r\n"
|
|
67
67
|
"Content-Length: 0\r\n"
|
|
68
68
|
"\r\n";
|
|
69
|
-
|
|
70
|
-
state =
|
|
71
|
-
ASSERT_NE(0, state &
|
|
69
|
+
unsigned state;
|
|
70
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
71
|
+
ASSERT_NE(0, state & Parser::S_DONE);
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
Response &resp = parser->get_cur_response();
|
|
74
74
|
// Now fine the header value stuff
|
|
75
|
-
ASSERT_STREQ("keep-alive",
|
|
76
|
-
ASSERT_STREQ("dummy/1.0",
|
|
77
|
-
ASSERT_STREQ("application/json",
|
|
78
|
-
|
|
79
|
-
using std::map;
|
|
80
|
-
map<string,string> hdrmap;
|
|
81
|
-
char **hdrlist = lcbht_make_resphdrlist(resp);
|
|
82
|
-
for (char **cur = hdrlist; *cur != NULL; cur += 2) {
|
|
83
|
-
string k = cur[0];
|
|
84
|
-
string v = cur[1];
|
|
85
|
-
hdrmap[k] = v;
|
|
86
|
-
free(cur[0]);
|
|
87
|
-
free(cur[1]);
|
|
88
|
-
}
|
|
89
|
-
free(hdrlist);
|
|
90
|
-
|
|
91
|
-
ASSERT_EQ("keep-alive", hdrmap["Connection"]);
|
|
92
|
-
ASSERT_EQ("dummy/1.0", hdrmap["X-Server"]);
|
|
93
|
-
ASSERT_EQ("application/json", hdrmap["Content-Type"]);
|
|
94
|
-
|
|
95
|
-
lcbht_free(parser);
|
|
75
|
+
ASSERT_STREQ("keep-alive", resp.get_header_value("Connection"));
|
|
76
|
+
ASSERT_STREQ("dummy/1.0", resp.get_header_value("X-Server"));
|
|
77
|
+
ASSERT_STREQ("application/json", resp.get_header_value("Content-Type"));
|
|
78
|
+
delete parser;
|
|
96
79
|
lcb_settings_unref(settings);
|
|
97
80
|
}
|
|
98
81
|
|
|
99
82
|
TEST_F(HtparseTest, testParseErrors)
|
|
100
83
|
{
|
|
101
84
|
lcb_settings *settings = lcb_settings_new();
|
|
102
|
-
|
|
85
|
+
Parser *parser = new Parser(settings);
|
|
103
86
|
|
|
104
87
|
string buf = "blahblahblah";
|
|
105
|
-
|
|
106
|
-
ASSERT_NE(0, state &
|
|
107
|
-
|
|
88
|
+
unsigned state = parser->parse(buf.c_str(), buf.size());
|
|
89
|
+
ASSERT_NE(0, state & Parser::S_ERROR);
|
|
90
|
+
delete parser;
|
|
108
91
|
lcb_settings_unref(settings);
|
|
109
92
|
}
|
|
110
93
|
|
|
@@ -112,8 +95,7 @@ TEST_F(HtparseTest, testParseErrors)
|
|
|
112
95
|
TEST_F(HtparseTest, testParseExtended)
|
|
113
96
|
{
|
|
114
97
|
lcb_settings *settings = lcb_settings_new();
|
|
115
|
-
|
|
116
|
-
lcbht_RESPONSE *resp;
|
|
98
|
+
Parser *parser = new Parser(settings);
|
|
117
99
|
|
|
118
100
|
const char *body;
|
|
119
101
|
unsigned nbody, nused;
|
|
@@ -122,18 +104,18 @@ TEST_F(HtparseTest, testParseExtended)
|
|
|
122
104
|
"Connection: keep-alive\r\n"
|
|
123
105
|
"Content-Length: 5\r\n";
|
|
124
106
|
|
|
125
|
-
|
|
126
|
-
state =
|
|
127
|
-
ASSERT_EQ(0, state &
|
|
107
|
+
unsigned state;
|
|
108
|
+
state = parser->parse_ex(buf.c_str(), buf.size(), &nused, &nbody, &body);
|
|
109
|
+
ASSERT_EQ(0, state & Parser::S_ERROR);
|
|
128
110
|
ASSERT_EQ(NULL, body);
|
|
129
111
|
ASSERT_EQ(buf.size(), nused);
|
|
130
112
|
ASSERT_EQ(0, nbody);
|
|
131
113
|
|
|
132
|
-
resp =
|
|
114
|
+
Response& resp = parser->get_cur_response();
|
|
133
115
|
buf = "\r\nHello";
|
|
134
116
|
// Feed the buffer
|
|
135
|
-
state =
|
|
136
|
-
ASSERT_EQ(0, state &
|
|
117
|
+
state = parser->parse_ex(buf.c_str(), buf.size(), &nused, &nbody, &body);
|
|
118
|
+
ASSERT_EQ(0, state & Parser::S_DONE);
|
|
137
119
|
ASSERT_EQ(5, nbody);
|
|
138
120
|
ASSERT_FALSE(NULL == body);
|
|
139
121
|
ASSERT_STREQ("Hello", body);
|
|
@@ -142,52 +124,50 @@ TEST_F(HtparseTest, testParseExtended)
|
|
|
142
124
|
size_t off = nused;
|
|
143
125
|
|
|
144
126
|
// Parse again
|
|
145
|
-
state =
|
|
127
|
+
state = parser->parse_ex(buf.c_str()+off, buf.size()-off, &nused, &nbody, &body);
|
|
146
128
|
ASSERT_EQ(nused, buf.size()-off);
|
|
147
129
|
ASSERT_TRUE(body == NULL);
|
|
148
130
|
ASSERT_EQ(0, nbody);
|
|
149
|
-
ASSERT_NE(0, state &
|
|
150
|
-
ASSERT_EQ(0, state &
|
|
151
|
-
ASSERT_EQ(0, resp
|
|
152
|
-
|
|
153
|
-
lcbht_free(parser);
|
|
131
|
+
ASSERT_NE(0, state & Parser::S_DONE);
|
|
132
|
+
ASSERT_EQ(0, state & Parser::S_ERROR);
|
|
133
|
+
ASSERT_EQ(0, resp.body.size());
|
|
134
|
+
delete parser;
|
|
154
135
|
lcb_settings_unref(settings);
|
|
155
136
|
}
|
|
156
137
|
|
|
157
138
|
TEST_F(HtparseTest, testCanKeepalive)
|
|
158
139
|
{
|
|
159
140
|
lcb_settings *settings = lcb_settings_new();
|
|
160
|
-
|
|
141
|
+
Parser *parser = new Parser(settings);
|
|
161
142
|
string buf = "HTTP/1.0 200 OK\r\n"
|
|
162
143
|
"Content-Length: 0\r\n"
|
|
163
144
|
"\r\n";
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
ASSERT_EQ(0, lcbht_can_keepalive(parser));
|
|
145
|
+
unsigned state = parser->parse(buf.c_str(), buf.size());
|
|
146
|
+
ASSERT_NE(0, state & Parser::S_DONE);
|
|
147
|
+
ASSERT_EQ(0, state & Parser::S_ERROR);
|
|
148
|
+
ASSERT_FALSE(parser->can_keepalive());
|
|
169
149
|
|
|
170
150
|
// Use HTTP/1.1 with Connection: close
|
|
171
|
-
|
|
151
|
+
parser->reset();
|
|
172
152
|
buf = "HTTP/1.1 200 OK\r\n"
|
|
173
153
|
"Content-Length: 0\r\n"
|
|
174
154
|
"Connection: close\r\n"
|
|
175
155
|
"\r\n";
|
|
176
|
-
state =
|
|
177
|
-
ASSERT_NE(0, state &
|
|
178
|
-
ASSERT_EQ(0, state &
|
|
179
|
-
|
|
156
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
157
|
+
ASSERT_NE(0, state & Parser::S_DONE);
|
|
158
|
+
ASSERT_EQ(0, state & Parser::S_ERROR);
|
|
159
|
+
ASSERT_FALSE(parser->can_keepalive());
|
|
180
160
|
|
|
181
|
-
|
|
161
|
+
parser->reset();
|
|
182
162
|
// Default HTTP/1.1
|
|
183
163
|
buf = "HTTP/1.1 200 OK\r\n"
|
|
184
164
|
"Content-Length: 0\r\n"
|
|
185
165
|
"\r\n";
|
|
186
|
-
state =
|
|
187
|
-
ASSERT_NE(0, state &
|
|
188
|
-
ASSERT_EQ(0, state &
|
|
189
|
-
|
|
166
|
+
state = parser->parse(buf.c_str(), buf.size());
|
|
167
|
+
ASSERT_NE(0, state & Parser::S_DONE);
|
|
168
|
+
ASSERT_EQ(0, state & Parser::S_ERROR);
|
|
169
|
+
ASSERT_TRUE(parser->can_keepalive());
|
|
190
170
|
|
|
191
|
-
|
|
171
|
+
delete parser;
|
|
192
172
|
lcb_settings_unref(settings);
|
|
193
173
|
}
|