- i = req->noheaders++;
- req->headers = srealloc(req->headers, sizeof(*req->headers) * req->noheaders);
- req->headers[i] = smalloc(sizeof(*req->headers[i]) * 2);
- req->headers[i][0] = sstrdup(name);
- req->headers[i][1] = sstrdup(val);
+ i = head->noheaders++;
+ head->headers = srealloc(head->headers, sizeof(*head->headers) * head->noheaders);
+ head->headers[i] = smalloc(sizeof(*head->headers[i]) * 2);
+ head->headers[i][0] = sstrdup(name);
+ head->headers[i][1] = sstrdup(val);
+}
+
+int sendreq(int sock, struct hthead *req, int fd)
+{
+ int ret, i;
+ struct charbuf buf;
+
+ bufinit(buf);
+ bufcatstr2(buf, req->method);
+ bufcatstr2(buf, req->url);
+ bufcatstr2(buf, req->ver);
+ bufcatstr2(buf, req->rest);
+ for(i = 0; i < req->noheaders; i++) {
+ bufcatstr2(buf, req->headers[i][0]);
+ bufcatstr2(buf, req->headers[i][1]);
+ }
+ bufcatstr2(buf, "");
+ ret = sendfd(sock, fd, buf.b, buf.d);
+ buffree(buf);
+ if(ret < 0)
+ return(-1);
+ else
+ return(0);
+}
+
+int recvreq(int sock, struct hthead **reqp)
+{
+ int fd;
+ struct charbuf buf;
+ char *p;
+ size_t l;
+ char *name, *val;
+ struct hthead *req;
+
+ if((fd = recvfd(sock, &buf.b, &buf.d)) < 0) {
+ return(-1);
+ }
+ buf.s = buf.d;
+ p = buf.b;
+ l = buf.d;
+
+ *reqp = omalloc(req);
+ if((req->method = sstrdup(decstr(&p, &l))) == NULL)
+ goto fail;
+ if((req->url = sstrdup(decstr(&p, &l))) == NULL)
+ goto fail;
+ if((req->ver = sstrdup(decstr(&p, &l))) == NULL)
+ goto fail;
+ if((req->rest = sstrdup(decstr(&p, &l))) == NULL)
+ goto fail;
+
+ while(1) {
+ if(!*(name = decstr(&p, &l)))
+ break;
+ val = decstr(&p, &l);
+ headappheader(req, name, val);
+ }
+
+ buffree(buf);
+ return(fd);
+
+fail:
+ close(fd);
+ freehthead(req);
+ errno = EPROTO;
+ return(-1);