This is a patch against 2.4.0 which enables the use of virtual domains. I
ma running multiple domains on my server and was not able to use the
kernel webserver. The machine is only a Cyrix 166 and since it also serves
lots of files using the kernel server is a tremendous boost.

Settings for khttpd:

echo 80 >/proc/sys/net/khttpd/serverport
echo 8080 >/proc/sys/net/khttpd/clientport
echo 
"(lameter,com,www.lameter.com)/home/clameter/lameter:(vdm.org)/home/clameter/vdm:/var/www"
 >/proc/sys/net/khttpd/documentroot
echo 1 >/proc/sys/net/khttpd/start

The docs are included in the source below.

diff -urN linux-orig/net/khttpd/rfc.c linux/net/khttpd/rfc.c
--- linux-orig/net/khttpd/rfc.c Mon Aug 23 10:41:25 1999
+++ linux/net/khttpd/rfc.c      Wed Jan 10 19:48:04 2001
@@ -23,6 +23,34 @@
  *
  ****************************************************************/
 
+/*
+  Virtual Host parser by Christoph Lameter <[EMAIL PROTECTED]>, January 10, 2001
+  
+  The proc file in /proc/sys/net/khttpd/document can either be set to a single 
+webroot or
+  can contain a specification of a pathlist of webroots. Each path is prefixed by the 
+virtual
+  hostnames in parentheses. For example.
+  
+  echo 
+"(home.lameter.com,localhost)/a/christoph/new:(virtual3.cc.com)/home/richard:/var/www"
+ >documentroot
+  
+  would redirect requests for http://lameter.com and http://localhost to 
+/a/christoph/new.
+  Requests for http://virtual3.cc.com will be served from /home/richard.
+  Requests for other domains will be served from /var/www.
+
+  The syntax for specifying virtual host mappings is:
+  
+  <virtual-hostmap< { , <virtual_hostmap> } : <defaultpath>
+  
+  where
+  
+  <defaultmap>         =       Unix path
+  <virtual-hostmap>    =       ( <hostname> { , <hostname> } ) : <path>
+  <hostname>           =       legal DNS name of a host
+  <path>               =       Unix path
+  
+  An additional enhancement of khttpd is that no attempt is made to open directories.
+  Instead index.html is appended to a directory to simulate classic webserver 
+behavior.
+  
+*/
 
 #include <linux/kernel.h>
 
@@ -280,6 +308,8 @@
 void ParseHeader(char *Buffer,const int length, struct http_request *Head)
 {
        char *Endval,*EOL,*tmp;
+       char *filename=NULL;
+       int filenamelen;
        
        EnterFunction("ParseHeader");
        Endval = Buffer + length;
@@ -311,7 +341,6 @@
                
                if (strncmp("GET ",Buffer,4)==0)
                {
-                       int PrefixLen;
                        Buffer+=4;
                        
                        tmp=strchr(Buffer,' ');
@@ -323,12 +352,9 @@
                                Head->HTTPVER = 10;
                        
                        if (tmp>Endval) continue;
-                       
-                       
strncpy(Head->FileName,sysctl_khttpd_docroot,sizeof(Head->FileName));
-                       PrefixLen = strlen(sysctl_khttpd_docroot);
-                       Head->FileNameLength = min(255,tmp-Buffer+PrefixLen);          
 
-                       
-                       strncat(Head->FileName,Buffer,min(255-PrefixLen,tmp-Buffer));
+
+                       filename=Buffer;
+                       filenamelen=tmp-Buffer;
                                        
                        Buffer=EOL+1;   
 #ifdef BENCHMARK
@@ -369,6 +395,67 @@
                }
 #endif         
                Buffer = EOL+1;  /* Skip line */
+       }
+       if (filename) {
+
+           char PrefixLen;
+
+           if (sysctl_khttpd_docroot[0]=='(') {
+
+               char *p=sysctl_khttpd_docroot;
+               char *q;
+
+               while (*p=='(') {
+                       do {
+                               p++;
+                               q=p;    /* Mark position of virtual hostname */
+
+                               while (*p && *p!=')' && *p!=',') p++;           /* 
+Find the end of the hostname */
+
+                               if (*p==0) { printk(KERN_ERR ") missing in virtual 
+host string.\n");return; }
+
+                               if (strnicmp(Head->Host,q,p-q)==0) {
+                                       /* virtual hostname match */
+                                       while (*p && *p!=')') p++;      /* Skip to the 
+end of the vhostname list */
+                                       if (*p == 0) printk(KERN_ERR "path missing for 
+virtual host");
+
+                                       p++;
+                                       goto rootfound;
+                               }
+                       } while (*p==',');
+
+                       if (*p==')') { /* at end of virtual host names need to skip 
+the webroot since nothing matched */
+
+                               while (*p && *p!=':') p++;
+                               if (*p==0) { printk(KERN_ERR "closing : of virtual 
+host specification missing.\n");return; }
+                               p++;
+                       }
+
+               }
+       rootfound:
+               if (*p==0) { printk(KERN_ERR "Error in virtual host 
+specification.\n");return; }
+
+               /* p is pointing to matching webroot for this virtual host or the 
+default root */
+               q=p;while (*p && *p!=':') p++;          /* Find the end of the 
+pathname */
+               PrefixLen=p-q;
+               strncpy(Head->FileName,q,PrefixLen);
+
+           } else {
+
+              strncpy(Head->FileName,sysctl_khttpd_docroot,sizeof(Head->FileName));
+              PrefixLen = strlen(sysctl_khttpd_docroot);
+
+           }
+
+           Head->FileNameLength = min(255,filenamelen+PrefixLen);              
+           strncat(Head->FileName,filename,min(255-PrefixLen,filenamelen));
+           
+           if (Head->FileName[Head->FileNameLength-1]=='/' && 
+Head->FileNameLength<255-10) {
+           
+               /* A directory! khttpd will not be able to successfully open it. But 
+it might be able to access index.html */
+               memcpy(Head->FileName+Head->FileNameLength,"index.html",10);
+               Head->FileNameLength+=10;
+           }
        }
        LeaveFunction("ParseHeader");
 }


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to [EMAIL PROTECTED]
Please read the FAQ at http://www.tux.org/lkml/

Reply via email to