mirror of
https://github.com/basecamp/once-campfire.git
synced 2026-10-18 20:26:30 +09:00
Keep a multi-range upload response's multipart type
A request for several byte ranges gets a 206 multipart/byteranges whose boundary the client needs to split the body. Rewriting it to octet-stream lost the boundary. No browser runs that type as a script, so it passes through.
This commit is contained in:
1 parent
d713f2631d
commit
9c37f41ff6
2 files changed
+9
-2
No files matched your search
@@ -3,7 +3,9 @@
|
||||
# Browsers accept sixteen spellings of that type, and Disk URLs sign the type
|
||||
# they were minted with, so a list of types to refuse can't cover old links.
|
||||
# Instead, anything Active Storage serves that isn't plainly media goes out as
|
||||
# a download, whatever its URL says. Only reads are touched: uploading
|
||||
# a download, whatever its URL says. A multi-range response keeps its
|
||||
# multipart/byteranges type and boundary, which no browser runs as a script.
|
||||
# Only reads are touched: uploading
|
||||
# (direct upload JSON, Disk PUT) answers in its own types.
|
||||
#
|
||||
# Accepted on upgrade: a cache that stored an upload under a script type
|
||||
@@ -14,7 +16,7 @@
|
||||
# way doesn't expire. Revalidation doesn't help, since a 304 carries no
|
||||
# content type.
|
||||
class UploadedScriptGuard
|
||||
SERVABLE = %r{\A(image|video|audio)/|\A(application/pdf|application/octet-stream|text/plain)\z}
|
||||
SERVABLE = %r{\A(image|video|audio)/|\A(application/pdf|application/octet-stream|text/plain|multipart/byteranges)\z}
|
||||
|
||||
def initialize(app)
|
||||
@app = app
|
||||
|
||||
@@ -21,6 +21,11 @@ class UploadedScriptGuardTest < ActiveSupport::TestCase
|
||||
end
|
||||
end
|
||||
|
||||
test "multi-range responses keep their boundary" do
|
||||
type = "multipart/byteranges; boundary=AaB03x"
|
||||
assert_equal type, served_type(type, "#{ActiveStorage.routes_prefix}/blobs/proxy/key/movie.mp4")
|
||||
end
|
||||
|
||||
test "direct upload responses keep their JSON type" do
|
||||
assert_equal "application/json", served_type("application/json", "#{ActiveStorage.routes_prefix}/direct_uploads", method: "POST")
|
||||
end
|
||||
|
||||
Reference in new issue
Block a user