| ... | @@ -270,16 +270,17 @@ fn writeSplatHeaderLimitFinish( | ... | @@ -270,16 +270,17 @@ fn writeSplatHeaderLimitFinish( |
| 270 | remaining -= copy_len; | 270 | remaining -= copy_len; |
| 271 | if (remaining == 0) break :v; | 271 | if (remaining == 0) break :v; |
| 272 | } | 272 | } |
| 273 | for (data[0 .. data.len - 1]) |buf| if (buf.len != 0) { | 273 | for (data[0 .. data.len - 1]) |buf| { |
| 274 | const copy_len = @min(header.len, remaining); | 274 | if (buf.len == 0) continue; |
| 275 | vecs[i] = buf; | 275 | const copy_len = @min(buf.len, remaining); |
| | 276 | vecs[i] = buf[0..copy_len]; |
| 276 | i += 1; | 277 | i += 1; |
| 277 | remaining -= copy_len; | 278 | remaining -= copy_len; |
| 278 | if (remaining == 0) break :v; | 279 | if (remaining == 0) break :v; |
| 279 | if (vecs.len - i == 0) break :v; | 280 | if (vecs.len - i == 0) break :v; |
| 280 | }; | 281 | } |
| 281 | const pattern = data[data.len - 1]; | 282 | const pattern = data[data.len - 1]; |
| 282 | if (splat == 1) { | 283 | if (splat == 1 or remaining < pattern.len) { |
| 283 | vecs[i] = pattern[0..@min(remaining, pattern.len)]; | 284 | vecs[i] = pattern[0..@min(remaining, pattern.len)]; |
| 284 | i += 1; | 285 | i += 1; |
| 285 | break :v; | 286 | break :v; |
| ... | @@ -915,7 +916,16 @@ pub fn sendFileHeader( | ... | @@ -915,7 +916,16 @@ pub fn sendFileHeader( |
| 915 | if (new_end <= w.buffer.len) { | 916 | if (new_end <= w.buffer.len) { |
| 916 | @memcpy(w.buffer[w.end..][0..header.len], header); | 917 | @memcpy(w.buffer[w.end..][0..header.len], header); |
| 917 | w.end = new_end; | 918 | 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; |
| 919 | } | 929 | } |
| 920 | const buffered_contents = limit.slice(file_reader.interface.buffered()); | 930 | const buffered_contents = limit.slice(file_reader.interface.buffered()); |
| 921 | const n = try w.vtable.drain(w, &.{ header, buffered_contents }, 1); | 931 | const n = try w.vtable.drain(w, &.{ header, buffered_contents }, 1); |