OpenAPI-Modern
view release on metacpan or search on metacpan
t/lib/Helper.pm view on Meta::CPAN
# 'mojo': classes of type Mojo::URL, Mojo::Headers, Mojo::Message::Request, Mojo::Message::Response
# 'lwp': classes of type URI, HTTP::Headers, HTTP::Request, HTTP::Response
# 'plack': classes of type Plack::Request, Plack::Response
# 'catalyst': classes of type Catalyst::Request, Catalyst::Response
# 'dancer2': classes of type Dancer2::Core::Request, Dancer2::Core::Response
our @TYPES = $ENV{TYPE} ? split(/,/, $ENV{TYPE}) : qw(mojo lwp plack catalyst dancer2);
our $TYPE = $ENV{TYPE} ? (split(/,/, $ENV{TYPE}))[0] : 'mojo'; # safe default
# Note: if you want your query parameters or uri fragment to be normalized, set them afterwards
sub request ($method, $uri_string, $headers = [], $body_content = undef) {
die '$TYPE is not set at ', join(' line ', (caller)[1,2]), ".\n" if not defined $TYPE;
die 'Wide character in body content at ', join(' line ', (caller)[1,2]), ".\n"
if length $body_content and $body_content =~ /[^\x00-\xff]/;
my $req;
if ($TYPE eq 'lwp' or $TYPE eq 'plack' or $TYPE eq 'catalyst' or $TYPE eq 'dancer2') {
test_needs('HTTP::Request', 'URI');
my $uri = URI->new($uri_string);
my $host = $uri->$_call_if_can('host');
$req = HTTP::Request->new($method => $uri, [], $body_content);
$req->headers->push_header(@$_) foreach pairs @$headers, $host ? (Host => $host) : ();
t/lib/Helper.pm view on Meta::CPAN
}
elsif ($TYPE eq 'mojo') {
$req = Mojo::Message::Request->new(method => $method, url => Mojo::URL->new($uri_string));
$req->headers->add(@$_) foreach pairs @$headers;
$req->body($body_content) if defined $body_content;
# add missing Content-Length, etc
$req->fix_headers;
}
else {
die '$TYPE '.$TYPE.' not supported at ', join(' line ', (caller)[1,2]), ".\n";
}
return $req;
}
sub response ($code, $headers = [], $body_content = undef) {
die '$TYPE is not set at ', join(' line ', (caller)[1,2]), ".\n" if not defined $TYPE;
die 'Wide character in body content at ', join(' line ', (caller)[1,2]), ".\n"
if length $body_content and $body_content =~ /[^\x00-\xff]/;
my $res;
if ($TYPE eq 'lwp') {
test_needs('HTTP::Response', 'HTTP::Status');
$res = HTTP::Response->new($code, HTTP::Status::status_message($code), $headers, $body_content);
$res->protocol('HTTP/1.1'); # not added by HTTP::Response constructor
$res->headers->header('Content-Length' => length($body_content)//0)
if not defined $res->headers->header('Content-Length')
t/lib/Helper.pm view on Meta::CPAN
$res = Dancer2::Core::Response->new(
status => $code,
headers => $headers,
defined $body_content ? (content => $body_content) : (),
);
$res->headers->header('Content-Length' => length $body_content)
if defined $body_content and not defined $res->headers->header('Content-Length')
and not defined $res->headers->header('Transfer-Encoding');
}
else {
die '$TYPE '.$TYPE.' not supported at ', join(' line ', (caller)[1,2]), ".\n";
}
return $res;
}
sub uri ($uri_string, @path_parts) {
die '$TYPE is not set at ', join(' line ', (caller)[1,2]), ".\n" if not defined $TYPE;
my $uri;
if ($TYPE eq 'lwp' or $TYPE eq 'plack' or $TYPE eq 'catalyst') {
test_needs('URI');
$uri = URI->new($uri_string);
$uri->path_segments(@path_parts) if @path_parts;
}
elsif ($TYPE eq 'mojo') {
$uri = Mojo::URL->new($uri_string);
$uri->path->parts(\@path_parts) if @path_parts;
}
else {
die '$TYPE '.$TYPE.' not supported at ', join(' line ', (caller)[1,2]), ".\n";
}
return $uri;
}
# sets query parameters on the request
sub query_params ($request, $pairs) {
die '$TYPE is not set at ', join(' line ', (caller)[1,2]), ".\n" if not defined $TYPE;
my $uri;
if ($TYPE eq 'lwp') {
$request->uri->query_form($pairs);
}
elsif ($TYPE eq 'mojo') {
$request->url->query->pairs($pairs);
}
elsif ($TYPE eq 'plack' or $TYPE eq 'catalyst' or $TYPE eq 'dancer2') {
# this is the encoded query string portion of the URI
$request->env->{QUERY_STRING} = Mojo::Parameters->new->pairs($pairs)->to_string;
$request->env->{REQUEST_URI} .= '?' . $request->env->{QUERY_STRING};
# $request->_clear_parameters if $TYPE eq 'catalyst'; # might need this later
}
else {
die '$TYPE '.$TYPE.' not supported at ', join(' line ', (caller)[1,2]), ".\n";
}
return $uri;
}
sub remove_header ($message, $header_name) {
die '$TYPE is not set at ', join(' line ', (caller)[1,2]), ".\n" if not defined $TYPE;
if ($TYPE eq 'lwp') {
$message->headers->remove_header($header_name);
}
elsif ($TYPE eq 'mojo') {
$message->headers->remove($header_name);
}
elsif ($TYPE eq 'plack' or $TYPE eq 'catalyst' or $TYPE eq 'dancer2') {
$message->headers->remove_header($header_name);
delete $message->env->{uc $header_name =~ s/-/_/r} if $message->can('env');
}
else {
die '$TYPE '.$TYPE.' not supported at ', join(' line ', (caller)[1,2]), ".\n";
}
}
# prints the method and URI of the request, or the response code and message of the response,
# or the method and URI of the two-element hash
sub to_str (@args) {
if (@args > 1) {
my %hash = @args;
return $hash{method}.' '.$hash{uri};
}
t/lib/Helper.pm view on Meta::CPAN
if ($message->isa('Mojo::Message::Response')) {
return $message->code.' '.($message->message//$message->default_message);
}
elsif ($message->isa('HTTP::Response')) {
return $message->code.' '.$message->message;
}
elsif ($message->isa('Plack::Response') or $message->isa('Catalyst::Response')) {
return $message->status.' '.HTTP::Status::status_message($message->status);
}
die 'unrecognized type ', ref $message, ' at ', join(' line ', (caller)[1,2]), ".\n";
}
# create a Result object out of the document errors; suitable for stringifying
# as the OpenAPI::Modern constructor might do.
sub document_result ($document) {
JSON::Schema::Modern::Result->new(
valid => !$document->has_errors,
errors => [ $document->errors ],
);
}
( run in 0.705 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )