22 #include <core/exception.h> 23 #include <webview/request.h> 24 #include <sys/types.h> 25 #include <sys/select.h> 28 #include <microhttpd.h> 30 #include <netinet/in.h> 39 cookie_iterator(
void *cls,
enum MHD_ValueKind kind,
40 const char *key,
const char *value)
42 WebRequest *request =
static_cast<WebRequest *
>(cls);
43 request->set_cookie(key, value);
48 get_argument_iterator(
void *cls,
enum MHD_ValueKind kind,
49 const char *key,
const char *value)
51 WebRequest *request =
static_cast<WebRequest *
>(cls);
52 if (value == NULL) request->set_get_value(key,
"");
53 else request->set_get_value(key, value);
58 header_iterator(
void *cls,
enum MHD_ValueKind kind,
59 const char *key,
const char *value)
61 WebRequest *request =
static_cast<WebRequest *
>(cls);
62 if (value == NULL) request->set_header(key,
"");
63 else request->set_header(key, value);
81 : pp_(NULL), is_setup_(false), uri_(uri)
93 WebRequest::setup(
const char *
url,
const char *
method,
94 const char *version, MHD_Connection *connection)
98 if (0 == strcmp(method, MHD_HTTP_METHOD_GET)) {
100 }
else if (0 == strcmp(method, MHD_HTTP_METHOD_POST)) {
102 }
else if (0 == strcmp(method, MHD_HTTP_METHOD_HEAD)) {
104 }
else if (0 == strcmp(method, MHD_HTTP_METHOD_DELETE)) {
106 }
else if (0 == strcmp(method, MHD_HTTP_METHOD_PUT)) {
108 }
else if (0 == strcmp(method, MHD_HTTP_METHOD_CONNECT)) {
110 }
else if (0 == strcmp(method, MHD_HTTP_METHOD_OPTIONS)) {
112 }
else if (0 == strcmp(method, MHD_HTTP_METHOD_TRACE)) {
116 if (0 == strcmp(version, MHD_HTTP_VERSION_1_0)) {
117 http_version_ = HTTP_VERSION_1_0;
118 }
else if (0 == strcmp(version, MHD_HTTP_VERSION_1_1)) {
119 http_version_ = HTTP_VERSION_1_1;
123 MHD_get_connection_info(connection, MHD_CONNECTION_INFO_CLIENT_ADDRESS)
126 char addr_str[INET6_ADDRSTRLEN];
127 switch(client_addr->sa_family) {
129 inet_ntop(AF_INET, &(((
struct sockaddr_in *)client_addr)->sin_addr),
130 addr_str, INET6_ADDRSTRLEN);
134 inet_ntop(AF_INET6, &(((
struct sockaddr_in6 *)client_addr)->sin6_addr),
135 addr_str, INET6_ADDRSTRLEN);
139 strncpy(addr_str,
"Unknown AF", INET6_ADDRSTRLEN);
142 client_addr_ = addr_str;
144 MHD_get_connection_values(connection, MHD_HEADER_KIND, &header_iterator,
this);
145 MHD_get_connection_values(connection, MHD_COOKIE_KIND, &cookie_iterator,
this);
146 MHD_get_connection_values(connection,
147 MHD_GET_ARGUMENT_KIND, &get_argument_iterator,
this);
157 MHD_destroy_post_processor(pp_);
171 std::string val_add(data, size);
172 if (post_values_.find(key) != post_values_.end()) {
173 post_values_[key] += val_add;
175 post_values_[key] = val_add;
189 post_raw_data_ = std::string(data, data_size);
198 reply_size_ += increment_by;
226 default:
return "UNKNOWN_METHOD";
237 switch (http_version_) {
238 case HTTP_VERSION_1_0:
return MHD_HTTP_VERSION_1_0;
239 case HTTP_VERSION_1_1:
return MHD_HTTP_VERSION_1_1;
240 default:
return "UNKNOWN_VERSION";
void set_reply_code(WebReply::Code code)
Set HTTP code of the final reply.
const std::string & client_addr() const
Get client address as string.
Fawkes library namespace.
WebRequest(const char *uri)
Constructor.
size_t reply_size() const
Get number of bytes actually sent out so far.
Method method() const
Get HTTP transfer method.
void set_post_value(const char *key, const char *data, size_t size)
Set a POST value.
WebReply::Code reply_code() const
Get HTTP code of reply.
const char * http_version_str() const
Get HTTP version as string.
const char * method_str() const
Get method as string.
void increment_reply_size(size_t increment_by)
Increment reply bytes counter.
void set_raw_post_data(const char *data, size_t data_size)
Set raw post data.
const std::string & url() const
Get URL.