]> git.proxmox.com Git - pve-http-server.git/blob - src/PVE/APIServer/Formatter.pm
http: support Content-Encoding=deflate
[pve-http-server.git] / src / PVE / APIServer / Formatter.pm
1 package PVE::APIServer::Formatter;
2
3 use strict;
4 use warnings;
5
6 use URI::Escape;
7
8 # generic formatter support
9 # PVE::APIServer::Formatter::* classes should register themselves here
10
11 my $formatter_hash = {};
12 my $page_formatter_hash = {};
13
14 sub register_formatter {
15 my ($format, $code) = @_;
16
17 die "formatter '$format' already defined"
18 if defined($formatter_hash->{$format});
19
20 $formatter_hash->{$format} = $code;
21 }
22
23 sub register_page_formatter {
24 my (%config) = @_;
25
26 my $format = $config{format} ||
27 die "missing format";
28
29 my $path = $config{path} ||
30 die "missing path";
31
32 my $method = $config{method} ||
33 die "missing method";
34
35 my $code = $config{code} ||
36 die "missing formatter code";
37
38 die "duplicate page formatter for '$method: $path'"
39 if defined($page_formatter_hash->{$format}->{$method}->{$path});
40
41 $page_formatter_hash->{$format}->{$method}->{$path} = $code;
42 }
43
44 sub get_formatter {
45 my ($format, $method, $path) = @_;
46
47 return undef if !defined($format);
48
49 if (defined($method) && defined($path)) {
50 my $code = $page_formatter_hash->{$format}->{$method}->{$path};
51 return $code if defined($code);
52 }
53
54 return $formatter_hash->{$format};
55 }
56
57 my $login_formatter_hash = {};
58
59 sub register_login_formatter {
60 my ($format, $code) = @_;
61
62 die "login formatter '$format' already defined"
63 if defined($login_formatter_hash->{$format});
64
65 $login_formatter_hash->{$format} = $code;
66 }
67
68 sub get_login_formatter {
69 my ($format) = @_;
70
71 return undef if !defined($format);
72
73 return $login_formatter_hash->{$format};
74 }
75
76 # some helper functions
77
78 sub extract_auth_value {
79 my ($header, $key) = @_;
80
81 return undef if !$header;
82
83 my $value = ($header =~ /(?:^|\s)\Q$key\E(?:=| )([^;]*)/)[0];
84
85 $value = uri_unescape($value) if $value;
86
87 return $value;
88 }
89
90 sub create_auth_cookie {
91 my ($ticket, $cookie_name) = @_;
92
93 my $encticket = uri_escape($ticket);
94
95 return "${cookie_name}=$encticket; path=/; secure;";
96 }
97
98 sub create_auth_header {
99 my ($value, $key) = @_;
100
101 return undef if !$key;
102
103 my $encoded = uri_escape($value);
104 return "${key} ${encoded}";
105 }
106
107 1;