rdaneel 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.1.2
1
+ 0.1.3
data/lib/rdaneel.rb CHANGED
@@ -91,7 +91,7 @@ class RDaneel
91
91
  end
92
92
  else
93
93
  robots_url = robots_txt_url(current_uri)
94
- robots = EM::HttpRequest.new(robots_url).get
94
+ robots = EM::HttpRequest.new(robots_url).get(:redirects => 2) # get the robots.txt following redirects
95
95
  robots.callback {
96
96
  robots_file = robots.response
97
97
  robots_cache[robots_url.to_s] = robots_file if robots_cache
@@ -2,76 +2,38 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "RDaneel when there are no redirects" do
4
4
 
5
- describe "when not exist a robots.txt (404) and the url requested is /" do
6
- before(:each) do
7
- burrito.mount( :path => '/', :status => 200,
8
- :body => 'Hello World!', :block => should_be_hit_once )
9
- burrito.mount( :path => '/robots.txt', :status => 404,
10
- :block => should_be_hit_once )
11
- end
12
-
13
- after(:each) do
14
- burrito.unmount('/')
15
- burrito.unmount('/robots.txt')
16
- end
17
-
18
- it "should get the content is the url not end with /" do
19
-
20
- EM.run do
21
- r = RDaneel.new("http://127.0.0.1:8080")
22
- r.callback do
23
- r.http_client.response_header.status.should == 200
24
- r.http_client.response.should == "Hello World!"
25
- r.redirects.should be_empty
26
- EM.stop
27
- end
28
- r.errback do
29
- fail
30
- EM.stop
31
- end
32
- r.get
33
- end
34
-
35
- end
36
- end
37
-
38
-
5
+ let(:port) {8083}
39
6
 
40
7
  describe "when a successfull status different than 200 is issued for robots.txt" do
41
-
42
8
  it "should get the content ignoring the redirect"
43
-
44
9
  end
45
10
 
46
11
  describe "when a redirect other than 301 and 302 is issued for robots.txt" do
47
-
48
12
  it "should get the content ignoring the redirect"
49
-
50
13
  end
51
14
 
52
15
  (301..302).each do |status|
53
16
 
54
17
  describe "when robots.txt has been moved (http code #{status})" do
55
18
  before(:each) do
56
- burrito.mount( :path => '/hello_world', :status => 200,
19
+ server_setup(port+status) do |server|
20
+ mount(server, :path => '/hello_world', :status => 200,
57
21
  :body => 'Hello World!', :block => should_be_hit_once )
58
- burrito.mount( :path => '/robots.txt', :status => status,
59
- :location => 'http://127.0.0.1:8080/golems.txt',
22
+ mount(server, :path => '/robots.txt', :status => status,
23
+ :location => "http://127.0.0.1:#{port+status}/golems.txt",
24
+ :block => should_be_hit_once )
25
+ mount(server, :path => '/golems.txt', :status => 200,
60
26
  :block => should_be_hit_once )
61
- burrito.mount( :path => '/golems.txt', :status => 200,
62
- :block => should_not_be_hit )
27
+ end
63
28
  end
64
29
 
65
30
  after(:each) do
66
- burrito.unmount('/hello_world')
67
- burrito.unmount('/robots.txt')
68
- burrito.unmount('/golems.txt')
31
+ server_shutdown
69
32
  end
70
33
 
71
- it "should get the content ignoring the redirect" do
72
-
34
+ it "should get the redirected robots.txt and the content" do
73
35
  EM.run do
74
- r = RDaneel.new("http://127.0.0.1:8080/hello_world")
36
+ r = RDaneel.new("http://127.0.0.1:#{port+status}/hello_world")
75
37
  r.callback do
76
38
  r.http_client.response_header.status.should == 200
77
39
  r.http_client.response.should == "Hello World!"
@@ -84,7 +46,6 @@ describe "RDaneel when there are no redirects" do
84
46
  end
85
47
  r.get
86
48
  end
87
-
88
49
  end
89
50
 
90
51
  end
@@ -95,21 +56,21 @@ describe "RDaneel when there are no redirects" do
95
56
 
96
57
  describe "when there is a CLIENT error #{status} associated to robots.txt" do
97
58
  before(:each) do
98
- burrito.mount( :path => '/hello_world', :status => 200,
99
- :body => 'Hello World!', :block => should_be_hit_once )
100
- burrito.mount( :path => '/robots.txt', :status => status,
101
- :block => should_be_hit_once )
59
+ server_setup(port+status) do |server|
60
+ mount(server, :path => '/hello_world', :status => 200,
61
+ :body => 'Hello World!', :block => should_be_hit_once )
62
+ mount(server, :path => '/robots.txt', :status => status,
63
+ :block => should_be_hit_once )
64
+ end
102
65
  end
103
66
 
104
67
  after(:each) do
105
- burrito.unmount('/hello_world')
106
- burrito.unmount('/robots.txt')
68
+ server_shutdown
107
69
  end
108
70
 
109
71
  it "should get the content" do
110
-
111
72
  EM.run do
112
- r = RDaneel.new("http://127.0.0.1:8080/hello_world")
73
+ r = RDaneel.new("http://127.0.0.1:#{port+status}/hello_world")
113
74
  r.callback do
114
75
  r.http_client.response_header.status.should == 200
115
76
  r.http_client.response.should == "Hello World!"
@@ -122,7 +83,6 @@ describe "RDaneel when there are no redirects" do
122
83
  end
123
84
  r.get
124
85
  end
125
-
126
86
  end
127
87
 
128
88
  end
@@ -133,21 +93,21 @@ describe "RDaneel when there are no redirects" do
133
93
 
134
94
  describe "when there is a SERVER error #{status} associated to robots.txt" do
135
95
  before(:each) do
136
- burrito.mount( :path => '/hello_world', :status => 200,
96
+ server_setup(port+status) do |server|
97
+ mount(server, :path => '/hello_world', :status => 200,
137
98
  :body => 'Hello World!', :block => should_be_hit_once )
138
- burrito.mount( :path => '/robots.txt', :status => status,
99
+ mount(server, :path => '/robots.txt', :status => status,
139
100
  :block => should_be_hit_once )
101
+ end
140
102
  end
141
103
 
142
104
  after (:each) do
143
- burrito.unmount('/hello_world')
144
- burrito.unmount('/robots.txt')
105
+ server_shutdown
145
106
  end
146
107
 
147
108
  it "should get the content" do
148
-
149
109
  EM.run do
150
- r = RDaneel.new("http://127.0.0.1:8080/hello_world")
110
+ r = RDaneel.new("http://127.0.0.1:#{port+status}/hello_world")
151
111
  r.callback do
152
112
  r.http_client.response_header.status.should == 200
153
113
  r.http_client.response.should == "Hello World!"
@@ -160,7 +120,6 @@ describe "RDaneel when there are no redirects" do
160
120
  end
161
121
  r.get
162
122
  end
163
-
164
123
  end
165
124
 
166
125
  end
@@ -2,29 +2,31 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "RDaneel when there are redirects" do
4
4
 
5
+ let(:port) {8081}
6
+
5
7
  describe "when there is no robots.txt in the host (ONLY one host)" do
6
8
 
7
9
  describe "when no redirection limit has been set" do
8
10
  before(:each) do
9
- burrito.mount( :path => '/robots.txt', :status => 404,
11
+ server_setup(port) do |server|
12
+ mount(server, :path => '/robots.txt', :status => 404,
10
13
  :block => should_be_hit_once )
11
- burrito.mount( :path => '/redirect_me', :status => 301,
12
- :location => 'http://127.0.0.1:8080/hello_world',
14
+ mount(server, :path => '/redirect_me', :status => 301,
15
+ :location => "http://127.0.0.1:#{port}/hello_world",
13
16
  :block => should_be_hit_once )
14
- burrito.mount( :path => '/hello_world', :status => 200,
17
+ mount(server, :path => '/hello_world', :status => 200,
15
18
  :body => 'Hello World!',
16
19
  :block => should_not_be_hit )
20
+ end
17
21
  end
18
22
 
19
23
  after(:each) do
20
- burrito.unmount('/robots.txt')
21
- burrito.unmount('/redirect_me')
22
- burrito.unmount('/hello_world')
24
+ server_shutdown
23
25
  end
24
26
 
25
27
  it "should not follow redirects" do
26
28
  EM.run do
27
- r = RDaneel.new("http://127.0.0.1:8080/redirect_me")
29
+ r = RDaneel.new("http://127.0.0.1:#{port}/redirect_me")
28
30
  r.callback do
29
31
  fail
30
32
  EM.stop
@@ -45,35 +47,34 @@ describe "RDaneel when there are redirects" do
45
47
 
46
48
  describe "when there are less redirects than the maximum specified" do
47
49
  before(:each) do
48
- burrito.mount( :path => '/robots.txt', :status => 404,
50
+ server_setup(port) do |server|
51
+ mount(server, :path => '/robots.txt', :status => 404,
49
52
  :block => should_be_hit(3) )
50
- burrito.mount( :path => '/redirect_me', :status => 301,
51
- :location => 'http://127.0.0.1:8080/redirect_me_again',
53
+ mount(server, :path => '/redirect_me', :status => 301,
54
+ :location => "http://127.0.0.1:#{port}/redirect_me_again",
52
55
  :block => should_be_hit_once )
53
- burrito.mount( :path => '/redirect_me_again', :status => 301,
54
- :location => 'http://127.0.0.1:8080/hello_world',
56
+ mount(server, :path => '/redirect_me_again', :status => 301,
57
+ :location => "http://127.0.0.1:#{port}/hello_world",
55
58
  :block => should_be_hit_once )
56
- burrito.mount( :path => '/hello_world', :status => 200,
59
+ mount(server, :path => '/hello_world', :status => 200,
57
60
  :body => 'Hello World!',
58
61
  :block => should_be_hit_once )
62
+ end
59
63
  end
60
64
 
61
65
  after(:each) do
62
- burrito.unmount('/robots.txt')
63
- burrito.unmount('/redirect_me')
64
- burrito.unmount('/redirect_me_again')
65
- burrito.unmount('/hello_world')
66
+ server_shutdown
66
67
  end
67
68
 
68
69
  it "should get the content following all the redirects" do
69
70
  EM.run do
70
- r = RDaneel.new("http://127.0.0.1:8080/redirect_me")
71
+ r = RDaneel.new("http://127.0.0.1:#{port}/redirect_me")
71
72
  r.callback do
72
73
  r.http_client.response_header.status.should == 200
73
74
  r.http_client.response.should == "Hello World!"
74
- r.redirects.should == [ "http://127.0.0.1:8080/redirect_me",
75
- "http://127.0.0.1:8080/redirect_me_again"]
76
- r.uri.to_s.should == "http://127.0.0.1:8080/hello_world"
75
+ r.redirects.should == [ "http://127.0.0.1:#{port}/redirect_me",
76
+ "http://127.0.0.1:#{port}/redirect_me_again"]
77
+ r.uri.to_s.should == "http://127.0.0.1:#{port}/hello_world"
77
78
  EM.stop
78
79
  end
79
80
  r.errback do
@@ -89,30 +90,30 @@ describe "RDaneel when there are redirects" do
89
90
 
90
91
  describe "when there are as many redirects as the maximum" do
91
92
  before(:each) do
92
- burrito.mount( :path => '/robots.txt', :status => 404,
93
+ server_setup(port) do |server|
94
+ mount(server, :path => '/robots.txt', :status => 404,
93
95
  :block => should_be_hit_twice )
94
- burrito.mount( :path => '/redirect_me', :status => 301,
95
- :location => 'http://127.0.0.1:8080/hello_world',
96
+ mount(server, :path => '/redirect_me', :status => 301,
97
+ :location => "http://127.0.0.1:#{port}/hello_world",
96
98
  :block => should_be_hit_once )
97
- burrito.mount( :path => '/hello_world', :status => 200,
99
+ mount(server, :path => '/hello_world', :status => 200,
98
100
  :body => 'Hello World!',
99
101
  :block => should_be_hit_once )
102
+ end
100
103
  end
101
104
 
102
105
  after(:each) do
103
- burrito.unmount('/robots.txt')
104
- burrito.unmount('/redirect_me')
105
- burrito.unmount('/hello_world')
106
+ server_shutdown
106
107
  end
107
108
 
108
109
  it "should get the content following all the redirects" do
109
110
  EM.run do
110
- r = RDaneel.new("http://127.0.0.1:8080/redirect_me")
111
+ r = RDaneel.new("http://127.0.0.1:#{port}/redirect_me")
111
112
  r.callback do
112
113
  r.http_client.response_header.status.should == 200
113
114
  r.http_client.response.should == "Hello World!"
114
- r.redirects.should == ['http://127.0.0.1:8080/redirect_me']
115
- r.uri.to_s.should == "http://127.0.0.1:8080/hello_world"
115
+ r.redirects.should == ["http://127.0.0.1:#{port}/redirect_me"]
116
+ r.uri.to_s.should == "http://127.0.0.1:#{port}/hello_world"
116
117
  EM.stop
117
118
  end
118
119
  r.errback do
@@ -128,35 +129,34 @@ describe "RDaneel when there are redirects" do
128
129
 
129
130
  describe "when the number of redirects exceed the maximum specified" do
130
131
  before(:each) do
131
- burrito.mount( :path => '/robots.txt', :status => 404,
132
+ server_setup(port) do |server|
133
+ mount(server, :path => '/robots.txt', :status => 404,
132
134
  :block => should_be_hit_twice )
133
- burrito.mount( :path => '/redirect_me', :status => 301,
134
- :location => 'http://127.0.0.1:8080/redirect_me_again',
135
+ mount(server, :path => '/redirect_me', :status => 301,
136
+ :location => "http://127.0.0.1:#{port}/redirect_me_again",
135
137
  :block => should_be_hit_once )
136
- burrito.mount( :path => '/redirect_me_again', :status => 301,
137
- :location => 'http://127.0.0.1:8080/hello_world',
138
+ mount(server, :path => '/redirect_me_again', :status => 301,
139
+ :location => "http://127.0.0.1:#{port}/hello_world",
138
140
  :block => should_be_hit_once )
139
- burrito.mount( :path => '/hello_world', :status => 200,
141
+ mount(server, :path => '/hello_world', :status => 200,
140
142
  :body => 'Hello World!',
141
143
  :block => should_not_be_hit )
144
+ end
142
145
  end
143
146
 
144
147
  after(:each) do
145
- burrito.unmount('/robots.txt')
146
- burrito.unmount('/redirect_me')
147
- burrito.unmount('/redirect_me_again')
148
- burrito.unmount('/hello_world')
148
+ server_shutdown
149
149
  end
150
150
 
151
151
  it "should stop following redirects once the maximum specified is reached" do
152
152
  EM.run do
153
- r = RDaneel.new("http://127.0.0.1:8080/redirect_me")
153
+ r = RDaneel.new("http://127.0.0.1:#{port}/redirect_me")
154
154
  r.callback do
155
155
  fail
156
156
  EM.stop
157
157
  end
158
158
  r.errback do
159
- r.redirects.should == ['http://127.0.0.1:8080/redirect_me']
159
+ r.redirects.should == ["http://127.0.0.1:#{port}/redirect_me"]
160
160
  r.error.should == "Exceeded maximum number of redirects"
161
161
  EM.stop
162
162
  end
data/spec/spec_helper.rb CHANGED
@@ -5,57 +5,66 @@ require 'rdaneel'
5
5
  require 'spec'
6
6
  require 'webrick'
7
7
 
8
- Spec::Runner.configure do |config|
9
- config.before :suite do
10
- burrito
8
+ # keep webrick quiet
9
+ class ::WEBrick::HTTPServer
10
+ def access_log(config, req, res)
11
+ # nop
11
12
  end
12
- config.after :suite do
13
- burrito.stop
13
+ end
14
+ class ::WEBrick::BasicLog
15
+ def log(level, data)
16
+ # nop
14
17
  end
15
18
  end
16
19
 
17
- def burrito
18
- Thread.current[:burrito] ||= Burrito.new
20
+ def locked_file
21
+ File.join(File.dirname(__FILE__),"server_lock-#{@__port}")
19
22
  end
20
23
 
21
- class Burrito
24
+ def server_setup(port=8080, &blk)
25
+ @__port = port
26
+ if @server.nil? and !File.exist?(locked_file)
27
+ File.open(locked_file,'w') {|f| f << 'locked' }
28
+ @server = WEBrick::HTTPServer.new :Port => port
29
+ blk.call(@server) if blk
30
+ queue = Queue.new # synchronize the thread startup to the main thread
31
+ @test_thread = Thread.new { queue << 1; @server.start }
22
32
 
23
- def initialize( options={}, &blk )
24
- webrick_log_file = '/dev/null' # disable logging
25
- webrick_logger = WEBrick::Log.new(webrick_log_file, WEBrick::Log::DEBUG)
26
- access_log_stream = webrick_logger
27
- access_log = [[ access_log_stream, WEBrick::AccessLog::COMBINED_LOG_FORMAT ]]
28
- default_opts = {:Port => 8080, :Logger => webrick_logger, :AccessLog => access_log }
29
- @server = WEBrick::HTTPServer.new( default_opts.merge(options) )
30
- @server_thread = Thread.new {
31
- blk.call(@server) if blk
32
- @server.start
33
- }
34
- @server
35
- sleep 0.5
36
- end
33
+ # wait for the queue
34
+ value = queue.pop
37
35
 
38
- def mount( opts )
39
- raise ":path is required" if opts[:path].nil?
40
- raise ":status is required" if opts[:status].nil?
41
- @server.mount_proc( opts[:path],
42
- lambda { |req, resp|
43
- resp.status = opts[:status]
44
- resp.body = opts[:body] unless opts[:body].nil?
45
- resp['Location'] = opts[:location] unless opts[:location].nil?
46
- opts[:block].call unless opts[:block].nil?
47
- } )
48
- end
36
+ if !value
37
+ STDERR.puts "Failed to startup test server!"
38
+ exit(1)
39
+ end
49
40
 
50
- def stop
51
- @server.shutdown
52
- @server_thread.join
41
+ trap("INT"){server_shutdown}
42
+ at_exit{server_shutdown}
53
43
  end
44
+ end
54
45
 
55
- def unmount(path)
56
- @server.unmount(path)
46
+ def server_shutdown
47
+ begin
48
+ if File.exist?(locked_file)
49
+ File.unlink locked_file
50
+ @server.shutdown unless @server.nil?
51
+ @server = nil
52
+ end
53
+ rescue Object => e
54
+ puts "Error #{__FILE__}:#{__LINE__}\n#{e.message}"
57
55
  end
56
+ end
58
57
 
58
+ def mount(server, opts)
59
+ raise ":path is required" if opts[:path].nil?
60
+ raise ":status is required" if opts[:status].nil?
61
+ server.mount_proc( opts[:path],
62
+ lambda { |req, resp|
63
+ resp.status = opts[:status]
64
+ resp.body = opts[:body] unless opts[:body].nil?
65
+ resp['Location'] = opts[:location] unless opts[:location].nil?
66
+ opts[:block].call unless opts[:block].nil?
67
+ } )
59
68
  end
60
69
 
61
70
  def should_not_be_hit
@@ -76,3 +85,9 @@ def should_be_hit( times = 1 )
76
85
  return l
77
86
  end
78
87
 
88
+ Spec::Runner.configure do |config|
89
+ config.before :suite do
90
+ puts "\e[4mThese specs could take a while, please be patience\e[0m"
91
+ end
92
+ end
93
+
@@ -0,0 +1,51 @@
1
+ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
+
3
+ describe "RDaneel when the content is chunked (digg.com)" do
4
+
5
+ # digg.com uses chunked encoding
6
+ # http://www.digg.com is redirected to http://digg.com
7
+
8
+ describe "when the url is not redirected" do
9
+
10
+ it "should get the content" do
11
+ EM.run do
12
+ r = RDaneel.new("http://digg.com")
13
+ r.callback do
14
+ r.http_client.response_header.status.should == 200
15
+ r.http_client.response.should_not be_empty
16
+ r.redirects.should be_empty
17
+ EM.stop
18
+ end
19
+ r.errback do
20
+ fail
21
+ EM.stop
22
+ end
23
+ r.get
24
+ end
25
+ end
26
+
27
+ end
28
+
29
+ describe "when the url is redirected" do
30
+ it "should get the content" do
31
+ EM.run do
32
+ r = RDaneel.new("http://bit.ly:80/aquXKU")
33
+ r.callback do
34
+ r.http_client.response_header.status.should == 200
35
+ r.http_client.response.should_not be_empty
36
+ r.redirects.should == ['http://bit.ly:80/aquXKU']
37
+ r.uri.to_s.should == "http://www.relevancesells.com:80/2010/03/12/the-1st-7-seconds-rule-for-an-elevator-pitch/"
38
+ EM.stop
39
+ end
40
+ r.errback do
41
+ puts "Error: #{r.error}"
42
+ fail
43
+ EM.stop
44
+ end
45
+ r.get(:redirects => 3)
46
+ end
47
+ end
48
+ end
49
+
50
+ end
51
+
@@ -2,34 +2,36 @@ require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "RDaneel when there is a cache" do
4
4
 
5
+ let(:port) {8082}
6
+
5
7
  describe "when there is no robots.txt in the host" do
6
8
 
7
9
  before(:each) do
8
10
  RDaneel.robots_cache = {}
9
- burrito.mount( :path => '/robots.txt', :status => 404,
11
+ server_setup(port) do |server|
12
+ mount(server, :path => '/robots.txt', :status => 404,
10
13
  :block => should_be_hit_once )
11
- burrito.mount( :path => '/redirect_me', :status => 301,
12
- :location => 'http://127.0.0.1:8080/hello_world',
14
+ mount(server, :path => '/redirect_me', :status => 301,
15
+ :location => "http://127.0.0.1:#{port}/hello_world",
13
16
  :block => should_be_hit_once )
14
- burrito.mount( :path => '/hello_world', :status => 200,
17
+ mount(server, :path => '/hello_world', :status => 200,
15
18
  :body => 'Hello World!',
16
19
  :block => should_be_hit_once )
20
+ end
17
21
  end
18
22
 
19
23
  after(:each) do
20
- burrito.unmount('/robots.txt')
21
- burrito.unmount('/redirect_me')
22
- burrito.unmount('/hello_world')
24
+ server_shutdown
23
25
  end
24
26
 
25
27
  it "should try to get the robots.txt just once" do
26
28
  EM.run do
27
- r = RDaneel.new("http://127.0.0.1:8080/redirect_me")
29
+ r = RDaneel.new("http://127.0.0.1:#{port}/redirect_me")
28
30
  r.callback do
29
31
  r.http_client.response_header.status.should == 200
30
32
  r.http_client.response.should == "Hello World!"
31
- r.redirects.should == [ "http://127.0.0.1:8080/redirect_me"]
32
- r.uri.to_s.should == "http://127.0.0.1:8080/hello_world"
33
+ r.redirects.should == [ "http://127.0.0.1:#{port}/redirect_me"]
34
+ r.uri.to_s.should == "http://127.0.0.1:#{port}/hello_world"
33
35
  EM.stop
34
36
  end
35
37
  r.errback do
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 1
8
- - 2
9
- version: 0.1.2
8
+ - 3
9
+ version: 0.1.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Edgar Gonzalez
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2010-07-21 00:00:00 -04:30
18
+ date: 2010-08-13 00:00:00 -04:30
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -83,6 +83,7 @@ files:
83
83
  - spec/redirects_without_robots_spec.rb
84
84
  - spec/spec.opts
85
85
  - spec/spec_helper.rb
86
+ - spec/streamed_content_spec.rb
86
87
  - spec/using_cache_spec.rb
87
88
  has_rdoc: true
88
89
  homepage: http://github.com/hasmanydevelopers/RDaneel
@@ -119,3 +120,4 @@ test_files:
119
120
  - spec/no_redirects_neither_robots_spec.rb
120
121
  - spec/spec_helper.rb
121
122
  - spec/redirects_without_robots_spec.rb
123
+ - spec/streamed_content_spec.rb