You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

206 lines
7.8 KiB

# --- SDE-COPYRIGHT-NOTE-BEGIN ---
# This copyright note is auto-generated by ./scripts/Create-CopyPatch.
#
# Filename: package/.../pound/pound-2.3.2-custom-redirect.patch
# Copyright (C) 2008 The OpenSDE Project
#
# More information can be found in the files COPYING and README.
#
# This patch file is dual-licensed. It is available under the license the
# patched project is licensed under, as long as it is an OpenSource license
# as defined at http://www.opensource.org/ (e.g. BSD, X11) or under the terms
# of the GNU General Public License as published by the Free Software
# Foundation; either version 2 of the License, or (at your option) any later
# version.
# --- SDE-COPYRIGHT-NOTE-END ---
Author: Chris Barnett <barn3y(at)gmail.com>
Initial Package Version: 2.3.2
Origin: http://www.apsis.ch/pound/pound_list/archive/2007/2007-09/1190613609000#1190613609000
Description: This patch adds the capability to configure 301 or 307 redirects.
Usage Information:
You can force a 301 Moved Permanently redirect like this:
ListenHTTP
Address 0.0.0.0
Port 80
Service
HeadRequire "Host: .*www.server0.com.*"
Redirect 301 "http://www.server1.com"
End
End
You can force a 302 Found or 307 Temporary Redirect in the same way.
The existing Redirect syntax still works as expected:
ListenHTTP
Address 0.0.0.0
Port 80
Service
HeadRequire "Host: .*www.server0.com.*"
Redirect "http://www.server1.com"
End
End
Will use a 302 Found redirect.
diff -Naur Pound-2.3.2/config.c Pound-2.3.2-custom-redirect/config.c
--- Pound-2.3.2/config.c 2007-05-18 18:34:53.000000000 +1000
+++ Pound-2.3.2-custom-redirect/config.c 2007-09-24 14:51:40.000000000 +1000
@@ -425,7 +425,9 @@
be->alive = 1;
pthread_mutex_init(&res->mut, NULL);
lin[matches[1].rm_eo] = '\0';
- if((be->url = strdup(lin + matches[1].rm_so)) == NULL) {
+ be->redir_type = atoi(lin + matches[1].rm_so);
+ lin[matches[3].rm_eo] = '\0';
+ if((be->url = strdup(lin + matches[3].rm_so)) == NULL) {
logmsg(LOG_ERR, "line %d: Redirector config: out of memory - aborted", n_lin);
exit(1);
}
@@ -1083,7 +1085,7 @@
|| regcomp(&TimeOut, "^[ \t]*TimeOut[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
|| regcomp(&HAport, "^[ \t]*HAport[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
|| regcomp(&HAportAddr, "^[ \t]*HAport[ \t]+([^ \t]+)[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
- || regcomp(&Redirect, "^[ \t]*Redirect[ \t]+\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
+ || regcomp(&Redirect, "^[ \t]*Redirect[ \t]+((301|302|307)[ \t]+)?\"(.+)\"[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
|| regcomp(&Session, "^[ \t]*Session[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
|| regcomp(&Type, "^[ \t]*Type[ \t]+([^ \t]+)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
|| regcomp(&TTL, "^[ \t]*TTL[ \t]+([1-9][0-9]*)[ \t]*$", REG_ICASE | REG_NEWLINE | REG_EXTENDED)
diff -Naur Pound-2.3.2/http.c Pound-2.3.2-custom-redirect/http.c
--- Pound-2.3.2/http.c 2007-05-18 18:34:53.000000000 +1000
+++ Pound-2.3.2-custom-redirect/http.c 2007-09-24 15:07:20.000000000 +1000
@@ -52,23 +52,32 @@
* Reply with a redirect
*/
static void
-redirect_reply(BIO *const c, const char *url)
+redirect_reply(BIO *const c, const int redir_type, const char *url)
{
char rep[MAXBUF], cont[MAXBUF];
+ char *type_str;
snprintf(cont, sizeof(cont),
"<html><head><title>Redirect</title></head><body><h1>Redirect</h1><p>You should go to <a href=\"%s\">%s</a></p></body></html>",
url, url);
- /*
- * This really should be 307, but some HTTP/1.0 clients do not understand that, so we use 302
+
+ switch(redir_type) {
+ case 301:
+ type_str = "301 Moved Permanently";
+ break;
+
+ case 307:
+ type_str = "307 Temporary Redirect";
+ break;
+
+ default:
+ type_str = "302 Found";
+ break;
+ }
snprintf(rep, sizeof(rep),
- "HTTP/1.0 307 Temporary Redirect\r\nLocation: %s\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n",
- url, strlen(cont));
- */
- snprintf(rep, sizeof(rep),
- "HTTP/1.0 302 Found\r\nLocation: %s\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n",
- url, strlen(cont));
+ "HTTP/1.0 %s\r\nLocation: %s\r\nContent-Type: text/html\r\nContent-Length: %d\r\n\r\n",
+ type_str, url, strlen(cont));
BIO_write(c, rep, strlen(rep));
BIO_write(c, cont, strlen(cont));
BIO_flush(c);
@@ -996,7 +1005,7 @@
snprintf(buf, sizeof(buf) - 1, "%s%s", cur_backend->url, url);
else
strncpy(buf, cur_backend->url, sizeof(buf) - 1);
- redirect_reply(cl, buf);
+ redirect_reply(cl, cur_backend->redir_type, buf);
addr2str(caddr, MAXBUF - 1, &from_host);
switch(lstn->log_level) {
case 0:
diff -Naur Pound-2.3.2/pound.8 Pound-2.3.2-custom-redirect/pound.8
--- Pound-2.3.2/pound.8 2007-05-18 18:34:53.000000000 +1000
+++ Pound-2.3.2-custom-redirect/pound.8 2007-09-24 15:06:14.000000000 +1000
@@ -544,11 +544,13 @@
.B Pound
will attempt to load-balance between them.
.TP
-\fBRedirect\fR "url"
+\fBRedirect\fR [301|302|307] "url"
This is a special type of back-end. Instead of sending the request to a back-end
.B Pound
-replies immediately with a redirection to the given URL. You may define multiple
-redirectors in a service, as well as mixing them with regular back-ends.
+replies immediately with a redirection to the given URL. You may specify the type
+of redirection used: 301 Moved Permanently, 302 Found (default if none specified),
+or 307 Temporary Redirect. You may define multiple redirectors in a service, as
+well as mixing them with regular back-ends.
.IP
The address the client is redirected to is determined by the actual
.I url
@@ -562,7 +564,7 @@
.br
.br
- Redirect "http://abc.example"
+ Redirect 307 "http://abc.example"
.br
.br
@@ -574,7 +576,7 @@
.br
.br
- Redirect "http://abc.example/index.html"
+ Redirect 307 "http://abc.example/index.html"
.br
.br
@@ -582,12 +584,11 @@
.IR "http://abc.example/index.html".
.IP
.IR "Technical note":
-in an ideal world
+Ideally, "307 Temporary Redirect" should be used instead of "302 Found".
+Unfortunately, that is not yet supported by all clients (in particular
+HTTP 1.0 ones), so
.B Pound
-should reply with a "307 Temporary Redirect" status. Unfortunately, that is not
-yet supported by all clients (in particular HTTP 1.0 ones), so
-.B Pound
-currently replies with a "302 Found" instead.
+currently defaults to "302 Found" instead.
.TP
\fBEmergency\fR
Directives enclosed between an
@@ -940,7 +941,7 @@
.br
Url "/forbidden.*"
.br
- Redirect "https://xyzzy.com"
+ Redirect 302 "https://xyzzy.com"
.br
End
.br
diff -Naur Pound-2.3.2/pound.h Pound-2.3.2-custom-redirect/pound.h
--- Pound-2.3.2/pound.h 2007-05-18 18:34:53.000000000 +1000
+++ Pound-2.3.2-custom-redirect/pound.h 2007-09-24 14:05:30.000000000 +1000
@@ -288,7 +288,8 @@
int priority; /* priority */
int to;
struct sockaddr_in HA; /* HA address & port */
- char *url; /* for redirectors */
+ char *url; /* (URL for redirectors) */
+ int redir_type; /* redirect type (for redirectors) */
int redir_req; /* the redirect should include the request path */
pthread_mutex_t mut; /* mutex for this back-end */
int n_requests; /* number of requests seen */