http.cc
Go to the documentation of this file.
84 static void copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest * request,
276 neighborsHtcpClear(e, e->mem_obj->request.getRaw(), HttpRequestMethod(Http::METHOD_HEAD), HTCP_CLR_INVALIDATION);
286 HttpHdrScTarget *sctusable = reply->surrogate_control->getMergedTarget(Config.Accel.surrogate_id);
388 // RFC 2616 section 14.9.1 - MUST NOT cache any response with CC:private in a shared cache like Squid.
404 // RFC 2068, sec 14.9.4 - MUST NOT cache any response with Authentication UNLESS certain CC controls are present
429 // some. The caching+revalidate is not exactly unsafe though with Squids interpretation of no-cache
432 debugs(22, 3, HERE << "Authenticated but server reply Cache-Control:no-cache (equivalent to must-revalidate)");
445 // NP: response CC:no-cache is equivalent to CC:must-revalidate,max-age=0. We MAY cache, and do so.
526 case Http::scBadRequest: // no sharing; perhaps the server did not like something specific to this request
643 debugs(11, DBG_IMPORTANT, "keepaliveAccounting: Impossible keep-alive header from '" << entry->url() << "'" );
684 /* Attempt to parse the first line; this will define where the protocol, status, reason-phrase and header begin */
749 // XXX: when Http::ProtocolVersion is a function, remove this hack. just set with messageProtocol()
760 newrep->sources |= request->url.getScheme() == AnyP::PROTO_HTTPS ? Http::Message::srcHttps : Http::Message::srcHttp;
856 const auto err = new ErrorState(ERR_INVALID_RESP, Http::scBadGateway, request.getRaw(), fwd->al);
975 if (rep.header.hasListMember(Http::HdrType::PROXY_SUPPORT, "Session-Based-Authentication", ','))
1079 const bool ccMustRevalidate = (rep->cache_control->hasProxyRevalidate() || rep->cache_control->hasMustRevalidate());
1262 entry->mem_obj->delayRead(DeferredRead(readDelayed, this, CommRead(io.conn, NULL, 0, nilCall)));
1382 debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: Bad header encountered from " << entry->url() << " AKA " << request->url);
1398 debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: No reply at all for " << entry->url() << " AKA " << request->url);
1405 debugs(11, DBG_IMPORTANT, "WARNING: HTTP: Invalid Response: Headers did not parse at all for " << entry->url() << " AKA " << request->url);
1408 debugs(11, (request->flags.accelerated?DBG_IMPORTANT:2), "WARNING: HTTP: Invalid Response: No object data received for " << entry->url() << " AKA " << request->url);
1643 const int limitBuffer = (flags.headers_parsed ? Config.readAheadGap : Config.maxReplyHeaderSize);
1647 debugs(11, 7, "will not read up to " << limitBuffer << ". buffer has (" << inBuf.length() << "/" << inBuf.spaceSize() << ") from " << serverConnection);
1655 const size_t read_size = calcBufferSpaceToReserve(inBuf.spaceSize(), (limitBuffer - inBuf.length()));
1658 debugs(11, 7, "will not read up to " << read_size << " into buffer (" << inBuf.length() << "/" << inBuf.spaceSize() << ") from " << serverConnection);
1669 " read up to " << read_size << " bytes info buf(" << inBuf.length() << "/" << inBuf.spaceSize() <<
1679 debugs(11, 5, HERE << serverConnection << ": size " << io.size << ": errflag " << io.flag << ".");
1755 httpFixupAuthentication(HttpRequest * request, const HttpHeader * hdr_in, HttpHeader * hdr_out, const Http::StateFlags &flags)
1769 const auto header = flags.toOrigin ? Http::HdrType::AUTHORIZATION : Http::HdrType::PROXY_AUTHORIZATION;
1810 blen = base64_encode_update(&ctx, loginbuf, strlen(username), reinterpret_cast<const uint8_t*>(username));
1811 blen += base64_encode_update(&ctx, loginbuf+blen, strlen(request->peer_login +1), reinterpret_cast<const uint8_t*>(request->peer_login +1));
1822 blen = base64_encode_update(&ctx, loginbuf, request->extacl_user.size(), reinterpret_cast<const uint8_t*>(request->extacl_user.rawBuf()));
1824 blen += base64_encode_update(&ctx, loginbuf+blen, request->extacl_passwd.size(), reinterpret_cast<const uint8_t*>(request->extacl_passwd.rawBuf()));
1829 // if no external user credentials are available to fake authentication with PASS acts like PASSTHRU
1854 blen = base64_encode_update(&ctx, loginbuf, strlen(request->peer_login), reinterpret_cast<const uint8_t*>(request->peer_login));
1897 copyOneHeaderFromClientsideRequestToUpstreamRequest(e, strConnection, request, hdr_out, we_do_ranges, flags);
1979 static char result[base64_encode_len(MAX_URL*2)]; // should be big enough for a single URI segment
1982 size_t blen = base64_encode_update(&ctx, result, request->url.userInfo().length(), reinterpret_cast<const uint8_t*>(request->url.userInfo().rawContent()));
2076 Config.http_upgrade_request_protocols->forApplicable(offeredProto, [&ch, offeredStr, offeredStrLen, &upgradeOut] (const SBuf &cfgProto, const acl_access *guard) {
2123 copyOneHeaderFromClientsideRequestToUpstreamRequest(const HttpHeaderEntry *e, const String strConnection, const HttpRequest * request, HttpHeader * hdr_out, const int we_do_ranges, const Http::StateFlags &flags)
2210 else if (Config.onoff.cache_miss_revalidate || !request->flags.cachable || request->flags.auth)
2223 if (hdr_out->hasListMember(Http::HdrType::IF_MATCH, "*", ',') || Config.onoff.cache_miss_revalidate || !request->flags.cachable || request->flags.auth)
2379 debugs(11, 5, HERE << serverConnection << ", request " << request << ", this " << this << ".");
2608 debugs(11, DBG_IMPORTANT, "http handleMoreRequestBodyAvailable: Likely proxy abuse detected '" << request->client_addr << "' -> '" << entry->url() << "'" );
2632 const auto err = new ErrorState(ERR_ICAP_FAILURE, Http::scInternalServerError, fwd->request, fwd->al);
2660 : answer(HttpStateData::ReuseDecision::reuseNot), reason(nullptr), entry(e), statusCode(code) {}
2663 HttpStateData::ReuseDecision::make(const HttpStateData::ReuseDecision::Answers ans, const char *why)
void Read(const Comm::ConnectionPointer &conn, AsyncCall::Pointer &callback)
Definition: Read.cc:40
virtual void haveParsedReplyHeaders()
called when we have final (possibly adapted) reply headers; kids extend
Definition: http.cc:984
Definition: AsyncJob.h:32
Definition: TeChunkedParser.h:52
bool maybeMakeSpaceAvailable(bool grow)
Definition: http.cc:1640
AsyncCall::Pointer comm_add_close_handler(int fd, CLCB *handler, void *data)
Definition: comm.cc:983
virtual bool getMoreRequestBody(MemBuf &buf)
either fill buf with available [encoded] request body bytes or return false
Definition: Client.cc:418
Definition: http.h:23
Definition: FilledChecklist.h:33
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:629
void appendf(const char *fmt,...) PRINTF_FORMAT_ARG2
Append operation with printf-style arguments.
Definition: Packable.h:61
Definition: Client.h:35
struct CachePeer::@31 options
struct StatCounters::@131 server
virtual bool getMoreRequestBody(MemBuf &buf)
either fill buf with available [encoded] request body bytes or return false
Definition: http.cc:2462
bool offsetLimitExceeded(const int64_t limit) const
Definition: HttpHdrRange.cc:508
int hasListMember(Http::HdrType id, const char *member, const char separator) const
Definition: HttpHeader.cc:1709
Definition: HttpHdrCc.h:44
Answers make(const Answers ans, const char *why)
stores the corresponding decision
Definition: http.cc:2663
String * upgradeHeaderOut
Upgrade header value sent to the origin server or cache peer.
Definition: http.h:74
virtual void abortAll(const char *reason)
abnormal transaction termination; reason is for debugging only
Definition: http.cc:2652
virtual bool mayReadVirginReplyBody() const
whether we may receive more virgin response body bytes
Definition: http.cc:1605
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
struct StatCounters::@131::@141 all
static void httpFixupAuthentication(HttpRequest *request, const HttpHeader *hdr_in, HttpHeader *hdr_out, const Http::StateFlags &flags)
Definition: http.cc:1755
virtual void handleRequestBodyProducerAborted()=0
Definition: Client.cc:331
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:2523
void httpHdrMangleList(HttpHeader *l, HttpRequest *request, const AccessLogEntryPointer &al, req_or_rep_t req_or_rep)
Definition: HttpHeaderTools.cc:326
const char * ProtocolType_str[]
virtual void sendControlMsg(HttpControlMsg)
called to send the 1xx message and notify the Source
Definition: client_side.cc:3708
char * opt_forwarded_for
int commSetConnTimeout(const Comm::ConnectionPointer &conn, int timeout, AsyncCall::Pointer &callback)
Definition: comm.cc:567
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:576
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:870
Definition: CommRead.h:32
PconnPool * fwdPconnPool
a collection of previously used persistent Squid-to-peer HTTP(S) connections
Definition: FwdState.cc:78
int detect_broken_server_pconns
Definition: SquidConfig.h:320
AccessLogEntry::Pointer al
info for the future access.log, and external ACL
Definition: FilledChecklist.h:98
IoStats IOStats
virtual void haveParsedReplyHeaders()
called when we have final (possibly adapted) reply headers; kids extend
Definition: Client.cc:517
bool Is1xx(const int sc)
whether this is an informational 1xx response status code
Definition: StatusCode.h:92
Definition: base64.h:69
void httpHeaderPutStrf(HttpHeader *hdr, Http::HdrType id, const char *fmt,...)
Definition: HttpHeaderTools.cc:53
StoreEntry * storeGetPublicByRequest(HttpRequest *req, const KeyScope keyScope)
Definition: store.cc:533
static bool decideIfWeDoRanges(HttpRequest *orig_request)
Definition: http.cc:2301
Definition: StateFlags.h:16
SBuf httpMakeVaryMark(HttpRequest *request, HttpReply const *reply)
Definition: http.cc:612
StoreEntry * storeGetPublicByRequestMethod(HttpRequest *req, const HttpRequestMethod &method, const KeyScope keyScope)
Definition: store.cc:527
char * toStr(char *buf, const unsigned int blen, int force=AF_UNSPEC) const
Definition: Address.cc:802
Definition: AsyncJobCalls.h:108
peer_t neighborType(const CachePeer *p, const AnyP::Uri &url)
Definition: neighbors.cc:115
#define MAX_IPSTRLEN
Length of buffer that needs to be allocated to old a null-terminated IP-string.
Definition: forward.h:23
Definition: HttpHeader.h:51
Definition: Range.h:19
Definition: Debug.h:189
void sendComplete()
successfully wrote the entire request (including body, last-chunk, etc.)
Definition: http.cc:1714
Definition: HttpRequest.h:49
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:123
struct SquidConfig::@113 onoff
HttpHdrScTarget * getMergedTarget(const char *ourtarget)
Definition: HttpHdrSc.cc:296
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:2659
virtual bool expectingBody(const HttpRequestMethod &, int64_t &) const
Definition: HttpReply.cc:488
bool httpHeaderHasConnDir(const HttpHeader *hdr, const SBuf &directive)
Definition: HttpHeaderTools.cc:90
static void httpMaybeRemovePublic(StoreEntry *, Http::StatusCode)
Definition: http.cc:184
Definition: AsyncJobCalls.h:91
parameters for the async notePinnedConnectionBecameIdle() call
Definition: client_side.h:179
unsigned int front_end_https
send "Front-End-Https: On" header (off/on/auto=2)
Definition: StateFlags.h:18
struct StatCounters::@131::@141 http
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:47
Http::StatusCode status() const
retrieve the status code for this status line
Definition: StatusLine.h:45
struct IoStats::@81 Http
void forApplicable(const ProtocolView &, const Visitor &) const
Definition: HttpUpgradeProtocolAccess.h:103
virtual void handleMoreRequestBodyAvailable()
Definition: http.cc:2591
void handle1xx(HttpReply *msg)
ignore or start forwarding the 1xx response (a.k.a., control message)
Definition: http.cc:793
static Pointer Start(AsyncJob *job)
starts a freshly created job (i.e., makes the job asynchronous)
Definition: AsyncJob.cc:23
Definition: client_side.h:79
Definition: MemBuf.h:24
Definition: CommCalls.h:119
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:412
Definition: RequestMethod.h:27
bool canHandle1xx() const
whether the client is likely to be able to handle a 1xx reply
Definition: HttpRequest.cc:643
virtual void handleRequestBodyProducerAborted()
Definition: http.cc:2623
void proceedAfter1xx()
restores state and resumes processing after 1xx is ignored or forwarded
Definition: http.cc:897
ConnectionStatus persistentConnStatus() const
Definition: http.cc:1168
#define CallJobHere(debugSection, debugLevel, job, Class, method)
Definition: AsyncJobCalls.h:58
#define BBUF_SZ
void httpTimeout(const CommTimeoutCbParams ¶ms)
Definition: http.cc:161
struct SquidConfig::@106 Accel
int neighbors_do_private_keys
HttpUpgradeProtocolAccess * http_upgrade_request_protocols
http_upgrade_request_protocols
Definition: SquidConfig.h:483
Definition: SquidString.h:26
void setPayloadBuffer(MemBuf *parsedContent)
set the buffer to be used to store decoded chunk data
Definition: TeChunkedParser.h:58
virtual void syncAle(HttpRequest *adaptedRequest, const char *logUri) const
assigns uninitialized adapted_request and url ALE components
Definition: FilledChecklist.cc:130
void neighborsHtcpClear(StoreEntry *e, HttpRequest *req, const HttpRequestMethod &method, htcp_clr_reason reason)
Definition: neighbors.cc:1807
struct SquidConfig::@99 Timeout
virtual HttpRequestPointer originalRequest()
a hack to reach HttpStateData::orignal_request
Definition: Client.cc:547
Definition: CommCalls.h:181
#define JobCallback(dbgSection, dbgLevel, Dialer, job, method)
Convenience macro to create a Dialer-based job callback.
Definition: AsyncJobCalls.h:69
Definition: ResponseParser.h:30
void httpStateConnClosed(const CommCloseCbParams ¶ms)
Definition: http.cc:153
void packInto(Packable *p, bool mask_sensitive_info=false) const
Definition: HttpHeader.cc:584
Definition: HttpHdrScTarget.h:25
Definition: FwdState.h:55
void Write(const Comm::ConnectionPointer &conn, const char *buf, int size, AsyncCall::Pointer &callback, FREE *free_func)
Definition: Write.cc:35
int commUnsetConnTimeout(const Comm::ConnectionPointer &conn)
Definition: comm.cc:593
virtual const Comm::ConnectionPointer & dataConnection() const
Definition: http.cc:147
size_t bytesWanted(Range< size_t > const aRange, bool ignoreDelayPool=false) const
Definition: store.cc:249
Definition: RefCount.h:27
ReuseDecision::Answers reusableReply(ReuseDecision &decision)
Definition: http.cc:321
void wroteLast(const CommIoCbParams &io)
called after writing the very last request byte (body, last-chunk, etc)
Definition: http.cc:1677
Http1::ResponseParserPointer hp
Parser being used at present to parse the HTTP/ICY server response.
Definition: http.h:149
assists in making and relaying entry caching/sharing decision
Definition: http.h:30
Definition: HttpReply.h:25
size_t calcBufferSpaceToReserve(const size_t space, const size_t wantSpace) const
determine how much space the buffer needs to reserve
Definition: Client.cc:1020
noteTakeServerConnectionControl() callback parameter
Definition: client_side.h:209
Definition: Store.h:42
void addVirginReplyBody(const char *buf, ssize_t len)
Definition: Client.cc:995
Definition: DelayId.h:21
struct SquidConfig::@114 accessList
AnyP::ProtocolVersion version
breakdown of protocol version label: (HTTP/ICY) and (0.9/1.0/1.1)
Definition: StatusLine.h:70
virtual void sentRequestBody(const CommIoCbParams &io)=0
Definition: Client.cc:344
bool peerSupportsConnectionPinning() const
Definition: http.cc:926
bool forcedBodyContinuation
whether we have responded with HTTP 100 or FTP 150 already
Definition: HttpRequest.h:194
void set(const AnyP::ProtocolVersion &newVersion, Http::StatusCode newStatus, const char *newReason=NULL)
Definition: StatusLine.cc:35
bool finishingChunkedRequest()
if needed, write last-chunk to end the request body and return true
Definition: http.cc:2558
bool reforwardableStatus(const Http::StatusCode s) const
Definition: FwdState.cc:1322
#define Must(condition)
Like assert() but throws an exception instead of aborting the process.
Definition: TextException.h:72
AsyncCall * asyncCall(int aDebugSection, int aDebugLevel, const char *aName, const Dialer &aDialer)
Definition: AsyncCall.h:156
void Controller::create() STUB void Controller Controller nil
Definition: stub_libstore.cc:19
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:139
StoreEntry * storeGetPublic(const char *uri, const HttpRequestMethod &method)
Definition: store.cc:521
Definition: CommCalls.h:133
Definition: CommRead.h:20
static StoreEntry * findPreviouslyCachedEntry(StoreEntry *newEntry)
Definition: http.cc:174
#define REFRESH_OVERRIDE(flag)
static void httpBuildRequestHeader(HttpRequest *request, StoreEntry *entry, const AccessLogEntryPointer &al, HttpHeader *hdr_out, const Http::StateFlags &flags)
Definition: http.cc:1866
Definition: errorpage.h:87
virtual void sentRequestBody(const CommIoCbParams &io)
Definition: http.cc:2643
bool hasNoCacheWithoutParameters() const
Definition: HttpHdrCc.h:88
void processSurrogateControl(HttpReply *)
Definition: http.cc:283
std::ostream & operator<<(std::ostream &os, const HttpStateData::ReuseDecision &d)
Definition: http.cc:2670
HttpHeaderEntry * getEntry(HttpHeaderPos *pos) const
Definition: HttpHeader.cc:628
void lengthWentBad(const char *reason)
flags [truncated or too big] entry with ENTRY_BAD_LENGTH and releases it
Definition: store.cc:1049
const SBuf & effectiveRequestUri() const
RFC 7230 section 5.5 - Effective Request URI.
Definition: HttpRequest.cc:688
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:2123
void addVia(const AnyP::ProtocolVersion &ver, const HttpHeader *from=0)
Definition: HttpHeader.cc:1015
Definition: Address.h:41
virtual void noteTakeServerConnectionControl(ServerConnectionContext)
Definition: client_side.h:225
struct CachePeer::@29 stats
void comm_remove_close_handler(int fd, CLCB *handler, void *data)
Definition: comm.cc:1010
Comm::ConnectionPointer const & serverConnection() const
Definition: FwdState.h:102
Definition: HttpHeader.h:72
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:86
ErrorDetail::Pointer MakeNamedErrorDetail(const char *name)
Definition: Detail.cc:54
void removeStaleWarnings()
Remove Warnings with warn-date different from Date value.
Definition: HttpReply.cc:599
AnyP::ProtocolVersion ProtocolVersion(unsigned int aMajor, unsigned int aMinor)
HTTP version label information.
Definition: ProtocolVersion.h:19
Definition: ProtocolVersion.h:24
#define CallJobHere1(debugSection, debugLevel, job, Class, method, arg1)
Definition: AsyncJobCalls.h:63