libcouchbase 0.2.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.travis.yml +1 -1
- data/README.md +1 -1
- data/ext/libcouchbase/CMakeLists.txt +8 -6
- data/ext/libcouchbase/README.markdown +2 -2
- data/ext/libcouchbase/RELEASE_NOTES.markdown +0 -86
- data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +0 -11
- data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +0 -2
- data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +1 -2
- data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
- data/ext/libcouchbase/cmake/config-cmake.h.in +0 -2
- data/ext/libcouchbase/cmake/defs.mk.in +2 -0
- data/ext/libcouchbase/cmake/source_files.cmake +5 -21
- data/ext/libcouchbase/include/libcouchbase/auth.h +0 -10
- data/ext/libcouchbase/include/libcouchbase/cntl.h +1 -27
- data/ext/libcouchbase/include/libcouchbase/error.h +1 -15
- data/ext/libcouchbase/include/libcouchbase/n1ql.h +1 -13
- data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
- data/ext/libcouchbase/include/libcouchbase/subdoc.h +0 -9
- data/ext/libcouchbase/include/libcouchbase/views.h +1 -7
- data/ext/libcouchbase/include/libcouchbase/visibility.h +0 -1
- data/ext/libcouchbase/include/memcached/protocol_binary.h +1131 -29
- data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
- data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
- data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +2 -3
- data/ext/libcouchbase/src/README.md +2 -0
- data/ext/libcouchbase/src/auth-priv.h +0 -1
- data/ext/libcouchbase/src/auth.cc +4 -10
- data/ext/libcouchbase/src/bootstrap.c +269 -0
- data/ext/libcouchbase/src/bootstrap.h +39 -50
- data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +117 -84
- 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 +25 -50
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
- data/ext/libcouchbase/src/bucketconfig/clconfig.h +386 -407
- data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
- data/ext/libcouchbase/src/cbft.cc +27 -22
- data/ext/libcouchbase/src/cntl.cc +19 -30
- data/ext/libcouchbase/src/connspec.cc +1 -48
- data/ext/libcouchbase/src/connspec.h +0 -27
- data/ext/libcouchbase/src/dump.cc +2 -2
- data/ext/libcouchbase/src/getconfig.cc +33 -7
- data/ext/libcouchbase/src/handler.cc +2 -0
- data/ext/libcouchbase/src/hostlist.cc +36 -0
- data/ext/libcouchbase/src/hostlist.h +62 -41
- data/ext/libcouchbase/src/http/http-priv.h +112 -125
- data/ext/libcouchbase/src/http/http.cc +30 -15
- data/ext/libcouchbase/src/http/http.h +34 -1
- data/ext/libcouchbase/src/http/http_io.cc +26 -22
- data/ext/libcouchbase/src/instance.cc +23 -94
- data/ext/libcouchbase/src/internal.h +26 -52
- data/ext/libcouchbase/src/jsparse/parser.cc +202 -146
- data/ext/libcouchbase/src/jsparse/parser.h +98 -91
- data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
- data/ext/libcouchbase/src/lcbht/lcbht.h +163 -174
- data/ext/libcouchbase/src/lcbio/connect.c +557 -0
- data/ext/libcouchbase/src/lcbio/connect.h +2 -9
- data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
- data/ext/libcouchbase/src/lcbio/iotable.h +16 -61
- data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
- data/ext/libcouchbase/src/lcbio/manager.c +2 -2
- data/ext/libcouchbase/src/mc/mcreq.h +2 -9
- data/ext/libcouchbase/src/mcserver/mcserver.cc +34 -143
- data/ext/libcouchbase/src/mcserver/mcserver.h +12 -7
- data/ext/libcouchbase/src/mcserver/negotiate.cc +38 -132
- data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
- data/ext/libcouchbase/src/n1ql/n1ql.cc +32 -56
- data/ext/libcouchbase/src/newconfig.cc +6 -6
- data/ext/libcouchbase/src/nodeinfo.cc +2 -2
- data/ext/libcouchbase/src/operations/{cbflush.cc → cbflush.c} +15 -7
- data/ext/libcouchbase/src/operations/{counter.cc → counter.c} +0 -0
- data/ext/libcouchbase/src/operations/durability.cc +26 -6
- data/ext/libcouchbase/src/operations/durability_internal.h +3 -6
- data/ext/libcouchbase/src/operations/{get.cc → get.c} +26 -24
- data/ext/libcouchbase/src/operations/{observe.cc → observe.c} +93 -68
- data/ext/libcouchbase/src/operations/{pktfwd.cc → pktfwd.c} +0 -0
- data/ext/libcouchbase/src/operations/{remove.cc → remove.c} +0 -0
- data/ext/libcouchbase/src/operations/stats.cc +8 -3
- data/ext/libcouchbase/src/operations/{store.cc → store.c} +32 -27
- data/ext/libcouchbase/src/operations/subdoc.cc +18 -38
- data/ext/libcouchbase/src/operations/{touch.cc → touch.c} +0 -0
- data/ext/libcouchbase/src/packetutils.c +37 -0
- data/ext/libcouchbase/src/packetutils.h +2 -2
- data/ext/libcouchbase/src/probes.d +1 -1
- data/ext/libcouchbase/src/{retrychk.cc → retrychk.c} +3 -2
- data/ext/libcouchbase/src/retryq.cc +4 -4
- data/ext/libcouchbase/src/settings.c +0 -3
- data/ext/libcouchbase/src/settings.h +0 -5
- data/ext/libcouchbase/src/simplestring.c +211 -0
- data/ext/libcouchbase/src/simplestring.h +228 -0
- data/ext/libcouchbase/src/ssl/ssl_c.c +0 -1
- data/ext/libcouchbase/src/ssl/ssl_common.c +0 -2
- data/ext/libcouchbase/src/ssl/ssl_e.c +1 -0
- data/ext/libcouchbase/src/ssobuf.h +82 -0
- data/ext/libcouchbase/src/trace.h +4 -4
- data/ext/libcouchbase/src/vbucket/vbucket.c +1 -0
- data/ext/libcouchbase/src/views/{docreq.cc → docreq.c} +54 -48
- data/ext/libcouchbase/src/views/docreq.h +30 -24
- data/ext/libcouchbase/src/views/viewreq.c +358 -0
- data/ext/libcouchbase/src/views/viewreq.h +13 -43
- data/ext/libcouchbase/tests/basic/t_connstr.cc +50 -89
- data/ext/libcouchbase/tests/basic/t_host.cc +75 -67
- data/ext/libcouchbase/tests/basic/t_jsparse.cc +78 -27
- data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
- data/ext/libcouchbase/tests/htparse/t_basic.cc +78 -58
- data/ext/libcouchbase/tests/iotests/mock-environment.h +1 -2
- data/ext/libcouchbase/tests/iotests/t_confmon.cc +114 -96
- data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
- data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
- data/lib/libcouchbase/ext/tasks.rb +6 -2
- data/lib/libcouchbase/query_view.rb +1 -1
- data/lib/libcouchbase/results_fiber.rb +6 -6
- data/lib/libcouchbase/version.rb +1 -1
- metadata +26 -26
- data/ext/libcouchbase/src/bootstrap.cc +0 -216
- data/ext/libcouchbase/src/bucketconfig/bc_file.cc +0 -281
- data/ext/libcouchbase/src/bucketconfig/bc_http.cc +0 -528
- data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +0 -115
- data/ext/libcouchbase/src/bucketconfig/confmon.cc +0 -378
- data/ext/libcouchbase/src/dns-srv.cc +0 -142
- data/ext/libcouchbase/src/errmap.cc +0 -107
- data/ext/libcouchbase/src/errmap.h +0 -113
- data/ext/libcouchbase/src/lcbht/lcbht.cc +0 -177
- data/ext/libcouchbase/src/lcbio/connect.cc +0 -562
- data/ext/libcouchbase/src/lcbio/timer-cxx.h +0 -87
- data/ext/libcouchbase/src/mctx-helper.h +0 -51
- data/ext/libcouchbase/src/views/viewreq.cc +0 -318
- data/ext/libcouchbase/tests/iotests/t_errmap.cc +0 -97
|
@@ -8,13 +8,8 @@
|
|
|
8
8
|
class JsonParseTest : public ::testing::Test {
|
|
9
9
|
};
|
|
10
10
|
|
|
11
|
-
using namespace lcb::jsparse;
|
|
12
11
|
|
|
13
|
-
|
|
14
|
-
return std::string(reinterpret_cast<const char*>(iov.iov_base), iov.iov_len);
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
struct Context : Parser::Actions {
|
|
12
|
+
struct Context {
|
|
18
13
|
lcb_error_t rc;
|
|
19
14
|
bool received_done;
|
|
20
15
|
std::string meta;
|
|
@@ -28,59 +23,115 @@ struct Context : Parser::Actions {
|
|
|
28
23
|
meta.clear();
|
|
29
24
|
rows.clear();
|
|
30
25
|
}
|
|
31
|
-
|
|
32
|
-
|
|
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);
|
|
33
39
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
|
|
41
|
+
~Parser() {
|
|
42
|
+
if (inner != NULL) {
|
|
43
|
+
lcbjsp_free(inner);
|
|
44
|
+
}
|
|
37
45
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
46
|
+
|
|
47
|
+
operator lcbjsp_PARSER* () {
|
|
48
|
+
return inner;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
lcbjsp_PARSER *getInner() {
|
|
52
|
+
return inner;
|
|
41
53
|
}
|
|
54
|
+
|
|
55
|
+
private:
|
|
56
|
+
int mode;
|
|
57
|
+
lcbjsp_PARSER *inner;
|
|
58
|
+
Parser(Parser&);
|
|
42
59
|
};
|
|
43
60
|
|
|
44
|
-
static
|
|
61
|
+
static std::string iov2s(const lcb_IOV& iov) {
|
|
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)
|
|
45
81
|
{
|
|
82
|
+
Parser parser(mode);
|
|
83
|
+
EXPECT_TRUE(parser != NULL);
|
|
84
|
+
if (parser == NULL) {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Feed it once
|
|
46
89
|
Context cx;
|
|
47
|
-
|
|
90
|
+
parser.getInner()->callback = rowCallback;
|
|
91
|
+
parser.getInner()->data = &cx;
|
|
48
92
|
|
|
49
93
|
for (size_t ii = 0; ii < ntxt; ii++) {
|
|
50
|
-
parser
|
|
94
|
+
lcbjsp_feed(parser, txt + ii, 1);
|
|
51
95
|
}
|
|
52
96
|
EXPECT_EQ(LCB_SUCCESS, cx.rc);
|
|
53
97
|
|
|
54
98
|
lcb_IOV out;
|
|
55
|
-
parser
|
|
99
|
+
lcbjsp_get_postmortem(parser, &out);
|
|
56
100
|
EXPECT_EQ(cx.meta, iov2s(out));
|
|
57
101
|
Json::Value root;
|
|
58
102
|
EXPECT_TRUE(Json::Reader().parse(cx.meta, root));
|
|
59
103
|
return true;
|
|
60
104
|
}
|
|
61
105
|
|
|
62
|
-
static bool validateBadParse(const char *txt, size_t ntxt,
|
|
106
|
+
static bool validateBadParse(const char *txt, size_t ntxt, int mode)
|
|
63
107
|
{
|
|
108
|
+
Parser p(mode);
|
|
64
109
|
Context cx;
|
|
65
|
-
|
|
66
|
-
p.
|
|
110
|
+
p.getInner()->callback = rowCallback;
|
|
111
|
+
p.getInner()->data = &cx;
|
|
112
|
+
lcbjsp_feed(p, JSON_fts_bad, sizeof(JSON_fts_bad));
|
|
67
113
|
EXPECT_EQ(LCB_PROTOCOL_ERROR, cx.rc);
|
|
68
114
|
|
|
69
115
|
p.reset();
|
|
70
116
|
cx.reset();
|
|
71
117
|
|
|
118
|
+
p.getInner()->callback = rowCallback;
|
|
119
|
+
p.getInner()->data = &cx;
|
|
120
|
+
|
|
121
|
+
for (size_t ii = 0; ii < ntxt; ++ii) {
|
|
122
|
+
}
|
|
72
123
|
return true;
|
|
73
124
|
}
|
|
74
125
|
|
|
75
126
|
TEST_F(JsonParseTest, testFTS)
|
|
76
127
|
{
|
|
77
|
-
ASSERT_TRUE(validateJsonRows(JSON_fts_good, sizeof(JSON_fts_good),
|
|
78
|
-
ASSERT_TRUE(validateBadParse(JSON_fts_bad, sizeof(JSON_fts_bad),
|
|
79
|
-
ASSERT_TRUE(validateBadParse(JSON_fts_bad2, sizeof(JSON_fts_bad2),
|
|
128
|
+
ASSERT_TRUE(validateJsonRows(JSON_fts_good, sizeof(JSON_fts_good), LCBJSP_MODE_FTS));
|
|
129
|
+
ASSERT_TRUE(validateBadParse(JSON_fts_bad, sizeof(JSON_fts_bad), LCBJSP_MODE_FTS));
|
|
130
|
+
ASSERT_TRUE(validateBadParse(JSON_fts_bad2, sizeof(JSON_fts_bad2), LCBJSP_MODE_FTS));
|
|
80
131
|
}
|
|
81
132
|
|
|
82
133
|
TEST_F(JsonParseTest, testN1QL) {
|
|
83
|
-
ASSERT_TRUE(validateJsonRows(JSON_n1ql_nonempty, sizeof(JSON_n1ql_nonempty),
|
|
84
|
-
ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty),
|
|
85
|
-
ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad),
|
|
134
|
+
ASSERT_TRUE(validateJsonRows(JSON_n1ql_nonempty, sizeof(JSON_n1ql_nonempty), LCBJSP_MODE_N1QL));
|
|
135
|
+
ASSERT_TRUE(validateJsonRows(JSON_n1ql_empty, sizeof(JSON_n1ql_empty), LCBJSP_MODE_N1QL));
|
|
136
|
+
ASSERT_TRUE(validateBadParse(JSON_n1ql_bad, sizeof(JSON_n1ql_bad), LCBJSP_MODE_N1QL));
|
|
86
137
|
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
|
|
2
|
+
/*
|
|
3
|
+
* Copyright 2012 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 <gtest/gtest.h>
|
|
20
|
+
#include <libcouchbase/couchbase.h>
|
|
21
|
+
#include "simplestring.h"
|
|
22
|
+
|
|
23
|
+
class String : public ::testing::Test
|
|
24
|
+
{
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
TEST_F(String, testBasic)
|
|
28
|
+
{
|
|
29
|
+
int rv;
|
|
30
|
+
lcb_string str;
|
|
31
|
+
rv = lcb_string_init(&str);
|
|
32
|
+
ASSERT_EQ(0, rv);
|
|
33
|
+
ASSERT_EQ(NULL, str.base);
|
|
34
|
+
ASSERT_EQ(0, str.nalloc);
|
|
35
|
+
ASSERT_EQ(0, str.nused);
|
|
36
|
+
|
|
37
|
+
rv = lcb_string_append(&str, "Hello", 5);
|
|
38
|
+
ASSERT_EQ(0, rv);
|
|
39
|
+
|
|
40
|
+
rv = lcb_string_append(&str, "blah", -1);
|
|
41
|
+
ASSERT_EQ(-1, rv);
|
|
42
|
+
|
|
43
|
+
rv = lcb_string_appendz(&str, "blah");
|
|
44
|
+
ASSERT_EQ(0, rv);
|
|
45
|
+
|
|
46
|
+
ASSERT_EQ(0, strcmp("Helloblah", str.base));
|
|
47
|
+
|
|
48
|
+
lcb_string_erase_beginning(&str, 5);
|
|
49
|
+
ASSERT_EQ(0, strcmp("blah", str.base));
|
|
50
|
+
|
|
51
|
+
lcb_string_erase_end(&str, 4);
|
|
52
|
+
ASSERT_EQ(0, strcmp("", str.base));
|
|
53
|
+
|
|
54
|
+
lcb_string_clear(&str);
|
|
55
|
+
ASSERT_TRUE(str.base != NULL);
|
|
56
|
+
|
|
57
|
+
lcb_string_release(&str);
|
|
58
|
+
ASSERT_EQ(NULL, str.base);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
TEST_F(String, testAdvance)
|
|
62
|
+
{
|
|
63
|
+
int rv;
|
|
64
|
+
lcb_string str;
|
|
65
|
+
rv = lcb_string_init(&str);
|
|
66
|
+
ASSERT_EQ(0, rv);
|
|
67
|
+
|
|
68
|
+
rv = lcb_string_reserve(&str, 30);
|
|
69
|
+
ASSERT_EQ(0, rv);
|
|
70
|
+
ASSERT_TRUE(str.nalloc >= 30);
|
|
71
|
+
ASSERT_EQ(0, str.nused);
|
|
72
|
+
|
|
73
|
+
memcpy(lcb_string_tail(&str), "Hello", 5);
|
|
74
|
+
lcb_string_added(&str, 5);
|
|
75
|
+
ASSERT_EQ(5, str.nused);
|
|
76
|
+
ASSERT_EQ(0, strcmp(str.base, "Hello"));
|
|
77
|
+
lcb_string_release(&str);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
TEST_F(String, testRbCopy)
|
|
82
|
+
{
|
|
83
|
+
int rv;
|
|
84
|
+
ringbuffer_t rb;
|
|
85
|
+
rv = ringbuffer_initialize(&rb, 10);
|
|
86
|
+
ASSERT_TRUE(rv != 0);
|
|
87
|
+
|
|
88
|
+
lcb_string str;
|
|
89
|
+
rv = lcb_string_init(&str);
|
|
90
|
+
ASSERT_EQ(0, rv);
|
|
91
|
+
|
|
92
|
+
const char *txt = "The quick brown fox jumped over the lazy dog";
|
|
93
|
+
const int ntxt = strlen(txt);
|
|
94
|
+
ringbuffer_ensure_capacity(&rb, ntxt);
|
|
95
|
+
|
|
96
|
+
ASSERT_EQ(ntxt, ringbuffer_write(&rb, txt, ntxt));
|
|
97
|
+
ASSERT_EQ(ntxt, rb.nbytes);
|
|
98
|
+
|
|
99
|
+
rv = lcb_string_rbappend(&str, &rb, 0);
|
|
100
|
+
ASSERT_EQ(0, rv);
|
|
101
|
+
|
|
102
|
+
ASSERT_EQ(0, strcmp(txt, str.base));
|
|
103
|
+
ASSERT_EQ(ntxt, str.nused);
|
|
104
|
+
|
|
105
|
+
lcb_string_clear(&str);
|
|
106
|
+
lcb_string_rbappend(&str, &rb, 1);
|
|
107
|
+
ASSERT_EQ(0, rb.nbytes);
|
|
108
|
+
ASSERT_EQ(0, strcmp(txt, str.base));
|
|
109
|
+
|
|
110
|
+
ringbuffer_destruct(&rb);
|
|
111
|
+
lcb_string_release(&str);
|
|
112
|
+
}
|
|
@@ -5,7 +5,6 @@
|
|
|
5
5
|
#include "settings.h"
|
|
6
6
|
|
|
7
7
|
using std::string;
|
|
8
|
-
using namespace lcb::htparse;
|
|
9
8
|
|
|
10
9
|
class HtparseTest : public ::testing::Test {
|
|
11
10
|
};
|
|
@@ -14,51 +13,52 @@ TEST_F(HtparseTest, testBasic)
|
|
|
14
13
|
{
|
|
15
14
|
lcb_settings *settings = lcb_settings_new();
|
|
16
15
|
// Allocate a parser
|
|
17
|
-
|
|
16
|
+
lcbht_pPARSER parser = lcbht_new(settings);
|
|
18
17
|
ASSERT_FALSE(parser == NULL);
|
|
19
18
|
|
|
20
19
|
// Feed the parser some stuff
|
|
21
|
-
|
|
20
|
+
lcbht_RESPSTATE state;
|
|
22
21
|
|
|
23
22
|
string buf;
|
|
24
23
|
buf = "HTTP/1.0 200 OK\r\n";
|
|
25
24
|
|
|
26
|
-
state = parser
|
|
25
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
27
26
|
ASSERT_EQ(0, state);
|
|
28
27
|
|
|
29
28
|
buf = "Connec";
|
|
30
|
-
state = parser
|
|
29
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
31
30
|
ASSERT_EQ(0, state);
|
|
32
31
|
buf = "tion: Keep-Alive\r\n";
|
|
33
|
-
state = parser
|
|
32
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
34
33
|
ASSERT_EQ(0, state);
|
|
35
34
|
buf += "Content-Length: 5\r\n\r\n";
|
|
36
|
-
state = parser
|
|
37
|
-
ASSERT_EQ(
|
|
35
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
36
|
+
ASSERT_EQ(LCBHT_S_HEADER|LCBHT_S_HTSTATUS, state);
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
ASSERT_EQ(200, resp
|
|
38
|
+
lcbht_RESPONSE *resp = lcbht_get_response(parser);
|
|
39
|
+
ASSERT_EQ(200, resp->status);
|
|
41
40
|
|
|
42
41
|
// Add some data into the body
|
|
43
42
|
buf = "H";
|
|
44
|
-
state = parser
|
|
45
|
-
ASSERT_EQ(0, state &
|
|
46
|
-
|
|
43
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
44
|
+
ASSERT_EQ(0, state & LCBHT_S_ERROR);
|
|
45
|
+
ASSERT_STREQ("H", resp->body.base);
|
|
47
46
|
|
|
48
47
|
buf = "ello";
|
|
49
|
-
state = parser
|
|
50
|
-
ASSERT_NE(0, state &
|
|
51
|
-
|
|
48
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
49
|
+
ASSERT_NE(0, state & LCBHT_S_DONE);
|
|
50
|
+
ASSERT_STREQ("Hello", resp->body.base);
|
|
52
51
|
|
|
53
52
|
// Now find the header
|
|
54
|
-
|
|
53
|
+
|
|
54
|
+
lcbht_free(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
|
+
lcbht_pPARSER parser = lcbht_new(settings);
|
|
62
62
|
|
|
63
63
|
string buf = "HTTP/1.0 200 OK\r\n"
|
|
64
64
|
"Connection: keep-alive\r\n"
|
|
@@ -66,28 +66,45 @@ 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 = parser
|
|
71
|
-
ASSERT_NE(0, state &
|
|
69
|
+
lcbht_RESPSTATE state;
|
|
70
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
71
|
+
ASSERT_NE(0, state & LCBHT_S_DONE);
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
lcbht_RESPONSE *resp = lcbht_get_response(parser);
|
|
74
74
|
// Now fine the header value stuff
|
|
75
|
-
ASSERT_STREQ("keep-alive", resp
|
|
76
|
-
ASSERT_STREQ("dummy/1.0", resp
|
|
77
|
-
ASSERT_STREQ("application/json", resp
|
|
78
|
-
|
|
75
|
+
ASSERT_STREQ("keep-alive", lcbht_get_resphdr(resp, "Connection"));
|
|
76
|
+
ASSERT_STREQ("dummy/1.0", lcbht_get_resphdr(resp, "X-Server"));
|
|
77
|
+
ASSERT_STREQ("application/json", lcbht_get_resphdr(resp, "Content-Type"));
|
|
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);
|
|
79
96
|
lcb_settings_unref(settings);
|
|
80
97
|
}
|
|
81
98
|
|
|
82
99
|
TEST_F(HtparseTest, testParseErrors)
|
|
83
100
|
{
|
|
84
101
|
lcb_settings *settings = lcb_settings_new();
|
|
85
|
-
|
|
102
|
+
lcbht_pPARSER parser = lcbht_new(settings);
|
|
86
103
|
|
|
87
104
|
string buf = "blahblahblah";
|
|
88
|
-
|
|
89
|
-
ASSERT_NE(0, state &
|
|
90
|
-
|
|
105
|
+
lcbht_RESPSTATE state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
106
|
+
ASSERT_NE(0, state & LCBHT_S_ERROR);
|
|
107
|
+
lcbht_free(parser);
|
|
91
108
|
lcb_settings_unref(settings);
|
|
92
109
|
}
|
|
93
110
|
|
|
@@ -95,7 +112,8 @@ TEST_F(HtparseTest, testParseErrors)
|
|
|
95
112
|
TEST_F(HtparseTest, testParseExtended)
|
|
96
113
|
{
|
|
97
114
|
lcb_settings *settings = lcb_settings_new();
|
|
98
|
-
|
|
115
|
+
lcbht_pPARSER parser = lcbht_new(settings);
|
|
116
|
+
lcbht_RESPONSE *resp;
|
|
99
117
|
|
|
100
118
|
const char *body;
|
|
101
119
|
unsigned nbody, nused;
|
|
@@ -104,18 +122,18 @@ TEST_F(HtparseTest, testParseExtended)
|
|
|
104
122
|
"Connection: keep-alive\r\n"
|
|
105
123
|
"Content-Length: 5\r\n";
|
|
106
124
|
|
|
107
|
-
|
|
108
|
-
state = parser
|
|
109
|
-
ASSERT_EQ(0, state &
|
|
125
|
+
lcbht_RESPSTATE state;
|
|
126
|
+
state = lcbht_parse_ex(parser, buf.c_str(), buf.size(), &nused, &nbody, &body);
|
|
127
|
+
ASSERT_EQ(0, state & LCBHT_S_ERROR);
|
|
110
128
|
ASSERT_EQ(NULL, body);
|
|
111
129
|
ASSERT_EQ(buf.size(), nused);
|
|
112
130
|
ASSERT_EQ(0, nbody);
|
|
113
131
|
|
|
114
|
-
|
|
132
|
+
resp = lcbht_get_response(parser);
|
|
115
133
|
buf = "\r\nHello";
|
|
116
134
|
// Feed the buffer
|
|
117
|
-
state = parser
|
|
118
|
-
ASSERT_EQ(0, state &
|
|
135
|
+
state = lcbht_parse_ex(parser, buf.c_str(), buf.size(), &nused, &nbody, &body);
|
|
136
|
+
ASSERT_EQ(0, state & LCBHT_S_DONE);
|
|
119
137
|
ASSERT_EQ(5, nbody);
|
|
120
138
|
ASSERT_FALSE(NULL == body);
|
|
121
139
|
ASSERT_STREQ("Hello", body);
|
|
@@ -124,50 +142,52 @@ TEST_F(HtparseTest, testParseExtended)
|
|
|
124
142
|
size_t off = nused;
|
|
125
143
|
|
|
126
144
|
// Parse again
|
|
127
|
-
state = parser
|
|
145
|
+
state = lcbht_parse_ex(parser, buf.c_str()+off, buf.size()-off, &nused, &nbody, &body);
|
|
128
146
|
ASSERT_EQ(nused, buf.size()-off);
|
|
129
147
|
ASSERT_TRUE(body == NULL);
|
|
130
148
|
ASSERT_EQ(0, nbody);
|
|
131
|
-
ASSERT_NE(0, state &
|
|
132
|
-
ASSERT_EQ(0, state &
|
|
133
|
-
ASSERT_EQ(0, resp
|
|
134
|
-
|
|
149
|
+
ASSERT_NE(0, state & LCBHT_S_DONE);
|
|
150
|
+
ASSERT_EQ(0, state & LCBHT_S_ERROR);
|
|
151
|
+
ASSERT_EQ(0, resp->body.nused);
|
|
152
|
+
|
|
153
|
+
lcbht_free(parser);
|
|
135
154
|
lcb_settings_unref(settings);
|
|
136
155
|
}
|
|
137
156
|
|
|
138
157
|
TEST_F(HtparseTest, testCanKeepalive)
|
|
139
158
|
{
|
|
140
159
|
lcb_settings *settings = lcb_settings_new();
|
|
141
|
-
|
|
160
|
+
lcbht_pPARSER parser = lcbht_new(settings);
|
|
142
161
|
string buf = "HTTP/1.0 200 OK\r\n"
|
|
143
162
|
"Content-Length: 0\r\n"
|
|
144
163
|
"\r\n";
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
164
|
+
lcbht_RESPSTATE state;
|
|
165
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
166
|
+
ASSERT_NE(0, state & LCBHT_S_DONE);
|
|
167
|
+
ASSERT_EQ(0, state & LCBHT_S_ERROR);
|
|
168
|
+
ASSERT_EQ(0, lcbht_can_keepalive(parser));
|
|
149
169
|
|
|
150
170
|
// Use HTTP/1.1 with Connection: close
|
|
151
|
-
parser
|
|
171
|
+
lcbht_reset(parser);
|
|
152
172
|
buf = "HTTP/1.1 200 OK\r\n"
|
|
153
173
|
"Content-Length: 0\r\n"
|
|
154
174
|
"Connection: close\r\n"
|
|
155
175
|
"\r\n";
|
|
156
|
-
state = parser
|
|
157
|
-
ASSERT_NE(0, state &
|
|
158
|
-
ASSERT_EQ(0, state &
|
|
159
|
-
|
|
176
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
177
|
+
ASSERT_NE(0, state & LCBHT_S_DONE);
|
|
178
|
+
ASSERT_EQ(0, state & LCBHT_S_ERROR);
|
|
179
|
+
ASSERT_EQ(0, lcbht_can_keepalive(parser));
|
|
160
180
|
|
|
161
|
-
parser
|
|
181
|
+
lcbht_reset(parser);
|
|
162
182
|
// Default HTTP/1.1
|
|
163
183
|
buf = "HTTP/1.1 200 OK\r\n"
|
|
164
184
|
"Content-Length: 0\r\n"
|
|
165
185
|
"\r\n";
|
|
166
|
-
state = parser
|
|
167
|
-
ASSERT_NE(0, state &
|
|
168
|
-
ASSERT_EQ(0, state &
|
|
169
|
-
|
|
186
|
+
state = lcbht_parse(parser, buf.c_str(), buf.size());
|
|
187
|
+
ASSERT_NE(0, state & LCBHT_S_DONE);
|
|
188
|
+
ASSERT_EQ(0, state & LCBHT_S_ERROR);
|
|
189
|
+
ASSERT_NE(0, lcbht_can_keepalive(parser));
|
|
170
190
|
|
|
171
|
-
|
|
191
|
+
lcbht_free(parser);
|
|
172
192
|
lcb_settings_unref(settings);
|
|
173
193
|
}
|