opal-up 0.0.2 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +209 -0
  3. data/README.md +97 -29
  4. data/bin/up_ruby +4 -0
  5. data/bin/up_ruby_cluster +4 -0
  6. data/ext/up_ext/App.h +606 -0
  7. data/ext/up_ext/AsyncSocket.h +355 -0
  8. data/ext/up_ext/AsyncSocketData.h +87 -0
  9. data/ext/up_ext/BloomFilter.h +83 -0
  10. data/ext/up_ext/ChunkedEncoding.h +236 -0
  11. data/ext/up_ext/ClientApp.h +36 -0
  12. data/ext/up_ext/HttpContext.h +502 -0
  13. data/ext/up_ext/HttpContextData.h +56 -0
  14. data/ext/up_ext/HttpErrors.h +53 -0
  15. data/ext/up_ext/HttpParser.h +680 -0
  16. data/ext/up_ext/HttpResponse.h +578 -0
  17. data/ext/up_ext/HttpResponseData.h +95 -0
  18. data/ext/up_ext/HttpRouter.h +380 -0
  19. data/ext/up_ext/Loop.h +204 -0
  20. data/ext/up_ext/LoopData.h +112 -0
  21. data/ext/up_ext/MoveOnlyFunction.h +377 -0
  22. data/ext/up_ext/PerMessageDeflate.h +315 -0
  23. data/ext/up_ext/ProxyParser.h +163 -0
  24. data/ext/up_ext/QueryParser.h +120 -0
  25. data/ext/up_ext/TopicTree.h +363 -0
  26. data/ext/up_ext/Utilities.h +66 -0
  27. data/ext/up_ext/WebSocket.h +381 -0
  28. data/ext/up_ext/WebSocketContext.h +434 -0
  29. data/ext/up_ext/WebSocketContextData.h +109 -0
  30. data/ext/up_ext/WebSocketData.h +86 -0
  31. data/ext/up_ext/WebSocketExtensions.h +256 -0
  32. data/ext/up_ext/WebSocketHandshake.h +145 -0
  33. data/ext/up_ext/WebSocketProtocol.h +506 -0
  34. data/ext/up_ext/bsd.c +767 -0
  35. data/ext/up_ext/bsd.h +109 -0
  36. data/ext/up_ext/context.c +524 -0
  37. data/ext/up_ext/epoll_kqueue.c +458 -0
  38. data/ext/up_ext/epoll_kqueue.h +67 -0
  39. data/ext/up_ext/extconf.rb +5 -0
  40. data/ext/up_ext/internal.h +224 -0
  41. data/ext/up_ext/libusockets.h +350 -0
  42. data/ext/up_ext/libuwebsockets.cpp +1344 -0
  43. data/ext/up_ext/libuwebsockets.h +396 -0
  44. data/ext/up_ext/loop.c +386 -0
  45. data/ext/up_ext/loop_data.h +38 -0
  46. data/ext/up_ext/socket.c +231 -0
  47. data/ext/up_ext/up_ext.c +930 -0
  48. data/lib/up/bun/rack_env.rb +1 -13
  49. data/lib/up/bun/server.rb +93 -19
  50. data/lib/up/cli.rb +3 -0
  51. data/lib/up/client.rb +68 -0
  52. data/lib/up/ruby/cluster.rb +39 -0
  53. data/lib/up/ruby/cluster_cli.rb +10 -0
  54. data/lib/up/{node → ruby}/rack_cluster.rb +5 -4
  55. data/lib/up/{node → ruby}/rack_server.rb +4 -4
  56. data/lib/up/ruby/server_cli.rb +10 -0
  57. data/lib/up/u_web_socket/cluster.rb +18 -3
  58. data/lib/up/u_web_socket/server.rb +108 -15
  59. data/lib/up/version.rb +1 -1
  60. metadata +72 -30
  61. data/.gitignore +0 -5
  62. data/Gemfile +0 -2
  63. data/bin/up_node +0 -12
  64. data/bin/up_node_cluster +0 -12
  65. data/example_rack_app/Gemfile +0 -3
  66. data/example_rack_app/config.ru +0 -6
  67. data/example_rack_app/rack_app.rb +0 -5
  68. data/example_roda_app/Gemfile +0 -6
  69. data/example_roda_app/config.ru +0 -6
  70. data/example_roda_app/roda_app.rb +0 -37
  71. data/example_sinatra_app/Gemfile +0 -6
  72. data/example_sinatra_app/config.ru +0 -6
  73. data/example_sinatra_app/sinatra_app.rb +0 -7
  74. data/lib/up/node/cluster.rb +0 -39
  75. data/lib/up/node/cluster_cli.rb +0 -15
  76. data/lib/up/node/rack_env.rb +0 -106
  77. data/lib/up/node/server.rb +0 -84
  78. data/lib/up/node/server_cli.rb +0 -15
  79. data/lib/up/u_web_socket/rack_env.rb +0 -101
  80. data/opal-up.gemspec +0 -27
  81. data/up_logo.svg +0 -256
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal-up
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jan Biedermann
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-02-03 00:00:00.000000000 Z
11
+ date: 2024-02-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logger
@@ -92,6 +92,20 @@ dependencies:
92
92
  - - "~>"
93
93
  - !ruby/object:Gem::Version
94
94
  version: 13.1.0
95
+ - !ruby/object:Gem::Dependency
96
+ name: rake-compiler
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: 1.2.7
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: 1.2.7
95
109
  - !ruby/object:Gem::Dependency
96
110
  name: rspec
97
111
  requirement: !ruby/object:Gem::Requirement
@@ -106,59 +120,87 @@ dependencies:
106
120
  - - "~>"
107
121
  - !ruby/object:Gem::Version
108
122
  version: 3.12.0
109
- description: High performance Rack server for Opal Ruby
123
+ description: High performance Rack server for Opal and Ruby
110
124
  email:
111
125
  - jan@kursator.de
112
126
  executables:
113
127
  - up
114
128
  - up_bun
115
129
  - up_cluster
116
- - up_node
117
- - up_node_cluster
118
- extensions: []
130
+ - up_ruby
131
+ - up_ruby_cluster
132
+ extensions:
133
+ - ext/up_ext/extconf.rb
119
134
  extra_rdoc_files: []
120
135
  files:
121
- - ".gitignore"
122
- - Gemfile
123
136
  - LICENSE
124
137
  - README.md
125
138
  - bin/up
126
139
  - bin/up_bun
127
140
  - bin/up_cluster
128
- - bin/up_node
129
- - bin/up_node_cluster
130
- - example_rack_app/Gemfile
131
- - example_rack_app/config.ru
132
- - example_rack_app/rack_app.rb
133
- - example_roda_app/Gemfile
134
- - example_roda_app/config.ru
135
- - example_roda_app/roda_app.rb
136
- - example_sinatra_app/Gemfile
137
- - example_sinatra_app/config.ru
138
- - example_sinatra_app/sinatra_app.rb
141
+ - bin/up_ruby
142
+ - bin/up_ruby_cluster
143
+ - ext/up_ext/App.h
144
+ - ext/up_ext/AsyncSocket.h
145
+ - ext/up_ext/AsyncSocketData.h
146
+ - ext/up_ext/BloomFilter.h
147
+ - ext/up_ext/ChunkedEncoding.h
148
+ - ext/up_ext/ClientApp.h
149
+ - ext/up_ext/HttpContext.h
150
+ - ext/up_ext/HttpContextData.h
151
+ - ext/up_ext/HttpErrors.h
152
+ - ext/up_ext/HttpParser.h
153
+ - ext/up_ext/HttpResponse.h
154
+ - ext/up_ext/HttpResponseData.h
155
+ - ext/up_ext/HttpRouter.h
156
+ - ext/up_ext/Loop.h
157
+ - ext/up_ext/LoopData.h
158
+ - ext/up_ext/MoveOnlyFunction.h
159
+ - ext/up_ext/PerMessageDeflate.h
160
+ - ext/up_ext/ProxyParser.h
161
+ - ext/up_ext/QueryParser.h
162
+ - ext/up_ext/TopicTree.h
163
+ - ext/up_ext/Utilities.h
164
+ - ext/up_ext/WebSocket.h
165
+ - ext/up_ext/WebSocketContext.h
166
+ - ext/up_ext/WebSocketContextData.h
167
+ - ext/up_ext/WebSocketData.h
168
+ - ext/up_ext/WebSocketExtensions.h
169
+ - ext/up_ext/WebSocketHandshake.h
170
+ - ext/up_ext/WebSocketProtocol.h
171
+ - ext/up_ext/bsd.c
172
+ - ext/up_ext/bsd.h
173
+ - ext/up_ext/context.c
174
+ - ext/up_ext/epoll_kqueue.c
175
+ - ext/up_ext/epoll_kqueue.h
176
+ - ext/up_ext/extconf.rb
177
+ - ext/up_ext/internal.h
178
+ - ext/up_ext/libusockets.h
179
+ - ext/up_ext/libuwebsockets.cpp
180
+ - ext/up_ext/libuwebsockets.h
181
+ - ext/up_ext/loop.c
182
+ - ext/up_ext/loop_data.h
183
+ - ext/up_ext/socket.c
184
+ - ext/up_ext/up_ext.c
139
185
  - lib/up/bun/rack_env.rb
140
186
  - lib/up/bun/rack_server.rb
141
187
  - lib/up/bun/server.rb
142
188
  - lib/up/bun/server_cli.rb
143
189
  - lib/up/cli.rb
144
- - lib/up/node/cluster.rb
145
- - lib/up/node/cluster_cli.rb
146
- - lib/up/node/rack_cluster.rb
147
- - lib/up/node/rack_env.rb
148
- - lib/up/node/rack_server.rb
149
- - lib/up/node/server.rb
150
- - lib/up/node/server_cli.rb
190
+ - lib/up/client.rb
151
191
  - lib/up/rack_builder_patch.rb
192
+ - lib/up/ruby/cluster.rb
193
+ - lib/up/ruby/cluster_cli.rb
194
+ - lib/up/ruby/rack_cluster.rb
195
+ - lib/up/ruby/rack_server.rb
196
+ - lib/up/ruby/server_cli.rb
152
197
  - lib/up/u_web_socket/cluster.rb
153
198
  - lib/up/u_web_socket/cluster_cli.rb
154
199
  - lib/up/u_web_socket/rack_cluster.rb
155
- - lib/up/u_web_socket/rack_env.rb
156
200
  - lib/up/u_web_socket/rack_server.rb
157
201
  - lib/up/u_web_socket/server.rb
158
202
  - lib/up/u_web_socket/server_cli.rb
159
203
  - lib/up/version.rb
160
- - opal-up.gemspec
161
- - up_logo.svg
162
204
  homepage: ''
163
205
  licenses:
164
206
  - MIT
@@ -171,7 +213,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
171
213
  requirements:
172
214
  - - ">="
173
215
  - !ruby/object:Gem::Version
174
- version: '0'
216
+ version: 3.0.0
175
217
  required_rubygems_version: !ruby/object:Gem::Requirement
176
218
  requirements:
177
219
  - - ">="
data/.gitignore DELETED
@@ -1,5 +0,0 @@
1
- node_modules
2
- Gemfile.lock
3
- package-lock.json
4
- package.json
5
- *.gem
data/Gemfile DELETED
@@ -1,2 +0,0 @@
1
- source 'https://rubygems.org'
2
- gemspec
data/bin/up_node DELETED
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- if RUBY_ENGINE == 'opal'
4
- require 'up/node/server_cli'
5
- Up::CLI.call
6
- else
7
- require 'up/cli'
8
- Up::CLI.setup_node
9
- lib_dir = File.expand_path("#{__dir__}/../lib")
10
- gems = Up::CLI.get_gems_for_cmd
11
- Kernel.exec("opal -Rnodejs -E -I. -I#{lib_dir} -g rack #{gems} #{__FILE__} -- #{ARGV.join(' ')}")
12
- end
data/bin/up_node_cluster DELETED
@@ -1,12 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- if RUBY_ENGINE == 'opal'
4
- require 'up/node/cluster_cli'
5
- Up::CLI.call
6
- else
7
- require 'up/cli'
8
- Up::CLI.setup_node
9
- lib_dir = File.expand_path("#{__dir__}/../lib")
10
- gems = Up::CLI.get_gems_for_cmd
11
- Kernel.exec("opal -Rnodejs -E -I. -I#{lib_dir} -g rack #{gems} #{__FILE__} -- #{ARGV.join(' ')}")
12
- end
@@ -1,3 +0,0 @@
1
- source 'https://rubygems.org'
2
-
3
- gem 'opal-up', path: '../'
@@ -1,6 +0,0 @@
1
- require_relative 'rack_app'
2
- if defined? RubyVM
3
- # ensure up contenders use a JIT
4
- RubyVM::YJIT.enable
5
- end
6
- run RackApp
@@ -1,5 +0,0 @@
1
- class RackApp
2
- def self.call(env)
3
- [200, {}, [env.to_s]]
4
- end
5
- end
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
- git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
-
4
- gem 'rack', path: '../../rack'
5
- gem 'opal-up', path: '../'
6
- gem 'roda', path: '../../roda'
@@ -1,6 +0,0 @@
1
- require_relative 'roda_app'
2
- if defined? RubyVM
3
- # ensure up contenders use a JIT
4
- RubyVM::YJIT.enable
5
- end
6
- run RodaApp.freeze
@@ -1,37 +0,0 @@
1
- require "roda"
2
-
3
- class RodaApp < Roda
4
- STDERR.puts "executing route"
5
- route do |r|
6
- STDERR.puts r
7
- # GET / request
8
- r.root do
9
- r.redirect "/hello"
10
- end
11
-
12
- # /hello branch
13
- r.on "hello" do
14
- # Set variable for all routes in /hello branch
15
- @greeting = 'Hello'
16
-
17
- # GET /hello/world request
18
- r.get "world" do
19
- "#{@greeting} world!"
20
- end
21
-
22
- # /hello request
23
- r.is do
24
- # GET /hello request
25
- r.get do
26
- "#{@greeting}!"
27
- end
28
-
29
- # POST /hello request
30
- r.post do
31
- puts "Someone said #{@greeting}!"
32
- r.redirect
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,6 +0,0 @@
1
- source 'https://rubygems.org'
2
- git_source(:github) { |repo| "https://github.com/#{repo}.git" }
3
-
4
- gem 'opal', github: 'opal/opal'
5
- gem 'opal-up', path: '../'
6
- gem 'sinatra'
@@ -1,6 +0,0 @@
1
- require_relative 'sinatra_app'
2
- if defined? RubyVM
3
- # ensure up contenders use a JIT
4
- RubyVM::YJIT.enable
5
- end
6
- run SinatraApp
@@ -1,7 +0,0 @@
1
- require 'sinatra/base'
2
-
3
- class SinatraApp
4
- get '/' do
5
- 'Hello world!'
6
- end
7
- end
@@ -1,39 +0,0 @@
1
- # backtick_javascript: true
2
- require 'up/node/server'
3
-
4
- %x{
5
- const cluster = require('node:cluster');
6
- const num_workers = require('node:os').availableParallelism();
7
- }
8
-
9
- module Up
10
- module Node
11
- class Cluster < Up::Node::Server
12
- def initialize(app:, host: 'localhost', port: 3000, scheme: 'http', ca_file: nil, cert_file: nil, key_file: nil, workers: nil)
13
- super(app: app, host: host, port: port, scheme: scheme, ca_file: ca_file, cert_file: cert_file, key_file: key_file)
14
- @workers = workers || `num_workers`
15
- @members = []
16
- end
17
-
18
- def listen
19
- raise "already running" unless @members.empty?
20
- %x{
21
- if (cluster.isPrimary) {
22
- for (let i = 0; i < #@workers; i++) {
23
- #@members.push(cluster.fork());
24
- }
25
- } else {
26
- #{super}
27
- }
28
- }
29
- end
30
-
31
- def stop
32
- if Up::CLI::stoppable?
33
- @members.each { |m| `m.kill()` }
34
- @members.clear
35
- end
36
- end
37
- end
38
- end
39
- end
@@ -1,15 +0,0 @@
1
- require 'opal/platform'
2
- require 'nodejs/file'
3
- require 'nodejs/require'
4
- require 'opal-parser'
5
- require 'rack/builder'
6
- require 'up/rack_builder_patch'
7
- require 'up/node/rack_cluster'
8
-
9
- module Up
10
- module CLI
11
- def self.call
12
- Up::Node::RackCluster.run(get_app, get_options)
13
- end
14
- end
15
- end
@@ -1,106 +0,0 @@
1
- # backtick_javascript: true
2
-
3
- require 'logger'
4
- require 'up/version'
5
-
6
- module Up
7
- module Node
8
- class RackEnv < ::Hash
9
- RACK_VARS = %w[rack.errors rack.hijack rack.hijack? rack.input rack.logger
10
- rack.multipart.buffer_size rack.multipart.tempfile_factory
11
- rack.response_finished
12
- rack.session rack.upgrade rack.upgrade? rack.url_scheme
13
- HTTP_ACCEPT HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE
14
- HTTP_CONNECTION HTTP_HOST HTTP_USER_AGENT HTTP_VERSION PATH_INFO QUERY_STRING REQUEST_METHOD
15
- SCRIPT_NAME SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE]
16
- def initialize(req, config)
17
- @req = req
18
- @config = config
19
- end
20
-
21
- def [](key)
22
- return super(key) if key?(key)
23
- self[key] = case key
24
- when 'rack.errors'
25
- STDERR
26
- when 'rack.hijack'
27
- nil
28
- when 'rack.hijack?'
29
- false
30
- when 'rack.input'
31
- ::IO.new
32
- when 'rack.logger'
33
- ::Logger.new(self['rack.errors'])
34
- when 'rack.multipart.buffer_size'
35
- 4096
36
- when 'rack.multipart.tempfile_factory'
37
- proc { |_filename, _content_type| File.new }
38
- when 'rack.response_finished'
39
- []
40
- when 'rack.session'
41
- {}
42
- when 'rack.upgrade'
43
- nil
44
- when 'rack.upgrade?'
45
- nil
46
- when 'rack.url_scheme'
47
- @config[:scheme]
48
- when 'HTTP_VERSION'
49
- `#@reg.httpVersion`
50
- when 'PATH_INFO'
51
- `#@req.url`
52
- when 'QUERY_STRING'
53
- ""
54
- when 'RACK_ERRORS'
55
- self['rack.errors']
56
- when 'RACK_LOGGER'
57
- self['rack.logger']
58
- when 'REQUEST_METHOD'
59
- `#@req.method`
60
- when 'SCRIPT_NAME'
61
- ""
62
- when 'SERVER_NAME'
63
- @config[:host]
64
- when 'SERVER_PORT'
65
- @config[:port].to_s
66
- when 'SERVER_PROTOCOL'
67
- ""
68
- when 'SERVER_SOFTWARE'
69
- "#{@config[:handler]}/#{Up::VERSION} #{@config[:engine]}"
70
- else
71
- if key.start_with?('HTTP_')
72
- key = key[5..].gsub(/_/, '-')
73
- `#@req.headers[key.toLowerCase()]`
74
- else
75
- nil
76
- end
77
- end
78
- end
79
-
80
- def req_headers
81
- h = {}
82
- %x{
83
- var hdr, hds = #@req.headers;
84
- for (hdr in hds) { h.set(hdr, hdrs[hdr]); }
85
- }
86
- h
87
- end
88
-
89
- def each
90
- unless @got_them_all
91
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
92
- @got_them_all = true
93
- end
94
- super
95
- end
96
-
97
- def to_s
98
- unless @got_them_all
99
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
100
- @got_them_all = true
101
- end
102
- super
103
- end
104
- end
105
- end
106
- end
@@ -1,84 +0,0 @@
1
- # backtick_javascript: true
2
- require 'up/cli'
3
- require 'up/node/rack_env'
4
-
5
- %x{
6
- module.paths.push(process.cwd() + '/node_modules');
7
- const http = require('node:http');
8
- const https = require('node:https');
9
- const fs = require('node:fs');
10
- }
11
-
12
- module Up
13
- module Node
14
- class Server
15
- def initialize(app:, host: 'localhost', port: 3000, scheme: 'http', ca_file: nil, cert_file: nil, key_file: nil)
16
- @app = app
17
- @scheme = scheme || 'http'
18
- raise "unsupported scheme #{@scheme}" unless %w[http https].include?(@scheme)
19
- @host = host || 'localhost'
20
- @port = port&.to_i || 3000
21
- @config = { handler: self.class.name, engine: "node/#{`process.version`}", port: port, scheme: scheme, host: host }.freeze
22
- @ca_file = ca_file
23
- @cert_file = cert_file
24
- @key_file = key_file
25
- @server = nil
26
- end
27
-
28
- %x{
29
- self.handle_headers = function(rack_headers, srv_res) {
30
- if (rack_headers.$$is_hash) {
31
- var header, k, v;
32
- for(header of rack_headers) {
33
- k = header[0];
34
- if (!k.startsWith('rack.')) {
35
- v = header[1];
36
- if (v.$$is_array) {
37
- v = v.join("\n");
38
- }
39
- srv_res.setHeader(k, v);
40
- }
41
- }
42
- }
43
- }
44
-
45
- self.handle_response = function(parts, srv_res) {
46
- if (parts["$respond_to?"]('each')) {
47
- #{`parts`.each { |part| `srv_res.write(part)` }}
48
- } else if (parts["$respond_to?"]('call')) {
49
- srv_res.write(parts.$call());
50
- }
51
- #{`parts`.close if `parts`.respond_to?(:close)}
52
- }
53
- }
54
-
55
- def listen
56
- raise "already running" if @server
57
- %x{
58
- const ounr = Opal.Up.Node.RackEnv;
59
- const ouns = Opal.Up.Node.Server;
60
- function handler(req, res) {
61
- const rack_res = #@app.$call(ounr.$new(req, #@config));
62
- res.statusCode = rack_res[0];
63
- ouns.handle_headers(rack_res[1], res);
64
- ouns.handle_response(rack_res[2], res);
65
- res.end();
66
- }
67
- if (#@scheme == 'https') {
68
- #@server = https.createServer({ ca: fs.readFileSync(#@ca_file), cert: fs.readFileSync(#@cert_file), key: fs.readFileSync(#@key_file) }, handler);
69
- } else {
70
- #@server = http.createServer(handler);
71
- }
72
- #@server.listen(#@port, #@host, () => { console.log(`Server is running on ${#@scheme}://${#@host}:${#@port}`)});
73
- }
74
- end
75
-
76
- def stop
77
- if Up::CLI::stoppable?
78
- `#@server.close()`
79
- @server = nil
80
- end
81
- end
82
- end
83
- end
84
- end
@@ -1,15 +0,0 @@
1
- require 'opal/platform'
2
- require 'nodejs/file'
3
- require 'nodejs/require'
4
- require 'opal-parser'
5
- require 'rack/builder'
6
- require 'up/rack_builder_patch'
7
- require 'up/node/rack_server'
8
-
9
- module Up
10
- module CLI
11
- def self.call
12
- Up::Node::RackServer.run(get_app, get_options)
13
- end
14
- end
15
- end
@@ -1,101 +0,0 @@
1
- # backtick_javascript: true
2
-
3
- require 'logger'
4
- require 'up/version'
5
-
6
- module Up
7
- module UWebSocket
8
- class RackEnv < ::Hash
9
- RACK_VARS = %w[rack.errors rack.hijack rack.hijack? rack.input rack.logger
10
- rack.multipart.buffer_size rack.multipart.tempfile_factory
11
- rack.response_finished
12
- rack.session rack.upgrade rack.upgrade? rack.url_scheme
13
- HTTP_ACCEPT HTTP_ACCEPT_ENCODING HTTP_ACCEPT_LANGUAGE
14
- HTTP_CONNECTION HTTP_HOST HTTP_USER_AGENT PATH_INFO QUERY_STRING REQUEST_METHOD
15
- SCRIPT_NAME SERVER_NAME SERVER_PROTOCOL SERVER_SOFTWARE]
16
- def initialize(req, config)
17
- @req = req
18
- @config = config
19
- end
20
-
21
- def [](key)
22
- return super(key) if key?(key)
23
- self[key] = case key
24
- when 'rack.errors'
25
- STDERR
26
- when 'rack.hijack'
27
- nil
28
- when 'rack.hijack?'
29
- false
30
- when 'rack.input'
31
- ::IO.new
32
- when 'rack.logger'
33
- ::Logger.new(self['rack.errors'])
34
- when 'rack.multipart.buffer_size'
35
- 4096
36
- when 'rack.multipart.tempfile_factory'
37
- proc { |_filename, _content_type| File.new }
38
- when 'rack.response_finished'
39
- []
40
- when 'rack.session'
41
- {}
42
- when 'rack.upgrade'
43
- nil
44
- when 'rack.upgrade?'
45
- nil
46
- when 'rack.url_scheme'
47
- @config[:scheme]
48
- when 'PATH_INFO'
49
- `#@req.getUrl()`
50
- when 'QUERY_STRING'
51
- `#@req.getQuery()`
52
- when 'RACK_ERRORS'
53
- self['rack.errors']
54
- when 'RACK_LOGGER'
55
- self['rack.logger']
56
- when 'REQUEST_METHOD'
57
- `#@req.getMethod().toUpperCase()`
58
- when 'SCRIPT_NAME'
59
- ""
60
- when 'SERVER_NAME'
61
- @config[:host]
62
- when 'SERVER_PORT'
63
- @config[:port].to_s
64
- when 'SERVER_PROTOCOL'
65
- `#@req.getHeader('protocol')`
66
- when 'SERVER_SOFTWARE'
67
- "#{@config[:handler]}/#{Up::VERSION} #{@config[:engine]}"
68
- else
69
- if key.start_with?('HTTP_')
70
- key = key[5..].gsub(/_/, '-')
71
- `#@req.getHeader(key.toLowerCase())`
72
- else
73
- nil
74
- end
75
- end
76
- end
77
-
78
- def req_headers
79
- h = {}
80
- `#@req.forEach((k, v) => { h.set(k, v); })`
81
- h
82
- end
83
-
84
- def each
85
- unless @got_them_all
86
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
87
- @got_them_all = true
88
- end
89
- super
90
- end
91
-
92
- def to_s
93
- unless @got_them_all
94
- RACK_VARS.each { |k| self[k] unless self.key?(k) }
95
- @got_them_all = true
96
- end
97
- super
98
- end
99
- end
100
- end
101
- end