Ejemplo n.º 1
0
ws_parse_state_t _ws_read_http_status(ws_t ws, 
				struct evbuffer *in, 
				int *http_major_version, 
				int *http_minor_version,
				int *status_code)
{
	char *line = NULL;
	size_t len;
	assert(ws);
	assert(in);

	line = evbuffer_readln(in, &len, EVBUFFER_EOL_CRLF);

	if (!line)
		return WS_PARSE_STATE_NEED_MORE;

	if (_ws_parse_http_status(line, 
		http_major_version, http_minor_version, status_code))
	{
		_ws_free(line);
		return WS_PARSE_STATE_ERROR;
	}

	_ws_free(line);
	return WS_PARSE_STATE_SUCCESS;
}
Ejemplo n.º 2
0
int TEST_ws_parse_http_header(int argc, char **argv)
{
    int ret = 0;
    char *line = "Origin:    arne weise    ";
    char *invalid_line = "Blarg";
    char *header_name;
    char *header_val;
    int i;

    libws_test_HEADLINE("TEST_ws_parse_http_header");

    if (libws_test_init(argc, argv)) return -1;

    libws_test_STATUS("Parse header \"%s\"", line);

    if (_ws_parse_http_header(line, &header_name, &header_val))
    {
        libws_test_FAILURE("Failed to parse header \"%s\"", line);
        ret = -1;
    }
    else
    {
        if (!header_name || !header_val)
        {
            if (!header_name)
            {
                libws_test_FAILURE("Header name NULL after parse");
                ret = -1;
            }

            if (!header_name)
            {
                libws_test_FAILURE("Header val NULL after parse");
                ret = -1;
            }
        }
        else
        {
            libws_test_SUCCESS("Parsed header \"%s\". "
                               "Name = \"%s\", Value = \"%s\"",
                               line, header_name, header_val);
        }
    }

    free(header_name);
    free(header_val);

    libws_test_STATUS("Parse invalid line:");

    if (_ws_parse_http_header(invalid_line, &header_name, &header_val))
    {
        if (header_name || header_val)
        {
            if (header_name)
            {
                libws_test_FAILURE("Header name not NULL after parse failure");
                ret = -1;
            }

            if (header_name)
            {
                libws_test_FAILURE("Header value not NULL after parse failure");
                ret = -1;
            }
        }
        else
        {
            libws_test_SUCCESS("Header name and value NULL after failed parse");
        }
    }

    libws_test_STATUS("Parse NULL line:");

    if (_ws_parse_http_header(NULL, &header_name, &header_val))
    {
        libws_test_SUCCESS("Failed on NULL input");
    }
    else
    {
        libws_test_FAILURE("Did not fail o NULL input");
        ret |= -1;
    }

    {
        int http_major_version;
        int http_minor_verson;
        int http_status;

        if (_ws_parse_http_status(NULL, &http_major_version,
                                  &http_minor_verson, &http_status))
        {
            libws_test_SUCCESS("Failed to parse HTTP status with NULL input");
        }
        else
        {
            libws_test_FAILURE("Success parsing HTTP status with NULL input");
            ret |= -1;
        }

        if (_ws_parse_http_status("HTTP/1.1 abc", &http_major_version,
                                  &http_minor_verson, &http_status))
        {
            libws_test_SUCCESS("Failed to parse HTTP status with NULL input");
        }
        else
        {
            libws_test_FAILURE("Success parsing HTTP status with NULL input");
            ret |= -1;
        }
    }

    ws_set_memory_functions(libws_test_malloc,
                            free,
                            libws_test_realloc);

    for (i = 1; i <= 2; i++)
    {
        libws_test_STATUS("Test failing malloc on allocation: %d", i);
        libws_test_set_malloc_fail_count(i);

        if (_ws_parse_http_header(line, &header_name, &header_val))
        {
            libws_test_SUCCESS("Failed as expected on NULL memory allocation "
                               "after %d allocations", i);
        }
        else
        {
            libws_test_FAILURE("Did not fail on NULL memory allocation "
                               "after %d allocations", i);
            ret |= -1;
        }
    }

    ws_set_memory_functions(NULL, NULL, NULL);

    return ret;
}