Blame


1 18824b58 2008-08-03 rsc #include "a.h"
2 18824b58 2008-08-03 rsc
3 18824b58 2008-08-03 rsc typedef struct DEntry DEntry;
4 18824b58 2008-08-03 rsc struct DEntry
5 18824b58 2008-08-03 rsc {
6 18824b58 2008-08-03 rsc CEntry ce;
7 18824b58 2008-08-03 rsc HTTPHeader hdr;
8 18824b58 2008-08-03 rsc char *tmpfile;
9 18824b58 2008-08-03 rsc int fd;
10 18824b58 2008-08-03 rsc };
11 18824b58 2008-08-03 rsc
12 18824b58 2008-08-03 rsc static void
13 18824b58 2008-08-03 rsc dfree(CEntry *ce)
14 18824b58 2008-08-03 rsc {
15 18824b58 2008-08-03 rsc DEntry *d;
16 fa325e9b 2020-01-10 cross
17 18824b58 2008-08-03 rsc d = (DEntry*)ce;
18 18824b58 2008-08-03 rsc if(d->tmpfile){
19 18824b58 2008-08-03 rsc remove(d->tmpfile);
20 18824b58 2008-08-03 rsc free(d->tmpfile);
21 18824b58 2008-08-03 rsc close(d->fd);
22 18824b58 2008-08-03 rsc }
23 18824b58 2008-08-03 rsc }
24 18824b58 2008-08-03 rsc
25 18824b58 2008-08-03 rsc static Cache *downloadcache;
26 18824b58 2008-08-03 rsc
27 18824b58 2008-08-03 rsc static char*
28 18824b58 2008-08-03 rsc parseurl(char *url, char **path)
29 18824b58 2008-08-03 rsc {
30 18824b58 2008-08-03 rsc char *host, *p;
31 18824b58 2008-08-03 rsc int len;
32 18824b58 2008-08-03 rsc
33 18824b58 2008-08-03 rsc if(memcmp(url, "http://", 7) != 0)
34 18824b58 2008-08-03 rsc return nil;
35 18824b58 2008-08-03 rsc p = strchr(url+7, '/');
36 18824b58 2008-08-03 rsc if(p == nil)
37 18824b58 2008-08-03 rsc p = url+strlen(url);
38 18824b58 2008-08-03 rsc len = p - (url+7);
39 18824b58 2008-08-03 rsc host = emalloc(len+1);
40 18824b58 2008-08-03 rsc memmove(host, url+7, len);
41 18824b58 2008-08-03 rsc host[len] = 0;
42 18824b58 2008-08-03 rsc if(*p == 0)
43 18824b58 2008-08-03 rsc p = "/";
44 18824b58 2008-08-03 rsc *path = p;
45 18824b58 2008-08-03 rsc return host;
46 18824b58 2008-08-03 rsc }
47 18824b58 2008-08-03 rsc
48 18824b58 2008-08-03 rsc int
49 18824b58 2008-08-03 rsc download(char *url, HTTPHeader *hdr)
50 18824b58 2008-08-03 rsc {
51 18824b58 2008-08-03 rsc DEntry *d;
52 18824b58 2008-08-03 rsc char *host, *path;
53 18824b58 2008-08-03 rsc char buf[] = "/var/tmp/smugfs.XXXXXX";
54 18824b58 2008-08-03 rsc char *req;
55 18824b58 2008-08-03 rsc int fd;
56 18824b58 2008-08-03 rsc Fmt fmt;
57 18824b58 2008-08-03 rsc
58 18824b58 2008-08-03 rsc if(downloadcache == nil)
59 18824b58 2008-08-03 rsc downloadcache = newcache(sizeof(DEntry), 128, dfree);
60 18824b58 2008-08-03 rsc
61 18824b58 2008-08-03 rsc host = parseurl(url, &path);
62 18824b58 2008-08-03 rsc if(host == nil)
63 18824b58 2008-08-03 rsc return -1;
64 fa325e9b 2020-01-10 cross
65 18824b58 2008-08-03 rsc d = (DEntry*)cachelookup(downloadcache, url, 1);
66 18824b58 2008-08-03 rsc if(d->tmpfile){
67 18824b58 2008-08-03 rsc free(host);
68 18824b58 2008-08-03 rsc *hdr = d->hdr;
69 18824b58 2008-08-03 rsc return dup(d->fd, -1);
70 18824b58 2008-08-03 rsc }
71 18824b58 2008-08-03 rsc d->fd = -1; // paranoia
72 18824b58 2008-08-03 rsc
73 18824b58 2008-08-03 rsc if((fd = opentemp(buf, ORDWR|ORCLOSE)) < 0){
74 18824b58 2008-08-03 rsc free(host);
75 18824b58 2008-08-03 rsc return -1;
76 18824b58 2008-08-03 rsc }
77 18824b58 2008-08-03 rsc
78 18824b58 2008-08-03 rsc fmtstrinit(&fmt);
79 18824b58 2008-08-03 rsc fmtprint(&fmt, "GET %s HTTP/1.0\r\n", path);
80 18824b58 2008-08-03 rsc fmtprint(&fmt, "Host: %s\r\n", host);
81 18824b58 2008-08-03 rsc fmtprint(&fmt, "User-Agent: " USER_AGENT "\r\n");
82 18824b58 2008-08-03 rsc fmtprint(&fmt, "\r\n");
83 18824b58 2008-08-03 rsc req = fmtstrflush(&fmt);
84 fa325e9b 2020-01-10 cross
85 18824b58 2008-08-03 rsc fprint(2, "Get %s\n", url);
86 18824b58 2008-08-03 rsc
87 18824b58 2008-08-03 rsc if(httptofile(&http, host, req, hdr, fd) < 0){
88 18824b58 2008-08-03 rsc free(host);
89 18824b58 2008-08-03 rsc free(req);
90 18824b58 2008-08-03 rsc return -1;
91 18824b58 2008-08-03 rsc }
92 18824b58 2008-08-03 rsc free(host);
93 18824b58 2008-08-03 rsc free(req);
94 18824b58 2008-08-03 rsc d->tmpfile = estrdup(buf);
95 18824b58 2008-08-03 rsc d->fd = dup(fd, -1);
96 18824b58 2008-08-03 rsc d->hdr = *hdr;
97 18824b58 2008-08-03 rsc return fd;
98 18824b58 2008-08-03 rsc }
99 18824b58 2008-08-03 rsc
100 18824b58 2008-08-03 rsc void
101 18824b58 2008-08-03 rsc downloadflush(char *substr)
102 18824b58 2008-08-03 rsc {
103 18824b58 2008-08-03 rsc if(downloadcache)
104 18824b58 2008-08-03 rsc cacheflush(downloadcache, substr);
105 18824b58 2008-08-03 rsc }