libcouchbase 0.2.0 → 0.3.1

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