57 request.method = method; |
57 request.method = method; |
58 request.url = url; |
58 request.url = url; |
59 |
59 |
60 // TODO: return also client IP address etc. |
60 // TODO: return also client IP address etc. |
61 // const MHD_ConnectionInfo* connetionInfo = MHD_get_connection_info(connection, MHD_ConnectionInfoType::MHD_CONNECTION_INFO_CLIENT_ADDRESS); |
61 // const MHD_ConnectionInfo* connetionInfo = MHD_get_connection_info(connection, MHD_ConnectionInfoType::MHD_CONNECTION_INFO_CLIENT_ADDRESS); |
62 |
62 |
63 // FIXME: request.body = ... |
63 // FIXME: request.body = ... |
64 // FIXME: multiple calls for one request |
64 // FIXME: multiple calls for one request |
65 // FIXME: POST parameters |
65 // FIXME: POST parameters |
66 |
66 |
67 // HTTP headers: |
67 // MHD_create_post_processor() |
68 MHD_get_connection_values(connection, MHD_ValueKind::MHD_HEADER_KIND, [](void* cls, MHD_ValueKind kind, const char* key, const char* value) { |
68 // https://git.gnunet.org/libmicrohttpd.git/tree/src/examples/post_example.c |
|
69 |
|
70 MHD_KeyValueIterator avpVectorAppender = [](void* cls, MHD_ValueKind kind, const char* key, const char* value) { |
69 (static_cast<std::vector<AVP>*> (cls))->push_back({key, value}); |
71 (static_cast<std::vector<AVP>*> (cls))->push_back({key, value}); |
70 return MHD_YES; |
72 return MHD_YES; |
71 }, &request.header); |
73 }; |
72 |
74 |
73 // GET parameters: |
75 MHD_get_connection_values(connection, MHD_ValueKind::MHD_HEADER_KIND, avpVectorAppender, &request.header); |
74 MHD_get_connection_values(connection, MHD_ValueKind::MHD_GET_ARGUMENT_KIND, [](void* cls, MHD_ValueKind kind, const char* key, const char* value) { |
76 MHD_get_connection_values(connection, MHD_ValueKind::MHD_COOKIE_KIND, avpVectorAppender, &request.cookie); |
75 (static_cast<std::vector<AVP>*> (cls))->push_back({key, value}); |
77 MHD_get_connection_values(connection, MHD_ValueKind::MHD_GET_ARGUMENT_KIND, avpVectorAppender, &request.getParameter); |
76 return MHD_YES; |
78 MHD_get_connection_values(connection, MHD_ValueKind::MHD_POSTDATA_KIND, avpVectorAppender, &request.postParameter); |
77 }, &request.getParameter); |
|
78 |
|
79 // COOKIE parameters: |
|
80 MHD_get_connection_values(connection, MHD_ValueKind::MHD_COOKIE_KIND, [](void* cls, MHD_ValueKind kind, const char* key, const char* value) { |
|
81 (static_cast<std::vector<AVP>*> (cls))->push_back({key, value}); |
|
82 return MHD_YES; |
|
83 }, &request.cookie); |
|
84 |
79 |
85 const HTTPServer::Response response = impl->requestHandler->handle(request); |
80 const HTTPServer::Response response = impl->requestHandler->handle(request); |
86 struct MHD_Response* mhdResponse = MHD_create_response_from_buffer(response.body.size(), (void*) response.body.c_str(), MHD_RESPMEM_MUST_COPY); |
81 struct MHD_Response* mhdResponse = MHD_create_response_from_buffer(response.body.size(), (void*) response.body.c_str(), MHD_RESPMEM_MUST_COPY); |
87 for (AVP h : response.header) MHD_add_response_header(mhdResponse, h.name.c_str(), h.value.c_str()); |
82 for (AVP h : response.header) MHD_add_response_header(mhdResponse, h.name.c_str(), h.value.c_str()); |
88 // FIXME: cookies: for (AVP c : response.cookie) ... |
83 // FIXME: cookies: for (AVP c : response.cookie) ... |