╭─────────────╮ │scroll to top│ ╰─────────────╯ ╭ web.zig ──────────────────────────────────────────────────────╮ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ╰───────────────────────────────────────────────────────────────╯
╭────╮ ╭ clone ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╮ │http│ ssh │ │ ╰────╯ ╰ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ╯
569 fn getCookieValue(request: *std.http.Server.Request, name: []const u8) ?[]const u8 { 570 var iter = request.iterateHeaders(); 571 while (iter.next()) |header| { 572 if (!std.ascii.eqlIgnoreCase(header.name, "cookie")) continue; 573 var pairs = std.mem.splitScalar(u8, header.value, ';'); 574 while (pairs.next()) |pair| { 575 const trimmed = std.mem.trim(u8, pair, " \t"); 576 const eq = std.mem.indexOfScalar(u8, trimmed, '=') orelse continue; 577 if (std.mem.eql(u8, trimmed[0..eq], name)) { 578 return trimmed[eq + 1 ..]; 579 } 580 } 581 } 582 return null; 583 } 584 585 fn parseFormField(allocator: std.mem.Allocator, body: []const u8, key: []const u8) !?[]u8 { 586 var iter = std.mem.splitScalar(u8, body, '&'); 587 while (iter.next()) |pair| { 588 const eq = std.mem.indexOfScalar(u8, pair, '=') orelse continue; 589 if (std.mem.eql(u8, pair[0..eq], key)) { 590 return try decodeFormValue(allocator, pair[eq + 1 ..]); 591 } 592 } 593 return null; 594 } 595 596 fn decodeFormValue(allocator: std.mem.Allocator, encoded: []const u8) ![]u8 { 597 var out: std.ArrayList(u8) = .empty; 598 errdefer out.deinit(allocator); 599 var i: usize = 0; 600 while (i < encoded.len) : (i += 1) { 601 switch (encoded[i]) { 602 '+' => try out.append(allocator, ' '), 603 '%' => { 604 if (i + 2 >= encoded.len) return error.InvalidPercentEncoding; 605 const hi = std.fmt.charToDigit(encoded[i + 1], 16) catch return error.InvalidPercentEncoding; 606 const lo = std.fmt.charToDigit(encoded[i + 2], 16) catch return error.InvalidPercentEncoding; 607 try out.append(allocator, hi * 16 + lo); 608 i += 2; 609 }, 610 else => try out.append(allocator, encoded[i]), 611 } 612 } 613 return try out.toOwnedSlice(allocator); 614 } 615