async-http-cache 0.4.2 → 0.4.3

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
  SHA256:
3
- metadata.gz: 4f2003b72015123e99c75069272771e6247c31abbd55163da86955dd462dc4d6
4
- data.tar.gz: dd9798d6736f4e73c06e1a15a6010c192a663042081ee6d92484eddd4b924256
3
+ metadata.gz: 2439c0fb975f956215ef9eec1e8db38394e10608a4299253516fee12540b5e6f
4
+ data.tar.gz: 616e0a00b3e6fa00c85c29cede66c464b887ca8d56188e93b84cf6ec5d19f7a4
5
5
  SHA512:
6
- metadata.gz: 9ba0a34a15023d0e2b3b66052aa233f3180b4706e28040b08c0d8605e288230cee7461ffc8ecc3602575ae57e8b0ca7e713181aa07a83453f201c76680e0a32a
7
- data.tar.gz: 8722d2f6aa70df6e830ecd1482916b26bd42d8f18ccd070010fb6c7d5689982b503cceb3df604e14c359d4cd8cdc9b63a0612b0b8bbf7f40b52e7cb029817611
6
+ metadata.gz: aadf8138fab28ffedeaa0a74f4dedf6f888d84394e4668e6d42757bf8c87e6bad50c9afbd7477d2a26e84294c4ce13db964f4a5567badd7a994434440c0e7a73
7
+ data.tar.gz: 976634254e072fe0ea9f950da879d75954b2b5b56f3de52b9e4d42c10a19b71ed840ddd3c61660f5fa9efaa39ed06fbc5ac24585ebe21615f8ff4d542fff7d93
checksums.yaml.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ .,-�t�Q����V <#>A�i,��i��J@���ك�l� f�>b�"U�*�), v��%Ou���k_�\��:�����
2
+ �=���ղ`+��7�)��l�Q��:�Zx���
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  # Copyright, 2020, by Samuel G. D. Williams. <http://www.codeotaku.com>
4
- #
4
+ #
5
5
  # Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  # of this software and associated documentation files (the "Software"), to deal
7
7
  # in the Software without restriction, including without limitation the rights
8
8
  # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
9
  # copies of the Software, and to permit persons to whom the Software is
10
10
  # furnished to do so, subject to the following conditions:
11
- #
11
+ #
12
12
  # The above copyright notice and this permission notice shall be included in
13
13
  # all copies or substantial portions of the Software.
14
- #
14
+ #
15
15
  # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
16
  # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
17
  # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
@@ -20,6 +20,7 @@
20
20
  # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
21
  # THE SOFTWARE.
22
22
 
23
+ require 'set'
23
24
  require 'protocol/http/middleware'
24
25
 
25
26
  require_relative 'body'
@@ -31,102 +32,122 @@ module Async
31
32
  module Cache
32
33
  class General < ::Protocol::HTTP::Middleware
33
34
  CACHE_CONTROL = 'cache-control'
34
-
35
+
35
36
  CONTENT_TYPE = 'content-type'
36
37
  AUTHORIZATION = 'authorization'
37
38
  COOKIE = 'cookie'
38
-
39
+
40
+ # Status codes of responses that MAY be stored by a cache or used in reply
41
+ # to a subsequent request.
42
+ #
43
+ # http://tools.ietf.org/html/rfc2616#section-13.4
44
+ CACHEABLE_RESPONSE_CODES = {
45
+ 200 => true, # OK
46
+ 203 => true, # Non-Authoritative Information
47
+ 300 => true, # Multiple Choices
48
+ 301 => true, # Moved Permanently
49
+ 302 => true, # Found
50
+ 404 => true, # Not Found
51
+ 410 => true # Gone
52
+ }.freeze
53
+
39
54
  def initialize(app, store: Store.default)
40
55
  super(app)
41
-
56
+
42
57
  @count = 0
43
-
58
+
44
59
  @store = store
45
60
  end
46
-
61
+
47
62
  attr :count
48
63
  attr :store
49
-
64
+
50
65
  def close
51
66
  @store.close
52
67
  ensure
53
68
  super
54
69
  end
55
-
70
+
56
71
  def key(request)
57
72
  @store.normalize(request)
58
-
73
+
59
74
  [request.authority, request.method, request.path]
60
75
  end
61
-
76
+
62
77
  def cacheable?(request)
63
- # We don't support caching requests which have a body:
78
+ # We don't support caching requests which have a request body:
64
79
  if request.body
65
80
  return false
66
81
  end
67
-
82
+
68
83
  # We can't cache upgraded requests:
69
84
  if request.protocol
70
85
  return false
71
86
  end
72
-
87
+
73
88
  # We only support caching GET and HEAD requests:
74
89
  unless request.method == 'GET' || request.method == 'HEAD'
75
90
  return false
76
91
  end
77
-
92
+
78
93
  if request.headers[AUTHORIZATION]
79
94
  return false
80
95
  end
81
-
96
+
82
97
  if request.headers[COOKIE]
83
98
  return false
84
99
  end
85
-
100
+
86
101
  # Otherwise, we can cache it:
87
102
  return true
88
103
  end
89
-
104
+
90
105
  def wrap(key, request, response)
91
- if response.status != 200
106
+ unless CACHEABLE_RESPONSE_CODES.include?(response.status)
92
107
  return response
93
108
  end
94
-
109
+
110
+ response_cache_control = response.headers[CACHE_CONTROL]
111
+
112
+ if response_cache_control&.no_store? || response_cache_control&.private?
113
+ return response
114
+ end
115
+
95
116
  if request.head? and body = response.body
96
117
  unless body.empty?
97
118
  Console.logger.warn(self) {"HEAD request resulted in non-empty body!"}
98
-
119
+
99
120
  return response
100
121
  end
101
122
  end
102
-
123
+
103
124
  return Body.wrap(response) do |response, body|
104
125
  Console.logger.debug(self) {"Updating cache for #{key}..."}
105
126
  @store.insert(key, request, Response.new(response, body))
106
127
  end
107
128
  end
108
-
129
+
109
130
  def call(request)
110
131
  key = self.key(request)
111
-
132
+
112
133
  cache_control = request.headers[CACHE_CONTROL]
113
-
134
+
114
135
  unless cache_control&.no_cache?
115
136
  if response = @store.lookup(key, request)
116
137
  Console.logger.debug(self) {"Cache hit for #{key}..."}
117
138
  @count += 1
118
-
139
+
119
140
  # Return the cached response:
120
141
  return response
121
142
  end
122
143
  end
123
-
144
+
124
145
  unless cache_control&.no_store?
125
146
  if cacheable?(request)
126
147
  return wrap(key, request, super)
127
148
  end
128
149
  end
129
-
150
+
130
151
  return super
131
152
  end
132
153
  end
@@ -56,7 +56,7 @@ module Async
56
56
  @etag ||= @headers[ETAG]
57
57
  end
58
58
 
59
- def cachable?
59
+ def cacheable?
60
60
  if cache_control = @headers[CACHE_CONTROL]
61
61
  if cache_control.private? || !cache_control.public?
62
62
  return false
@@ -25,9 +25,10 @@ module Async
25
25
  module Cache
26
26
  module Store
27
27
  class Memory
28
- def initialize(limit: 1024)
28
+ def initialize(limit: 1024, maximum_size: 1024*64, prune_interval: 60)
29
29
  @index = {}
30
30
  @limit = limit
31
+ @maximum_size = maximum_size
31
32
 
32
33
  @hit = 0
33
34
  @miss = 0
@@ -35,7 +36,7 @@ module Async
35
36
 
36
37
  @gardener = Async(transient: true, annotation: self.class) do |task|
37
38
  while true
38
- task.sleep(60)
39
+ task.sleep(prune_interval)
39
40
 
40
41
  pruned = self.prune
41
42
  @pruned += pruned
@@ -96,7 +97,7 @@ module Async
96
97
  def insert(key, request, response)
97
98
  if @index.size < @limit
98
99
  length = response.body&.length
99
- if length.nil? or length < 1024*64
100
+ if length.nil? or length < @maximum_size
100
101
  @index[key] = response
101
102
  end
102
103
  end
@@ -23,7 +23,7 @@
23
23
  module Async
24
24
  module HTTP
25
25
  module Cache
26
- VERSION = "0.4.2"
26
+ VERSION = "0.4.3"
27
27
  end
28
28
  end
29
29
  end
data.tar.gz.sig ADDED
Binary file
metadata CHANGED
@@ -1,14 +1,44 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-http-cache
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.2
4
+ version: 0.4.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
+ - Olle Jonsson
8
9
  autorequire:
9
10
  bindir: bin
10
- cert_chain: []
11
- date: 2021-05-13 00:00:00.000000000 Z
11
+ cert_chain:
12
+ - |
13
+ -----BEGIN CERTIFICATE-----
14
+ MIIE2DCCA0CgAwIBAgIBATANBgkqhkiG9w0BAQsFADBhMRgwFgYDVQQDDA9zYW11
15
+ ZWwud2lsbGlhbXMxHTAbBgoJkiaJk/IsZAEZFg1vcmlvbnRyYW5zZmVyMRIwEAYK
16
+ CZImiZPyLGQBGRYCY28xEjAQBgoJkiaJk/IsZAEZFgJuejAeFw0yMjA4MDYwNDUz
17
+ MjRaFw0zMjA4MDMwNDUzMjRaMGExGDAWBgNVBAMMD3NhbXVlbC53aWxsaWFtczEd
18
+ MBsGCgmSJomT8ixkARkWDW9yaW9udHJhbnNmZXIxEjAQBgoJkiaJk/IsZAEZFgJj
19
+ bzESMBAGCgmSJomT8ixkARkWAm56MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
20
+ igKCAYEAomvSopQXQ24+9DBB6I6jxRI2auu3VVb4nOjmmHq7XWM4u3HL+pni63X2
21
+ 9qZdoq9xt7H+RPbwL28LDpDNflYQXoOhoVhQ37Pjn9YDjl8/4/9xa9+NUpl9XDIW
22
+ sGkaOY0eqsQm1pEWkHJr3zn/fxoKPZPfaJOglovdxf7dgsHz67Xgd/ka+Wo1YqoE
23
+ e5AUKRwUuvaUaumAKgPH+4E4oiLXI4T1Ff5Q7xxv6yXvHuYtlMHhYfgNn8iiW8WN
24
+ XibYXPNP7NtieSQqwR/xM6IRSoyXKuS+ZNGDPUUGk8RoiV/xvVN4LrVm9upSc0ss
25
+ RZ6qwOQmXCo/lLcDUxJAgG95cPw//sI00tZan75VgsGzSWAOdjQpFM0l4dxvKwHn
26
+ tUeT3ZsAgt0JnGqNm2Bkz81kG4A2hSyFZTFA8vZGhp+hz+8Q573tAR89y9YJBdYM
27
+ zp0FM4zwMNEUwgfRzv1tEVVUEXmoFCyhzonUUw4nE4CFu/sE3ffhjKcXcY//qiSW
28
+ xm4erY3XAgMBAAGjgZowgZcwCQYDVR0TBAIwADALBgNVHQ8EBAMCBLAwHQYDVR0O
29
+ BBYEFO9t7XWuFf2SKLmuijgqR4sGDlRsMC4GA1UdEQQnMCWBI3NhbXVlbC53aWxs
30
+ aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MC4GA1UdEgQnMCWBI3NhbXVlbC53aWxs
31
+ aWFtc0BvcmlvbnRyYW5zZmVyLmNvLm56MA0GCSqGSIb3DQEBCwUAA4IBgQB5sxkE
32
+ cBsSYwK6fYpM+hA5B5yZY2+L0Z+27jF1pWGgbhPH8/FjjBLVn+VFok3CDpRqwXCl
33
+ xCO40JEkKdznNy2avOMra6PFiQyOE74kCtv7P+Fdc+FhgqI5lMon6tt9rNeXmnW/
34
+ c1NaMRdxy999hmRGzUSFjozcCwxpy/LwabxtdXwXgSay4mQ32EDjqR1TixS1+smp
35
+ 8C/NCWgpIfzpHGJsjvmH2wAfKtTTqB9CVKLCWEnCHyCaRVuKkrKjqhYCdmMBqCws
36
+ JkxfQWC+jBVeG9ZtPhQgZpfhvh+6hMhraUYRQ6XGyvBqEUe+yo6DKIT3MtGE2+CP
37
+ eX9i9ZWBydWb8/rvmwmX2kkcBbX0hZS1rcR593hGc61JR6lvkGYQ2MYskBveyaxt
38
+ Q2K9NVun/S785AP05vKkXZEFYxqG6EW012U4oLcFl5MySFajYXRYbuUpH6AY+HP8
39
+ voD0MPg1DssDLKwXyt1eKD/+Fq0bFWhwVM/1XiAXL7lyYUyOq24KHgQ2Csg=
40
+ -----END CERTIFICATE-----
41
+ date: 2022-08-23 00:00:00.000000000 Z
12
42
  dependencies:
13
43
  - !ruby/object:Gem::Dependency
14
44
  name: async-http
@@ -99,7 +129,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
99
129
  - !ruby/object:Gem::Version
100
130
  version: '0'
101
131
  requirements: []
102
- rubygems_version: 3.3.0.dev
132
+ rubygems_version: 3.3.7
103
133
  signing_key:
104
134
  specification_version: 4
105
135
  summary: Standard-compliant cache for async-http.
metadata.gz.sig ADDED
@@ -0,0 +1,2 @@
1
+ ?���|$���Ŗ�~�;�r�k�p�񳄉���m��C@�Cѧ/�Bθ�_�ý�X��;�z��|����q]`��.�C���v2�yJ:���.7n�c�*���j����^/>���m����O� F��۴�&��O�����@�aj�N0ޯG8��]EUJz�嗒1��R�j���XSt.��i�ve�Z),�ő(�3���H�V����m��/�e��=��ek�,�
2
+ P�<�P;�|��1�*7[�n,�?�/����beq�o�x�q�ð�y4��,