]> git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/ecap/XactionRep.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / adaptation / ecap / XactionRep.h
1 /*
2 * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
3 *
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.
7 */
8
9 /* DEBUG: section 93 eCAP Interface */
10
11 #ifndef SQUID_ECAP_XACTION_REP_H
12 #define SQUID_ECAP_XACTION_REP_H
13
14 #include "adaptation/ecap/MessageRep.h"
15 #include "adaptation/ecap/ServiceRep.h"
16 #include "adaptation/Initiate.h"
17 #include "adaptation/Message.h"
18 #include "BodyPipe.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>
23
24 namespace Adaptation
25 {
26 namespace Ecap
27 {
28
29 /* The eCAP xaction representative maintains information about a single eCAP
30 xaction that Squid communicates with. One eCAP module may register many
31 eCAP xactions. */
32 class XactionRep : public Adaptation::Initiate, public libecap::host::Xaction,
33 public BodyConsumer, public BodyProducer
34 {
35 CBDATA_CLASS(XactionRep);
36
37 public:
38 XactionRep(HttpMsg *virginHeader, HttpRequest *virginCause, AccessLogEntry::Pointer &alp, const Adaptation::ServicePointer &service);
39 virtual ~XactionRep();
40
41 typedef libecap::shared_ptr<libecap::adapter::Xaction> AdapterXaction;
42 void master(const AdapterXaction &aMaster); // establish a link
43
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();
64
65 // BodyProducer API
66 virtual void noteMoreBodySpaceAvailable(RefCount<BodyPipe> bp);
67 virtual void noteBodyConsumerAborted(RefCount<BodyPipe> bp);
68
69 // BodyConsumer API
70 virtual void noteMoreBodyDataAvailable(RefCount<BodyPipe> bp);
71 virtual void noteBodyProductionEnded(RefCount<BodyPipe> bp);
72 virtual void noteBodyProducerAborted(RefCount<BodyPipe> bp);
73
74 // Initiate API
75 virtual void noteInitiatorAborted();
76
77 // AsyncJob API (via Initiate)
78 virtual void start();
79 virtual bool doneAll() const;
80 virtual void swanSong();
81 virtual const char *status() const;
82
83 protected:
84 Service &service();
85
86 Adaptation::Message &answer();
87
88 void sinkVb(const char *reason);
89 void preserveVb(const char *reason);
90 void forgetVb(const char *reason);
91
92 void moveAbContent();
93
94 void updateHistory(HttpMsg *adapted);
95 void terminateMaster();
96 void scheduleStop(const char *reason);
97
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;
105
106 void doResume();
107
108 private:
109 AdapterXaction theMaster; // the actual adaptation xaction we represent
110 Adaptation::ServicePointer theService; ///< xaction's adaptation service
111
112 MessageRep theVirginRep;
113 MessageRep *theCauseRep;
114
115 typedef libecap::shared_ptr<libecap::Message> MessagePtr;
116 MessagePtr theAnswerRep;
117
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
126 };
127
128 } // namespace Ecap
129 } // namespace Adaptation
130
131 #endif /* SQUID_ECAP_XACTION_REP_H */
132