summaryrefslogtreecommitdiff
path: root/src/http.c
diff options
context:
space:
mode:
authorjacksonmj <jacksonmj@jacksonmj.none>2011-01-06 22:26:31 (GMT)
committer jacksonmj <jacksonmj@jacksonmj.none>2011-01-06 22:26:31 (GMT)
commited8c0031f4899ea4d1bf0b1ad15620bef735dbae (patch)
tree7304b287322b8ddae3f7f3cd5a92b99f8d4091d4 /src/http.c
parent6eafb157de0e317a17bb74b2c60b5d759d891666 (diff)
downloadpowder-ed8c0031f4899ea4d1bf0b1ad15620bef735dbae.zip
powder-ed8c0031f4899ea4d1bf0b1ad15620bef735dbae.tar.gz
Astyle.
Diffstat (limited to 'src/http.c')
-rw-r--r--src/http.c1650
1 files changed, 825 insertions, 825 deletions
diff --git a/src/http.c b/src/http.c
index cc056c7..a68ea45 100644
--- a/src/http.c
+++ b/src/http.c
@@ -71,119 +71,119 @@ static struct sockaddr_in http_proxy;
static char *mystrdup(char *s)
{
- char *x;
- if(s)
- {
- x = malloc(strlen(s)+1);
- strcpy(x, s);
- return x;
- }
- return s;
+ char *x;
+ if (s)
+ {
+ x = malloc(strlen(s)+1);
+ strcpy(x, s);
+ return x;
+ }
+ return s;
}
static int splituri(char *uri, char **host, char **path)
{
- char *p=uri,*q,*x,*y;
- if(!strncmp(p, "http://", 7))
- p += 7;
- q = strchr(p, '/');
- if(!q)
- q = p + strlen(p);
- x = malloc(q-p+1);
- if(*q)
- y = mystrdup(q);
- else
- y = mystrdup("/");
- strncpy(x, p, q-p);
- x[q-p] = 0;
- if(q==p || x[q-p-1]==':')
- {
- free(x);
- free(y);
- return 1;
- }
- *host = x;
- *path = y;
- return 0;
+ char *p=uri,*q,*x,*y;
+ if (!strncmp(p, "http://", 7))
+ p += 7;
+ q = strchr(p, '/');
+ if (!q)
+ q = p + strlen(p);
+ x = malloc(q-p+1);
+ if (*q)
+ y = mystrdup(q);
+ else
+ y = mystrdup("/");
+ strncpy(x, p, q-p);
+ x[q-p] = 0;
+ if (q==p || x[q-p-1]==':')
+ {
+ free(x);
+ free(y);
+ return 1;
+ }
+ *host = x;
+ *path = y;
+ return 0;
}
static char *getserv(char *host)
{
- char *q, *x = mystrdup(host);
- q = strchr(x, ':');
- if(q)
- *q = 0;
- return x;
+ char *q, *x = mystrdup(host);
+ q = strchr(x, ':');
+ if (q)
+ *q = 0;
+ return x;
}
static char *getport(char *host)
{
- char *p, *q;
- q = strchr(host, ':');
- if(q)
- p = mystrdup(q+1);
- else
- p = mystrdup("80");
- return p;
+ char *p, *q;
+ q = strchr(host, ':');
+ if (q)
+ p = mystrdup(q+1);
+ else
+ p = mystrdup("80");
+ return p;
}
static int resolve(char *dns, char *srv, struct sockaddr_in *addr)
{
- struct addrinfo hnt, *res = 0;
- if(http_use_proxy)
- {
- memcpy(addr, &http_proxy, sizeof(struct sockaddr_in));
- return 0;
- }
- memset(&hnt, 0, sizeof(hnt));
- hnt.ai_family = AF_INET;
- hnt.ai_socktype = SOCK_STREAM;
- if(getaddrinfo(dns, srv, &hnt, &res))
- return 1;
- if(res)
- {
- if(res->ai_family != AF_INET)
- {
- freeaddrinfo(res);
- return 1;
- }
- memcpy(addr, res->ai_addr, res->ai_addrlen);
- freeaddrinfo(res);
- return 0;
- }
- return 1;
+ struct addrinfo hnt, *res = 0;
+ if (http_use_proxy)
+ {
+ memcpy(addr, &http_proxy, sizeof(struct sockaddr_in));
+ return 0;
+ }
+ memset(&hnt, 0, sizeof(hnt));
+ hnt.ai_family = AF_INET;
+ hnt.ai_socktype = SOCK_STREAM;
+ if (getaddrinfo(dns, srv, &hnt, &res))
+ return 1;
+ if (res)
+ {
+ if (res->ai_family != AF_INET)
+ {
+ freeaddrinfo(res);
+ return 1;
+ }
+ memcpy(addr, res->ai_addr, res->ai_addrlen);
+ freeaddrinfo(res);
+ return 0;
+ }
+ return 1;
}
void http_init(char *proxy)
{
- char *host, *port;
+ char *host, *port;
#ifdef WIN32
- WSADATA wsadata;
- if(!WSAStartup(MAKEWORD(2,2), &wsadata))
- http_up = 1;
+ WSADATA wsadata;
+ if (!WSAStartup(MAKEWORD(2,2), &wsadata))
+ http_up = 1;
#else
- signal(SIGPIPE, SIG_IGN);
- http_up = 1;
+ signal(SIGPIPE, SIG_IGN);
+ http_up = 1;
#endif
- if(proxy)
- {
- host = getserv(proxy);
- port = getport(proxy);
- if(resolve(host, port, &http_proxy))
- http_up = 0;
- else
- http_use_proxy = 1;
- free(host);
- free(port);
- }
+ if (proxy)
+ {
+ host = getserv(proxy);
+ port = getport(proxy);
+ if (resolve(host, port, &http_proxy))
+ http_up = 0;
+ else
+ http_use_proxy = 1;
+ free(host);
+ free(port);
+ }
}
void http_done(void)
{
#ifdef WIN32
- WSACleanup();
+ WSACleanup();
#endif
- http_up = 0;
+ http_up = 0;
}
#define CHUNK 4096
@@ -197,855 +197,855 @@ void http_done(void)
#define HTS_DONE 6
struct http_ctx
{
- int state;
- time_t last;
- int keep;
- int ret;
- char *host, *path;
- char *thdr;
- int thlen;
- char *txd;
- int txdl;
- struct sockaddr_in addr;
- char *tbuf;
- int tlen, tptr;
- char *hbuf;
- int hlen, hptr;
- char *rbuf;
- int rlen, rptr;
- int chunked, chunkhdr, rxtogo, contlen, cclose;
- int fd;
- char *fdhost;
+ int state;
+ time_t last;
+ int keep;
+ int ret;
+ char *host, *path;
+ char *thdr;
+ int thlen;
+ char *txd;
+ int txdl;
+ struct sockaddr_in addr;
+ char *tbuf;
+ int tlen, tptr;
+ char *hbuf;
+ int hlen, hptr;
+ char *rbuf;
+ int rlen, rptr;
+ int chunked, chunkhdr, rxtogo, contlen, cclose;
+ int fd;
+ char *fdhost;
};
void *http_async_req_start(void *ctx, char *uri, char *data, int dlen, int keep)
{
- struct http_ctx *cx = ctx;
- if(!ctx)
- {
- ctx = calloc(1, sizeof(struct http_ctx));
- cx = ctx;
- cx->fd = PERROR;
- }
+ struct http_ctx *cx = ctx;
+ if (!ctx)
+ {
+ ctx = calloc(1, sizeof(struct http_ctx));
+ cx = ctx;
+ cx->fd = PERROR;
+ }
- if(!cx->hbuf)
- {
- cx->hbuf = malloc(256);
- cx->hlen = 256;
- }
+ if (!cx->hbuf)
+ {
+ cx->hbuf = malloc(256);
+ cx->hlen = 256;
+ }
- if(!http_up)
- {
- cx->ret = 604;
- cx->state = HTS_DONE;
- return ctx;
- }
+ if (!http_up)
+ {
+ cx->ret = 604;
+ cx->state = HTS_DONE;
+ return ctx;
+ }
- if(cx->state!=HTS_STRT && cx->state!=HTS_IDLE)
- {
- fprintf(stderr, "HTTP: unclean request restart state.\n");
- exit(1);
- }
+ if (cx->state!=HTS_STRT && cx->state!=HTS_IDLE)
+ {
+ fprintf(stderr, "HTTP: unclean request restart state.\n");
+ exit(1);
+ }
- cx->keep = keep;
- cx->ret = 600;
- if(splituri(uri, &cx->host, &cx->path))
- {
- cx->ret = 601;
- cx->state = HTS_DONE;
- return ctx;
- }
- if(http_use_proxy)
- {
- free(cx->path);
- cx->path = mystrdup(uri);
- }
- if(cx->fdhost && strcmp(cx->host, cx->fdhost))
- {
- free(cx->fdhost);
- cx->fdhost = NULL;
- PCLOSE(cx->fd);
- cx->fd = PERROR;
- cx->state = HTS_STRT;
- }
- if(data)
- {
- if(!dlen)
- dlen = strlen(data);
- cx->txd = malloc(dlen);
- memcpy(cx->txd, data, dlen);
- cx->txdl = dlen;
- }
- else
- cx->txdl = 0;
+ cx->keep = keep;
+ cx->ret = 600;
+ if (splituri(uri, &cx->host, &cx->path))
+ {
+ cx->ret = 601;
+ cx->state = HTS_DONE;
+ return ctx;
+ }
+ if (http_use_proxy)
+ {
+ free(cx->path);
+ cx->path = mystrdup(uri);
+ }
+ if (cx->fdhost && strcmp(cx->host, cx->fdhost))
+ {
+ free(cx->fdhost);
+ cx->fdhost = NULL;
+ PCLOSE(cx->fd);
+ cx->fd = PERROR;
+ cx->state = HTS_STRT;
+ }
+ if (data)
+ {
+ if (!dlen)
+ dlen = strlen(data);
+ cx->txd = malloc(dlen);
+ memcpy(cx->txd, data, dlen);
+ cx->txdl = dlen;
+ }
+ else
+ cx->txdl = 0;
- cx->contlen = 0;
- cx->chunked = 0;
- cx->chunkhdr = 0;
- cx->rxtogo = 0;
- cx->cclose = 0;
+ cx->contlen = 0;
+ cx->chunked = 0;
+ cx->chunkhdr = 0;
+ cx->rxtogo = 0;
+ cx->cclose = 0;
- cx->tptr = 0;
- cx->tlen = 0;
+ cx->tptr = 0;
+ cx->tlen = 0;
- cx->last = time(NULL);
+ cx->last = time(NULL);
- return ctx;
+ return ctx;
}
void http_async_add_header(void *ctx, char *name, char *data)
{
- struct http_ctx *cx = ctx;
- cx->thdr = realloc(cx->thdr, cx->thlen + strlen(name) + strlen(data) + 4);
- cx->thlen += sprintf(cx->thdr+cx->thlen, "%s: %s\n", name, data);
+ struct http_ctx *cx = ctx;
+ cx->thdr = realloc(cx->thdr, cx->thlen + strlen(name) + strlen(data) + 4);
+ cx->thlen += sprintf(cx->thdr+cx->thlen, "%s: %s\n", name, data);
}
static void process_header(struct http_ctx *cx, char *str)
{
- char *p;
- if(cx->chunkhdr)
- {
- p = strchr(str, ';');
- if(p)
- *p = 0;
- cx->rxtogo = strtoul(str, NULL, 16);
- cx->chunkhdr = 0;
- if(!cx->rxtogo)
- cx->chunked = 0;
- }
- if(!str[0])
- {
- cx->rxtogo = cx->contlen;
- cx->chunkhdr = cx->chunked;
- if(!cx->contlen && !cx->chunked && cx->ret!=100)
- cx->state = HTS_DONE;
- return;
- }
- if(!strncmp(str, "HTTP/", 5))
- {
- p = strchr(str, ' ');
- if(!p)
- {
- cx->ret = 603;
- cx->state = HTS_DONE;
- return;
- }
- p++;
- cx->ret = atoi(p);
- return;
- }
- if(!strncmp(str, "Content-Length: ", 16))
- {
- cx->contlen = atoi(str+16);
- return;
- }
- if(!strcmp(str, "Transfer-Encoding: chunked"))
- {
- cx->chunked = 1;
- return;
- }
- if(!strcmp(str, "Connection: close"))
- {
- cx->cclose = 1;
- return;
- }
+ char *p;
+ if (cx->chunkhdr)
+ {
+ p = strchr(str, ';');
+ if (p)
+ *p = 0;
+ cx->rxtogo = strtoul(str, NULL, 16);
+ cx->chunkhdr = 0;
+ if (!cx->rxtogo)
+ cx->chunked = 0;
+ }
+ if (!str[0])
+ {
+ cx->rxtogo = cx->contlen;
+ cx->chunkhdr = cx->chunked;
+ if (!cx->contlen && !cx->chunked && cx->ret!=100)
+ cx->state = HTS_DONE;
+ return;
+ }
+ if (!strncmp(str, "HTTP/", 5))
+ {
+ p = strchr(str, ' ');
+ if (!p)
+ {
+ cx->ret = 603;
+ cx->state = HTS_DONE;
+ return;
+ }
+ p++;
+ cx->ret = atoi(p);
+ return;
+ }
+ if (!strncmp(str, "Content-Length: ", 16))
+ {
+ cx->contlen = atoi(str+16);
+ return;
+ }
+ if (!strcmp(str, "Transfer-Encoding: chunked"))
+ {
+ cx->chunked = 1;
+ return;
+ }
+ if (!strcmp(str, "Connection: close"))
+ {
+ cx->cclose = 1;
+ return;
+ }
}
static void process_byte(struct http_ctx *cx, char ch)
{
- if(cx->rxtogo)
- {
- cx->rxtogo--;
+ if (cx->rxtogo)
+ {
+ cx->rxtogo--;
- if(!cx->rbuf)
- {
- cx->rbuf = malloc(256);
- cx->rlen = 256;
- }
- if(cx->rptr >= cx->rlen-1)
- {
- cx->rlen *= 2;
- cx->rbuf = realloc(cx->rbuf, cx->rlen);
- }
- cx->rbuf[cx->rptr++] = ch;
+ if (!cx->rbuf)
+ {
+ cx->rbuf = malloc(256);
+ cx->rlen = 256;
+ }
+ if (cx->rptr >= cx->rlen-1)
+ {
+ cx->rlen *= 2;
+ cx->rbuf = realloc(cx->rbuf, cx->rlen);
+ }
+ cx->rbuf[cx->rptr++] = ch;
- if(!cx->rxtogo && !cx->chunked)
- cx->state = HTS_DONE;
- }
- else
- {
- if(ch == '\n')
- {
- cx->hbuf[cx->hptr] = 0;
- process_header(cx, cx->hbuf);
- cx->hptr = 0;
- }
- else if(ch != '\r')
- {
- if(cx->hptr >= cx->hlen-1)
- {
- cx->hlen *= 2;
- cx->hbuf = realloc(cx->hbuf, cx->hlen);
- }
- cx->hbuf[cx->hptr++] = ch;
- }
- }
+ if (!cx->rxtogo && !cx->chunked)
+ cx->state = HTS_DONE;
+ }
+ else
+ {
+ if (ch == '\n')
+ {
+ cx->hbuf[cx->hptr] = 0;
+ process_header(cx, cx->hbuf);
+ cx->hptr = 0;
+ }
+ else if (ch != '\r')
+ {
+ if (cx->hptr >= cx->hlen-1)
+ {
+ cx->hlen *= 2;
+ cx->hbuf = realloc(cx->hbuf, cx->hlen);
+ }
+ cx->hbuf[cx->hptr++] = ch;
+ }
+ }
}
int http_async_req_status(void *ctx)
{
- struct http_ctx *cx = ctx;
- char *dns,*srv,buf[CHUNK];
- int tmp, i;
- time_t now = time(NULL);
+ struct http_ctx *cx = ctx;
+ char *dns,*srv,buf[CHUNK];
+ int tmp, i;
+ time_t now = time(NULL);
#ifdef WIN32
- unsigned long tmp2;
+ unsigned long tmp2;
#endif
- switch(cx->state)
- {
- case HTS_STRT:
- dns = getserv(cx->host);
- srv = getport(cx->host);
- if(resolve(dns, srv, &cx->addr))
- {
- free(dns);
- free(srv);
- cx->state = HTS_DONE;
- cx->ret = 602;
- return 1;
- }
- free(dns);
- free(srv);
- cx->state = HTS_RSLV;
- return 0;
- case HTS_RSLV:
- cx->state = HTS_CONN;
- cx->last = now;
- return 0;
- case HTS_CONN:
- if(cx->fd == PERROR)
- {
- cx->fd = socket(AF_INET, SOCK_STREAM, 0);
- if(cx->fd == PERROR)
- goto fail;
- cx->fdhost = mystrdup(cx->host);
+ switch (cx->state)
+ {
+ case HTS_STRT:
+ dns = getserv(cx->host);
+ srv = getport(cx->host);
+ if (resolve(dns, srv, &cx->addr))
+ {
+ free(dns);
+ free(srv);
+ cx->state = HTS_DONE;
+ cx->ret = 602;
+ return 1;
+ }
+ free(dns);
+ free(srv);
+ cx->state = HTS_RSLV;
+ return 0;
+ case HTS_RSLV:
+ cx->state = HTS_CONN;
+ cx->last = now;
+ return 0;
+ case HTS_CONN:
+ if (cx->fd == PERROR)
+ {
+ cx->fd = socket(AF_INET, SOCK_STREAM, 0);
+ if (cx->fd == PERROR)
+ goto fail;
+ cx->fdhost = mystrdup(cx->host);
#ifdef WIN32
- tmp2 = 1;
- if(ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR)
- goto fail;
+ tmp2 = 1;
+ if (ioctlsocket(cx->fd, FIONBIO, &tmp2) == SOCKET_ERROR)
+ goto fail;
#else
- tmp = fcntl(cx->fd, F_GETFL);
- if(tmp < 0)
- goto fail;
- if(fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0)
- goto fail;
+ tmp = fcntl(cx->fd, F_GETFL);
+ if (tmp < 0)
+ goto fail;
+ if (fcntl(cx->fd, F_SETFL, tmp|O_NONBLOCK) < 0)
+ goto fail;
#endif
- }
- if(!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr)))
- cx->state = HTS_IDLE;
+ }
+ if (!connect(cx->fd, (struct sockaddr *)&cx->addr, sizeof(cx->addr)))
+ cx->state = HTS_IDLE;
#ifdef WIN32
- else if(PERRNO==WSAEISCONN)
- cx->state = HTS_IDLE;
+ else if (PERRNO==WSAEISCONN)
+ cx->state = HTS_IDLE;
#endif
#ifdef MACOSX
- else if(PERRNO==EISCONN)
- cx->state = HTS_IDLE;
+ else if (PERRNO==EISCONN)
+ cx->state = HTS_IDLE;
#endif
- else if(PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY
+ else if (PERRNO!=PEINPROGRESS && PERRNO!=PEALREADY
#ifdef WIN32
- && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL
+ && PERRNO!=PEAGAIN && PERRNO!=WSAEINVAL
#endif
- )
- goto fail;
- if(now-cx->last>http_timeout)
- goto timeout;
- return 0;
- case HTS_IDLE:
- if(cx->txdl)
- {
- // generate POST
- cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen);
- cx->tptr = 0;
- cx->tlen = 0;
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path);
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host);
- if(!cx->keep)
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n");
- if(cx->thdr)
- {
- memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen);
- cx->tlen += cx->thlen;
- free(cx->thdr);
- cx->thdr = NULL;
- cx->thlen = 0;
- }
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl);
+ )
+ goto fail;
+ if (now-cx->last>http_timeout)
+ goto timeout;
+ return 0;
+ case HTS_IDLE:
+ if (cx->txdl)
+ {
+ // generate POST
+ cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 121 + cx->txdl + cx->thlen);
+ cx->tptr = 0;
+ cx->tlen = 0;
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "POST %s HTTP/1.1\n", cx->path);
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host);
+ if (!cx->keep)
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n");
+ if (cx->thdr)
+ {
+ memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen);
+ cx->tlen += cx->thlen;
+ free(cx->thdr);
+ cx->thdr = NULL;
+ cx->thlen = 0;
+ }
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "Content-Length: %d\n", cx->txdl);
#ifdef BETA
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
#else
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
#endif
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n");
- memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl);
- cx->tlen += cx->txdl;
- free(cx->txd);
- cx->txd = NULL;
- cx->txdl = 0;
- }
- else
- {
- // generate GET
- cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen);
- cx->tptr = 0;
- cx->tlen = 0;
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path);
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host);
- if(cx->thdr)
- {
- memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen);
- cx->tlen += cx->thlen;
- free(cx->thdr);
- cx->thdr = NULL;
- cx->thlen = 0;
- }
- if(!cx->keep)
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n");
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n");
+ memcpy(cx->tbuf+cx->tlen, cx->txd, cx->txdl);
+ cx->tlen += cx->txdl;
+ free(cx->txd);
+ cx->txd = NULL;
+ cx->txdl = 0;
+ }
+ else
+ {
+ // generate GET
+ cx->tbuf = malloc(strlen(cx->host) + strlen(cx->path) + 89 + cx->thlen);
+ cx->tptr = 0;
+ cx->tlen = 0;
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "GET %s HTTP/1.1\n", cx->path);
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "Host: %s\n", cx->host);
+ if (cx->thdr)
+ {
+ memcpy(cx->tbuf+cx->tlen, cx->thdr, cx->thlen);
+ cx->tlen += cx->thlen;
+ free(cx->thdr);
+ cx->thdr = NULL;
+ cx->thlen = 0;
+ }
+ if (!cx->keep)
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "Connection: close\n");
#ifdef BETA
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dB%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
#else
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "X-Powder-Version: %s%dS%d\n", IDENT_VERSION, SAVE_VERSION, MINOR_VERSION);
#endif
- cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n");
- }
- cx->state = HTS_XMIT;
- cx->last = now;
- return 0;
- case HTS_XMIT:
- tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0);
- if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR)
- goto fail;
- if(tmp!=PERROR)
- {
- cx->tptr += tmp;
- if(cx->tptr == cx->tlen)
- {
- cx->tptr = 0;
- cx->tlen = 0;
- if(cx->tbuf)
- free(cx->tbuf);
- cx->state = HTS_RECV;
- }
- cx->last = now;
- }
- if(now-cx->last>http_timeout)
- goto timeout;
- return 0;
- case HTS_RECV:
- tmp = recv(cx->fd, buf, CHUNK, 0);
- if(tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR)
- goto fail;
- if(tmp!=PERROR)
- {
- for(i=0; i<tmp; i++)
- {
- process_byte(cx, buf[i]);
- if(cx->state == HTS_DONE)
- return 1;
- }
- cx->last = now;
- }
- if(now-cx->last>http_timeout)
- goto timeout;
- return 0;
- case HTS_DONE:
- return 1;
- }
- return 0;
+ cx->tlen += sprintf(cx->tbuf+cx->tlen, "\n");
+ }
+ cx->state = HTS_XMIT;
+ cx->last = now;
+ return 0;
+ case HTS_XMIT:
+ tmp = send(cx->fd, cx->tbuf+cx->tptr, cx->tlen-cx->tptr, 0);
+ if (tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR)
+ goto fail;
+ if (tmp!=PERROR)
+ {
+ cx->tptr += tmp;
+ if (cx->tptr == cx->tlen)
+ {
+ cx->tptr = 0;
+ cx->tlen = 0;
+ if (cx->tbuf)
+ free(cx->tbuf);
+ cx->state = HTS_RECV;
+ }
+ cx->last = now;
+ }
+ if (now-cx->last>http_timeout)
+ goto timeout;
+ return 0;
+ case HTS_RECV:
+ tmp = recv(cx->fd, buf, CHUNK, 0);
+ if (tmp==PERROR && PERRNO!=PEAGAIN && PERRNO!=PEINTR)
+ goto fail;
+ if (tmp!=PERROR)
+ {
+ for (i=0; i<tmp; i++)
+ {
+ process_byte(cx, buf[i]);
+ if (cx->state == HTS_DONE)
+ return 1;
+ }
+ cx->last = now;
+ }
+ if (now-cx->last>http_timeout)
+ goto timeout;
+ return 0;
+ case HTS_DONE:
+ return 1;
+ }
+ return 0;
fail:
- cx->ret = 600;
- cx->state = HTS_DONE;
- return 1;
+ cx->ret = 600;
+ cx->state = HTS_DONE;
+ return 1;
timeout:
- cx->ret = 605;
- cx->state = HTS_DONE;
- return 1;
+ cx->ret = 605;
+ cx->state = HTS_DONE;
+ return 1;
}
char *http_async_req_stop(void *ctx, int *ret, int *len)
{
- struct http_ctx *cx = ctx;
- char *rxd;
+ struct http_ctx *cx = ctx;
+ char *rxd;
- if(cx->state != HTS_DONE)
- while(!http_async_req_status(ctx)) ;
+ if (cx->state != HTS_DONE)
+ while (!http_async_req_status(ctx)) ;
- if(cx->host)
- {
- free(cx->host);
- cx->host = NULL;
- }
- if(cx->path)
- {
- free(cx->path);
- cx->path = NULL;
- }
- if(cx->txd)
- {
- free(cx->txd);
- cx->txd = NULL;
- cx->txdl = 0;
- }
- if(cx->hbuf)
- {
- free(cx->hbuf);
- cx->hbuf = NULL;
- }
- if(cx->thdr)
- {
- free(cx->thdr);
- cx->thdr = NULL;
- cx->thlen = 0;
- }
+ if (cx->host)
+ {
+ free(cx->host);
+ cx->host = NULL;
+ }
+ if (cx->path)
+ {
+ free(cx->path);
+ cx->path = NULL;
+ }
+ if (cx->txd)
+ {
+ free(cx->txd);
+ cx->txd = NULL;
+ cx->txdl = 0;
+ }
+ if (cx->hbuf)
+ {
+ free(cx->hbuf);
+ cx->hbuf = NULL;
+ }
+ if (cx->thdr)
+ {
+ free(cx->thdr);
+ cx->thdr = NULL;
+ cx->thlen = 0;
+ }
- if(ret)
- *ret = cx->ret;
- if(len)
- *len = cx->rptr;
- if(cx->rbuf)
- cx->rbuf[cx->rptr] = 0;
- rxd = cx->rbuf;
- cx->rbuf = NULL;
- cx->rlen = 0;
- cx->rptr = 0;
- cx->contlen = 0;
+ if (ret)
+ *ret = cx->ret;
+ if (len)
+ *len = cx->rptr;
+ if (cx->rbuf)
+ cx->rbuf[cx->rptr] = 0;
+ rxd = cx->rbuf;
+ cx->rbuf = NULL;
+ cx->rlen = 0;
+ cx->rptr = 0;
+ cx->contlen = 0;
- if(!cx->keep)
- http_async_req_close(ctx);
- else if(cx->cclose)
- {
- PCLOSE(cx->fd);
- cx->fd = PERROR;
- if(cx->fdhost)
- {
- free(cx->fdhost);
- cx->fdhost = NULL;
- }
- cx->state = HTS_STRT;
- }
- else
- cx->state = HTS_IDLE;
+ if (!cx->keep)
+ http_async_req_close(ctx);
+ else if (cx->cclose)
+ {
+ PCLOSE(cx->fd);
+ cx->fd = PERROR;
+ if (cx->fdhost)
+ {
+ free(cx->fdhost);
+ cx->fdhost = NULL;
+ }
+ cx->state = HTS_STRT;
+ }
+ else
+ cx->state = HTS_IDLE;
- return rxd;
+ return rxd;
}
void http_async_get_length(void *ctx, int *total, int *done)
{
- struct http_ctx *cx = ctx;
- if(done)
- *done = cx->rptr;
- if(total)
- *total = cx->contlen;
+ struct http_ctx *cx = ctx;
+ if (done)
+ *done = cx->rptr;
+ if (total)
+ *total = cx->contlen;
}
void http_async_req_close(void *ctx)
{
- struct http_ctx *cx = ctx;
- void *tmp;
- if(cx->host)
- {
- cx->keep = 1;
- tmp = http_async_req_stop(ctx, NULL, NULL);
- if(tmp)
- free(tmp);
- }
- if(cx->fdhost)
- free(cx->fdhost);
- PCLOSE(cx->fd);
- free(ctx);
+ struct http_ctx *cx = ctx;
+ void *tmp;
+ if (cx->host)
+ {
+ cx->keep = 1;
+ tmp = http_async_req_stop(ctx, NULL, NULL);
+ if (tmp)
+ free(tmp);
+ }
+ if (cx->fdhost)
+ free(cx->fdhost);
+ PCLOSE(cx->fd);
+ free(ctx);
}
char *http_simple_get(char *uri, int *ret, int *len)
{
- void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0);
- if(!ctx)
- {
- if(ret)
- *ret = 600;
- if(len)
- *len = 0;
- return NULL;
- }
- return http_async_req_stop(ctx, ret, len);
+ void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0);
+ if (!ctx)
+ {
+ if (ret)
+ *ret = 600;
+ if (len)
+ *len = 0;
+ return NULL;
+ }
+ return http_async_req_stop(ctx, ret, len);
}
static char hex[] = "0123456789abcdef";
void http_auth_headers(void *ctx, char *user, char *pass)
{
- char *tmp;
- int i;
- unsigned char hash[16];
- unsigned int m;
- struct md5_context md5;
+ char *tmp;
+ int i;
+ unsigned char hash[16];
+ unsigned int m;
+ struct md5_context md5;
- if(user)
- {
- http_async_add_header(ctx, "X-Auth-User", user);
- if(pass)
- {
- md5_init(&md5);
- md5_update(&md5, (unsigned char *)user, strlen(user));
- md5_update(&md5, (unsigned char *)"-", 1);
- m = 0;
+ if (user)
+ {
+ http_async_add_header(ctx, "X-Auth-User", user);
+ if (pass)
+ {
+ md5_init(&md5);
+ md5_update(&md5, (unsigned char *)user, strlen(user));
+ md5_update(&md5, (unsigned char *)"-", 1);
+ m = 0;
- md5_update(&md5, (unsigned char *)pass, strlen(pass));
- md5_final(hash, &md5);
- tmp = malloc(33);
- for(i=0; i<16; i++)
- {
- tmp[i*2] = hex[hash[i]>>4];
- tmp[i*2+1] = hex[hash[i]&15];
- }
- tmp[32] = 0;
- http_async_add_header(ctx, "X-Auth-Hash", tmp);
- free(tmp);
- }
- }
+ md5_update(&md5, (unsigned char *)pass, strlen(pass));
+ md5_final(hash, &md5);
+ tmp = malloc(33);
+ for (i=0; i<16; i++)
+ {
+ tmp[i*2] = hex[hash[i]>>4];
+ tmp[i*2+1] = hex[hash[i]&15];
+ }
+ tmp[32] = 0;
+ http_async_add_header(ctx, "X-Auth-Hash", tmp);
+ free(tmp);
+ }
+ }
}
char *http_auth_get(char *uri, char *user, char *pass, int *ret, int *len)
{
- void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0);
+ void *ctx = http_async_req_start(NULL, uri, NULL, 0, 0);
- if(!ctx)
- {
- if(ret)
- *ret = 600;
- if(len)
- *len = 0;
- return NULL;
- }
- return http_async_req_stop(ctx, ret, len);
+ if (!ctx)
+ {
+ if (ret)
+ *ret = 600;
+ if (len)
+ *len = 0;
+ return NULL;
+ }
+ return http_async_req_stop(ctx, ret, len);
}
char *http_simple_post(char *uri, char *data, int dlen, int *ret, int *len)
{
- void *ctx = http_async_req_start(NULL, uri, data, dlen, 0);
- if(!ctx)
- {
- if(ret)
- *ret = 600;
- if(len)
- *len = 0;
- return NULL;
- }
- return http_async_req_stop(ctx, ret, len);
+ void *ctx = http_async_req_start(NULL, uri, data, dlen, 0);
+ if (!ctx)
+ {
+ if (ret)
+ *ret = 600;
+ if (len)
+ *len = 0;
+ return NULL;
+ }
+ return http_async_req_stop(ctx, ret, len);
}
char *http_ret_text(int ret)
{
- switch(ret)
- {
- case 100:
- return "Continue";
- case 101:
- return "Switching Protocols";
- case 102:
- return "Processing";
+ switch (ret)
+ {
+ case 100:
+ return "Continue";
+ case 101:
+ return "Switching Protocols";
+ case 102:
+ return "Processing";
- case 200:
- return "OK";
- case 201:
- return "Created";
- case 202:
- return "Accepted";
- case 203:
- return "Non-Authoritative Information";
- case 204:
- return "No Content";
- case 205:
- return "Reset Content";
- case 206:
- return "Partial Content";
- case 207:
- return "Multi-Status";
+ case 200:
+ return "OK";
+ case 201:
+ return "Created";
+ case 202:
+ return "Accepted";
+ case 203:
+ return "Non-Authoritative Information";
+ case 204:
+ return "No Content";
+ case 205:
+ return "Reset Content";
+ case 206:
+ return "Partial Content";
+ case 207:
+ return "Multi-Status";
- case 300:
- return "Multiple Choices";
- case 301:
- return "Moved Permanently";
- case 302:
- return "Found";
- case 303:
- return "See Other";
- case 304:
- return "Not Modified";
- case 305:
- return "Use Proxy";
- case 306:
- return "Switch Proxy";
- case 307:
- return "Temporary Redirect";
+ case 300:
+ return "Multiple Choices";
+ case 301:
+ return "Moved Permanently";
+ case 302:
+ return "Found";
+ case 303:
+ return "See Other";
+ case 304:
+ return "Not Modified";
+ case 305:
+ return "Use Proxy";
+ case 306:
+ return "Switch Proxy";
+ case 307:
+ return "Temporary Redirect";
- case 400:
- return "Bad Request";
- case 401:
- return "Unauthorized";
- case 402:
- return "Payment Required";
- case 403:
- return "Forbidden";
- case 404:
- return "Not Found";
- case 405:
- return "Method Not Allowed";
- case 406:
- return "Not Acceptable";
- case 407:
- return "Proxy Authentication Required";
- case 408:
- return "Request Timeout";
- case 409:
- return "Conflict";
- case 410:
- return "Gone";
- case 411:
- return "Length Required";
- case 412:
- return "Precondition Failed";
- case 413:
- return "Request Entity Too Large";
- case 414:
- return "Request URI Too Long";
- case 415:
- return "Unsupported Media Type";
- case 416:
- return "Requested Range Not Satisfiable";
- case 417:
- return "Expectation Failed";
- case 422:
- return "Unprocessable Entity";
- case 423:
- return "Locked";
- case 424:
- return "Failed Dependency";
- case 425:
- return "Unordered Collection";
- case 426:
- return "Upgrade Required";
+ case 400:
+ return "Bad Request";
+ case 401:
+ return "Unauthorized";
+ case 402:
+ return "Payment Required";
+ case 403:
+ return "Forbidden";
+ case 404:
+ return "Not Found";
+ case 405:
+ return "Method Not Allowed";
+ case 406:
+ return "Not Acceptable";
+ case 407:
+ return "Proxy Authentication Required";
+ case 408:
+ return "Request Timeout";
+ case 409:
+ return "Conflict";
+ case 410:
+ return "Gone";
+ case 411:
+ return "Length Required";
+ case 412:
+ return "Precondition Failed";
+ case 413:
+ return "Request Entity Too Large";
+ case 414:
+ return "Request URI Too Long";
+ case 415:
+ return "Unsupported Media Type";
+ case 416:
+ return "Requested Range Not Satisfiable";
+ case 417:
+ return "Expectation Failed";
+ case 422:
+ return "Unprocessable Entity";
+ case 423:
+ return "Locked";
+ case 424:
+ return "Failed Dependency";
+ case 425:
+ return "Unordered Collection";
+ case 426:
+ return "Upgrade Required";
- case 500:
- return "Internal Server Error";
- case 501:
- return "Not Implemented";
- case 502:
- return "Bad Gateway";
- case 503:
- return "Service Unavailable";
- case 504:
- return "Gateway Timeout";
- case 505:
- return "HTTP Version Not Supported";
- case 506:
- return "Variant Also Negotiates";
- case 507:
- return "Insufficient Storage";
- case 509:
- return "Bandwidth Limit Exceeded";
- case 510:
- return "Not Extended";
+ case 500:
+ return "Internal Server Error";
+ case 501:
+ return "Not Implemented";
+ case 502:
+ return "Bad Gateway";
+ case 503:
+ return "Service Unavailable";
+ case 504:
+ return "Gateway Timeout";
+ case 505:
+ return "HTTP Version Not Supported";
+ case 506:
+ return "Variant Also Negotiates";
+ case 507:
+ return "Insufficient Storage";
+ case 509:
+ return "Bandwidth Limit Exceeded";
+ case 510:
+ return "Not Extended";
- case 600:
- return "Internal Client Error";
- case 601:
- return "Unsupported Protocol";
- case 602:
- return "Server Not Found";
- case 603:
- return "Malformed Response";
- case 604:
- return "Network Not Available";
- case 605:
- return "Request Timed Out";
- default:
- return "Unknown Status Code";
- }
+ case 600:
+ return "Internal Client Error";
+ case 601:
+ return "Unsupported Protocol";
+ case 602:
+ return "Server Not Found";
+ case 603:
+ return "Malformed Response";
+ case 604:
+ return "Network Not Available";
+ case 605:
+ return "Request Timed Out";
+ default:
+ return "Unknown Status Code";
+ }
}
char *http_multipart_post(char *uri, char **names, char **parts, int *plens, char *user, char *pass, int *ret, int *len)
{
- void *ctx;
- char *data = NULL, *tmp, *p;
- int dlen = 0, i, j;
- unsigned char hash[16];
- unsigned char boundary[32], ch;
- int blen = 0;
- unsigned int map[62], m;
- struct md5_context md5;
- //struct md5_context md52;
- int own_plen = 0;
+ void *ctx;
+ char *data = NULL, *tmp, *p;
+ int dlen = 0, i, j;
+ unsigned char hash[16];
+ unsigned char boundary[32], ch;
+ int blen = 0;
+ unsigned int map[62], m;
+ struct md5_context md5;
+ //struct md5_context md52;
+ int own_plen = 0;
- if(names)
- {
- if(!plens)
- {
- own_plen = 1;
- for(i=0; names[i]; i++) ;
- plens = calloc(i, sizeof(int));
- for(i=0; names[i]; i++)
- plens[i] = strlen(parts[i]);
- }
+ if (names)
+ {
+ if (!plens)
+ {
+ own_plen = 1;
+ for (i=0; names[i]; i++) ;
+ plens = calloc(i, sizeof(int));
+ for (i=0; names[i]; i++)
+ plens[i] = strlen(parts[i]);
+ }
retry:
- if(blen >= 31)
- goto fail;
- memset(map, 0, 62*sizeof(int));
- for(i=0; names[i]; i++)
- {
- for(j=0; j<plens[i]-blen; j++)
- if(!blen || !memcmp(parts[i]+j, boundary, blen))
- {
- ch = parts[i][j+blen];
- if(ch>='0' && ch<='9')
- map[ch-'0']++;
- else if(ch>='A' && ch<='Z')
- map[ch-'A'+10]++;
- else if(ch>='a' && ch<='z')
- map[ch-'a'+36]++;
- }
- }
- m = ~0;
- j = 61;
- for(i=0; i<62; i++)
- if(map[i]<m)
- {
- m = map[i];
- j = i;
- }
- if(j<10)
- boundary[blen] = '0'+j;
- else if(j<36)
- boundary[blen] = 'A'+(j-10);
- else
- boundary[blen] = 'a'+(j-36);
- blen++;
- if(map[j])
- goto retry;
- boundary[blen] = 0;
+ if (blen >= 31)
+ goto fail;
+ memset(map, 0, 62*sizeof(int));
+ for (i=0; names[i]; i++)
+ {
+ for (j=0; j<plens[i]-blen; j++)
+ if (!blen || !memcmp(parts[i]+j, boundary, blen))
+ {
+ ch = parts[i][j+blen];
+ if (ch>='0' && ch<='9')
+ map[ch-'0']++;
+ else if (ch>='A' && ch<='Z')
+ map[ch-'A'+10]++;
+ else if (ch>='a' && ch<='z')
+ map[ch-'a'+36]++;
+ }
+ }
+ m = ~0;
+ j = 61;
+ for (i=0; i<62; i++)
+ if (map[i]<m)
+ {
+ m = map[i];
+ j = i;
+ }
+ if (j<10)
+ boundary[blen] = '0'+j;
+ else if (j<36)
+ boundary[blen] = 'A'+(j-10);
+ else
+ boundary[blen] = 'a'+(j-36);
+ blen++;
+ if (map[j])
+ goto retry;
+ boundary[blen] = 0;
- for(i=0; names[i]; i++)
- dlen += blen+strlen(names[i])+plens[i]+128;
- dlen += blen+8;
- data = malloc(dlen);
- dlen = 0;
- for(i=0; names[i]; i++)
- {
- dlen += sprintf(data+dlen, "--%s\r\n", boundary);
- dlen += sprintf(data+dlen, "Content-transfer-encoding: binary\r\n");
- if(strchr(names[i], ':'))
- {
- tmp = mystrdup(names[i]);
- p = strchr(tmp, ':');
- *p = 0;
- dlen += sprintf(data+dlen, "content-disposition: form-data; name=\"%s\"; ", tmp);
- free(tmp);
- p = strchr(names[i], ':');
- dlen += sprintf(data+dlen, "filename=\"%s\"\r\n\r\n", p+1);
- }
- else
- dlen += sprintf(data+dlen, "content-disposition: form-data; name=\"%s\"\r\n\r\n", names[i]);
- memcpy(data+dlen, parts[i], plens[i]);
- dlen += plens[i];
- dlen += sprintf(data+dlen, "\r\n");
- }
- dlen += sprintf(data+dlen, "--%s--\r\n", boundary);
- }
+ for (i=0; names[i]; i++)
+ dlen += blen+strlen(names[i])+plens[i]+128;
+ dlen += blen+8;
+ data = malloc(dlen);
+ dlen = 0;
+ for (i=0; names[i]; i++)
+ {
+ dlen += sprintf(data+dlen, "--%s\r\n", boundary);
+ dlen += sprintf(data+dlen, "Content-transfer-encoding: binary\r\n");
+ if (strchr(names[i], ':'))
+ {
+ tmp = mystrdup(names[i]);
+ p = strchr(tmp, ':');
+ *p = 0;
+ dlen += sprintf(data+dlen, "content-disposition: form-data; name=\"%s\"; ", tmp);
+ free(tmp);
+ p = strchr(names[i], ':');
+ dlen += sprintf(data+dlen, "filename=\"%s\"\r\n\r\n", p+1);
+ }
+ else
+ dlen += sprintf(data+dlen, "content-disposition: form-data; name=\"%s\"\r\n\r\n", names[i]);
+ memcpy(data+dlen, parts[i], plens[i]);
+ dlen += plens[i];
+ dlen += sprintf(data+dlen, "\r\n");
+ }
+ dlen += sprintf(data+dlen, "--%s--\r\n", boundary);
+ }
- ctx = http_async_req_start(NULL, uri, data, dlen, 0);
- if(!ctx)
- goto fail;
+ ctx = http_async_req_start(NULL, uri, data, dlen, 0);
+ if (!ctx)
+ goto fail;
- if(user)
- {
- http_async_add_header(ctx, "X-Auth-User", user);
- if(pass)
- {
- md5_init(&md5);
- md5_update(&md5, (unsigned char *)user, strlen(user));
- md5_update(&md5, (unsigned char *)"-", 1);
- m = 0;
- if(names)
- {
- for(i=0; names[i]; i++)
- {
- //md5_update(&md5, (unsigned char *)parts[i], plens[i]); //WHY?
- //md5_update(&md5, (unsigned char *)"-", 1);
- p = strchr(names[i], ':');
- if(p)
- m += (p - names[i]) + 1;
- else
- m += strlen(names[i])+1;
- }
+ if (user)
+ {
+ http_async_add_header(ctx, "X-Auth-User", user);
+ if (pass)
+ {
+ md5_init(&md5);
+ md5_update(&md5, (unsigned char *)user, strlen(user));
+ md5_update(&md5, (unsigned char *)"-", 1);
+ m = 0;
+ if (names)
+ {
+ for (i=0; names[i]; i++)
+ {
+ //md5_update(&md5, (unsigned char *)parts[i], plens[i]); //WHY?
+ //md5_update(&md5, (unsigned char *)"-", 1);
+ p = strchr(names[i], ':');
+ if (p)
+ m += (p - names[i]) + 1;
+ else
+ m += strlen(names[i])+1;
+ }
- tmp = malloc(m);
- m = 0;
- for(i=0; names[i]; i++)
- {
- p = strchr(names[i], ':');
- if(m)
- {
- tmp[m] = ' ';
- m ++;
- }
- if(p)
- {
- memcpy(tmp+m, names[i], p-names[i]);
- m += p - names[i];
- }
- else
- {
- strcpy(tmp+m, names[i]);
- m += strlen(names[i]);
- }
- }
- tmp[m] = 0;
- http_async_add_header(ctx, "X-Auth-Objects", tmp);
- free(tmp);
- }
+ tmp = malloc(m);
+ m = 0;
+ for (i=0; names[i]; i++)
+ {
+ p = strchr(names[i], ':');
+ if (m)
+ {
+ tmp[m] = ' ';
+ m ++;
+ }
+ if (p)
+ {
+ memcpy(tmp+m, names[i], p-names[i]);
+ m += p - names[i];
+ }
+ else
+ {
+ strcpy(tmp+m, names[i]);
+ m += strlen(names[i]);
+ }
+ }
+ tmp[m] = 0;
+ http_async_add_header(ctx, "X-Auth-Objects", tmp);
+ free(tmp);
+ }
- md5_update(&md5, (unsigned char *)pass, strlen(pass));
- md5_final(hash, &md5);
- tmp = malloc(33);
- for(i=0; i<16; i++)
- {
- tmp[i*2] = hex[hash[i]>>4];
- tmp[i*2+1] = hex[hash[i]&15];
- }
- tmp[32] = 0;
- http_async_add_header(ctx, "X-Auth-Hash", tmp);
- free(tmp);
- }
- }
+ md5_update(&md5, (unsigned char *)pass, strlen(pass));
+ md5_final(hash, &md5);
+ tmp = malloc(33);
+ for (i=0; i<16; i++)
+ {
+ tmp[i*2] = hex[hash[i]>>4];
+ tmp[i*2+1] = hex[hash[i]&15];
+ }
+ tmp[32] = 0;
+ http_async_add_header(ctx, "X-Auth-Hash", tmp);
+ free(tmp);
+ }
+ }
- if(data)
- {
- tmp = malloc(32+strlen((char *)boundary));
- sprintf(tmp, "multipart/form-data, boundary=%s", boundary);
- http_async_add_header(ctx, "Content-type", tmp);
- free(tmp);
- free(data);
- }
+ if (data)
+ {
+ tmp = malloc(32+strlen((char *)boundary));
+ sprintf(tmp, "multipart/form-data, boundary=%s", boundary);
+ http_async_add_header(ctx, "Content-type", tmp);
+ free(tmp);
+ free(data);
+ }
- if(own_plen)
- free(plens);
- return http_async_req_stop(ctx, ret, len);
+ if (own_plen)
+ free(plens);
+ return http_async_req_stop(ctx, ret, len);
fail:
- if(data)
- free(data);
- if(own_plen)
- free(plens);
- if(ret)
- *ret = 600;
- if(len)
- *len = 0;
- return NULL;
+ if (data)
+ free(data);
+ if (own_plen)
+ free(plens);
+ if (ret)
+ *ret = 600;
+ if (len)
+ *len = 0;
+ return NULL;
}