Skip to content

Commit 707bfbc

Browse files
committed
Merge TASK-015: http_request_impl skeleton (PIMPL split, structural only)
Brings in: - e9175c1 TASK-015: http_request_impl skeleton (PIMPL split, structural only) - fd6c984 TASK-015: wire test-request fallback through http_request_impl - 01c425b TASK-015: housekeeping (review record)
2 parents 369c2a8 + 01c425b commit 707bfbc

12 files changed

Lines changed: 1108 additions & 418 deletions

File tree

specs/tasks/M3-request/TASK-015.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
Move `http_request`'s backend-coupled members (`MHD_Connection*`, raw GnuTLS handle, computed caches) into `detail/http_request_impl.hpp` behind a `std::unique_ptr<http_request_impl>`. No API rename yet.
99

1010
**Action Items:**
11-
- [ ] Create `src/httpserver/detail/http_request_impl.hpp` (gated `HTTPSERVER_COMPILATION` only).
12-
- [ ] Move all backend-coupled state into the impl struct: `MHD_Connection* conn_`, `gnutls_session_t tls_session_`, parsed-args cache, headers cache, etc.
13-
- [ ] Public `http_request.hpp` declares `std::unique_ptr<http_request_impl> impl_;` and forward-declares the impl class.
14-
- [ ] Implement existing public methods as forwarders to `impl_->method()`.
15-
- [ ] Move `<microhttpd.h>`, `<gnutls/gnutls.h>` includes from public `http_request.hpp` into `http_request_impl.hpp` and `http_request.cpp`.
11+
- [x] Create `src/httpserver/detail/http_request_impl.hpp` (gated `HTTPSERVER_COMPILATION` only).
12+
- [x] Move all backend-coupled state into the impl struct: `MHD_Connection* conn_`, `gnutls_session_t tls_session_`, parsed-args cache, headers cache, etc.
13+
- [x] Public `http_request.hpp` declares `std::unique_ptr<http_request_impl> impl_;` and forward-declares the impl class.
14+
- [x] Implement existing public methods as forwarders to `impl_->method()`.
15+
- [x] Move `<microhttpd.h>`, `<gnutls/gnutls.h>` includes from public `http_request.hpp` into `http_request_impl.hpp` and `http_request.cpp`.
1616

1717
**Dependencies:**
1818
- Blocked by: TASK-002, TASK-014
@@ -28,4 +28,4 @@ Move `http_request`'s backend-coupled members (`MHD_Connection*`, raw GnuTLS han
2828
**Related Requirements:** PRD-HDR-REQ-001..004
2929
**Related Decisions:** DR-003b, §4.2
3030

31-
**Status:** Not Started
31+
**Status:** In Progress

specs/tasks/_index.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ Nominally: **13 sequential tasks**, each S–XL. Most other tasks parallelize of
9797
| TASK-012 | `http_response` fluent `with_*` setters | M2 | Done | TASK-009 |
9898
| TASK-013 | Remove `*_response` subclasses and dispatch virtuals | M2 | Done | TASK-009, TASK-010, TASK-011, TASK-012 |
9999
| TASK-014 | `webserver_impl` skeleton (PIMPL prep) | M3 | In Progress | TASK-002 |
100-
| TASK-015 | `http_request_impl` skeleton (PIMPL split) | M3 | Not Started | TASK-002, TASK-014 |
100+
| TASK-015 | `http_request_impl` skeleton (PIMPL split) | M3 | In Progress | TASK-002, TASK-014 |
101101
| TASK-016 | Per-connection arena for `http_request_impl` | M3 | Not Started | TASK-014, TASK-015 |
102102
| TASK-017 | `http_request` container getters return `const&` | M3 | Not Started | TASK-015 |
103103
| TASK-018 | `http_request` single-key getters return `string_view`, all const | M3 | Not Started | TASK-015, TASK-016 |

specs/unworked_review_issues/2026-05-04_211034_task-015.md

Lines changed: 265 additions & 0 deletions
Large diffs are not rendered by default.

src/Makefile.am

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@
1919
AM_CPPFLAGS = -I../ -I$(srcdir)/httpserver/ -DHTTPSERVER_COMPILATION
2020
METASOURCES = AUTO
2121
lib_LTLIBRARIES = libhttpserver.la
22-
libhttpserver_la_SOURCES = string_utilities.cpp webserver.cpp http_utils.cpp file_info.cpp http_request.cpp http_response.cpp http_resource.cpp create_webserver.cpp detail/http_endpoint.cpp detail/body.cpp
22+
libhttpserver_la_SOURCES = string_utilities.cpp webserver.cpp http_utils.cpp file_info.cpp http_request.cpp http_response.cpp http_resource.cpp create_webserver.cpp create_test_request.cpp detail/http_endpoint.cpp detail/body.cpp
2323
# noinst_HEADERS: shipped in the tarball but NEVER installed under $prefix/include.
2424
# Detail headers (httpserver/detail/*.hpp) live here so they cannot leak to
2525
# downstream consumers — the public surface comes in through <httpserver.hpp>.
26-
noinst_HEADERS = httpserver/string_utilities.hpp httpserver/detail/modded_request.hpp httpserver/detail/http_endpoint.hpp httpserver/detail/body.hpp httpserver/detail/webserver_impl.hpp gettext.h
27-
nobase_include_HEADERS = httpserver.hpp httpserver/body_kind.hpp httpserver/constants.hpp httpserver/create_webserver.hpp httpserver/webserver.hpp httpserver/http_utils.hpp httpserver/file_info.hpp httpserver/http_request.hpp httpserver/http_response.hpp httpserver/http_resource.hpp httpserver/feature_unavailable.hpp httpserver/iovec_entry.hpp httpserver/http_arg_value.hpp httpserver/http_method.hpp
26+
noinst_HEADERS = httpserver/string_utilities.hpp httpserver/detail/modded_request.hpp httpserver/detail/http_endpoint.hpp httpserver/detail/body.hpp httpserver/detail/webserver_impl.hpp httpserver/detail/http_request_impl.hpp gettext.h
27+
nobase_include_HEADERS = httpserver.hpp httpserver/body_kind.hpp httpserver/constants.hpp httpserver/create_webserver.hpp httpserver/create_test_request.hpp httpserver/webserver.hpp httpserver/http_utils.hpp httpserver/file_info.hpp httpserver/http_request.hpp httpserver/http_response.hpp httpserver/http_resource.hpp httpserver/feature_unavailable.hpp httpserver/iovec_entry.hpp httpserver/http_arg_value.hpp httpserver/http_method.hpp
2828

2929
if HAVE_WEBSOCKET
3030
libhttpserver_la_SOURCES += websocket_handler.cpp

src/create_test_request.cpp

Lines changed: 18 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,9 @@
2020
*/
2121

2222
#include "httpserver/create_test_request.hpp"
23+
#include "httpserver/detail/http_request_impl.hpp"
2324

25+
#include <memory>
2426
#include <string>
2527
#include <utility>
2628

@@ -29,40 +31,44 @@ namespace httpserver {
2931
http_request create_test_request::build() {
3032
http_request req;
3133

34+
// Allocate an impl for this test request (connection_ stays null,
35+
// indicating the test-request path to all MHD-touching accessors).
36+
req.impl_ = std::make_unique<detail::http_request_impl>();
37+
3238
req.set_method(_method);
3339
req.set_path(_path);
3440
req.set_version(_version);
3541
req.set_content(_content);
3642

37-
req.headers_local = std::move(_headers);
38-
req.footers_local = std::move(_footers);
39-
req.cookies_local = std::move(_cookies);
43+
req.impl_->headers_local = std::move(_headers);
44+
req.impl_->footers_local = std::move(_footers);
45+
req.impl_->cookies_local = std::move(_cookies);
4046

4147
for (auto& [key, values] : _args) {
4248
for (auto& value : values) {
43-
req.cache->unescaped_args[key].push_back(std::move(value));
49+
req.impl_->unescaped_args[key].push_back(std::move(value));
4450
}
4551
}
46-
req.cache->args_populated = true;
52+
req.impl_->args_populated = true;
4753

4854
if (!_querystring.empty()) {
49-
req.cache->querystring = std::move(_querystring);
55+
req.impl_->querystring = std::move(_querystring);
5056
}
5157

5258
#ifdef HAVE_BAUTH
53-
req.cache->username = std::move(_user);
54-
req.cache->password = std::move(_pass);
59+
req.impl_->username = std::move(_user);
60+
req.impl_->password = std::move(_pass);
5561
#endif // HAVE_BAUTH
5662

5763
#ifdef HAVE_DAUTH
58-
req.cache->digested_user = std::move(_digested_user);
64+
req.impl_->digested_user = std::move(_digested_user);
5965
#endif // HAVE_DAUTH
6066

61-
req.cache->requestor_ip = std::move(_requestor);
62-
req.requestor_port_local = _requestor_port;
67+
req.impl_->requestor_ip = std::move(_requestor);
68+
req.impl_->requestor_port_local = _requestor_port;
6369

6470
#ifdef HAVE_GNUTLS
65-
req.tls_enabled_local = _tls_enabled;
71+
req.impl_->tls_enabled_local = _tls_enabled;
6672
#endif // HAVE_GNUTLS
6773

6874
return req;

0 commit comments

Comments
 (0)