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