/*
- * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
+ * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
*
* Squid software is distributed under GPLv2+ license and includes
* contributions from numerous individuals and organizations.
#include "format/Format.h"
#include "HttpReply.h"
#include "HttpRequest.h"
+#include "MasterXaction.h"
#include "SquidTime.h"
CBDATA_NAMESPACED_CLASS_INIT(Adaptation::Ecap::XactionRep, XactionRep);
};
Adaptation::Ecap::XactionRep::XactionRep(
- HttpMsg *virginHeader, HttpRequest *virginCause, AccessLogEntry::Pointer &alp,
+ Http::Message *virginHeader, HttpRequest *virginCause, AccessLogEntry::Pointer &alp,
const Adaptation::ServicePointer &aService):
AsyncJob("Adaptation::Ecap::XactionRep"),
Adaptation::Initiate("Adaptation::Ecap::XactionRep"),
Adaptation::Ecap::XactionRep::master(const AdapterXaction &x)
{
Must(!theMaster);
- Must(x != NULL);
+ Must(x);
theMaster = x;
}
if (name.known()) { // must check to avoid empty names matching unset cfg
typedef Notes::iterator ACAMLI;
- for (ACAMLI i = Adaptation::Config::metaHeaders.begin(); i != Adaptation::Config::metaHeaders.end(); ++i) {
- if (name == (*i)->key.termedBuf()) {
- if (const char *value = (*i)->match(request, reply, al))
- return libecap::Area::FromTempString(value);
+ for (auto h: Adaptation::Config::metaHeaders) {
+ if (name == h->key().toStdString()) {
+ SBuf matched;
+ if (h->match(request, reply, al, matched))
+ return libecap::Area::FromTempString(matched.toStdString());
else
return libecap::Area();
}
Must(request);
HttpReply *reply = dynamic_cast<HttpReply*>(theVirginRep.raw().header);
- typedef Notes::iterator ACAMLI;
- for (ACAMLI i = Adaptation::Config::metaHeaders.begin(); i != Adaptation::Config::metaHeaders.end(); ++i) {
- const char *v = (*i)->match(request, reply, al);
- if (v) {
- const libecap::Name name((*i)->key.termedBuf());
- const libecap::Area value = libecap::Area::FromTempString(v);
+ for (auto h: Adaptation::Config::metaHeaders) {
+ SBuf matched;
+ if (h->match(request, reply, al, matched)) {
+ const libecap::Name name(h->key().toStdString());
+ const libecap::Area value = libecap::Area::FromTempString(matched.toStdString());
visitor.visit(name, value);
}
}
if (ah != NULL) {
// retrying=false because ecap never retries transactions
adaptHistoryId = ah->recordXactStart(service().cfg().key, current_time, false);
- typedef Notes::iterator ACAMLI;
- for (ACAMLI i = Adaptation::Config::metaHeaders.begin(); i != Adaptation::Config::metaHeaders.end(); ++i) {
- const char *v = (*i)->match(request, reply, al);
- if (v) {
+ SBuf matched;
+ for (auto h: Adaptation::Config::metaHeaders) {
+ if (h->match(request, reply, al, matched)) {
if (ah->metaHeaders == NULL)
ah->metaHeaders = new NotePairs();
- if (!ah->metaHeaders->hasPair((*i)->key.termedBuf(), v))
- ah->metaHeaders->add((*i)->key.termedBuf(), v);
+ if (!ah->metaHeaders->hasPair(h->key(), matched))
+ ah->metaHeaders->add(h->key(), matched);
}
}
}
// clear body_pipes, if any
// this code does not maintain proxying* and canAccessVb states; should it?
- if (theAnswerRep != NULL) {
+ if (theAnswerRep) {
BodyPipe::Pointer body_pipe = answer().body_pipe;
if (body_pipe != NULL) {
Must(body_pipe->stillProducing(this));
libecap::Message &
Adaptation::Ecap::XactionRep::adapted()
{
- Must(theAnswerRep != NULL);
+ Must(theAnswerRep);
return *theAnswerRep;
}
preserveVb("useVirgin");
- HttpMsg *clone = theVirginRep.raw().header->clone();
+ Http::Message *clone = theVirginRep.raw().header->clone();
// check that clone() copies the pipe so that we do not have to
Must(!theVirginRep.raw().header->body_pipe == !clone->body_pipe);
theAnswerRep = m;
Must(proxyingAb == opUndecided);
- HttpMsg *msg = answer().header;
+ Http::Message *msg = answer().header;
+ updateSources(msg);
if (!theAnswerRep->body()) { // final, bodyless answer
proxyingAb = opNever;
updateHistory(msg);
/// Called just before sendAnswer() to record adapter meta-information
/// which may affect answer processing and may be needed for logging.
void
-Adaptation::Ecap::XactionRep::updateHistory(HttpMsg *adapted)
+Adaptation::Ecap::XactionRep::updateHistory(Http::Message *adapted)
{
if (!theMaster) // all updates rely on being able to query the adapter
return;
buf.append(" A?", 3);
}
- buf.appendf(" %s%u]", id.Prefix, id.value);
+ buf.appendf(" %s%u]", id.prefix(), id.value);
buf.terminate();
return buf.content();
}
+void
+Adaptation::Ecap::XactionRep::updateSources(Http::Message *adapted)
+{
+ adapted->sources |= service().cfg().connectionEncryption ? Http::Message::srcEcaps : Http::Message::srcEcap;
+
+ // Update masterXaction object for adapted HTTP requests.
+ if (HttpRequest *adaptedReq = dynamic_cast<HttpRequest*>(adapted)) {
+ HttpRequest *request = dynamic_cast<HttpRequest*> (theCauseRep ?
+ theCauseRep->raw().header : theVirginRep.raw().header);
+ Must(request);
+ adaptedReq->masterXaction = request->masterXaction;
+ }
+}
+