Переглянути джерело

Rename callback type, add timeouts and and allow any http version in the

reply.
master
Richard Nyberg 18 роки тому
джерело
коміт
80dcfecbe5
2 змінених файлів з 13 додано та 11 видалено
  1. +11
    -9
      misc/http_client.c
  2. +2
    -2
      misc/http_client.h

+ 11
- 9
misc/http_client.c Переглянути файл

@@ -18,6 +18,8 @@
#include "subr.h"
#include "http_client.h"

#define TIMEOUT (& (struct timeval) { 45, 0 })

struct http_url *
http_url_parse(const char *url)
{
@@ -92,7 +94,7 @@ struct http_req {
struct http_url *url;
int sd;
struct event ev;
http_cb cb;
http_cb_t cb;
void *arg;
int cancel;

@@ -135,7 +137,7 @@ http_error(struct http_req *req)
static int
headers_parse(struct http_req *req, char *buf, char *end)
{
int code;
int code, majv, minv;
char *cur, *crlf;
char name[128], value[872];
struct http_response res;
@@ -143,7 +145,7 @@ headers_parse(struct http_req *req, char *buf, char *end)
req->chunked = 0;
req->length = -1;

if (sscanf(buf, "HTTP/1.1 %d", &code) == 0)
if (sscanf(buf, "HTTP/%d.%d %d", &majv, &minv, &code) != 3)
return 0;
res.type = HTTP_T_CODE;
res.v.code = code;
@@ -348,7 +350,7 @@ http_read_cb(int sd, short type, void *arg)
return;
req->state = HTTP_RECEIVE;
more:
if (event_add(&req->ev, NULL) != 0)
if (event_add(&req->ev, TIMEOUT) != 0)
http_error(req);
}

@@ -369,12 +371,12 @@ http_write_cb(int sd, short type, void *arg)
}
out:
if (req->buf->off != 0) {
if (event_add(&req->ev, NULL) != 0)
if (event_add(&req->ev, TIMEOUT) != 0)
goto error;
} else {
req->state = HTTP_RECEIVE;
event_set(&req->ev, req->sd, EV_READ, http_read_cb, req);
if (event_add(&req->ev, NULL) != 0)
if (event_add(&req->ev, TIMEOUT) != 0)
goto error;
}
return;
@@ -404,7 +406,7 @@ http_dnscb(int result, char type, int count, int ttl, void *addrs, void *arg)
&& errno != EINPROGRESS))
goto error;
event_set(&req->ev, req->sd, EV_WRITE, http_write_cb, req);
if (event_add(&req->ev, NULL) != 0)
if (event_add(&req->ev, TIMEOUT) != 0)
goto error;
} else
goto error;
@@ -415,8 +417,8 @@ error:
}

int
http_get(struct http_req **out, const char *url, const char *hdrs, http_cb cb,
void *arg)
http_get(struct http_req **out, const char *url, const char *hdrs,
http_cb_t cb, void *arg)
{
struct http_req *req = calloc(1, sizeof(*req));
if (req == NULL)


+ 2
- 2
misc/http_client.h Переглянути файл

@@ -27,12 +27,12 @@ struct http_url {

struct http_req;

typedef void (*http_cb)(struct http_req *, struct http_response *, void *);
typedef void (*http_cb_t)(struct http_req *, struct http_response *, void *);

struct http_url *http_url_parse(const char *url);
void http_url_free(struct http_url *url);
int http_get(struct http_req **out, const char *url, const char *hdrs,
http_cb cb, void *arg);
http_cb_t cb, void *arg);
void http_cancel(struct http_req *req);

#endif

Завантаження…
Відмінити
Зберегти