tsurezure 0.0.1 → 0.0.33
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/tsurezure.rb +48 -9
- data/lib/utils/http_utils.rb +3 -1
- data/lib/utils/response.rb +22 -20
- data/readme.md +33 -4
- metadata +3 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1278a0f85466408f80cdf8978acb8ebe6bd34faa4b5824d7e0fde9a323839454
|
4
|
+
data.tar.gz: 1d98b1c81f4a81955c5983c34aabf9390b953fee5778892a8f1705c573b6669b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 4174e3d1fb4fac4d64ff98e128df388a64ab0e95c41aa67e1e97e70dbaef24f7944b38a191b703218a62a5688cd923fc68e569e197b2937421cd7d37ab47735d
|
7
|
+
data.tar.gz: e707b8e7871b1b47dd6aca8cfee1953b1b3794b3d9c8b7cfc5d226096bb1648e7b95bab439ac9d142739a708eb73de1ca49d847d47c9ea9f0e3064fd8685d614
|
data/lib/tsurezure.rb
CHANGED
@@ -12,6 +12,10 @@ require_relative 'utils/response' # handles request and generates responses.
|
|
12
12
|
|
13
13
|
$TRZR_PROCESS_MODE = nil
|
14
14
|
$TRZR_LOG = true
|
15
|
+
TRZR_STARTED_AT = Time.now.to_i
|
16
|
+
|
17
|
+
INVALID_RESPONSE_FORMAT = "if responding from a middleware, \
|
18
|
+
you must return a hash that includes a :message property."
|
15
19
|
|
16
20
|
ARGV.each do |arg|
|
17
21
|
$TRZR_PROCESS_MODE = 'development' if arg == '--development'
|
@@ -85,7 +89,7 @@ class Tsurezure
|
|
85
89
|
|
86
90
|
def get_correct_middleware(request_object)
|
87
91
|
@middleware.keys.select do |pat|
|
88
|
-
HTTPUtils::URLUtils.matches_url_regex(pat, request_object[:url]) ||
|
92
|
+
HTTPUtils::URLUtils.matches_url_regex?(pat, request_object[:url]) ||
|
89
93
|
pat == '*'
|
90
94
|
end
|
91
95
|
end
|
@@ -102,16 +106,29 @@ class Tsurezure
|
|
102
106
|
request
|
103
107
|
end
|
104
108
|
|
109
|
+
def respond_with_error(error)
|
110
|
+
Logbook::Dev.log(error)
|
111
|
+
|
112
|
+
message = { error: error }.to_json
|
113
|
+
|
114
|
+
responder = HTTPUtils::ServerResponse.new(
|
115
|
+
@session,
|
116
|
+
message.bytesize
|
117
|
+
)
|
118
|
+
|
119
|
+
responder.respond message, {}, 500, 'application/json'
|
120
|
+
end
|
121
|
+
|
105
122
|
def send_middleware_response(req, resp, type)
|
106
123
|
res = resp.merge req
|
107
124
|
|
125
|
+
return respond_with_error INVALID_RESPONSE_FORMAT if res[:message].nil?
|
126
|
+
|
108
127
|
responder = HTTPUtils::ServerResponse.new(
|
109
128
|
@session,
|
110
129
|
res[:message].bytesize
|
111
130
|
)
|
112
131
|
|
113
|
-
# pp res
|
114
|
-
|
115
132
|
responder.respond res[:message], res[:options] || {}, res[:status], type
|
116
133
|
end
|
117
134
|
|
@@ -205,8 +222,14 @@ class Tsurezure
|
|
205
222
|
|
206
223
|
##
|
207
224
|
# run when the server is prepared to accept requests.
|
208
|
-
def listen
|
209
|
-
|
225
|
+
def listen(callback = nil)
|
226
|
+
if $TRZR_PROCESS_MODE == 'development'
|
227
|
+
puts "[trzr_dev] running on port #{@port}!"
|
228
|
+
end
|
229
|
+
|
230
|
+
# call the callback if there's one provided
|
231
|
+
callback.call server_opts if callback.is_a? Proc
|
232
|
+
|
210
233
|
# create a new thread for handle each incoming request
|
211
234
|
loop do
|
212
235
|
Thread.start(@server.accept) do |client|
|
@@ -215,8 +238,20 @@ class Tsurezure
|
|
215
238
|
end
|
216
239
|
end
|
217
240
|
|
241
|
+
def kill
|
242
|
+
abort
|
243
|
+
end
|
244
|
+
|
218
245
|
private
|
219
246
|
|
247
|
+
def server_opts
|
248
|
+
{
|
249
|
+
port: @port,
|
250
|
+
endpoints: @endpoints,
|
251
|
+
middleware: @middleware
|
252
|
+
}
|
253
|
+
end
|
254
|
+
|
220
255
|
# ----------------------------------------
|
221
256
|
# :section: registration of endpoints and
|
222
257
|
# all endpoint management methods follow.
|
@@ -272,10 +307,14 @@ class Tsurezure
|
|
272
307
|
# add endpoint to list of registered endpoints
|
273
308
|
@endpoints[method][endpoint[:path]] = endpoint
|
274
309
|
end
|
310
|
+
end
|
275
311
|
|
276
|
-
|
277
|
-
|
312
|
+
at_exit do
|
313
|
+
if $TRZR_PROCESS_MODE == 'development' && $TRZR_LOG == true
|
314
|
+
time = Time.now.to_i - TRZR_STARTED_AT
|
315
|
+
puts
|
316
|
+
puts '[trzr_dev] shutting down. goodbye...'
|
317
|
+
puts "[trzr_dev] shut down after #{Time.at(time).utc.strftime('%H:%M:%S')}."
|
318
|
+
puts
|
278
319
|
end
|
279
320
|
end
|
280
|
-
|
281
|
-
at_exit { puts 'shutting down. goodbye...' }
|
data/lib/utils/http_utils.rb
CHANGED
@@ -25,6 +25,8 @@ module HTTPUtils
|
|
25
25
|
end
|
26
26
|
|
27
27
|
def self.url_path_matches?(url, path)
|
28
|
+
return true if url == path
|
29
|
+
|
28
30
|
split_url = url.split '/'
|
29
31
|
split_path = path.split '/'
|
30
32
|
|
@@ -49,7 +51,7 @@ module HTTPUtils
|
|
49
51
|
hash_with_variables
|
50
52
|
end
|
51
53
|
|
52
|
-
def self.matches_url_regex(url, regex)
|
54
|
+
def self.matches_url_regex?(url, regex)
|
53
55
|
return unless url_path_matches? url, regex
|
54
56
|
|
55
57
|
matches = url.scan %r{((?<=\/):[^\/]+)}
|
data/lib/utils/response.rb
CHANGED
@@ -2,6 +2,19 @@
|
|
2
2
|
|
3
3
|
require_relative './http_utils' # mainly used to create http responses.
|
4
4
|
|
5
|
+
VALID_METHODS = %w[
|
6
|
+
CONNECT COPY DELETE GET HEAD
|
7
|
+
LINK LOCK MKCOL MOVE OPTIONS
|
8
|
+
PATCH POST PROPFIND PROPPATCH
|
9
|
+
PURGE PUT TRACE UNLINK UNLOCK
|
10
|
+
VIEW
|
11
|
+
].freeze
|
12
|
+
|
13
|
+
CHECK_METHOD_WARNING = "not found. \
|
14
|
+
please ensure you're using the right method!"
|
15
|
+
|
16
|
+
INVALID_METHOD_WARNING = 'an invalid method was used!'
|
17
|
+
|
5
18
|
##
|
6
19
|
# module for handling all incoming requests to the server
|
7
20
|
# stands for TsurezureResponse
|
@@ -9,36 +22,24 @@ module TResponse
|
|
9
22
|
include HTTPUtils
|
10
23
|
# anything that will be needed to create responses
|
11
24
|
class Utils
|
25
|
+
attr_reader :valid_methods
|
26
|
+
|
12
27
|
def initialize
|
13
|
-
@valid_methods =
|
14
|
-
CONNECT COPY DELETE GET HEAD
|
15
|
-
LINK LOCK MKCOL MOVE OPTIONS
|
16
|
-
OPTIONS PATCH POST PROPFIND
|
17
|
-
PROPPATCH PURGE PUT TRACE
|
18
|
-
UNLINK UNLOCK VIEW
|
19
|
-
]
|
28
|
+
@valid_methods = VALID_METHODS
|
20
29
|
end
|
21
30
|
|
22
|
-
attr_reader :valid_methods
|
23
|
-
|
24
31
|
def self.validate_request(request_params)
|
25
32
|
# make sure the user has provided a valid http
|
26
33
|
# method, a valid uri, and a valid response /
|
27
34
|
# response type
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
OPTIONS PATCH POST PROPFIND
|
32
|
-
PROPPATCH PURGE PUT TRACE
|
33
|
-
UNLINK UNLOCK VIEW
|
34
|
-
]
|
35
|
-
|
36
|
-
return false unless valid_methods.include? request_params[:method]
|
35
|
+
return true if VALID_METHODS.include? request_params[:method]
|
36
|
+
|
37
|
+
Logbook::Dev.log(INVALID_METHOD_WARNING)
|
37
38
|
end
|
38
39
|
|
39
40
|
def self.get_correct_endpoint(request_object, endpoints)
|
40
41
|
endpoints.keys.select do |pat|
|
41
|
-
HTTPUtils::URLUtils.matches_url_regex(pat, request_object[:url])
|
42
|
+
HTTPUtils::URLUtils.matches_url_regex?(pat, request_object[:url])
|
42
43
|
end
|
43
44
|
end
|
44
45
|
|
@@ -61,8 +62,9 @@ module TResponse
|
|
61
62
|
@endpoints = endpoints[request[:method]]
|
62
63
|
|
63
64
|
# if no endpoint, respond with root endpoint or 404 middleware
|
64
|
-
|
65
65
|
unless Utils.ensure_response(request, @endpoints) == true
|
66
|
+
Logbook::Dev.log(CHECK_METHOD_WARNING)
|
67
|
+
|
66
68
|
return { options: { content_type: 'application/json' },
|
67
69
|
code: 22, status: 404,
|
68
70
|
message: { status: 404, message: 'undefined endpoint' }.to_json }
|
data/readme.md
CHANGED
@@ -23,17 +23,26 @@ after cloning this repo, from the root project directory, just run `rake start`
|
|
23
23
|
|
24
24
|
to build the gem: run `gem build tsurezure.gemspec`. then, install using `gem install tsurezure-version-number`. `version-number` is whatever version is installed based on the `.gemspec` file.
|
25
25
|
|
26
|
+
### commands
|
27
|
+
|
28
|
+
- `rake install` will install dependencies
|
29
|
+
- `rake check_deps` will install dependencies if not installed
|
30
|
+
- `rake start` will run the server in production mode
|
31
|
+
- `rake dev` will run the server in development mode
|
32
|
+
- `rake dev_silent` will run the server in development mode with no logs
|
33
|
+
- `rake build` will build a `.gem` file based on `tsurezure.gemspec`
|
34
|
+
|
26
35
|
### actually using tsurezure:
|
27
36
|
|
28
|
-
as for how to use tsurezure, here's a simple
|
37
|
+
as for how to use tsurezure, here's a simple script to get started:
|
29
38
|
|
30
39
|
```ruby
|
31
40
|
require 'tsurezure'
|
32
41
|
|
33
42
|
# create an instance of tsurezure
|
34
|
-
server = Tsurezure.new
|
43
|
+
server = Tsurezure.new 8888
|
35
44
|
|
36
|
-
# url: http://localhost:8888
|
45
|
+
# url: http://localhost:8888
|
37
46
|
|
38
47
|
# create an endpoint
|
39
48
|
server.register 'get', '/user/:id', lambda { |req|
|
@@ -78,6 +87,24 @@ after you run this file, open up your browser or whatever and go to `http://loca
|
|
78
87
|
}
|
79
88
|
```
|
80
89
|
|
90
|
+
the `listen` method can be called with no arguments to just start the server. you can also pass in a lambda or proc that will run when the server has started. the only argument that will be passed to that proc is a hash called `server_opts`. it contains some information about the current configuration:
|
91
|
+
|
92
|
+
```ruby
|
93
|
+
{
|
94
|
+
port, # port that tsurezure is running on
|
95
|
+
endpoints, # endpoints object containing the endpoints you've added
|
96
|
+
middleware # middleware object containing the middleware you've added
|
97
|
+
}
|
98
|
+
```
|
99
|
+
|
100
|
+
simple example of usage:
|
101
|
+
|
102
|
+
```ruby
|
103
|
+
server.listen lambda { |opts|
|
104
|
+
puts "listening on port #{opts[:port]}!"
|
105
|
+
}
|
106
|
+
```
|
107
|
+
|
81
108
|
the registration function for creating endpoints is very simple:
|
82
109
|
|
83
110
|
```ruby
|
@@ -92,7 +119,7 @@ register http_method, path, callback, options
|
|
92
119
|
|
93
120
|
`options` is a hash containing various options to somehow modify the response. valid options:
|
94
121
|
|
95
|
-
- `content_type` - determines the mime type of the response
|
122
|
+
- `content_type (default: text/plain)` - determines the mime type of the response
|
96
123
|
- `location` - if a location header is required (301, etc), this is used to provide it.
|
97
124
|
- `method` - if an allow header is required (405), this is used to provide it.
|
98
125
|
|
@@ -108,6 +135,8 @@ add_middleware path, callback, options
|
|
108
135
|
|
109
136
|
`options` for middleware are the same as the `options` for endpoints.
|
110
137
|
|
138
|
+
**anything** returned from a middleware will be interpreted as you trying to send a modified response. and of course, ruby will interpret the last reached statement in a method as an implicit return. to avoid this, if you want to have a middleware that doesn't necessarily send a response, just use a `return` at the end of your method to return `nil`.
|
139
|
+
|
111
140
|
* * *
|
112
141
|
|
113
142
|
## todo
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: tsurezure
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.33
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- jpegzilla
|
@@ -14,22 +14,16 @@ dependencies:
|
|
14
14
|
name: json
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "~>"
|
18
|
-
- !ruby/object:Gem::Version
|
19
|
-
version: '1.8'
|
20
17
|
- - ">="
|
21
18
|
- !ruby/object:Gem::Version
|
22
|
-
version:
|
19
|
+
version: 2.3.0
|
23
20
|
type: :runtime
|
24
21
|
prerelease: false
|
25
22
|
version_requirements: !ruby/object:Gem::Requirement
|
26
23
|
requirements:
|
27
|
-
- - "~>"
|
28
|
-
- !ruby/object:Gem::Version
|
29
|
-
version: '1.8'
|
30
24
|
- - ">="
|
31
25
|
- !ruby/object:Gem::Version
|
32
|
-
version:
|
26
|
+
version: 2.3.0
|
33
27
|
- !ruby/object:Gem::Dependency
|
34
28
|
name: pry
|
35
29
|
requirement: !ruby/object:Gem::Requirement
|