diff options
author | Eric Wong <e@80x24.org> | 2018-12-01 13:57:25 +0000 |
---|---|---|
committer | Eric Wong <e@80x24.org> | 2018-12-01 13:57:25 +0000 |
commit | 5ac452d36c2ecacb6398759db7439a5b8a64670e (patch) | |
tree | 02052e530c85b09467f62847e3c6d0293958fda6 /ext/kcar/kcar.rl | |
parent | 14e39b67a7696b1ba0875baccbb4fbc73a068b16 (diff) | |
download | kcar-5ac452d36c2ecacb6398759db7439a5b8a64670e.tar.gz |
This is because some people implement WebDAV, and the litmus[1] test needs DELETE to fail if there is a fragment in the request. <http://www.webdav.org/neon/litmus/>
Diffstat (limited to 'ext/kcar/kcar.rl')
-rw-r--r-- | ext/kcar/kcar.rl | 13 |
1 files changed, 10 insertions, 3 deletions
diff --git a/ext/kcar/kcar.rl b/ext/kcar/kcar.rl index 9d04dd8..32b29d5 100644 --- a/ext/kcar/kcar.rl +++ b/ext/kcar/kcar.rl @@ -19,7 +19,7 @@ static VALUE g_rack_url_scheme, g_80, g_443, g_http, g_https, g_HTTP_HOST, g_HTTP_CONNECTION, g_HTTP_TRAILER, g_HTTP_TRANSFER_ENCODING, g_HTTP_VERSION, - g_CONTENT_LENGTH, g_CONTENT_TYPE, + g_CONTENT_LENGTH, g_CONTENT_TYPE, g_FRAGMENT, g_PATH_INFO, g_QUERY_STRING, g_REQUEST_METHOD, g_REQUEST_PATH, g_REQUEST_URI, g_SERVER_NAME, g_SERVER_PORT, g_SERVER_PROTOCOL; @@ -50,7 +50,6 @@ DEF_MAX_LENGTH(FIELD_NAME, 256); DEF_MAX_LENGTH(FIELD_VALUE, 80 * 1024); DEF_MAX_LENGTH(HEADER, (1024 * (80 + 32))); DEF_MAX_LENGTH(REQUEST_URI, 1024 * 15); -DEF_MAX_LENGTH(FRAGMENT, 1024); /* just in case (stolen from Mongrel) */ DEF_MAX_LENGTH(REQUEST_PATH, 4096); /* common PATH_MAX on modern systems */ DEF_MAX_LENGTH(QUERY_STRING, (1024 * 10)); @@ -273,6 +272,13 @@ request_host(struct http_parser *hp, VALUE env, const char *ptr, size_t len) } static void +set_fragment(VALUE env, const char *ptr, size_t len) +{ + VALUE val = rb_str_new(ptr, len); + rb_hash_aset(env, g_FRAGMENT, val); +} + +static void request_uri(VALUE env, const char *ptr, size_t len) { VALUE val; @@ -608,7 +614,7 @@ static void write_value(struct http_parser *hp, VALUE hdr, action url_scheme { url_scheme(hp, hdr, PTR_TO(mark), LEN(mark, fpc)); } action host { request_host(hp, hdr, PTR_TO(mark), LEN(mark, fpc)); } action request_uri { request_uri(hdr, PTR_TO(mark), LEN(mark, fpc)); } - + action fragment { set_fragment(hdr, PTR_TO(mark), LEN(mark, fpc)); } action start_query { MARK(start.query, fpc); } action query_string { query_string(hp, hdr, PTR_TO(start.query), LEN(start.query, fpc)); @@ -1126,6 +1132,7 @@ void Init_kcar_ext(void) rb_global_variable(&globals); C(globals, g_CONTENT_LENGTH, "CONTENT_LENGTH"); C(globals, g_CONTENT_TYPE, "CONTENT_TYPE"); + C(globals, g_FRAGMENT, "FRAGMENT"); C(globals, g_HTTP_HOST, "HTTP_HOST"); C(globals, g_HTTP_CONNECTION, "HTTP_CONNECTION"); C(globals, g_HTTP_TRAILER, "HTTP_TRAILER"); |