package
Net::ACME::HTTP::Response;
use
strict;
use
warnings;
use
Call::Context ();
use
JSON ();
use
Net::ACME::X ();
sub
die_because_unexpected {
my
(
$self
) =
@_
;
die
Net::ACME::X::create(
'UnexpectedResponse'
,
{
uri
=>
$self
->url(),
status
=>
$self
->status(),
reason
=>
$self
->reason(),
headers
=>
$self
->headers(),
},
);
}
#Useful for everything but certificate issuance, apparently?
sub
content_struct {
my
(
$self
) =
@_
;
return
JSON->new()->allow_nonref()->decode(
$self
->content() );
}
#A “poor man’s Link header parser” that only knows how to handle
#these values as described in the ACME protocol spec:
#a single “rel” parameter, and no extra whitespace.
#
#This returns key/value pairs. They should probably go into a hash,
#but I don’t see anything in the spec that says the same “rel”
#parameter can’t occur twice.
#
#If we need something more robust down the line,
#HTTP::Link::Parser::parse_single_link() may do the trick.
sub
links {
my
(
$self
) =
@_
;
Call::Context::must_be_list();
my
$links_ar
=
$self
->header(
'link'
);
if
( !
ref
$links_ar
) {
$links_ar
= [
$links_ar
|| () ];
}
my
@resp
;
for
my
$l
(
@$links_ar
) {
$l
=~ m/\A<([^>]+)>;rel=
"([^"
]+)"\z/ or
do
{
warn
"Unrecognized link: “$l”"
;
next
;
};
push
@resp
, $2, $1;
}
return
@resp
;
}
1;