async-http 0.33.1 → 0.33.2

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
  SHA256:
3
- metadata.gz: def479574f952d5500c926a93e81a6832a1b0e2c635adf2fbff1bdaec7bb4313
4
- data.tar.gz: fee23c32549c5925b3ea3a406dc29b7a85104e92fc9c3e8c97de1bbbd0115f47
3
+ metadata.gz: 2018a5f45e997512850826ead70a696aa7a8cecfff16d4008776f4f11b0d3219
4
+ data.tar.gz: 9850ab072b612c65c47769eec40ffe12b733b114542fb7be7a7582f0177f9932
5
5
  SHA512:
6
- metadata.gz: 0caa8fa8e0809b771c4261f24b3e160123a09f6205fe1f86a912244aa5b1ae9a199ccf9438eb849076e2852a7fcf54f84fa488864af6c29f30f74589f32c4f48
7
- data.tar.gz: 6de884b5fc34042a339a3dfa85a9281c012dbefec676fb77a302609980e22fe94ccbcd41edfb1826e1b6d3642056e015afa5dedaa4d053b9c098533836cf8d57
6
+ metadata.gz: 5a4b16f09fdf6b9f985cf7bb9bdebce44dd521ff36af1836c756a5a12bcc7ea0240f42432fc4e26da65ce4f5008842c264827bee60ed6ac678f692a306cefd5b
7
+ data.tar.gz: d4779932899b863951518920756008bb64a16d18536e3db62103c7beb3486e7379ac0d5252fbb579893058a430355151f086635e0e08dd8e59b43a9e4286b824
@@ -0,0 +1,4 @@
1
+
2
+ gem 'rack'
3
+ gem 'falcon'
4
+ gem 'pry'
@@ -0,0 +1,54 @@
1
+ GEM
2
+ specs:
3
+ async (1.10.3)
4
+ nio4r (~> 2.3)
5
+ timers (~> 4.1)
6
+ async-container (0.6.1)
7
+ async (~> 1.0)
8
+ async-io (~> 1.4)
9
+ async-http (0.33.0)
10
+ async (~> 1.6)
11
+ async-io (~> 1.16)
12
+ http-protocol (~> 0.6.0)
13
+ async-io (1.16.1)
14
+ async (~> 1.3)
15
+ coderay (1.1.2)
16
+ falcon (0.18.13)
17
+ async-container (~> 0.6.0)
18
+ async-http (~> 0.33.0)
19
+ async-io (~> 1.9)
20
+ http-protocol (~> 0.6.0)
21
+ localhost (~> 1.1)
22
+ rack (>= 1.0)
23
+ samovar (~> 1.3)
24
+ hitimes (1.3.0)
25
+ http-hpack (0.1.1)
26
+ http-protocol (0.6.0)
27
+ http-hpack (~> 0.1.0)
28
+ localhost (1.1.4)
29
+ mapping (1.1.1)
30
+ method_source (0.9.0)
31
+ nio4r (2.3.1)
32
+ pry (0.11.3)
33
+ coderay (~> 1.1.0)
34
+ method_source (~> 0.9.0)
35
+ rack (2.0.5)
36
+ rainbow (2.2.2)
37
+ rake
38
+ rake (12.3.1)
39
+ samovar (1.9.0)
40
+ mapping (~> 1.0)
41
+ rainbow (~> 2.0)
42
+ timers (4.1.2)
43
+ hitimes
44
+
45
+ PLATFORMS
46
+ ruby
47
+
48
+ DEPENDENCIES
49
+ falcon
50
+ pry
51
+ rack
52
+
53
+ BUNDLED WITH
54
+ 1.16.5
@@ -0,0 +1,3 @@
1
+ # Fetch
2
+
3
+ This was an experiment to see how browsers handle bi-directional streaming.
@@ -0,0 +1,29 @@
1
+
2
+ require 'rack'
3
+ require 'pry'
4
+
5
+ class Echo
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ request = Rack::Request.new(env)
12
+
13
+ if request.path_info == "/echo"
14
+ if output = request.body
15
+ return [200, {}, output.body]
16
+ else
17
+ return [200, {}, ["Hello World?"]]
18
+ end
19
+ else
20
+ return @app.call(env)
21
+ end
22
+ end
23
+ end
24
+
25
+ use Echo
26
+
27
+ use Rack::Static, :urls => [''], :root => 'public', :index => 'index.html'
28
+
29
+ run lambda{|env| [404, {}, []]}
@@ -0,0 +1,23 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title>Streaming Fetch</title>
5
+ </head>
6
+ <body>
7
+ <h1>Streams</h1>
8
+
9
+ <button id="stopButton">Start</button>
10
+
11
+ <h2>Sent</h2>
12
+
13
+ <ul id="sent">
14
+ </ul>
15
+
16
+ <h2>Received</h2>
17
+
18
+ <ul id="received">
19
+ </ul>
20
+
21
+ <script src="stream.js"></script>
22
+ </body>
23
+ </html>
@@ -0,0 +1,56 @@
1
+ const inputStream = new ReadableStream({
2
+ start(controller) {
3
+ interval = setInterval(() => {
4
+ let string = "Hello World!";
5
+
6
+ // Add the string to the stream
7
+ controller.enqueue(string);
8
+
9
+ // show it on the screen
10
+ let listItem = document.createElement('li');
11
+ listItem.textContent = string;
12
+ sent.appendChild(listItem);
13
+ }, 10000);
14
+
15
+ stopButton.addEventListener('click', function() {
16
+ clearInterval(interval);
17
+ controller.close();
18
+ })
19
+ },
20
+ pull(controller) {
21
+ // We don't really need a pull in this example
22
+ },
23
+ cancel() {
24
+ // This is called if the reader cancels,
25
+ // so we should stop generating strings
26
+ clearInterval(interval);
27
+ }
28
+ });
29
+
30
+ fetch("/echo", {method: 'POST', body: inputStream})
31
+ .then(response => {
32
+ const reader = response.body.getReader();
33
+ const decoder = new TextDecoder("utf-8");
34
+
35
+ function push() {
36
+ reader.read().then(({done, value}) => {
37
+ console.log("done:", done, "value:", value);
38
+ const string = decoder.decode(value);
39
+
40
+ // show it on the screen
41
+ let listItem = document.createElement('li');
42
+
43
+ if (done)
44
+ listItem.textContent = "<EOF>"
45
+ else
46
+ listItem.textContent = string;
47
+
48
+ received.appendChild(listItem);
49
+
50
+ if (done) return;
51
+ else push();
52
+ });
53
+ };
54
+
55
+ push();
56
+ });
@@ -0,0 +1,38 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $LOAD_PATH.unshift(File.expand_path("../lib", __dir__))
4
+ $LOAD_PATH.unshift(File.expand_path("../../http-protocol/lib", __dir__))
5
+
6
+ require 'async'
7
+ require 'async/logger'
8
+ require 'async/http/client'
9
+ require 'async/http/url_endpoint'
10
+
11
+ # Async.logger.level = Logger::DEBUG
12
+
13
+ Async.run do |task|
14
+ endpoint = Async::HTTP::URLEndpoint.parse("https://www.google.com")
15
+
16
+ client = Async::HTTP::Client.new(endpoint)
17
+
18
+ headers = {
19
+ 'accept' => 'text/html',
20
+ }
21
+
22
+ request = Async::HTTP::Request.new("www.google.com", "GET", "/search?q=cats", headers)
23
+
24
+ puts "Sending request..."
25
+ response = client.call(request)
26
+
27
+ puts "Reading response status=#{response.status}..."
28
+
29
+ if body = response.body
30
+ while chunk = body.read
31
+ puts chunk.size
32
+ end
33
+ end
34
+
35
+ response.close
36
+
37
+ puts "Finish reading response."
38
+ end
@@ -52,7 +52,7 @@ module Async
52
52
  nil
53
53
  end
54
54
 
55
- # Enumerate all chunks until finished. Then invoke `#close`.
55
+ # Enumerate all chunks until finished, then invoke `#close`.
56
56
  def each
57
57
  return to_enum unless block_given?
58
58
 
@@ -64,7 +64,7 @@ module Async
64
64
  self.close($!)
65
65
  end
66
66
 
67
- # Read all remaining chunks into a single binary string.
67
+ # Read all remaining chunks into a single binary string using `#each`.
68
68
  def join
69
69
  buffer = IO::Buffer.new
70
70
 
@@ -21,31 +21,44 @@
21
21
  module Async
22
22
  module HTTP
23
23
  module Body
24
+ # General operations for interacting with a request or response body.
24
25
  module Reader
25
26
  # Read chunks from the body.
27
+ # @yield [String] read chunks from the body.
26
28
  def each(&block)
27
- self.body.each(&block)
29
+ if @body
30
+ @body.each(&block)
31
+ @body = nil
32
+ end
28
33
  end
29
34
 
30
35
  # Reads the entire request/response body.
36
+ # @return [String] the entire body as a string.
31
37
  def read
32
- if self.body
33
- self.body.join
38
+ if @body
39
+ buffer = @body.join
40
+ @body = nil
41
+
42
+ return buffer
34
43
  end
35
44
  end
36
45
 
37
46
  # Gracefully finish reading the body. This will buffer the remainder of the body.
47
+ # @return [Buffered] buffers the entire body.
38
48
  def finish
39
- if self.body
40
- self.body = self.body.finish
49
+ if @body
50
+ body = @body.finish
51
+ @body = nil
52
+
53
+ return body
41
54
  end
42
55
  end
43
56
 
44
57
  # Close the connection as quickly as possible. Discards body. May close the underlying connection if necessary to terminate the stream.
45
58
  def close(error = nil)
46
- if self.body
47
- self.body.close(error)
48
- self.body = nil
59
+ if @body
60
+ @body.close(error)
61
+ @body = nil
49
62
  end
50
63
  end
51
64
 
@@ -45,9 +45,13 @@ module Async
45
45
  end
46
46
 
47
47
  def close(*)
48
- super
49
-
50
- @callback.call
48
+ if @body
49
+ super
50
+
51
+ @callback.call
52
+
53
+ @body = nil
54
+ end
51
55
  end
52
56
 
53
57
  def read
@@ -57,8 +61,6 @@ module Async
57
61
  if @remaining and @remaining > 0
58
62
  raise EOFError, "Expected #{@remaining} more bytes!"
59
63
  end
60
-
61
- @callback.call
62
64
  end
63
65
 
64
66
  return chunk
@@ -89,12 +89,10 @@ module Async
89
89
  protected
90
90
 
91
91
  def availability_string
92
- @resources.collect{|resource,usage| "#{usage}/#{resource.multiplex}#{resource.good? ? '' : '*'}"}.join(";")
92
+ @resources.collect{|resource,usage| "#{usage}/#{resource.multiplex}#{resource.connected? ? '' : '*'}"}.join(";")
93
93
  end
94
94
 
95
95
  def reuse(resource)
96
- Async.logger.debug(self) {"Reuse #{resource}"}
97
-
98
96
  @resources[resource] -= 1
99
97
 
100
98
  @available.signal
@@ -20,6 +20,6 @@
20
20
 
21
21
  module Async
22
22
  module HTTP
23
- VERSION = "0.33.1"
23
+ VERSION = "0.33.2"
24
24
  end
25
25
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: async-http
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.33.1
4
+ version: 0.33.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Samuel Williams
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-13 00:00:00.000000000 Z
11
+ date: 2018-10-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: async
@@ -136,6 +136,13 @@ files:
136
136
  - README.md
137
137
  - Rakefile
138
138
  - async-http.gemspec
139
+ - examples/fetch/Gemfile
140
+ - examples/fetch/Gemfile.lock
141
+ - examples/fetch/README.md
142
+ - examples/fetch/config.ru
143
+ - examples/fetch/public/index.html
144
+ - examples/fetch/public/stream.js
145
+ - examples/request.rb
139
146
  - lib/async/http.rb
140
147
  - lib/async/http/accept_encoding.rb
141
148
  - lib/async/http/body.rb