curl-fuzzer C++ reference
Loading...
Searching...
No Matches
happy_eyeballs_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
11
12#ifndef PROTO_FUZZER_HAPPY_EYEBALLS_MOCK_SERVER_H_
13#define PROTO_FUZZER_HAPPY_EYEBALLS_MOCK_SERVER_H_
14
15#include <curl/curl.h>
16
17#include <cstddef>
18#include <string>
19#include <vector>
20
21#include "curl_fuzzer.pb.h"
24
25namespace proto_fuzzer {
26
33class HappyEyeballsMockServer : public MockServerBase {
34 public:
36 ~HappyEyeballsMockServer() override;
37
39 HappyEyeballsMockServer& operator=(const HappyEyeballsMockServer&) = delete;
40
41 void Install(CURL* easy) override;
42
43 void ConfigureRequestData(ScenarioRequestData* request_data) override;
44
46 std::size_t opened_socket_count() const { return opened_socket_count_; }
47
49 std::size_t accepted_peer_count() const { return accepted_peer_count_; }
50
52 int listener_port() const { return listener_port_; }
53
54 protected:
55 curl_socket_t HandleOpenSocket(curlsocktype purpose, struct curl_sockaddr* address) override;
56
57 SocketSetupDisposition GetSocketSetupDisposition(curl_socket_t curlfd, curlsocktype purpose) const override;
58
59 void RunLoop(CURLM* multi, CURL* easy, const curl::fuzzer::proto::Scenario& scenario) override;
60
61 private:
63 struct Peer {
64 int fd = -1;
65 const curl::fuzzer::proto::Connection* script = nullptr;
66 std::size_t next_chunk = 0;
67 std::string pending;
68 std::size_t pending_offset = 0;
69 bool sent_final = false;
70 };
71
72 bool OpenListeners();
73
74 void CloseListeners();
75
76 bool AcceptPending();
77
78 bool ServicePeers();
79
80 void ClosePeer(Peer* peer);
81
82 const curl::fuzzer::proto::Connection* ScriptForAccept(std::size_t index) const;
83
84 bool IsOwnedDestination(const struct curl_sockaddr* address) const;
85
86 CURL* easy_;
87
89 int race_fd_;
91 int serve_fd_;
92 int listener_port_;
94 std::string serve_address_;
96 std::vector<int> dummy_fds_;
97
98 std::size_t opened_socket_count_;
99 std::size_t accepted_peer_count_;
100
104 bool setup_ok_ = false;
105
107 const curl::fuzzer::proto::Scenario* scenario_;
108
109 std::vector<Peer> peers_;
110
112 CurlSlistPtr resolve_list_;
113};
114
115} // namespace proto_fuzzer
116
117#endif // PROTO_FUZZER_HAPPY_EYEBALLS_MOCK_SERVER_H_
void RunLoop(CURLM *multi, CURL *easy, const curl::fuzzer::proto::Scenario &scenario) override
Run a bounded perform loop that also accepts real loopback connections and serves their response scri...
curl_socket_t HandleOpenSocket(curlsocktype purpose, struct curl_sockaddr *address) override
Hand curl a fresh unconnected socket for every address its happy-eyeballs filter decides to race.
~HappyEyeballsMockServer() override
Release listeners and accepted loopback peers.
void Install(CURL *easy) override
Install the shared socket callbacks and remember the easy handle for the later resolve/port/timeout s...
HappyEyeballsMockServer()
Construct an idle peer with no listener or accepted connections.
SocketSetupDisposition GetSocketSetupDisposition(curl_socket_t curlfd, curlsocktype purpose) const override
Stream peers must follow curl's ordinary connect path; unlike the socketpair mocks,...
void ConfigureRequestData(ScenarioRequestData *request_data) override
Replace the resolver lane's single-address mapping with a two-address entry for the fixed canonical h...
Builds HTTP headers or TELNET options, MIME state, and upload callbacks whose storage or userdata lib...
Common ownership types for independently cleaned-up curl handles.
MockServerBase — common plumbing shared by every protocol-specific mock server.
SocketSetupDisposition
Tell curl whether an application-provided socket still needs its normal connect/options setup or alre...