NAME
Protocol::HTTP::Request - HTTP request class
SYNOPSIS
# construction of new request
my
$req
= Protocol::HTTP::Request->new({
method
=> METHOD_POST,
http_version
=> 10,
headers
=> {
MyHeader
=>
"my value"
},
cookies
=> {
Lorem
=>
'ipsum'
},
});
$req
->method();
# => METHOD_POST
$req
->uri();
# => isa 'URI::XS'
$req
->uri(
'/something'
);
$req
->uri->to_string;
# => '/something'
# we accept GZIP-compressed replies
$req
->allow_compression(Protocol::HTTP::Compression::gzip);
$req
->cookie(
'Location'
,
'Earth'
);
$req
->cookie(
'Location'
);
# => 'Earth'
$req
->cookies;
# => is_deeply {Location => 'Earth', 'Lorem' => 'ipsum'}
# main serialization method
$req
->to_string;
# like qr/GET.*HTTP/1.0.*MyHeader.*my body/sm
# we are crazy enough to send compressed request
$req
->compress(Protocol::HTTP::Compression::gzip, Protocol::HTTP::Compression::LEVEL_OPTIMAL);
# now $req->to_string would return a little bit different result
# uploading as multipart/form-data
my
$req
= Protocol::HTTP::Request->new({
form
=> [
field1
=>
'value1'
,
field2
=> [
'filename.pdf'
=>
$pdf_content
,
'application/pdf'
]],
});
my
$req
= Protocol::HTTP::Request->new({
form
=> {
enc_type
=> ENCODING_MULTIPART,
fields
=> [
field1
=>
'value1'
,
field2
=>
'value2'
],
},
});
# populate form from URI
my
$req
= Protocol::HTTP::Request->new({
uri
=>
'/path?login=user&pass=secret'
,
form
=> ENCODING_MULTIPART
});
# populate URI from form
my
$req
= Protocol::HTTP::Request->new({
uri
=>
'/path'
,
form
=> {
enc_type
=> ENCODING_MULTIPART,
fields
=> [
login
=>
'user'
,
pass
=>
'secret'
],
},
});
DESCRIPTION
This class represents client HTTP request, which is specialization of Protocol::HTTP::Message. An instance of the class can be constructed either direcly via new
method to send a new request (clients), or via parsing incoming request with Protocol::HTTP::RequestParser (servers).
If it is acceptable to have a server reply with compressed payload, then allow_compression
method should be invoked. It will setup Accept-Encoding
header in a request.
When a new request is ready it can be serialized via to_string
method into byte octets.
METHODS
All methods of Protocol::HTTP::Message also apply.
new([\%params])
Constructs new request from hashref of properties, i.e. method
, uri
, allow_compression
, headers
, body
, http_version
, chunked
, compress
, form
.
See corresponding methods documentation below and in Protocol::HTTP::Message to find out what these parameters support.
allow_compression
should be an array ref if multiple values are passed.
Parameter form
allows to post request data as multipart/form-data
(default) or as application/x-www-form-urlencoded
.
In the simplest form it is just an array of fields and values, i.e.
Protocol::HTTP::Request->new({
form
=> [
key1
=>
'value1'
,
key2
=>
'value2'
],
});
A form field value can be also be specified as array; this might be needed for file posting to specify filename and content type additionally, i.e.
Protocol::HTTP::Request->new({
fields
=> [
photo
=> [
'sample.jpg'
=>
$jpeg_content
,
'image/jpeg'
]],
});
It is possible, however, to explicitly specify the type of encoding.
For example:
Protocol::HTTP::Request->new({
form
=> {
enc_type
=> ENCODING_MULTIPART,
fields
=> [
key1
=>
'value1'
,
key2
=>
'value2'
],
}
});
When it is encoded as multipart/form-data
, the request will use the right method, e.g. if it is set to GET
it will be switched to POST
.
Sometimes it can be handy to use pseudo-URI to populate form (posted as multipart/form-data
) from uri params, or populate URI from form.
# GET /path?login=user&pass=secret
my
$req
= Protocol::HTTP::Request->new({
uri
=>
'/path'
,
method
=> METHOD_GET,
form
=> {
enc_type
=> ENCODING_URL,
fields
=> [
login
=>
'user'
,
pass
=>
'secret'
],
},
});
# POST with multipart/form-data via '/path' URI
my
$req
= Protocol::HTTP::Request->new({
uri
=>
'/path?login=user&pass=secret'
,
form
=> ENCODING_MULTIPART,
});
To let the URI population work form
should be empty, as in the example above.
method_raw([$method])
Get/set HTTP request method, e.g. GET
, POST
etc. in the first line of the request
Possible values:
- METHOD_GET
- METHOD_POST
- METHOD_PUT
- METHOD_DELETE
- METHOD_OPTIONS
- METHOD_HEAD
- METHOD_TRACE
- METHOD_CONNECT
- METHOD_UNSPECIFIED
-
The special value to distinguish the case, when client developer did not specify the desired method
method([$method])
Deduces the used method, i.e. when it is unspecified it will be GET or POST (for multipart/form_data).
The setter-variant works as method_raw setter
uri([$uri])
Set/get uri as URI::XS. $uri
argument can be anything that one-argument constructor of URI::XS supports (for example, string).
cookies([\%cookies])
Set/get all cookies at once as a hashref.
$req
->cookies({
coo1
=>
"val1"
,
coo2
=>
"val2"
, ... });
Please note, this is request cookies, i.e. set by client-side, and they have different API than response cookies.
cookie($name, [$value])
Set/get single cookie.
allow_compression($compression1, [$compression2, ...])
Sets acceptable compression methods in the responce of the request, i.e. Accept-Encoding
header. Order of compression methods might be important.
$request
->allow_compression(Protocol::HTTP::Compression::gzip);
See Protocol::HTTP::Compression for the list of available compressions.
allowed_compression()
Returns the bit mask of desirable compression methods (i.e. specified at Accept-Encoding
header).
if
(
$request
->allowed_compression & Protocol::HTTP::Compression::gzip) {
...;
}
See Protocol::HTTP::Compression for the list of available compressions.
to_string()
Serializes a request into string for sending via network. If the compression was requested (see Protocol::HTTP::Message), then it will be applied here.
method_str()
Returns stringified HTTP request method, e.g. "GET"
, "POST"
etc.
FUNCTIONS
method_str($method)
Returns corresponding string for a constant METHOD_*
, i.e. "GET"
, "POST"
etc.