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