blob: e23d49e145a8cb77a08df7d0e9cf82370891149c [file] [log] [blame]
#include "a.h"
typedef struct DEntry DEntry;
struct DEntry
{
CEntry ce;
HTTPHeader hdr;
char *tmpfile;
int fd;
};
static void
dfree(CEntry *ce)
{
DEntry *d;
d = (DEntry*)ce;
if(d->tmpfile){
remove(d->tmpfile);
free(d->tmpfile);
close(d->fd);
}
}
static Cache *downloadcache;
static char*
parseurl(char *url, char **path)
{
char *host, *p;
int len;
if(memcmp(url, "http://", 7) != 0)
return nil;
p = strchr(url+7, '/');
if(p == nil)
p = url+strlen(url);
len = p - (url+7);
host = emalloc(len+1);
memmove(host, url+7, len);
host[len] = 0;
if(*p == 0)
p = "/";
*path = p;
return host;
}
int
download(char *url, HTTPHeader *hdr)
{
DEntry *d;
char *host, *path;
char buf[] = "/var/tmp/smugfs.XXXXXX";
char *req;
int fd;
Fmt fmt;
if(downloadcache == nil)
downloadcache = newcache(sizeof(DEntry), 128, dfree);
host = parseurl(url, &path);
if(host == nil)
return -1;
d = (DEntry*)cachelookup(downloadcache, url, 1);
if(d->tmpfile){
free(host);
*hdr = d->hdr;
return dup(d->fd, -1);
}
d->fd = -1; // paranoia
if((fd = opentemp(buf, ORDWR|ORCLOSE)) < 0){
free(host);
return -1;
}
fmtstrinit(&fmt);
fmtprint(&fmt, "GET %s HTTP/1.0\r\n", path);
fmtprint(&fmt, "Host: %s\r\n", host);
fmtprint(&fmt, "User-Agent: " USER_AGENT "\r\n");
fmtprint(&fmt, "\r\n");
req = fmtstrflush(&fmt);
fprint(2, "Get %s\n", url);
if(httptofile(&http, host, req, hdr, fd) < 0){
free(host);
free(req);
return -1;
}
free(host);
free(req);
d->tmpfile = estrdup(buf);
d->fd = dup(fd, -1);
d->hdr = *hdr;
return fd;
}
void
downloadflush(char *substr)
{
if(downloadcache)
cacheflush(downloadcache, substr);
}