|
|
@ -44,10 +44,6 @@ http_client_read(int fd, short event, void *ctx) {
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
c->buffer = realloc(c->buffer, c->sz + ret);
|
|
|
|
|
|
|
|
memcpy(c->buffer + c->sz, buffer, ret);
|
|
|
|
|
|
|
|
c->sz += ret;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* TODO: http parse. */
|
|
|
|
/* TODO: http parse. */
|
|
|
|
nparsed = http_parser_execute(&c->parser, &c->settings, buffer, ret);
|
|
|
|
nparsed = http_parser_execute(&c->parser, &c->settings, buffer, ret);
|
|
|
|
if(c->parser.upgrade) {
|
|
|
|
if(c->parser.upgrade) {
|
|
|
@ -92,10 +88,6 @@ http_client_cleanup(struct http_client *c) {
|
|
|
|
free(c->qs_jsonp.s);
|
|
|
|
free(c->qs_jsonp.s);
|
|
|
|
memset(&c->qs_jsonp, 0, sizeof(str_t));
|
|
|
|
memset(&c->qs_jsonp, 0, sizeof(str_t));
|
|
|
|
|
|
|
|
|
|
|
|
free(c->buffer);
|
|
|
|
|
|
|
|
c->buffer = NULL;
|
|
|
|
|
|
|
|
c->sz = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
memset(&c->verb, 0, sizeof(c->verb));
|
|
|
|
memset(&c->verb, 0, sizeof(c->verb));
|
|
|
|
|
|
|
|
|
|
|
|
c->executing = 0;
|
|
|
|
c->executing = 0;
|
|
|
@ -118,7 +110,9 @@ http_client_keep_alive(struct http_client *c) {
|
|
|
|
/* check disconnection */
|
|
|
|
/* check disconnection */
|
|
|
|
int disconnect = 0;
|
|
|
|
int disconnect = 0;
|
|
|
|
|
|
|
|
|
|
|
|
if(c->parser.http_major == 1 && c->parser.http_minor == 0) {
|
|
|
|
if(c->parser.http_major == 0) {
|
|
|
|
|
|
|
|
disconnect = 1; /* No version given. */
|
|
|
|
|
|
|
|
} else if(c->parser.http_major == 1 && c->parser.http_minor == 0) {
|
|
|
|
disconnect = 1; /* HTTP 1.0: disconnect by default */
|
|
|
|
disconnect = 1; /* HTTP 1.0: disconnect by default */
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if(c->header_connection.s) {
|
|
|
|
if(c->header_connection.s) {
|
|
|
@ -192,7 +186,7 @@ http_crossdomain(struct http_client *c) {
|
|
|
|
"<allow-access-from domain=\"*\" />\n"
|
|
|
|
"<allow-access-from domain=\"*\" />\n"
|
|
|
|
"</cross-domain-policy>\n";
|
|
|
|
"</cross-domain-policy>\n";
|
|
|
|
|
|
|
|
|
|
|
|
http_response_init(&resp, 200, "OK");
|
|
|
|
http_response_init(c, &resp, 200, "OK");
|
|
|
|
|
|
|
|
|
|
|
|
http_response_set_header(&resp, "Content-Type", "application/xml");
|
|
|
|
http_response_set_header(&resp, "Content-Type", "application/xml");
|
|
|
|
sprintf(content_length, "%zd", sizeof(out)-1);
|
|
|
|
sprintf(content_length, "%zd", sizeof(out)-1);
|
|
|
@ -212,7 +206,7 @@ http_options(struct http_client *c) {
|
|
|
|
|
|
|
|
|
|
|
|
struct http_response resp;
|
|
|
|
struct http_response resp;
|
|
|
|
|
|
|
|
|
|
|
|
http_response_init(&resp, 200, "OK");
|
|
|
|
http_response_init(c, &resp, 200, "OK");
|
|
|
|
|
|
|
|
|
|
|
|
http_response_set_header(&resp, "Content-Type", "text/html");
|
|
|
|
http_response_set_header(&resp, "Content-Type", "text/html");
|
|
|
|
http_response_set_header(&resp, "Allow", "GET,POST,OPTIONS");
|
|
|
|
http_response_set_header(&resp, "Allow", "GET,POST,OPTIONS");
|
|
|
@ -288,13 +282,7 @@ http_send_reply(struct http_client *c, short code, const char *msg,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/* respond */
|
|
|
|
/* respond */
|
|
|
|
http_response_init(&resp, code, msg);
|
|
|
|
http_response_init(c, &resp, code, msg);
|
|
|
|
|
|
|
|
|
|
|
|
if(!http_client_keep_alive(c)) {
|
|
|
|
|
|
|
|
http_response_set_header(&resp, "Connection", "Close");
|
|
|
|
|
|
|
|
} else if(code == 200) {
|
|
|
|
|
|
|
|
http_response_set_header(&resp, "Connection", "Keep-Alive");
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
sprintf(content_length, "%zd", body_len);
|
|
|
|
sprintf(content_length, "%zd", body_len);
|
|
|
|
http_response_set_header(&resp, "Content-Length", content_length);
|
|
|
|
http_response_set_header(&resp, "Content-Length", content_length);
|
|
|
@ -416,13 +404,19 @@ http_on_query_string(http_parser *parser, const char *at, size_t length) {
|
|
|
|
|
|
|
|
|
|
|
|
/* HTTP Response */
|
|
|
|
/* HTTP Response */
|
|
|
|
void
|
|
|
|
void
|
|
|
|
http_response_init(struct http_response *r, int code, const char *msg) {
|
|
|
|
http_response_init(struct http_client *c, struct http_response *r, int code, const char *msg) {
|
|
|
|
|
|
|
|
|
|
|
|
memset(r, 0, sizeof(struct http_response));
|
|
|
|
memset(r, 0, sizeof(struct http_response));
|
|
|
|
r->code = code;
|
|
|
|
r->code = code;
|
|
|
|
r->msg = msg;
|
|
|
|
r->msg = msg;
|
|
|
|
|
|
|
|
|
|
|
|
http_response_set_header(r, "Server", "Webdis");
|
|
|
|
http_response_set_header(r, "Server", "Webdis");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if(!http_client_keep_alive(c)) {
|
|
|
|
|
|
|
|
http_response_set_header(r, "Connection", "Close");
|
|
|
|
|
|
|
|
} else if(code == 200) {
|
|
|
|
|
|
|
|
http_response_set_header(r, "Connection", "Keep-Alive");
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
void
|
|
|
|