Long PHP page fix.
authorPekka Riikonen <priikone@silcnet.org>
Mon, 18 Sep 2006 18:00:01 +0000 (18:00 +0000)
committerPekka Riikonen <priikone@silcnet.org>
Mon, 18 Sep 2006 18:00:01 +0000 (18:00 +0000)
The test program is now almost full-fledged HTTPD able to serve
HTML and PHP pages.

lib/silchttp/silchttpphp.c
lib/silchttp/tests/test_silchttpserver.c

index f68cc8c3ee9fe4b0bcbf05dad93282ef62062477..02f95e2c89350b30e0faa51416e9872faa109bf9 100644 (file)
@@ -86,10 +86,12 @@ SilcBuffer silc_http_php_file(const char *filename)
     }
 
     if (len) {
-      ret = silc_buffer_alloc(0);
       if (!ret) {
-       pclose(fd);
-       return NULL;
+       ret = silc_buffer_alloc(0);
+       if (!ret) {
+         pclose(fd);
+         return NULL;
+       }
       }
 
       silc_buffer_format(ret,
index 9c00851a06c88a9e7ad1c4f94a7587f000f33ee9..76604b8810be61412d21262ed6877942286eff09 100644 (file)
@@ -1,90 +1,86 @@
 /* SilcHttpServer tests */
+/* Actually this is almost a full-fledged HTTP server.  It can serve HTML
+   and PHP pages pretty well.  In PHP the variables passed in URI with '?'
+   work in PHP script, with this HTTPD of ours, only if $_REQUEST variable
+   is used to fetch them (limitation in PHP command line version).  In other
+   ways '?' in URI is not supported. */
+/* Usage: ./test_silchttpserver [-d] [<htdocsdir>] */
 
 #include "silc.h"
 #include "../silchttpserver.h"
 #include "../silchttpphp.h"
 
-static void http_callback(SilcHttpServer httpd, SilcHttpConnection conn,
-                         const char *uri, const char *method,
-                         SilcBuffer data, void *context)
+char *htdocs = ".";
+
+/* Serve pages */
+
+static void http_callback_file(SilcHttpServer httpd, SilcHttpConnection conn,
+                              const char *uri, const char *method,
+                              SilcBuffer data, void *context)
 {
   SilcBufferStruct page;
-
-  SILC_LOG_DEBUG(("HTTP data received, URI:%s, method:%s", uri, method));
+  SilcBuffer php;
+  char *filedata, filename[256];
+  SilcUInt32 data_len;
+  const char *type;
+  SilcBool usephp = FALSE;
 
   if (!strcasecmp(method, "GET")) {
-    /* Send our default page */
-    if (!strcmp(uri, "/") || !strcmp(uri, "/index.html")) {
-      SilcBuffer php;
-      const char *php_data = NULL;
-
-      /* Execute PHP data */
-      php = silc_http_php("<small>"
-                         "UPDATED <?php echo getcwd(); echo date(\"Y/m/d\", filemtime(\"test_silchttpserver.c\")); ?>"
-                         "| VERSION 4.0 | A HANDMADE WEB-SITE | (C) 1995 - 2006 PEKKA RIIKONEN");
-      if (php)
-       php_data = silc_buffer_data(php);
-
-      memset(&page, 0, sizeof(page));
-      silc_buffer_strformat(&page,
-                           "<html><head></head><body>",
-                           silc_http_server_get_header(httpd, conn,
-                                                       "User-Agent"),
-                           "<p><img src=\"pr_1995.jpg\">",
-                           "<p>OUR DEFAULT PAGE IS THIS: ",
-                           silc_time_string(silc_time()),
-                           "<P><FORM action=\"/posttest\" method=\"post\"><P>"
-                           "<LABEL>First name: </LABEL>"
-                           "<INPUT type=\"text\" name=\"firstname\"><BR>"
-                           "<INPUT type=\"radio\" name=\"sex\" value=\"Male\"> Male<BR>"
-                           "<INPUT type=\"radio\" name=\"sex\" value=\"Female\"> Female<BR>"
-                           "<INPUT type=\"submit\" value=\"Send\"> <INPUT type=\"reset\">"
-                           "</P></FORM>",
-                           php_data,
-                           "</body></html>",
-                           SILC_STRFMT_END);
-      silc_http_server_add_header(httpd, conn, "X-Date",
-                                 silc_time_string(silc_time()));
-      silc_http_server_send(httpd, conn, &page);
-      silc_buffer_purge(&page);
-      silc_buffer_free(php);
-      return;
-    }
-
-    if (!strcmp(uri, "/pr_1995.jpg")) {
-      SilcUInt32 data_len;
-      unsigned char *data = silc_file_readfile("pr_1995.jpg", &data_len);
-      if (!data) {
-       silc_http_server_send_error(httpd, conn, "404 Not Found", NULL);
-        return;
+    if (strstr(uri, ".php"))
+      usephp = TRUE;
+
+    if (!strcmp(uri, "/"))
+      snprintf(filename, sizeof(filename), "%s/index.html", htdocs);
+    else
+      snprintf(filename, sizeof(filename), "%s%s", htdocs, uri);
+
+    if (strchr(filename, '?'))
+      *strchr(filename, '?') = ' ';
+    while (strchr(filename, '&'))
+      *strchr(filename, '&') = ' ';
+
+    SILC_LOG_DEBUG(("Filename: '%s'", filename));
+
+    if (!usephp) {
+      filedata = silc_file_readfile(filename, &data_len);
+      if (!filedata) {
+       silc_http_server_send_error(httpd, conn, "404 Not Found",
+                                   "<body><h1>404 Not Found</h1><p>The page you are looking for cannot be located</body>");
+       return;
       }
-      silc_buffer_set(&page, data, data_len),
-      silc_http_server_add_header(httpd, conn, "Content-Type", "image/jpeg");
+
+      type = silc_http_server_get_header(httpd, conn, "Content-Type");
+      if (type)
+       silc_http_server_add_header(httpd, conn, "Content-Type", type);
+      else if (strstr(uri, ".jpg"))
+       silc_http_server_add_header(httpd, conn, "Content-Type", "image/jpeg");
+      else if (strstr(uri, ".gif"))
+       silc_http_server_add_header(httpd, conn, "Content-Type", "image/gif");
+      else if (strstr(uri, ".png"))
+       silc_http_server_add_header(httpd, conn, "Content-Type", "image/png");
+
+      /* Send page */
+      silc_buffer_set(&page, filedata, data_len);
       silc_http_server_send(httpd, conn, &page);
       silc_buffer_purge(&page);
-      return;
+    } else {
+      php = silc_http_php_file(filename);
+      if (!php) {
+       silc_http_server_send_error(httpd, conn, "404 Not Found",
+                                   "<body><h1>404 Not Found</h1><p>The page you are looking for cannot be located</body>");
+       return;
+      }
+
+      /* Send page */
+      silc_http_server_send(httpd, conn, php);
+      silc_buffer_free(php);
     }
-  }
 
-  if (!strcasecmp(method, "POST")) {
-    if (strcmp(uri, "/posttest"))
-      return;
-    memset(&page, 0, sizeof(page));
-    silc_buffer_strformat(&page,
-                         "<html><head></head><body>",
-                         "POST PROCESSED:",
-                         silc_buffer_data(data),
-                         "</body></html>",
-                         SILC_STRFMT_END);
-    silc_http_server_add_header(httpd, conn, "X-Date",
-                               silc_time_string(silc_time()));
-    silc_http_server_send(httpd, conn, &page);
-    silc_buffer_purge(&page);
     return;
   }
 
   silc_http_server_send_error(httpd, conn, "404 Not Found",
-                             "<body><h1>404 Not Found: The page you are looking for cannot be located</h1></body>");
+                             "<body><h1>404 Not Found</h1><p>The page you are looking for cannot be located</body>");
 }
 
 int main(int argc, char **argv)
@@ -93,10 +89,16 @@ int main(int argc, char **argv)
   SilcSchedule schedule;
   SilcHttpServer httpd;
 
-  if (argc > 1 && !strcmp(argv[1], "-d")) {
-    silc_log_debug(TRUE);
-    silc_log_debug_hexdump(TRUE);
-    silc_log_set_debug_string("*http*,*mime*");
+  if (argc > 1) {
+    if (!strcmp(argv[1], "-d")) {
+      silc_log_debug(TRUE);
+      silc_log_debug_hexdump(TRUE);
+      silc_log_set_debug_string("*http*,*mime*");
+      if (argc > 2)
+       htdocs = argv[2];
+    } else {
+      htdocs = argv[1];
+    }
   }
 
   signal(SIGPIPE, SIG_IGN);
@@ -108,7 +110,7 @@ int main(int argc, char **argv)
 
   SILC_LOG_DEBUG(("Allocating HTTP server at 127.0.0.1:5000"));
   httpd = silc_http_server_alloc("127.0.0.1", 5000, schedule,
-                                http_callback, NULL);
+                                http_callback_file, NULL);
   if (!httpd)
     goto err;