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
@@ -20,111 +20,60 @@
20
20
  #include <libcouchbase/couchbase.h>
21
21
  #include <libcouchbase/views.h>
22
22
  #include "contrib/jsonsl/jsonsl.h"
23
- #include "contrib/lcb-jsoncpp/lcb-jsoncpp.h"
24
- #include <string>
23
+ #include "simplestring.h"
25
24
 
26
- namespace lcb {
27
- namespace jsparse {
25
+ #ifdef __cplusplus
26
+ extern "C" {
27
+ #endif
28
28
 
29
- struct Parser;
29
+ typedef struct lcbvrow_PARSER_st lcbjsp_PARSER;
30
30
 
31
- struct Row {
32
- lcb_IOV docid;
33
- lcb_IOV key;
34
- lcb_IOV value;
35
- lcb_IOV row;
36
- lcb_IOV geo;
37
- };
38
-
39
- struct Parser {
40
- enum Mode {
41
- MODE_VIEWS,
42
- MODE_N1QL,
43
- MODE_FTS
44
- };
45
-
46
- struct Actions {
47
- /**
48
- * Called when a row is received.
49
- * This is a row of view data. You can parse this as JSON from your
50
- * favorite decoder/converter
51
- */
52
- virtual void JSPARSE_on_row(const Row&) = 0;
53
-
54
- /**
55
- * A JSON parse error occured. The payload will contain string data. This
56
- * may be JSON (but this is not likely).
57
- * The callback will be delivered twice. First when the error is noticed,
58
- * and second at the end (instead of a COMPLETE callback)
59
- */
60
- virtual void JSPARSE_on_error(const std::string& buf) = 0;
61
-
62
- /**
63
- * All the rows have been returned. In this case, the data is the 'meta'.
64
- * This is a valid JSON payload which was returned from the server.
65
- * The "rows" : [] array will be empty.
66
- */
67
- virtual void JSPARSE_on_complete(const std::string& meta) = 0;
68
-
69
- virtual ~Actions(){}
70
- };
31
+ typedef enum {
32
+ LCBJSP_MODE_VIEWS,
33
+ LCBJSP_MODE_N1QL,
34
+ LCBJSP_MODE_FTS
35
+ } lcbjsp_MODE;
71
36
 
72
- /**
73
- * Creates a new vrow context object.
74
- * You must set callbacks on this object if you wish it to be useful.
75
- * You must feed it data (calling vrow_feed) as well. The data may be fed
76
- * in chunks and callbacks will be invoked as each row is read.
77
- */
78
- Parser(Mode mode, Actions* actions_);
79
- ~Parser();
37
+ typedef enum {
38
+ /**This is a row of view data. You can parse this as JSON from your
39
+ * favorite decoder/converter */
40
+ LCBJSP_TYPE_ROW,
80
41
 
81
42
  /**
82
- * Resets the context to a pristine state. Callbacks and cookies are kept.
83
- * This may be more efficient than allocating/freeing a context each time
84
- * (as this can be expensive with the jsonsl structures)
43
+ * All the rows have been returned. In this case, the data is the 'meta'.
44
+ * This is a valid JSON payload which was returned from the server.
45
+ * The "rows" : [] array will be empty.
85
46
  */
86
- void reset();
47
+ LCBJSP_TYPE_COMPLETE,
87
48
 
88
49
  /**
89
- * Feeds data into the vrow. The callback may be invoked multiple times
90
- * in this function. In the context of normal lcb usage, this will typically
91
- * be invoked from within an http_data_callback.
50
+ * A JSON parse error occured. The payload will contain string data. This
51
+ * may be JSON (but this is not likely).
52
+ * The callback will be delivered twice. First when the error is noticed,
53
+ * and second at the end (instead of a COMPLETE callback)
92
54
  */
93
- void feed(const char *s, size_t n);
94
- void feed(const std::string& s) {
95
- feed(s.c_str(), s.size());
96
- }
55
+ LCBJSP_TYPE_ERROR
56
+ } lcbjsp_ROWTYPE;
97
57
 
98
- /**
99
- * Parse the row buffer into its constituent parts. This should be called
100
- * if you want to split the row into its basic 'docid', 'key' and 'value'
101
- * fields
102
- * @param vp The parser to use
103
- * @param vr The row to parse. This assumes the row's "row" field is properly
104
- * set.
105
- */
106
- void parse_viewrow(Row& vr);
107
58
 
108
- /**
109
- * Get the raw contents of the current buffer. This can be used to debug errors.
110
- *
111
- * Note that the buffer may be partial or malformed or otherwise unsuitable
112
- * for structured inspection, but may help human observers debug problems.
113
- *
114
- * @param out The iov structure to contain the buffer/offset
115
- */
116
- void get_postmortem(lcb_IOV& out) const;
59
+ typedef struct {
60
+ lcbjsp_ROWTYPE type; /**< The type of data encapsulated */
61
+ lcb_IOV docid;
62
+ lcb_IOV key;
63
+ lcb_IOV value;
64
+ lcb_IOV row;
65
+ lcb_IOV geo;
66
+ } lcbjsp_ROW;
117
67
 
118
- inline const char *get_buffer_region(size_t pos, size_t desired, size_t* actual);
119
- inline void combine_meta();
120
- inline static const char *jprstr_for_mode(Mode);
68
+ typedef void (*lcbjsp_CALLBACK)(lcbjsp_PARSER*,const lcbjsp_ROW*);
121
69
 
70
+ struct lcbvrow_PARSER_st {
122
71
  jsonsl_t jsn; /**< Parser for the row itself */
123
72
  jsonsl_t jsn_rdetails; /**< Parser for the row details */
124
73
  jsonsl_jpr_t jpr; /**< jsonpointer match object */
125
- std::string meta_buf; /**< String containing the skeleton (outer layer) */
126
- std::string current_buf; /**< Scratch/read buffer */
127
- std::string last_hk; /**< Last hashkey */
74
+ lcb_string meta_buf; /**< String containing the skeleton (outer layer) */
75
+ lcb_string current_buf; /**< Scratch/read buffer */
76
+ lcb_string last_hk; /**< Last hashkey */
128
77
 
129
78
  lcb_U8 mode;
130
79
 
@@ -152,15 +101,73 @@ struct Parser {
152
101
  */
153
102
  size_t last_row_endpos;
154
103
 
104
+ void *data;
105
+
155
106
  /**
156
107
  * std::string to contain parsed document ID.
157
108
  */
158
- Json::Value cxx_data;
109
+ void *cxx_data;
159
110
 
160
111
  /* callback to invoke */
161
- Actions *actions;
112
+ lcbjsp_CALLBACK callback;
162
113
  };
163
114
 
115
+ /**
116
+ * Creates a new vrow context object.
117
+ * You must set callbacks on this object if you wish it to be useful.
118
+ * You must feed it data (calling vrow_feed) as well. The data may be fed
119
+ * in chunks and callbacks will be invoked as each row is read.
120
+ */
121
+ lcbjsp_PARSER*
122
+ lcbjsp_create(int);
123
+
124
+ /**
125
+ * Resets the context to a pristine state. Callbacks and cookies are kept.
126
+ * This may be more efficient than allocating/freeing a context each time
127
+ * (as this can be expensive with the jsonsl structures)
128
+ */
129
+ void
130
+ lcbjsp_reset(lcbjsp_PARSER *ctx);
131
+
132
+ /**
133
+ * Frees a vrow object created by vrow_create
134
+ */
135
+ void
136
+ lcbjsp_free(lcbjsp_PARSER *ctx);
137
+
138
+ /**
139
+ * Feeds data into the vrow. The callback may be invoked multiple times
140
+ * in this function. In the context of normal lcb usage, this will typically
141
+ * be invoked from within an http_data_callback.
142
+ */
143
+ void
144
+ lcbjsp_feed(lcbjsp_PARSER *ctx, const char *data, size_t ndata);
145
+
146
+ /**
147
+ * Parse the row buffer into its constituent parts. This should be called
148
+ * if you want to split the row into its basic 'docid', 'key' and 'value'
149
+ * fields
150
+ * @param vp The parser to use
151
+ * @param vr The row to parse. This assumes the row's "row" field is properly
152
+ * set.
153
+ */
154
+ void
155
+ lcbjsp_parse_viewrow(lcbjsp_PARSER *vp, lcbjsp_ROW *vr);
156
+
157
+ /**
158
+ * Get the raw contents of the current buffer. This can be used to debug errors.
159
+ *
160
+ * Note that the buffer may be partial or malformed or otherwise unsuitable
161
+ * for structured inspection, but may help human observers debug problems.
162
+ *
163
+ * @param v The parser
164
+ * @param out The iov structure to contain the buffer/offset
165
+ */
166
+ void
167
+ lcbjsp_get_postmortem(const lcbjsp_PARSER *v, lcb_IOV *out);
168
+
169
+ #ifdef __cplusplus
164
170
  }
165
- }
171
+ #endif
172
+
166
173
  #endif /* LCB_VIEWROW_H_ */
@@ -0,0 +1,282 @@
1
+ /* -*- Mode: C; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2014 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 "lcbht.h"
19
+ #include "sllist-inl.h"
20
+ #include "contrib/http_parser/http_parser.h"
21
+ #include "settings.h"
22
+ enum last_call_type {
23
+ CB_NONE,
24
+ CB_HDR_KEY,
25
+ CB_HDR_VALUE,
26
+ CB_HDR_DONE,
27
+ CB_BODY,
28
+ CB_MSG_DONE
29
+ };
30
+
31
+ struct lcbht_PARSER {
32
+ http_parser parser;
33
+ lcbht_RESPONSE resp; /**< Current response being processed */
34
+ lcb_settings *settings;
35
+ enum last_call_type lastcall;
36
+
37
+ /* this stuff for parse_ex() */
38
+ const char *last_body;
39
+ unsigned last_bodylen;
40
+ char paused;
41
+ char is_ex;
42
+ };
43
+
44
+ static int
45
+ on_hdr_key(http_parser *pb, const char *s, size_t n)
46
+ {
47
+ lcbht_pPARSER p = (void *)pb;
48
+ lcbht_MIMEHDR *hdr;
49
+ lcbht_RESPONSE *resp = &p->resp;
50
+
51
+ if (p->lastcall != CB_HDR_KEY) {
52
+ /* new key */
53
+ hdr = calloc(1, sizeof *hdr);
54
+ sllist_append(&resp->headers, &hdr->slnode);
55
+ lcb_string_init(&hdr->buf_);
56
+ } else {
57
+ hdr = SLLIST_ITEM(resp->headers.last, lcbht_MIMEHDR, slnode);
58
+ }
59
+
60
+ /* append key data */
61
+ lcb_string_append(&hdr->buf_, s, n);
62
+ p->lastcall = CB_HDR_KEY;
63
+ return 0;
64
+ }
65
+
66
+ static int
67
+ on_hdr_value(http_parser *pb, const char *s, size_t n)
68
+ {
69
+ lcbht_pPARSER p = (void *)pb;
70
+ lcbht_MIMEHDR *hdr;
71
+ lcbht_RESPONSE *resp = &p->resp;
72
+
73
+ hdr = SLLIST_ITEM(resp->headers.last, lcbht_MIMEHDR, slnode);
74
+ if (p->lastcall == CB_HDR_KEY) {
75
+ lcb_string_appendz(&hdr->buf_, ":");
76
+ }
77
+ lcb_string_append(&hdr->buf_, s, n);
78
+ p->lastcall = CB_HDR_VALUE;
79
+ return 0;
80
+ }
81
+
82
+ static int
83
+ on_hdr_done(http_parser *pb)
84
+ {
85
+ lcbht_pPARSER p = (void *)pb;
86
+ lcbht_RESPONSE *resp = &p->resp;
87
+ sllist_iterator iter;
88
+ resp->state |= LCBHT_S_HTSTATUS|LCBHT_S_HEADER;
89
+
90
+ /* extract the status */
91
+ resp->status = pb->status_code;
92
+ p->lastcall = CB_HDR_DONE;
93
+
94
+ /** Iterate through all the headers and do proper formatting */
95
+ SLLIST_ITERFOR(&resp->headers, &iter) {
96
+ char *delim;
97
+ lcbht_MIMEHDR *hdr = SLLIST_ITEM(iter.cur, lcbht_MIMEHDR, slnode);
98
+
99
+ delim = strstr(hdr->buf_.base, ":");
100
+ hdr->key = hdr->buf_.base;
101
+
102
+ if (delim) {
103
+ *delim = '\0';
104
+ hdr->value = delim + 1;
105
+ } else {
106
+ hdr->value = "";
107
+ }
108
+ }
109
+ return 0;
110
+ }
111
+
112
+ static int
113
+ on_body(http_parser *pb, const char *s, size_t n)
114
+ {
115
+ lcbht_pPARSER p = (void *)pb;
116
+ lcbht_RESPONSE *resp = &p->resp;
117
+ if (p->is_ex) {
118
+ p->last_body = s;
119
+ p->last_bodylen = n;
120
+ p->paused = 1;
121
+ _lcb_http_parser_pause(pb, 1);
122
+ } else {
123
+ lcb_string_append(&resp->body, s, n);
124
+ }
125
+
126
+ p->lastcall = CB_BODY;
127
+ resp->state |= LCBHT_S_BODY;
128
+ return 0;
129
+ }
130
+
131
+ static int
132
+ on_msg_done(http_parser *pb)
133
+ {
134
+ lcbht_pPARSER p = (void *)pb;
135
+ lcbht_RESPONSE *resp = &p->resp;
136
+ resp->state |= LCBHT_S_DONE;
137
+ return 0;
138
+ }
139
+
140
+
141
+ static struct http_parser_settings Parser_Settings = {
142
+ NULL, /* msg_begin */
143
+ NULL, /* on_url */
144
+ on_hdr_key,
145
+ on_hdr_value,
146
+ on_hdr_done,
147
+ on_body,
148
+ on_msg_done
149
+ };
150
+
151
+ lcbht_pPARSER
152
+ lcbht_new(lcb_settings *settings)
153
+ {
154
+ lcbht_pPARSER ret = calloc(1, sizeof *ret);
155
+ lcbht_reset(ret);
156
+ ret->settings = settings;
157
+ lcb_settings_ref(settings);
158
+ return ret;
159
+ }
160
+
161
+ void
162
+ lcbht_free(lcbht_pPARSER parser)
163
+ {
164
+ lcbht_clear_response(&parser->resp);
165
+ lcb_settings_unref(parser->settings);
166
+ free(parser);
167
+ }
168
+
169
+ lcbht_RESPSTATE
170
+ lcbht_parse(lcbht_pPARSER parser, const void *data, unsigned ndata)
171
+ {
172
+ size_t nb;
173
+ parser->is_ex = 0;
174
+ nb = _lcb_http_parser_execute(&parser->parser, &Parser_Settings, data, ndata);
175
+ if (nb != ndata) {
176
+ parser->resp.state |= LCBHT_S_ERROR;
177
+ }
178
+ return parser->resp.state;
179
+ }
180
+
181
+ lcbht_RESPSTATE
182
+ lcbht_parse_ex(lcbht_pPARSER parser, const void *data, unsigned ndata,
183
+ unsigned *nused, unsigned *nbody, const char **pbody)
184
+ {
185
+ size_t nb;
186
+ parser->is_ex = 1;
187
+ nb = _lcb_http_parser_execute(&parser->parser, &Parser_Settings, data, ndata);
188
+ if (nb != ndata) {
189
+ if (parser->paused) {
190
+ _lcb_http_parser_pause(&parser->parser, 0);
191
+ parser->paused = 0;
192
+ } else {
193
+ parser->resp.state |= LCBHT_S_ERROR;
194
+ return parser->resp.state;
195
+ }
196
+ }
197
+
198
+ *nused = nb;
199
+ *nbody = parser->last_bodylen;
200
+ *pbody = parser->last_body;
201
+
202
+ parser->last_body = NULL;
203
+ parser->last_bodylen = 0;
204
+ return parser->resp.state;
205
+ }
206
+
207
+ lcbht_RESPONSE *
208
+ lcbht_get_response(lcbht_pPARSER parser)
209
+ {
210
+ return &parser->resp;
211
+ }
212
+
213
+ int
214
+ lcbht_can_keepalive(lcbht_pPARSER parser)
215
+ {
216
+ if (!(parser->resp.state & LCBHT_S_DONE)) {
217
+ return 0;
218
+ }
219
+
220
+ if (parser->resp.state & LCBHT_S_ERROR) {
221
+ return 0;
222
+ }
223
+
224
+ return _lcb_http_should_keep_alive(&parser->parser);
225
+ }
226
+
227
+ void
228
+ lcbht_clear_response(lcbht_RESPONSE *resp)
229
+ {
230
+ sllist_iterator iter;
231
+ SLLIST_ITERFOR(&resp->headers, &iter) {
232
+ lcbht_MIMEHDR *hdr = SLLIST_ITEM(iter.cur, lcbht_MIMEHDR, slnode);
233
+ lcb_string_release(&hdr->buf_);
234
+ sllist_iter_remove(&resp->headers, &iter);
235
+ free(hdr);
236
+ }
237
+ lcb_string_release(&resp->body);
238
+ resp->state = 0;
239
+ resp->status = 0;
240
+ }
241
+
242
+ void
243
+ lcbht_reset(lcbht_pPARSER parser)
244
+ {
245
+ lcbht_clear_response(&parser->resp);
246
+ _lcb_http_parser_init(&parser->parser, HTTP_RESPONSE);
247
+ }
248
+
249
+ const char *
250
+ lcbht_get_resphdr(const lcbht_RESPONSE *resp, const char *key)
251
+ {
252
+ sllist_node *curnode;
253
+ SLLIST_ITERBASIC(&resp->headers, curnode) {
254
+ lcbht_MIMEHDR *hdr = SLLIST_ITEM(curnode, lcbht_MIMEHDR, slnode);
255
+ if (!strcmp(hdr->key, key)) {
256
+ return hdr->value;
257
+ }
258
+ }
259
+ return NULL;
260
+ }
261
+
262
+ char **
263
+ lcbht_make_resphdrlist(lcbht_RESPONSE *response)
264
+ {
265
+ char **ret;
266
+ unsigned nhdrs = 0;
267
+ unsigned curix = 0;
268
+ sllist_node *curnode;
269
+ SLLIST_ITERBASIC(&response->headers, curnode) {
270
+ nhdrs++;
271
+ }
272
+ ret = malloc(sizeof(*ret) * (nhdrs + 1) * 2);
273
+
274
+ SLLIST_ITERBASIC(&response->headers, curnode) {
275
+ lcbht_MIMEHDR *hdr = SLLIST_ITEM(curnode, lcbht_MIMEHDR, slnode);
276
+ ret[curix++] = strdup(hdr->key);
277
+ ret[curix++] = strdup(hdr->value);
278
+ }
279
+
280
+ ret[curix] = NULL;
281
+ return ret;
282
+ }