http.cc
Go to the documentation of this file.
76 static void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest * request,
251 neighborsHtcpClear(e, e->mem_obj->request.getRaw(), HttpRequestMethod(Http::METHOD_HEAD), HTCP_CLR_INVALIDATION);
261 HttpHdrScTarget *sctusable = reply->surrogate_control->getMergedTarget(Config.Accel.surrogate_id);
365 // RFC 2616 section 14.9.1 - MUST NOT cache any response with CC:private in a shared cache like Squid.
381 // RFC 2068, sec 14.9.4 - MUST NOT cache any response with Authentication UNLESS certain CC controls are present
406 // some. The caching+revalidate is not exactly unsafe though with Squids interpretation of no-cache
409 debugs(22, 3, "Authenticated but server reply Cache-Control:no-cache (equivalent to must-revalidate)");
422 // NP: response CC:no-cache is equivalent to CC:must-revalidate,max-age=0. We MAY cache, and do so.
503 case Http::scBadRequest: // no sharing; perhaps the server did not like something specific to this request
620 debugs(11, DBG_IMPORTANT, "keepaliveAccounting: Impossible keep-alive header from '" << entry->url() << "'" );
656 /* Attempt to parse the first line; this will define where the protocol, status, reason-phrase and header begin */
720 newrep->sources |= request->url.getScheme() == AnyP::PROTO_HTTPS ? Http::Message::srcHttps : Http::Message::srcHttp;
722 if (newrep->sline.version.protocol == AnyP::PROTO_HTTP && Http::Is1xx(newrep->sline.status())) {
808 const auto err = new ErrorState(ERR_INVALID_RESP, Http::scBadGateway, request.getRaw(), fwd->al);
927 if (rep.header.hasListMember(Http::HdrType::PROXY_SUPPORT, "Session-Based-Authentication", ','))
1030 const bool ccMustRevalidate = (rep->cache_control->hasProxyRevalidate() || rep->cache_control->hasMustRevalidate());
1196 abortTransaction("ready to read required data, but the read buffer is full and cannot be drained");
1202 const auto readSizeWanted = readSizeMax ? entry->bytesWanted(Range<size_t>(0, readSizeMax)) : 0;
1215 debugs(11, 5, "avoid delayRead() to give adaptation a chance to drain overflow buffer: " << responseBodyBuffer->contentSize());
1220 debugs(11, 5, "avoid delayRead() to give adaptation a chance to drain body pipe buffer: " << virginBodyDestination->buf().contentSize());
1345 debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: Bad header encountered from " << entry->url() << " AKA " << request->url);
1361 debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: No reply at all for " << entry->url() << " AKA " << request->url);
1368 debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: Headers did not parse at all for " << entry->url() << " AKA " << request->url);
1371 debugs(11, (request->flags.accelerated?DBG_IMPORTANT:2), "WARNING: HTTP: Invalid Response: No object data received for " << entry->url() << " AKA " << request->url);
1616 abortTransaction("more response bytes required, but the read buffer is full and cannot be drained");
1657 const auto configurationPreferences = NaturalSum<size_t>(Config.readAheadGap).value_or(SBuf::maxSize);
1684 debugs(11, 3, "no, due to a full buffer: " << inBuf.length() << '/' << inBuf.spaceSize() << "; limit: " << maxCapacity);
1689 debugs(11, 7, "yes, may read up to " << maxReadSize << " into " << inBuf.length() << '/' << inBuf.spaceSize());
1703 debugs(11, 7, "will not read up to " << read_size << " into buffer (" << inBuf.length() << "/" << inBuf.spaceSize() << ") from " << serverConnection);
1709 debugs(11, 7, "may read up to " << read_size << " bytes info buffer (" << inBuf.length() << "/" << inBuf.spaceSize() << ") from " << serverConnection);
1793 httpFixupAuthentication(HttpRequest * request, const HttpHeader * hdr_in, HttpHeader * hdr_out, const Http::StateFlags &flags)
1807 const auto header = flags.toOrigin ? Http::HdrType::AUTHORIZATION : Http::HdrType::PROXY_AUTHORIZATION;
1848 blen = base64_encode_update(&ctx, loginbuf, strlen(username), reinterpret_cast<const uint8_t*>(username));
1849 blen += base64_encode_update(&ctx, loginbuf+blen, strlen(request->peer_login +1), reinterpret_cast<const uint8_t*>(request->peer_login +1));
1860 blen = base64_encode_update(&ctx, loginbuf, request->extacl_user.size(), reinterpret_cast<const uint8_t*>(request->extacl_user.rawBuf()));
1862 blen += base64_encode_update(&ctx, loginbuf+blen, request->extacl_passwd.size(), reinterpret_cast<const uint8_t*>(request->extacl_passwd.rawBuf()));
1867 // if no external user credentials are available to fake authentication with PASS acts like PASSTHRU
1892 blen = base64_encode_update(&ctx, loginbuf, strlen(request->peer_login), reinterpret_cast<const uint8_t*>(request->peer_login));
1935 copyOneHeaderFromClientsideRequestToUpstreamRequest(e, strConnection, request, hdr_out, we_do_ranges, flags);
2014 static char result[base64_encode_len(MAX_URL*2)]; // should be big enough for a single URI segment
2017 size_t blen = base64_encode_update(&ctx, result, request->url.userInfo().length(), reinterpret_cast<const uint8_t*>(request->url.userInfo().rawContent()));
2105 Config.http_upgrade_request_protocols->forApplicable(offeredProto, [&ch, offeredStr, offeredStrLen, &upgradeOut] (const SBuf &cfgProto, const acl_access *guard) {
2152 copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest * request, HttpHeader * hdr_out, const int we_do_ranges, const Http::StateFlags &flags)
2239 else if (Config.onoff.cache_miss_revalidate || !request->flags.cachable || request->flags.auth)
2252 if (hdr_out->hasListMember(Http::HdrType::IF_MATCH, "*", ',') || Config.onoff.cache_miss_revalidate || !request->flags.cachable || request->flags.auth)
2636 debugs(11, DBG_IMPORTANT, "http handleMoreRequestBodyAvailable: Likely proxy abuse detected '" << request->client_addr << "' -> '" << entry->url() << "'" );
2660 const auto err = new ErrorState(ERR_ICAP_FAILURE, Http::scInternalServerError, fwd->request, fwd->al);
2688 : answer(HttpStateData::ReuseDecision::reuseNot), reason(nullptr), entry(e), statusCode(code) {}
2691 HttpStateData::ReuseDecision::make(const HttpStateData::ReuseDecision::Answers ans, const char *why)
void Read(const Comm::ConnectionPointer &conn, AsyncCall::Pointer &callback)
Definition: Read.cc:40
Definition: AsyncJob.h:31
Definition: TeChunkedParser.h:51
AsyncCall::Pointer comm_add_close_handler(int fd, CLCB *handler, void *data)
Definition: comm.cc:952
virtual bool getMoreRequestBody(MemBuf &buf)
either fill buf with available [encoded] request body bytes or return false
Definition: Client.cc:437
Definition: http.h:24
bool expectingBody(const HttpRequestMethod &, int64_t &) const override
Definition: HttpReply.cc:528
void markPrematureReplyBodyEofFailure()
called on a premature EOF discovered when reading response body
Definition: http.cc:1411
Definition: FilledChecklist.h:33
void commUnsetConnTimeout(const Comm::ConnectionPointer &conn)
Definition: comm.cc:616
bool keepalive
whether the Squid-sent request offers to keep the connection persistent
Definition: StateFlags.h:21
void ignoreRange(const char *reason)
forgets about the cached Range header (for a reason)
Definition: HttpRequest.cc:621
void appendf(const char *fmt,...) PRINTF_FORMAT_ARG2
Append operation with printf-style arguments.
Definition: Packable.h:61
void noteDelayAwareReadChance() override
Definition: http.cc:1161
Definition: Client.h:29
void fd_bytes(const int fd, const int len, const IoDirection direction)
Definition: fd.cc:226
bool waitingForDelayAwareReadChance
whether we are waiting for MemObject::delayRead() to call us back
Definition: Client.h:198
struct SquidConfig::@98 accessList
bool offsetLimitExceeded(const int64_t limit) const
Definition: HttpHdrRange.cc:510
int hasListMember(Http::HdrType id, const char *member, const char separator) const
Definition: HttpHeader.cc:1662
Definition: HttpHdrCc.h:43
Answers make(const Answers ans, const char *why)
stores the corresponding decision
Definition: http.cc:2691
String * upgradeHeaderOut
Upgrade header value sent to the origin server or cache peer.
Definition: http.h:75
void sentRequestBody(const CommIoCbParams &io) override
Definition: http.cc:2671
a reference to a protocol name[/version] string; no 0-termination is assumed
Definition: HttpUpgradeProtocolAccess.h:19
size_t base64_encode_final(struct base64_encode_ctx *ctx, char *dst)
Definition: base64.c:308
static void httpFixupAuthentication(HttpRequest *request, const HttpHeader *hdr_in, HttpHeader *hdr_out, const Http::StateFlags &flags)
Definition: http.cc:1793
void addVia(const AnyP::ProtocolVersion &ver, const HttpHeader *from=nullptr)
Definition: HttpHeader.cc:945
struct StatCounters::@112::@122 all
virtual void handleRequestBodyProducerAborted()=0
Definition: Client.cc:350
void error(char *format,...)
#define PEER_PROXY_NEGOTIATE_NOKEYTAB
Definition: peer_proxy_negotiate_auth.h:12
bool finishingBrokenPost()
if broken posts are enabled for the request, try to fix and return true
Definition: http.cc:2551
void httpHdrMangleList(HttpHeader *l, HttpRequest *request, const AccessLogEntryPointer &al, req_or_rep_t req_or_rep)
Definition: HttpHeaderTools.cc:331
void sendControlMsg(HttpControlMsg) override
called to send the 1xx message and notify the Source
Definition: client_side.cc:3614
const char * ProtocolType_str[]
char * opt_forwarded_for
static void assembleVaryKey(String &vary, SBuf &vstr, const HttpRequest &request)
assemble a variant key (vary-mark) from the given Vary header and HTTP request
Definition: http.cc:553
bool peering
Whether the next TCP hop is a cache_peer, including originserver.
Definition: StateFlags.h:40
const char * blockSwitchingProtocols(const HttpReply &) const
Definition: http.cc:822
PconnPool * fwdPconnPool
a collection of previously used persistent Squid-to-peer HTTP(S) connections
Definition: FwdState.cc:78
void handle1xx(const HttpReplyPointer &)
ignore or start forwarding the 1xx response (a.k.a., control message)
Definition: http.cc:748
struct CachePeer::@25 stats
bool getMoreRequestBody(MemBuf &buf) override
either fill buf with available [encoded] request body bytes or return false
Definition: http.cc:2490
size_t calcReadBufferCapacityLimit() const
Definition: http.cc:1645
struct SquidConfig::@97 onoff
struct StatCounters::@112 server
Auth::UserRequest::Pointer auth_user_request
Definition: HttpRequest.h:127
void handleRequestBodyProducerAborted() override
Definition: http.cc:2651
int detect_broken_server_pconns
Definition: SquidConfig.h:314
size_t maybeMakeSpaceAvailable(size_t maxReadSize)
Definition: http.cc:1697
AccessLogEntry::Pointer al
info for the future access.log, and external ACL
Definition: FilledChecklist.h:124
IoStats IOStats
std::optional< size_t > canBufferMoreReplyBytes() const
Definition: http.cc:1671
virtual void haveParsedReplyHeaders()
called when we have final (possibly adapted) reply headers; kids extend
Definition: Client.cc:536
bool Is1xx(const int sc)
whether this is an informational 1xx response status code
Definition: StatusCode.h:94
Definition: base64.h:68
static const size_type maxSize
Maximum size of a SBuf. By design it MUST be < MAX(size_type)/2. Currently 256Mb.
Definition: SBuf.h:103
void httpHeaderPutStrf(HttpHeader *hdr, Http::HdrType id, const char *fmt,...)
Definition: HttpHeaderTools.cc:54
StoreEntry * storeGetPublicByRequest(HttpRequest *req, const KeyScope keyScope)
Definition: store.cc:516
RefCount< AsyncCallT< Dialer > > asyncCall(int aDebugSection, int aDebugLevel, const char *aName, const Dialer &aDialer)
Definition: AsyncCall.h:156
static bool decideIfWeDoRanges(HttpRequest *orig_request)
Definition: http.cc:2330
Definition: StateFlags.h:15
SBuf httpMakeVaryMark(HttpRequest *request, HttpReply const *reply)
Definition: http.cc:589
void syncAle(HttpRequest *adaptedRequest, const char *logUri) const override
assigns uninitialized adapted_request and url ALE components
Definition: FilledChecklist.cc:110
StoreEntry * storeGetPublicByRequestMethod(HttpRequest *req, const HttpRequestMethod &method, const KeyScope keyScope)
Definition: store.cc:510
char * toStr(char *buf, const unsigned int blen, int force=AF_UNSPEC) const
Definition: Address.cc:812
Definition: AsyncJobCalls.h:108
void updateReply(const HttpReply::Pointer &)
Definition: FilledChecklist.cc:254
peer_t neighborType(const CachePeer *p, const AnyP::Uri &url)
Definition: neighbors.cc:116
#define MAX_IPSTRLEN
Length of buffer that needs to be allocated to old a null-terminated IP-string.
Definition: forward.h:25
Definition: HttpHeader.h:50
Definition: Range.h:18
void sendComplete()
successfully wrote the entire request (including body, last-chunk, etc.)
Definition: http.cc:1752
Definition: HttpRequest.h:48
void strListAdd(String &str, const char *item, const size_t itemSize, const char delimiter)
Appends the given item of a given size to a delimiter-separated list in str.
Definition: StrList.cc:18
bool canGrowBy(const size_type growthLen) const
whether appending growthLen characters is safe (i.e., unlikely to assert)
Definition: SquidString.h:124
HttpHdrScTarget * getMergedTarget(const char *ourtarget)
Definition: HttpHdrSc.cc:294
String etag
A strong etag of the cached entry. Used for refreshing that entry.
Definition: HttpRequest.h:191
ReuseDecision(const StoreEntry *e, const Http::StatusCode code)
Definition: http.cc:2687
bool httpHeaderHasConnDir(const HttpHeader *hdr, const SBuf &directive)
Definition: HttpHeaderTools.cc:91
static void httpMaybeRemovePublic(StoreEntry *, Http::StatusCode)
Definition: http.cc:169
struct StatCounters::@112::@122 http
Definition: AsyncJobCalls.h:91
parameters for the async notePinnedConnectionBecameIdle() call
Definition: client_side.h:182
unsigned int front_end_https
send "Front-End-Https: On" header (off/on/auto=2)
Definition: StateFlags.h:18
int strListIsMember(const String *list, const SBuf &m, char del)
Definition: StrList.cc:46
bundles HTTP 1xx reply and the "successfully forwarded" callback
Definition: HttpControlMsg.h:46
Http::StatusCode status() const
retrieve the status code for this status line
Definition: StatusLine.h:45
const Comm::ConnectionPointer & serverConnection() const
Definition: FwdState.h:138
void forApplicable(const ProtocolView &, const Visitor &) const
Definition: HttpUpgradeProtocolAccess.h:106
virtual void handleMoreRequestBodyAvailable()
Definition: http.cc:2619
Definition: client_side.h:79
Definition: MemBuf.h:23
Definition: CommCalls.h:113
bool toOriginPeer() const
Whether the next TCP/HTTP hop is an originserver cache_peer.
Definition: StateFlags.h:56
void push(const Comm::ConnectionPointer &serverConn, const char *domain)
Definition: pconn.cc:421
Definition: RequestMethod.h:26
bool canHandle1xx() const
whether the client is likely to be able to handle a 1xx reply
Definition: HttpRequest.cc:635
void proceedAfter1xx()
restores state and resumes processing after 1xx is ignored or forwarded
Definition: http.cc:849
ConnectionStatus persistentConnStatus() const
Definition: http.cc:1111
#define CallJobHere(debugSection, debugLevel, job, Class, method)
Definition: AsyncJobCalls.h:59
#define BBUF_SZ
void set(const AnyP::ProtocolVersion &newVersion, Http::StatusCode newStatus, const char *newReason=nullptr)
Definition: StatusLine.cc:35
void httpTimeout(const CommTimeoutCbParams ¶ms)
Definition: http.cc:146
int neighbors_do_private_keys
HttpUpgradeProtocolAccess * http_upgrade_request_protocols
http_upgrade_request_protocols
Definition: SquidConfig.h:469
Definition: SquidString.h:25
void setPayloadBuffer(MemBuf *parsedContent)
set the buffer to be used to store decoded chunk data
Definition: TeChunkedParser.h:58
void haveParsedReplyHeaders() override
called when we have final (possibly adapted) reply headers; kids extend
Definition: http.cc:936
void neighborsHtcpClear(StoreEntry *e, HttpRequest *req, const HttpRequestMethod &method, htcp_clr_reason reason)
Definition: neighbors.cc:1675
std::ostream & CurrentException(std::ostream &os)
prints active (i.e., thrown but not yet handled) exception
Definition: TextException.cc:88
virtual HttpRequestPointer originalRequest()
a hack to reach HttpStateData::orignal_request
Definition: Client.cc:568
Definition: CommCalls.h:165
#define JobCallback(dbgSection, dbgLevel, Dialer, job, method)
Convenience macro to create a Dialer-based job callback.
Definition: AsyncJobCalls.h:70
Definition: ResponseParser.h:29
void httpStateConnClosed(const CommCloseCbParams ¶ms)
Definition: http.cc:138
void packInto(Packable *p, bool mask_sensitive_info=false) const
Definition: HttpHeader.cc:539
struct CachePeer::@28::@34 flags
Definition: HttpHdrScTarget.h:24
Definition: FwdState.h:86
void Write(const Comm::ConnectionPointer &conn, const char *buf, int size, AsyncCall::Pointer &callback, FREE *free_func)
Definition: Write.cc:33
bool mayReadVirginReplyBody() const override
whether we may receive more virgin response body bytes
Definition: http.cc:1587
size_t bytesWanted(Range< size_t > const aRange, bool ignoreDelayPool=false) const
Definition: store.cc:213
ReuseDecision::Answers reusableReply(ReuseDecision &decision)
Definition: http.cc:296
void markParsedVirginReplyAsWhole(const char *reasonWeAreSure)
Definition: Client.cc:158
void veto()
makes decision() false regardless of past or future support() calls
Definition: SupportOrVeto.h:29
struct SquidConfig::@91 Accel
void wroteLast(const CommIoCbParams &io)
called after writing the very last request byte (body, last-chunk, etc)
Definition: http.cc:1715
Http1::ResponseParserPointer hp
Parser being used at present to parse the HTTP/ICY server response.
Definition: http.h:147
const Comm::ConnectionPointer & dataConnection() const override
Definition: http.cc:132
assists in making and relaying entry caching/sharing decision
Definition: http.h:31
Definition: HttpReply.h:24
size_t calcBufferSpaceToReserve(const size_t space, const size_t wantSpace) const
determine how much space the buffer needs to reserve
Definition: Client.cc:1065
noteTakeServerConnectionControl() callback parameter
Definition: client_side.h:213
Definition: Store.h:37
void commSetConnTimeout(const Comm::ConnectionPointer &conn, time_t timeout, AsyncCall::Pointer &callback)
Definition: comm.cc:592
void addVirginReplyBody(const char *buf, ssize_t len)
Definition: Client.cc:1040
Definition: DelayId.h:21
virtual void sentRequestBody(const CommIoCbParams &io)=0
Definition: Client.cc:363
bool peerSupportsConnectionPinning() const
Definition: http.cc:878
struct SquidConfig::@84 Timeout
bool forcedBodyContinuation
whether we have responded with HTTP 100 or FTP 150 already
Definition: HttpRequest.h:194
bool finishingChunkedRequest()
if needed, write last-chunk to end the request body and return true
Definition: http.cc:2586
size_t base64_encode_update(struct base64_encode_ctx *ctx, char *dst, size_t length, const uint8_t *src)
Definition: base64.c:265
Definition: CommCalls.h:133
struct CachePeer::@27 options
void abortAll(const char *reason) override
abnormal transaction termination; reason is for debugging only
Definition: http.cc:2680
StoreEntry * storeGetPublic(const char *uri, const HttpRequestMethod &method)
Definition: store.cc:504
Definition: CommCalls.h:127
static StoreEntry * findPreviouslyCachedEntry(StoreEntry *newEntry)
Definition: http.cc:159
#define REFRESH_OVERRIDE(flag)
static void httpBuildRequestHeader(HttpRequest *request, StoreEntry *entry, const AccessLogEntryPointer &al, HttpHeader *hdr_out, const Http::StateFlags &flags)
Definition: http.cc:1904
Definition: errorpage.h:88
@ Write
bool IsReforwardableStatus(StatusCode)
whether to send the request to another peer based on the current response status code
Definition: StatusCode.cc:281
bool hasNoCacheWithoutParameters() const
Definition: HttpHdrCc.h:88
void processSurrogateControl(HttpReply *)
Definition: http.cc:258
bool waitingForCommRead
whether we are waiting for our Comm::Read() handler to be called
Definition: http.h:156
std::ostream & operator<<(std::ostream &os, const HttpStateData::ReuseDecision &d)
Definition: http.cc:2698
HttpHeaderEntry * getEntry(HttpHeaderPos *pos) const
Definition: HttpHeader.cc:583
struct IoStats::@66 Http
const SBuf & effectiveRequestUri() const
RFC 7230 section 5.5 - Effective Request URI.
Definition: HttpRequest.cc:744
static void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest *request, HttpHeader *hdr_out, const int we_do_ranges, const Http::StateFlags &)
Definition: http.cc:2152
Definition: Address.h:42
virtual void noteTakeServerConnectionControl(ServerConnectionContext)
Definition: client_side.h:229
void comm_remove_close_handler(int fd, CLCB *handler, void *data)
Definition: comm.cc:981
void updateAle(const AccessLogEntry::Pointer &)
Definition: FilledChecklist.cc:242
Definition: HttpHeader.h:74
CbcPointer< ConnStateData > clientConnectionManager
Definition: HttpRequest.h:232
int strListGetItem(const String *str, char del, const char **item, int *ilen, const char **pos)
Definition: StrList.cc:78
ErrorDetail::Pointer MakeNamedErrorDetail(const char *name)
Definition: Detail.cc:54
AnyP::ProtocolVersion ProtocolVersion(unsigned int aMajor, unsigned int aMinor)
HTTP version label information.
Definition: ProtocolVersion.h:19
Definition: ProtocolVersion.h:23
#define CallJobHere1(debugSection, debugLevel, job, Class, method, arg1)
Definition: AsyncJobCalls.h:64
Introduction
- About Squid
- Why Squid?
- Squid Developers
- How to Donate
- How to Help Out
- Getting Squid
- Squid Source Packages
- Squid Deployment Case-Studies
- Squid Software Foundation
Documentation
- Quick Setup
- Configuration:
- FAQ and Wiki
- Guide Books:
- Non-English
- More...
Support
- Security Advisories
- Bugzilla Database
- Mailing lists
- Contacting us
- Commercial services
- Project Sponsors
- Squid-based products