| ... | @@ -519,33 +519,33 @@ pub const Reader = struct { | ... | @@ -519,33 +519,33 @@ pub const Reader = struct { |
| 519 | w: *Writer, | 519 | w: *Writer, |
| 520 | limit: std.Io.Limit, | 520 | limit: std.Io.Limit, |
| 521 | ) std.Io.Reader.StreamError!usize { | 521 | ) std.Io.Reader.StreamError!usize { |
| 522 | const reader: *Reader = @fieldParentPtr("interface", io_r); | 522 | const reader: *Reader = @alignCast(@fieldParentPtr("interface", io_r)); |
| 523 | const remaining_content_length = &reader.state.body_remaining_content_length; | 523 | const remaining_content_length = &reader.state.body_remaining_content_length; |
| 524 | const remaining = remaining_content_length.*; | 524 | const remaining = remaining_content_length.*; |
| 525 | if (remaining == 0) { | 525 | if (remaining == 0) { |
| 526 | reader.state = .ready; | 526 | reader.state = .ready; |
| 527 | return error.EndOfStream; | 527 | return error.EndOfStream; |
| 528 | } | 528 | } |
| 529 | const n = try reader.in.stream(w, limit.min(.limited(remaining))); | 529 | const n = try reader.in.stream(w, limit.min(.limited64(remaining))); |
| 530 | remaining_content_length.* = remaining - n; | 530 | remaining_content_length.* = remaining - n; |
| 531 | return n; | 531 | return n; |
| 532 | } | 532 | } |
| 533 | | 533 | |
| 534 | fn contentLengthDiscard(io_r: *std.Io.Reader, limit: std.Io.Limit) std.Io.Reader.Error!usize { | 534 | fn contentLengthDiscard(io_r: *std.Io.Reader, limit: std.Io.Limit) std.Io.Reader.Error!usize { |
| 535 | const reader: *Reader = @fieldParentPtr("interface", io_r); | 535 | const reader: *Reader = @alignCast(@fieldParentPtr("interface", io_r)); |
| 536 | const remaining_content_length = &reader.state.body_remaining_content_length; | 536 | const remaining_content_length = &reader.state.body_remaining_content_length; |
| 537 | const remaining = remaining_content_length.*; | 537 | const remaining = remaining_content_length.*; |
| 538 | if (remaining == 0) { | 538 | if (remaining == 0) { |
| 539 | reader.state = .ready; | 539 | reader.state = .ready; |
| 540 | return error.EndOfStream; | 540 | return error.EndOfStream; |
| 541 | } | 541 | } |
| 542 | const n = try reader.in.discard(limit.min(.limited(remaining))); | 542 | const n = try reader.in.discard(limit.min(.limited64(remaining))); |
| 543 | remaining_content_length.* = remaining - n; | 543 | remaining_content_length.* = remaining - n; |
| 544 | return n; | 544 | return n; |
| 545 | } | 545 | } |
| 546 | | 546 | |
| 547 | fn chunkedStream(io_r: *std.Io.Reader, w: *Writer, limit: std.Io.Limit) std.Io.Reader.StreamError!usize { | 547 | fn chunkedStream(io_r: *std.Io.Reader, w: *Writer, limit: std.Io.Limit) std.Io.Reader.StreamError!usize { |
| 548 | const reader: *Reader = @fieldParentPtr("interface", io_r); | 548 | const reader: *Reader = @alignCast(@fieldParentPtr("interface", io_r)); |
| 549 | const chunk_len_ptr = switch (reader.state) { | 549 | const chunk_len_ptr = switch (reader.state) { |
| 550 | .ready => return error.EndOfStream, | 550 | .ready => return error.EndOfStream, |
| 551 | .body_remaining_chunk_len => |*x| x, | 551 | .body_remaining_chunk_len => |*x| x, |
| ... | @@ -591,7 +591,7 @@ pub const Reader = struct { | ... | @@ -591,7 +591,7 @@ pub const Reader = struct { |
| 591 | } | 591 | } |
| 592 | } | 592 | } |
| 593 | if (cp.chunk_len == 0) return parseTrailers(reader, 0); | 593 | if (cp.chunk_len == 0) return parseTrailers(reader, 0); |
| 594 | const n = try in.stream(w, limit.min(.limited(cp.chunk_len))); | 594 | const n = try in.stream(w, limit.min(.limited64(cp.chunk_len))); |
| 595 | chunk_len_ptr.* = .init(cp.chunk_len + 2 - n); | 595 | chunk_len_ptr.* = .init(cp.chunk_len + 2 - n); |
| 596 | return n; | 596 | return n; |
| 597 | }, | 597 | }, |
| ... | @@ -607,7 +607,7 @@ pub const Reader = struct { | ... | @@ -607,7 +607,7 @@ pub const Reader = struct { |
| 607 | continue :len .head; | 607 | continue :len .head; |
| 608 | }, | 608 | }, |
| 609 | else => |remaining_chunk_len| { | 609 | else => |remaining_chunk_len| { |
| 610 | const n = try in.stream(w, limit.min(.limited(@intFromEnum(remaining_chunk_len) - 2))); | 610 | const n = try in.stream(w, limit.min(.limited64(@intFromEnum(remaining_chunk_len) - 2))); |
| 611 | chunk_len_ptr.* = .init(@intFromEnum(remaining_chunk_len) - n); | 611 | chunk_len_ptr.* = .init(@intFromEnum(remaining_chunk_len) - n); |
| 612 | return n; | 612 | return n; |
| 613 | }, | 613 | }, |
| ... | @@ -615,7 +615,7 @@ pub const Reader = struct { | ... | @@ -615,7 +615,7 @@ pub const Reader = struct { |
| 615 | } | 615 | } |
| 616 | | 616 | |
| 617 | fn chunkedDiscard(io_r: *std.Io.Reader, limit: std.Io.Limit) std.Io.Reader.Error!usize { | 617 | fn chunkedDiscard(io_r: *std.Io.Reader, limit: std.Io.Limit) std.Io.Reader.Error!usize { |
| 618 | const reader: *Reader = @fieldParentPtr("interface", io_r); | 618 | const reader: *Reader = @alignCast(@fieldParentPtr("interface", io_r)); |
| 619 | const chunk_len_ptr = switch (reader.state) { | 619 | const chunk_len_ptr = switch (reader.state) { |
| 620 | .ready => return error.EndOfStream, | 620 | .ready => return error.EndOfStream, |
| 621 | .body_remaining_chunk_len => |*x| x, | 621 | .body_remaining_chunk_len => |*x| x, |
| ... | @@ -659,7 +659,7 @@ pub const Reader = struct { | ... | @@ -659,7 +659,7 @@ pub const Reader = struct { |
| 659 | } | 659 | } |
| 660 | } | 660 | } |
| 661 | if (cp.chunk_len == 0) return parseTrailers(reader, 0); | 661 | if (cp.chunk_len == 0) return parseTrailers(reader, 0); |
| 662 | const n = try in.discard(limit.min(.limited(cp.chunk_len))); | 662 | const n = try in.discard(limit.min(.limited64(cp.chunk_len))); |
| 663 | chunk_len_ptr.* = .init(cp.chunk_len + 2 - n); | 663 | chunk_len_ptr.* = .init(cp.chunk_len + 2 - n); |
| 664 | return n; | 664 | return n; |
| 665 | }, | 665 | }, |
| ... | @@ -675,7 +675,7 @@ pub const Reader = struct { | ... | @@ -675,7 +675,7 @@ pub const Reader = struct { |
| 675 | continue :len .head; | 675 | continue :len .head; |
| 676 | }, | 676 | }, |
| 677 | else => |remaining_chunk_len| { | 677 | else => |remaining_chunk_len| { |
| 678 | const n = try in.discard(limit.min(.limited(remaining_chunk_len.int() - 2))); | 678 | const n = try in.discard(limit.min(.limited64(remaining_chunk_len.int() - 2))); |
| 679 | chunk_len_ptr.* = .init(remaining_chunk_len.int() - n); | 679 | chunk_len_ptr.* = .init(remaining_chunk_len.int() - n); |
| 680 | return n; | 680 | return n; |
| 681 | }, | 681 | }, |
| ... | @@ -758,7 +758,7 @@ pub const BodyWriter = struct { | ... | @@ -758,7 +758,7 @@ pub const BodyWriter = struct { |
| 758 | | 758 | |
| 759 | /// How many zeroes to reserve for hex-encoded chunk length. | 759 | /// How many zeroes to reserve for hex-encoded chunk length. |
| 760 | const chunk_len_digits = 8; | 760 | const chunk_len_digits = 8; |
| 761 | const max_chunk_len: usize = std.math.pow(usize, 16, chunk_len_digits) - 1; | 761 | const max_chunk_len: usize = std.math.pow(u64, 16, chunk_len_digits) - 1; |
| 762 | const chunk_header_template = ("0" ** chunk_len_digits) ++ "\r\n"; | 762 | const chunk_header_template = ("0" ** chunk_len_digits) ++ "\r\n"; |
| 763 | | 763 | |
| 764 | comptime { | 764 | comptime { |
| ... | @@ -918,7 +918,7 @@ pub const BodyWriter = struct { | ... | @@ -918,7 +918,7 @@ pub const BodyWriter = struct { |
| 918 | } | 918 | } |
| 919 | | 919 | |
| 920 | pub fn contentLengthDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { | 920 | pub fn contentLengthDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { |
| 921 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 921 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 922 | assert(!bw.isEliding()); | 922 | assert(!bw.isEliding()); |
| 923 | const out = bw.http_protocol_output; | 923 | const out = bw.http_protocol_output; |
| 924 | const n = try out.writeSplatHeader(w.buffered(), data, splat); | 924 | const n = try out.writeSplatHeader(w.buffered(), data, splat); |
| ... | @@ -927,7 +927,7 @@ pub const BodyWriter = struct { | ... | @@ -927,7 +927,7 @@ pub const BodyWriter = struct { |
| 927 | } | 927 | } |
| 928 | | 928 | |
| 929 | pub fn noneDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { | 929 | pub fn noneDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { |
| 930 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 930 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 931 | assert(!bw.isEliding()); | 931 | assert(!bw.isEliding()); |
| 932 | const out = bw.http_protocol_output; | 932 | const out = bw.http_protocol_output; |
| 933 | const n = try out.writeSplatHeader(w.buffered(), data, splat); | 933 | const n = try out.writeSplatHeader(w.buffered(), data, splat); |
| ... | @@ -935,7 +935,7 @@ pub const BodyWriter = struct { | ... | @@ -935,7 +935,7 @@ pub const BodyWriter = struct { |
| 935 | } | 935 | } |
| 936 | | 936 | |
| 937 | pub fn elidingDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { | 937 | pub fn elidingDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { |
| 938 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 938 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 939 | const slice = data[0 .. data.len - 1]; | 939 | const slice = data[0 .. data.len - 1]; |
| 940 | const pattern = data[slice.len]; | 940 | const pattern = data[slice.len]; |
| 941 | var written: usize = pattern.len * splat; | 941 | var written: usize = pattern.len * splat; |
| ... | @@ -949,7 +949,7 @@ pub const BodyWriter = struct { | ... | @@ -949,7 +949,7 @@ pub const BodyWriter = struct { |
| 949 | } | 949 | } |
| 950 | | 950 | |
| 951 | pub fn elidingSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { | 951 | pub fn elidingSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { |
| 952 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 952 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 953 | if (File.Handle == void) return error.Unimplemented; | 953 | if (File.Handle == void) return error.Unimplemented; |
| 954 | if (builtin.zig_backend == .stage2_aarch64) return error.Unimplemented; | 954 | if (builtin.zig_backend == .stage2_aarch64) return error.Unimplemented; |
| 955 | switch (bw.state) { | 955 | switch (bw.state) { |
| ... | @@ -976,7 +976,7 @@ pub const BodyWriter = struct { | ... | @@ -976,7 +976,7 @@ pub const BodyWriter = struct { |
| 976 | | 976 | |
| 977 | /// Returns `null` if size cannot be computed without making any syscalls. | 977 | /// Returns `null` if size cannot be computed without making any syscalls. |
| 978 | pub fn noneSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { | 978 | pub fn noneSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { |
| 979 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 979 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 980 | assert(!bw.isEliding()); | 980 | assert(!bw.isEliding()); |
| 981 | const out = bw.http_protocol_output; | 981 | const out = bw.http_protocol_output; |
| 982 | const n = try out.sendFileHeader(w.buffered(), file_reader, limit); | 982 | const n = try out.sendFileHeader(w.buffered(), file_reader, limit); |
| ... | @@ -984,7 +984,7 @@ pub const BodyWriter = struct { | ... | @@ -984,7 +984,7 @@ pub const BodyWriter = struct { |
| 984 | } | 984 | } |
| 985 | | 985 | |
| 986 | pub fn contentLengthSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { | 986 | pub fn contentLengthSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { |
| 987 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 987 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 988 | assert(!bw.isEliding()); | 988 | assert(!bw.isEliding()); |
| 989 | const out = bw.http_protocol_output; | 989 | const out = bw.http_protocol_output; |
| 990 | const n = try out.sendFileHeader(w.buffered(), file_reader, limit); | 990 | const n = try out.sendFileHeader(w.buffered(), file_reader, limit); |
| ... | @@ -993,7 +993,7 @@ pub const BodyWriter = struct { | ... | @@ -993,7 +993,7 @@ pub const BodyWriter = struct { |
| 993 | } | 993 | } |
| 994 | | 994 | |
| 995 | pub fn chunkedSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { | 995 | pub fn chunkedSendFile(w: *Writer, file_reader: *File.Reader, limit: std.Io.Limit) Writer.FileError!usize { |
| 996 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 996 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 997 | assert(!bw.isEliding()); | 997 | assert(!bw.isEliding()); |
| 998 | const data_len = Writer.countSendFileLowerBound(w.end, file_reader, limit) orelse { | 998 | const data_len = Writer.countSendFileLowerBound(w.end, file_reader, limit) orelse { |
| 999 | // If the file size is unknown, we cannot lower to a `sendFile` since we would | 999 | // If the file size is unknown, we cannot lower to a `sendFile` since we would |
| ... | @@ -1041,7 +1041,7 @@ pub const BodyWriter = struct { | ... | @@ -1041,7 +1041,7 @@ pub const BodyWriter = struct { |
| 1041 | } | 1041 | } |
| 1042 | | 1042 | |
| 1043 | pub fn chunkedDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { | 1043 | pub fn chunkedDrain(w: *Writer, data: []const []const u8, splat: usize) Error!usize { |
| 1044 | const bw: *BodyWriter = @fieldParentPtr("writer", w); | 1044 | const bw: *BodyWriter = @alignCast(@fieldParentPtr("writer", w)); |
| 1045 | assert(!bw.isEliding()); | 1045 | assert(!bw.isEliding()); |
| 1046 | const out = bw.http_protocol_output; | 1046 | const out = bw.http_protocol_output; |
| 1047 | const data_len = w.end + Writer.countSplat(data, splat); | 1047 | const data_len = w.end + Writer.countSplat(data, splat); |