rubysl-gserver 1.0.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: b59a46b0c246f54cb0d7b5e2cf785afc32e39a31
4
- data.tar.gz: 4fd286c7d23568841c76702b13b8240ee0a8c998
3
+ metadata.gz: c66e019aa38de4678577becb51ea434ed86eb284
4
+ data.tar.gz: 4566b0d3787f35db9a222ea6d8e94860881fef1f
5
5
  SHA512:
6
- metadata.gz: d3138998f198e787b8bfed1d5ecaf987ffd43642b7593c73681e6c0e8f8ae7700f246a9793fedde42252234f719734e164e7b94ac27909d135ad1211479e32f3
7
- data.tar.gz: 41909ba24a7494f19c47172dca23aed0ff807b5a9074b8e1faec8d060f0cccae3e10a85f01694ae11f3375d5805b336f32dd7e6d3f696b59d1c3545cbf41f5a4
6
+ metadata.gz: 1121d30580a3695fb79ac3d6019502edb23ed7cef3fb810d727f09069abe17cff1e1a2e6832506aa70708f3d242671e766671d3592975dace394b7f7831e0ac1
7
+ data.tar.gz: 6a327e9484af7eeff55cfb874e320be054d5757272fb1747a2974c8dc8de4c5424dda6c9109f893419a3c7e3469e6cf58878e477bbc548586ee8a81afdc2ce6b
@@ -1,8 +1,7 @@
1
1
  language: ruby
2
- before_install:
3
- - gem update --system
4
- - gem --version
5
- - gem install rubysl-bundler
6
- script: bundle exec mspec spec
2
+ env:
3
+ - RUBYLIB=lib
4
+ script: bundle exec mspec
7
5
  rvm:
8
- - rbx-nightly-18mode
6
+ - 1.9.3
7
+ - rbx-nightly-19mode
@@ -4,16 +4,13 @@
4
4
  # Author:: John W. Small
5
5
  # Documentation:: Gavin Sinclair
6
6
  # Licence:: Freeware.
7
- #
8
- # See the class GServer for documentation.
9
- #
10
7
 
11
8
  require "socket"
12
9
  require "thread"
13
10
 
14
11
  #
15
12
  # GServer implements a generic server, featuring thread pool management,
16
- # simple logging, and multi-server management. See HttpServer in
13
+ # simple logging, and multi-server management. See HttpServer in
17
14
  # <tt>xmlrpc/httpserver.rb</tt> in the Ruby standard library for an example of
18
15
  # GServer in action.
19
16
  #
@@ -25,7 +22,7 @@ require "thread"
25
22
  # you the effort. All events are optionally logged, but you can provide your
26
23
  # own event handlers if you wish.
27
24
  #
28
- # === Example
25
+ # == Example
29
26
  #
30
27
  # Using GServer is simple. Below we implement a simple time server, run it,
31
28
  # query it, and shut it down. Try this code in +irb+:
@@ -34,30 +31,30 @@ require "thread"
34
31
  #
35
32
  # #
36
33
  # # A server that returns the time in seconds since 1970.
37
- # #
34
+ # #
38
35
  # class TimeServer < GServer
39
36
  # def initialize(port=10001, *args)
40
37
  # super(port, *args)
41
38
  # end
42
39
  # def serve(io)
43
- # io.puts(Time.now.to_i)
40
+ # io.puts(Time.now.to_s)
44
41
  # end
45
42
  # end
46
43
  #
47
44
  # # Run the server with logging enabled (it's a separate thread).
48
45
  # server = TimeServer.new
49
46
  # server.audit = true # Turn logging on.
50
- # server.start
47
+ # server.start
51
48
  #
52
49
  # # *** Now point your browser to http://localhost:10001 to see it working ***
53
50
  #
54
- # # See if it's still running.
51
+ # # See if it's still running.
55
52
  # GServer.in_service?(10001) # -> true
56
53
  # server.stopped? # -> false
57
54
  #
58
55
  # # Shut the server down gracefully.
59
56
  # server.shutdown
60
- #
57
+ #
61
58
  # # Alternatively, stop it immediately.
62
59
  # GServer.stop(10001)
63
60
  # # or, of course, "server.stop".
@@ -73,14 +70,14 @@ require "thread"
73
70
  # other methods as well if you wish, perhaps to collect statistics, or emit
74
71
  # more detailed logging.
75
72
  #
76
- # connecting
77
- # disconnecting
78
- # starting
79
- # stopping
73
+ # * #connecting
74
+ # * #disconnecting
75
+ # * #starting
76
+ # * #stopping
80
77
  #
81
- # The above methods are only called if auditing is enabled.
78
+ # The above methods are only called if auditing is enabled, via #audit=.
82
79
  #
83
- # You can also override +log+ and +error+ if, for example, you wish to use a
80
+ # You can also override #log and #error if, for example, you wish to use a
84
81
  # more sophisticated logging system.
85
82
  #
86
83
  class GServer
@@ -93,17 +90,28 @@ class GServer
93
90
  @@services = {} # Hash of opened ports, i.e. services
94
91
  @@servicesMutex = Mutex.new
95
92
 
93
+ # Stop the server running on the given port, bound to the given host
94
+ #
95
+ # +port+:: port, as a FixNum, of the server to stop
96
+ # +host+:: host on which to find the server to stop
96
97
  def GServer.stop(port, host = DEFAULT_HOST)
97
98
  @@servicesMutex.synchronize {
98
99
  @@services[host][port].stop
99
100
  }
100
101
  end
101
102
 
103
+ # Check if a server is running on the given port and host
104
+ #
105
+ # +port+:: port, as a FixNum, of the server to check
106
+ # +host+:: host on which to find the server to check
107
+ #
108
+ # Returns true if a server is running on that port and host.
102
109
  def GServer.in_service?(port, host = DEFAULT_HOST)
103
110
  @@services.has_key?(host) and
104
111
  @@services[host].has_key?(port)
105
112
  end
106
113
 
114
+ # Stop the server
107
115
  def stop
108
116
  @connectionsMutex.synchronize {
109
117
  if @tcpServerThread
@@ -112,25 +120,45 @@ class GServer
112
120
  }
113
121
  end
114
122
 
123
+ # Returns true if the server has stopped.
115
124
  def stopped?
116
125
  @tcpServerThread == nil
117
126
  end
118
127
 
128
+ # Schedule a shutdown for the server
119
129
  def shutdown
120
130
  @shutdown = true
121
131
  end
122
132
 
133
+ # Return the current number of connected clients
123
134
  def connections
124
135
  @connections.size
125
136
  end
126
137
 
138
+ # Join with the server thread
127
139
  def join
128
140
  @tcpServerThread.join if @tcpServerThread
129
141
  end
130
142
 
131
- attr_reader :port, :host, :maxConnections
132
- attr_accessor :stdlog, :audit, :debug
143
+ # Port on which to listen, as a FixNum
144
+ attr_reader :port
145
+ # Host on which to bind, as a String
146
+ attr_reader :host
147
+ # Maximum number of connections to accept at at ime, as a FixNum
148
+ attr_reader :maxConnections
149
+ # IO Device on which log messages should be written
150
+ attr_accessor :stdlog
151
+ # Set to true to cause the callbacks #connecting, #disconnecting, #starting,
152
+ # and #stopping to be called during the server's lifecycle
153
+ attr_accessor :audit
154
+ # Set to true to show more detailed logging
155
+ attr_accessor :debug
133
156
 
157
+ # Called when a client connects, if auditing is enabled.
158
+ #
159
+ # +client+:: a TCPSocket instances representing the client that connected
160
+ #
161
+ # Return true to allow this client to connect, false to prevent it.
134
162
  def connecting(client)
135
163
  addr = client.peeraddr
136
164
  log("#{self.class.to_s} #{@host}:#{@port} client:#{addr[1]} " +
@@ -138,6 +166,10 @@ class GServer
138
166
  true
139
167
  end
140
168
 
169
+
170
+ # Called when a client disconnects, if audition is enabled.
171
+ #
172
+ # +clientPort+:: the port of the client that is connecting
141
173
  def disconnecting(clientPort)
142
174
  log("#{self.class.to_s} #{@host}:#{@port} " +
143
175
  "client:#{clientPort} disconnect")
@@ -145,20 +177,30 @@ class GServer
145
177
 
146
178
  protected :connecting, :disconnecting
147
179
 
180
+ # Called when the server is starting up, if auditing is enabled.
148
181
  def starting()
149
182
  log("#{self.class.to_s} #{@host}:#{@port} start")
150
183
  end
151
184
 
185
+ # Called when the server is shutting down, if auditing is enabled.
152
186
  def stopping()
153
187
  log("#{self.class.to_s} #{@host}:#{@port} stop")
154
188
  end
155
189
 
156
190
  protected :starting, :stopping
157
191
 
192
+ # Called if #debug is true whenever an unhandled exception is raised.
193
+ # This implementation simply logs the backtrace.
194
+ #
195
+ # +detail+:: The Exception that was caught
158
196
  def error(detail)
159
197
  log(detail.backtrace.join("\n"))
160
198
  end
161
199
 
200
+ # Log a message to #stdlog, if it's defined. This implementation
201
+ # outputs the timestamp and message to the log.
202
+ #
203
+ # +msg+:: the message to log
162
204
  def log(msg)
163
205
  if @stdlog
164
206
  @stdlog.puts("[#{Time.new.ctime}] %s" % msg)
@@ -168,6 +210,15 @@ class GServer
168
210
 
169
211
  protected :error, :log
170
212
 
213
+ # Create a new server
214
+ #
215
+ # +port+:: the port, as a FixNum, on which to listen.
216
+ # +host+:: the host to bind to
217
+ # +maxConnections+:: The maximum number of simultaneous connections to
218
+ # accept
219
+ # +stdlog+:: IO device on which to log messages
220
+ # +audit+:: if true, lifecycle callbacks will be called. See #audit
221
+ # +debug+:: if true, error messages are logged. See #debug
171
222
  def initialize(port, host = DEFAULT_HOST, maxConnections = 4,
172
223
  stdlog = $stderr, audit = false, debug = false)
173
224
  @tcpServerThread = nil
@@ -182,8 +233,13 @@ class GServer
182
233
  @debug = debug
183
234
  end
184
235
 
236
+ # Start the server if it isn't already running
237
+ #
238
+ # +maxConnections+::
239
+ # override +maxConnections+ given to the constructor. A negative
240
+ # value indicates that the value from the constructor should be used.
185
241
  def start(maxConnections = -1)
186
- raise "running" if !stopped?
242
+ raise "server is already running" if !stopped?
187
243
  @shutdown = false
188
244
  @maxConnections = maxConnections if maxConnections > 0
189
245
  @@servicesMutex.synchronize {
@@ -205,7 +261,8 @@ class GServer
205
261
  end
206
262
  }
207
263
  client = @tcpServer.accept
208
- @connections << Thread.new(client) { |myClient|
264
+ Thread.new(client) { |myClient|
265
+ @connections << Thread.current
209
266
  begin
210
267
  myPort = myClient.peeraddr[1]
211
268
  serve(myClient) if !@audit or connecting(myClient)
@@ -1,5 +1,5 @@
1
1
  module RubySL
2
2
  module GServer
3
- VERSION = "1.0.0"
3
+ VERSION = "2.0.0"
4
4
  end
5
5
  end
@@ -16,11 +16,10 @@ Gem::Specification.new do |spec|
16
16
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
17
17
  spec.require_paths = ["lib"]
18
18
 
19
- spec.add_runtime_dependency "rubysl-socket", "~> 1.0"
20
- spec.add_runtime_dependency "rubysl-thread", "~> 1.0"
19
+ spec.add_runtime_dependency "rubysl-socket", "~> 2.0"
20
+ spec.add_runtime_dependency "rubysl-thread", "~> 2.0"
21
21
 
22
22
  spec.add_development_dependency "bundler", "~> 1.3"
23
23
  spec.add_development_dependency "rake", "~> 10.0"
24
24
  spec.add_development_dependency "mspec", "~> 1.5"
25
- spec.add_development_dependency "rubysl-prettyprint", "~> 1.0"
26
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rubysl-gserver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brian Shirai
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-12-26 00:00:00.000000000 Z
11
+ date: 2013-09-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rubysl-socket
@@ -16,28 +16,28 @@ dependencies:
16
16
  requirements:
17
17
  - - ~>
18
18
  - !ruby/object:Gem::Version
19
- version: '1.0'
19
+ version: '2.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
- version: '1.0'
26
+ version: '2.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rubysl-thread
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ~>
32
32
  - !ruby/object:Gem::Version
33
- version: '1.0'
33
+ version: '2.0'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ~>
39
39
  - !ruby/object:Gem::Version
40
- version: '1.0'
40
+ version: '2.0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: bundler
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -80,20 +80,6 @@ dependencies:
80
80
  - - ~>
81
81
  - !ruby/object:Gem::Version
82
82
  version: '1.5'
83
- - !ruby/object:Gem::Dependency
84
- name: rubysl-prettyprint
85
- requirement: !ruby/object:Gem::Requirement
86
- requirements:
87
- - - ~>
88
- - !ruby/object:Gem::Version
89
- version: '1.0'
90
- type: :development
91
- prerelease: false
92
- version_requirements: !ruby/object:Gem::Requirement
93
- requirements:
94
- - - ~>
95
- - !ruby/object:Gem::Version
96
- version: '1.0'
97
83
  description: Ruby standard library gserver.
98
84
  email:
99
85
  - brixen@gmail.com