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.
Files changed (129) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -1
  3. data/README.md +1 -1
  4. data/ext/libcouchbase/CMakeLists.txt +8 -6
  5. data/ext/libcouchbase/README.markdown +2 -2
  6. data/ext/libcouchbase/RELEASE_NOTES.markdown +0 -86
  7. data/ext/libcouchbase/cmake/Modules/ConfigureDtrace.cmake +0 -11
  8. data/ext/libcouchbase/cmake/Modules/GenerateConfigDotH.cmake +0 -2
  9. data/ext/libcouchbase/cmake/Modules/GetLibcouchbaseFlags.cmake +1 -2
  10. data/ext/libcouchbase/cmake/Modules/GetVersionInfo.cmake +3 -3
  11. data/ext/libcouchbase/cmake/config-cmake.h.in +0 -2
  12. data/ext/libcouchbase/cmake/defs.mk.in +2 -0
  13. data/ext/libcouchbase/cmake/source_files.cmake +5 -21
  14. data/ext/libcouchbase/include/libcouchbase/auth.h +0 -10
  15. data/ext/libcouchbase/include/libcouchbase/cntl.h +1 -27
  16. data/ext/libcouchbase/include/libcouchbase/error.h +1 -15
  17. data/ext/libcouchbase/include/libcouchbase/n1ql.h +1 -13
  18. data/ext/libcouchbase/include/libcouchbase/plugins/io/bsdio-inl.c +1 -1
  19. data/ext/libcouchbase/include/libcouchbase/subdoc.h +0 -9
  20. data/ext/libcouchbase/include/libcouchbase/views.h +1 -7
  21. data/ext/libcouchbase/include/libcouchbase/visibility.h +0 -1
  22. data/ext/libcouchbase/include/memcached/protocol_binary.h +1131 -29
  23. data/ext/libcouchbase/include/memcached/vbucket.h +42 -0
  24. data/ext/libcouchbase/packaging/parse-git-describe.pl +1 -1
  25. data/ext/libcouchbase/plugins/io/libev/libev_io_opts.h +2 -3
  26. data/ext/libcouchbase/src/README.md +2 -0
  27. data/ext/libcouchbase/src/auth-priv.h +0 -1
  28. data/ext/libcouchbase/src/auth.cc +4 -10
  29. data/ext/libcouchbase/src/bootstrap.c +269 -0
  30. data/ext/libcouchbase/src/bootstrap.h +39 -50
  31. data/ext/libcouchbase/src/bucketconfig/bc_cccp.cc +117 -84
  32. data/ext/libcouchbase/src/bucketconfig/bc_file.c +347 -0
  33. data/ext/libcouchbase/src/bucketconfig/bc_http.c +630 -0
  34. data/ext/libcouchbase/src/bucketconfig/bc_http.h +25 -50
  35. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.c +150 -0
  36. data/ext/libcouchbase/src/bucketconfig/clconfig.h +386 -407
  37. data/ext/libcouchbase/src/bucketconfig/confmon.c +474 -0
  38. data/ext/libcouchbase/src/cbft.cc +27 -22
  39. data/ext/libcouchbase/src/cntl.cc +19 -30
  40. data/ext/libcouchbase/src/connspec.cc +1 -48
  41. data/ext/libcouchbase/src/connspec.h +0 -27
  42. data/ext/libcouchbase/src/dump.cc +2 -2
  43. data/ext/libcouchbase/src/getconfig.cc +33 -7
  44. data/ext/libcouchbase/src/handler.cc +2 -0
  45. data/ext/libcouchbase/src/hostlist.cc +36 -0
  46. data/ext/libcouchbase/src/hostlist.h +62 -41
  47. data/ext/libcouchbase/src/http/http-priv.h +112 -125
  48. data/ext/libcouchbase/src/http/http.cc +30 -15
  49. data/ext/libcouchbase/src/http/http.h +34 -1
  50. data/ext/libcouchbase/src/http/http_io.cc +26 -22
  51. data/ext/libcouchbase/src/instance.cc +23 -94
  52. data/ext/libcouchbase/src/internal.h +26 -52
  53. data/ext/libcouchbase/src/jsparse/parser.cc +202 -146
  54. data/ext/libcouchbase/src/jsparse/parser.h +98 -91
  55. data/ext/libcouchbase/src/lcbht/lcbht.c +282 -0
  56. data/ext/libcouchbase/src/lcbht/lcbht.h +163 -174
  57. data/ext/libcouchbase/src/lcbio/connect.c +557 -0
  58. data/ext/libcouchbase/src/lcbio/connect.h +2 -9
  59. data/ext/libcouchbase/src/lcbio/ctx.c +1 -1
  60. data/ext/libcouchbase/src/lcbio/iotable.h +16 -61
  61. data/ext/libcouchbase/src/lcbio/ioutils.h +1 -1
  62. data/ext/libcouchbase/src/lcbio/manager.c +2 -2
  63. data/ext/libcouchbase/src/mc/mcreq.h +2 -9
  64. data/ext/libcouchbase/src/mcserver/mcserver.cc +34 -143
  65. data/ext/libcouchbase/src/mcserver/mcserver.h +12 -7
  66. data/ext/libcouchbase/src/mcserver/negotiate.cc +38 -132
  67. data/ext/libcouchbase/src/n1ql/ixmgmt.cc +2 -1
  68. data/ext/libcouchbase/src/n1ql/n1ql.cc +32 -56
  69. data/ext/libcouchbase/src/newconfig.cc +6 -6
  70. data/ext/libcouchbase/src/nodeinfo.cc +2 -2
  71. data/ext/libcouchbase/src/operations/{cbflush.cc → cbflush.c} +15 -7
  72. data/ext/libcouchbase/src/operations/{counter.cc → counter.c} +0 -0
  73. data/ext/libcouchbase/src/operations/durability.cc +26 -6
  74. data/ext/libcouchbase/src/operations/durability_internal.h +3 -6
  75. data/ext/libcouchbase/src/operations/{get.cc → get.c} +26 -24
  76. data/ext/libcouchbase/src/operations/{observe.cc → observe.c} +93 -68
  77. data/ext/libcouchbase/src/operations/{pktfwd.cc → pktfwd.c} +0 -0
  78. data/ext/libcouchbase/src/operations/{remove.cc → remove.c} +0 -0
  79. data/ext/libcouchbase/src/operations/stats.cc +8 -3
  80. data/ext/libcouchbase/src/operations/{store.cc → store.c} +32 -27
  81. data/ext/libcouchbase/src/operations/subdoc.cc +18 -38
  82. data/ext/libcouchbase/src/operations/{touch.cc → touch.c} +0 -0
  83. data/ext/libcouchbase/src/packetutils.c +37 -0
  84. data/ext/libcouchbase/src/packetutils.h +2 -2
  85. data/ext/libcouchbase/src/probes.d +1 -1
  86. data/ext/libcouchbase/src/{retrychk.cc → retrychk.c} +3 -2
  87. data/ext/libcouchbase/src/retryq.cc +4 -4
  88. data/ext/libcouchbase/src/settings.c +0 -3
  89. data/ext/libcouchbase/src/settings.h +0 -5
  90. data/ext/libcouchbase/src/simplestring.c +211 -0
  91. data/ext/libcouchbase/src/simplestring.h +228 -0
  92. data/ext/libcouchbase/src/ssl/ssl_c.c +0 -1
  93. data/ext/libcouchbase/src/ssl/ssl_common.c +0 -2
  94. data/ext/libcouchbase/src/ssl/ssl_e.c +1 -0
  95. data/ext/libcouchbase/src/ssobuf.h +82 -0
  96. data/ext/libcouchbase/src/trace.h +4 -4
  97. data/ext/libcouchbase/src/vbucket/vbucket.c +1 -0
  98. data/ext/libcouchbase/src/views/{docreq.cc → docreq.c} +54 -48
  99. data/ext/libcouchbase/src/views/docreq.h +30 -24
  100. data/ext/libcouchbase/src/views/viewreq.c +358 -0
  101. data/ext/libcouchbase/src/views/viewreq.h +13 -43
  102. data/ext/libcouchbase/tests/basic/t_connstr.cc +50 -89
  103. data/ext/libcouchbase/tests/basic/t_host.cc +75 -67
  104. data/ext/libcouchbase/tests/basic/t_jsparse.cc +78 -27
  105. data/ext/libcouchbase/tests/basic/t_string.cc +112 -0
  106. data/ext/libcouchbase/tests/htparse/t_basic.cc +78 -58
  107. data/ext/libcouchbase/tests/iotests/mock-environment.h +1 -2
  108. data/ext/libcouchbase/tests/iotests/t_confmon.cc +114 -96
  109. data/ext/libcouchbase/tests/mc/t_alloc.cc +9 -9
  110. data/ext/libcouchbase/tools/cbc-pillowfight.cc +1 -1
  111. data/lib/libcouchbase/ext/tasks.rb +6 -2
  112. data/lib/libcouchbase/query_view.rb +1 -1
  113. data/lib/libcouchbase/results_fiber.rb +6 -6
  114. data/lib/libcouchbase/version.rb +1 -1
  115. metadata +26 -26
  116. data/ext/libcouchbase/src/bootstrap.cc +0 -216
  117. data/ext/libcouchbase/src/bucketconfig/bc_file.cc +0 -281
  118. data/ext/libcouchbase/src/bucketconfig/bc_http.cc +0 -528
  119. data/ext/libcouchbase/src/bucketconfig/bc_mcraw.cc +0 -115
  120. data/ext/libcouchbase/src/bucketconfig/confmon.cc +0 -378
  121. data/ext/libcouchbase/src/dns-srv.cc +0 -142
  122. data/ext/libcouchbase/src/errmap.cc +0 -107
  123. data/ext/libcouchbase/src/errmap.h +0 -113
  124. data/ext/libcouchbase/src/lcbht/lcbht.cc +0 -177
  125. data/ext/libcouchbase/src/lcbio/connect.cc +0 -562
  126. data/ext/libcouchbase/src/lcbio/timer-cxx.h +0 -87
  127. data/ext/libcouchbase/src/mctx-helper.h +0 -51
  128. data/ext/libcouchbase/src/views/viewreq.cc +0 -318
  129. data/ext/libcouchbase/tests/iotests/t_errmap.cc +0 -97
@@ -8,13 +8,8 @@
8
8
  class JsonParseTest : public ::testing::Test {
9
9
  };
10
10
 
11
- using namespace lcb::jsparse;
12
11
 
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 {
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
- void JSPARSE_on_row(const Row& row) {
32
- rows.push_back(iov2s(row.row));
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
- void JSPARSE_on_complete(const std::string& s) {
35
- meta.assign(s);
36
- received_done = true;
40
+
41
+ ~Parser() {
42
+ if (inner != NULL) {
43
+ lcbjsp_free(inner);
44
+ }
37
45
  }
38
- void JSPARSE_on_error(const std::string&) {
39
- rc = LCB_PROTOCOL_ERROR;
40
- received_done = true;
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 bool validateJsonRows(const char *txt, size_t ntxt, Parser::Mode mode)
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
- Parser parser(mode, &cx);
90
+ parser.getInner()->callback = rowCallback;
91
+ parser.getInner()->data = &cx;
48
92
 
49
93
  for (size_t ii = 0; ii < ntxt; ii++) {
50
- parser.feed(txt + ii, 1);
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.get_postmortem(out);
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, Parser::Mode mode)
106
+ static bool validateBadParse(const char *txt, size_t ntxt, int mode)
63
107
  {
108
+ Parser p(mode);
64
109
  Context cx;
65
- Parser p(mode, &cx);
66
- p.feed(JSON_fts_bad, sizeof(JSON_fts_bad));
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), 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));
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), 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));
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
- Parser *parser = new Parser(settings);
16
+ lcbht_pPARSER parser = lcbht_new(settings);
18
17
  ASSERT_FALSE(parser == NULL);
19
18
 
20
19
  // Feed the parser some stuff
21
- unsigned state;
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->parse(buf.c_str(), buf.size());
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->parse(buf.c_str(), buf.size());
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->parse(buf.c_str(), buf.size());
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->parse(buf.c_str(), buf.size());
37
- ASSERT_EQ(Parser::S_HEADER|Parser::S_HTSTATUS, state);
35
+ state = lcbht_parse(parser, buf.c_str(), buf.size());
36
+ ASSERT_EQ(LCBHT_S_HEADER|LCBHT_S_HTSTATUS, state);
38
37
 
39
- Response& resp = parser->get_cur_response();
40
- ASSERT_EQ(200, resp.status);
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->parse(buf.c_str(), buf.size());
45
- ASSERT_EQ(0, state & Parser::S_ERROR);
46
- ASSERT_EQ("H", resp.body);
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->parse(buf.c_str(), buf.size());
50
- ASSERT_NE(0, state & Parser::S_DONE);
51
- ASSERT_EQ("Hello", resp.body);
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
- delete parser;
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
- Parser *parser = new Parser(settings);
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
- unsigned state;
70
- state = parser->parse(buf.c_str(), buf.size());
71
- ASSERT_NE(0, state & Parser::S_DONE);
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
- Response &resp = parser->get_cur_response();
73
+ lcbht_RESPONSE *resp = lcbht_get_response(parser);
74
74
  // Now fine the header value stuff
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;
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
- Parser *parser = new Parser(settings);
102
+ lcbht_pPARSER parser = lcbht_new(settings);
86
103
 
87
104
  string buf = "blahblahblah";
88
- unsigned state = parser->parse(buf.c_str(), buf.size());
89
- ASSERT_NE(0, state & Parser::S_ERROR);
90
- delete parser;
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
- Parser *parser = new Parser(settings);
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
- unsigned state;
108
- state = parser->parse_ex(buf.c_str(), buf.size(), &nused, &nbody, &body);
109
- ASSERT_EQ(0, state & Parser::S_ERROR);
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
- Response& resp = parser->get_cur_response();
132
+ resp = lcbht_get_response(parser);
115
133
  buf = "\r\nHello";
116
134
  // Feed the buffer
117
- state = parser->parse_ex(buf.c_str(), buf.size(), &nused, &nbody, &body);
118
- ASSERT_EQ(0, state & Parser::S_DONE);
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->parse_ex(buf.c_str()+off, buf.size()-off, &nused, &nbody, &body);
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 & Parser::S_DONE);
132
- ASSERT_EQ(0, state & Parser::S_ERROR);
133
- ASSERT_EQ(0, resp.body.size());
134
- delete parser;
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
- Parser *parser = new Parser(settings);
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
- 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());
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->reset();
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->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());
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->reset();
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->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());
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
- delete parser;
191
+ lcbht_free(parser);
172
192
  lcb_settings_unref(settings);
173
193
  }