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

Runs MockServer's existing bounded HTTP scripts through a real TLS peer. More...

#include <tls_mock_server.h>

Inheritance diagram for proto_fuzzer::TlsMockServer:
proto_fuzzer::MockServer proto_fuzzer::MockServerBase proto_fuzzer::H2OriginMockServer proto_fuzzer::H2ProxyMockServer proto_fuzzer::DohHttpsRrMockServer

Public Member Functions

 TlsMockServer ()
 Build one reusable in-process server context per fuzz iteration.
 TlsMockServer (curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain, curl::fuzzer::proto::TlsHandshakeProfile handshake_profile=curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT)
 Select one bounded certificate-chain profile for an HTTP/1.1 TLS peer.
 ~TlsMockServer () override
 Release SSL objects before their owning server context.
void Install (CURL *easy) override
 Install common socket callbacks and a stable local trust anchor.
bool saw_live_tls_session () const
std::size_t exported_session_count () const
std::size_t imported_session_count () const
int negotiated_tls_version () const
std::size_t completed_handshake_count () const
std::size_t reused_session_count () const
std::size_t write_retry_count () const
std::string negotiated_alpn () const
std::string negotiated_group () const
int ech_status () const
std::string ech_inner_name () const
std::string ech_outer_name () const
Public Member Functions inherited from proto_fuzzer::MockServer
 MockServer (MultiDrivePolicy drive_policy=MultiDrivePolicy::kPerform)
 Construct an idle MockServer with no scripted responses or open peers.
 ~MockServer () override
 Default destructor; current and previous MockConnections clean up their server-side descriptors only after curl has been removed from the multi.
void SetScripts (const curl::fuzzer::proto::Scenario &scenario)
 Build the complete borrowed script table before entering curl.
void SetKeepConnectionsOpen (bool keep_open)
 Keep completed response sockets writable instead of half-closing them.
CURLcode DriveEasyScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario, bool use_events=false) override
 Preload all bounded response bytes from inside OPENSOCKETFUNCTION, where the mock still owns both socketpair ends, and half-close the peer when the preload finishes.
ConnectOnlyRunStats DriveConnectOnlyScenario (CURL *easy, const curl::fuzzer::proto::Scenario &scenario) override
 Establish only the HTTP transport, then pass bounded application bytes through curl's public direct-I/O wrappers.
bool DeliverNextChunk ()
 Push the next queued chunk.
bool has_more_chunks () const
bool ServiceConnections ()
 Service one deterministic application event-loop turn by draining all available request bytes and releasing at most one response chunk.
std::size_t opened_connection_count () const
 Report how many peer sockets curl opened during the current script run.
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 ObserveState ()
 Default no-op for peers without protocol-specific observations.
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.
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

 TlsMockServer (TlsApplicationProtocol protocol, curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain=curl::fuzzer::proto::TLS_CERTIFICATE_CHAIN_DEFAULT_EC, TlsGroupPolicy group_policy=TlsGroupPolicy::kProviderDefault, curl::fuzzer::proto::TlsHandshakeProfile handshake_profile=curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT)
 Construct the shared TLS transport for a protocol-specific derived peer with one fixed ALPN outcome.
TlsGroupPolicy group_policy () const
std::unique_ptr< MockConnection > CreateConnection () override
 Wrap one socketpair server endpoint in an OpenSSL acceptor consumed by MockServer.
void ObserveActiveTransfer (CURL *easy) override
 Query while the connection filters are attached.
Protected Member Functions inherited from proto_fuzzer::MockServer
void ResetConnections ()
 Release all current and retired socketpairs before resetting transport- specific state.
virtual bool SupportsRepeatedPollsetProbe () const
 Ordinary HTTP and compatibility peers retain the historical perform-only loop even if an append-only scenario field is present.
curl_socket_t HandleOpenSocket (curlsocktype purpose=CURLSOCKTYPE_IPCXN, struct curl_sockaddr *address=nullptr) override
 Called by the OPENSOCKETFUNCTION trampoline in the base class.
void RunLoop (CURLM *multi, CURL *easy, const curl::fuzzer::proto::Scenario &scenario) override
 Seed the mock from the scenario, then drive the perform loop until curl is done or a deterministic operation/idle budget is hit.
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 void HandleDetachedMulti (CurlMultiPtr multi)
 Dispose of or retain the multi after its easy handle has been removed.
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::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

Runs MockServer's existing bounded HTTP scripts through a real TLS peer.

The TLS connection itself remains nonblocking and is advanced by the same deterministic outer loop that services plaintext socketpairs.

Definition at line 89 of file tls_mock_server.h.

Constructor & Destructor Documentation

◆ TlsMockServer() [1/2]

proto_fuzzer::TlsMockServer::TlsMockServer ( curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain,
curl::fuzzer::proto::TlsHandshakeProfile handshake_profile = curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT )
explicit

Select one bounded certificate-chain profile for an HTTP/1.1 TLS peer.

Parameters
certificate_chainPeer certificate chain presented to curl.
handshake_profileClosed peer-side handshake terminal.

Definition at line 658 of file tls_mock_server.cc.

◆ ~TlsMockServer()

proto_fuzzer::TlsMockServer::~TlsMockServer ( )
override

Release SSL objects before their owning server context.

OpenSSL reference counting makes the reverse order legal, but making the ownership order explicit keeps future transport state from acquiring a hidden dependency.

Definition at line 681 of file tls_mock_server.cc.

◆ TlsMockServer() [2/2]

proto_fuzzer::TlsMockServer::TlsMockServer ( TlsApplicationProtocol protocol,
curl::fuzzer::proto::TlsCertificateChainProfile certificate_chain = curl::fuzzer::proto::TLS_CERTIFICATE_CHAIN_DEFAULT_EC,
TlsGroupPolicy group_policy = TlsGroupPolicy::kProviderDefault,
curl::fuzzer::proto::TlsHandshakeProfile handshake_profile = curl::fuzzer::proto::TLS_HANDSHAKE_DEFAULT )
explicitprotected

Construct the shared TLS transport for a protocol-specific derived peer with one fixed ALPN outcome.

Parameters
protocolFixed application protocol the server must negotiate.
certificate_chainPeer certificate chain presented to curl.
group_policyImmutable server key-exchange group policy.
handshake_profileClosed peer-side handshake terminal.

Definition at line 669 of file tls_mock_server.cc.

Member Function Documentation

◆ completed_handshake_count()

std::size_t proto_fuzzer::TlsMockServer::completed_handshake_count ( ) const
Returns
number of connections that completed TLS negotiation.

Definition at line 709 of file tls_mock_server.cc.

◆ CreateConnection()

std::unique_ptr< MockConnection > proto_fuzzer::TlsMockServer::CreateConnection ( )
overrideprotectedvirtual

Wrap one socketpair server endpoint in an OpenSSL acceptor consumed by MockServer.

Returns
a failed connection when context setup was unavailable.

Reimplemented from proto_fuzzer::MockServer.

Definition at line 739 of file tls_mock_server.cc.

◆ ech_inner_name()

std::string proto_fuzzer::TlsMockServer::ech_inner_name ( ) const
Returns
encrypted inner SNI recovered by the ECH-capable server.

Definition at line 731 of file tls_mock_server.cc.

◆ ech_outer_name()

std::string proto_fuzzer::TlsMockServer::ech_outer_name ( ) const
Returns
public outer SNI visible before ECH decryption.

Definition at line 734 of file tls_mock_server.cc.

◆ ech_status()

int proto_fuzzer::TlsMockServer::ech_status ( ) const
Returns
OpenSSL's ECH status for the most recent completed handshake. Builds without ECH return a negative sentinel.

Definition at line 728 of file tls_mock_server.cc.

◆ exported_session_count()

std::size_t proto_fuzzer::TlsMockServer::exported_session_count ( ) const
Returns
number of session representations copied by the export callback out of curl's cache.

Definition at line 698 of file tls_mock_server.cc.

◆ group_policy()

TlsGroupPolicy proto_fuzzer::TlsMockServer::group_policy ( ) const
protected
Returns
Immutable key-exchange group policy selected at construction.

Definition at line 721 of file tls_mock_server.cc.

◆ imported_session_count()

std::size_t proto_fuzzer::TlsMockServer::imported_session_count ( ) const
Returns
number of copied session representations successfully imported into curl's cache again.

Definition at line 702 of file tls_mock_server.cc.

◆ Install()

void proto_fuzzer::TlsMockServer::Install ( CURL * easy)
overridevirtual

Install common socket callbacks and a stable local trust anchor.

Curl copies the blob descriptor during setopt and borrows the inline certificate bytes, whose program lifetime safely exceeds every easy handle. Scenario options run afterwards and can still disable verification or select failing TLS settings.

Parameters
easyEasy handle that will connect to this TLS peer.

Reimplemented from proto_fuzzer::MockServerBase.

Definition at line 688 of file tls_mock_server.cc.

◆ negotiated_alpn()

std::string proto_fuzzer::TlsMockServer::negotiated_alpn ( ) const
Returns
ALPN protocol selected by the most recent completed handshake.

Definition at line 718 of file tls_mock_server.cc.

◆ negotiated_group()

std::string proto_fuzzer::TlsMockServer::negotiated_group ( ) const
Returns
Key-exchange group from the most recent completed handshake.

Definition at line 724 of file tls_mock_server.cc.

◆ negotiated_tls_version()

int proto_fuzzer::TlsMockServer::negotiated_tls_version ( ) const
Returns
protocol version selected by the most recent completed handshake, or zero when no connection completed TLS negotiation.

Definition at line 706 of file tls_mock_server.cc.

◆ ObserveActiveTransfer()

void proto_fuzzer::TlsMockServer::ObserveActiveTransfer ( CURL * easy)
overrideprotectedvirtual

Query while the connection filters are attached.

Result-info probes stop after the first live result, and session export has its own fixed attempt bound, so neither recurs throughout every HTTP parser iteration.

Parameters
easyActive easy handle whose connection filters remain attached.

Reimplemented from proto_fuzzer::MockServer.

Definition at line 745 of file tls_mock_server.cc.

◆ reused_session_count()

std::size_t proto_fuzzer::TlsMockServer::reused_session_count ( ) const
Returns
number of completed connections that resumed an earlier session.

Definition at line 712 of file tls_mock_server.cc.

◆ saw_live_tls_session()

bool proto_fuzzer::TlsMockServer::saw_live_tls_session ( ) const
Returns
true once curl exposed a live TLS backend session during drive.

Definition at line 694 of file tls_mock_server.cc.

◆ write_retry_count()

std::size_t proto_fuzzer::TlsMockServer::write_retry_count ( ) const
Returns
number of application writes OpenSSL required an exact retry for.

Definition at line 715 of file tls_mock_server.cc.


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