- int get1(void)
- {
- int ret;
-
- while(!(off < buf->d)) {
- sizebuf(*buf, buf->d + 1024);
- ret = recv(fd, buf->b + buf->d, buf->s - buf->d, MSG_DONTWAIT);
- if(ret <= 0) {
- if((ret < 0) && (errno == EAGAIN)) {
- block(fd, EV_READ);
- continue;
- }
- return(-1);
+ do {
+ read = fread(buf, 1, sizeof(buf), in);
+ if(ferror(in))
+ return(-1);
+ fprintf(out, "%zx\r\n", read);
+ if(fwrite(buf, 1, read, out) != read)
+ return(-1);
+ fprintf(out, "\r\n");
+ } while(read > 0);
+ return(0);
+}
+
+static int hasheader(struct hthead *head, char *name, char *val)
+{
+ char *hd;
+
+ if((hd = getheader(head, name)) == NULL)
+ return(0);
+ return(!strcasecmp(hd, val));
+}
+
+static int canonreq(struct hthead *req)
+{
+ char *p, *p2, *r;
+ int n;
+
+ if(req->url[0] == '/') {
+ replrest(req, req->url + 1);
+ if((p = strchr(req->rest, '?')) != NULL)
+ *p = 0;
+ return(1);
+ }
+ if((p = strstr(req->url, "://")) != NULL) {
+ n = p - req->url;
+ if(((n == 4) && !strncasecmp(req->url, "http", 4)) ||
+ ((n == 5) && !strncasecmp(req->url, "https", 5))) {
+ if(getheader(req, "host"))
+ return(0);
+ p += 3;
+ if((p2 = strchr(p, '/')) == NULL) {
+ headappheader(req, "Host", p);
+ free(req->url);
+ req->url = sstrdup("/");
+ } else {
+ r = sstrdup(p2);
+ *(p2++) = 0;
+ headappheader(req, "Host", p);
+ free(req->url);
+ req->url = r;