Client.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 1996-2025 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 #ifndef SQUID_SRC_CLIENTS_CLIENT_H
10 #define SQUID_SRC_CLIENTS_CLIENT_H
11 
12 #include "base/AsyncJob.h"
13 #include "BodyPipe.h"
14 #include "CommCalls.h"
15 #include "FwdState.h"
16 #include "http/forward.h"
17 #include "StoreIOBuffer.h"
18 #if USE_ADAPTATION
19 #include "adaptation/forward.h"
20 #include "adaptation/Initiator.h"
21 #endif
22 
29 class Client:
30 #if USE_ADAPTATION
31  public Adaptation::Initiator,
32  public BodyProducer,
33 #endif
34  public BodyConsumer
35 {
36 
37 public:
38  Client(FwdState *);
39  ~Client() override;
40 
42  virtual const Comm::ConnectionPointer & dataConnection() const = 0;
43 
44  // BodyConsumer: consume request body or adapted response body.
45  // The implementation just calls the corresponding HTTP or ICAP handle*()
46  // method, depending on the pipe.
50 
52  virtual void maybeReadVirginBody() = 0;
53 
55  virtual void abortAll(const char *reason) = 0;
56 
60  virtual bool abortOnData(const char *reason);
61 
64 
65 #if USE_ADAPTATION
66  // Adaptation::Initiator API: start an ICAP transaction and receive adapted headers.
67  void noteAdaptationAnswer(const Adaptation::Answer &answer) override;
69 
70  // BodyProducer: provide virgin response body to ICAP.
73 #endif
74  virtual bool getMoreRequestBody(MemBuf &buf);
75  virtual void processReplyBody() = 0;
76 
77 //AsyncJob virtual methods
78  void swanSong() override;
79  bool doneAll() const override;
80 
81 public: // should be protected
82  void serverComplete();
84  void markParsedVirginReplyAsWhole(const char *reasonWeAreSure);
87 
88 private:
89  void serverComplete2();
90  bool completed = false;
92 protected:
93  // kids customize these
94  virtual void haveParsedReplyHeaders();
95  virtual void completeForwarding();
97  // BodyConsumer for HTTP: consume request body.
98  bool startRequestBodyFlow();
101  virtual void handleRequestBodyProducerAborted() = 0;
102 
103  // sending of the request body to the server
104  void sendMoreRequestBody();
105  // has body; kids overwrite to increment I/O stats counters
106  virtual void sentRequestBody(const CommIoCbParams &io) = 0;
107  virtual void doneSendingRequestBody() = 0;
108 
111  virtual void closeServer() = 0;
112  virtual bool doneWithServer() const = 0;
113  virtual bool mayReadVirginReplyBody() const = 0;
115 
118  virtual void noteDelayAwareReadChance() = 0;
119 
121  bool abortOnBadEntry(const char *abortReason);
122 
123  bool blockCaching();
124 
125 #if USE_ADAPTATION
127  void adaptVirginReplyBody(const char *buf, ssize_t len);
128  void cleanAdaptation();
129  virtual bool doneWithAdaptation() const;
131  // BodyConsumer for ICAP: consume adapted response body.
135 
138  void handleAdaptationBlocked(const Adaptation::Answer &answer);
139  void handleAdaptationAborted(bool bypassable = false);
141 
143  void resumeBodyStorage();
144 
149 #endif
150 
151 protected:
152  const HttpReply *virginReply() const;
155 
158 
159  // Kids use these to stuff data into the response instead of messing with the entry directly
160  void adaptOrFinalizeReply();
161  void addVirginReplyBody(const char *buf, ssize_t len);
162  void storeReplyBody(const char *buf, ssize_t len);
164  size_t replyBodySpace(const MemBuf &readBuf, const size_t minSpace) const;
166  size_t calcBufferSpaceToReserve(const size_t space, const size_t wantSpace) const;
167 
168  void adjustBodyBytesRead(const int64_t delta);
169 
172  void delayRead();
173 
174  // These should be private
175  int64_t currentOffset = 0;
178 public: // should not be
179  StoreEntry *entry = nullptr;
182 
183 protected:
187 #if USE_ADAPTATION
193  bool startedAdaptation = false;
194 
199 
200  bool adaptedReplyAborted = false;
201 #endif
203 
206 
209  const char *markedParsedVirginReplyAsWhole = nullptr;
210 
213  const char *doneWithFwd = nullptr;
214 
215 private:
217  void maybePurgeOthers();
218 
221 };
222 
223 #endif /* SQUID_SRC_CLIENTS_CLIENT_H */
224 
void handleMoreRequestBodyAvailable()
Definition: Client.cc:323
void storeReplyBody(const char *buf, ssize_t len)
Definition: Client.cc:1070
HttpReply * theVirginReply
Definition: Client.h:219
virtual bool getMoreRequestBody(MemBuf &buf)
either fill buf with available [encoded] request body bytes or return false
Definition: Client.cc:442
void noteAdaptationAnswer(const Adaptation::Answer &answer) override
Definition: Client.cc:700
StoreEntry * entry
Definition: Client.h:179
void noteAdaptationAclCheckDone(Adaptation::ServiceGroupPointer group) override
Definition: Client.cc:970
void delayRead()
Definition: Client.cc:1042
common parts of HttpRequest and HttpReply
Definition: Message.h:25
Definition: Client.h:29
bool doneAll() const override
whether positive goal has been reached
Definition: Client.cc:203
void adaptVirginReplyBody(const char *buf, ssize_t len)
Definition: Client.cc:632
bool waitingForDelayAwareReadChance
whether we are waiting for MemObject::delayRead() to call us back
Definition: Client.h:205
bool completed
Definition: Client.h:90
AsyncCall::Pointer requestSender
Definition: Client.h:185
void noteMoreBodyDataAvailable(BodyPipe::Pointer) override
Definition: Client.cc:274
void checkAdaptationWithBodyCompletion()
Definition: Client.cc:831
Client(FwdState *)
Definition: Client.cc:38
void handleAdaptationCompleted()
Definition: Client.cc:878
void noteBodyConsumerAborted(BodyPipe::Pointer) override
Definition: Client.cc:688
virtual void handleRequestBodyProducerAborted()=0
Definition: Client.cc:355
virtual void abortAll(const char *reason)=0
abnormal transaction termination; reason is for debugging only
void maybePurgeOthers()
Definition: Client.cc:520
void serverComplete2()
Definition: Client.cc:188
BodyPipe::Pointer requestBodySource
Definition: Client.h:184
virtual const Comm::ConnectionPointer & dataConnection() const =0
void cleanAdaptation()
Definition: Client.cc:607
void adjustBodyBytesRead(const int64_t delta)
initializes bodyBytesRead stats if needed and applies delta
Definition: Client.cc:1027
void adaptOrFinalizeReply()
Definition: Client.cc:1009
MemBuf * responseBodyBuffer
Definition: Client.h:176
BodyPipe::Pointer virginBodyDestination
Definition: Client.h:188
bool startRequestBodyFlow()
Definition: Client.cc:243
virtual void haveParsedReplyHeaders()
called when we have final (possibly adapted) reply headers; kids extend
Definition: Client.cc:541
int64_t currentOffset
Definition: Client.h:175
virtual bool mayReadVirginReplyBody() const =0
whether we may receive more virgin response body bytes
void serverComplete()
Definition: Client.cc:167
virtual void completeForwarding()
Definition: Client.cc:216
void handleMoreAdaptedBodyAvailable()
Definition: Client.cc:772
void handleAdaptedHeader(Http::Message *msg)
Definition: Client.cc:720
void noteBodyProductionEnded(BodyPipe::Pointer) override
Definition: Client.cc:288
virtual void doneSendingRequestBody()=0
Definition: Client.cc:344
void resumeBodyStorage()
called by StoreEntry when it has more buffer space available
Definition: Client.cc:757
const HttpReply * virginReply() const
Definition: Client.cc:102
HttpReply * theFinalReply
Definition: Client.h:220
bool blockCaching()
whether to prevent caching of an otherwise cachable response
Definition: Client.cc:556
virtual void processReplyBody()=0
Definition: MemBuf.h:23
void swanSong() override
Definition: Client.cc:68
void handleAdaptedBodyProducerAborted()
Definition: Client.cc:857
void sendMoreRequestBody()
Definition: Client.cc:416
FwdState::Pointer fwd
Definition: Client.h:180
bool handledEarlyAdaptationAbort()
Definition: Client.cc:913
HttpReply * setFinalReply(HttpReply *r)
Definition: Client.cc:136
virtual HttpRequestPointer originalRequest()
a hack to reach HttpStateData::orignal_request
Definition: Client.cc:573
bool adaptationAccessCheckPending
Definition: Client.h:192
HttpReply * setVirginReply(HttpReply *r)
Definition: Client.cc:116
bool receivedWholeRequestBody
handleRequestBodyProductionEnded called
Definition: Client.h:202
HttpReply * finalReply()
Definition: Client.cc:129
virtual void noteDelayAwareReadChance()=0
bool abortOnBadEntry(const char *abortReason)
Entry-dependent callbacks use this check to quit if the entry went bad.
Definition: Client.cc:262
summarizes adaptation service answer for the noteAdaptationAnswer() API
Definition: Answer.h:24
void markParsedVirginReplyAsWhole(const char *reasonWeAreSure)
Definition: Client.cc:158
BodyPipe::Pointer adaptedBodySource
Definition: Client.h:190
virtual bool doneWithAdaptation() const
Definition: Client.cc:624
void sendBodyIsTooLargeError()
Definition: Client.cc:998
size_t calcBufferSpaceToReserve(const size_t space, const size_t wantSpace) const
determine how much space the buffer needs to reserve
Definition: Client.cc:1079
void startAdaptation(const Adaptation::ServiceGroupPointer &group, HttpRequest *cause)
Initiate an asynchronous adaptation transaction which will call us back.
Definition: Client.cc:581
void handleAdaptationAborted(bool bypassable=false)
Definition: Client.cc:897
void addVirginReplyBody(const char *buf, ssize_t len)
Definition: Client.cc:1054
const char * doneWithFwd
Definition: Client.h:213
virtual void sentRequestBody(const CommIoCbParams &io)=0
Definition: Client.cc:368
void noteBodyProducerAborted(BodyPipe::Pointer) override
Definition: Client.cc:302
void handleRequestBodyProductionEnded()
Definition: Client.cc:333
const char * markedParsedVirginReplyAsWhole
Definition: Client.h:209
virtual void maybeReadVirginBody()=0
read response data from the network
~Client() override
Definition: Client.cc:47
virtual void closeServer()=0
virtual bool abortOnData(const char *reason)
Definition: Client.cc:315
void handleAdaptedBodyProductionEnded()
Definition: Client.cc:819
bool startedAdaptation
Definition: Client.h:193
bool receivedWholeAdaptedReply
Definition: Client.h:198
CbcPointer< Adaptation::Initiate > adaptedHeadSource
Definition: Client.h:189
size_t replyBodySpace(const MemBuf &readBuf, const size_t minSpace) const
Definition: Client.cc:1114
void handleAdaptationBlocked(const Adaptation::Answer &answer)
Definition: Client.cc:936
HttpRequestPointer request
Definition: Client.h:181
void noteMoreBodySpaceAvailable(BodyPipe::Pointer) override
Definition: Client.cc:674
virtual bool doneWithServer() const =0
bool adaptedReplyAborted
handleAdaptedBodyProducerAborted() has been called
Definition: Client.h:200

 

Introduction

Documentation

Support

Miscellaneous