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