about summary refs log tree commit homepage
path: root/ext/kcar/kcar.rl
diff options
context:
space:
mode:
authorEric Wong <e@80x24.org>2018-12-01 13:57:25 +0000
committerEric Wong <e@80x24.org>2018-12-01 13:57:25 +0000
commit5ac452d36c2ecacb6398759db7439a5b8a64670e (patch)
tree02052e530c85b09467f62847e3c6d0293958fda6 /ext/kcar/kcar.rl
parent14e39b67a7696b1ba0875baccbb4fbc73a068b16 (diff)
downloadkcar-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.rl13
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");