From 5a4d45f268174e4993e593b3c8200b5ea4f5aa35 Mon Sep 17 00:00:00 2001 From: Art Cancro Date: Wed, 9 Mar 2011 14:07:35 -0500 Subject: [PATCH] Added the ability to specify a file defining *simple* redirect patterns. This is needed for sites transitioning away from conventional web servers. --- webcit/static.c | 2 - webcit/webcit.h | 2 + webcit/webserver.c | 115 +++++++++++++++++++++++++++++++++++++-------- webcit/webserver.h | 10 ++++ 4 files changed, 107 insertions(+), 22 deletions(-) diff --git a/webcit/static.c b/webcit/static.c index 71ca5641a..1113fd1d5 100644 --- a/webcit/static.c +++ b/webcit/static.c @@ -231,8 +231,6 @@ void output_flat_static(void) } } -extern void do_404(void); - void output_static_safe(HashList *DirList) { wcsession *WCC = WC; diff --git a/webcit/webcit.h b/webcit/webcit.h index bbb866035..c3e9e2491 100644 --- a/webcit/webcit.h +++ b/webcit/webcit.h @@ -664,6 +664,8 @@ void serv_puts(const char *string); void who(void); void push_destination(void); void pop_destination(void); +void robots_txt(void); +extern void do_404(void); void ajax_mini_calendar(void); void fmout(char *align); diff --git a/webcit/webserver.c b/webcit/webserver.c index e2670d29d..12a2ba71c 100644 --- a/webcit/webserver.c +++ b/webcit/webserver.c @@ -24,6 +24,8 @@ int is_https = 0; /* Nonzero if I am an HTTPS service */ int follow_xff = 0; /* Follow X-Forwarded-For: header */ int home_specified = 0; /* did the user specify a homedir? */ int DisableGzip = 0; +struct redirector *redir = NULL; +int num_redir = 0; extern pthread_mutex_t SessionListMutex; extern pthread_key_t MyConKey; @@ -65,6 +67,77 @@ extern int LoadTemplates; + +/* + * Handle redirects to legacy web servers + */ +void handle_redir(void) { + if (num_redir > 0) { + int i; + const char *req = ChrPtr(WC->Hdr->this_page); + if (!req) { + do_404(); + return; + } + if (req[0] == '/') ++req; + syslog(9, "handle_redir() called; redirect this: %s", req); + for (i=0; i= num_redir_alloc) { + if (num_redir_alloc == 0) { + num_redir_alloc = 10; + } + else { + num_redir_alloc = num_redir_alloc * 2; + } + redir = realloc(redir, sizeof(struct redirector) * num_redir_alloc ); + } + + extract_token(redir[num_redir].urlpart, buf, 0, '|', sizeof(redir[num_redir].urlpart)); + extract_token(redir[num_redir].redirect_to, buf, 1, '|', sizeof(redir[num_redir].redirect_to)); + WebcitAddUrlHandler(redir[num_redir].urlpart, strlen(redir[num_redir].urlpart), "", 0, handle_redir, ANONYMOUS|COOKIEUNNEEDED|ISSTATIC); + ++num_redir; + } + + } + fclose(fp); +} + + + /* * Here's where it all begins. */ @@ -111,14 +184,17 @@ int main(int argc, char **argv) /* Parse command line */ #ifdef HAVE_OPENSSL - while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:cfsS:Z")) != EOF) + while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:r:cfsS:Z")) != EOF) #else - while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:cfZ")) != EOF) + while ((a = getopt(argc, argv, "u:h:i:p:t:T:B:x:dD:G:r:cfZ")) != EOF) #endif switch (a) { case 'u': UID = atol(optarg); break; + case 'r': + load_redirs(optarg); + break; case 'h': hdir = strdup(optarg); relh=hdir[0]!='/'; @@ -182,8 +258,7 @@ int main(int argc, char **argv) if (gethostname (&server_cookie[strlen(server_cookie)], 200) != 0) { - syslog(2, "gethostname: %s\n", - strerror(errno)); + syslog(2, "gethostname: %s", strerror(errno)); free(server_cookie); } } @@ -240,22 +315,22 @@ int main(int argc, char **argv) LoadIconDir(static_icon_dir); /* Tell 'em who's in da house */ - syslog(1, PACKAGE_STRING "\n"); - syslog(1, "Copyright (C) 1996-2011 by the citadel.org team\n"); - syslog(1, "\n"); - syslog(1, "This program is open source software: you can redistribute it and/or\n"); - syslog(1, "modify it under the terms of the GNU General Public License as published\n"); - syslog(1, "by the Free Software Foundation, either version 3 of the License, or\n"); - syslog(1, "(at your option) any later version.\n"); - syslog(1, "\n"); - syslog(1, "This program is distributed in the hope that it will be useful,\n"); - syslog(1, "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"); - syslog(1, "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"); - syslog(1, "GNU General Public License for more details.\n"); - syslog(1, "\n"); - syslog(1, "You should have received a copy of the GNU General Public License\n"); - syslog(1, "along with this program. If not, see .\n"); - syslog(1, "\n"); + syslog(1, "%s", PACKAGE_STRING); + syslog(1, "Copyright (C) 1996-2011 by the citadel.org team"); + syslog(1, " "); + syslog(1, "This program is open source software: you can redistribute it and/or"); + syslog(1, "modify it under the terms of the GNU General Public License as published"); + syslog(1, "by the Free Software Foundation, either version 3 of the License, or"); + syslog(1, "(at your option) any later version."); + syslog(1, " "); + syslog(1, "This program is distributed in the hope that it will be useful,"); + syslog(1, "but WITHOUT ANY WARRANTY; without even the implied warranty of"); + syslog(1, "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the"); + syslog(1, "GNU General Public License for more details."); + syslog(1, " "); + syslog(1, "You should have received a copy of the GNU General Public License"); + syslog(1, "along with this program. If not, see ."); + syslog(1, " "); /* initialize various subsystems */ diff --git a/webcit/webserver.h b/webcit/webserver.h index a087877ec..1a1832254 100644 --- a/webcit/webserver.h +++ b/webcit/webserver.h @@ -3,8 +3,18 @@ extern char *static_dirs[PATH_MAX]; /**< Web representation */ extern int ndirs; extern char socket_dir[PATH_MAX]; +struct redirector { + char urlpart[256]; + char redirect_to[256]; +}; + +extern struct redirector *redir; +extern int num_redir; + int ClientGetLine(ParsedHttpHdrs *Hdr, StrBuf *Target); int client_read_to(ParsedHttpHdrs *Hdr, StrBuf *Target, int bytes, int timeout); void wc_backtrace(void); void ShutDownWebcit(void); void shutdown_ssl(void); + + -- 2.30.2