mirror of
https://github.com/lightpanda-io/browser.git
synced 2025-10-29 07:03:29 +00:00
Merge pull request #953 from lightpanda-io/is_navigation_and_arena
Use Transfer.arena in a few more places, correctly set is_navigation …
This commit is contained in:
@@ -244,21 +244,25 @@ fn continueRequest(cmd: anytype) !void {
|
||||
.new_url = params.url,
|
||||
});
|
||||
|
||||
const arena = transfer.arena.allocator();
|
||||
// Update the request with the new parameters
|
||||
if (params.url) |url| {
|
||||
try transfer.updateURL(try page.arena.dupeZ(u8, url));
|
||||
try transfer.updateURL(try arena.dupeZ(u8, url));
|
||||
}
|
||||
if (params.method) |method| {
|
||||
transfer.req.method = std.meta.stringToEnum(Http.Method, method) orelse return error.InvalidParams;
|
||||
}
|
||||
|
||||
if (params.headers) |headers| {
|
||||
// Not obvious, but cmd.arena is safe here, since the headers will get
|
||||
// duped by libcurl. transfer.arena is more obvious/safe, but cmd.arena
|
||||
// is more efficient (it's re-used)
|
||||
try transfer.replaceRequestHeaders(cmd.arena, headers);
|
||||
}
|
||||
|
||||
if (params.postData) |b| {
|
||||
const decoder = std.base64.standard.Decoder;
|
||||
const body = try bc.arena.alloc(u8, try decoder.calcSizeForSlice(b));
|
||||
const body = try arena.alloc(u8, try decoder.calcSizeForSlice(b));
|
||||
try decoder.decode(body, b);
|
||||
transfer.req.body = body;
|
||||
}
|
||||
@@ -304,7 +308,7 @@ fn fulfillRequest(cmd: anytype) !void {
|
||||
var body: ?[]const u8 = null;
|
||||
if (params.body) |b| {
|
||||
const decoder = std.base64.standard.Decoder;
|
||||
const buf = try cmd.arena.alloc(u8, try decoder.calcSizeForSlice(b));
|
||||
const buf = try transfer.arena.allocator().alloc(u8, try decoder.calcSizeForSlice(b));
|
||||
try decoder.decode(buf, b);
|
||||
body = buf;
|
||||
}
|
||||
|
||||
@@ -620,13 +620,16 @@ pub const Transfer = struct {
|
||||
// redirectionCookies manages cookies during redirections handled by Curl.
|
||||
// It sets the cookies from the current response to the cookie jar.
|
||||
// It also immediately sets cookies for the following request.
|
||||
fn redirectionCookies(arena: Allocator, easy: *c.CURL, cookie_jar: *CookieJar, origin: *const std.Uri) !void {
|
||||
fn redirectionCookies(transfer: *Transfer, easy: *c.CURL) !void {
|
||||
const req = &transfer.req;
|
||||
const arena = transfer.arena.allocator();
|
||||
|
||||
// retrieve cookies from the redirect's response.
|
||||
var i: usize = 0;
|
||||
while (true) {
|
||||
const ct = getResponseHeader(easy, "set-cookie", i);
|
||||
if (ct == null) break;
|
||||
try cookie_jar.populateFromResponse(origin, ct.?.value);
|
||||
try req.cookie_jar.populateFromResponse(&transfer.uri, ct.?.value);
|
||||
i += 1;
|
||||
if (i >= ct.?.amount) break;
|
||||
}
|
||||
@@ -644,10 +647,11 @@ pub const Transfer = struct {
|
||||
const uri = try std.Uri.parse(url);
|
||||
|
||||
var cookies: std.ArrayListUnmanaged(u8) = .{};
|
||||
try cookie_jar.forRequest(&uri, cookies.writer(arena), .{
|
||||
try req.cookie_jar.forRequest(&uri, cookies.writer(arena), .{
|
||||
.is_http = true,
|
||||
.is_navigation = true,
|
||||
.origin_uri = origin,
|
||||
.origin_uri = &transfer.uri,
|
||||
// used to enforce samesite cookie rules
|
||||
.is_navigation = req.resource_type == .document,
|
||||
});
|
||||
try cookies.append(arena, 0); //null terminate
|
||||
try errorCheck(c.curl_easy_setopt(easy, c.CURLOPT_COOKIE, @as([*c]const u8, @ptrCast(cookies.items.ptr))));
|
||||
@@ -670,12 +674,7 @@ pub const Transfer = struct {
|
||||
if (transfer.response_header == null) {
|
||||
if (transfer._redirecting and buf_len == 2) {
|
||||
// parse and set cookies for the redirection.
|
||||
redirectionCookies(
|
||||
transfer.arena.allocator(),
|
||||
easy,
|
||||
transfer.req.cookie_jar,
|
||||
&transfer.uri,
|
||||
) catch |err| {
|
||||
redirectionCookies(transfer, easy) catch |err| {
|
||||
log.debug(.http, "redirection cookies", .{ .err = err });
|
||||
return 0;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user