@@ -25,6 +25,8 @@ import { type Datalake, wrapETag } from '../datalake'
2525import { getBufferSha256 , getFileSha256 } from '../hash'
2626import { type TemporaryDir } from '../tempdir'
2727
28+ const safeInlineTypes = [ 'application/pdf' , 'image/png' , 'image/jpeg' , 'image/gif' , 'image/webp' ]
29+
2830interface BlobParentRequest {
2931 parent : string | null
3032}
@@ -76,13 +78,16 @@ export async function handleBlobGet (
7678 return
7779 }
7880
81+ const disposition = safeInlineTypes . includes ( blob . contentType ) ? 'inline' : 'attachment'
82+
7983 res . setHeader ( 'Accept-Ranges' , 'bytes' )
8084 res . setHeader ( 'Content-Length' , blob . bodyLength . toString ( ) )
8185 res . setHeader ( 'Content-Type' , blob . contentType ?? '' )
8286 res . setHeader ( 'Content-Security-Policy' , "default-src 'none';" )
87+ res . setHeader ( 'X-Content-Type-Options' , 'nosniff' )
8388 res . setHeader (
8489 'Content-Disposition' ,
85- filename !== undefined ? `attachment ; filename*=UTF-8''${ encodeURIComponent ( filename ) } ` : 'attachment'
90+ filename !== undefined ? `${ disposition } ; filename*=UTF-8''${ encodeURIComponent ( filename ) } ` : disposition
8691 )
8792 res . setHeader ( 'Cache-Control' , blob . cacheControl ?? cacheControl )
8893 res . setHeader ( 'Last-Modified' , new Date ( blob . lastModified ) . toUTCString ( ) )
@@ -131,13 +136,16 @@ export async function handleBlobHead (
131136 return
132137 }
133138
139+ const disposition = safeInlineTypes . includes ( head . contentType ) ? 'inline' : 'attachment'
140+
134141 res . setHeader ( 'Accept-Ranges' , 'bytes' )
135142 res . setHeader ( 'Content-Length' , head . size . toString ( ) )
136143 res . setHeader ( 'Content-Type' , head . contentType ?? '' )
137144 res . setHeader ( 'Content-Security-Policy' , "default-src 'none';" )
145+ res . setHeader ( 'X-Content-Type-Options' , 'nosniff' )
138146 res . setHeader (
139147 'Content-Disposition' ,
140- filename !== undefined ? `attachment ; filename*=UTF-8''${ encodeURIComponent ( filename ) } ` : 'attachment'
148+ filename !== undefined ? `${ disposition } ; filename*=UTF-8''${ encodeURIComponent ( filename ) } ` : disposition
141149 )
142150 res . setHeader ( 'Cache-Control' , head . cacheControl ?? cacheControl )
143151 res . setHeader ( 'Last-Modified' , new Date ( head . lastModified ) . toUTCString ( ) )
0 commit comments