Browse code

webkernel: add wk_serve_generic_headers to write only the headers; the data must be written later with wk_write (unless etagnotmodified is true, as that means the reply was 304 Not modified)

Dario Rodriguez authored on 18/05/2015 17:14:13
Showing 2 changed files
... ...
@@ -463,7 +463,7 @@ wk_serve_etagset(wk *paramweb, int connid, char *etag)
463 463
 }
464 464
 
465 465
 int
466
-wk_serve_buffer_as_file(wk *paramweb, int connid, void *data, int datalen, const char *mime)
466
+wk_serve_generic_headers(wk *paramweb, int connid, int datalen, const char *mime, int *etagnotmodified)
467 467
 {
468 468
         static const char *strcontenttype={"Content-Type: "};
469 469
         _wk *web=(_wk *)paramweb;
... ...
@@ -476,6 +476,8 @@ wk_serve_buffer_as_file(wk *paramweb, int connid, void *data, int datalen, const
476 476
         if((client=wk_clientget(web,connid))==NULL)
477 477
                 return(-1);
478 478
         cachedetag=(wk_etagnotmodified(web,client)==0)?1:0;
479
+        if(etagnotmodified!=NULL)
480
+                *etagnotmodified=cachedetag;
479 481
         if(!cachedetag)
480 482
                 wk_writestr((wk *)web,connid,"HTTP/1.0 200 OK\r\n");
481 483
         else
... ...
@@ -505,6 +507,20 @@ wk_serve_buffer_as_file(wk *paramweb, int connid, void *data, int datalen, const
505 507
         if(client->keepalive)
506 508
                 wk_writestr((wk *)web,connid,"Connection: keep-alive\r\n");
507 509
         wk_writestr((wk *)web,connid,"\r\n");
510
+        return(0);
511
+}
512
+
513
+int
514
+wk_serve_buffer_as_file(wk *paramweb, int connid, void *data, int datalen, const char *mime)
515
+{
516
+        _wk *web=(_wk *)paramweb;
517
+        int cachedetag;
518
+        int res;
519
+        if(web==NULL || datalen<0 || (data==NULL && datalen>0))
520
+                return(-1);
521
+        res=wk_serve_generic_headers((wk *)web,connid,datalen,mime,&cachedetag);
522
+        if(res!=0)
523
+                return(res);
508 524
         if(!cachedetag)
509 525
                 return(wk_write((wk *)web,connid,data,datalen));
510 526
         return(0);
... ...
@@ -52,6 +52,7 @@ int wk_service(wk *web); /* To be called after sselelect_wait() but before ssele
52 52
 
53 53
 int wk_serve_cookieadd(wk *web, int connid, char *cookiename, char *value, char *domain, int maxage, char *attributes);
54 54
 int wk_serve_etagset(wk *web, int connid, char *etag);
55
+int wk_serve_generic_headers(wk *web, int connid, int datalen, const char *mime, int *etagnotmodified);
55 56
 int wk_serve_buffer_as_file(wk *web, int connid, void *data, int datalen, const char *mime);
56 57
 int wk_serve_file(wk *web, int connid, char *filename, const char *mime);
57 58
 int wk_serve_error(wk *web, int connid, wk_error wkerror);