iodine 0.7.60 → 0.8.0

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.
Files changed (160) hide show
  1. checksums.yaml +4 -4
  2. data/.clang-format +15 -0
  3. data/.rspec +1 -0
  4. data/.yardopts +1 -3
  5. data/CHANGELOG.md +132 -12
  6. data/Gemfile +5 -7
  7. data/LICENSE.txt +1 -1
  8. data/README.md +147 -671
  9. data/Rakefile +9 -16
  10. data/examples/chatroom.nru +9 -0
  11. data/examples/client +74 -0
  12. data/examples/config-hello.nru +9 -0
  13. data/examples/config-hello.ru +11 -0
  14. data/examples/config-hijack.ru +13 -0
  15. data/examples/config-shootout.ru +43 -0
  16. data/examples/config.nru +120 -0
  17. data/examples/config.rb +37 -0
  18. data/examples/config.ru +42 -53
  19. data/examples/fake +24 -0
  20. data/examples/hello_neorack +137 -0
  21. data/examples/routes.nru +29 -0
  22. data/examples/routes.ru +42 -0
  23. data/exe/iodine +218 -258
  24. data/ext/iodine/extconf.rb +27 -100
  25. data/ext/iodine/fio-stl.h +128336 -0
  26. data/ext/iodine/fio-stl.md +26396 -0
  27. data/ext/iodine/iodine.c +213 -1393
  28. data/ext/iodine/iodine.h +250 -55
  29. data/ext/iodine/iodine_arg_helper.h +329 -0
  30. data/ext/iodine/iodine_caller.h +234 -25
  31. data/ext/iodine/iodine_cli.h +434 -0
  32. data/ext/iodine/iodine_compression.h +312 -0
  33. data/ext/iodine/iodine_connection.h +3484 -34
  34. data/ext/iodine/iodine_core.h +363 -0
  35. data/ext/iodine/iodine_crypto.h +1441 -0
  36. data/ext/iodine/iodine_defer.h +225 -4
  37. data/ext/iodine/iodine_json.h +738 -4
  38. data/ext/iodine/iodine_listener.h +263 -0
  39. data/ext/iodine/iodine_log.h +297 -0
  40. data/ext/iodine/iodine_minimap.h +543 -0
  41. data/ext/iodine/iodine_mustache.h +461 -4
  42. data/ext/iodine/iodine_pubsub_eng.h +729 -0
  43. data/ext/iodine/iodine_pubsub_history.h +547 -0
  44. data/ext/iodine/iodine_pubsub_msg.h +228 -0
  45. data/ext/iodine/iodine_redis.h +322 -0
  46. data/ext/iodine/iodine_store.h +418 -16
  47. data/ext/iodine/iodine_threads.h +279 -0
  48. data/ext/iodine/iodine_tls.h +515 -6
  49. data/ext/iodine/iodine_utils.h +923 -0
  50. data/iodine.gemspec +37 -42
  51. data/lib/iodine/benchmark.rb +1690 -0
  52. data/lib/iodine/documentation.rb +3085 -0
  53. data/lib/iodine/version.rb +17 -1
  54. data/lib/iodine.rb +54 -255
  55. data/logo.svg +36 -0
  56. data/mustache.md +55 -0
  57. data/sig/iodine.rbs +4 -0
  58. metadata +58 -184
  59. data/.github/ISSUE_TEMPLATE/bug_report.md +0 -40
  60. data/.github/workflows/ruby.yml +0 -42
  61. data/.gitignore +0 -21
  62. data/LIMITS.md +0 -41
  63. data/SPEC-PubSub-Draft.md +0 -159
  64. data/SPEC-WebSocket-Draft.md +0 -239
  65. data/bin/console +0 -22
  66. data/bin/info.md +0 -353
  67. data/bin/mustache_bench.rb +0 -100
  68. data/bin/poc/Gemfile.lock +0 -23
  69. data/bin/poc/README.md +0 -37
  70. data/bin/poc/config.ru +0 -66
  71. data/bin/poc/gemfile +0 -1
  72. data/bin/poc/www/index.html +0 -57
  73. data/examples/async_task.ru +0 -92
  74. data/examples/bates/README.md +0 -3
  75. data/examples/bates/config.ru +0 -342
  76. data/examples/bates/david+bold.pdf +0 -0
  77. data/examples/bates/public/drop-pdf.png +0 -0
  78. data/examples/bates/public/index.html +0 -600
  79. data/examples/echo.ru +0 -59
  80. data/examples/etag.ru +0 -16
  81. data/examples/hello.ru +0 -29
  82. data/examples/pubsub_engine.ru +0 -81
  83. data/examples/rack3.ru +0 -12
  84. data/examples/redis.ru +0 -70
  85. data/examples/shootout.ru +0 -73
  86. data/examples/sub-protocols.ru +0 -90
  87. data/examples/tcp_client.rb +0 -66
  88. data/examples/x-sendfile.ru +0 -14
  89. data/ext/iodine/fio.c +0 -11995
  90. data/ext/iodine/fio.h +0 -6371
  91. data/ext/iodine/fio_cli.c +0 -431
  92. data/ext/iodine/fio_cli.h +0 -189
  93. data/ext/iodine/fio_json_parser.h +0 -688
  94. data/ext/iodine/fio_siphash.c +0 -157
  95. data/ext/iodine/fio_siphash.h +0 -37
  96. data/ext/iodine/fio_tls.h +0 -129
  97. data/ext/iodine/fio_tls_missing.c +0 -649
  98. data/ext/iodine/fio_tls_openssl.c +0 -1106
  99. data/ext/iodine/fio_tmpfile.h +0 -50
  100. data/ext/iodine/fiobj.h +0 -44
  101. data/ext/iodine/fiobj4fio.h +0 -21
  102. data/ext/iodine/fiobj_ary.c +0 -333
  103. data/ext/iodine/fiobj_ary.h +0 -139
  104. data/ext/iodine/fiobj_data.c +0 -1187
  105. data/ext/iodine/fiobj_data.h +0 -167
  106. data/ext/iodine/fiobj_hash.c +0 -409
  107. data/ext/iodine/fiobj_hash.h +0 -176
  108. data/ext/iodine/fiobj_json.c +0 -622
  109. data/ext/iodine/fiobj_json.h +0 -68
  110. data/ext/iodine/fiobj_mem.h +0 -71
  111. data/ext/iodine/fiobj_mustache.c +0 -317
  112. data/ext/iodine/fiobj_mustache.h +0 -62
  113. data/ext/iodine/fiobj_numbers.c +0 -344
  114. data/ext/iodine/fiobj_numbers.h +0 -127
  115. data/ext/iodine/fiobj_str.c +0 -433
  116. data/ext/iodine/fiobj_str.h +0 -172
  117. data/ext/iodine/fiobject.c +0 -620
  118. data/ext/iodine/fiobject.h +0 -655
  119. data/ext/iodine/hpack.h +0 -1923
  120. data/ext/iodine/http.c +0 -2743
  121. data/ext/iodine/http.h +0 -1002
  122. data/ext/iodine/http1.c +0 -910
  123. data/ext/iodine/http1.h +0 -29
  124. data/ext/iodine/http1_parser.h +0 -878
  125. data/ext/iodine/http_internal.c +0 -1279
  126. data/ext/iodine/http_internal.h +0 -237
  127. data/ext/iodine/http_mime_parser.h +0 -350
  128. data/ext/iodine/iodine_caller.c +0 -230
  129. data/ext/iodine/iodine_connection.c +0 -941
  130. data/ext/iodine/iodine_defer.c +0 -420
  131. data/ext/iodine/iodine_fiobj2rb.h +0 -120
  132. data/ext/iodine/iodine_helpers.c +0 -282
  133. data/ext/iodine/iodine_helpers.h +0 -12
  134. data/ext/iodine/iodine_http.c +0 -1181
  135. data/ext/iodine/iodine_http.h +0 -23
  136. data/ext/iodine/iodine_json.c +0 -302
  137. data/ext/iodine/iodine_mustache.c +0 -567
  138. data/ext/iodine/iodine_pubsub.c +0 -580
  139. data/ext/iodine/iodine_pubsub.h +0 -26
  140. data/ext/iodine/iodine_rack_io.c +0 -273
  141. data/ext/iodine/iodine_rack_io.h +0 -20
  142. data/ext/iodine/iodine_store.c +0 -148
  143. data/ext/iodine/iodine_tcp.c +0 -346
  144. data/ext/iodine/iodine_tcp.h +0 -13
  145. data/ext/iodine/iodine_tls.c +0 -261
  146. data/ext/iodine/mustache_parser.h +0 -1546
  147. data/ext/iodine/redis_engine.c +0 -957
  148. data/ext/iodine/redis_engine.h +0 -79
  149. data/ext/iodine/resp_parser.h +0 -317
  150. data/ext/iodine/websocket_parser.h +0 -506
  151. data/ext/iodine/websockets.c +0 -743
  152. data/ext/iodine/websockets.h +0 -185
  153. data/lib/iodine/connection.rb +0 -61
  154. data/lib/iodine/json.rb +0 -42
  155. data/lib/iodine/mustache.rb +0 -113
  156. data/lib/iodine/pubsub.rb +0 -55
  157. data/lib/iodine/rack_utils.rb +0 -43
  158. data/lib/iodine/tls.rb +0 -16
  159. data/lib/rack/handler/iodine.rb +0 -33
  160. data/logo.png +0 -0
@@ -1,157 +0,0 @@
1
- /*
2
- Copyright: Boaz Segev, 2017-2019
3
- License: MIT
4
- */
5
- #include <fio_siphash.h>
6
-
7
- /* *****************************************************************************
8
-
9
- NOTICE
10
-
11
- This code won't be linked to the final application when using fio.h and fio.c.
12
-
13
- The code is here only to allow the FIOBJ library to be extracted from the
14
- facil.io framework library.
15
-
16
- ***************************************************************************** */
17
-
18
- /* *****************************************************************************
19
- Hashing (SipHash implementation)
20
- ***************************************************************************** */
21
-
22
- #if !defined(__BIG_ENDIAN__) && !defined(__LITTLE_ENDIAN__) && \
23
- __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
24
- /* the algorithm was designed as little endian... so, byte swap 64 bit. */
25
- #define sip_local64(i) \
26
- (((i)&0xFFULL) << 56) | (((i)&0xFF00ULL) << 40) | \
27
- (((i)&0xFF0000ULL) << 24) | (((i)&0xFF000000ULL) << 8) | \
28
- (((i)&0xFF00000000ULL) >> 8) | (((i)&0xFF0000000000ULL) >> 24) | \
29
- (((i)&0xFF000000000000ULL) >> 40) | (((i)&0xFF00000000000000ULL) >> 56)
30
- #else
31
- /* no need */
32
- #define sip_local64(i) (i)
33
- #endif
34
-
35
- /* 64Bit left rotation, inlined. */
36
- #define lrot64(i, bits) \
37
- (((uint64_t)(i) << (bits)) | ((uint64_t)(i) >> (64 - (bits))))
38
-
39
- static inline uint64_t fio_siphash_xy(const void *data, size_t len, size_t x,
40
- size_t y, uint64_t key1, uint64_t key2) {
41
- /* initialize the 4 words */
42
- uint64_t v0 = (0x0706050403020100ULL ^ 0x736f6d6570736575ULL) ^ key1;
43
- uint64_t v1 = (0x0f0e0d0c0b0a0908ULL ^ 0x646f72616e646f6dULL) ^ key2;
44
- uint64_t v2 = (0x0706050403020100ULL ^ 0x6c7967656e657261ULL) ^ key1;
45
- uint64_t v3 = (0x0f0e0d0c0b0a0908ULL ^ 0x7465646279746573ULL) ^ key2;
46
- const uint64_t *w64 = data;
47
- uint8_t len_mod = len & 255;
48
- union {
49
- uint64_t i;
50
- uint8_t str[8];
51
- } word;
52
-
53
- #define hash_map_SipRound \
54
- do { \
55
- v2 += v3; \
56
- v3 = lrot64(v3, 16) ^ v2; \
57
- v0 += v1; \
58
- v1 = lrot64(v1, 13) ^ v0; \
59
- v0 = lrot64(v0, 32); \
60
- v2 += v1; \
61
- v0 += v3; \
62
- v1 = lrot64(v1, 17) ^ v2; \
63
- v3 = lrot64(v3, 21) ^ v0; \
64
- v2 = lrot64(v2, 32); \
65
- } while (0);
66
-
67
- while (len >= 8) {
68
- word.i = sip_local64(*w64);
69
- v3 ^= word.i;
70
- /* Sip Rounds */
71
- for (size_t i = 0; i < x; ++i) {
72
- hash_map_SipRound;
73
- }
74
- v0 ^= word.i;
75
- w64 += 1;
76
- len -= 8;
77
- }
78
- word.i = 0;
79
- uint8_t *pos = word.str;
80
- uint8_t *w8 = (void *)w64;
81
- switch (len) { /* fallthrough is intentional */
82
- case 7:
83
- pos[6] = w8[6];
84
- /* fallthrough */
85
- case 6:
86
- pos[5] = w8[5];
87
- /* fallthrough */
88
- case 5:
89
- pos[4] = w8[4];
90
- /* fallthrough */
91
- case 4:
92
- pos[3] = w8[3];
93
- /* fallthrough */
94
- case 3:
95
- pos[2] = w8[2];
96
- /* fallthrough */
97
- case 2:
98
- pos[1] = w8[1];
99
- /* fallthrough */
100
- case 1:
101
- pos[0] = w8[0];
102
- }
103
- word.str[7] = len_mod;
104
-
105
- /* last round */
106
- v3 ^= word.i;
107
- hash_map_SipRound;
108
- hash_map_SipRound;
109
- v0 ^= word.i;
110
- /* Finalization */
111
- v2 ^= 0xff;
112
- /* d iterations of SipRound */
113
- for (size_t i = 0; i < y; ++i) {
114
- hash_map_SipRound;
115
- }
116
- hash_map_SipRound;
117
- hash_map_SipRound;
118
- hash_map_SipRound;
119
- hash_map_SipRound;
120
- /* XOR it all together */
121
- v0 ^= v1 ^ v2 ^ v3;
122
- #undef hash_map_SipRound
123
- return v0;
124
- }
125
-
126
- #pragma weak fio_siphash24
127
- uint64_t __attribute__((weak))
128
- fio_siphash24(const void *data, size_t len, uint64_t key1, uint64_t key2) {
129
- return fio_siphash_xy(data, len, 2, 4, key1, key2);
130
- }
131
-
132
- #pragma weak fio_siphash13
133
- uint64_t __attribute__((weak))
134
- fio_siphash13(const void *data, size_t len, uint64_t key1, uint64_t key2) {
135
- return fio_siphash_xy(data, len, 1, 3, key1, key2);
136
- }
137
-
138
- #if DEBUG
139
- #include <stdio.h>
140
- #include <string.h>
141
- #include <time.h>
142
-
143
- void fiobj_siphash_test(void) {
144
- fprintf(stderr, "===================================\n");
145
- // fio_siphash_speed_test();
146
- uint64_t result = 0;
147
- clock_t start;
148
- start = clock();
149
- for (size_t i = 0; i < 100000; i++) {
150
- char *data = "The quick brown fox jumps over the lazy dog ";
151
- __asm__ volatile("" ::: "memory");
152
- result += fio_siphash_xy(data, 43, 1, 3, 0, 0);
153
- }
154
- fprintf(stderr, "fio 100K SipHash: %lf\n",
155
- (double)(clock() - start) / CLOCKS_PER_SEC);
156
- }
157
- #endif
@@ -1,37 +0,0 @@
1
- #ifndef H_FIO_SIPHASH_H
2
- #define H_FIO_SIPHASH_H
3
-
4
- #ifndef _GNU_SOURCE
5
- #define _GNU_SOURCE
6
- #endif
7
-
8
- #include <stdint.h>
9
- #include <sys/types.h>
10
-
11
- /**
12
- * A SipHash variation (2-4).
13
- */
14
- uint64_t fio_siphash24(const void *data, size_t len, uint64_t key1,
15
- uint64_t key2);
16
-
17
- /**
18
- * A SipHash 1-3 variation.
19
- */
20
- uint64_t fio_siphash13(const void *data, size_t len, uint64_t key1,
21
- uint64_t key2);
22
-
23
- /**
24
- * The Hashing function used by dynamic facil.io objects.
25
- *
26
- * Currently implemented using SipHash 1-3.
27
- */
28
- #define fio_siphash(data, length, k1, k2) \
29
- fio_siphash13((data), (length), (k1), (k2))
30
-
31
- #if DEBUG
32
- void fiobj_siphash_test(void);
33
- #else
34
- #define fiobj_siphash_test()
35
- #endif
36
-
37
- #endif /* H_FIO_SIPHASH_H */
data/ext/iodine/fio_tls.h DELETED
@@ -1,129 +0,0 @@
1
- /*
2
- Copyright: Boaz Segev, 2018-2019
3
- License: MIT
4
-
5
- Feel free to copy, use and enjoy according to the license provided.
6
- */
7
- #ifndef H_FIO_TLS
8
-
9
- /**
10
- * This is an SSL/TLS extension for the facil.io library.
11
- */
12
- #define H_FIO_TLS
13
-
14
- #include <stdint.h>
15
-
16
- #ifndef FIO_TLS_PRINT_SECRET
17
- /* if true, the master key secret should be printed using FIO_LOG_DEBUG */
18
- #define FIO_TLS_PRINT_SECRET 0
19
- #endif
20
-
21
- /** An opaque type used for the SSL/TLS functions. */
22
- typedef struct fio_tls_s fio_tls_s;
23
-
24
- /**
25
- * Creates a new SSL/TLS context / settings object with a default certificate
26
- * (if any).
27
- *
28
- * If no server name is provided and no private key and public certificate are
29
- * provided, an empty TLS object will be created, (maybe okay for clients).
30
- *
31
- * fio_tls_s * tls = fio_tls_new("www.example.com",
32
- * "public_key.pem",
33
- * "private_key.pem", NULL );
34
- */
35
- fio_tls_s *fio_tls_new(const char *server_name, const char *public_cert_file,
36
- const char *private_key_file, const char *pk_password);
37
-
38
- /**
39
- * Adds a certificate a new SSL/TLS context / settings object (SNI support).
40
- *
41
- * fio_tls_cert_add(tls, "www.example.com",
42
- * "public_key.pem",
43
- * "private_key.pem", NULL );
44
- */
45
- void fio_tls_cert_add(fio_tls_s *, const char *server_name,
46
- const char *public_cert_file,
47
- const char *private_key_file, const char *pk_password);
48
-
49
- /**
50
- * Adds an ALPN protocol callback to the SSL/TLS context.
51
- *
52
- * The first protocol added will act as the default protocol to be selected.
53
- *
54
- * The `on_selected` callback should accept the `uuid`, the user data pointer
55
- * passed to either `fio_tls_accept` or `fio_tls_connect` (here:
56
- * `udata_connetcion`) and the user data pointer passed to the
57
- * `fio_tls_alpn_add` function (`udata_tls`).
58
- *
59
- * The `on_cleanup` callback will be called when the TLS object is destroyed (or
60
- * `fio_tls_alpn_add` is called again with the same protocol name). The
61
- * `udata_tls` argument will be passed along, as is, to the callback (if set).
62
- *
63
- * Except for the `tls` and `protocol_name` arguments, all arguments can be
64
- * NULL.
65
- */
66
- void fio_tls_alpn_add(fio_tls_s *tls, const char *protocol_name,
67
- void (*on_selected)(intptr_t uuid, void *udata_connection,
68
- void *udata_tls),
69
- void *udata_tls, void (*on_cleanup)(void *udata_tls));
70
-
71
- /**
72
- * Returns the number of registered ALPN protocol names.
73
- *
74
- * This could be used when deciding if protocol selection should be delegated to
75
- * the ALPN mechanism, or whether a protocol should be immediately assigned.
76
- *
77
- * If no ALPN protocols are registered, zero (0) is returned.
78
- */
79
- uintptr_t fio_tls_alpn_count(fio_tls_s *tls);
80
-
81
- /**
82
- * Adds a certificate to the "trust" list, which automatically adds a peer
83
- * verification requirement.
84
- *
85
- * Note, when the fio_tls_s object is used for server connections, this will
86
- * limit connections to clients that connect using a trusted certificate.
87
- *
88
- * fio_tls_trust(tls, "google-ca.pem" );
89
- */
90
- void fio_tls_trust(fio_tls_s *, const char *public_cert_file);
91
-
92
- /**
93
- * Establishes an SSL/TLS connection as an SSL/TLS Server, using the specified
94
- * context / settings object.
95
- *
96
- * The `uuid` should be a socket UUID that is already connected to a peer (i.e.,
97
- * the result of `fio_accept`).
98
- *
99
- * The `udata` is an opaque user data pointer that is passed along to the
100
- * protocol selected (if any protocols were added using `fio_tls_alpn_add`).
101
- */
102
- void fio_tls_accept(intptr_t uuid, fio_tls_s *tls, void *udata);
103
-
104
- /**
105
- * Establishes an SSL/TLS connection as an SSL/TLS Client, using the specified
106
- * context / settings object.
107
- *
108
- * The `uuid` should be a socket UUID that is already connected to a peer (i.e.,
109
- * one received by a `fio_connect` specified callback `on_connect`).
110
- *
111
- * The `udata` is an opaque user data pointer that is passed along to the
112
- * protocol selected (if any protocols were added using `fio_tls_alpn_add`).
113
- */
114
- void fio_tls_connect(intptr_t uuid, fio_tls_s *tls, void *udata);
115
-
116
- /**
117
- * Increase the reference count for the TLS object.
118
- *
119
- * Decrease with `fio_tls_destroy`.
120
- */
121
- void fio_tls_dup(fio_tls_s *tls);
122
-
123
- /**
124
- * Destroys the SSL/TLS context / settings object and frees any related
125
- * resources / memory.
126
- */
127
- void fio_tls_destroy(fio_tls_s *tls);
128
-
129
- #endif