client_side.cc File Reference
#include "squid.h"
#include "acl/FilledChecklist.h"
#include "anyp/PortCfg.h"
#include "base/Subscription.h"
#include "base/TextException.h"
#include "CachePeer.h"
#include "client_db.h"
#include "client_side.h"
#include "client_side_reply.h"
#include "client_side_request.h"
#include "ClientRequestContext.h"
#include "clientStream.h"
#include "comm.h"
#include "comm/Connection.h"
#include "comm/Loops.h"
#include "comm/Read.h"
#include "comm/TcpAcceptor.h"
#include "comm/Write.h"
#include "CommCalls.h"
#include "errorpage.h"
#include "fd.h"
#include "fde.h"
#include "fqdncache.h"
#include "FwdState.h"
#include "globals.h"
#include "helper.h"
#include "helper/Reply.h"
#include "http.h"
#include "http/one/RequestParser.h"
#include "http/one/TeChunkedParser.h"
#include "http/Stream.h"
#include "HttpHdrContRange.h"
#include "HttpHeaderTools.h"
#include "HttpReply.h"
#include "HttpRequest.h"
#include "ident/Config.h"
#include "ident/Ident.h"
#include "internal.h"
#include "ipc/FdNotes.h"
#include "ipc/StartListening.h"
#include "log/access_log.h"
#include "MemBuf.h"
#include "MemObject.h"
#include "mime_header.h"
#include "parser/Tokenizer.h"
#include "profiler/Profiler.h"
#include "rfc1738.h"
#include "security/NegotiationHistory.h"
#include "servers/forward.h"
#include "SquidConfig.h"
#include "SquidTime.h"
#include "StatCounters.h"
#include "StatHist.h"
#include "Store.h"
#include "TimeOrTag.h"
#include "tools.h"
#include "URL.h"
#include "auth/UserRequest.h"
#include "ClientInfo.h"
#include "MessageDelayPools.h"
#include "ssl/bio.h"
#include "ssl/context_storage.h"
#include "ssl/gadgets.h"
#include "ssl/helper.h"
#include "ssl/ProxyCerts.h"
#include "ssl/ServerBump.h"
#include "ssl/support.h"
#include "util.h"
#include <climits>
#include <cmath>
#include <limits>

Go to the source code of this file.

Classes

class  ListeningStartedDialer
 dials clientListenerConnectionOpened call More...
 

Functions

static void clientListenerConnectionOpened (AnyP::PortCfgPointer &s, const Ipc::FdNoteId portTypeNote, const Subscription::Pointer &sub)
 process clientHttpConnectionsOpen result More...
 
static int clientIsContentLengthValid (HttpRequest *r)
 checks body length of non-chunked requests More...
 
static int clientIsRequestBodyTooLargeForPolicy (int64_t bodyLength)
 
static void clientUpdateStatHistCounters (const LogTags &logType, int svc_time)
 
static void clientUpdateStatCounters (const LogTags &logType)
 
static void clientUpdateHierCounters (HierarchyLogEntry *)
 
static bool clientPingHasFinished (ping_data const *aPing)
 
void prepareLogWithRequestDetails (HttpRequest *, AccessLogEntry::Pointer &)
 
static void ClientSocketContextPushDeferredIfNeeded (Http::StreamPointer deferredRequest, ConnStateData *conn)
 
char * skipLeadingSpace (char *aString)
 
static void clientIdentDone (const char *ident, void *data)
 
void httpRequestFree (void *data)
 
void clientSetKeepaliveFlag (ClientHttpRequest *http)
 decide whether to expect multiple requests on the corresponding connection More...
 
void clientPackTermBound (String boundary, MemBuf *mb)
 put terminating boundary for multiparts to the buffer More...
 
void clientPackRangeHdr (const HttpReplyPointer &rep, const HttpHdrRangeSpec *spec, String boundary, MemBuf *mb)
 append a "part" HTTP header (as in a multi-part/range reply) to the buffer More...
 
void clientSocketRecipient (clientStreamNode *node, ClientHttpRequest *http, HttpReply *rep, StoreIOBuffer receivedData)
 
void clientSocketDetach (clientStreamNode *node, ClientHttpRequest *http)
 
const char * findTrailingHTTPVersion (const char *uriAndHTTPVersion, const char *end)
 
void setLogUri (ClientHttpRequest *http, char const *uri, bool cleanUrl)
 
static void prepareAcceleratedURL (ConnStateData *conn, ClientHttpRequest *http, const Http1::RequestParserPointer &hp)
 
static void prepareTransparentURL (ConnStateData *conn, ClientHttpRequest *http, const Http1::RequestParserPointer &hp)
 
Http::StreamparseHttpRequest (ConnStateData *csd, const Http1::RequestParserPointer &hp)
 
bool clientTunnelOnError (ConnStateData *conn, Http::StreamPointer &context, HttpRequest::Pointer &request, const HttpRequestMethod &method, err_type requestError)
 
void clientProcessRequestFinished (ConnStateData *conn, const HttpRequest::Pointer &request)
 
void clientProcessRequest (ConnStateData *conn, const Http1::RequestParserPointer &hp, Http::Stream *context)
 
static void clientLifetimeTimeout (const CommTimeoutCbParams &io)
 
void httpAccept (const CommAcceptCbParams &params)
 
static bool httpsCreate (const Comm::ConnectionPointer &conn, const Security::ContextPointer &ctx)
 Create TLS connection structure and update fd_table. More...
 
static int Squid_SSL_accept (ConnStateData *conn, PF *callback)
 
static void clientNegotiateSSL (int fd, void *data)
 
static void httpsEstablish (ConnStateData *connState, const Security::ContextPointer &ctx)
 
static void httpsSslBumpAccessCheckDone (allow_t answer, void *data)
 
static void httpsAccept (const CommAcceptCbParams &params)
 
void httpsSslBumpStep2AccessCheckDone (allow_t answer, void *data)
 
static bool OpenedHttpSocket (const Comm::ConnectionPointer &c, const Ipc::FdNoteId portType)
 check FD after clientHttp[s]ConnectionOpened, adjust HttpSockets as needed More...
 
static bool AddOpenedHttpSocket (const Comm::ConnectionPointer &conn)
 find any unused HttpSockets[] slot and store fd there or return false More...
 
static void clientHttpConnectionsOpen (void)
 
void clientStartListeningOn (AnyP::PortCfgPointer &port, const RefCount< CommCbFunPtrCallT< CommAcceptCbPtrFun > > &subCall, const Ipc::FdNoteId fdNote)
 accept requests to a given port and inform subCall about them More...
 
void clientOpenListenSockets (void)
 
void clientConnectionsClose ()
 
int varyEvaluateMatch (StoreEntry *entry, HttpRequest *request)
 
ACLFilledChecklistclientAclChecklistCreate (const acl_access *acl, ClientHttpRequest *http)
 
std::ostream & operator<< (std::ostream &os, const ConnStateData::PinnedIdleContext &pic)
 

Variables

static IOACB httpAccept
 
static IOACB httpsAccept
 
static CTCB clientLifetimeTimeout
 
static IDCB clientIdentDone
 
static const SBuf Proxy1p0magic ("PROXY ", 6)
 magic octet prefix for PROXY protocol version 1 More...
 
static const SBuf Proxy2p0magic ("\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A", 12)
 magic octet prefix for PROXY protocol version 2 More...
 

Function Documentation

static bool AddOpenedHttpSocket ( const Comm::ConnectionPointer conn)
static

Definition at line 3461 of file client_side.cc.

References Comm::Connection::fd, HttpSockets, i, and NHttpSockets.

Referenced by clientListenerConnectionOpened().

void clientConnectionsClose ( void  )
static void clientIdentDone ( const char *  ident,
void *  data 
)
static
int clientIsRequestBodyTooLargeForPolicy ( int64_t  bodyLength)
static
static void clientListenerConnectionOpened ( AnyP::PortCfgPointer s,
const Ipc::FdNoteId  portTypeNote,
const Subscription::Pointer sub 
)
static
void clientOpenListenSockets ( void  )
void clientPackTermBound ( String  boundary,
MemBuf mb 
)
bool clientPingHasFinished ( ping_data const *  aPing)
static

Definition at line 259 of file client_side.cc.

References ping_data::start, and ping_data::stop.

Referenced by clientUpdateHierCounters().

void clientProcessRequest ( ConnStateData conn,
const Http1::RequestParserPointer hp,
Http::Stream context 
)

Definition at line 1613 of file client_side.cc.

References ClientHttpRequest::Flags::accel, RequestFlags::accelerated, ClientHttpRequest::al, assert, HttpRequest::auth_user_request, URL::authority(), Http::Message::body_pipe, ClientHttpRequest::calloutContext, HttpHeader::chunked(), Server::clientConnection, clientIsContentLengthValid(), clientIsRequestBodyTooLargeForPolicy(), clientProcessRequestFinished(), clientSetKeepaliveFlag(), Config, Http::Message::content_length, clientStreamNode::data, debugs, ClientHttpRequest::doCallouts(), ERR_INVALID_REQ, ERR_TOO_BIG, ERR_UNSUP_REQ, ConnStateData::expectRequestBody(), ClientHttpRequest::flags, HttpRequest::flags, ConnStateData::flags, ConnStateData::getAuth(), Http::Stream::getClientReplyContext(), HttpHeader::getInt64(), HttpHeader::getList(), getMyPort(), RefCount< C >::getRaw(), URL::getScheme(), SquidConfig::global_internal_static, ConnStateData::handleRequestBodyData(), HttpHeader::has(), Http::Message::header, URL::host(), Http::Stream::http, Http::Message::http_ver, RequestFlags::internal, ClientHttpRequest::Flags::internal, internalCheck(), internalHostname(), internalHostnameIs(), internalStaticCheck(), AnyP::ProtocolVersion::major, HttpRequest::manager(), Http::MAX_FORWARDS, Http::Stream::mayUseConnection(), HttpRequest::method, Http::METHOD_CONNECT, Http::METHOD_NONE, Http::METHOD_OPTIONS, AnyP::ProtocolVersion::minor, RequestFlags::noDirect, NULL, ClientHttpRequest::Out::offset, SquidConfig::onoff, ClientHttpRequest::out, URL::path(), URL::port(), ConnStateData::port, BodyPipe::productionEnded(), AnyP::PROTO_HTTP, AnyP::PROTO_HTTPS, AnyP::ProtocolVersion::protocol, Http::Stream::pullData(), ConnStateData::quitAfterError(), ConnStateData::readMore, Comm::Connection::remote, ClientHttpRequest::request, request(), Http::scLengthRequired, Http::scNotImplemented, Http::scPayloadTooLarge, ConnStateData::serveDelayedError(), setLogUri(), clientReplyContext::setReplyToError(), URL::setScheme(), String::size(), Http::Message::sources, Http::Message::srcFtp, Http::Message::srcHttp, Http::Message::srcHttps, RequestFlags::sslBumped, ConnStateData::switchedToHttps(), Http::TRANSFER_ENCODING, HttpRequest::url, urlCanonicalClean(), and urlCheckRequest().

Referenced by Ftp::Server::doProcessRequest(), Http::One::Server::proceedAfterBodyContinuation(), and Http::One::Server::processParsedRequest().

void clientSetKeepaliveFlag ( ClientHttpRequest http)

clientSetKeepaliveFlag() sets request->flags.proxyKeepalive. This is the client-side persistent connection flag. We need to set this relatively early in the request processing to handle hacks for broken servers and clients.

Definition at line 641 of file client_side.cc.

References debugs, HttpRequest::flags, Http::Message::http_ver, HttpRequest::method, Http::Message::persistent(), RequestFlags::proxyKeepalive, ClientHttpRequest::request, and request().

Referenced by clientProcessRequest(), and Ftp::Server::doProcessRequest().

static void ClientSocketContextPushDeferredIfNeeded ( Http::StreamPointer  deferredRequest,
ConnStateData conn 
)
static

If the client stream is waiting on a socket write to occur, then

NO data is allowed to have been sent.

defer now.

otherwise, the request is still active in a callbacksomewhere, and we are done

Definition at line 870 of file client_side.cc.

References assert, Server::clientConnection, clientSocketRecipient(), debugs, and HERE().

Referenced by ConnStateData::doneWithControlMsg(), and ConnStateData::kick().

void clientSocketDetach ( clientStreamNode node,
ClientHttpRequest http 
)

Called when a downstream node is no longer interested in our data. As we are a terminal node, this means on aborts only

Definition at line 831 of file client_side.cc.

References assert, cbdataReferenceValid(), clientStreamDetach(), clientStreamNode::data, RefCount< C >::getRaw(), dlink_node::next, clientStreamNode::node, and NULL.

Referenced by ConnStateData::abortRequestParsing(), ConnStateData::buildFakeRequest(), and parseHttpRequest().

void clientSocketRecipient ( clientStreamNode node,
ClientHttpRequest http,
HttpReply rep,
StoreIOBuffer  receivedData 
)

Write a chunk of data to a client socket. If the reply is present, send the reply headers down the wire too, and clean them up when finished. Pre-condition: The request is one backed by a connection, not an internal request. data context is not NULL There are no more entries in the stream chain.

Definition at line 792 of file client_side.cc.

References assert, HttpControlMsgSink::cbControlMsgSent, cbdataReferenceValid(), Server::clientConnection, clientStreamNode::data, Pipeline::front(), ClientHttpRequest::getConn(), RefCount< C >::getRaw(), ConnStateData::handleReply(), Comm::IsConnOpen(), dlink_node::next, clientStreamNode::node, NULL, Server::pipeline, PROF_start, and PROF_stop.

Referenced by ConnStateData::abortRequestParsing(), ConnStateData::buildFakeRequest(), ClientSocketContextPushDeferredIfNeeded(), and parseHttpRequest().

void clientUpdateStatHistCounters ( const LogTags logType,
int  svc_time 
)
static

The idea here is not to be complete, but to get service times for only well-defined types. For example, we don't include LOG_TCP_REFRESH_FAIL because its not really a cache hit (we tried to validate it, but failed).

Definition at line 217 of file client_side.cc.

References StatCounters::allSvcTime, StatCounters::client_http, StatHist::count(), StatCounters::hitSvcTime, LOG_TCP_CLIENT_REFRESH_MISS, LOG_TCP_HIT, LOG_TCP_IMS_HIT, LOG_TCP_INM_HIT, LOG_TCP_MEM_HIT, LOG_TCP_MISS, LOG_TCP_OFFLINE_HIT, LOG_TCP_REFRESH_UNMODIFIED, StatCounters::missSvcTime, StatCounters::nearHitSvcTime, StatCounters::nearMissSvcTime, LogTags::oldType, and statCounter.

Referenced by ClientHttpRequest::updateCounters().

const char* findTrailingHTTPVersion ( const char *  uriAndHTTPVersion,
const char *  end 
)

'end' defaults to NULL for backwards compatibility remove default value if we ever get rid of NULL-terminated request buffers.

Definition at line 1067 of file client_side.cc.

References assert, NULL, and xisspace.

Referenced by HttpRequest::parseFirstLine().

void httpRequestFree ( void *  data)

Definition at line 488 of file client_side.cc.

References assert, and NULL.

Referenced by esiBufferRecipient(), ClientHttpRequest::~ClientHttpRequest(), and Http::Stream::~Stream().

static bool httpsCreate ( const Comm::ConnectionPointer conn,
const Security::ContextPointer ctx 
)
static
static void httpsEstablish ( ConnStateData connState,
const Security::ContextPointer ctx 
)
static
static void httpsSslBumpAccessCheckDone ( allow_t  answer,
void *  data 
)
static
static bool OpenedHttpSocket ( const Comm::ConnectionPointer c,
const Ipc::FdNoteId  portType 
)
static
std::ostream& operator<< ( std::ostream &  os,
const ConnStateData::PinnedIdleContext pic 
)
Http::Stream* parseHttpRequest ( ConnStateData csd,
const Http1::RequestParserPointer hp 
)

Parse an HTTP request

Note
Sets result->flags.parsed_ok to 0 if failed to parse the request, to 1 if the request was correctly parsed.
Parameters
[in]csda ConnStateData. The caller must make sure it is not null
[in]hpan Http1::RequestParser
[out]mehtod_pwill be set as a side-effect of the parsing. Pointed-to value will be set to Http::METHOD_NONE in case of parsing failure
[out]http_verwill be set as a side-effect of the parsing
Returns
NULL on incomplete requests, a Http::Stream on success or failure.

Definition at line 1297 of file client_side.cc.

References ConnStateData::abortRequestParsing(), SBuf::append(), SquidConfig::appendDomainLen, Server::clientConnection, clientGetMoreData, clientReplyDetach, clientReplyStatus, clientSocketDetach(), clientSocketRecipient(), clientStreamInit(), Config, ConnStateData::consumeInput(), StoreIOBuffer::data, DBG_IMPORTANT, debugs, Http::Stream::flags, HTTP_REQBUF_SZ, Server::inBuf, internalCheck(), internalLocalUri(), SBuf::isEmpty(), StoreIOBuffer::length, SBuf::length(), ConnStateData::mayTunnelUnsupportedProto(), Http::METHOD_CONNECT, Http::METHOD_NONE, Http::METHOD_PRI, NULL, Http::Stream::parsed_ok, ConnStateData::port, prepareAcceleratedURL(), prepareTransparentURL(), ConnStateData::preservedClientData, Http::ProtocolVersion(), Http::Stream::reqbuf, SBufToCstring(), Http::scMethodNotAllowed, Http::scRequestHeaderFieldsTooLarge, Http::scUriTooLong, ConnStateData::switchedToHttps(), Server::transferProtocol, ConnStateData::transparent(), xcalloc, and xstrdup.

Referenced by Http::One::Server::parseOneRequest().

char * skipLeadingSpace ( char *  aString)

Definition at line 1051 of file client_side.cc.

References xisspace.

static int Squid_SSL_accept ( ConnStateData conn,
PF callback 
)
static

Variable Documentation

IDCB clientIdentDone
static

Definition at line 179 of file client_side.cc.

Referenced by ConnStateData::whenClientIpKnown().

CTCB clientLifetimeTimeout
static
IOACB httpAccept
static

Definition at line 173 of file client_side.cc.

Referenced by clientHttpConnectionsOpen().

IOACB httpsAccept
static

Definition at line 175 of file client_side.cc.

Referenced by clientHttpConnectionsOpen().

const SBuf Proxy1p0magic("PROXY ", 6)
static
const SBuf Proxy2p0magic("\x0D\x0A\x0D\x0A\x00\x0D\x0A\x51\x55\x49\x54\x0A", 12)
static

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors