|
17 | 17 | // along with this program. If not, see <https://www.gnu.org/licenses/>. |
18 | 18 |
|
19 | 19 | const std = @import("std"); |
20 | | -const URL = @import("../../url.zig").URL; |
21 | | -const Page = @import("../page.zig").Page; |
22 | | -const Env = @import("../env.zig").Env; |
| 20 | +const log = @import("../../log.zig"); |
23 | 21 |
|
24 | 22 | const v8 = @import("v8"); |
25 | 23 |
|
26 | | -const Http = @import("../../http/Http.zig"); |
27 | 24 | const HttpClient = @import("../../http/Client.zig"); |
| 25 | +const Http = @import("../../http/Http.zig"); |
| 26 | +const URL = @import("../../url.zig").URL; |
| 27 | +const Env = @import("../env.zig").Env; |
28 | 28 | const Mime = @import("../mime.zig").Mime; |
| 29 | +const Page = @import("../page.zig").Page; |
29 | 30 |
|
30 | 31 | // https://developer.mozilla.org/en-US/docs/Web/API/Response |
31 | 32 | const Response = @This(); |
@@ -81,6 +82,26 @@ pub fn _text(self: *const Response, page: *Page) !Env.Promise { |
81 | 82 | return resolver.promise(); |
82 | 83 | } |
83 | 84 |
|
| 85 | +pub fn _json(self: *const Response, page: *Page) !Env.Promise { |
| 86 | + const resolver = Env.PromiseResolver{ |
| 87 | + .js_context = page.main_context, |
| 88 | + .resolver = v8.PromiseResolver.init(page.main_context.v8_context), |
| 89 | + }; |
| 90 | + |
| 91 | + const p = std.json.parseFromSliceLeaky( |
| 92 | + std.json.Value, |
| 93 | + page.arena, |
| 94 | + self.body, |
| 95 | + .{}, |
| 96 | + ) catch |e| { |
| 97 | + log.warn(.browser, "invalid json", .{ .err = e, .source = "fetch" }); |
| 98 | + return error.SyntaxError; |
| 99 | + }; |
| 100 | + |
| 101 | + try resolver.resolve(p); |
| 102 | + return resolver.promise(); |
| 103 | +} |
| 104 | + |
84 | 105 | const testing = @import("../../testing.zig"); |
85 | 106 | test "fetch: response" { |
86 | 107 | var runner = try testing.jsRunner(testing.tracking_allocator, .{ .url = "https://lightpanda.io" }); |
|
0 commit comments