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