Improved api_build_http_request implementation.
This commit is contained in:
parent
90262ef657
commit
395eb4f031
2 changed files with 54 additions and 7 deletions
57
core/api.c
57
core/api.c
|
@ -341,8 +341,42 @@ struct ApiConnectionParam {
|
||||||
struct HttpRequest* api_build_http_request(struct s_request* req) {
|
struct HttpRequest* api_build_http_request(struct s_request* req) {
|
||||||
struct HttpRequest* request = ipfs_core_http_request_new();
|
struct HttpRequest* request = ipfs_core_http_request_new();
|
||||||
if (request != NULL) {
|
if (request != NULL) {
|
||||||
request->command = req->buf + req->method;
|
char *segs = malloc (strlen(req->buf + req->request) + 1);
|
||||||
//TODO: Complete this method
|
if (segs) {
|
||||||
|
strcpy(segs, req->buf + req->request);
|
||||||
|
request->command = segs;
|
||||||
|
segs = strchr(segs, '/');
|
||||||
|
if (segs) {
|
||||||
|
*segs++ = '\0';
|
||||||
|
request->sub_command = segs; // sub_command can contain another level as filters/add
|
||||||
|
}
|
||||||
|
if (req->query) {
|
||||||
|
segs = malloc (strlen(req->buf + req->query) + 1);
|
||||||
|
if (segs) {
|
||||||
|
strcpy(segs, req->buf + req->query);
|
||||||
|
while (segs) {
|
||||||
|
char *value, *name = segs;
|
||||||
|
segs = strchr(segs, '&');
|
||||||
|
if (segs) { // calc next to split before search for = on another parameter.
|
||||||
|
*segs++ = '\0';
|
||||||
|
}
|
||||||
|
|
||||||
|
value = strchr(name, '=');
|
||||||
|
if (value) { // with = assuming params.
|
||||||
|
struct HttpParam *hp = ipfs_core_http_param_new();
|
||||||
|
if (hp) {
|
||||||
|
*value++ = '\0';
|
||||||
|
hp->name = name;
|
||||||
|
hp->value = value;
|
||||||
|
libp2p_utils_vector_add(request->params, hp);
|
||||||
|
}
|
||||||
|
} else { // without =, assuming arguments
|
||||||
|
libp2p_utils_vector_add(request->arguments, name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return request;
|
return request;
|
||||||
}
|
}
|
||||||
|
@ -404,6 +438,13 @@ void *api_connection_thread (void *ptr)
|
||||||
}
|
}
|
||||||
*p++ = '\0'; // End of method.
|
*p++ = '\0'; // End of method.
|
||||||
req.path = p - req.buf;
|
req.path = p - req.buf;
|
||||||
|
if (strchr(p, '?')) {
|
||||||
|
p = strchr(p, '?');
|
||||||
|
*p++ = '\0';
|
||||||
|
req.query = p - req.buf;
|
||||||
|
} else {
|
||||||
|
req.query = 0;
|
||||||
|
}
|
||||||
p = strchr(p, ' ');
|
p = strchr(p, ' ');
|
||||||
if (!p) {
|
if (!p) {
|
||||||
libp2p_logger_error("api", "fail looking for space on path '%s'.\n", req.buf + req.path);
|
libp2p_logger_error("api", "fail looking for space on path '%s'.\n", req.buf + req.path);
|
||||||
|
@ -435,12 +476,11 @@ void *api_connection_thread (void *ptr)
|
||||||
}
|
}
|
||||||
|
|
||||||
// once we leave the building of the req struct, do we need to do more? This flag will tell us.
|
// once we leave the building of the req struct, do we need to do more? This flag will tell us.
|
||||||
int further_processing_necessary = 1;
|
int further_processing_necessary = 0;
|
||||||
|
|
||||||
if (strcmp(buf + req.method, "GET")==0) {
|
if (strcmp(buf + req.method, "GET")==0) {
|
||||||
|
if (strcmp (req.buf + req.path, "/")==0 ||
|
||||||
if (strcmp (req.buf + req.path, "/")==0 ||
|
strcmp (req.buf + req.path, "/webui")==0 ||
|
||||||
strcmp (req.buf + req.path, "/webui") ||
|
|
||||||
strcmp (req.buf + req.path, "/webui/")==0) {
|
strcmp (req.buf + req.path, "/webui/")==0) {
|
||||||
char *redir;
|
char *redir;
|
||||||
size_t size = sizeof(HTTP_301) + (sizeof(WEBUI_ADDR)*2);
|
size_t size = sizeof(HTTP_301) + (sizeof(WEBUI_ADDR)*2);
|
||||||
|
@ -454,8 +494,11 @@ void *api_connection_thread (void *ptr)
|
||||||
} else {
|
} else {
|
||||||
write_cstr (s, HTTP_500);
|
write_cstr (s, HTTP_500);
|
||||||
}
|
}
|
||||||
further_processing_necessary = 0;
|
} else if (cstrstart(req.buf + req.path, API_V0_START)) {
|
||||||
|
req.request = req.path + sizeof(API_V0_START) - 1;
|
||||||
|
further_processing_necessary = 1;
|
||||||
} else {
|
} else {
|
||||||
|
// TODO: handle download file here.
|
||||||
// move out of the if to do further processing
|
// move out of the if to do further processing
|
||||||
}
|
}
|
||||||
// end of GET
|
// end of GET
|
||||||
|
|
|
@ -31,6 +31,8 @@ struct s_request {
|
||||||
|
|
||||||
int method;
|
int method;
|
||||||
int path;
|
int path;
|
||||||
|
int request;
|
||||||
|
int query;
|
||||||
int http_ver;
|
int http_ver;
|
||||||
int header;
|
int header;
|
||||||
int body;
|
int body;
|
||||||
|
@ -39,6 +41,8 @@ struct s_request {
|
||||||
size_t boundary_size;
|
size_t boundary_size;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define API_V0_START "/api/v0/"
|
||||||
|
|
||||||
#define WEBUI_ADDR "/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/"
|
#define WEBUI_ADDR "/ipfs/QmPhnvn747LqwPYMJmQVorMaGbMSgA7mRRoyyZYz3DoZRQ/"
|
||||||
|
|
||||||
#define HTTP_301 "HTTP/1.1 301 Moved Permanently\r\n" \
|
#define HTTP_301 "HTTP/1.1 301 Moved Permanently\r\n" \
|
||||||
|
|
Loading…
Reference in a new issue