5 * DEBUG: section 61 Redirector
6 * AUTHOR: Duane Wessels
8 * SQUID Web Proxy Cache http://www.squid-cache.org/
9 * ----------------------------------------------------------
11 * Squid is the result of efforts by numerous individuals from
12 * the Internet community; see the CONTRIBUTORS file for full
13 * details. Many organizations have provided support for Squid's
14 * development; see the SPONSORS file for full details. Squid is
15 * Copyrighted (C) 2001 by the Regents of the University of
16 * California; see the COPYRIGHT file for full details. Squid
17 * incorporates software developed and/or copyrighted by other
18 * sources; see the CREDITS file for full details.
20 * This program is free software; you can redistribute it and/or modify
21 * it under the terms of the GNU General Public License as published by
22 * the Free Software Foundation; either version 2 of the License, or
23 * (at your option) any later version.
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
28 * GNU General Public License for more details.
30 * You should have received a copy of the GNU General Public License
31 * along with this program; if not, write to the Free Software
32 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
37 #include "auth/UserRequest.h"
38 #include "comm/Connection.h"
39 #include "mgr/Registration.h"
42 #include "client_side_request.h"
43 #include "acl/Checklist.h"
44 #include "HttpRequest.h"
45 #include "client_side.h"
53 Ip::Address client_addr
;
54 const char *client_ident
;
59 static HLPCB redirectHandleReply
;
60 static void redirectStateFree(redirectStateData
* r
);
61 static helper
*redirectors
= NULL
;
62 static OBJH redirectStats
;
63 static int n_bypassed
= 0;
64 CBDATA_TYPE(redirectStateData
);
67 redirectHandleReply(void *data
, char *reply
)
69 redirectStateData
*r
= static_cast<redirectStateData
*>(data
);
72 debugs(61, 5, "redirectHandleRead: {" << (reply
&& *reply
!= '\0' ? reply
: "<NULL>") << "}");
75 if ((t
= strchr(reply
, ' ')))
82 if (cbdataReferenceValidDone(r
->data
, &cbdata
))
83 r
->handler(cbdata
, reply
);
89 redirectStateFree(redirectStateData
* r
)
91 safe_free(r
->orig_url
);
96 redirectStats(StoreEntry
* sentry
)
98 if (redirectors
== NULL
) {
99 storeAppendPrintf(sentry
, "No redirectors defined\n");
103 helperStats(sentry
, redirectors
, "Redirector Statistics");
105 if (Config
.onoff
.redirector_bypass
)
106 storeAppendPrintf(sentry
, "\nNumber of requests bypassed "
107 "because all redirectors were busy: %d\n", n_bypassed
);
110 /**** PUBLIC FUNCTIONS ****/
113 redirectStart(ClientHttpRequest
* http
, RH
* handler
, void *data
)
115 ConnStateData
* conn
= http
->getConn();
116 redirectStateData
*r
= NULL
;
119 char claddr
[MAX_IPSTRLEN
];
120 char myaddr
[MAX_IPSTRLEN
];
123 debugs(61, 5, "redirectStart: '" << http
->uri
<< "'");
125 if (Config
.onoff
.redirector_bypass
&& redirectors
->stats
.queue_size
) {
126 /* Skip redirector if there is one request queued */
132 r
= cbdataAlloc(redirectStateData
);
133 r
->orig_url
= xstrdup(http
->uri
);
135 r
->client_addr
= conn
->log_addr
;
137 r
->client_addr
.SetNoAddr();
138 r
->client_ident
= NULL
;
140 if (http
->request
->auth_user_request
!= NULL
)
141 r
->client_ident
= http
->request
->auth_user_request
->username();
142 else if (http
->request
->extacl_user
.defined()) {
143 r
->client_ident
= http
->request
->extacl_user
.termedBuf();
146 if (!r
->client_ident
&& (conn
!= NULL
&& conn
->rfc931
[0]))
147 r
->client_ident
= conn
->rfc931
;
151 if (!r
->client_ident
&& conn
!= NULL
&& Comm::IsConnOpen(conn
->clientConn
))
152 r
->client_ident
= sslGetUserEmail(fd_table
[conn
->clientConn
->fd
].ssl
);
156 if (!r
->client_ident
)
157 r
->client_ident
= dash_str
;
159 r
->method_s
= RequestMethodStr(http
->request
->method
);
161 r
->handler
= handler
;
163 r
->data
= cbdataReference(data
);
165 if ((fqdn
= fqdncache_gethostbyaddr(r
->client_addr
, 0)) == NULL
)
168 snprintf(buf
, 8192, "%s %s/%s %s %s myip=%s myport=%d\n",
170 r
->client_addr
.NtoA(claddr
,MAX_IPSTRLEN
),
172 r
->client_ident
[0] ? rfc1738_escape(r
->client_ident
) : dash_str
,
174 http
->request
->my_addr
.NtoA(myaddr
,MAX_IPSTRLEN
),
175 http
->request
->my_addr
.GetPort());
177 helperSubmit(redirectors
, buf
, redirectHandleReply
, r
);
181 redirectRegisterWithCacheManager(void)
183 Mgr::RegisterAction("redirector", "URL Redirector Stats", redirectStats
, 0, 1);
191 redirectRegisterWithCacheManager();
193 if (!Config
.Program
.redirect
)
196 if (redirectors
== NULL
)
197 redirectors
= new helper("redirector");
199 redirectors
->cmdline
= Config
.Program
.redirect
;
201 redirectors
->childs
= Config
.redirectChildren
;
203 redirectors
->ipc_type
= IPC_STREAM
;
205 helperOpenServers(redirectors
);
209 CBDATA_INIT_TYPE(redirectStateData
);
214 redirectShutdown(void)
219 helperShutdown(redirectors
);