X-Git-Url: http://www.dolda2000.com/gitweb/?a=blobdiff_plain;f=src%2Fcallcgi.c;h=10bb87c9af47e6223dc35fd237a40fad51d2d98b;hb=f0a758cc8c1337606a392db67e63cec6601d2730;hp=9e7c21b4c7e76851991e31624312c3a84da65713;hpb=81cfca6c6ec15e3a8f94e278f2bdfcc1249eb122;p=ashd.git diff --git a/src/callcgi.c b/src/callcgi.c index 9e7c21b..10bb87c 100644 --- a/src/callcgi.c +++ b/src/callcgi.c @@ -66,7 +66,7 @@ static char *absolutify(char *file) static void forkchild(int inpath, char *prog, char *file, char *method, char *url, char *rest, int *infd, int *outfd) { int i; - char *qp, **env; + char *qp, **env, *name; int inp[2], outp[2]; pid_t pid; @@ -85,21 +85,28 @@ static void forkchild(int inpath, char *prog, char *file, char *method, char *ur close(i); if((qp = strchr(url, '?')) != NULL) *(qp++) = 0; - /* - * XXX: Currently missing: - * SERVER_NAME (Partially) - * SERVER_PORT - */ putenv(sprintf2("SERVER_SOFTWARE=ashd/%s", VERSION)); putenv("GATEWAY_INTERFACE=CGI/1.1"); if(getenv("HTTP_VERSION")) - putenv(sprintf2("SERVER_PROTOCOL=HTTP/%s", getenv("HTTP_VERSION"))); + putenv(sprintf2("SERVER_PROTOCOL=%s", getenv("HTTP_VERSION"))); putenv(sprintf2("REQUEST_METHOD=%s", method)); - putenv(sprintf2("PATH_INFO=%s", rest)); - putenv(sprintf2("SCRIPT_NAME=%s", url)); + putenv(sprintf2("PATH_INFO=/%s", rest)); + name = url; + /* XXX: This is an ugly hack (I think), but though I can think + * of several alternatives, none seem to be better. */ + if(*rest && (strlen(url) > strlen(rest)) && + !strcmp(rest, url + strlen(url) - strlen(rest)) && + (url[strlen(url) - strlen(rest) - 1] == '/')) { + name = sprintf2("%.*s", (int)(strlen(url) - strlen(rest) - 1), url); + } + putenv(sprintf2("SCRIPT_NAME=%s", name)); putenv(sprintf2("QUERY_STRING=%s", qp?qp:"")); if(getenv("REQ_HOST")) putenv(sprintf2("SERVER_NAME=%s", getenv("REQ_HOST"))); + if(getenv("REQ_X_ASH_SERVER_PORT")) + putenv(sprintf2("SERVER_PORT=%s", getenv("REQ_X_ASH_SERVER_PORT"))); + if(getenv("REQ_X_ASH_PROTOCOL") && !strcmp(getenv("REQ_X_ASH_PROTOCOL"), "https")) + putenv("HTTPS=on"); if(getenv("REQ_X_ASH_ADDRESS")) putenv(sprintf2("REMOTE_ADDR=%s", getenv("REQ_X_ASH_ADDRESS"))); if(getenv("REQ_CONTENT_TYPE"))