#include <client_side_reply.h>

Inheritance diagram for clientReplyContext:
Collaboration diagram for clientReplyContext:

Classes

struct  Flags
 

Public Member Functions

void * operator new (size_t size)
 
void operator delete (void *address)
 
void * toCbdata () noexcept
 
 clientReplyContext (ClientHttpRequest *)
 
 ~clientReplyContext ()
 
void saveState ()
 
void restoreState ()
 
void purgeRequest ()
 
void purgeRequestFindObjectToPurge ()
 
void purgeDoMissPurge ()
 
void purgeFoundGet (StoreEntry *newEntry)
 
void purgeFoundHead (StoreEntry *newEntry)
 
void purgeFoundObject (StoreEntry *entry)
 
void sendClientUpstreamResponse ()
 
void purgeDoPurgeGet (StoreEntry *entry)
 
void purgeDoPurgeHead (StoreEntry *entry)
 
void doGetMoreData ()
 
void identifyStoreObject ()
 
void identifyFoundObject (StoreEntry *entry)
 
int storeOKTransferDone () const
 
int storeNotOKTransferDone () const
 
void setReplyToStoreEntry (StoreEntry *e, const char *reason)
 replaces current response store entry with the given one More...
 
void setReplyToError (err_type, Http::StatusCode, const HttpRequestMethod &, char const *, Ip::Address &, HttpRequest *, const char *, Auth::UserRequest::Pointer)
 builds error using clientBuildError() and calls setReplyToError() below More...
 
void setReplyToError (const HttpRequestMethod &method, ErrorState *err)
 creates a store entry for the reply and appends err to it More...
 
void setReplyToReply (HttpReply *reply)
 creates a store entry for the reply and appends error reply to it More...
 
void createStoreEntry (const HttpRequestMethod &m, RequestFlags flags)
 
void removeStoreReference (store_client **scp, StoreEntry **ep)
 
void removeClientStoreReference (store_client **scp, ClientHttpRequest *http)
 
void startError (ErrorState *err)
 
void processExpired ()
 
clientStream_status_t replyStatus ()
 
void processMiss ()
 
void traceReply (clientStreamNode *node)
 
const char * storeId () const
 
virtual void created (StoreEntry *newEntry)
 

Public Attributes

Http::StatusCode purgeStatus
 
int lookingforstore
 
ClientHttpRequesthttp
 
int headers_sz
 
store_clientsc
 
StoreIOBuffer tempBuffer
 
int old_reqsize
 
size_t reqsize
 
size_t reqofs
 
char tempbuf [HTTP_REQBUF_SZ]
 a temporary buffer if we need working storage More...
 
const char * lookup_type
 
struct clientReplyContext::Flags flags
 
clientStreamNodeourNode
 

Static Public Attributes

static STCB CacheHit
 
static STCB HandleIMSReply
 
static STCB SendMoreData
 

Private Types

enum  CollapsedRevalidation {
  crNone = 0,
  crInitiator,
  crSlave
}
 

Private Member Functions

clientStreamNodegetNextNode () const
 
void makeThisHead ()
 
bool errorInStream (StoreIOBuffer const &result, size_t const &sizeToProcess) const
 
void sendStreamError (StoreIOBuffer const &result)
 
void pushStreamData (StoreIOBuffer const &result, char *source)
 
clientStreamNodenext () const
 
void processReplyAccess ()
 
void processReplyAccessResult (const allow_t &accessAllowed)
 
void cloneReply ()
 
void buildReplyHeader ()
 
bool alwaysAllowResponse (Http::StatusCode sline) const
 
int checkTransferDone ()
 
void processOnlyIfCachedMiss ()
 
bool processConditional (StoreIOBuffer &result)
 process conditional request from client More...
 
void cacheHit (StoreIOBuffer result)
 
void handleIMSReply (StoreIOBuffer result)
 
void sendMoreData (StoreIOBuffer result)
 
void triggerInitialStoreRead ()
 
void sendClientOldEntry ()
 
void purgeAllCached ()
 
void forgetHit ()
 
bool blockedHit () const
 whether squid.conf send_hit prevents us from serving this hit More...
 
void sendBodyTooLargeError ()
 
void sendPreconditionFailedError ()
 send 412 (Precondition Failed) to client More...
 
void sendNotModified ()
 send 304 (Not Modified) to client More...
 
void sendNotModifiedOrPreconditionFailedError ()
 

Private Attributes

StoreIOBuffer holdingBuffer
 
HttpReplyreply
 
StoreEntryold_entry
 
store_clientold_sc
 
time_t old_lastmod
 
String old_etag
 
bool deleting
 
CollapsedRevalidation collapsedRevalidation
 

Static Private Attributes

static cbdata_type CBDATA_clientReplyContext = CBDATA_UNKNOWN
 
static ACLCB ProcessReplyAccessResult
 

Detailed Description

Definition at line 22 of file client_side_reply.h.

Member Enumeration Documentation

Enumerator
crNone 

collapsed revalidation is not allowed for this context

crInitiator 

we initiated collapsed revalidation request

crSlave 

we collapsed on the existing revalidation request

Definition at line 141 of file client_side_reply.h.

Constructor & Destructor Documentation

clientReplyContext::clientReplyContext ( ClientHttpRequest clientContext)

Definition at line 76 of file client_side_reply.cc.

References tempbuf.

Member Function Documentation

bool clientReplyContext::alwaysAllowResponse ( Http::StatusCode  sline) const
private
void clientReplyContext::buildReplyHeader ( )
private

Generate the reply headers sent to client.

Filters out unwanted entries and hop-by-hop from original reply header then adds extra entries if we have more info than origin server then adds Squid specific entries

Todo:
alter errorstate to be accel on|off aware. The 0 on the next line depends on authenticate behaviour: all schemes to date send no extra data on 407/401 responses, and do not check the accel state on 401/407 responses

Definition at line 1384 of file client_side_reply.cc.

References ClientHttpRequest::Flags::accel, RequestFlags::accelerated, Auth::UserRequest::AddReplyAuthHeader(), HttpHeader::addVia(), Http::AGE, ClientHttpRequest::al, HttpRequest::auth_user_request, HttpReply::bodySize(), RequestFlags::chunkedReply, SquidConfig::client_pconns, collapsedRevalidation, Config, conn, Http::CONNECTION, RequestFlags::connectionAuth, RequestFlags::connectionAuthDisabled, crSlave, Http::DATE, DBG_IMPORTANT, debugs, HttpHeader::delAt(), HttpHeader::delById(), StoreEntry::dump(), EBIT_TEST, ENTRY_SPECIAL, SquidConfig::error_pconns, Http::EXPIRES, StoreEntry::expires, fdUsageHigh(), HttpHeader::findEntry(), ClientHttpRequest::flags, HttpRequest::flags, StoreEntry::flags, ClientHttpRequest::getConn(), HttpHeader::getEntry(), getMyHostname(), getMyPort(), HttpHeader::has(), Http::Message::header, http, Http::Message::http_ver, httpHdrMangleList(), HttpHeaderInitPos, httpHeaderPutStrf(), HttpHeaderEntry::id, RequestFlags::intercepted, Comm::IsConnOpen(), LogTags::isTcpHit(), HttpReply::keep_alive, LOG_TCP_DENIED, ClientHttpRequest::logType, lookup_type, ClientHttpRequest::memObject(), HttpRequest::method, HttpRequest::multipartRangeRequest(), RequestFlags::mustKeepalive, RequestFlags::needValidation, NULL, LogTags::oldType, SquidConfig::onoff, HttpRequest::peer_login, Http::Message::persistent(), HttpRequest::pinnedConnection(), ConnStateData::port, PRId64, AnyP::PROTO_HTTP, Http::StatusLine::protocol, Http::ProtocolVersion(), Http::PROXY_AUTHENTICATE, Http::PROXY_SUPPORT, RequestFlags::proxyKeepalive, HttpHeader::putExt(), HttpHeader::putInt(), HttpHeader::putStr(), HttpHeader::putTime(), HttpHeader::putWarning(), String::rawBuf(), HttpHeader::refreshMask(), HttpHeader::removeHopByHopEntries(), reply, ClientHttpRequest::request, request(), ClientHttpRequest::requestSatisfactionMode(), ROR_REPLY, Http::scProxyAuthenticationRequired, Http::scUnauthorized, Http::SET_COOKIE, shutting_down, HttpReply::sline, squid_curtime, RequestFlags::sslBumped, RequestFlags::staleIfHit, Http::StatusLine::status(), ClientHttpRequest::storeEntry(), Http::SURROGATE_CAPABILITY, Http::SURROGATE_CONTROL, String::termedBuf(), ThisCache, StoreEntry::timestamp, Http::TRANSFER_ENCODING, ClientHttpRequest::uri, HttpHeaderEntry::value, Http::StatusLine::version, Http::WARNING, Http::WWW_AUTHENTICATE, Http::X_CACHE, Http::X_CACHE_LOOKUP, and Http::X_REQUEST_URI.

Referenced by cloneReply().

void clientReplyContext::cacheHit ( StoreIOBuffer  result)
private
void clientReplyContext::created ( StoreEntry newEntry)
virtual
bool clientReplyContext::errorInStream ( StoreIOBuffer const &  result,
size_t const &  sizeToProcess 
) const
private
void clientReplyContext::forgetHit ( )
private

Safely disposes of an entry pointing to a cache hit that we do not want. We cannot just ignore the entry because it may be locking or otherwise holding an associated cache resource of some sort.

Definition at line 1668 of file client_side_reply.cc.

References assert, http, StoreEntry::lock(), NULL, ClientHttpRequest::storeEntry(), and StoreEntry::unlock().

Referenced by identifyFoundObject().

clientStreamNode * clientReplyContext::getNextNode ( ) const
private

Definition at line 249 of file client_side_reply.cc.

References dlink_node::data, dlink_node::next, clientStreamNode::node, and ourNode.

Referenced by doGetMoreData(), and next().

void clientReplyContext::identifyFoundObject ( StoreEntry newEntry)

Check state of the current StoreEntry object. to see if we can determine the final status of the request.

  • If the entry received isNull() then we ignore it.
  • If the request has no-cache flag set or some no_cache HACK in operation we 'invalidate' the cached IP entries for this request ???
  • If no StoreEntry object is current assume this object isn't in the cache set MISS
  • If we are running in offline mode set to HIT
  • If redirection status is True force this to be a MISS

Definition at line 1701 of file client_side_reply.cc.

References Config, debugs, doGetMoreData(), EBIT_TEST, ENTRY_SPECIAL, HttpRequest::flags, StoreEntry::flags, forgetHit(), URL::host(), http, ipcacheInvalidateNegative(), StoreEntry::isNull(), LOG_TCP_CLIENT_REFRESH_MISS, LOG_TCP_HIT, LOG_TCP_MISS, LOG_TCP_REDIRECT, ClientHttpRequest::logType, lookup_type, RequestFlags::noCache, RequestFlags::noCacheHack(), NULL, SquidConfig::offline, SquidConfig::onoff, ClientHttpRequest::redirect, ClientHttpRequest::request, ClientHttpRequest::Redirect::status, ClientHttpRequest::storeEntry(), HttpRequest::url, and StoreEntry::validToSend().

Referenced by created(), and identifyStoreObject().

void clientReplyContext::makeThisHead ( )
private
void clientReplyContext::operator delete ( void *  address)
inline

Definition at line 24 of file client_side_reply.h.

void* clientReplyContext::operator new ( size_t  size)
inline

Definition at line 24 of file client_side_reply.h.

void clientReplyContext::processMiss ( )

Prepare to fetch the object as it's a cache miss of some kind.

We might have a left-over StoreEntry from a failed cache hit or IMS request.

Check if its a PURGE request to be actioned.

Check if its an 'OTHER' request. Purge all cached entries if so and continue.

Check if 'only-if-cached' flag is set. Action if so.

Deny loops

Start forwarding to get the new object from network

Definition at line 719 of file client_side_reply.cc.

References ClientHttpRequest::al, assert, LogTags::c_str(), clientBuildError(), Server::clientConnection, HttpRequest::clientConnectionManager, AccessLogEntry::HttpDetails::code, StoreEntry::complete(), conn, createStoreEntry(), DBG_CRITICAL, debugs, StoreEntry::dump(), EBIT_TEST, ENTRY_SPECIAL, ERR_ACCESS_DENIED, errorAppendEntry(), HttpRequest::flags, StoreEntry::flags, ClientHttpRequest::getConn(), http, AccessLogEntry::http, ClientHttpRequest::Redirect::location, LOG_TCP_REDIRECT, ClientHttpRequest::logType, RequestFlags::loopDetected, HttpRequest::method, Http::METHOD_OTHER, Http::METHOD_PURGE, NULL, ClientHttpRequest::Out::offset, ClientHttpRequest::onlyIfCached(), ClientHttpRequest::out, processOnlyIfCachedMiss(), purgeAllCached(), purgeRequest(), HttpReply::redirect(), ClientHttpRequest::redirect, StoreEntry::releaseRequest(), Comm::Connection::remote, removeClientStoreReference(), StoreEntry::replaceHttpReply(), ClientHttpRequest::request, sc, Http::scForbidden, Ip::Address::setNoAddr(), FwdState::Start(), ClientHttpRequest::Redirect::status, ClientHttpRequest::storeEntry(), triggerInitialStoreRead(), and ClientHttpRequest::uri.

Referenced by cacheHit(), doGetMoreData(), handleIMSReply(), and processConditional().

void clientReplyContext::processOnlyIfCachedMiss ( )
private

client issued a request with an only-if-cached cache-control directive; we did not find a cached object that can be returned without contacting other servers; respond with a 504 (Gateway Timeout) as suggested in [RFC 2068]

Definition at line 797 of file client_side_reply.cc.

References ClientHttpRequest::al, clientBuildError(), Server::clientConnection, AccessLogEntry::HttpDetails::code, debugs, ERR_ONLY_IF_CACHED_MISS, ClientHttpRequest::getConn(), http, AccessLogEntry::http, HttpRequest::method, NULL, Comm::Connection::remote, removeClientStoreReference(), ClientHttpRequest::request, sc, Http::scGatewayTimeout, Ip::Address::setNoAddr(), startError(), and ClientHttpRequest::uri.

Referenced by processExpired(), and processMiss().

void clientReplyContext::purgeAllCached ( )
private
void clientReplyContext::purgeDoMissPurge ( )
void clientReplyContext::purgeFoundGet ( StoreEntry newEntry)
void clientReplyContext::purgeFoundHead ( StoreEntry newEntry)

Definition at line 968 of file client_side_reply.cc.

References StoreEntry::isNull(), purgeDoMissPurge(), and purgeFoundObject().

Referenced by created().

void clientReplyContext::purgeRequestFindObjectToPurge ( )
void clientReplyContext::removeStoreReference ( store_client **  scp,
StoreEntry **  ep 
)
void clientReplyContext::sendClientOldEntry ( )
private
void clientReplyContext::sendNotModifiedOrPreconditionFailedError ( )
private

send 304 (Not Modified) or 412 (Precondition Failed) to client depending on request method

Definition at line 2026 of file client_side_reply.cc.

References http, HttpRequest::method, Http::METHOD_GET, Http::METHOD_HEAD, ClientHttpRequest::request, sendNotModified(), and sendPreconditionFailedError().

Referenced by processConditional().

void clientReplyContext::sendStreamError ( StoreIOBuffer const &  result)
private

call clientWriteComplete so the client socket gets closed

We call into the stream, because we don't know that there is a client socket!

Definition at line 1919 of file client_side_reply.cc.

References ClientHttpRequest::client_stream, clientStreamCallback(), clientReplyContext::Flags::complete, dlink_node::data, debugs, StoreIOBuffer::error, StoreIOBuffer::flags, flags, HttpRequest::flags, dlink_list::head, http, NULL, ClientHttpRequest::request, and RequestFlags::streamError.

Referenced by sendMoreData().

void clientReplyContext::setReplyToError ( err_type  err,
Http::StatusCode  status,
const HttpRequestMethod method,
char const *  uri,
Ip::Address addr,
HttpRequest failedrequest,
const char *  unparsedrequest,
Auth::UserRequest::Pointer  auth_user_request 
)

Create an error in the store awaiting the client side to read it.

This may be better placed in the clientStream logic, but it has not been relocated there yet

Definition at line 105 of file client_side_reply.cc.

References ErrorState::auth_user_request, clientBuildError(), ErrorState::request_hdrs, and xstrdup.

Referenced by ConnStateData::abortChunkedRequestBody(), clientProcessRequest(), Http::One::Server::processParsedRequest(), ConnStateData::serveDelayedError(), and Http::One::Server::setReplyError().

const char* clientReplyContext::storeId ( ) const
inline
int clientReplyContext::storeOKTransferDone ( ) const
void* clientReplyContext::toCbdata ( )
inlinenoexcept

Definition at line 24 of file client_side_reply.h.

void clientReplyContext::triggerInitialStoreRead ( )
private

Member Data Documentation

void clientReplyContext::CacheHit
static

clientReplyContext::cacheHit Should only be called until the HTTP reply headers have been parsed. Normally this should be a single call, but it might take more than one. As soon as we have the headers, we hand off to clientSendMoreData, processExpired, or processMiss.

Definition at line 24 of file client_side_reply.h.

Referenced by doGetMoreData(), and purgeFoundObject().

cbdata_type clientReplyContext::CBDATA_clientReplyContext = CBDATA_UNKNOWN
staticprivate

Definition at line 24 of file client_side_reply.h.

CollapsedRevalidation clientReplyContext::collapsedRevalidation
private

Definition at line 147 of file client_side_reply.h.

Referenced by buildReplyHeader(), handleIMSReply(), and processExpired().

bool clientReplyContext::deleting
private

Definition at line 139 of file client_side_reply.h.

Referenced by cacheHit(), handleIMSReply(), sendMoreData(), and ~clientReplyContext().

void clientReplyContext::HandleIMSReply
static

Definition at line 28 of file client_side_reply.h.

Referenced by processExpired().

int clientReplyContext::headers_sz
StoreIOBuffer clientReplyContext::holdingBuffer
private

Definition at line 108 of file client_side_reply.h.

Referenced by sendMoreData().

int clientReplyContext::lookingforstore
const char* clientReplyContext::lookup_type

Definition at line 89 of file client_side_reply.h.

Referenced by buildReplyHeader(), and identifyFoundObject().

StoreEntry* clientReplyContext::old_entry
private
String clientReplyContext::old_etag
private

Definition at line 137 of file client_side_reply.h.

Referenced by restoreState(), and saveState().

time_t clientReplyContext::old_lastmod
private

Definition at line 136 of file client_side_reply.h.

Referenced by restoreState(), and saveState().

int clientReplyContext::old_reqsize

Definition at line 83 of file client_side_reply.h.

Referenced by restoreState(), saveState(), and sendClientUpstreamResponse().

store_client* clientReplyContext::old_sc
private
clientStreamNode* clientReplyContext::ourNode

Definition at line 99 of file client_side_reply.h.

Referenced by cacheHit(), clientGetMoreData(), and getNextNode().

void clientReplyContext::ProcessReplyAccessResult
staticprivate

Definition at line 111 of file client_side_reply.h.

Referenced by processReplyAccess().

Http::StatusCode clientReplyContext::purgeStatus

Definition at line 73 of file client_side_reply.h.

Referenced by purgeDoPurgeGet(), and purgeDoPurgeHead().

void clientReplyContext::SendMoreData
static

Accepts chunk of a http message in buf, parses prefix, filters headers and such, writes processed message to the message recipient

Definition at line 29 of file client_side_reply.h.

Referenced by clientGetMoreData(), traceReply(), and triggerInitialStoreRead().

char clientReplyContext::tempbuf[HTTP_REQBUF_SZ]
StoreIOBuffer clientReplyContext::tempBuffer

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

 

Introduction

Documentation

Support

Miscellaneous

Web Site Translations

Mirrors