freebsd-ports/www/pserv/files/patch-main.c
2008-09-03 12:33:08 +00:00

223 lines
8.9 KiB
C

--- sources/main.c.orig 2005-06-01 12:36:18.000000000 +0200
+++ sources/main.c 2008-09-03 13:13:27.000000000 +0200
@@ -27,6 +27,7 @@
char defaultFileName[MAX_PATH_LEN+1];
char logFileName[MAX_PATH_LEN+1];
char mimeTypesFileName[MAX_PATH_LEN+1];
+char phpFileName[MAX_PATH_LEN+1];
char cgiRoot[MAX_PATH_LEN+1]; /* root for CGI scripts exec */
struct timeval sockTimeVal;
mimeData *mimeArray; /* here we will hold all MIME data, inited once, never to be changed */
@@ -302,10 +303,13 @@
reqStruct->keepAlive = YES;
else if (!strncmp(reqArray[1], "Connection: keep-alive", strlen("Connection: keep-alive")))
reqStruct->keepAlive = YES;
- /* user-agent, content-length and else */
+ /* user-agent, content-length, content-type, cookie and else */
i = 1;
j = NO;
reqStruct->userAgent[0] = '\0';
+ reqStruct->contentLength = -1;
+ reqStruct->contentType[0] = '\0';
+ reqStruct->cookie[0] = '\0';
while (i < readLines)
{
if (!strncmp(reqArray[i], "User-Agent:", strlen("User-Agent:")))
@@ -320,6 +324,20 @@
#ifdef PRINTF_DEBUG
printf("content length %ld\n", reqStruct->contentLength);
#endif
+ }
+ else if (!strncmp(reqArray[i], "Content-Type:", strlen("Content-type:")) || !strncmp(reqArray[i], "Content-type:", strlen("Content-type:")))
+ {
+ strncpy(reqStruct->contentType, &reqArray[i][strlen("Content-type: ")], CONTENT_TYPE_LEN - 1);
+#ifdef PRINTF_DEBUG
+ printf("content type %s\n", reqStruct->contentType);
+#endif
+ }
+ else if (!strncmp(reqArray[i], "Cookie:", strlen("Cookie:")))
+ {
+ strncpy(reqStruct->cookie, &reqArray[i][strlen("Cookie: ")], MAX_COOKIE_LEN - 1);
+#ifdef PRINTF_DEBUG
+ printf("cookie %s\n", reqStruct->cookie);
+#endif
}
i++;
}
@@ -433,18 +451,39 @@
* we append the default file name */
strcat(completeFilePath, defaultFileName);
analyzeExtension(mimeType, completeFilePath);
- dumpFile(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ if (strncmp(mimeType, "application/x-httpd-php", 23))
+#endif
+ dumpFile(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ else
+ phpHandler(port, sock, phpFileName, completeFilePath, req, NULL);
+#endif
}
#else
/* we append the default file name */
strcat(completeFilePath, defaultFileName);
analyzeExtension(mimeType, completeFilePath);
- dumpFile(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ if (strncmp(mimeType, "application/x-httpd-php", 23))
+#endif
+ dumpFile(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ else
+ phpHandler(port, sock, phpFileName, completeFilePath, req, NULL);
+#endif
#endif
} else
{ /* it is a plain file */
analyzeExtension(mimeType, completeFilePath);
- dumpFile(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ if (strncmp(mimeType, "application/x-httpd-php", 23))
+#endif
+ dumpFile(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ else
+ phpHandler(port, sock, phpFileName, completeFilePath, req, NULL);
+#endif
}
}
} else if (req.method[0]=='H' && req.method[1]=='E' && req.method[2]=='A' && req.method[3]=='D' && req.method[4]=='\0')
@@ -461,6 +500,7 @@
{
strcpy(completeFilePath, homePath);
strcat(completeFilePath, req.documentAddress);
+
/* now we check if the given file is a directory or a plain file */
stat(completeFilePath, &fileStats);
if ((fileStats.st_mode & S_IFDIR) == S_IFDIR)
@@ -475,7 +515,14 @@
strcat(completeFilePath, defaultFileName);
}
analyzeExtension(mimeType, completeFilePath);
- dumpHeader(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ if (strncmp(mimeType, "application/x-httpd-php", 23))
+#endif
+ dumpFile(sock, completeFilePath, mimeType, req);
+#ifdef PHP
+ else
+ phpHandler(port, sock, phpFileName, completeFilePath, req, NULL);
+#endif
}
} else if (req.method[0]=='P' && req.method[1]=='O' && req.method[2]=='S' && req.method[3]=='T' && req.method[4]=='\0')
{
@@ -488,13 +535,6 @@
int ch;
DBGPRINTF(("Handling of POST method\n"));
- /* first we check if the path contains the directory selected for cgi's and in case handle it */
- if (strncmp(req.documentAddress, CGI_MATCH_STRING, strlen(CGI_MATCH_STRING)))
- {
- /* non cgi POST is not supported */
- sayError(sock, UNHANDLED_METHOD, "", req);
- return -1;
- }
#ifdef ENABLE_CGI
DBGPRINTF(("begin of post handling\n"));
buff[0] = '\0';
@@ -507,7 +547,7 @@
return -1;
} else if (req.contentLength >= POST_BUFFER_SIZE)
{
- sayError(sock, BUFFER_OVERFLOW, "", req);
+ sayError(sock, POST_BUFFER_OVERFLOW, "", req);
return -1;
}
while (!readFinished)
@@ -557,7 +597,38 @@
buff[totalRead] = '\0';
}
DBGPRINTF(("buff: |%s|\n", buff));
- cgiHandler(port, sock, req, buff);
+ if (!strncmp(req.documentAddress, CGI_MATCH_STRING, strlen(CGI_MATCH_STRING)))
+ {
+ cgiHandler(port, sock, req, buff);
+ } else
+ {
+#ifdef PHP
+ strcpy(completeFilePath, homePath);
+ strcat(completeFilePath, req.documentAddress);
+ /* now we check if the given file is a directory or a plain file */
+ stat(completeFilePath, &fileStats);
+ if ((fileStats.st_mode & S_IFDIR) == S_IFDIR)
+ {
+ /* if does not end with a slash, we get an error */
+ if(completeFilePath[strlen(completeFilePath)-1] != '/')
+ {
+ sayError(sock, NOT_FOUND, req.documentAddress, req);
+ return -1;
+ }
+ /* we append the default file name */
+ strcat(completeFilePath, defaultFileName);
+ }
+ analyzeExtension(mimeType, completeFilePath);
+ if (strncmp(mimeType, "application/x-httpd-php", 23))
+ {
+#endif
+ /* non cgi POST is not supported */
+ sayError(sock, UNHANDLED_METHOD, "", req);
+ return -1;
+#ifdef PHP
+ } else phpHandler(port, sock, phpFileName, completeFilePath, req, buff);
+#endif
+ }
}
#endif /* ENABLE_CGI */
#ifndef ENABLE_CGI
@@ -593,7 +664,7 @@
f = fopen(configFile, "r");
if (f == NULL)
{
- printf("Error opening config file. Setting defaults.\n");
+ printf("Config file not found. Setting defaults.\n");
*serverPort = DEFAULT_PORT;
*maxChildren = DEFAULT_MAX_CHILDREN;
strcpy(homePath, DEFAULT_DOCS_LOCATION);
@@ -602,7 +673,9 @@
sockTimeVal.tv_usec = DEFAULT_USEC_TO;
strcpy(logFileName, DEFAULT_LOG_FILE);
strcpy(mimeTypesFileName, DEFAULT_MIME_FILE);
+ strcpy(phpFileName, DEFAULT_PHP_FILE);
strcpy(cgiRoot, DEFAULT_CGI_ROOT);
+ initMimeTypes();
return -1;
}
if (!feof(f)) fscanf(f, "%s %s", str1, str2);
@@ -703,11 +776,25 @@
if (mimeTypesFileName == NULL)
{
strcpy(mimeTypesFileName, DEFAULT_MIME_FILE);
- printf("Error reading mimeTypesFileName from file, setting default, %s\n", mimeTypesFileName);
+ printf("Error reading mimeTypesFile from file, setting default, %s\n", mimeTypesFileName);
}
} else {
strcpy(mimeTypesFileName, DEFAULT_MIME_FILE);
- printf("Error reading mimeTypesFileName from file, setting default, %s\n", mimeTypesFileName);
+ printf("Error reading mimeTypesFile from file, setting default, %s\n", mimeTypesFileName);
+ }
+ if (!feof(f)) fscanf(f, "%s %s", str1, str2);
+ if (str1 != NULL && str2 != NULL && !strcmp(str1, "phpFile"))
+ {
+ sscanf(str2, "%s", phpFileName);
+ if (logFileName == NULL)
+ {
+ strcpy(phpFileName, DEFAULT_LOG_FILE);
+ printf("Error reading phpFile from file, setting default, %s\n", phpFileName);
+ }
+ } else
+ {
+ strcpy(phpFileName, DEFAULT_PHP_FILE);
+ printf("Error reading phpFile from file, setting default, %s\n", phpFileName);
}
if (!feof(f)) fscanf(f, "%s %s", str1, str2);
if (str1 != NULL && str2 != NULL && !strcmp(str1, "cgiRoot"))