xref: /plan9/sys/src/libhttpd/gethead.c (revision e059317eeee4a35883e310a859cb2906cb172f75)
19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <bin.h>
49a747e4fSDavid du Colombier #include <httpd.h>
59a747e4fSDavid du Colombier 
69a747e4fSDavid du Colombier /*
79a747e4fSDavid du Colombier  * read in some header lines, either one or all of them.
89a747e4fSDavid du Colombier  * copy results into header log buffer.
99a747e4fSDavid du Colombier  */
109a747e4fSDavid du Colombier int
hgethead(HConnect * c,int many)119a747e4fSDavid du Colombier hgethead(HConnect *c, int many)
129a747e4fSDavid du Colombier {
139a747e4fSDavid du Colombier 	Hio *hin;
149a747e4fSDavid du Colombier 	char *s, *p, *pp;
159a747e4fSDavid du Colombier 	int n;
169a747e4fSDavid du Colombier 
179a747e4fSDavid du Colombier 	hin = &c->hin;
189a747e4fSDavid du Colombier 	for(;;){
199a747e4fSDavid du Colombier 		s = (char*)hin->pos;
209a747e4fSDavid du Colombier 		pp = s;
219a747e4fSDavid du Colombier 		while(p = memchr(pp, '\n', (char*)hin->stop - pp)){
22*e059317eSDavid du Colombier 			if(!many || p == pp || (p == pp + 1 && *pp == '\r')){
239a747e4fSDavid du Colombier 				pp = p + 1;
249a747e4fSDavid du Colombier 				break;
259a747e4fSDavid du Colombier 			}
269a747e4fSDavid du Colombier 			pp = p + 1;
279a747e4fSDavid du Colombier 		}
289a747e4fSDavid du Colombier 		hin->pos = (uchar*)pp;
299a747e4fSDavid du Colombier 		n = pp - s;
309a747e4fSDavid du Colombier 		if(c->hstop + n > &c->header[HBufSize])
31*e059317eSDavid du Colombier 			return -1;
329a747e4fSDavid du Colombier 		memmove(c->hstop, s, n);
339a747e4fSDavid du Colombier 		c->hstop += n;
349a747e4fSDavid du Colombier 		*c->hstop = '\0';
359a747e4fSDavid du Colombier 		if(p != nil)
369a747e4fSDavid du Colombier 			return 0;
37*e059317eSDavid du Colombier 		if(hreadbuf(hin, hin->pos) == nil || hin->state == Hend)
38*e059317eSDavid du Colombier 			return -1;
399a747e4fSDavid du Colombier 	}
409a747e4fSDavid du Colombier }
41