| ... | ... | @@ -13,8 +13,8 @@ const net = std.net; |
| 13 | 13 | const Uri = std.Uri; |
| 14 | 14 | const Allocator = mem.Allocator; |
| 15 | 15 | const assert = std.debug.assert; |
| 16 | | const Writer = std.io.Writer; |
| 17 | | const Reader = std.io.Reader; |
| 16 | const Writer = std.Io.Writer; |
| 17 | const Reader = std.Io.Reader; |
| 18 | 18 | |
| 19 | 19 | const Client = @This(); |
| 20 | 20 | |
| ... | ... | @@ -704,12 +704,12 @@ pub const Response = struct { |
| 704 | 704 | /// |
| 705 | 705 | /// See also: |
| 706 | 706 | /// * `readerDecompressing` |
| 707 | | pub fn reader(response: *Response, buffer: []u8) *Reader { |
| 707 | pub fn reader(response: *Response, transfer_buffer: []u8) *Reader { |
| 708 | 708 | response.head.invalidateStrings(); |
| 709 | 709 | const req = response.request; |
| 710 | 710 | if (!req.method.responseHasBody()) return .ending; |
| 711 | 711 | const head = &response.head; |
| 712 | | return req.reader.bodyReader(buffer, head.transfer_encoding, head.content_length); |
| 712 | return req.reader.bodyReader(transfer_buffer, head.transfer_encoding, head.content_length); |
| 713 | 713 | } |
| 714 | 714 | |
| 715 | 715 | /// If compressed body has been negotiated this will return decompressed bytes. |
| ... | ... | @@ -723,12 +723,14 @@ pub const Response = struct { |
| 723 | 723 | /// * `reader` |
| 724 | 724 | pub fn readerDecompressing( |
| 725 | 725 | response: *Response, |
| 726 | transfer_buffer: []u8, |
| 726 | 727 | decompressor: *http.Decompressor, |
| 727 | 728 | decompression_buffer: []u8, |
| 728 | 729 | ) *Reader { |
| 729 | 730 | response.head.invalidateStrings(); |
| 730 | 731 | const head = &response.head; |
| 731 | 732 | return response.request.reader.bodyReaderDecompressing( |
| 733 | transfer_buffer, |
| 732 | 734 | head.transfer_encoding, |
| 733 | 735 | head.content_length, |
| 734 | 736 | head.content_encoding, |
| ... | ... | @@ -1322,7 +1324,7 @@ pub const basic_authorization = struct { |
| 1322 | 1324 | const user: Uri.Component = uri.user orelse .empty; |
| 1323 | 1325 | const password: Uri.Component = uri.password orelse .empty; |
| 1324 | 1326 | |
| 1325 | | var dw: std.io.Writer.Discarding = .init(&.{}); |
| 1327 | var dw: Writer.Discarding = .init(&.{}); |
| 1326 | 1328 | user.formatUser(&dw.writer) catch unreachable; // discarding |
| 1327 | 1329 | const user_len = dw.count + dw.writer.end; |
| 1328 | 1330 | |
| ... | ... | @@ -1696,8 +1698,8 @@ pub const FetchOptions = struct { |
| 1696 | 1698 | /// `null` means it will be heap-allocated. |
| 1697 | 1699 | decompress_buffer: ?[]u8 = null, |
| 1698 | 1700 | redirect_behavior: ?Request.RedirectBehavior = null, |
| 1699 | | /// If the server sends a body, it will be stored here. |
| 1700 | | response_storage: ?ResponseStorage = null, |
| 1701 | /// If the server sends a body, it will be written here. |
| 1702 | response_writer: ?*Writer = null, |
| 1701 | 1703 | |
| 1702 | 1704 | location: Location, |
| 1703 | 1705 | method: ?http.Method = null, |
| ... | ... | @@ -1725,7 +1727,7 @@ pub const FetchOptions = struct { |
| 1725 | 1727 | list: *std.ArrayListUnmanaged(u8), |
| 1726 | 1728 | /// If null then only the existing capacity will be used. |
| 1727 | 1729 | allocator: ?Allocator = null, |
| 1728 | | append_limit: std.io.Limit = .unlimited, |
| 1730 | append_limit: std.Io.Limit = .unlimited, |
| 1729 | 1731 | }; |
| 1730 | 1732 | }; |
| 1731 | 1733 | |
| ... | ... | @@ -1778,7 +1780,7 @@ pub fn fetch(client: *Client, options: FetchOptions) FetchError!FetchResult { |
| 1778 | 1780 | |
| 1779 | 1781 | var response = try req.receiveHead(redirect_buffer); |
| 1780 | 1782 | |
| 1781 | | const storage = options.response_storage orelse { |
| 1783 | const response_writer = options.response_writer orelse { |
| 1782 | 1784 | const reader = response.reader(&.{}); |
| 1783 | 1785 | _ = reader.discardRemaining() catch |err| switch (err) { |
| 1784 | 1786 | error.ReadFailed => return response.bodyErr().?, |
| ... | ... | @@ -1794,21 +1796,14 @@ pub fn fetch(client: *Client, options: FetchOptions) FetchError!FetchResult { |
| 1794 | 1796 | }; |
| 1795 | 1797 | defer if (options.decompress_buffer == null) client.allocator.free(decompress_buffer); |
| 1796 | 1798 | |
| 1799 | var transfer_buffer: [64]u8 = undefined; |
| 1797 | 1800 | var decompressor: http.Decompressor = undefined; |
| 1798 | | const reader = response.readerDecompressing(&decompressor, decompress_buffer); |
| 1799 | | const list = storage.list; |
| 1801 | const reader = response.readerDecompressing(&transfer_buffer, &decompressor, decompress_buffer); |
| 1800 | 1802 | |
| 1801 | | if (storage.allocator) |allocator| { |
| 1802 | | reader.appendRemaining(allocator, null, list, storage.append_limit) catch |err| switch (err) { |
| 1803 | | error.ReadFailed => return response.bodyErr().?, |
| 1804 | | else => |e| return e, |
| 1805 | | }; |
| 1806 | | } else { |
| 1807 | | const buf = storage.append_limit.slice(list.unusedCapacitySlice()); |
| 1808 | | list.items.len += reader.readSliceShort(buf) catch |err| switch (err) { |
| 1809 | | error.ReadFailed => return response.bodyErr().?, |
| 1810 | | }; |
| 1811 | | } |
| 1803 | _ = reader.streamRemaining(response_writer) catch |err| switch (err) { |
| 1804 | error.ReadFailed => return response.bodyErr().?, |
| 1805 | else => |e| return e, |
| 1806 | }; |
| 1812 | 1807 | |
| 1813 | 1808 | return .{ .status = response.head.status }; |
| 1814 | 1809 | } |