curl-fuzzer C++ reference
Loading...
Searching...
No Matches
doh_https_rr_mock_server.h
Go to the documentation of this file.
1/*
2 * Copyright (C) Max Dymond, <cmeister2@gmail.com>, et al.
3 *
4 * SPDX-License-Identifier: curl
5 */
6
10
11#ifndef PROTO_FUZZER_DOH_HTTPS_RR_MOCK_SERVER_H_
12#define PROTO_FUZZER_DOH_HTTPS_RR_MOCK_SERVER_H_
13
14#include <curl/curl.h>
15
16#include <array>
17#include <cstddef>
18#include <cstdio>
19#include <memory>
20#include <string>
21
22#include "curl_fuzzer.pb.h"
24
25namespace proto_fuzzer {
26
28
41 public:
42 explicit DohHttpsRrMockServer(const curl::fuzzer::proto::Scenario& scenario);
43 ~DohHttpsRrMockServer() override;
44
46 DohHttpsRrMockServer& operator=(const DohHttpsRrMockServer&) = delete;
47
48 void Install(CURL* easy) override;
49
50 void ConfigureRequestData(ScenarioRequestData* request_data) override;
51
53 std::size_t doh_request_count() const { return doh_request_count_; }
54
56 std::size_t httpsrr_answer_count() const { return httpsrr_answer_count_; }
57
59 const std::string& doh_url() const { return doh_url_; }
60
62 std::size_t doh_tls_handshake_count() const {
63 return doh_tls_transport_ == nullptr ? 0 : doh_tls_transport_->completed_handshake_count();
64 }
65
67 std::string doh_tls_alpn() const {
68 return doh_tls_transport_ == nullptr ? std::string() : doh_tls_transport_->negotiated_alpn();
69 }
70
71 std::string custom_stderr_contents();
72
73 bool tls_path_fixture_ready() const;
74
76 std::size_t internal_ssl_ctx_callback_count() const { return internal_ssl_ctx_callback_count_; }
77
78 protected:
79 void ObserveActiveTransfer(CURL* easy) override;
80
81 void RunLoop(CURLM* multi, CURL* easy, const curl::fuzzer::proto::Scenario& scenario) override;
82
83 private:
85 static constexpr std::size_t kMaxConnections = 8;
88 static constexpr std::size_t kMaxRequestBytes = 4096;
89 static constexpr std::size_t kMaxResponseBytes = 4096;
90 static constexpr std::size_t kMaxDiagnosticBytes = 4096;
91
93 struct DohConnection final : public IncomingDataObserver {
94 bool active() const { return fd >= 0 || tls != nullptr; }
95 void ObserveIncomingData(const unsigned char* data, std::size_t size) override;
96
97 int fd = -1;
98 std::unique_ptr<MockConnection> tls;
99 std::string request;
100 std::string response;
101 std::size_t response_offset = 0;
102 std::size_t deferred_write_turns = 0;
103 bool writing = false;
104 bool request_overflow = false;
105 };
106
107 virtual bool StartListener();
108 void StopListener();
109 bool ConfigureHttpsOptions();
110 static CURLcode ObserveSslContext(CURL* easy, void* ssl_context, void* user_data);
111 bool BeginProxyBypass();
112 void EndProxyBypass();
113
114 void ServiceDohConnections();
115 void AcceptConnections();
116 void CloseConnection(DohConnection* connection);
117 bool CompleteRequest(DohConnection* connection);
118
119 CURL* easy_;
120 int listener_;
121 std::string doh_url_;
122
124 curl::fuzzer::proto::DohOptionProbeMode option_probe_mode_;
125
127 curl::fuzzer::proto::DohTransportMode transport_mode_;
128
130 std::FILE* diagnostic_stream_;
131
133 std::unique_ptr<BoundedAnonymousInputFile> tls_path_fixture_;
134
136 std::size_t internal_ssl_ctx_callback_count_;
137
140 std::unique_ptr<TlsMockTransport> doh_tls_transport_;
141
142 std::array<DohConnection, kMaxConnections> connections_;
143 std::size_t doh_request_count_;
144 std::size_t httpsrr_answer_count_;
145
147 curl::fuzzer::proto::DohResponseMode response_mode_;
148
151 bool defer_httpsrr_;
152
156 bool setup_ok_;
157
160 bool proxy_bypass_active_;
161 bool lower_no_proxy_was_set_;
162 bool upper_no_proxy_was_set_;
163 std::string saved_no_proxy_lower_;
164 std::string saved_no_proxy_upper_;
165};
166
167} // namespace proto_fuzzer
168
169#endif // PROTO_FUZZER_DOH_HTTPS_RR_MOCK_SERVER_H_
A reusable anonymous regular file whose descriptor remains reachable as a pathname.
void Install(CURL *easy) override
Bind the DoH listener, point CURLOPT_DOH_URL at it, and bypass ambient proxies for curl's internal ha...
void ConfigureRequestData(ScenarioRequestData *request_data) override
Reassert the listener URL and fixed H2 selection after the scenario's option prefix has run.
DohHttpsRrMockServer(const curl::fuzzer::proto::Scenario &scenario)
Construct an idle responder.
~DohHttpsRrMockServer() override
Release the loopback listener and restore the proxy environment before the base carrier tears down it...
void ObserveActiveTransfer(CURL *easy) override
Observe the outer transfer and advance every pending DoH exchange.
void RunLoop(CURLM *multi, CURL *easy, const curl::fuzzer::proto::Scenario &scenario) override
Refuse to enter libcurl when any local resolver setup step failed.
std::string custom_stderr_contents()
Read a bounded prefix without changing the stream position retained by libcurl.
H2OriginMockServer(curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain=curl::fuzzer::proto::TLS_CERTIFICATE_CHAIN_DEFAULT_EC, curl::fuzzer::proto::TlsGroupProfile group_profile=curl::fuzzer::proto::TLS_GROUP_X25519)
Construct an HTTP/2 TLS peer with the selected certificate chain.
Receives bytes after any transport decoding.
Builds HTTP headers or TELNET options, MIME state, and upload callbacks whose storage or userdata lib...
HTTPS origin peer with a fixed HTTP/2 application protocol.