|
curl-fuzzer C++ reference
|
Services curl's single-connection, line-based DICT exchange. More...
#include <dict_mock_server.h>
Public Member Functions | |
| DictMockServer () | |
| Begin without a borrowed protobuf or open socketpair. | |
| ~DictMockServer () override | |
| Release the server-owned socketpair half after curl has returned its client descriptor. | |
| void | ObserveState () override |
| Retain protocol outcomes in coverage and introspector builds. | |
| void | Install (CURL *easy) override |
| Remove the operation deadline so a partial DICT request write exercises sendf()'s explicit no-timeout fallback. | |
| Public Member Functions inherited from proto_fuzzer::PingpongMockServer | |
| ~PingpongMockServer () override | |
| Release the server-owned socketpair half after curl has returned its client descriptor. | |
| const std::string & | control_transcript () const |
| Expose the bounded command capture from the most recent drive so tests can verify protocol states without coupling assertions to curl debug output. | |
| const std::string & | uploaded_data () const |
| Expose a bounded prefix of bytes drained during the most recent body phase while continuing to drain every client byte, so test observability cannot create backpressure. | |
| std::size_t | active_pollset_probe_count () const |
| Report how many requested zero-timeout multi-poll probes ran during the most recent drive. | |
| std::size_t | writable_pollset_probe_count () const |
| Report how often curl retained writable interest while the peer held an incomplete control command. | |
| Public Member Functions inherited from proto_fuzzer::MockServerBase | |
| virtual | ~MockServerBase () |
| Out-of-line destructor so MockConnection can stay forward-declared in the base header (its complete type is only needed where unique_ptr is instantiated for destruction). | |
| virtual void | ConfigureRequestData (ScenarioRequestData *request_data) |
| Bind protocol-specific work to the request-data callbacks after their per-scenario state has been constructed. | |
| CURLcode | DriveScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario) |
| Run 'scenario' to completion on 'easy': allocate a multi, attach 'easy', delegate protocol-specific work to RunLoop, consume its completion message, and clean up. | |
| virtual CURLcode | DriveEasyScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario, bool use_events=false) |
| Run through the public easy entrypoint when a protocol mock can preload all peer work before curl takes control. | |
| virtual ConnectOnlyRunStats | DriveConnectOnlyScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario) |
| Establish a CONNECT_ONLY transport, then perform bounded direct I/O. | |
| void | SetMultiObserver (MultiObserver observer) |
| Register an observer invoked with the live multi handle after 'easy' is attached and before the drive loop starts. | |
| MockConnection * | connection () |
Protected Member Functions | |
| std::unique_ptr< MockConnection > | CreateConnection () override |
| Construct the ordinary plaintext transport only when its client endpoint can queue the complete bounded DICT command. | |
| void | RunLoop (CURLM *multi, CURL *easy, const curl::fuzzer::proto::Scenario &scenario) override |
| Split each sufficiently large socket write while curl constructs and uses this DICT connection. | |
| void | HandleLine (std::string_view line) override |
| Answer the first lookup command in the request and ignore CLIENT, which is a bare identification line. | |
| void | ResetProtocolState () override |
| Reset DICT's response bookkeeping for a new drive. | |
| Protected Member Functions inherited from proto_fuzzer::PingpongMockServer | |
| PingpongMockServer (MultiDrivePolicy drive_policy=MultiDrivePolicy::kPerform) | |
| Construct the shared transport state without a borrowed protobuf or open socketpair. | |
| void | BeginMarkerBody (std::string_view terminator) |
| Enter marker-terminated body mode. | |
| void | BeginLiteralBody (std::size_t length) |
| Enter length-announced literal body mode. | |
| void | BeginExactBody (std::size_t length) |
| Enter exact-length body mode. | |
| void | BeginOpaqueDrain () |
| Enter an opaque drain after a transport upgrade. | |
| virtual void | HandleBodyComplete () |
| Called after a body phase reached its terminator and the parser returned to command mode. | |
| virtual void | QueueShutdownReply () |
| Queue protocol-specific teardown liveness bytes before the control socket is half-closed. | |
| curl_socket_t | HandleOpenSocket (curlsocktype purpose=CURLSOCKTYPE_IPCXN, struct curl_sockaddr *address=nullptr) override |
| Create the single control socketpair and queue the server greeting. | |
| void | RunLoop (CURLM *multi, CURL *easy, const curl::fuzzer::proto::Scenario &scenario) override |
| Alternate curl transitions with immediate peer service until the transfer completes or deterministic idle/operation caps win. | |
| void | HandleDetachedMulti (CurlMultiPtr multi) override |
| Give curl's graceful shutdown one last chance to emit its teardown command while the peer still owns its read half, then release the multi as the base class would. | |
| void | ObserveIncomingData (const unsigned char *data, std::size_t size) override |
| Append decoded application bytes to the pending parser buffer. | |
| const curl::fuzzer::proto::Scenario * | scenario () const |
| Borrowed scenario for the synchronous drive, or nullptr outside RunLoop(). | |
| const std::string * | NextControlReply () |
| Return the next command-aligned response within the shared response-count budget. | |
| bool | WriteControlBytes (std::string_view bytes) |
| Keep failed peer writes local to the mock. | |
| bool | WriteNextReply () |
| Consume the next scripted reply. | |
| void | ShutdownControlWrite () |
| Half-close the server-to-client direction while retaining the read half. | |
| Protected Member Functions inherited from proto_fuzzer::MockServerBase | |
| MockServerBase (MultiDrivePolicy drive_policy=MultiDrivePolicy::kPerform) | |
| Construct an empty base instance with a fixed multi-drive policy. | |
| virtual SocketSetupDisposition | GetSocketSetupDisposition (curl_socket_t curlfd, curlsocktype purpose) const |
| Describe the socket returned by HandleOpenSocket without issuing native descriptor queries. | |
| MultiSocketDriver * | multi_socket_driver () |
| Expose the callback state installed for the current socket-action drive. | |
| std::size_t | additional_handle_cleanup_count () const |
| void | ResumeResponseIfRequested (CURL *easy) |
| Resume receive-side callback output at one bounded drive boundary when the dedicated API plan requested it. | |
| void | ApplyPendingBackpressure () |
| Apply the BackpressureConfig cached by DriveScenario to the new connection_. | |
Additional Inherited Members | |
| Public Types inherited from proto_fuzzer::MockServerBase | |
| using | MultiObserver = std::function<void(CURLM*)> |
| Callback type used to publish the driving multi handle to observers. | |
| Static Protected Member Functions inherited from proto_fuzzer::PingpongMockServer | |
| static std::string_view | FirstToken (std::string_view line) |
| Remove optional leading horizontal whitespace and return the first token without allocating. | |
| static std::string_view | SecondToken (std::string_view line) |
| Skip the first token and return the second whitespace-delimited token without allocating. | |
| static bool | TokenEquals (std::string_view token, std::string_view expected_uppercase) |
| Fold only ASCII lowercase command letters. | |
| Static Protected Member Functions inherited from proto_fuzzer::MockServerBase | |
| static int | WaitOnMultiFdset (CURLM *multi, CURLMcode *rc) |
| Wait on curl's fdset with a short timeout. | |
| static void | ProbeMultiPollset (CURLM *multi) |
| Ask curl to construct and inspect its connection-filter pollset without waiting. | |
| static bool | MultiPollsetWantsWrite (CURLM *multi, curl_socket_t socket) |
| Inspect one socket's current writable interest through curl's public multi fdset API. | |
| static bool | UsesTimedDrive (const curl::fuzzer::proto::Scenario &scenario) |
| Treat a non-default BackpressureConfig as an explicit request for the slower, timed drive policy. | |
| Protected Attributes inherited from proto_fuzzer::MockServerBase | |
| std::unique_ptr< MockConnection > | connection_ |
| The per-scenario MockConnection, lazily created by HandleOpenSocket(). | |
| int | pending_recv_buf_bytes_ |
| Cached SO_RCVBUF/SO_SNDBUF setting in bytes. | |
| std::size_t | pending_drain_limit_ |
| Cached per-call DrainIncoming byte budget. | |
| MultiSocketDriver * | multi_socket_driver_ |
| Non-owning pointer into DriveScenario's stack. | |
| std::size_t | additional_handle_cleanup_count_ |
| Number of application-created handles, excluding the caller's parent, successfully removed from the current multi and cleaned up. | |
| bool | resume_response_ |
| True only for an API-plan multi drive with its one-shot write callback. | |
| MultiObserver | multi_observer_ |
| Observer receiving the live multi handle at the start of a drive. | |
| Static Protected Attributes inherited from proto_fuzzer::MockServerBase | |
| static constexpr int | kMaxDriveIterations = 512 |
| Hard operation budget for one scenario. | |
| static constexpr int | kMaxIdleIterations = 8 |
| Consecutive no-progress budget for ordinary scenarios. | |
| static constexpr int | kMaxTimedIdleIterations = 256 |
| Explicit backpressure scenarios get a larger idle budget and may use the short timed wait above. | |
Services curl's single-connection, line-based DICT exchange.
curl's DICT handler writes its complete request in one send: a CLIENT identification line, one lookup command (DEFINE, MATCH, SHOW, or a raw command derived from the URL path), then QUIT. It then reads the response as an unbounded byte stream, so the server half-closes the write side after the scripted body to make the next perform observe end-of-response.
Scenario.connection has no greeting in this protocol. initial_response is normally empty, and the first non-CLIENT/non-QUIT on_readable entry is the complete multi-line response body, including the RFC 2229 .\r\n terminator when the seed wants one. Remaining entries are unused because curl never waits for a per-command reply.
Definition at line 33 of file dict_mock_server.h.
| proto_fuzzer::DictMockServer::DictMockServer | ( | ) |
Begin without a borrowed protobuf or open socketpair.
RunLoop borrows a Scenario only for the synchronous DriveScenario call in which socket callbacks can run.
Definition at line 74 of file dict_mock_server.cc.
|
overridedefault |
Release the server-owned socketpair half after curl has returned its client descriptor.
The out-of-line destructor keeps MockConnection's complete type local to this translation unit.
|
overrideprotectedvirtual |
Construct the ordinary plaintext transport only when its client endpoint can queue the complete bounded DICT command.
sendf() owns the thread until that command is written, so the outer peer cannot create space meanwhile.
Reimplemented from proto_fuzzer::PingpongMockServer.
Definition at line 95 of file dict_mock_server.cc.
|
overrideprotectedvirtual |
Answer the first lookup command in the request and ignore CLIENT, which is a bare identification line.
curl normally writes CLIENT, the lookup, and QUIT together and then waits for the response body; QUIT is therefore only answered when it arrives without a preceding lookup command (for example a URL with no path).
| line | One newline-terminated command from curl. |
Implements proto_fuzzer::PingpongMockServer.
Definition at line 142 of file dict_mock_server.cc.
|
overridevirtual |
Remove the operation deadline so a partial DICT request write exercises sendf()'s explicit no-timeout fallback.
The bounded drive and writable socketpair keep this path independent of wall-clock timing.
| easy | DICT easy handle configured before the connection is opened. |
Reimplemented from proto_fuzzer::MockServerBase.
Definition at line 85 of file dict_mock_server.cc.
|
overrideprotectedvirtual |
Reset DICT's response bookkeeping for a new drive.
The shared base has already cleared the transport, reply cursor, transcript, upload capture, and any in-flight body phase.
Reimplemented from proto_fuzzer::PingpongMockServer.
Definition at line 120 of file dict_mock_server.cc.
|
overrideprotectedvirtual |
Split each sufficiently large socket write while curl constructs and uses this DICT connection.
curl's debug socket filter snapshots the environment during its first perform; restoring it before DriveScenario tears down the multi does not change that connection, and prevents a DICT input from perturbing later non-DICT inputs in a mixed process.
| multi | Multi handle containing the DICT easy handle. |
| easy | Easy handle already installed on this mock. |
| scenario | DICT script borrowed for the synchronous drive. |
Implements proto_fuzzer::MockServerBase.
Definition at line 112 of file dict_mock_server.cc.