Esempio n. 1
0
File: server.c Progetto: chfr/sow
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;
}
Esempio n. 2
0
File: server.c Progetto: chfr/sow
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;
}
Esempio n. 3
0
wchar_t *json_serialize(json_object *data)
{
	strlist head = { 0 };
	object_to_string(data, &head);
	wchar_t *string = strlist_to_string(&head);	
	return string;
}
Esempio n. 4
0
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;
	}
}