Added ability to send redirects to send-banner CGI, so that it can completely mimic...
authoroes <oes@users.sourceforge.net>
Thu, 4 Jul 2002 14:35:05 +0000 (14:35 +0000)
committeroes <oes@users.sourceforge.net>
Thu, 4 Jul 2002 14:35:05 +0000 (14:35 +0000)
src/cgisimple.c

index cebe576..c1b50a8 100644 (file)
@@ -1,7 +1,7 @@
-const char cgisimple_rcs[] = "$Id: cgisimple.c,v 1.35 2002/05/12 21:44:44 jongfoster Exp $";
+const char cgisimple_rcs[] = "$Id: cgisimple.c,v 2.0 2002/06/04 14:34:21 jongfoster Exp $";
 /*********************************************************************
  *
- * File        :  $Source: /cvsroot/ijbswa/current/cgisimple.c,v $
+ * File        :  $Source: /cvsroot/ijbswa/current/src/cgisimple.c,v $
  *
  * Purpose     :  Simple CGIs to get information about Privoxy's
  *                status.
@@ -36,6 +36,9 @@ const char cgisimple_rcs[] = "$Id: cgisimple.c,v 1.35 2002/05/12 21:44:44 jongfo
  *
  * Revisions   :
  *    $Log: cgisimple.c,v $
+ *    Revision 2.0  2002/06/04 14:34:21  jongfoster
+ *    Moving source files to src/
+ *
  *    Revision 1.35  2002/05/12 21:44:44  jongfoster
  *    Adding amiga.[ch] revision information, if on an amiga.
  *
@@ -420,7 +423,8 @@ jb_err cgi_show_request(struct client_state *csp,
  *           type : Selects the type of banner between "trans", "logo",
  *                  and "auto". Defaults to "logo" if absent or invalid.
  *                  "auto" means to select as if we were image-blocking.
- *                  (Only the first character really counts).
+ *                  (Only the first character really counts; b and t are
+ *                  equivalent).
  *
  * Returns     :  JB_ERR_OK on success
  *                JB_ERR_MEMORY on out-of-memory error.  
@@ -432,20 +436,24 @@ jb_err cgi_send_banner(struct client_state *csp,
 {
    char imagetype = lookup(parameters, "type")[0];
 
-   if (imagetype == 'a') /* auto */
+   /*
+    * If type is auto, then determine the right thing
+    * to do from the set-image-blocker action
+    */
+   if (imagetype == 'a') 
    {
-      /* Default to pattern */
+      /*
+       * Default to pattern
+       */
       imagetype = 'p';
+
 #ifdef FEATURE_IMAGE_BLOCKING
       if ((csp->action->flags & ACTION_IMAGE_BLOCKER) != 0)
       {
          static const char prefix1[] = CGI_PREFIX "send-banner?type=";
          static const char prefix2[] = "http://" CGI_SITE_1_HOST "/send-banner?type=";
+         const char *p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER];
 
-         /* determine HOW images should be blocked */
-         const char * p = csp->action->string[ACTION_STRING_IMAGE_BLOCKER];
-
-         /* and handle accordingly: */
          if (p == NULL)
          {
             /* Use default - nothing to do here. */
@@ -458,6 +466,11 @@ jb_err cgi_send_banner(struct client_state *csp,
          {
             imagetype = 'p';
          }
+
+         /*
+          * If the action is to call this CGI, determine
+          * the argument:
+          */
          else if (0 == strncmpic(p, prefix1, sizeof(prefix1) - 1))
          {
             imagetype = p[sizeof(prefix1) - 1];
@@ -466,34 +479,63 @@ jb_err cgi_send_banner(struct client_state *csp,
          {
             imagetype = p[sizeof(prefix2) - 1];
          }
+
+         /*
+          * Everything else must (should) be a URL to
+          * redirect to.
+          */
+         else
+         {
+            imagetype = 'r';
+         }
       }
 #endif /* def FEATURE_IMAGE_BLOCKING */
    }
       
-   if ((imagetype == 'b') || (imagetype == 't')) /* blank / transparent */
+   /*
+    * Now imagetype is either the non-auto type we were called with,
+    * or it was auto and has since been determined. In any case, we
+    * can proceed to actually answering the request by sending a redirect
+    * or an image as appropriate:
+    */
+   if (imagetype == 'r') 
    {
-      rsp->body = bindup(image_blank_data, image_blank_length);
-      rsp->content_length = image_blank_length;
-
+      rsp->status = strdup("302 Local Redirect from Privoxy");
+      if (rsp->status == NULL)
+      {
+         return JB_ERR_MEMORY;
+      }
+      if (enlist_unique_header(rsp->headers, "Location",
+                               csp->action->string[ACTION_STRING_IMAGE_BLOCKER]))
+      {
+         return JB_ERR_MEMORY;
+      }
    }
-   else /* pattern */
+   else
    {
-      rsp->body = bindup(image_pattern_data, image_pattern_length);
-      rsp->content_length = image_pattern_length;
-   }   
+      if ((imagetype == 'b') || (imagetype == 't')) 
+      {
+         rsp->body = bindup(image_blank_data, image_blank_length);
+         rsp->content_length = image_blank_length;
+      }
+      else
+      {
+         rsp->body = bindup(image_pattern_data, image_pattern_length);
+         rsp->content_length = image_pattern_length;
+      }
 
-   if (rsp->body == NULL)
-   {
-      return JB_ERR_MEMORY;
-   }
+      if (rsp->body == NULL)
+      {
+         return JB_ERR_MEMORY;
+      }
+      if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE))
+      {
+         return JB_ERR_MEMORY;
+      }
 
-   if (enlist(rsp->headers, "Content-Type: " BUILTIN_IMAGE_MIMETYPE))
-   {
-      return JB_ERR_MEMORY;
+      rsp->is_static = 1;
    }
 
-   rsp->is_static = 1;
-
    return JB_ERR_OK;
 
 }