# Copyright (C) 2017 The Qt Company Ltd. # SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0 package QtQA::WWW::Util; use strict; use warnings; use AnyEvent::HTTP; use Carp; use Coro; use JSON; use URI; use base 'Exporter'; our @EXPORT_OK = qw( blocking_http_request fetch_json_data fetch_to_scalar www_form_urlencoded ); our %EXPORT_TAGS = (all => \@EXPORT_OK); sub www_form_urlencoded { my (%args) = @_; my $uri = URI->new( ); $uri->query_form( %args ); return $uri->query( ); } sub blocking_http_request { my ($method, $url, @args) = @_; http_request( $method, $url, @args, Coro::rouse_cb() ); return Coro::rouse_wait(); } sub fetch_to_scalar { my ($url) = @_; my ($data, $headers) = blocking_http_request( GET => $url ); if ($headers->{ Status } != 200) { croak "fetch $url: $headers->{ Status } $headers->{ Reason }"; } return $data; } sub fetch_json_data { my ($url) = @_; my $json = fetch_to_scalar( $url ); return decode_json( $json ); } =head1 NAME QtQA::WWW::Util - utility methods for dealing with web services =head1 METHODS Methods are not exported by default; they may be exported individually, or all together by using the ':all' tag. =over =item www_form_urlencoded( key1 => $val1, key2 => $val2 ... ) Given a hash, returns a string representation in application/x-www-form-urlencoded format. Useful for constructing the body of an HTTP POST normally filled by a web form. my $postdata = www_form_urlencoded(id => 1234, request => 'do this; do that' ); # $postdata eq 'request=do+this%3B+do+that&id=1234' =item blocking_http_request( $method => $url, key => value... ) Like http_request from L, but blocks until the request is complete and returns the result rather than invoking a callback. Blocking is achieved by the usage of L, so use this only if your application is Coro-aware. =item fetch_to_scalar( $url ) Do an HTTP GET on the given URL and return the fetched content. Croaks on error. Note: uses L. =item fetch_json_data( $url ) Do an HTTP GET on the given URL, parse the fetched content as JSON and return the parsed object. Croaks on error. Note: uses L. =back =cut 1;