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

Web服务器

开发平台:

Unix_Linux

  1. /*
  2. ** error.c
  3. **
  4. ** Copyright (c) 1994-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. /* The code may look a little ......, but that comes from the handling depending on
  20. ** the mode combination, one is running. 23.11.97, rk@netuse.de
  21. */
  22. #include <stdio.h>
  23. #include <stdlib.h>
  24. #include <errno.h>
  25. #include <string.h>
  26. #include <syslog.h>
  27. #include "phttpd.h"
  28. hashtable_t *error_page_table = NULL;
  29. /* Returns -1 in case of error, else 0 */
  30. static int make_full_url(struct connectioninfo *cip, char *buf, int len)
  31. {
  32.     int i = 0;
  33.     int x_offset = 0;
  34.     char *hnl,*surl;
  35.     if (cip->hip->orig_url[0] == '/')
  36.     {
  37. /* Depending on the combination of rkmultimode and softvirtserver, we */
  38. /* way to create the URL in the error is different */
  39.       if ( softvirtserver==0)
  40. { if ( rkmultimode==0 && cip->sip && cip->sip->url )   
  41. /* Standart (0/0): Just copy.... */
  42.     i = s_strcpy(buf, len, cip->sip->url);
  43.           else
  44. /* rkmultimode set, NO softvirtserver: do a reverse lookup on the incoming socket */
  45.             {
  46.       hnl=dns_lookup_servername(cip->server);
  47.               if ( hnl==NULL ) hnl=server_host;
  48.               surl=make_server_url(hnl,cip->sip->port);
  49.               i = s_strcpy(buf, len, surl);
  50.               s_free(surl);
  51.             }
  52. }
  53.       else
  54. /* yes we have softvirtserver: Just copy  */
  55. {
  56.   surl=make_server_url(cip->hip->svsname,cip->sip->port);
  57.   i = s_strcpy(buf, len, surl);
  58.   if ( debug >6 ) fprintf(stderr,"error.c: make_server_url=%s (%d)n",surl,i);
  59.   s_free(surl);
  60. }
  61.       }
  62. /* rkmultimode add cip->hip->prelen
  63. ** The offsethandler is a little complex here . One could do that allways near the
  64. ** accpect in http.c, but the error-case is fewer. So for performance, we do it
  65. ** here 
  66. */
  67.       x_offset=cip->hip->prelen;
  68.      
  69.       if (url_quote(cip->hip->orig_url+x_offset, buf+i, len-i, "?", 0) == NULL)
  70.         return -1;
  71.     
  72.     i = strlen(buf);
  73.     if (cip->hip->orig_request)
  74.     {
  75. buf[i++] = '?';
  76. if (url_quote(cip->hip->orig_request, buf+i, len-i, """, 1) == NULL)
  77.     return -1;
  78. i = strlen(buf);
  79.     }
  80.     buf[i] = '';
  81.     if ( debug >6 ) fprintf(stderr,"error.c: exit: buf=%sn",buf);
  82.     return 0;
  83. }
  84. int error_bad_request(struct connectioninfo *cip,
  85.       const char *buf)
  86. {
  87.     hashentry_t *hep;
  88.     char buf1[2048];
  89.     int len, code;
  90.     
  91.     
  92.     hep = ht_lookup(error_page_table, "400", 0);
  93.     if (hep == NULL)
  94. hep = ht_lookup(error_page_table, "*", 1);
  95.     if (hep)
  96.     {
  97. len = s_strcpy(buf1, sizeof(buf1), "code=400&url=");
  98. if (make_full_url(cip, buf1+len, sizeof(buf1)-len) < 0)
  99.     return -1;
  100. len = s_strcat(buf1, sizeof(buf1), "request=");
  101. url_quote(buf, buf1+len, sizeof(buf1)-len, """, 1);
  102. code = http_redirect(cip, hep->data, buf1, NULL, 302);
  103. ht_release(hep);
  104. return code;
  105.     }
  106.     else
  107. return http_error(cip, 400,
  108.   "Bad HTTP request:<BR><PRE>%s</PRE>n", buf);
  109. }
  110. int error_not_found(struct connectioninfo *cip)
  111. {
  112.     char buf1[2048];
  113.     hashentry_t *hep;
  114.     int len, code;
  115.     
  116.     hep = ht_lookup(error_page_table, "404", 0);
  117.     if (hep == NULL)
  118. hep = ht_lookup(error_page_table, "*", 1);
  119.     if (hep)
  120.     {
  121. len = s_strcpy(buf1, sizeof(buf1), "code=404&url=");
  122. if (make_full_url(cip, buf1+len, sizeof(buf1)-len) < 0)
  123. {
  124.     syslog(LOG_ERR, "error_not_found: make_full_url() failed");
  125.     return -1;
  126. }
  127. code = http_redirect(cip, hep->data, buf1, NULL, 302);
  128. ht_release(hep);
  129. return code;
  130.     }
  131.     else
  132.     {
  133. if (make_full_url(cip, buf1, sizeof(buf1)) < 0)
  134. {
  135.     syslog(LOG_ERR, "error_not_found: make_full_url() failed");
  136.     return -1;
  137. }
  138. return http_error(cip, 404, 
  139.     "The requested URL, <A HREF="%s">%s</A>, was not found.",
  140.   buf1, buf1);
  141.     }
  142. }
  143. int error_method_denied(struct connectioninfo *cip)
  144. {
  145.     char buf1[2048];
  146.     hashentry_t *hep;
  147.     int len, code;
  148.     
  149.     hep = ht_lookup(error_page_table, "405", 0);
  150.     if (hep == NULL)
  151. hep = ht_lookup(error_page_table, "*", 1);
  152.     
  153.     if (hep)
  154.     {
  155. len = s_strcpy(buf1, sizeof(buf1), "code=405&url=");
  156. if (make_full_url(cip, buf1+len, sizeof(buf1)-len) < 0)
  157.     return -1;
  158. code = http_redirect(cip, hep->data, buf1, NULL, 302);
  159. ht_release(hep);
  160. return code;
  161.     }
  162.     else
  163.     {
  164. if (make_full_url(cip, buf1, sizeof(buf1)) < 0)
  165.     return -1;
  166.     
  167. return http_error(cip, 405, 
  168.   "Method Denied for URL <A HREF="%s">%s</A>",
  169.   buf1,buf1);
  170.     }
  171. }
  172. int error_access(struct connectioninfo *cip)
  173. {
  174.     char buf1[2048];
  175.     hashentry_t *hep;
  176.     int len, code;
  177.     
  178.     hep = ht_lookup(error_page_table, "403", 0);
  179.     
  180.     if (hep == NULL)
  181. hep = ht_lookup(error_page_table, "*", 1);
  182.     if (hep)
  183.     {
  184. len = s_strcpy(buf1, sizeof(buf1), "code=403&url=");
  185. if (make_full_url(cip, buf1+len, sizeof(buf1)-len) < 0)
  186.     return -1;
  187. code = http_redirect(cip, hep->data, buf1, NULL, 302);
  188. ht_release(hep);
  189. return code;
  190.     }
  191.     else
  192.     {
  193. if (make_full_url(cip, buf1, sizeof(buf1)) < 0)
  194.     return -1;
  195.     
  196. return http_error(cip, 403, 
  197.   "Access denied for URL <A HREF="%s">%s</A>",
  198.   buf1, buf1);
  199.     }
  200. }
  201. int error_system(struct connectioninfo *cip,
  202.  const char *prompt)
  203. {
  204.     return http_error(cip, 500, 
  205.        "A system error occured:<BR><PRE>%s: %s</PRE>",
  206.        prompt, strerror(errno));
  207. }