next_proxy.c
上传用户:ladybrid91
上传日期:2007-01-04
资源大小:287k
文件大小:3k
源码类别:

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** next_proxy.c
  3. **
  4. ** Copyright (c) 1995-1997 Peter Eriksson <pen@signum.se>
  5. **
  6. ** This program is free software; you can redistribute it and/or modify
  7. ** it under the terms of the GNU General Public License as published by
  8. ** the Free Software Foundation; either version 2 of the License, or
  9. ** (at your option) any later version.
  10. **
  11. ** This program is distributed in the hope that it will be useful,
  12. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ** GNU General Public License for more details.
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program; if not, write to the Free Software
  17. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19. #include <stdio.h>
  20. #include <stdlib.h>
  21. #include <string.h>
  22. #include <alloca.h>
  23. #include "phttpd.h"
  24. static char *proxy_address = NULL;
  25. static char *proxy_port = NULL;
  26. static struct options next_cfg_table[] =
  27. {
  28.     { "proxy-address", T_STRING, &proxy_address, NULL },
  29.     { "proxy-port",    T_STRING, &proxy_port, NULL },
  30.     { NULL, -1, NULL, NULL }
  31. };
  32. int pm_init(const char **argv)
  33. {
  34.     const char *name = argv[0];
  35.     char *cfg_path, *cp;
  36.     int cfg_size;
  37.     
  38.     if (debug > 1)
  39. fprintf(stderr, "next_proxy: pm_init("%s")n", name);
  40.     cfg_path = s_strxdup(name, 6, &cfg_size);
  41.     
  42.     cp = strrchr(cfg_path, '.');
  43.     if (cp && strcmp(cp, ".so") == 0)
  44. *cp = '';
  45.     
  46.     s_strcat(cfg_path, cfg_size, ".conf");
  47.     if (config_parse_file(cfg_path, next_cfg_table, 0) < 0)
  48. return -1;
  49.     
  50.     if (config_parse_argv(argv+1, next_cfg_table) < 0)
  51. return -1;
  52.     
  53.     return 0;
  54. }
  55. void pm_exit(void)
  56. {
  57.     if (debug > 1)
  58. fprintf(stderr, "next_proxy: pm_exit()n");
  59.     if (proxy_address)
  60. s_free(proxy_address);
  61.     
  62.     if (proxy_port)
  63. s_free(proxy_port);
  64. }
  65. int pm_request(struct connectioninfo *cip)
  66. {
  67.     struct httpinfo *hip;
  68.     int sock_fd;
  69.     hip = cip->hip;
  70.      
  71.     if (debug > 1)
  72.     {
  73. fprintf(stderr, "next_proxy: pm_request()n");
  74. fprintf(stderr, "thip->method = %sn", hip->method);
  75. fprintf(stderr, "thip->url = %sn", hip->url);
  76.     }
  77.     sock_fd = fd_sconnect(proxy_address, proxy_port ? proxy_port : "80");
  78.     if (sock_fd < 0)
  79.     {
  80. if (debug > 2)
  81.     fprintf(stderr, "fd_sconnect("%s") failedn", proxy_port);
  82. goto Fail;
  83.     }
  84.     if (hip->version)
  85.     {
  86. fd_printf(sock_fd, "%s %s%s%s %sn",
  87.   hip->method, hip->orig_url,
  88.   hip->request ? "?" : "",
  89.   hip->request ? hip->request : "",
  90.   hip->version);
  91. if (hip->mip)
  92.     mime_writeheaders(sock_fd, hip->mip);
  93. fd_putc('n', sock_fd);
  94.     }
  95.     else
  96. fd_printf(sock_fd, "%s %s%%sn",
  97.   hip->method, hip->orig_url,
  98.   hip->request ? "?" : "",
  99.   hip->request ? hip->request : "");
  100.     
  101.     if (debug > 4)
  102. fprintf(stderr, "next_proxy: relayingn");
  103.     fd_flush(sock_fd);
  104.     
  105.     fd_relay(sock_fd, cip->fd, 1);
  106.     if (debug > 4)
  107. fprintf(stderr, "next_proxy: closing downn");
  108.     
  109.     fd_close(sock_fd);
  110.     return 200;
  111.     
  112.   Fail:
  113.     return -1;
  114. }