Re: [Boa-devel] CGI-Bin DirectoryIndex (was: cgi-bin buffer flushing issue)
Brought to you by:
jnelson
From: Elizabeth B. <li...@so...> - 2002-12-09 21:51:12
|
Here is a patch that will run a cgi-script if it is defined as the DirectoryIndex and its' mime-type is CGI_MIME_TYPE. Note that it: * Modifies "struct request" with one pointer that is NULL'd out early on. * If the mime-type is set in the "struct request", then it is used when sending the header, else it is determine by looking at the req->request_uri as before. * The NPH or CGI check has been moved to a function, determine_cgi_type Its not very fancy, however. Any thoughts on this? Elizabeth diff -up3r boa-0.94.14rc7/src/alias.c boa-0.94.14rc7.modified/src/alias.c --- boa-0.94.14rc7/src/alias.c Sun Nov 17 20:26:33 2002 +++ boa-0.94.14rc7.modified/src/alias.c Mon Dec 9 15:34:08 2002 @@ -416,10 +416,7 @@ int translate_uri(request * req) send_r_error(req); return 0; } - if (req->http_version == HTTP09) - req->cgi_type = NPH; - else - req->cgi_type = CGI; + req->cgi_type = determine_cgi_type(req, NULL); return 1; } else if (req->method == M_POST) { /* POST to non-script */ /* it's not a cgi, but we try to POST??? */ @@ -508,12 +505,7 @@ int init_script_alias(request * req, ali "%s:%d - pathname in init_script_alias is: \"%s\" (\"%s\")\n", __FILE__, __LINE__, pathname, pathname + current1->real_len); #endif - if (strncmp("nph-", pathname + current1->real_len, 4) == 0 - || (req->http_version == HTTP09)) - req->cgi_type = NPH; - else - req->cgi_type = CGI; - + req->cgi_type = determine_cgi_type(req, pathname + current1->real_len); /* start at the beginning of the actual uri... (in /cgi-bin/bob, start at the 'b' in bob */ @@ -723,4 +715,20 @@ void dump_alias(void) alias_hashtable[i] = NULL; } } +} + +/* + * determine_cgi_type + * + * Given a request and a script name (which may be NULL), returns the + * approprait cgi_type. + */ + +enum CGI_TYPE +determine_cgi_type(const request * req, const char * script_name) +{ + if((script_name && strncmp("nph-", script_name, 4) == 0) || req->http_version == HTTP09) + return NPH; + else + return CGI; } diff -up3r boa-0.94.14rc7/src/boa.h boa-0.94.14rc7.modified/src/boa.h --- boa-0.94.14rc7/src/boa.h Sun Nov 17 21:04:08 2002 +++ boa-0.94.14rc7.modified/src/boa.h Mon Dec 9 15:27:20 2002 @@ -54,6 +54,7 @@ void add_alias(char *fakename, char *realname, int script); int translate_uri(request * req); void dump_alias(void); +enum CGI_TYPE determine_cgi_type(const request * req, const char * script_name); /* config */ void read_config_files(void); diff -up3r boa-0.94.14rc7/src/get.c boa-0.94.14rc7.modified/src/get.c --- boa-0.94.14rc7/src/get.c Sun Nov 24 17:53:01 2002 +++ boa-0.94.14rc7.modified/src/get.c Mon Dec 9 15:29:21 2002 @@ -420,9 +420,15 @@ int get_dir(request * req, struct stat * data_fd = open(pathname_with_index, O_RDONLY); if (data_fd != -1) { /* user's index file */ - strcpy(req->request_uri, directory_index); /* for mimetype */ - fstat(data_fd, statbuf); - return data_fd; + req->mime_type = get_mime_type(directory_index); + if(strcmp(CGI_MIME_TYPE, req->mime_type) == 0) { + strcpy(req->pathname, pathname_with_index); + req->cgi_type = determine_cgi_type(req, directory_index); + return init_cgi(req); + } else { + fstat(data_fd, statbuf); + return data_fd; + } } if (errno == EACCES) { send_r_forbidden(req); diff -up3r boa-0.94.14rc7/src/globals.h boa-0.94.14rc7.modified/src/globals.h --- boa-0.94.14rc7/src/globals.h Sat Nov 23 09:03:29 2002 +++ boa-0.94.14rc7.modified/src/globals.h Mon Dec 9 15:06:36 2002 @@ -168,6 +168,8 @@ struct request { /* pendi struct mmap_entry *mmap_entry_var; + char * mime_type; + int fd; /* client's socket fd */ time_t time_last; /* time of last succ. op. */ char local_ip_addr[NI_MAXHOST]; /* for virtualhost */ diff -up3r boa-0.94.14rc7/src/response.c boa-0.94.14rc7.modified/src/response.c --- boa-0.94.14rc7/src/response.c Sun Nov 24 17:53:33 2002 +++ boa-0.94.14rc7.modified/src/response.c Mon Dec 9 15:07:22 2002 @@ -49,7 +49,7 @@ char *http_ver_string(enum HTTP_VERSION void print_content_type(request * req) { req_write(req, "Content-Type: "); - req_write(req, get_mime_type(req->request_uri)); + req_write(req, req->mime_type ? req->mime_type : get_mime_type(req->request_uri)); req_write(req, "\r\n"); } |