]> git.ipfire.org Git - thirdparty/squid.git/blob - src/adaptation/ecap/MessageRep.h
Bug 5428: Warn if pkg-config is not found (#1902)
[thirdparty/squid.git] / src / adaptation / ecap / MessageRep.h
1 /*
2 * Copyright (C) 1996-2023 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_SRC_ADAPTATION_ECAP_MESSAGEREP_H
12 #define SQUID_SRC_ADAPTATION_ECAP_MESSAGEREP_H
13
14 #include "adaptation/forward.h"
15 #include "adaptation/Message.h"
16 #include "anyp/ProtocolType.h"
17 #include "BodyPipe.h"
18 #include "http/forward.h"
19 #include "HttpHeader.h"
20
21 #if HAVE_LIBECAP_COMMON_BODY_H
22 #include <libecap/common/body.h>
23 #endif
24 #if HAVE_LIBECAP_COMMON_HEADER_H
25 #include <libecap/common/header.h>
26 #endif
27 #if HAVE_LIBECAP_COMMON_MESSAGE_H
28 #include <libecap/common/message.h>
29 #endif
30
31 namespace Adaptation
32 {
33 namespace Ecap
34 {
35
36 class XactionRep;
37
38 // Translates Squid Http::Message into libecap::Header.
39 class HeaderRep: public libecap::Header
40 {
41 public:
42 typedef libecap::Name Name;
43 typedef libecap::Area Area;
44
45 public:
46 HeaderRep(Http::Message &aMessage);
47
48 /* libecap::Header API */
49 bool hasAny(const Name &name) const override;
50 Value value(const Name &name) const override;
51 void add(const Name &name, const Value &value) override;
52 void removeAny(const Name &name) override;
53 void visitEach(libecap::NamedValueVisitor &visitor) const override;
54 Area image() const override;
55 void parse(const Area &buf) override; // throws on failures
56
57 protected:
58 static Http::HdrType TranslateHeaderId(const Name &name);
59
60 private:
61 HttpHeader &theHeader; // the header being translated to libecap
62 Http::Message &theMessage; // the message being translated to libecap
63 };
64
65 // Helps translate Squid Http::Message into libecap::FirstLine (see children).
66 class FirstLineRep
67 {
68 public:
69 typedef libecap::Name Name;
70
71 public:
72 FirstLineRep(Http::Message &aMessage);
73
74 libecap::Version version() const;
75 void version(const libecap::Version &aVersion);
76 Name protocol() const;
77 void protocol(const Name &aProtocol);
78
79 protected:
80 static AnyP::ProtocolType TranslateProtocolId(const Name &name);
81
82 private:
83 Http::Message &theMessage; // the message which first line is being translated
84 };
85
86 // Translates Squid HttpRequest into libecap::RequestLine.
87 class RequestLineRep: public libecap::RequestLine, public FirstLineRep
88 {
89 public:
90 // typedef libecap::Name Name;
91 typedef libecap::Area Area;
92
93 public:
94 RequestLineRep(HttpRequest &aMessage);
95
96 /* libecap::RequestLine API */
97 void uri(const Area &aUri) override;
98 Area uri() const override;
99 void method(const Name &aMethod) override;
100 Name method() const override;
101 libecap::Version version() const override;
102 void version(const libecap::Version &aVersion) override;
103 Name protocol() const override;
104 void protocol(const Name &aProtocol) override;
105
106 private:
107 HttpRequest &theMessage; // the request header being translated to libecap
108 };
109
110 // Translates Squid HttpReply into libecap::StatusLine.
111 class StatusLineRep: public libecap::StatusLine, public FirstLineRep
112 {
113 public:
114 typedef libecap::Name Name;
115 typedef libecap::Area Area;
116
117 public:
118 StatusLineRep(HttpReply &aMessage);
119
120 /* libecap::StatusLine API */
121 void statusCode(int code) override;
122 int statusCode() const override;
123 void reasonPhrase(const Area &phrase) override;
124 Area reasonPhrase() const override;
125 libecap::Version version() const override;
126 void version(const libecap::Version &aVersion) override;
127 Name protocol() const override;
128 void protocol(const Name &aProtocol) override;
129
130 private:
131 HttpReply &theMessage; // the request header being translated to libecap
132 };
133
134 // Translates Squid BodyPipe into libecap::Body.
135 class BodyRep: public libecap::Body
136 {
137 public:
138 typedef libecap::BodySize BodySize;
139
140 public:
141 BodyRep(const BodyPipe::Pointer &aBody); // using NULL pointer? see tie()
142
143 void tie(const BodyPipe::Pointer &aBody); // late binding if !theBody;
144
145 // libecap::Body API
146 BodySize bodySize() const override;
147
148 private:
149 BodyPipe::Pointer theBody; // the body being translated to libecap
150 };
151
152 // Translates Squid Adaptation::Message into libecap::Message.
153 class MessageRep: public libecap::Message
154 {
155 public:
156 explicit MessageRep(Http::Message *rawHeader);
157 ~MessageRep() override;
158
159 /* libecap::Message API */
160 libecap::shared_ptr<libecap::Message> clone() const override;
161 libecap::FirstLine &firstLine() override;
162 const libecap::FirstLine &firstLine() const override;
163 libecap::Header &header() override;
164 const libecap::Header &header() const override;
165 void addBody() override;
166 libecap::Body *body() override;
167 const libecap::Body *body() const override;
168
169 void tieBody(Ecap::XactionRep *x); // to a specific transaction
170
171 Adaptation::Message &raw() { return theMessage; } // for host access
172 const Adaptation::Message &raw() const { return theMessage; } // for host
173
174 private:
175 Adaptation::Message theMessage; // the message being translated to libecap
176 libecap::FirstLine *theFirstLineRep; // request or status line wrapper
177 HeaderRep *theHeaderRep; // header wrapper
178 BodyRep *theBodyRep; // body wrapper
179 };
180
181 } // namespace Ecap
182 } // namespace Adaptation
183
184 #endif /* SQUID_SRC_ADAPTATION_ECAP_MESSAGEREP_H */
185