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.
205 lines
7.8 KiB
205 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 */
|
|
|