redirect.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:4k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: redirect.c,v 1.78 1999/01/24 02:22:59 wessels Exp $
  3.  *
  4.  * DEBUG: section 29    Redirector
  5.  * AUTHOR: Duane Wessels
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. #include "squid.h"
  35. typedef struct {
  36.     void *data;
  37.     char *orig_url;
  38.     struct in_addr client_addr;
  39.     const char *client_ident;
  40.     const char *method_s;
  41.     RH *handler;
  42. } redirectStateData;
  43. static HLPCB redirectHandleReply;
  44. static void redirectStateFree(redirectStateData * r);
  45. static helper *redirectors = NULL;
  46. static OBJH redirectStats;
  47. static void
  48. redirectHandleReply(void *data, char *reply)
  49. {
  50.     redirectStateData *r = data;
  51.     int valid;
  52.     char *t;
  53.     debug(29, 5) ("redirectHandleRead: {%s}n", reply ? reply : "<NULL>");
  54.     if (reply) {
  55. if ((t = strchr(reply, ' ')))
  56.     *t = '';
  57. if (*reply == '')
  58.     reply = NULL;
  59.     }
  60.     valid = cbdataValid(r->data);
  61.     cbdataUnlock(r->data);
  62.     if (valid)
  63. r->handler(r->data, reply);
  64.     redirectStateFree(r);
  65. }
  66. static void
  67. redirectStateFree(redirectStateData * r)
  68. {
  69.     safe_free(r->orig_url);
  70.     cbdataFree(r);
  71. }
  72. static void
  73. redirectStats(StoreEntry * sentry)
  74. {
  75.     storeAppendPrintf(sentry, "Redirector Statistics:n");
  76.     helperStats(sentry, redirectors);
  77. }
  78. /**** PUBLIC FUNCTIONS ****/
  79. void
  80. redirectStart(clientHttpRequest * http, RH * handler, void *data)
  81. {
  82.     ConnStateData *conn = http->conn;
  83.     redirectStateData *r = NULL;
  84.     const char *fqdn;
  85.     char buf[8192];
  86.     assert(http);
  87.     assert(handler);
  88.     debug(29, 5) ("redirectStart: '%s'n", http->uri);
  89.     if (Config.Program.redirect == NULL) {
  90. handler(data, NULL);
  91. return;
  92.     }
  93.     r = xcalloc(1, sizeof(redirectStateData));
  94.     cbdataAdd(r, cbdataXfree, 0);
  95.     r->orig_url = xstrdup(http->uri);
  96.     r->client_addr = conn->log_addr;
  97.     if (conn->ident == NULL || *conn->ident == '') {
  98. r->client_ident = dash_str;
  99.     } else {
  100. r->client_ident = conn->ident;
  101.     }
  102.     r->method_s = RequestMethodStr[http->request->method];
  103.     r->handler = handler;
  104.     r->data = data;
  105.     cbdataLock(r->data);
  106.     if ((fqdn = fqdncache_gethostbyaddr(r->client_addr, 0)) == NULL)
  107. fqdn = dash_str;
  108.     snprintf(buf, 8192, "%s %s/%s %s %sn",
  109. r->orig_url,
  110. inet_ntoa(r->client_addr),
  111. fqdn,
  112. r->client_ident,
  113. r->method_s);
  114.     helperSubmit(redirectors, buf, redirectHandleReply, r);
  115. }
  116. void
  117. redirectInit(void)
  118. {
  119.     static int init = 0;
  120.     if (!Config.Program.redirect)
  121. return;
  122.     if (redirectors == NULL)
  123. redirectors = helperCreate("redirector");
  124.     wordlistAdd(&redirectors->cmdline, Config.Program.redirect);
  125.     redirectors->n_to_start = Config.redirectChildren;
  126.     redirectors->ipc_type = IPC_TCP_SOCKET;
  127.     helperOpenServers(redirectors);
  128.     if (!init) {
  129. cachemgrRegister("redirector",
  130.     "URL Redirector Stats",
  131.     redirectStats, 0, 1);
  132.     }
  133.     init++;
  134. }
  135. void
  136. redirectShutdown(void)
  137. {
  138.     if (!redirectors)
  139. return;
  140.     helperShutdown(redirectors);
  141.     wordlistDestroy(&redirectors->cmdline);
  142.     if (!shutting_down)
  143. return;
  144.     helperFree(redirectors);
  145.     redirectors = NULL;
  146. }