response *make_404_response() { char *path = "404.html", *html; response *resp = response_new(); strlist *filedata = strlist_new(); response_set_status_code(resp, 404); response_set_content_type(resp, "text/html"); html = "<html><head><title>Not Found</title></head><body> \ <h1>404!</h1><br>Sorry, the object you requested was not found. \ </body><html>"; filedata = readfile(path); if (filedata) { html = strlist_to_string(filedata); } //INFO("Read HTML:\n%s", html); response_set_body(resp, html); //INFO("Generated response:\n"); //IFINFO(response_write(resp, STDOUT_FILENO)); return resp; }
response *make_response(request *req) { strlist *filedata; char *html, *path = req->path; response *resp = response_new(); response_set_status_code(resp, 200); response_set_content_type(resp, "text/html"); if (req->method == GET || req->method == POST) { INFO("Requested path %s\n", path); if (path[0] == '/') path = &path[1]; filedata = readfile(path); if (!filedata) { WARN("Could not open file, generating 404...\n"); return make_404_response(); } html = strlist_to_string(filedata); response_set_body(resp, html); free(html); } return resp; }
wchar_t *json_serialize(json_object *data) { strlist head = { 0 }; object_to_string(data, &head); wchar_t *string = strlist_to_string(&head); return string; }
static int parsing(parse_engine* engine, json_object *pos_parse) { wchar_t c = next_token(engine); switch (c) { case 0: engine->message = (wchar_t *)L"Unexpected end"; return 1; case '[': { pos_parse->type = ARRAY; pos_parse->value.item = 0; if (next_token(engine) == ']') return 0; --engine->pos; while (1) { json_object *item = insert_item(pos_parse, 0); if (next_token(engine) == ',') { --engine->pos; } else { --engine->pos; if (parsing(engine, item)) return 1; } switch (next_token(engine)) { case ',': if (next_token(engine) == ']') return 0; --engine->pos; break; case ']': return 0; default: engine->message = (wchar_t *)L":Expected a ',' or ']'"; return 1; } } } case '{': { pos_parse->type = TABLE; pos_parse->value.item = 0; if (next_token(engine) == '}') return 0; --engine->pos; while (1) { json_object key; if (parsing(engine, &key) || key.type != TEXT) { json_object_free(&key); engine->message = (wchar_t *)L"Illegal key of pair"; return 1; } if (next_token(engine) != ':') { engine->message = (wchar_t *)L"Expected a ':'"; return 1; } json_object* item=insert_item(pos_parse, key.value.text); json_object_free(&key); if (parsing(engine, item)) { return 1; } switch (next_token(engine)) { case ';': case ',': if (next_token(engine) == '}') return 0; --engine->pos; break; case '}': return 0; default: engine->message = (wchar_t *)L"Expected a ',' or '}'"; return 1; } } } case '\'': case '"': { pos_parse->type = TEXT; pos_parse->value.text = 0; strlist str = { 0 }; while (1) { wchar_t ch = *engine->pos++; switch (ch) { case '\n': case '\r': strlist_free(&str); engine->message = (wchar_t *)L"Unterminated string"; return 1; case '\\': ch = *engine->pos++; switch (ch) { case 'b': strlist_append(&str, L"\b", 1); break; case 't': strlist_append(&str, L"\t", 1); break; case 'n': strlist_append(&str, L"\n", 1); break; case 'f': strlist_append(&str, L"\f", 1); break; case 'r': strlist_append(&str, L"\r", 1); break; case '"': case '\'': case '\\': case '/': strlist_append(&str, &ch, 1); break; case 'u': { wchar_t num = 0; for (int i = 0; i < 4; ++i) { wchar_t tmp = *engine->pos++; if (tmp >= '0'&&tmp <= '9') tmp = tmp - '0'; else if (tmp >= 'A'&&tmp <= 'F') tmp = tmp - ('A' - 10); else if (tmp >= 'a'&&tmp <= 'f') tmp = tmp - ('a' - 10); num = num << 4 | tmp; } strlist_append(&str, &num, 1); break; } default: strlist_free(&str); engine->message = (wchar_t *)L"Illegal escape"; return 1; } break; default: if (ch == c) { pos_parse->value.text = strlist_to_string(&str); strlist_free(&str); return 0; } strlist_append(&str, &ch, 1); break; } } break; } } int length = 0; char buffer[32] = { 0 }; while (c >= ' ') { if(strchr(",:]}/\\\"[{;=#", c)) break; if(length<sizeof(buffer)&&strchr("0123456789+-.AEFLNRSTUaeflnrstu",c)) { buffer[length++]=(char)c; c = *engine->pos++; } else{ engine->message=(wchar_t *)L"Illegal Value"; return 1; } } --engine->pos; if (!length) { pos_parse->type = TEXT; pos_parse->value.text = (wchar_t *)malloc(sizeof(wchar_t)); pos_parse->value.text[0] = 0; return 0; } else { if (!strcmp(buffer, "TRUE") || !strcmp(buffer, "true")) { pos_parse->type = BOOLEAN; pos_parse->value.boolean = true; return 0; } else if (!strcmp(buffer, "FALSE") || !strcmp(buffer, "false")) { pos_parse->type = BOOLEAN; pos_parse->value.boolean = false; return 0; } else if (!strcmp(buffer, "NULL") || !strcmp(buffer, "null")) { pos_parse->type = NONE; return 0; } pos_parse->type = (strstr(buffer, ".") || strstr(buffer, "e") || strstr(buffer, "E")) ? DECIMAL : INTEGER; const char *format = pos_parse->type == INTEGER ? "%lld" : "%lf"; if (sscanf(buffer, format, &pos_parse->value)) return 0; engine->message = (wchar_t *)L"Unexpected end"; return 1; } }