em-midori 0.0.8 → 0.0.9

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: a8ed2aa28d8f33b3189c8580e3710ee0c9082f24
4
- data.tar.gz: f72b5ff4d67f06b619776484da4f8581b56c27df
3
+ metadata.gz: 98fbd92141350243b9a3e3d1419d3cc7364270d8
4
+ data.tar.gz: 6cb7c2807690751d6d0796511aa00d974ec51148
5
5
  SHA512:
6
- metadata.gz: 1de935f59439205ea7d3b909410979fe4feade4d3a38a25541ef9ae79b96d82f99598ff274a942dab10ba627168f81473319d7e0822eb350e1e29be7ae0d9ab9
7
- data.tar.gz: 5663cf9ab2ebbe09dd9c0cde0a36becc8cdc9c9f4809a91bb8957283d0a2aa1676fac04be0f1255045b9320655e0c3c31dd2225036aa08d51cab65e4ea8a41d2
6
+ metadata.gz: 014ae17886c6a64490fa0b9ace13c98cd6873e2aa11bfe649f799e150e64477dabd734440bdd9553129fa1db49454dadd088d5957cbcf738f1e8332040e40821
7
+ data.tar.gz: 1178bfea1e5d3da5b34aa3b1a0b1c22c4fcfd1b844c0466166d33994202ddf022048c62530e3ded73074de980459a09e6f84d9e81fa4ab427efd113b4b5aa439
data/lib/em-midori.rb CHANGED
@@ -18,3 +18,4 @@ require_relative 'em-midori/route'
18
18
  require_relative 'em-midori/server'
19
19
  require_relative 'em-midori/websocket'
20
20
  require_relative 'em-midori/eventsource'
21
+ require_relative 'em-midori/middleware'
data/lib/em-midori/api.rb CHANGED
@@ -163,47 +163,46 @@ class Midori::API
163
163
  # === Returns
164
164
  # nil
165
165
  def add_route(method, path, block)
166
- @route = [] if @route.nil?
167
166
  if path.class == String
168
167
  # Convert String to Regexp to provide performance boost (Precompiled Regexp)
169
168
  path = convert_route path
170
169
  end
170
+ @route = [] if @route.nil?
171
171
  @route << Midori::Route.new(method, path, block)
172
172
  nil
173
173
  end
174
174
 
175
175
  # Process after receive data from client
176
176
  # === Attributes
177
- # * +request+ [+StringIO+] - Http Raw Request
177
+ # * +request+ [+Midori::Request+] - Http Raw Request
178
178
  # === Returns
179
179
  # [+Midori::Response+] - Http response
180
180
  def receive(request, connection = nil)
181
181
  @route.each do |route|
182
182
  matched = match(route.method, route.path, request.method, request.path)
183
183
  next unless matched
184
+ if @middleware.nil?
185
+ @middleware = []
186
+ @body_accept = [String]
187
+ end
188
+ @middleware.each { |middleware| request = middleware.before(request) }
184
189
  clean_room = Midori::CleanRoom.new(request)
185
190
  if request.websocket?
186
191
  # Send 101 Switching Protocol
187
- connection.send_data Midori::Response.new(101, {
188
- 'Upgrade' => 'websocket',
189
- 'Connection' => 'Upgrade',
190
- 'Sec-WebSocket-Accept' => Digest::SHA1.base64digest(request.header['Sec-WebSocket-Key'] + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
191
- }, '')
192
- result = -> { clean_room.instance_exec(connection.websocket, *matched, &route.function) }.call
192
+ connection.send_data Midori::Response.new(101, websocket_header(request.header['Sec-WebSocket-Key']), '')
193
+ -> { clean_room.instance_exec(connection.websocket, *matched, &route.function) }.call
193
194
  return Midori::Response.new
194
195
  elsif request.eventsource?
195
- connection.send_data Midori::Response.new(200, {
196
- 'Content-Type' => 'text-event-stream',
197
- 'Cache-Control' => 'no-cache',
198
- 'Connection' => 'keep-alive'
199
- }, '')
200
- result = -> { clean_room.instance_exec(connection.eventsource, *matched, &route.function) }.call
196
+ connection.send_data Midori::Response.new(200, Midori::Const::EVENTSOURCE_HEADER, '')
197
+ -> { clean_room.instance_exec(connection.eventsource, *matched, &route.function) }.call
201
198
  return Midori::Response.new
202
199
  else
203
200
  result = -> { clean_room.instance_exec(*matched, &route.function) }.call
201
+ clean_room.body = result if @body_accept.include?(result.class)
202
+ response = clean_room.response
203
+ @middleware.reverse.each { |middleware| response = middleware.after(request, response) }
204
+ return response
204
205
  end
205
- clean_room.body = result if result.class == String
206
- return clean_room.response
207
206
  end
208
207
  raise Midori::Error::NotFound
209
208
  end
@@ -243,6 +242,21 @@ class Midori::API
243
242
  path += '$' if path[-1] != '$'
244
243
  Regexp.new path
245
244
  end
245
+
246
+ def use(middleware)
247
+ raise Midori::Error::MiddlewareError unless middleware.new.is_a?Midori::Middleware
248
+ @middleware = [] if @middleware.nil?
249
+ @middleware << middleware
250
+ @body_accept = middleware.accept
251
+ end
252
+
253
+ def websocket_header(key)
254
+ {
255
+ 'Upgrade' => 'websocket',
256
+ 'Connection' => 'Upgrade',
257
+ 'Sec-WebSocket-Accept' => Digest::SHA1.base64digest(key + '258EAFA5-E914-47DA-95CA-C5AB0DC85B11')
258
+ }
259
+ end
246
260
  end
247
261
 
248
262
  private_class_method :add_route
@@ -45,4 +45,10 @@ module Midori::Const
45
45
  DEFAULT_HEADER = {
46
46
  'Server' => "Midori/#{Midori::VERSION}"
47
47
  }
48
+
49
+ EVENTSOURCE_HEADER = {
50
+ 'Content-Type' => 'text-event-stream',
51
+ 'Cache-Control' => 'no-cache',
52
+ 'Connection' => 'keep-alive'
53
+ }
48
54
  end
@@ -6,4 +6,5 @@ module Midori::Error
6
6
  class FrameEnd < StandardError; end
7
7
  class PingPongSizeTooLarge < StandardError; end
8
8
  class EventSourceTypeError < StandardError; end
9
+ class MiddlewareError < StandardError; end
9
10
  end
@@ -0,0 +1,13 @@
1
+ class Midori::Middleware
2
+ def self.before(request)
3
+ request
4
+ end
5
+
6
+ def self.after(_request, response)
7
+ response
8
+ end
9
+
10
+ def self.accept
11
+ [String]
12
+ end
13
+ end
@@ -1,7 +1,7 @@
1
1
  class Midori::Request
2
2
  attr_accessor :ip, :port,
3
3
  :protocol, :method, :path, :query_string,
4
- :header, :body
4
+ :header, :body, :parsed
5
5
 
6
6
  def initialize
7
7
  @parsed = false
@@ -1,3 +1,3 @@
1
1
  module Midori
2
- VERSION = '0.0.8'.freeze
2
+ VERSION = '0.0.9'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em-midori
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.8
4
+ version: 0.0.9
5
5
  platform: ruby
6
6
  authors:
7
7
  - HeckPsi Lab
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-10-16 00:00:00.000000000 Z
11
+ date: 2016-10-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: eventmachine
@@ -52,6 +52,7 @@ files:
52
52
  - lib/em-midori/em_midori.rb
53
53
  - lib/em-midori/error.rb
54
54
  - lib/em-midori/eventsource.rb
55
+ - lib/em-midori/middleware.rb
55
56
  - lib/em-midori/promise.rb
56
57
  - lib/em-midori/request.rb
57
58
  - lib/em-midori/response.rb