webmachine 1.6.0 → 2.0.0.beta

Sign up to get free protection for your applications and to get access to all the features.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +6 -0
  3. data/README.md +2 -5
  4. data/documentation/adapters.md +2 -11
  5. data/examples/debugger.rb +5 -3
  6. data/examples/logging.rb +2 -2
  7. data/examples/webrick.rb +2 -2
  8. data/lib/webmachine/adapter.rb +0 -3
  9. data/lib/webmachine/adapters/lazy_request_body.rb +1 -1
  10. data/lib/webmachine/adapters/rack.rb +38 -34
  11. data/lib/webmachine/adapters/rack_mapped.rb +1 -2
  12. data/lib/webmachine/adapters/webrick.rb +11 -12
  13. data/lib/webmachine/adapters.rb +0 -2
  14. data/lib/webmachine/application.rb +2 -2
  15. data/lib/webmachine/chunked_body.rb +1 -1
  16. data/lib/webmachine/configuration.rb +1 -1
  17. data/lib/webmachine/constants.rb +12 -12
  18. data/lib/webmachine/cookie.rb +20 -18
  19. data/lib/webmachine/decision/conneg.rb +24 -24
  20. data/lib/webmachine/decision/falsey.rb +0 -1
  21. data/lib/webmachine/decision/flow.rb +19 -20
  22. data/lib/webmachine/decision/fsm.rb +4 -4
  23. data/lib/webmachine/decision/helpers.rb +21 -21
  24. data/lib/webmachine/dispatcher/route.rb +28 -28
  25. data/lib/webmachine/dispatcher.rb +3 -2
  26. data/lib/webmachine/errors.rb +7 -8
  27. data/lib/webmachine/etags.rb +2 -1
  28. data/lib/webmachine/header_negotiation.rb +5 -6
  29. data/lib/webmachine/headers.rb +5 -5
  30. data/lib/webmachine/media_type.rb +5 -5
  31. data/lib/webmachine/quoted_string.rb +3 -3
  32. data/lib/webmachine/request.rb +7 -10
  33. data/lib/webmachine/rescueable_exception.rb +3 -3
  34. data/lib/webmachine/resource/authentication.rb +3 -4
  35. data/lib/webmachine/resource/callbacks.rb +3 -3
  36. data/lib/webmachine/resource/encodings.rb +3 -9
  37. data/lib/webmachine/resource.rb +1 -1
  38. data/lib/webmachine/response.rb +7 -9
  39. data/lib/webmachine/spec/adapter_lint.rb +67 -69
  40. data/lib/webmachine/spec/test_resource.rb +22 -22
  41. data/lib/webmachine/streaming/encoder.rb +3 -2
  42. data/lib/webmachine/streaming/io_encoder.rb +4 -3
  43. data/lib/webmachine/trace/fsm.rb +25 -18
  44. data/lib/webmachine/trace/resource_proxy.rb +10 -9
  45. data/lib/webmachine/trace/static/http-headers-status-v3.png +0 -0
  46. data/lib/webmachine/trace/trace_resource.rb +22 -24
  47. data/lib/webmachine/trace.rb +7 -6
  48. data/lib/webmachine/translation.rb +3 -3
  49. data/lib/webmachine/version.rb +1 -1
  50. metadata +52 -86
  51. data/.gitignore +0 -31
  52. data/Gemfile +0 -46
  53. data/Guardfile +0 -11
  54. data/RELEASING.md +0 -21
  55. data/Rakefile +0 -44
  56. data/lib/webmachine/adapters/httpkit.rb +0 -74
  57. data/lib/webmachine/adapters/reel.rb +0 -113
  58. data/memory_test.rb +0 -37
  59. data/spec/spec_helper.rb +0 -56
  60. data/spec/webmachine/adapter_spec.rb +0 -39
  61. data/spec/webmachine/adapters/httpkit_spec.rb +0 -10
  62. data/spec/webmachine/adapters/rack_mapped_spec.rb +0 -71
  63. data/spec/webmachine/adapters/rack_spec.rb +0 -62
  64. data/spec/webmachine/adapters/reel_spec.rb +0 -76
  65. data/spec/webmachine/adapters/webrick_spec.rb +0 -12
  66. data/spec/webmachine/application_spec.rb +0 -74
  67. data/spec/webmachine/chunked_body_spec.rb +0 -30
  68. data/spec/webmachine/configuration_spec.rb +0 -27
  69. data/spec/webmachine/cookie_spec.rb +0 -99
  70. data/spec/webmachine/decision/conneg_spec.rb +0 -166
  71. data/spec/webmachine/decision/falsey_spec.rb +0 -8
  72. data/spec/webmachine/decision/flow_spec.rb +0 -1148
  73. data/spec/webmachine/decision/fsm_spec.rb +0 -163
  74. data/spec/webmachine/decision/helpers_spec.rb +0 -216
  75. data/spec/webmachine/dispatcher/rfc3986_percent_decode_spec.rb +0 -22
  76. data/spec/webmachine/dispatcher/route_spec.rb +0 -248
  77. data/spec/webmachine/dispatcher_spec.rb +0 -104
  78. data/spec/webmachine/errors_spec.rb +0 -13
  79. data/spec/webmachine/etags_spec.rb +0 -75
  80. data/spec/webmachine/events_spec.rb +0 -58
  81. data/spec/webmachine/headers_spec.rb +0 -99
  82. data/spec/webmachine/media_type_spec.rb +0 -85
  83. data/spec/webmachine/request_spec.rb +0 -273
  84. data/spec/webmachine/rescueable_exception_spec.rb +0 -15
  85. data/spec/webmachine/resource/authentication_spec.rb +0 -68
  86. data/spec/webmachine/response_spec.rb +0 -51
  87. data/spec/webmachine/trace/fsm_spec.rb +0 -37
  88. data/spec/webmachine/trace/resource_proxy_spec.rb +0 -34
  89. data/spec/webmachine/trace/trace_store_spec.rb +0 -29
  90. data/spec/webmachine/trace_spec.rb +0 -17
  91. data/webmachine.gemspec +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: edddc1a3a4d7be22971484644cbf1bece06b2ba0f95ab5c8a3ed08cf485982b2
4
- data.tar.gz: 4a1e642ad3fb3a1a57e8eee886393802f7b85f8ecb81bf9f06812577fe253840
3
+ metadata.gz: 9fa67f8c8882d39968e933f1f3e40888e05f25ddb26754f04efb5f0ee6e85342
4
+ data.tar.gz: 979c3bef1f736792ea3b9754b6dd6837e2a02ba92b04ea0ac0b607260b09b5e0
5
5
  SHA512:
6
- metadata.gz: 89062ab939aadad0f1a41d3c3b85d030acf0e4668b5d06b0c65ad4a4425284bdaf60ece3af7e76f2b9eacc02cf2052f657cfb491372fef62463dad4324933617
7
- data.tar.gz: 0a6078e13d68abaa7692675f5057e3b69d06dd5311d6e662a176490f427b6d1a1053bd3e5e0ed82fa9536eab421f05285e54939a2c900ca364347a361c21b21a
6
+ metadata.gz: ed27aee0010e3375d49c8e3e5bc38fba49073c177cf4e271f593beedc9ca7de272869be9ebd20fdafbd834e465d3d77f52052cbfe48f08713a296723a61c1776
7
+ data.tar.gz: e4b38c9ecc8183fefa4b40d90d69cda5c3b9f0b22828bbe59acd03fede5d907d54816488d7ded9b8677343a49a43c4a2c963b4b8aa31d29bb32825ff0361a3c4
data/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  ### HEAD
2
2
 
3
+ ### 2.0.0.beta Mar 30, 2023
4
+
5
+ * Drop support for ruby 2.3, 2.4, and 2.5
6
+ * Remove the HTTPkit adapter
7
+ * Format cookie 'Expires' timestamps as per RFC 2616
8
+
3
9
  ### 1.6.0 June 22, 2021
4
10
 
5
11
  * fix: replace missed URI.decode with new Route.rfc3986_percent_decode (#261)
data/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # webmachine for Ruby
2
2
  [![Gem Version](https://badge.fury.io/rb/webmachine.svg)](https://badge.fury.io/rb/webmachine)
3
- [![Build Status](https://travis-ci.org/webmachine/webmachine-ruby.svg)](https://travis-ci.org/webmachine/webmachine-ruby)
3
+ [![Build Status](https://github.com/webmachine/webmachine-ruby/actions/workflows/test.yml/badge.svg?branch=master)](https://github.com/webmachine/webmachine-ruby/actions/workflows/test.yml)
4
4
 
5
5
  webmachine-ruby is a port of
6
6
  [Webmachine](https://github.com/basho/webmachine), which is written in
@@ -20,8 +20,7 @@ are up to you.
20
20
  requests, and response codes for you.
21
21
  * Provides a base resource with points of extension to let you
22
22
  describe what is relevant about your particular resource.
23
- * Supports WEBrick, Reel, HTTPkit, and a Rack shim. Other host
24
- servers are being investigated.
23
+ * Supports WEBrick and a Rack shim. Other host servers are being investigated.
25
24
  * Streaming/chunked response bodies are permitted as Enumerables,
26
25
  Procs, or Fibers!
27
26
  * Unlike the Erlang original, it does real Language negotiation.
@@ -165,10 +164,8 @@ the "visual debugger". Learn how to configure it [here][visual-debugger].
165
164
 
166
165
  ## Related libraries
167
166
 
168
- * [irwebmachine](https://github.com/generalassembly/irwebmachine) - IRB/Pry debugging of Webmachine applications
169
167
  * [webmachine-test](https://github.com/bernd/webmachine-test) - Helpers for testing Webmachine applications
170
168
  * [webmachine-linking](https://github.com/petejohanson/webmachine-linking) - Helpers for linking between Resources, and Web Linking
171
- * [webmachine-sprockets](https://github.com/lgierth/webmachine-sprockets) - Integration with Sprockets assets packaging system
172
169
  * [webmachine-actionview](https://github.com/rgarner/webmachine-actionview) - Integration of some Rails-style view conventions into Webmachine
173
170
  * [jruby-http-kit](https://github.com/nLight/jruby-http-kit) - Includes an adapter for the Clojure-based Ring library/server
174
171
  * [newrelic-webmachine](https://github.com/mdub/newrelic-webmachine) - NewRelic instrumentation
@@ -1,7 +1,7 @@
1
1
  ### Adapters
2
2
 
3
- Webmachine includes adapters for [WEBrick][webrick], [Reel][reel], and
4
- [HTTPkit][httpkit]. Additionally, the [Rack][rack] adapter lets it
3
+ Webmachine includes an adapter for [WEBrick][webrick].
4
+ Additionally, the [Rack][rack] adapter lets it
5
5
  run on any webserver that provides a Rack interface. It also lets it run on
6
6
  [Shotgun][shotgun] ([example][shotgun_example]).
7
7
 
@@ -24,16 +24,7 @@ For an example of using Webmachine with Rack middleware, see the [Pact Broker][m
24
24
 
25
25
  See the [Rack Adapter API docs][rack-adapter-api-docs] for more information.
26
26
 
27
- #### A Note about MRI 1.9
28
-
29
- The [Reel][reel] and [HTTPkit][httpkit]
30
- adapters might crash with a `SystemStackError` on MRI 1.9 due to its
31
- limited fiber stack size. If your application is affected by this, the
32
- only known solution is to switch to JRuby, Rubinius or MRI 2.0.
33
-
34
27
  [webrick]: http://rubydoc.info/stdlib/webrick
35
- [reel]: https://github.com/celluloid/reel
36
- [httpkit]: https://github.com/lgierth/httpkit
37
28
  [rack]: https://github.com/rack/rack
38
29
  [shotgun]: https://github.com/rtomayko/shotgun
39
30
  [shotgun_example]: https://gist.github.com/4389220
data/examples/debugger.rb CHANGED
@@ -2,21 +2,23 @@ require 'webmachine'
2
2
  require 'webmachine/trace'
3
3
 
4
4
  class MyTracedResource < Webmachine::Resource
5
- def trace?; true; end
5
+ def trace?
6
+ true
7
+ end
6
8
 
7
9
  def resource_exists?
8
10
  case request.query['e']
9
11
  when 'true'
10
12
  true
11
13
  when 'fail'
12
- raise "BOOM"
14
+ raise 'BOOM'
13
15
  else
14
16
  false
15
17
  end
16
18
  end
17
19
 
18
20
  def to_html
19
- "<html>You found me.</html>"
21
+ '<html>You found me.</html>'
20
22
  end
21
23
  end
22
24
 
data/examples/logging.rb CHANGED
@@ -18,7 +18,7 @@ class LogListener
18
18
  resource = event.payload[:resource]
19
19
  code = event.payload[:code]
20
20
 
21
- puts "[%s] method=%s uri=%s code=%d resource=%s time=%.4f" % [
21
+ puts '[%s] method=%s uri=%s code=%d resource=%s time=%.4f' % [
22
22
  Time.now.iso8601, request.method, request.uri.to_s, code, resource,
23
23
  event.duration
24
24
  ]
@@ -34,7 +34,7 @@ App = Webmachine::Application.new do |app|
34
34
 
35
35
  app.configure do |config|
36
36
  config.adapter = :WEBrick
37
- config.adapter_options = {:AccessLog => [], :Logger => Logger.new('/dev/null')}
37
+ config.adapter_options = {AccessLog: [], Logger: Logger.new('/dev/null')}
38
38
  end
39
39
  end
40
40
 
data/examples/webrick.rb CHANGED
@@ -6,11 +6,11 @@ class HelloResource < Webmachine::Resource
6
6
  end
7
7
 
8
8
  def encodings_provided
9
- { "gzip" => :encode_gzip, "identity" => :encode_identity }
9
+ {'gzip' => :encode_gzip, 'identity' => :encode_identity}
10
10
  end
11
11
 
12
12
  def to_html
13
- "<html><head><title>Hello from Webmachine</title></head><body>Hello, world!</body></html>"
13
+ '<html><head><title>Hello from Webmachine</title></head><body>Hello, world!</body></html>'
14
14
  end
15
15
  end
16
16
 
@@ -1,10 +1,8 @@
1
1
  module Webmachine
2
-
3
2
  # The abstract class for definining a Webmachine adapter.
4
3
  #
5
4
  # @abstract Subclass and override {#run} to implement a custom adapter.
6
5
  class Adapter
7
-
8
6
  # @return [Webmachine::Application] returns the application
9
7
  attr_reader :application
10
8
 
@@ -25,6 +23,5 @@ module Webmachine
25
23
  def run
26
24
  raise NotImplementedError
27
25
  end
28
-
29
26
  end
30
27
  end
@@ -24,7 +24,7 @@
24
24
  # @yield [chunk]
25
25
  # @yieldparam [String] chunk a chunk of the request body
26
26
  def each
27
- @request.body {|chunk| yield chunk }
27
+ @request.body { |chunk| yield chunk }
28
28
  end
29
29
  end # class RequestBody
30
30
  end # module Adapters
@@ -47,9 +47,9 @@ module Webmachine
47
47
  # Start the Rack adapter
48
48
  def run
49
49
  options = DEFAULT_OPTIONS.merge({
50
- :app => self,
51
- :Port => application.configuration.port,
52
- :Host => application.configuration.ip
50
+ app: self,
51
+ Port: application.configuration.port,
52
+ Host: application.configuration.ip
53
53
  }).merge(application.configuration.adapter_options)
54
54
 
55
55
  @server = ::Rack::Server.new(options)
@@ -69,33 +69,34 @@ module Webmachine
69
69
 
70
70
  response.headers[SERVER] = VERSION_STRING
71
71
 
72
- rack_status = response.code
72
+ rack_status = response.code
73
73
  rack_headers = response.headers.flattened(NEWLINE)
74
74
  rack_body = case response.body
75
- when String # Strings are enumerable in ruby 1.8
76
- [response.body]
77
- else
78
- if (io_body = IO.try_convert(response.body))
79
- io_body
80
- elsif response.body.respond_to?(:call)
81
- Webmachine::ChunkedBody.new(Array(response.body.call))
82
- elsif response.body.respond_to?(:each)
83
- # This might be an IOEncoder with a Content-Length, which shouldn't be chunked.
84
- if response.headers[TRANSFER_ENCODING] == "chunked"
85
- Webmachine::ChunkedBody.new(response.body)
86
- else
87
- response.body
88
- end
89
- else
90
- [response.body.to_s]
91
- end
92
- end
75
+ when String # Strings are enumerable in ruby 1.8
76
+ [response.body]
77
+ else
78
+ if (io_body = IO.try_convert(response.body))
79
+ io_body
80
+ elsif response.body.respond_to?(:call)
81
+ Webmachine::ChunkedBody.new(Array(response.body.call))
82
+ elsif response.body.respond_to?(:each)
83
+ # This might be an IOEncoder with a Content-Length, which shouldn't be chunked.
84
+ if response.headers[TRANSFER_ENCODING] == 'chunked'
85
+ Webmachine::ChunkedBody.new(response.body)
86
+ else
87
+ response.body
88
+ end
89
+ else
90
+ [response.body.to_s]
91
+ end
92
+ end
93
93
 
94
94
  rack_res = RackResponse.new(rack_body, rack_status, rack_headers)
95
95
  rack_res.finish
96
96
  end
97
97
 
98
98
  protected
99
+
99
100
  def routing_tokens(rack_req)
100
101
  nil # no-op for default, un-mapped rack adapter
101
102
  end
@@ -105,15 +106,15 @@ module Webmachine
105
106
  end
106
107
 
107
108
  private
109
+
108
110
  def build_webmachine_request(rack_req, headers)
109
111
  RackRequest.new(rack_req.request_method,
110
- rack_req.url,
111
- headers,
112
- RequestBody.new(rack_req),
113
- routing_tokens(rack_req),
114
- base_uri(rack_req),
115
- rack_req.env
116
- )
112
+ rack_req.url,
113
+ headers,
114
+ RequestBody.new(rack_req),
115
+ routing_tokens(rack_req),
116
+ base_uri(rack_req),
117
+ rack_req.env)
117
118
  end
118
119
 
119
120
  class RackRequest < Webmachine::Request
@@ -129,14 +130,14 @@ module Webmachine
129
130
  ONE_FIVE = '1.5'.freeze
130
131
 
131
132
  def initialize(body, status, headers)
132
- @body = body
133
- @status = status
133
+ @body = body
134
+ @status = status
134
135
  @headers = headers
135
136
  end
136
137
 
137
138
  def finish
138
139
  @headers[CONTENT_TYPE] ||= TEXT_HTML if rack_release_enforcing_content_type
139
- @headers.delete(CONTENT_TYPE) if response_without_body
140
+ @headers.delete(CONTENT_TYPE) if response_without_body
140
141
  [@status, @headers, @body]
141
142
  end
142
143
 
@@ -188,10 +189,13 @@ module Webmachine
188
189
  # @yieldparam [String] chunk a chunk of the request body
189
190
  def each
190
191
  if @value
191
- @value.each {|chunk| yield chunk }
192
+ @value.each { |chunk| yield chunk }
192
193
  else
193
194
  @value = []
194
- @request.body.each {|chunk| @value << chunk; yield chunk }
195
+ @request.body.each { |chunk|
196
+ @value << chunk
197
+ yield chunk
198
+ }
195
199
  end
196
200
  end
197
201
  end # class RequestBody
@@ -21,12 +21,11 @@ module Webmachine
21
21
  # end
22
22
  # end
23
23
  class RackMapped < Rack
24
-
25
24
  protected
26
25
 
27
26
  def routing_tokens(rack_req)
28
27
  routing_match = rack_req.path_info.match(Webmachine::Request::ROUTING_PATH_MATCH)
29
- routing_path = routing_match ? routing_match[1] : ""
28
+ routing_path = routing_match ? routing_match[1] : ''
30
29
  routing_path.split(SLASH)
31
30
  end
32
31
 
@@ -17,9 +17,9 @@ module Webmachine
17
17
  # Starts the WEBrick adapter
18
18
  def run
19
19
  options = DEFAULT_OPTIONS.merge({
20
- :Port => application.configuration.port,
21
- :BindAddress => application.configuration.ip,
22
- :application => application
20
+ Port: application.configuration.port,
21
+ BindAddress: application.configuration.ip,
22
+ application: application
23
23
  }).merge(application.configuration.adapter_options)
24
24
  @server = Server.new(options)
25
25
  @server.start
@@ -27,7 +27,6 @@ module Webmachine
27
27
 
28
28
  # WEBRick::HTTPServer that is run by the WEBrick adapter.
29
29
  class Server < ::WEBrick::HTTPServer
30
-
31
30
  def initialize(options)
32
31
  @application = options[:application]
33
32
  super(options)
@@ -36,29 +35,29 @@ module Webmachine
36
35
  # Handles a request
37
36
  def service(wreq, wres)
38
37
  header = Webmachine::Headers.new
39
- wreq.each {|k,v| header[k] = v }
38
+ wreq.each { |k, v| header[k] = v }
40
39
  request = Webmachine::Request.new(wreq.request_method,
41
- wreq.request_uri,
42
- header,
43
- LazyRequestBody.new(wreq))
40
+ wreq.request_uri,
41
+ header,
42
+ LazyRequestBody.new(wreq))
44
43
 
45
44
  response = Webmachine::Response.new
46
45
  @application.dispatcher.dispatch(request, response)
47
46
  wres.status = response.code.to_i
48
47
 
49
- headers = response.headers.flattened.reject { |k,v| k == 'Set-Cookie' }
50
- headers.each { |k,v| wres[k] = v }
48
+ headers = response.headers.flattened.reject { |k, v| k == 'Set-Cookie' }
49
+ headers.each { |k, v| wres[k] = v }
51
50
 
52
51
  cookies = [response.headers['Set-Cookie'] || []].flatten
53
52
  cookies.each { |c| wres.cookies << c }
54
53
 
55
- wres[SERVER] = [Webmachine::SERVER_STRING, wres.config[:ServerSoftware]].join(" ")
54
+ wres[SERVER] = [Webmachine::SERVER_STRING, wres.config[:ServerSoftware]].join(' ')
56
55
  case response.body
57
56
  when String
58
57
  wres.body << response.body
59
58
  when Enumerable
60
59
  wres.chunked = response.headers[TRANSFER_ENCODING] == 'chunked'
61
- response.body.each {|part| wres.body << part }
60
+ response.body.each { |part| wres.body << part }
62
61
  else
63
62
  if response.body.respond_to?(:call)
64
63
  wres.chunked = true
@@ -5,7 +5,5 @@ module Webmachine
5
5
  # Contains classes and modules that connect Webmachine to Ruby
6
6
  # application servers.
7
7
  module Adapters
8
- autoload :Reel, 'webmachine/adapters/reel'
9
- autoload :HTTPkit, 'webmachine/adapters/httpkit'
10
8
  end
11
9
  end
@@ -43,7 +43,7 @@ module Webmachine
43
43
  # the Application instance being initialized
44
44
  def initialize(configuration = Configuration.default, dispatcher = Dispatcher.new)
45
45
  @configuration = configuration
46
- @dispatcher = dispatcher
46
+ @dispatcher = dispatcher
47
47
 
48
48
  yield self if block_given?
49
49
  end
@@ -73,7 +73,7 @@ module Webmachine
73
73
  #
74
74
  # @see Webmachine::Dispatcher#add_route
75
75
  def routes(&block)
76
- if block_given?
76
+ if block
77
77
  dispatcher.instance_eval(&block)
78
78
  self
79
79
  else
@@ -29,7 +29,7 @@ module Webmachine
29
29
  # parameter.
30
30
  # Returns an {Enumerator} if no block is given.
31
31
  def each
32
- return self.to_enum unless block_given?
32
+ return to_enum unless block_given?
33
33
 
34
34
  @body.each do |chunk|
35
35
  size = chunk.bytesize
@@ -12,7 +12,7 @@ module Webmachine
12
12
 
13
13
  # @return [Configuration] the default configuration
14
14
  def Configuration.default
15
- new("0.0.0.0", 8080, :WEBrick, {})
15
+ new('0.0.0.0', 8080, :WEBrick, {})
16
16
  end
17
17
 
18
18
  # Yields the current configuration to the passed block.
@@ -28,20 +28,20 @@
28
28
 
29
29
  MATCHES_ALL = '*/*'.freeze
30
30
 
31
- GET_METHOD = "GET"
32
- HEAD_METHOD = "HEAD"
33
- POST_METHOD = "POST"
34
- PUT_METHOD = "PUT"
35
- DELETE_METHOD = "DELETE"
36
- OPTIONS_METHOD = "OPTIONS"
37
- TRACE_METHOD = "TRACE"
38
- CONNECT_METHOD = "CONNECT"
31
+ GET_METHOD = 'GET'
32
+ HEAD_METHOD = 'HEAD'
33
+ POST_METHOD = 'POST'
34
+ PUT_METHOD = 'PUT'
35
+ DELETE_METHOD = 'DELETE'
36
+ OPTIONS_METHOD = 'OPTIONS'
37
+ TRACE_METHOD = 'TRACE'
38
+ CONNECT_METHOD = 'CONNECT'
39
39
 
40
40
  STANDARD_HTTP_METHODS = [
41
- GET_METHOD, HEAD_METHOD, POST_METHOD,
42
- PUT_METHOD, DELETE_METHOD, TRACE_METHOD,
43
- CONNECT_METHOD, OPTIONS_METHOD
44
- ].map!(&:freeze)
41
+ GET_METHOD, HEAD_METHOD, POST_METHOD,
42
+ PUT_METHOD, DELETE_METHOD, TRACE_METHOD,
43
+ CONNECT_METHOD, OPTIONS_METHOD
44
+ ].map!(&:freeze)
45
45
  STANDARD_HTTP_METHODS.freeze
46
46
 
47
47
  # A colon
@@ -11,7 +11,7 @@ module Webmachine
11
11
  def self.parse(cstr, include_dups = false)
12
12
  cookies = {}
13
13
  (cstr || '').split(/\s*[;,]\s*/n).each { |c|
14
- k,v = c.split(/\s*=\s*/, 2).map { |s| unescape(s) }
14
+ k, v = c.split(/\s*=\s*/, 2).map { |s| unescape(s) }
15
15
 
16
16
  case cookies[k]
17
17
  when nil
@@ -31,7 +31,7 @@ module Webmachine
31
31
  # Allowed keys for the attributes parameter of
32
32
  # {Webmachine::Cookie#initialize}
33
33
  ALLOWED_ATTRIBUTES = [:secure, :httponly, :path, :domain,
34
- :comment, :maxage, :expires, :version]
34
+ :comment, :maxage, :expires, :version]
35
35
 
36
36
  # If the cookie is HTTP only
37
37
  def http_only?
@@ -83,32 +83,34 @@ module Webmachine
83
83
  attributes = ALLOWED_ATTRIBUTES.select { |a| @attributes[a] }.map do |a|
84
84
  case a
85
85
  when :httponly
86
- "HttpOnly" if @attributes[a]
86
+ 'HttpOnly' if @attributes[a]
87
87
  when :secure
88
- "Secure" if @attributes[a]
88
+ 'Secure' if @attributes[a]
89
89
  when :maxage
90
- "Max-Age=" + @attributes[a].to_s
90
+ 'Max-Age=' + @attributes[a].to_s
91
91
  when :expires
92
- "Expires=" + rfc2822(@attributes[a])
92
+ 'Expires=' + rfc2822(@attributes[a])
93
93
  when :comment
94
- "Comment=" + escape(@attributes[a].to_s)
94
+ 'Comment=' + escape(@attributes[a].to_s)
95
95
  else
96
- a.to_s.sub(/^\w/) { $&.capitalize } + "=" + @attributes[a].to_s
96
+ a.to_s.sub(/^\w/) { $&.capitalize } + '=' + @attributes[a].to_s
97
97
  end
98
98
  end
99
99
 
100
- ([escape(name) + "=" + escape(value)] + attributes).join("; ")
100
+ ([escape(name) + '=' + escape(value)] + attributes).join('; ')
101
101
  end
102
102
 
103
103
  private
104
104
 
105
+ # Format timestamps for the 'Expires' portion of the cookie string, as per RFC 2822 and 2616.
106
+ #
107
+ # @see https://www.rfc-editor.org/rfc/rfc2616#section-3.3.1
108
+ # @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Expires
105
109
  def rfc2822(time)
106
- wday = Time::RFC2822_DAY_NAME[time.wday]
107
- mon = Time::RFC2822_MONTH_NAME[time.mon - 1]
108
- time.strftime("#{wday}, %d-#{mon}-%Y %H:%M:%S GMT")
110
+ time.strftime('%a, %d %b %Y %T GMT')
109
111
  end
110
112
 
111
- if URI.respond_to?(:decode_www_form_component) and defined?(::Encoding)
113
+ if URI.respond_to?(:decode_www_form_component) && defined?(::Encoding)
112
114
  # Escape a cookie
113
115
  def escape(s)
114
116
  URI.encode_www_form_component(s)
@@ -132,7 +134,7 @@ module Webmachine
132
134
  # @private
133
135
  TBLDECWWWCOMP_ = {}
134
136
  256.times do |i|
135
- h, l = i>>4, i&15
137
+ h, l = i >> 4, i & 15
136
138
  TBLDECWWWCOMP_['%%%X%X' % [h, l]] = i.chr
137
139
  TBLDECWWWCOMP_['%%%x%X' % [h, l]] = i.chr
138
140
  TBLDECWWWCOMP_['%%%X%x' % [h, l]] = i.chr
@@ -146,9 +148,9 @@ module Webmachine
146
148
  # This decodes + to SP.
147
149
  #
148
150
  # @private
149
- def self.unescape(str, enc=nil)
150
- raise ArgumentError, "invalid %-encoding (#{str})" unless /\A(?:%\h\h|[^%]+)*\z/ =~ str
151
- str.gsub(/\+|%\h\h/){|c| TBLDECWWWCOMP_[c] }
151
+ def self.unescape(str, enc = nil)
152
+ raise ArgumentError, "invalid %-encoding (#{str})" unless /\A(?:%\h\h|[^%]+)*\z/.match?(str)
153
+ str.gsub(/\+|%\h\h/) { |c| TBLDECWWWCOMP_[c] }
152
154
  end
153
155
 
154
156
  # Encode given +str+ to URL-encoded form data.
@@ -161,7 +163,7 @@ module Webmachine
161
163
  #
162
164
  # @private
163
165
  def escape(str)
164
- str.to_s.gsub(/[^*\-.0-9A-Z_a-z]/){|c| TBLENCWWWCOMP_[c] }
166
+ str.to_s.gsub(/[^*\-.0-9A-Z_a-z]/) { |c| TBLENCWWWCOMP_[c] }
165
167
  end
166
168
  end
167
169
  end