]> git.ipfire.org Git - thirdparty/squid.git/blame_incremental - src/FwdState.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / FwdState.h
... / ...
CommitLineData
1/*
2 * Copyright (C) 1996-2017 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_FORWARD_H
10#define SQUID_FORWARD_H
11
12#include "base/RefCount.h"
13#include "comm.h"
14#include "comm/Connection.h"
15#include "err_type.h"
16#include "fde.h"
17#include "http/StatusCode.h"
18#include "ip/Address.h"
19#include "security/forward.h"
20#if USE_OPENSSL
21#include "ssl/support.h"
22#endif
23
24/* forward decls */
25
26class AccessLogEntry;
27typedef RefCount<AccessLogEntry> AccessLogEntryPointer;
28class PconnPool;
29typedef RefCount<PconnPool> PconnPoolPointer;
30class ErrorState;
31class HttpRequest;
32
33#if USE_OPENSSL
34namespace Ssl
35{
36class ErrorDetail;
37class CertValidationResponse;
38};
39#endif
40
41/**
42 * Returns the TOS value that we should be setting on the connection
43 * to the server, based on the ACL.
44 */
45tos_t GetTosToServer(HttpRequest * request);
46
47/**
48 * Returns the Netfilter mark value that we should be setting on the
49 * connection to the server, based on the ACL.
50 */
51nfmark_t GetNfmarkToServer(HttpRequest * request);
52
53/// Sets initial TOS value and Netfilter for the future outgoing connection.
54void GetMarkingsToServer(HttpRequest * request, Comm::Connection &conn);
55
56class HelperReply;
57
58class FwdState : public RefCountable
59{
60 CBDATA_CLASS(FwdState);
61
62public:
63 typedef RefCount<FwdState> Pointer;
64 ~FwdState();
65 static void initModule();
66
67 /// Initiates request forwarding to a peer or origin server.
68 static void Start(const Comm::ConnectionPointer &client, StoreEntry *, HttpRequest *, const AccessLogEntryPointer &alp);
69 /// Same as Start() but no master xaction info (AccessLogEntry) available.
70 static void fwdStart(const Comm::ConnectionPointer &client, StoreEntry *, HttpRequest *);
71
72 /// This is the real beginning of server connection. Call it whenever
73 /// the forwarding server destination has changed and a new one needs to be opened.
74 /// Produces the cannot-forward error on fail if no better error exists.
75 void startConnectionOrFail();
76
77 void fail(ErrorState *err);
78 void unregister(Comm::ConnectionPointer &conn);
79 void unregister(int fd);
80 void complete();
81 void handleUnregisteredServerEnd();
82 int reforward();
83 bool reforwardableStatus(const Http::StatusCode s) const;
84 void serverClosed(int fd);
85 void connectStart();
86 void connectDone(const Comm::ConnectionPointer & conn, Comm::Flag status, int xerrno);
87 void connectTimeout(int fd);
88 time_t timeLeft() const; ///< the time left before the forwarding timeout expired
89 bool checkRetry();
90 bool checkRetriable();
91 void dispatch();
92 /// Pops a connection from connection pool if available. If not
93 /// checks the peer stand-by connection pool for available connection.
94 Comm::ConnectionPointer pconnPop(const Comm::ConnectionPointer &dest, const char *domain);
95 void pconnPush(Comm::ConnectionPointer & conn, const char *domain);
96
97 bool dontRetry() { return flags.dont_retry; }
98
99 void dontRetry(bool val) { flags.dont_retry = val; }
100
101 /** return a ConnectionPointer to the current server connection (may or may not be open) */
102 Comm::ConnectionPointer const & serverConnection() const { return serverConn; };
103
104private:
105 // hidden for safer management of self; use static fwdStart
106 FwdState(const Comm::ConnectionPointer &client, StoreEntry *, HttpRequest *, const AccessLogEntryPointer &alp);
107 void start(Pointer aSelf);
108
109#if STRICT_ORIGINAL_DST
110 void selectPeerForIntercepted();
111#endif
112 static void logReplyStatus(int tries, const Http::StatusCode status);
113 void doneWithRetries();
114 void completed();
115 void retryOrBail();
116 ErrorState *makeConnectingError(const err_type type) const;
117 void connectedToPeer(Security::EncryptorAnswer &answer);
118 static void RegisterWithCacheManager(void);
119
120 /// stops monitoring server connection for closure and updates pconn stats
121 void closeServerConnection(const char *reason);
122
123 void syncWithServerConn(const char *host);
124 void syncHierNote(const Comm::ConnectionPointer &server, const char *host);
125
126public:
127 StoreEntry *entry;
128 HttpRequest *request;
129 AccessLogEntryPointer al; ///< info for the future access.log entry
130
131 static void abort(void*);
132
133private:
134 Pointer self;
135 ErrorState *err;
136 Comm::ConnectionPointer clientConn; ///< a possibly open connection to the client.
137 time_t start_t;
138 int n_tries;
139
140 // AsyncCalls which we set and may need cancelling.
141 struct {
142 AsyncCall::Pointer connector; ///< a call linking us to the ConnOpener producing serverConn.
143 } calls;
144
145 struct {
146 bool connected_okay; ///< TCP link ever opened properly. This affects retry of POST,PUT,CONNECT,etc
147 bool dont_retry;
148 bool forward_completed;
149 } flags;
150
151 /** connections to open, in order, until successful */
152 Comm::ConnectionList serverDestinations;
153
154 Comm::ConnectionPointer serverConn; ///< a successfully opened connection to a server.
155
156 AsyncCall::Pointer closeHandler; ///< The serverConn close handler
157
158 /// possible pconn race states
159 typedef enum { raceImpossible, racePossible, raceHappened } PconnRace;
160 PconnRace pconnRace; ///< current pconn race state
161};
162
163void getOutgoingAddress(HttpRequest * request, Comm::ConnectionPointer conn);
164
165#endif /* SQUID_FORWARD_H */
166