@@ -270,16 +270,17 @@ fn writeSplatHeaderLimitFinish(
270270 remaining -= copy_len ;
271271 if (remaining == 0 ) break :v ;
272272 }
273- for (data [0 .. data .len - 1 ]) | buf | if (buf .len != 0 ) {
274- const copy_len = @min (header .len , remaining );
275- vecs [i ] = buf ;
273+ for (data [0 .. data .len - 1 ]) | buf | {
274+ if (buf .len == 0 ) continue ;
275+ const copy_len = @min (buf .len , remaining );
276+ vecs [i ] = buf [0.. copy_len ];
276277 i += 1 ;
277278 remaining -= copy_len ;
278279 if (remaining == 0 ) break :v ;
279280 if (vecs .len - i == 0 ) break :v ;
280- };
281+ }
281282 const pattern = data [data .len - 1 ];
282- if (splat == 1 ) {
283+ if (splat == 1 or remaining < pattern . len ) {
283284 vecs [i ] = pattern [0.. @min (remaining , pattern .len )];
284285 i += 1 ;
285286 break :v ;
@@ -915,7 +916,16 @@ pub fn sendFileHeader(
915916 if (new_end <= w .buffer .len ) {
916917 @memcpy (w .buffer [w .end .. ][0.. header .len ], header );
917918 w .end = new_end ;
918- return header .len + try w .vtable .sendFile (w , file_reader , limit );
919+ const file_bytes = w .vtable .sendFile (w , file_reader , limit ) catch | err | switch (err ) {
920+ error .ReadFailed , error .WriteFailed = > | e | return e ,
921+ error .EndOfStream , error .Unimplemented = > | e | {
922+ // These errors are non-fatal, so if we wrote any header bytes, we will report that
923+ // and suppress this error. Only if there was no header may we return the error.
924+ if (header .len != 0 ) return header .len ;
925+ return e ;
926+ },
927+ };
928+ return header .len + file_bytes ;
919929 }
920930 const buffered_contents = limit .slice (file_reader .interface .buffered ());
921931 const n = try w .vtable .drain (w , &.{ header , buffered_contents }, 1 );
0 commit comments