Class: Agoo::EarlyHints
- Inherits:
-
Object
- Object
- Agoo::EarlyHints
- Defined in:
- ext/agoo/early_hints.c,
ext/agoo/early_hints.c
Overview
Used to provide early hints (HTTP 103) responses to requests.
Instance Method Summary collapse
-
#call(links) ⇒ Object
call-seq: call(links).
Instance Method Details
#call(links) ⇒ Object
call-seq: call(links)
Write early hints, response with status 103 using the provided headers in an Array of Array.
Example:
early_hints.call([
["link", "</style.css>; rel=preload; as=style"],
["link", "</script.js>; rel=preload; as=script"],
])
53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 |
# File 'ext/agoo/early_hints.c', line 53 static VALUE eh_call(VALUE self, VALUE links) { EarlyHints eh = (EarlyHints)DATA_PTR(self); agooEarly link; agooEarly ll = NULL; int i, cnt; VALUE lv; VALUE v; const char *key; const char *content; if (NULL == eh) { rb_raise(rb_eIOError, "early hints has been closed."); } rb_check_type(links, RUBY_T_ARRAY); // Link: </style.css>; rel=preload; as=style cnt = (int)RARRAY_LEN(links); for (i = cnt - 1; 0 <= i; i--) { lv = rb_ary_entry(links, i); switch (rb_type(lv)) { case RUBY_T_STRING: content = rb_string_value_ptr((VALUE*)&v); if (NULL == (link = agoo_early_create(content))) { rb_raise(rb_eNoMemError, "out of memory"); } break; case RUBY_T_ARRAY: if (2 != RARRAY_LEN(lv)) { rb_raise(rb_eArgError, "early hints call argument must be an array of arrays that have 2 string members."); } v = rb_ary_entry(lv, 0); key = rb_string_value_ptr((VALUE*)&v); if (0 != strcasecmp("link", key)) { rb_raise(rb_eArgError, "Only a 'Link' header is allowed in early hints. '%s' is not allowed", key); } v = rb_ary_entry(lv, 1); content = rb_string_value_ptr((VALUE*)&v); if (NULL == (link = agoo_early_create(content))) { rb_raise(rb_eNoMemError, "out of memory"); } break; default: rb_raise(rb_eArgError, "early hints call argument must be an array of arrays or an array of strings."); } link->next = ll; ll = link; } agoo_res_add_early(eh->req->res, ll); agoo_early_destroy(ll); return Qnil; } |