]> git.ipfire.org Git - thirdparty/squid.git/blame - src/FwdState.h
SourceFormat Enforcement
[thirdparty/squid.git] / src / FwdState.h
CommitLineData
bbc27441
AJ
1/*
2 * Copyright (C) 1996-2014 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
2087dca6 9#ifndef SQUID_FORWARD_H
10#define SQUID_FORWARD_H
3cd1350a 11
8bf217bd 12#include "base/RefCount.h"
582c2af2
FC
13#include "comm.h"
14#include "comm/Connection.h"
c8f1812b 15#include "err_type.h"
582c2af2 16#include "fde.h"
955394ce 17#include "http/StatusCode.h"
582c2af2 18#include "ip/Address.h"
cb4f4424 19#if USE_OPENSSL
268a2e8f
CT
20#include "ssl/support.h"
21#endif
582c2af2 22
62ee09ca 23/* forward decls */
24
4bf68cfa
AR
25class AccessLogEntry;
26typedef RefCount<AccessLogEntry> AccessLogEntryPointer;
e8dca475
CT
27class PconnPool;
28typedef RefCount<PconnPool> PconnPoolPointer;
aa839030 29class ErrorState;
06093389 30class HttpRequest;
62ee09ca 31
cb4f4424 32#if USE_OPENSSL
268a2e8f
CT
33namespace Ssl
34{
22636a68
CT
35class ErrorDetail;
36class CertValidationResponse;
a23223bf 37class PeerConnectorAnswer;
268a2e8f 38};
b56756cb 39#endif
268a2e8f 40
425de4c8
AJ
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
6ee88490
CT
53/// Sets initial TOS value and Netfilter for the future outgoing connection.
54void GetMarkingsToServer(HttpRequest * request, Comm::Connection &conn);
55
4a77bb4e
CT
56class HelperReply;
57
3cd1350a 58class FwdState : public RefCountable
59{
5c2f68b7
AJ
60 CBDATA_CLASS(FwdState);
61
3cd1350a 62public:
63 typedef RefCount<FwdState> Pointer;
3cd1350a 64 ~FwdState();
65 static void initModule();
66
4bf68cfa
AR
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.
be364179 70 static void fwdStart(const Comm::ConnectionPointer &client, StoreEntry *, HttpRequest *);
8652f8e7
AJ
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.
6b679a01 75 void startConnectionOrFail();
8652f8e7 76
3cd1350a 77 void fail(ErrorState *err);
00ae51e4 78 void unregister(Comm::ConnectionPointer &conn);
3cd1350a 79 void unregister(int fd);
80 void complete();
3e8c047e 81 void handleUnregisteredServerEnd();
3cd1350a 82 int reforward();
955394ce 83 bool reforwardableStatus(const Http::StatusCode s) const;
3cd1350a 84 void serverClosed(int fd);
85 void connectStart();
c8407295 86 void connectDone(const Comm::ConnectionPointer & conn, Comm::Flag status, int xerrno);
3cd1350a 87 void connectTimeout(int fd);
8aec3e1b 88 time_t timeLeft() const; ///< the time left before the forwarding timeout expired
3cd1350a 89 bool checkRetry();
90 bool checkRetriable();
91 void dispatch();
e8dca475
CT
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);
642a305c 95 void pconnPush(Comm::ConnectionPointer & conn, const char *domain);
3cd1350a 96
97 bool dontRetry() { return flags.dont_retry; }
98
99 void dontRetry(bool val) { flags.dont_retry = val; }
100
5229395c 101 /** return a ConnectionPointer to the current server connection (may or may not be open) */
00ae51e4 102 Comm::ConnectionPointer const & serverConnection() const { return serverConn; };
5229395c 103
3cd1350a 104private:
7a0fb323 105 // hidden for safer management of self; use static fwdStart
4bf68cfa 106 FwdState(const Comm::ConnectionPointer &client, StoreEntry *, HttpRequest *, const AccessLogEntryPointer &alp);
7a0fb323 107 void start(Pointer aSelf);
108
32c32865 109#if STRICT_ORIGINAL_DST
7c75511b 110 void selectPeerForIntercepted();
32c32865 111#endif
955394ce 112 static void logReplyStatus(int tries, const Http::StatusCode status);
9d2760b6 113 void doneWithRetries();
802a8c1d 114 void completed();
3e8c047e 115 void retryOrBail();
2ac4f6b5 116 ErrorState *makeConnectingError(const err_type type) const;
a23223bf
CT
117#if USE_OPENSSL
118 void connectedToPeer(Ssl::PeerConnectorAnswer &answer);
119#endif
6852be71 120 static void RegisterWithCacheManager(void);
3cd1350a 121
e8dca475
CT
122 /// stops monitoring server connection for closure and updates pconn stats
123 void closeServerConnection(const char *reason);
124
3cd1350a 125public:
126 StoreEntry *entry;
127 HttpRequest *request;
4bf68cfa
AR
128 AccessLogEntryPointer al; ///< info for the future access.log entry
129
429871db 130 static void abort(void*);
3cd1350a 131
132private:
3cd1350a 133 Pointer self;
134 ErrorState *err;
5c336a3b 135 Comm::ConnectionPointer clientConn; ///< a possibly open connection to the client.
3cd1350a 136 time_t start_t;
137 int n_tries;
3cd1350a 138
e3a4aecc
AJ
139 // AsyncCalls which we set and may need cancelling.
140 struct {
141 AsyncCall::Pointer connector; ///< a call linking us to the ConnOpener producing serverConn.
142 } calls;
3cd1350a 143
26ac0430 144 struct {
e857372a
FC
145 bool connected_okay; ///< TCP link ever opened properly. This affects retry of POST,PUT,CONNECT,etc
146 bool dont_retry;
147 bool forward_completed;
2fadd50d 148 } flags;
3cd1350a 149
5229395c 150 /** connections to open, in order, until successful */
00ae51e4
AJ
151 Comm::ConnectionList serverDestinations;
152
153 Comm::ConnectionPointer serverConn; ///< a successfully opened connection to a server.
d2bf2f90 154
bc81ee68
AR
155 /// possible pconn race states
156 typedef enum { raceImpossible, racePossible, raceHappened } PconnRace;
157 PconnRace pconnRace; ///< current pconn race state
3cd1350a 158};
2087dca6 159
8a648e8d 160void getOutgoingAddress(HttpRequest * request, Comm::ConnectionPointer conn);
28618087 161
d85b8894 162#endif /* SQUID_FORWARD_H */
f53969cc 163