2 * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
9 /* DEBUG: section 93 eCAP Interface */
11 #ifndef SQUID_ECAP_XACTION_REP_H
12 #define SQUID_ECAP_XACTION_REP_H
14 #include "adaptation/ecap/MessageRep.h"
15 #include "adaptation/ecap/ServiceRep.h"
16 #include "adaptation/Initiate.h"
17 #include "adaptation/Message.h"
19 #include <libecap/common/forward.h>
20 #include <libecap/common/memory.h>
21 #include <libecap/host/xaction.h>
22 #include <libecap/adapter/xaction.h>
29 /* The eCAP xaction representative maintains information about a single eCAP
30 xaction that Squid communicates with. One eCAP module may register many
32 class XactionRep
: public Adaptation::Initiate
, public libecap::host::Xaction
,
33 public BodyConsumer
, public BodyProducer
35 CBDATA_CLASS(XactionRep
);
38 XactionRep(HttpMsg
*virginHeader
, HttpRequest
*virginCause
, AccessLogEntry::Pointer
&alp
, const Adaptation::ServicePointer
&service
);
39 virtual ~XactionRep();
41 typedef libecap::shared_ptr
<libecap::adapter::Xaction
> AdapterXaction
;
42 void master(const AdapterXaction
&aMaster
); // establish a link
44 // libecap::host::Xaction API
45 virtual const libecap::Area
option(const libecap::Name
&name
) const;
46 virtual void visitEachOption(libecap::NamedValueVisitor
&visitor
) const;
47 virtual libecap::Message
&virgin();
48 virtual const libecap::Message
&cause();
49 virtual libecap::Message
&adapted();
50 virtual void useVirgin();
51 virtual void useAdapted(const libecap::shared_ptr
<libecap::Message
> &msg
);
52 virtual void blockVirgin();
53 virtual void adaptationDelayed(const libecap::Delay
&);
54 virtual void adaptationAborted();
55 virtual void resume();
56 virtual void vbDiscard();
57 virtual void vbMake();
58 virtual void vbStopMaking();
59 virtual void vbMakeMore();
60 virtual libecap::Area
vbContent(libecap::size_type offset
, libecap::size_type size
);
61 virtual void vbContentShift(libecap::size_type size
);
62 virtual void noteAbContentDone(bool atEnd
);
63 virtual void noteAbContentAvailable();
66 virtual void noteMoreBodySpaceAvailable(RefCount
<BodyPipe
> bp
);
67 virtual void noteBodyConsumerAborted(RefCount
<BodyPipe
> bp
);
70 virtual void noteMoreBodyDataAvailable(RefCount
<BodyPipe
> bp
);
71 virtual void noteBodyProductionEnded(RefCount
<BodyPipe
> bp
);
72 virtual void noteBodyProducerAborted(RefCount
<BodyPipe
> bp
);
75 virtual void noteInitiatorAborted();
77 // AsyncJob API (via Initiate)
79 virtual bool doneAll() const;
80 virtual void swanSong();
81 virtual const char *status() const;
86 Adaptation::Message
&answer();
88 void sinkVb(const char *reason
);
89 void preserveVb(const char *reason
);
90 void forgetVb(const char *reason
);
94 void updateHistory(HttpMsg
*adapted
);
95 void terminateMaster();
96 void scheduleStop(const char *reason
);
98 const libecap::Area
clientIpValue() const;
99 const libecap::Area
usernameValue() const;
100 const libecap::Area
masterxSharedValue(const libecap::Name
&name
) const;
101 /// Return the adaptation meta header value for the given header "name"
102 const libecap::Area
metaValue(const libecap::Name
&name
) const;
103 /// Return the adaptation meta headers and their values
104 void visitEachMetaHeader(libecap::NamedValueVisitor
&visitor
) const;
109 AdapterXaction theMaster
; // the actual adaptation xaction we represent
110 Adaptation::ServicePointer theService
; ///< xaction's adaptation service
112 MessageRep theVirginRep
;
113 MessageRep
*theCauseRep
;
115 typedef libecap::shared_ptr
<libecap::Message
> MessagePtr
;
116 MessagePtr theAnswerRep
;
118 typedef enum { opUndecided
, opOn
, opComplete
, opNever
} OperationState
;
119 OperationState makingVb
; //< delivering virgin body from pipe to adapter
120 OperationState proxyingAb
; // delivering adapted body from adapter to core
121 int adaptHistoryId
; ///< adaptation history slot reservation
122 bool vbProductionFinished
; // whether there can be no more vb bytes
123 bool abProductionFinished
; // whether adapter has finished producing ab
124 bool abProductionAtEnd
; // whether adapter produced a complete ab
125 AccessLogEntry::Pointer al
; ///< Master transaction AccessLogEntry
129 } // namespace Adaptation
131 #endif /* SQUID_ECAP_XACTION_REP_H */