Added proper response types
This commit is contained in:
parent
469c825fff
commit
bc6ac9a1f4
68
main.c
68
main.c
|
@ -7,6 +7,9 @@
|
||||||
#include <mongoose.h>
|
#include <mongoose.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
|
|
||||||
|
|
||||||
|
#define ALLOC_ON_DEMAND 1
|
||||||
|
|
||||||
#define panic(...) { \
|
#define panic(...) { \
|
||||||
fprintf(stderr, "!PANIC! at %s:%d\n", __FILE__, __LINE__);\
|
fprintf(stderr, "!PANIC! at %s:%d\n", __FILE__, __LINE__);\
|
||||||
fprintf(stderr, __VA_ARGS__); \
|
fprintf(stderr, __VA_ARGS__); \
|
||||||
|
@ -19,12 +22,18 @@ typedef struct odd_block {
|
||||||
struct odd_block *next;
|
struct odd_block *next;
|
||||||
} OddBlock;
|
} OddBlock;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
RESPONSE_ODD,
|
||||||
|
RESPONSE_EVEN,
|
||||||
|
RESPONSE_NOT_FOUND
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
OddBlock *block_init(uint64_t start);
|
OddBlock *block_init(uint64_t start);
|
||||||
bool block_in_range(OddBlock blk, uint64_t value);
|
bool block_in_range(OddBlock blk, uint64_t value);
|
||||||
bool block_check(OddBlock blk, uint64_t value);
|
bool block_check(OddBlock blk, uint64_t value);
|
||||||
void block_add(OddBlock *blk);
|
void block_add(OddBlock *blk);
|
||||||
bool check_is_odd(uint64_t value);
|
int check_is_odd(uint64_t value);
|
||||||
inline uint64_t get_mem_usage(void);
|
inline uint64_t get_mem_usage(void);
|
||||||
inline double get_time(void);
|
inline double get_time(void);
|
||||||
|
|
||||||
|
@ -90,26 +99,35 @@ void block_add(OddBlock *blk) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool check_is_odd(uint64_t value) {
|
int check_is_odd(uint64_t value) {
|
||||||
for (OddBlock *blk = blocks_head; blk != NULL; blk = blk->next) {
|
for (OddBlock *blk = blocks_head; blk != NULL; blk = blk->next) {
|
||||||
if (block_in_range(*blk, value)) {
|
if (block_in_range(*blk, value)) {
|
||||||
return block_check(*blk, value);
|
return block_check(*blk, value) ? RESPONSE_ODD : RESPONSE_EVEN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#if ALLOC_ON_DEMAND
|
||||||
// no blocks with that number were found
|
// no blocks with that number were found
|
||||||
OddBlock *blk = block_init(value & ~0xFFFFFF);
|
OddBlock *blk = block_init(value & ~0xFFFFFF);
|
||||||
if (!blk) return false;
|
if (!blk) return RESPONSE_NOT_FOUND;
|
||||||
block_add(blk);
|
block_add(blk);
|
||||||
return block_check(*blk, value);
|
return block_check(*blk, value) ? RESPONSE_ODD : RESPONSE_EVEN;
|
||||||
|
#else
|
||||||
|
return RESPONSE_NOT_FOUND;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void api_handler(struct mg_connection *c, int ev, void *evd, void *fnd) {
|
void api_handler(struct mg_connection *c, int ev, void *evd, void *fnd) {
|
||||||
if (ev == MG_EV_HTTP_MSG) {
|
if (ev == MG_EV_HTTP_MSG) {
|
||||||
static char url[256];
|
static char url[256], method[32], addr[256];
|
||||||
struct mg_http_message *hm = evd;
|
struct mg_http_message *hm = evd;
|
||||||
memset(url, 0, 256);
|
memset(url, 0, 256); memcpy(url, hm->uri.ptr, hm->uri.len);
|
||||||
memcpy(url, hm->uri.ptr, hm->uri.len);
|
memset(method, 0, 32); memcpy(method, hm->method.ptr, hm->method.len);
|
||||||
|
mg_straddr(c, addr, 255);
|
||||||
|
|
||||||
|
printf("%-16s %-8s %s\n", addr, method, url);
|
||||||
|
|
||||||
if (mg_http_match_uri(hm, "/analytics")) {
|
if (mg_http_match_uri(hm, "/analytics")) {
|
||||||
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
|
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
|
||||||
"{"
|
"{"
|
||||||
|
@ -137,14 +155,38 @@ void api_handler(struct mg_connection *c, int ev, void *evd, void *fnd) {
|
||||||
} else if (mg_http_match_uri(hm, "/isEven/*")) {
|
} else if (mg_http_match_uri(hm, "/isEven/*")) {
|
||||||
uint64_t number;
|
uint64_t number;
|
||||||
sscanf(url, "/isEven/%zd", &number);
|
sscanf(url, "/isEven/%zd", &number);
|
||||||
bool res = !check_is_odd(number);
|
switch (check_is_odd(number)) {
|
||||||
mg_http_reply(c, 200, "", res ? "true" : "false");
|
case RESPONSE_NOT_FOUND:
|
||||||
|
mg_http_reply(c, 451, "Content-Type: application/json\r\n",
|
||||||
|
"{ \"message\": \"This number is not indexed yet.\" }");
|
||||||
|
break;
|
||||||
|
case RESPONSE_ODD:
|
||||||
|
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
|
||||||
|
"{ \"even\": false }");
|
||||||
|
break;
|
||||||
|
case RESPONSE_EVEN:
|
||||||
|
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
|
||||||
|
"{ \"even\": true }");
|
||||||
|
break;
|
||||||
|
}
|
||||||
n_requests++;
|
n_requests++;
|
||||||
} else if (mg_http_match_uri(hm, "/isOdd/*")) {
|
} else if (mg_http_match_uri(hm, "/isOdd/*")) {
|
||||||
uint64_t number;
|
uint64_t number;
|
||||||
sscanf(url, "/isOdd/%zd", &number);
|
sscanf(url, "/isOdd/%zd", &number);
|
||||||
bool res = check_is_odd(number);
|
switch (check_is_odd(number)) {
|
||||||
mg_http_reply(c, 200, "", res ? "true" : "false");
|
case RESPONSE_NOT_FOUND:
|
||||||
|
mg_http_reply(c, 451, "Content-Type: application/json\r\n",
|
||||||
|
"{ \"message\": \"This number is not indexed yet.\" }");
|
||||||
|
break;
|
||||||
|
case RESPONSE_ODD:
|
||||||
|
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
|
||||||
|
"{ \"odd\": true }");
|
||||||
|
break;
|
||||||
|
case RESPONSE_EVEN:
|
||||||
|
mg_http_reply(c, 200, "Content-Type: application/json\r\n",
|
||||||
|
"{ \"odd\": false }");
|
||||||
|
break;
|
||||||
|
}
|
||||||
n_requests++;
|
n_requests++;
|
||||||
} else if (mg_http_match_uri(hm, "/lastEven")) {
|
} else if (mg_http_match_uri(hm, "/lastEven")) {
|
||||||
mg_http_reply(c, 200, "", "%zd", blocks_head->start + 0x7FFFFFE);
|
mg_http_reply(c, 200, "", "%zd", blocks_head->start + 0x7FFFFFE);
|
||||||
|
@ -164,7 +206,7 @@ uint64_t get_mem_usage(void) {
|
||||||
uint64_t res;
|
uint64_t res;
|
||||||
fscanf(fp, "%zd", &res);
|
fscanf(fp, "%zd", &res);
|
||||||
fclose(fp);
|
fclose(fp);
|
||||||
return res * 1024;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
double get_time(void) {
|
double get_time(void) {
|
||||||
|
|
Loading…
Reference in New Issue