curl-fuzzer C++ reference
Loading...
Searching...
No Matches
proto_fuzzer::ImapMockServer Class Reference

Services curl's single-connection, tagged IMAP exchange. More...

#include <imap_mock_server.h>

Inheritance diagram for proto_fuzzer::ImapMockServer:
proto_fuzzer::PingpongMockServer proto_fuzzer::MockServerBase proto_fuzzer::IncomingDataObserver proto_fuzzer::ImapsMockServer

Public Member Functions

 ImapMockServer ()
 Begin without a borrowed protobuf or open socketpair.
 ~ImapMockServer () 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.
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 Install (CURL *easy)
 Install the common OPENSOCKETFUNCTION / OPENSOCKETDATA / SOCKOPTFUNCTION callbacks on 'easy'.
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

void HandleLine (std::string_view line) override
 Advance one reply for every complete command or AUTHENTICATE continuation.
void ResetProtocolState () override
 Clear the tag remembered from the previous drive.
void QueueShutdownReply () override
 Queue a tagged completion for curl's blocking LOGOUT during teardown.
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.
virtual std::unique_ptr< MockConnection > CreateConnection ()
 Create the default plaintext transport.
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.
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.

Detailed Description

Services curl's single-connection, tagged IMAP exchange.

IMAP needs neither a data channel nor a second script per socket. Curl sends one tagged command at a time and waits for the matching tagged completion. initial_response is the * OK greeting; each on_readable entry replies to the next command or AUTHENTICATE continuation payload.

Unlike FTP and POP3, IMAP command tags are generated by curl from a process-global connection id, so a seed cannot contain them. A scripted line that begins with OK, NO, BAD, or PREAUTH therefore has the tag of the command currently being answered prepended. Untagged (*) and continuation (+) lines are sent unchanged. A {N} literal at the end of a line is copied with the next N bytes untouched, so FETCH bodies and a tagged completion can share one scripted chunk.

After a + AUTHENTICATE reply, client base64 and * cancellation lines are opaque continuation data. The peer preserves the initiating command tag across any number of rounds and releases it only after the scripted tagged completion.

APPEND is the only command whose reply is not written in full up front. After the peer accepts a + continuation it drains exactly the literal size announced by the command and pre-queues the next scripted reply as the final tagged completion, mirroring curl's blocking imap_done() wait.

Subclasses replace the transport through CreateConnection(). The implicit- TLS IMAPS peer uses that hook to wrap the identical tagged command exchange in a verified OpenSSL connection without changing the parser.

Definition at line 50 of file imap_mock_server.h.

Constructor & Destructor Documentation

◆ ImapMockServer()

proto_fuzzer::ImapMockServer::ImapMockServer ( )
default

Begin without a borrowed protobuf or open socketpair.

RunLoop borrows a Scenario only for the synchronous DriveScenario call in which socket callbacks can run.

◆ ~ImapMockServer()

proto_fuzzer::ImapMockServer::~ImapMockServer ( )
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.

Member Function Documentation

◆ HandleLine()

void proto_fuzzer::ImapMockServer::HandleLine ( std::string_view command)
overrideprotectedvirtual

Advance one reply for every complete command or AUTHENTICATE continuation.

Continuation data keeps the initiating command tag until a scripted tagged status ends the exchange. A + reply to APPEND enters literal-draining mode and pre-queues the next scripted reply as the final tagged completion. Curl's imap_done() waits for that completion inside curl_multi_perform, so the outer peer loop cannot provide it later.

Parameters
commandOne newline-terminated client line from curl.

Implements proto_fuzzer::PingpongMockServer.

Definition at line 280 of file imap_mock_server.cc.

◆ QueueShutdownReply()

void proto_fuzzer::ImapMockServer::QueueShutdownReply ( )
overrideprotectedvirtual

Queue a tagged completion for curl's blocking LOGOUT during teardown.

Any real scripted response already consumed by curl still determines the transfer result; this line only prevents a teardown timeout.

Reimplemented from proto_fuzzer::PingpongMockServer.

Definition at line 335 of file imap_mock_server.cc.

◆ ResetProtocolState()

void proto_fuzzer::ImapMockServer::ResetProtocolState ( )
overrideprotectedvirtual

Clear the tag remembered from the previous drive.

The shared base has already reset the transport, reply cursor, transcript, upload capture, and body phase.

Reimplemented from proto_fuzzer::PingpongMockServer.

Definition at line 57 of file imap_mock_server.cc.


The documentation for this class was generated from the following files: