em-midori 0.0.8 → 0.0.9

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 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