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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** asis.c
  3. **
  4. ** Copyright (c) 1995 Marcus E. Hennecke <marcush@leland.stanford.edu>
  5. ** Copyright (c) 1994-1995 Peter Eriksson <pen@signum.se>
  6. **
  7. ** This program is free software; you can redistribute it and/or modify
  8. ** it under the terms of the GNU General Public License as published by
  9. ** the Free Software Foundation; either version 2 of the License, or
  10. ** (at your option) any later version.
  11. **
  12. ** This program is distributed in the hope that it will be useful,
  13. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15. ** GNU General Public License for more details.
  16. ** You should have received a copy of the GNU General Public License
  17. ** along with this program; if not, write to the Free Software
  18. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19. */
  20. #include <stdio.h>
  21. #include <time.h>
  22. #include <string.h>
  23. #include <fcntl.h>
  24. #include <unistd.h>
  25. #include <errno.h>
  26. #include <sys/types.h>
  27. #include <sys/stat.h>
  28. #include <sys/mman.h>
  29. #include "phttpd.h"
  30. int pm_init(const char **argv)
  31. {
  32.     if (debug > 1)
  33. fprintf(stderr, "*** asis/pm_init("%s") called ***n", argv[0]);
  34.     return 0;
  35. }
  36. void pm_exit(void)
  37. {
  38.     if (debug > 1)
  39. fprintf(stderr, "*** asis/pm_exit() called ***n");
  40. }
  41. static int http_get_head(struct connectioninfo *cip)
  42. {
  43.     int result;
  44.     int fd = cip->fd;
  45.     struct httpinfo *hip = cip->hip;
  46.     fscentry_t *fep;
  47.     fsinfo_t *fip;
  48.     unsigned int fsc_flags = 0;
  49.     char *data, *p, buf[256];
  50.     time_t t;
  51.     
  52.     
  53.     if (debug > 1)
  54. fprintf(stderr, "*** asis/pm_get() called ***n");
  55.     result = 200;
  56.     
  57.     if (hip && hip->mip && (hip->mip->pragma_flags & MPF_NOCACHE))
  58. fsc_flags = FSCF_RELOAD;
  59.     
  60.     fep = fscache_lookup(hip->url, FSCF_GETDATA+fsc_flags);
  61.     if (fep == NULL)
  62. return -1;
  63.     fip = fep->fip;
  64.     if (fip == NULL)
  65.     {
  66. fscache_release(fep);
  67. return -1;
  68.     }
  69.     
  70.     data = fip->data.file.content;
  71.     if (fip->sb.st_size >= 7 && !memcmp("HTTP/1.", data, 7))
  72.     {
  73.         result = atoi(strchr(data+7, ' '));
  74. if((p = strchr(data+7, 'n')) != NULL)
  75. {
  76.     if(*(p-1) != 'r')
  77.     {
  78.         fd_write(fd, data, p-data);
  79. fd_putc('n', fd);
  80.     }
  81.     else
  82.         fd_write(fd, data, p-data+1);
  83.     time(&t);
  84.     fd_puts("Date: ", fd);
  85.     fd_puts(http_time_r(&t, buf, sizeof(buf)), fd);
  86.     fd_puts("Server: phttpd/", fd);
  87.     fd_puts(server_version, fd);
  88.     fd_putc('n', fd);
  89.     for(data = p+1; (p = strchr(data, 'n')) != NULL; data = p+1)
  90.     {
  91.         if(*data == 'n' || (*data == 'r' && *(data+1) == 'n'))
  92.         {
  93.     fd_putc('n', fd);
  94.     if(!strcasecmp(hip->method, "HEAD"))
  95.         return result;
  96.     data = p+1;
  97.     break;
  98.         }
  99.         if(*(p-1) != 'r')
  100.         {
  101.     fd_write(fd, data, p-data);
  102.     fd_putc('n', fd);
  103.         }
  104.         else
  105.     fd_write(fd, data, p-data+1);
  106.     }
  107. }
  108.     }
  109.     hip->length = fip->sb.st_size - (data - (char *)fip->data.file.content);
  110.     if (fd_write(fd, data, hip->length) < 0)
  111. if (debug)
  112. {
  113.     fprintf(stderr, "ERROR on #%d: ", cip->request_no);
  114.     perror("write");
  115. }
  116.     
  117.     fscache_release(fep);
  118.     if (debug > 2)
  119. fprintf(stderr, "*** asis/pm_get: Returningn");
  120.     
  121.     return result;
  122. }
  123. int pm_request(struct connectioninfo *cip)
  124. {
  125.     struct httpinfo *hip = cip->hip;
  126.     
  127.     if (strcasecmp(hip->method, "GET") == 0 ||
  128. strcasecmp(hip->method, "HEAD") == 0)
  129. return http_get_head(cip);
  130.     else
  131. return -2;
  132. }