╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ web.zig ──────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
535 536 fn getCookieValue(request: *std.http.Server.Request, name: []const u8) ?[]const u8 { 537 var iter = request.iterateHeaders(); 538 while (iter.next()) |header| { 539 if (!std.ascii.eqlIgnoreCase(header.name, "cookie")) continue; 540 var pairs = std.mem.splitScalar(u8, header.value, ';'); 541 while (pairs.next()) |pair| { 542 const trimmed = std.mem.trim(u8, pair, " \t"); 543 const eq = std.mem.indexOfScalar(u8, trimmed, '=') orelse continue; 544 if (std.mem.eql(u8, trimmed[0..eq], name)) { 545 return trimmed[eq + 1 ..]; 546 } 547 } 548 } 549 return null; 550 } 551 552 fn parseFormField(allocator: std.mem.Allocator, body: []const u8, key: []const u8) !?[]u8 { 553 var iter = std.mem.splitScalar(u8, body, '&'); 554 while (iter.next()) |pair| { 555 const eq = std.mem.indexOfScalar(u8, pair, '=') orelse continue; 556 if (std.mem.eql(u8, pair[0..eq], key)) { 557 return try decodeFormValue(allocator, pair[eq + 1 ..]); 558 } 559 } 560 return null; 561 } 562 563 fn decodeFormValue(allocator: std.mem.Allocator, encoded: []const u8) ![]u8 { 564 var out: std.ArrayList(u8) = .empty; 565 errdefer out.deinit(allocator); 566 var i: usize = 0; 567 while (i < encoded.len) : (i += 1) { 568 switch (encoded[i]) { 569 '+' => try out.append(allocator, ' '), 570 '%' => { 571 if (i + 2 >= encoded.len) return error.InvalidPercentEncoding; 572 const hi = std.fmt.charToDigit(encoded[i + 1], 16) catch return error.InvalidPercentEncoding; 573 const lo = std.fmt.charToDigit(encoded[i + 2], 16) catch return error.InvalidPercentEncoding; 574 try out.append(allocator, hi * 16 + lo); 575 i += 2; 576 }, 577 else => try out.append(allocator, encoded[i]), 578 } 579 } 580 return try out.toOwnedSlice(allocator); 581 } 582