src/server/httprequest.c

changeset 3
137197831306
parent 1
3c066d52342d
child 5
dbc01588686e
--- a/src/server/httprequest.c	Tue Sep 06 22:37:51 2011 +0200
+++ b/src/server/httprequest.c	Sun Oct 30 16:26:57 2011 +0100
@@ -35,6 +35,8 @@
 #include "io.h"
 #include "util.h"
 #include "httprequest.h"
+#include "conf.h"
+#include "vserver.h"
 
 HTTPRequest *http_request_new() {
     HTTPRequest *req = malloc(sizeof(HTTPRequest));
@@ -62,6 +64,7 @@
     NSAPISession *sn = malloc(sizeof(NSAPISession));
     NSAPIRequest *rq = malloc(sizeof(NSAPIRequest));
     request->rq = rq;
+    rq->phase = NSAPIAuthTrans;
 
     // fill session structure
     sn->sn.pool = pool_create();
@@ -73,9 +76,14 @@
 
     // init NSAPI request structure
     if(request_initialize(request->pool, request, rq) != 0) {
+        printf("Cannot initialize request structure\n");
         return 1;
     }
 
+    // set default virtual server
+    rq->vs = conf_get_default_vs();
+
+
     /* Pass request line as "clf-request" */
     pblock_kvinsert(
             pb_key_clf_request,
@@ -129,6 +137,7 @@
 
 
     // Send the request to the NSAPI system
+    nsapi_handle_request(sn, rq);
 
     return 0;
 }
@@ -152,3 +161,116 @@
     hd->len++;
 }
 
+
+/*
+ * NSAPI Processing
+ * TODO: add this to new file
+ */
+
+int nsapi_handle_request(NSAPISession *sn, NSAPIRequest *rq) {
+    // TODO: threadpool
+
+    int r = REQ_NOACTION;
+
+    do {
+        switch(rq->phase) {
+            case NSAPIAuthTrans: {
+                rq->phase++;
+            }
+            case NSAPINameTrans: {
+                printf(">>> NameTrans\n");
+                r = nsapi_nametrans(sn, rq);
+                if(r != REQ_PROCEED) {
+                    break;
+                }
+                rq->phase++;
+            }
+            case NSAPIPathCheck: {
+                printf(">>> PathCheck\n");
+                rq->phase++;
+            }
+            case NSAPIService: {
+                printf(">>> Service\n");
+                r = nsapi_service(sn, rq);
+                if(r != REQ_PROCEED) {
+                    break;
+                }
+                rq->phase++;
+            }
+            case REQ_FINISH: {
+                printf(">>> Finish\n");
+                r = nsapi_finish_request(sn, rq);
+            }
+        }
+    } while (r == REQ_RESTART);
+
+
+    return r;
+}
+
+int nsapi_finish_request(NSAPISession *sn, NSAPIRequest *rq) {
+    return 0;
+}
+
+int nsapi_nametrans(NSAPISession *sn, NSAPIRequest *rq) {
+    httpd_objset *objset = rq->vs->objset;
+    printf("nsapi_nametrans\n");
+
+    int ret = -1;
+    for(int i=0;i<objset->pos;i++) {
+        httpd_object *obj = objset->obj[i];
+        dtable *dt = object_get_dtable(obj, NSAPINameTrans);
+
+        printf("object[%s] dt: %d\n", obj->name, dt);
+
+        // execute directives
+        for(int j=0;j<dt->ndir;j++) {
+            directive *d = dt->directive[j];
+
+            printf("execute [%s]\n", d->func->name);
+            ret = d->func->func(d->param, (Session*)sn, (Request*)rq);
+            if(ret == REQ_PROCEED || ret == REQ_PROCESSING) {
+                break;
+            }
+        }
+
+        // TODO: stultus
+        if(ret == REQ_PROCEED || ret == REQ_PROCESSING) {
+            break;
+        }
+    }
+
+    // todo: check object, path, ...
+    char *ppath = pblock_findkeyval(pb_key_ppath, rq->rq.vars);
+    printf("ppath: [%s]\n", ppath);
+
+    return ret;
+}
+
+int nsapi_service(NSAPISession *sn, NSAPIRequest *rq) {
+    httpd_objset *objset = rq->vs->objset;
+
+    int ret = -1;
+    for(int i=0;i<objset->pos;i++) {
+        httpd_object *obj = objset->obj[i];
+        dtable *dt = object_get_dtable(obj, NSAPIService);
+
+        // execute directives
+        for(int j=0;j<dt->ndir;j++) {
+            directive *d = dt->directive[j];
+
+            ret = d->func->func(d->param, (Session*)sn, (Request*)rq);
+            if(ret == REQ_PROCEED || ret == REQ_PROCESSING) {
+                break;
+            }
+        }
+
+        // TODO: stultus
+        if(ret == REQ_PROCEED || ret == REQ_PROCESSING) {
+            break;
+        }
+    }
+
+    return ret;
+}
+

mercurial