plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

gethead.c (737B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <bin.h>
      4 #include <httpd.h>
      5 
      6 /*
      7  * read in some header lines, either one or all of them.
      8  * copy results into header log buffer.
      9  */
     10 int
     11 hgethead(HConnect *c, int many)
     12 {
     13 	Hio *hin;
     14 	char *s, *p, *pp;
     15 	int n;
     16 
     17 	hin = &c->hin;
     18 	for(;;){
     19 		s = (char*)hin->pos;
     20 		pp = s;
     21 		while(p = memchr(pp, '\n', (char*)hin->stop - pp)){
     22 			if(!many || p == pp || (p == pp + 1 && *pp == '\r')){
     23 				pp = p + 1;
     24 				break;
     25 			}
     26 			pp = p + 1;
     27 		}
     28 		hin->pos = (uchar*)pp;
     29 		n = pp - s;
     30 		if(c->hstop + n > &c->header[HBufSize])
     31 			return -1;
     32 		memmove(c->hstop, s, n);
     33 		c->hstop += n;
     34 		*c->hstop = '\0';
     35 		if(p != nil)
     36 			return 0;
     37 		if(hreadbuf(hin, hin->pos) == nil || hin->state == Hend)
     38 			return -1;
     39 	}
     40 }