about summary refs log tree commit homepage
path: root/ext/clogger_ext/clogger.c
diff options
context:
space:
mode:
authorStefan Sundin <git@stefansundin.com>2024-01-27 17:23:00 -0800
committerEric Wong <bofh@yhbt.net>2024-02-01 07:17:42 +0000
commit6b0768f8791c5d6dd2e8a5aea0da76d46549477e (patch)
tree4e13b686f9afec6ea9f74c5cf0faaec597379cfd /ext/clogger_ext/clogger.c
parent2991f00afa4e445214f3b997bb37cb746c01cd2d (diff)
downloadclogger-6b0768f8791c5d6dd2e8a5aea0da76d46549477e.tar.gz
Rack::Utils::HeaderHash will be removed in rack 3.1 so these changes mostly
address that. The initializer in Rack::Headers inherits from Hash, so
switching to the ::[] class method to achieve the same result.
Diffstat (limited to 'ext/clogger_ext/clogger.c')
-rw-r--r--ext/clogger_ext/clogger.c28
1 files changed, 19 insertions, 9 deletions
diff --git a/ext/clogger_ext/clogger.c b/ext/clogger_ext/clogger.c
index 23aea39..1993ae8 100644
--- a/ext/clogger_ext/clogger.c
+++ b/ext/clogger_ext/clogger.c
@@ -136,7 +136,7 @@ static ID to_path_id;
 static ID respond_to_id;
 static VALUE cClogger;
 static VALUE mFormat;
-static VALUE cHeaderHash;
+static VALUE cRackHeaders;
 
 /* common hash lookup keys */
 static VALUE g_HTTP_X_FORWARDED_FOR;
@@ -172,6 +172,10 @@ static VALUE byte_xs(VALUE obj)
 {
         static const char esc[] = "0123456789ABCDEF";
         unsigned char *new_ptr;
+        if (rb_obj_is_kind_of(obj, rb_cArray)) {
+                // Rack 3
+                obj = rb_ary_join(obj, rb_str_new2("\n"));
+        }
         VALUE from = rb_obj_as_string(obj);
         const unsigned char *ptr = (const unsigned char *)RSTRING_PTR(from);
         long len = RSTRING_LEN(from);
@@ -628,7 +632,8 @@ static void append_response(struct clogger *c, VALUE key)
 {
         VALUE v;
 
-        assert(rb_obj_is_kind_of(c->headers, cHeaderHash) && "not HeaderHash");
+        assert(rb_obj_is_kind_of(c->headers, cRackHeaders)
+                && "not Rack::Headers");
 
         v = rb_funcall(c->headers, sq_brace_id, 1, key);
         v = NIL_P(v) ? g_dash : byte_xs(v);
@@ -900,10 +905,9 @@ static VALUE ccall(struct clogger *c, VALUE env)
 
                 rv = rb_ary_dup(rv);
                 if (c->need_resp &&
-                    ! rb_obj_is_kind_of(c->headers, cHeaderHash)) {
-                        c->headers = rb_funcall(cHeaderHash, new_id, 1,
-                                                c->headers);
-                        rb_ary_store(rv, 1, c->headers);
+                    ! rb_obj_is_kind_of(c->headers, cRackHeaders)) {
+                        c->headers = rb_funcall(cRackHeaders, sq_brace_id,
+                                                1, c->headers);
                 }
         } else {
                 VALUE tmp = rb_inspect(rv);
@@ -1114,9 +1118,15 @@ void Init_clogger_ext(void)
         CONST_GLOBAL_STR2(rack_request_cookie_hash, "rack.request.cookie_hash");
 
         tmp = rb_const_get(rb_cObject, rb_intern("Rack"));
-        tmp = rb_const_get(tmp, rb_intern("Utils"));
-        cHeaderHash = rb_const_get(tmp, rb_intern("HeaderHash"));
-        rb_ary_push(mark_ary, cHeaderHash);
+        if (rb_const_defined(tmp, rb_intern("Headers"))) {
+                // Rack >= 3.0
+                cRackHeaders = rb_const_get(tmp, rb_intern("Headers"));
+        } else {
+                // Rack < 3.0
+                tmp = rb_const_get(tmp, rb_intern("Utils"));
+                cRackHeaders = rb_const_get(tmp, rb_intern("HeaderHash"));
+        }
+        rb_ary_push(mark_ary, cRackHeaders);
 
         rb_obj_freeze(mark_ary);
 }