#ifndef LCB_HTTPPRIV_H
#define LCB_HTTPPRIV_H
#include <libcouchbase/couchbase.h>
#include <lcbio/lcbio.h>
#include <lcbio/timer-ng.h>
#include <lcbht/lcbht.h>
#include "contrib/http_parser/http_parser.h"
#include "http.h"
#include <string>
#include <vector>
#include <set>
namespace lcb {
namespace http {
struct Header {
std::string key;
std::string value;
Header(const std::string& key_, const std::string& value_)
: key(key_), value(value_) {
}
};
struct Request {
enum State {
ONGOING = 0,
CBINVOKED = 1 << 0,
FINISHED = 1 << 1,
NOLCB = 1 << 2
};
lcb_t instance;
std::string url;
std::string host;
std::string port;
std::string pending_redirect;
bool has_pending_redirect() const { return !pending_redirect.empty(); }
const std::vector<char> body;
std::vector<char> preamble;
struct http_parser_url url_info;
const lcb_http_method_t method;
const bool chunked;
bool paused;
const void * const command_cookie;
size_t refcount;
int redircount;
bool passed_data;
std::vector<int> used_nodes;
int last_vbcrev;
const lcb_http_type_t reqtype;
int status;
std::vector<Header> request_headers;
std::vector<const char*> response_headers_clist;
std::vector<Header> response_headers;
lcb_RESPCALLBACK callback;
lcbio_pTABLE io;
lcbio_pCTX ioctx;
lcbio_pTIMER timer;
lcbio_CONNREQ creq;
lcbht_pPARSER parser;
const uint32_t user_timeout;
uint32_t timeout() const;
bool is_data_request() const {
return reqtype == LCB_HTTP_TYPE_N1QL ||
reqtype == LCB_HTTP_TYPE_VIEW ||
reqtype == LCB_HTTP_TYPE_FTS;
}
bool is_ongoing() const { return status == ONGOING; }
inline Request(lcb_t instance, const void *cookie, const lcb_CMDHTTP* cmd);
inline lcb_error_t setup_inputs(const lcb_CMDHTTP* cmd);
const char *get_api_node(lcb_error_t &rc);
const char *get_api_node() { lcb_error_t dummy; return get_api_node(dummy); }
static Request * create(lcb_t instance, const void *cookie,
const lcb_CMDHTTP *cmd, lcb_error_t *rc);
inline lcb_error_t assign_url(const char *base, size_t nbase,
const char *rest, size_t nrest);
inline void assign_from_urlfield(http_parser_url_fields field,
std::string& target);
void add_header(const std::string& key, const std::string& value) {
request_headers.push_back(Header(key, value));
}
inline void add_to_preamble(const char *);
inline void add_to_preamble(const std::string&);
inline void add_to_preamble(const Header&);
lcb_error_t submit();
lcb_error_t start_io(lcb_host_t&);
void close_io();
inline int handle_parse_chunked(const char *buf, unsigned nbuf);
inline void assign_response_headers(const lcbht_RESPONSE*);
void redirect();
void init_resp(lcb_RESPHTTP *resp);
void maybe_refresh_config(lcb_error_t rc);
void finish(lcb_error_t rc);
void finish_or_retry(lcb_error_t rc);
void pause();
void resume();
void cancel();
void block_callback() {
status |= NOLCB|CBINVOKED;
}
void decref();
void incref() { refcount++; }
};
} }
struct lcb_http_request_st : public lcb::http::Request {};
#endif