You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by Alexei Kosut <ak...@hyperreal.com> on 1996/04/09 05:59:54 UTC

cvs commit: apache/src mod_actions.c

akosut      96/04/08 20:59:53

  Modified:    src       mod_actions.c
  Log:
  Add Script command, which allows you to define a script to handle
  requests for methods that Apache cannot (GET w/ args, POST, PUT and
  DELETE). Based on the CERN Search, POST-Script, PUT-Script and
  DELETE-Script directives.
  
  Revision  Changes    Path
  1.3       +60 -11    apache/src/mod_actions.c
  
  Index: mod_actions.c
  ===================================================================
  RCS file: /export/home/cvs/apache/src/mod_actions.c,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -C3 -r1.2 -r1.3
  *** mod_actions.c	1996/03/31 01:07:00	1.2
  --- mod_actions.c	1996/04/09 03:59:51	1.3
  ***************
  *** 78,83 ****
  --- 78,87 ----
    
    typedef struct {
        table *action_types;	/* Added with Action... */
  +     char *get;			/* Added with Script GET */
  +     char *post;			/* Added with Script POST */
  +     char *put;			/* Added with Script PUT */
  +     char *delete;		/* Added with Script DELETE */
    } action_dir_config;
    
    module action_module;
  ***************
  *** 88,93 ****
  --- 92,101 ----
          (action_dir_config *) palloc (p, sizeof(action_dir_config));
    
        new->action_types = make_table (p, 4);
  +     new->get = NULL;
  +     new->post = NULL;
  +     new->put = NULL;
  +     new->delete = NULL;
        
        return new;
    }
  ***************
  *** 102,107 ****
  --- 110,120 ----
        new->action_types = overlay_tables (p, add->action_types,
    					  base->action_types);
    
  +     new->get = add->get ? add->get : base->get;
  +     new->post = add->post ? add->post : base->post;
  +     new->put = add->put ? add->put : base->put;
  +     new->delete = add->delete ? add->delete : base->delete;
  + 
        return new;
    }
    
  ***************
  *** 111,119 ****
  --- 124,151 ----
        return NULL;
    }
    
  + char *set_script (cmd_parms *cmd, action_dir_config *m, char *method,
  + 		  char *script)
  + {
  +     if (!strcmp(method, "GET"))
  +         m->get = pstrdup(cmd->pool, script);
  +     else if (!strcmp(method, "POST"))
  +         m->post = pstrdup(cmd->pool, script);
  +     else if (!strcmp(method, "PUT"))
  +         m->put = pstrdup(cmd->pool, script);
  +     else if (!strcmp(method, "DELETE"))
  +         m->delete = pstrdup(cmd->pool, script);
  +     else
  +         return "Unknown method type for Script";
  + 
  +     return NULL;
  + }
  + 
    command_rec action_cmds[] = {
    { "Action", add_action, NULL, OR_FILEINFO, TAKE2, 
        "a media type followed by a script name" },
  + { "Script", set_script, NULL, ACCESS_CONF|RSRC_CONF, TAKE2,
  +     "a method followed by a script name" },
    { NULL }
    };
    
  ***************
  *** 121,140 ****
    {
        action_dir_config *conf =
          (action_dir_config *)get_module_config(r->per_dir_config,&action_module);
  !     char *action = r->handler ? r->handler : r->content_type;
  !     char *t;
    
  !     if (!action ||
  ! 	!(t = table_get(conf->action_types, action)))
  !       return DECLINED;
  ! 
  !     if (r->finfo.st_mode == 0) {
  !       log_reason("File does not exist", r->filename, r);
  !       return NOT_FOUND;
        }
    
  !     internal_redirect_handler(pstrcat(r->pool, t, escape_uri(r->pool, r->uri),
  ! 				      r->args ? "?" : NULL, r->args, NULL), r);
        return OK;
    }
    
  --- 153,189 ----
    {
        action_dir_config *conf =
          (action_dir_config *)get_module_config(r->per_dir_config,&action_module);
  !     char *t, *action = r->handler ? r->handler : r->content_type;
  !     char *script = NULL;
    
  !     /* First, check for the method-handling scripts */
  !     if ((r->method_number == M_GET) && r->args && conf->get)
  !         script = conf->get;
  !     else if ((r->method_number == M_POST) && conf->post)
  !         script = conf->post;
  !     else if ((r->method_number == M_PUT) && conf->put)
  !         script = conf->put;
  !     else if ((r->method_number == M_DELETE) && conf->delete)
  !         script = conf->delete;
  ! 
  !     /* Check for looping, which can happen if the CGI script isn't */
  !     if (script && r->prev && r->prev->prev)
  !         return DECLINED;
  ! 
  !     /* Second, check for actions (which override the method scripts) */
  !     if (action && (t = table_get(conf->action_types, action))) {
  !         script = t;
  ! 	if (r->finfo.st_mode == 0) {
  ! 	    log_reason("File does not exist", r->filename, r);
  ! 	    return NOT_FOUND;
  ! 	}
        }
  +   
  +     if (script == NULL)
  +         return DECLINED;
    
  !     internal_redirect_handler(pstrcat(r->pool, script, escape_uri(r->pool,
  ! 			r->uri), r->args ? "?" : NULL, r->args, NULL), r);
        return OK;
    }