iodine 0.8.2 → 0.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/ext/iodine/iodine.c CHANGED
@@ -240,6 +240,7 @@ void Init_iodine(void) {
240
240
  Init_Iodine_PubSub_Message();
241
241
  Init_Iodine_TLS();
242
242
  Init_Iodine_Connection();
243
+ Init_Iodine_Params();
243
244
  /* make sure the Iodine.run / async methods are available pre-start */
244
245
  fio_io_async_attach(&IODINE_THREAD_POOL, (uint32_t)fio_cli_get_i("-t"));
245
246
  #ifdef SIGUSR1
data/ext/iodine/iodine.h CHANGED
@@ -99,7 +99,7 @@ static ID IODINE_JOIN_ID;
99
99
  static ID IODINE_TO_PATH_ID;
100
100
  static ID IODINE_TO_S_ID;
101
101
  static ID IODINE_TO_JSON_ID;
102
- static ID IODINE_RACK_HIJACK_ID;
102
+ static ID IODINE_RACK_HIJACK_ID; /* rack_hijack */
103
103
  static ID IODINE_ON_AUTHENTICATE_ID;
104
104
  static ID IODINE_ON_AUTHENTICATE_SSE_ID;
105
105
  static ID IODINE_ON_AUTHENTICATE_WEBSOCKET_ID;
@@ -135,6 +135,10 @@ static ID IODINE_DELETE_ID;
135
135
  name = rb_intern(value); \
136
136
  STORE.hold(RB_ID2SYM(name));
137
137
 
138
+ #define IODINE_CONST_IDSYM_STORE(name, value) \
139
+ name##_ID = rb_intern(value); \
140
+ STORE.hold((name##_SYM = RB_ID2SYM(name##_ID)));
141
+
138
142
  static VALUE iodine_rb_IODINE;
139
143
  static VALUE iodine_rb_IODINE_BASE;
140
144
  static VALUE iodine_rb_IODINE_BASE_APP404;
@@ -150,9 +154,9 @@ static rb_encoding *IodineBinaryEncoding;
150
154
  static VALUE IODINE_CONNECTION_ENV_TEMPLATE = Qnil;
151
155
  static VALUE IODINE_CONNECTION_ENV_TEMPLATE_HTTPS = Qnil;
152
156
  static VALUE IODINE_RACK_PROTOCOL_STR;
153
- static VALUE IODINE_RACK_HIJACK_ID_SYM;
154
- static VALUE IODINE_RACK_HIJACK_STR;
155
- static VALUE IODINE_RACK_HIJACK_SYM;
157
+ static VALUE IODINE_RACK_HIJACK_ID_SYM; /* rack_hijack */
158
+ static VALUE IODINE_RACK_HIJACK_STR; /* rack.hijack */
159
+ static VALUE IODINE_RACK_HIJACK_SYM; /* rack.hijack */
156
160
  static VALUE IODINE_RACK_UPGRADE_STR;
157
161
  static VALUE IODINE_RACK_UPGRADE_Q_STR;
158
162
  static VALUE IODINE_RACK_UPGRADE_WS_SYM;
@@ -252,6 +256,7 @@ static VALUE iodine_handler_method_injection__inner(VALUE self,
252
256
  #include "iodine_tls.h"
253
257
  /* layer 3 modules */
254
258
  #include "iodine_connection.h"
259
+ #include "iodine_params.h"
255
260
 
256
261
  /* layer 4 modules */
257
262
  #include "iodine_core.h"
@@ -149,7 +149,11 @@ typedef enum {
149
149
  IODINE_CONNECTION_STORE_opath, /**< Cached original path string */
150
150
  IODINE_CONNECTION_STORE_query, /**< Cached query string */
151
151
  IODINE_CONNECTION_STORE_version, /**< Cached HTTP version string */
152
- IODINE_CONNECTION_STORE_tmp, /**< Temporary storage during GC-sensitive ops */
152
+ IODINE_CONNECTION_STORE_tmp, /**< Active upload / temporary GC root */
153
+ IODINE_CONNECTION_STORE_params, /**< Memoized params Hash (iodine_params.h) */
154
+ IODINE_CONNECTION_STORE_params_stage, /**< Body parse staging Hash */
155
+ IODINE_CONNECTION_STORE_params_input, /**< Guarded JSON input copy */
156
+ IODINE_CONNECTION_STORE_params_exception, /**< Pending parser exception */
153
157
  IODINE_CONNECTION_STORE_FINISH, /**< Sentinel value (array size) */
154
158
  } iodine_connection_store_e;
155
159
 
@@ -164,6 +168,9 @@ typedef enum {
164
168
  IODINE_CONNECTION_UPGRADE = (2 | 4), /**< Any upgrade (SSE or WS) */
165
169
  IODINE_CONNECTION_CLOSED = 8, /**< Connection close scheduled */
166
170
  IODINE_CONNECTION_CLIENT = 16, /**< This is a client connection */
171
+ IODINE_CONNECTION_PARAMS_QUERY = 32, /**< Query merged into params Hash */
172
+ IODINE_CONNECTION_PARAMS_BODY = 64, /**< Body merged into params Hash */
173
+ IODINE_CONNECTION_PARAMS_HAS_UPLOAD = 128, /**< Upload cleanup may be needed */
167
174
  } iodine_connection_flags_e;
168
175
 
169
176
  /**
@@ -181,9 +188,14 @@ typedef struct iodine_connection_s {
181
188
  fio_http_s *http; /**< facil.io HTTP handle */
182
189
  VALUE store[IODINE_CONNECTION_STORE_FINISH]; /**< Cached Ruby objects */
183
190
  iodine_minimap_s map; /**< Header storage map */
191
+ struct iodine_upload_s *open_uploads; /**< Params cleanup list */
184
192
  iodine_connection_flags_e flags; /**< Connection state flags */
193
+ size_t params_spent; /**< Params field budget spent (iodine_params.h) */
185
194
  } iodine_connection_s;
186
195
 
196
+ /* Implemented in iodine_params.h (included after this header). */
197
+ static void iodine_params_on_connection_free(iodine_connection_s *c);
198
+
187
199
  static size_t iodine_connection_data_size(const void *ptr_) {
188
200
  iodine_connection_s *c = (iodine_connection_s *)ptr_;
189
201
  return sizeof(*c) +
@@ -192,6 +204,7 @@ static size_t iodine_connection_data_size(const void *ptr_) {
192
204
 
193
205
  static void iodine_connection_free(void *ptr_) {
194
206
  iodine_connection_s *c = (iodine_connection_s *)ptr_;
207
+ iodine_params_on_connection_free(c);
195
208
  fio_http_free(c->http);
196
209
  iodine_hmap_destroy(&c->map.map);
197
210
  FIO_LEAK_COUNTER_ON_FREE(iodine_connection);
@@ -252,6 +265,9 @@ static iodine_connection_s *iodine_connection_ptr(VALUE self) {
252
265
  return c;
253
266
  }
254
267
 
268
+ /* Defined in iodine_params.h (included after this header). */
269
+ static void iodine_params_on_finish(iodine_connection_s *c);
270
+
255
271
  /** Creates (and allocates) a new Iodine::Connection object. */
256
272
  static VALUE iodine_connection_create_from_io(fio_io_s *io) {
257
273
  VALUE m = rb_obj_alloc(iodine_rb_IODINE_CONNECTION);
@@ -1927,6 +1943,7 @@ static void iodine_io_http_on_http(fio_http_s *h) {
1927
1943
  IODINE_ON_FINISH_ID, \
1928
1944
  1, \
1929
1945
  &connection); \
1946
+ iodine_params_on_finish(c); \
1930
1947
  fio_http_free(c->http); \
1931
1948
  c->http = NULL; \
1932
1949
  c->io = NULL; \
@@ -1965,6 +1982,7 @@ IODINE_CONNECTION_DEF_CB(on_close, IODINE_ON_CLOSE_ID, 1);
1965
1982
  IODINE_ON_FINISH_ID, \
1966
1983
  1, \
1967
1984
  &connection); \
1985
+ iodine_params_on_finish(c); \
1968
1986
  fio_http_free(c->http); \
1969
1987
  c->http = NULL; \
1970
1988
  c->io = NULL; \
@@ -2113,6 +2131,7 @@ static void iodine_io_http_on_finish(fio_http_s *h) {
2113
2131
  }
2114
2132
  fio_http_free(h);
2115
2133
  }
2134
+ iodine_params_on_finish(c);
2116
2135
  c->http = NULL;
2117
2136
  c->io = NULL;
2118
2137
  STORE.release(connection);