isomorfeus-iodine 0.7.44

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +7 -0
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +40 -0
  3. data/.gitignore +20 -0
  4. data/.rspec +2 -0
  5. data/.travis.yml +32 -0
  6. data/.yardopts +8 -0
  7. data/CHANGELOG.md +1038 -0
  8. data/Gemfile +11 -0
  9. data/LICENSE.txt +21 -0
  10. data/LIMITS.md +41 -0
  11. data/README.md +782 -0
  12. data/Rakefile +44 -0
  13. data/SPEC-PubSub-Draft.md +159 -0
  14. data/SPEC-WebSocket-Draft.md +239 -0
  15. data/bin/console +22 -0
  16. data/bin/info.md +353 -0
  17. data/bin/mustache_bench.rb +100 -0
  18. data/bin/poc/Gemfile.lock +23 -0
  19. data/bin/poc/README.md +37 -0
  20. data/bin/poc/config.ru +66 -0
  21. data/bin/poc/gemfile +1 -0
  22. data/bin/poc/www/index.html +57 -0
  23. data/examples/async_task.ru +92 -0
  24. data/examples/config.ru +56 -0
  25. data/examples/echo.ru +59 -0
  26. data/examples/hello.ru +29 -0
  27. data/examples/pubsub_engine.ru +81 -0
  28. data/examples/redis.ru +70 -0
  29. data/examples/shootout.ru +73 -0
  30. data/examples/sub-protocols.ru +90 -0
  31. data/examples/tcp_client.rb +66 -0
  32. data/examples/x-sendfile.ru +14 -0
  33. data/exe/iodine +277 -0
  34. data/ext/iodine/extconf.rb +109 -0
  35. data/ext/iodine/fio.c +11985 -0
  36. data/ext/iodine/fio.h +6373 -0
  37. data/ext/iodine/fio_cli.c +431 -0
  38. data/ext/iodine/fio_cli.h +189 -0
  39. data/ext/iodine/fio_json_parser.h +687 -0
  40. data/ext/iodine/fio_siphash.c +157 -0
  41. data/ext/iodine/fio_siphash.h +37 -0
  42. data/ext/iodine/fio_tls.h +129 -0
  43. data/ext/iodine/fio_tls_missing.c +649 -0
  44. data/ext/iodine/fio_tls_openssl.c +1056 -0
  45. data/ext/iodine/fio_tmpfile.h +50 -0
  46. data/ext/iodine/fiobj.h +44 -0
  47. data/ext/iodine/fiobj4fio.h +21 -0
  48. data/ext/iodine/fiobj_ary.c +333 -0
  49. data/ext/iodine/fiobj_ary.h +139 -0
  50. data/ext/iodine/fiobj_data.c +1185 -0
  51. data/ext/iodine/fiobj_data.h +167 -0
  52. data/ext/iodine/fiobj_hash.c +409 -0
  53. data/ext/iodine/fiobj_hash.h +176 -0
  54. data/ext/iodine/fiobj_json.c +622 -0
  55. data/ext/iodine/fiobj_json.h +68 -0
  56. data/ext/iodine/fiobj_mem.h +71 -0
  57. data/ext/iodine/fiobj_mustache.c +317 -0
  58. data/ext/iodine/fiobj_mustache.h +62 -0
  59. data/ext/iodine/fiobj_numbers.c +344 -0
  60. data/ext/iodine/fiobj_numbers.h +127 -0
  61. data/ext/iodine/fiobj_str.c +433 -0
  62. data/ext/iodine/fiobj_str.h +172 -0
  63. data/ext/iodine/fiobject.c +620 -0
  64. data/ext/iodine/fiobject.h +654 -0
  65. data/ext/iodine/hpack.h +1923 -0
  66. data/ext/iodine/http.c +2754 -0
  67. data/ext/iodine/http.h +1002 -0
  68. data/ext/iodine/http1.c +912 -0
  69. data/ext/iodine/http1.h +29 -0
  70. data/ext/iodine/http1_parser.h +873 -0
  71. data/ext/iodine/http_internal.c +1278 -0
  72. data/ext/iodine/http_internal.h +237 -0
  73. data/ext/iodine/http_mime_parser.h +350 -0
  74. data/ext/iodine/iodine.c +1430 -0
  75. data/ext/iodine/iodine.h +63 -0
  76. data/ext/iodine/iodine_caller.c +218 -0
  77. data/ext/iodine/iodine_caller.h +27 -0
  78. data/ext/iodine/iodine_connection.c +933 -0
  79. data/ext/iodine/iodine_connection.h +55 -0
  80. data/ext/iodine/iodine_defer.c +420 -0
  81. data/ext/iodine/iodine_defer.h +6 -0
  82. data/ext/iodine/iodine_fiobj2rb.h +120 -0
  83. data/ext/iodine/iodine_helpers.c +282 -0
  84. data/ext/iodine/iodine_helpers.h +12 -0
  85. data/ext/iodine/iodine_http.c +1171 -0
  86. data/ext/iodine/iodine_http.h +23 -0
  87. data/ext/iodine/iodine_json.c +302 -0
  88. data/ext/iodine/iodine_json.h +6 -0
  89. data/ext/iodine/iodine_mustache.c +567 -0
  90. data/ext/iodine/iodine_mustache.h +6 -0
  91. data/ext/iodine/iodine_pubsub.c +580 -0
  92. data/ext/iodine/iodine_pubsub.h +26 -0
  93. data/ext/iodine/iodine_rack_io.c +281 -0
  94. data/ext/iodine/iodine_rack_io.h +20 -0
  95. data/ext/iodine/iodine_store.c +142 -0
  96. data/ext/iodine/iodine_store.h +20 -0
  97. data/ext/iodine/iodine_tcp.c +346 -0
  98. data/ext/iodine/iodine_tcp.h +13 -0
  99. data/ext/iodine/iodine_tls.c +261 -0
  100. data/ext/iodine/iodine_tls.h +13 -0
  101. data/ext/iodine/mustache_parser.h +1546 -0
  102. data/ext/iodine/redis_engine.c +957 -0
  103. data/ext/iodine/redis_engine.h +79 -0
  104. data/ext/iodine/resp_parser.h +317 -0
  105. data/ext/iodine/websocket_parser.h +505 -0
  106. data/ext/iodine/websockets.c +735 -0
  107. data/ext/iodine/websockets.h +185 -0
  108. data/isomorfeus-iodine.gemspec +42 -0
  109. data/lib/iodine/connection.rb +61 -0
  110. data/lib/iodine/json.rb +42 -0
  111. data/lib/iodine/mustache.rb +113 -0
  112. data/lib/iodine/pubsub.rb +55 -0
  113. data/lib/iodine/rack_utils.rb +43 -0
  114. data/lib/iodine/tls.rb +16 -0
  115. data/lib/iodine/version.rb +3 -0
  116. data/lib/iodine.rb +274 -0
  117. data/lib/rack/handler/iodine.rb +33 -0
  118. data/logo.png +0 -0
  119. metadata +271 -0
@@ -0,0 +1,157 @@
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
@@ -0,0 +1,37 @@
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 */
@@ -0,0 +1,129 @@
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