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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** http_proxy.c
  3. **
  4. ** Copyright (c) 1995 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. int pm_init(const char **argv)
  25. {
  26.     const char *name = argv[0];
  27.     
  28.     if (debug > 1)
  29. fprintf(stderr, "http_proxy: pm_init("%s")n", name);
  30.     return 0;
  31. }
  32. void pm_exit(void)
  33. {
  34.     if (debug > 1)
  35. fprintf(stderr, "http_proxy: pm_exit()n");
  36. }
  37. static int get_rq(char *in_url,
  38.   char **host,
  39.   char **port,
  40.   char **out_url)
  41. {
  42.     char *cp;
  43.     
  44.     if (strncmp(in_url, "http://", 7) != 0)
  45. return -1;
  46.     cp = in_url+7;
  47.     *host = cp;
  48.     while (*cp && !(*cp == '/' || *cp == ':'))
  49. ++cp;
  50.     if (*cp == 0)
  51. return 1;
  52.     if (*cp == ':')
  53.     {
  54. *cp++ = '';
  55. *port = cp;
  56. while (*cp && *cp != '/')
  57.     ++cp;
  58. if (*cp == 0)
  59.     return 2;
  60.     }
  61.     
  62.     *cp++ = '';
  63.     *out_url = cp;
  64.     return 3;
  65. }
  66. int pm_request(struct connectioninfo *cip)
  67. {
  68.     struct httpinfo *hip;
  69.     char *tmp, *host, *port, *url;
  70.     int sock_fd;
  71.     host = port = url = NULL;
  72.     
  73.     hip = cip->hip;
  74.      
  75.     if (debug > 1)
  76.     {
  77. fprintf(stderr, "http_proxy: pm_request()n");
  78. fprintf(stderr, "thip->method = %sn", hip->method);
  79. fprintf(stderr, "thip->url = %sn", hip->url);
  80.     }
  81.     {
  82.        int tmpsize = strlen(hip->url)+1;
  83.        tmp = (char *) alloca(tmpsize);
  84.        s_strcpy(tmp, tmpsize, hip->url);
  85.     }
  86.     
  87.     if (get_rq(tmp, &host, &port, &url) < 0)
  88. goto Fail;
  89.     if (debug > 2)
  90. fprintf(stderr, "get_rq(), host=%s, port=%s, url=%sn",
  91. host ? host : "<null>",
  92. port ? port : "<null>",
  93. url ? url : "<null>");
  94. /* XXX should probably check if this is ourself we are connecting to... */
  95.     
  96.     sock_fd = fd_sconnect(host, port ? port : "80");
  97.     if (sock_fd < 0)
  98.     {
  99. if (debug > 2)
  100.     fprintf(stderr, "fd_sconnect("%s") failedn", host);
  101. goto Fail;
  102.     }
  103.     if (hip->version)
  104.     {
  105. fd_printf(sock_fd, "%s /%s%s%s %sn",
  106.   hip->method, url,
  107.   hip->request ? "?" : "",
  108.   hip->request ? hip->request : "",
  109.   hip->version);
  110. if (hip->mip)
  111.     mime_writeheaders(sock_fd, hip->mip);
  112. fd_putc('n', sock_fd);
  113.     }
  114.     else
  115. fd_printf(sock_fd, "%s /%s%s%sn",
  116.   hip->method, url,
  117.   hip->request ? "?" : "",
  118.   hip->request ? hip->request : "");
  119.     if (debug > 4)
  120. fprintf(stderr, "http_proxy: relayingn");
  121.     fd_flush(sock_fd);
  122.     
  123.     fd_relay(sock_fd, cip->fd, 1);
  124.     if (debug > 4)
  125. fprintf(stderr, "http_proxy: closing downn");
  126.     
  127.     fd_close(sock_fd);
  128.     return 200;
  129.     
  130.   Fail:
  131.     return -1;
  132. }