thin-fun_embed 0.0.3 → 0.0.5

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 554cca8c4ae41336cb638483d6435f7e6b890c39
4
+ data.tar.gz: 6b247bd9fbc43b05020e5b18f0bcde245c993d2e
5
+ SHA512:
6
+ metadata.gz: f8b61923ba35ee4012c285462a7dc05c46ce5c5c09468a01e72dcccc6aae54ecbc1c6e1de2e01ee8bac0d8386e6a43df1f37cd2f3d8f769f459c5a1001bdd501
7
+ data.tar.gz: 8fb9978fcf053c339bf15d7aae8f8b99c9ce72ad2b96cd9ec8c7c637feb3e3a5f30ad67217c6780c3e334a091fd3bae0214d73642d6eef2d695a819bbd4fb419
data/Gemfile CHANGED
@@ -1,5 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in thin-fun_embed.gemspec
4
- gem 'eventmachine', '1.0.0.rc.4'
5
4
  gemspec
@@ -0,0 +1,21 @@
1
+ require "libevent"
2
+
3
+ # create event base
4
+ base = Libevent::Base.new
5
+
6
+ # create http server instance
7
+ http = Libevent::Http.new(base)
8
+
9
+ # bind socket
10
+ http.bind_socket("0.0.0.0", 8080)
11
+
12
+ # set handler
13
+ http.handler do |request|
14
+ request.send_reply(200, {}, ["Hello World\n"])
15
+ end
16
+
17
+ # catch SIGINT
18
+ base.trap_signal("INT") { base.exit_loop }
19
+
20
+ # start libevent loop
21
+ base.dispatch
@@ -1,28 +1,20 @@
1
1
  # :stopdoc:
2
- require 'thin/fun_embed.rb'
2
+ require 'thin/fun_daemon.rb'
3
3
 
4
- class RackLikeServer < Thin::FunEmbed
5
- attr_accessor :app
6
- def handle_http_request(env)
7
- send_rack_response(*app.call(env))
4
+ app = lambda{|env|
5
+ con = env['async.fun_embed']
6
+ if env['PATH_INFO'] =~ %r{async\/(\d+)}
7
+ EM.add_timer($1.to_f / 1000) do
8
+ con.send_rack_response 200, {'Content-Length'=>6}, ['hello', "\n"]
9
+ end
10
+ con.class::AsyncResponse
11
+ else
12
+ [200, {'Content-Length'=>6}, ['hello', "\n"]]
8
13
  end
9
- end
10
-
11
- app = proc{|env| [200, {'Content-Length'=>6}, ['hello', "\n"]]}
14
+ }
12
15
 
13
16
  host, port = '0.0.0.0', 8080
14
- all_conns = {}
15
- trap(:INT) do
16
- EM.schedule{
17
- all_conns.each{|conn, _| conn.close_after_writting}
18
- EM.next_tick{ EM.stop }
19
- }
20
- end
21
17
 
22
- EM.run do
23
- EM.start_server host, port, RackLikeServer do |conn|
24
- conn.app = app
25
- all_conns[conn] = true
26
- conn.unbind_callback = all_conns.method(:delete)
27
- end
28
- end
18
+ Thin::FunDaemon.trap
19
+ Thin::FunDaemon.run_rack host, port, app
20
+ EM.run
@@ -0,0 +1,68 @@
1
+ require_relative 'fun_embed'
2
+
3
+ module Thin
4
+ module FunDaemon
5
+ def self.add_conn(conn)
6
+ @conns ||= {}
7
+ @conns[conn] = true
8
+ end
9
+
10
+ def self.del_conn(conn)
11
+ @conns.delete(conn)
12
+ if @trap_called && @conns.empty?
13
+ EM.next_tick{ EM.stop }
14
+ end
15
+ end
16
+
17
+ def self.servers
18
+ @servers ||= {}
19
+ end
20
+
21
+ def self.trap
22
+ return if @trap_set
23
+ @trap_set = true
24
+ ::Signal.trap(:INT){ trap_call }
25
+ ::Signal.trap(:TERM){ trap_call }
26
+ ::Signal.trap(:QUIT){ trap_call }
27
+ end
28
+
29
+ def self.trap_call
30
+ @trap_called = true
31
+ Thread.new do
32
+ EM.schedule do
33
+ servers.each do |serv, _|
34
+ EM.stop_tcp_server serv
35
+ end
36
+ if @conns && !@conns.empty?
37
+ @conns.each do |conn, _|
38
+ conn.close_connection_after_writing
39
+ end
40
+ else
41
+ EM.next_tick{ EM.stop }
42
+ end
43
+ end
44
+ end
45
+ ::Signal.trap(:INT, 'DEFAULT')
46
+ ::Signal.trap(:TERM, 'DEFAULT')
47
+ ::Signal.trap(:QUIT, 'DEFAULT')
48
+ end
49
+
50
+ def self.run_class(host, port, klass, *args, &block)
51
+ EM.schedule do
52
+ serv = EM.start_server host, port, klass, *args do |conn|
53
+ yield conn
54
+ conn.unbind_callback = method(:del_conn)
55
+ add_conn conn
56
+ end
57
+ servers[serv] = true
58
+ end
59
+ end
60
+
61
+ def self.run_rack(host, port, app = nil, &blk)
62
+ app ||= blk
63
+ run_class host, port, FunRackLike do |conn|
64
+ conn.app = app
65
+ end
66
+ end
67
+ end
68
+ end
@@ -177,4 +177,19 @@ module Thin # :nodoc:
177
177
  @unbind_callback && @unbind_callback.call(self)
178
178
  end
179
179
  end
180
+
181
+ class FunRackLike < FunEmbed
182
+ attr_accessor :app
183
+ ASYNC_CALLBACK = 'async.callback'.freeze
184
+ FUN_EMBED = 'async.fun_embed'.freeze
185
+ AsyncResponse = [-1, {}.freeze, [].freeze].freeze
186
+ def handle_http_request(env)
187
+ env[ASYNC_CALLBACK] = method(:send_rack_response)
188
+ env[FUN_EMBED] = self
189
+ res = app.call(env)
190
+ if res[0] != -1
191
+ send_rack_response(*res)
192
+ end
193
+ end
194
+ end
180
195
  end
@@ -1,6 +1,6 @@
1
1
  require 'eventmachine'
2
2
  module Thin # :nodoc:
3
3
  class FunEmbed < EM::Connection
4
- VERSION = "0.0.3"
4
+ VERSION = "0.0.5"
5
5
  end
6
6
  end
metadata CHANGED
@@ -1,30 +1,27 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thin-fun_embed
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.0.5
6
5
  platform: ruby
7
6
  authors:
8
7
  - Sokolov Yura 'funny-falcon'
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2012-09-27 00:00:00.000000000 Z
11
+ date: 2015-01-16 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: thin
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
- - - ! '>='
17
+ - - ">="
20
18
  - !ruby/object:Gem::Version
21
19
  version: '1.4'
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
- - - ! '>='
24
+ - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '1.4'
30
27
  description: trim of Thin web server for embedding into eventmachined application
@@ -34,43 +31,43 @@ executables: []
34
31
  extensions: []
35
32
  extra_rdoc_files: []
36
33
  files:
37
- - examples/simple_200_ok.rb
34
+ - Gemfile
35
+ - LICENSE
36
+ - README.rdoc
37
+ - Rakefile
38
+ - examples/config.ru
39
+ - examples/libevent.rb
38
40
  - examples/rack_like.rb
39
- - examples/status_body.rb
40
41
  - examples/rains.conf
41
- - examples/config.ru
42
+ - examples/simple_200_ok.rb
43
+ - examples/status_body.rb
44
+ - lib/thin/fun_daemon.rb
45
+ - lib/thin/fun_embed.rb
42
46
  - lib/thin/fun_embed/constants.rb
43
47
  - lib/thin/fun_embed/version.rb
44
- - lib/thin/fun_embed.rb
45
- - Gemfile
46
- - LICENSE
47
- - Rakefile
48
- - README.rdoc
49
48
  - thin-fun_embed.gemspec
50
49
  homepage: https://github.com/funny-falcon/thin-fun_embed
51
50
  licenses: []
51
+ metadata: {}
52
52
  post_install_message:
53
53
  rdoc_options: []
54
54
  require_paths:
55
55
  - lib
56
56
  required_ruby_version: !ruby/object:Gem::Requirement
57
- none: false
58
57
  requirements:
59
- - - ! '>='
58
+ - - ">="
60
59
  - !ruby/object:Gem::Version
61
60
  version: '0'
62
61
  required_rubygems_version: !ruby/object:Gem::Requirement
63
- none: false
64
62
  requirements:
65
- - - ! '>='
63
+ - - ">="
66
64
  - !ruby/object:Gem::Version
67
65
  version: '0'
68
66
  requirements: []
69
67
  rubyforge_project:
70
- rubygems_version: 1.8.24
68
+ rubygems_version: 2.4.5
71
69
  signing_key:
72
- specification_version: 3
70
+ specification_version: 4
73
71
  summary: Subclass of EM::Connection which uses thin internals to do http request handling.
74
72
  It is intentionally not Rack server, but could be used to build some.
75
73
  test_files: []
76
- has_rdoc: