Move the forwarded-connect-retries handling into a shiny new connect_to()
[privoxy.git] / cgi.c
diff --git a/cgi.c b/cgi.c
index 31d3169..a51eced 100644 (file)
--- a/cgi.c
+++ b/cgi.c
@@ -1,4 +1,4 @@
-const char cgi_rcs[] = "$Id: cgi.c,v 1.120 2009/06/11 11:44:25 fabiankeil Exp $";
+const char cgi_rcs[] = "$Id: cgi.c,v 1.128 2010/04/21 20:48:06 fabiankeil Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/cgi.c,v $
@@ -553,7 +553,7 @@ static struct http_response *dispatch_known_cgi(struct client_state * csp,
          if (!err)
          {
             /* It worked */
-            rsp->reason = RSP_REASON_CGI_CALL;
+            rsp->crunch_reason = CGI_CALL;
             return finish_http_response(csp, rsp);
          }
          else
@@ -876,13 +876,7 @@ struct http_response *error_response(struct client_state *csp,
    if (!strcmp(templatename, "no-such-domain"))
    {
       rsp->status = strdup("404 No such domain");
-      if (rsp->status == NULL)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-      rsp->reason = RSP_REASON_NO_SUCH_DOMAIN;
+      rsp->crunch_reason = NO_SUCH_DOMAIN;
    }
    else if (!strcmp(templatename, "forwarding-failed"))
    {
@@ -936,38 +930,37 @@ struct http_response *error_response(struct client_state *csp,
 
       if (!err) err = map(exports, "forwarding-type", 1, socks_type, 1);
       if (!err) err = map(exports, "error-message", 1, html_encode(csp->error_message), 0);
-
-      if (!err) rsp->status = strdup("503 Forwarding failure");
-      if ((rsp->status == NULL) || (NULL == csp->error_message) || err)
+      if ((NULL == csp->error_message) || err)
       {
          free_map(exports);
          free_http_response(rsp);
          return cgi_error_memory();
       }
-      rsp->reason = RSP_REASON_FORWARDING_FAILED;
+
+      rsp->status = strdup("503 Forwarding failure");
+      rsp->crunch_reason = FORWARDING_FAILED;
    }
    else if (!strcmp(templatename, "connect-failed"))
    {
       rsp->status = strdup("503 Connect failed");
-      if (rsp->status == NULL)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-      rsp->reason = RSP_REASON_CONNECT_FAILED;
+      rsp->crunch_reason = CONNECT_FAILED;
    }
    else if (!strcmp(templatename, "connection-timeout"))
    {
       rsp->status = strdup("504 Connection timeout");
-      /* XXX: This check should be factored out of this block */
-      if (rsp->status == NULL)
-      {
-         free_map(exports);
-         free_http_response(rsp);
-         return cgi_error_memory();
-      }
-      rsp->reason = RSP_REASON_CONNECTION_TIMEOUT;
+      rsp->crunch_reason = CONNECTION_TIMEOUT;
+   }
+   else if (!strcmp(templatename, "no-server-data"))
+   {
+      rsp->status = strdup("502 No data received from server or forwarder");
+      rsp->crunch_reason = NO_SERVER_DATA;
+   }
+
+   if (rsp->status == NULL)
+   {
+      free_map(exports);
+      free_http_response(rsp);
+      return cgi_error_memory();
    }
 
    err = template_fill_for_cgi(csp, templatename, exports, rsp);
@@ -1060,7 +1053,7 @@ void cgi_init_error_messages(void)
       strlen(cgi_error_memory_response->head);
    cgi_error_memory_response->content_length =
       strlen(cgi_error_memory_response->body);
-   cgi_error_memory_response->reason = RSP_REASON_OUT_OF_MEMORY;
+   cgi_error_memory_response->crunch_reason = OUT_OF_MEMORY;
 }
 
 
@@ -1231,7 +1224,7 @@ jb_err cgi_error_unknown(const struct client_state *csp,
    rsp->content_length = 0;
    rsp->head_length = 0;
    rsp->is_static = 0;
-   rsp->reason = RSP_REASON_INTERNAL_ERROR;
+   rsp->crunch_reason = INTERNAL_ERROR;
 
    snprintf(errnumbuf, sizeof(errnumbuf), "%d", error_to_report);
 
@@ -1369,7 +1362,7 @@ char *add_help_link(const char *item,
    string_join  (&result, string_toupper(item));
    string_append(&result, "\">");
    string_append(&result, item);
-   string_append(&result, "</a> ");
+   string_append(&result, "</a>");
 
    return result;
 }
@@ -1629,7 +1622,9 @@ struct http_response *finish_http_response(const struct client_state *csp, struc
       if (!err) err = enlist_unique_header(rsp->headers, "Date", buf);
       if (!strncmpic(rsp->status, "403", 3)
        || !strncmpic(rsp->status, "404", 3)
-       || !strncmpic(rsp->status, "503", 3))
+       || !strncmpic(rsp->status, "502", 3)
+       || !strncmpic(rsp->status, "503", 3)
+       || !strncmpic(rsp->status, "504", 3))
       {
          if (!err) err = enlist_unique_header(rsp->headers, "Last-Modified", "Wed, 08 Jun 1955 12:00:00 GMT");
       }
@@ -1641,13 +1636,10 @@ struct http_response *finish_http_response(const struct client_state *csp, struc
       if (!err) err = enlist_unique_header(rsp->headers, "Pragma", "no-cache");
    }
 
-   /*
-    * Quoting RFC 2616:
-    *
-    * HTTP/1.1 applications that do not support persistent connections MUST
-    * include the "close" connection option in every message.
-    */
-   if (!err) err = enlist_unique_header(rsp->headers, "Connection", "close");
+   if (!err && !(csp->flags & CSP_FLAG_CLIENT_CONNECTION_KEEP_ALIVE))
+   {
+      err = enlist_unique_header(rsp->headers, "Connection", "close");
+   }
 
    /* 
     * Write the head