Skip to content

Commit 1658054

Browse files
authored
Merge pull request rails#42338 from jhawthorn/send_preload_header_streaming
Skip sending preload links headers when streaming
2 parents cb8fc82 + f303eb2 commit 1658054

File tree

2 files changed

+41
-10
lines changed

2 files changed

+41
-10
lines changed

actionview/lib/action_view/helpers/asset_tag_helper.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -544,6 +544,7 @@ def resolve_link_as(extname, mime_type)
544544
MAX_HEADER_SIZE = 8_000 # Some HTTP client and proxies have a 8kiB header limit
545545
def send_preload_links_header(preload_links, max_header_size: MAX_HEADER_SIZE)
546546
return if preload_links.empty?
547+
return if response.sending?
547548

548549
if respond_to?(:request) && request
549550
request.send_early_hints("Link" => preload_links.join("\n"))

actionview/test/template/asset_tag_helper_test.rb

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,22 @@
66
require "action_dispatch"
77
ActionView::Template::Types.delegate_to Mime
88

9+
module AssetTagHelperTestHelpers
10+
def with_preload_links_header(new_preload_links_header = true)
11+
original_preload_links_header = ActionView::Helpers::AssetTagHelper.preload_links_header
12+
ActionView::Helpers::AssetTagHelper.preload_links_header = new_preload_links_header
13+
14+
yield
15+
ensure
16+
ActionView::Helpers::AssetTagHelper.preload_links_header = original_preload_links_header
17+
end
18+
end
19+
920
class AssetTagHelperTest < ActionView::TestCase
1021
tests ActionView::Helpers::AssetTagHelper
1122

23+
include AssetTagHelperTestHelpers
24+
1225
attr_reader :request, :response
1326

1427
class FakeRequest
@@ -24,6 +37,7 @@ class FakeResponse
2437
def headers
2538
@headers ||= {}
2639
end
40+
def sending?; false; end
2741
end
2842

2943
def setup
@@ -788,16 +802,6 @@ def test_caching_image_path_with_caching_and_proc_asset_host_using_request
788802
assert_equal "http://localhost/images/xml.png", image_path("xml.png")
789803
end
790804
end
791-
792-
private
793-
def with_preload_links_header(new_preload_links_header = true)
794-
original_preload_links_header = ActionView::Helpers::AssetTagHelper.preload_links_header
795-
ActionView::Helpers::AssetTagHelper.preload_links_header = new_preload_links_header
796-
797-
yield
798-
ensure
799-
ActionView::Helpers::AssetTagHelper.preload_links_header = original_preload_links_header
800-
end
801805
end
802806

803807
class AssetTagHelperNonVhostTest < ActionView::TestCase
@@ -951,6 +955,32 @@ def test_javascript_include_tag_without_request
951955
end
952956
end
953957

958+
class AssetTagHelperWithStreamingRequest < ActionView::TestCase
959+
tests ActionView::Helpers::AssetTagHelper
960+
961+
include AssetTagHelperTestHelpers
962+
963+
def setup
964+
super
965+
response.sending!
966+
end
967+
968+
def test_stylesheet_link_tag_with_streaming
969+
with_preload_links_header do
970+
assert_dom_equal(
971+
%(<link rel="stylesheet" href="/stylesheets/foo.css" />),
972+
stylesheet_link_tag("foo.css")
973+
)
974+
end
975+
end
976+
977+
def test_javascript_include_tag_with_streaming
978+
with_preload_links_header do
979+
assert_dom_equal %(<script src="/javascripts/foo.js"></script>), javascript_include_tag("foo.js")
980+
end
981+
end
982+
end
983+
954984
class AssetUrlHelperControllerTest < ActionView::TestCase
955985
tests ActionView::Helpers::AssetUrlHelper
956986

0 commit comments

Comments
 (0)