NAME

   Net::ICAP::Client - A client implementation of the ICAP (RFC 3507)
   protocol

VERSION

   Version 0.07

SYNOPSIS

       use Net::ICAP::Client;

       my $icap = Net::ICAP::Client->new('icap://icap-proxy.example.com/');
       my $request = HTTP::Request->new( 'POST' => 'https://www.example.com/path' );
       my ( $headers, $body ) = $icap->request( $request );
       if ($headers->isa('HTTP::Request') {
           # forward request to intended destination
       } elsif ($headers->isa('HTTP::Response') {
           # return response to original requestor
       }

DESCRIPTION

   This module provides a client interface to an ICAP (RFC 3507) Server
   <http://tools.ietf.org/html/rfc3507>. ICAP Servers are designed to
   inspect and modify HTTP Request and Responses before the Request is
   passed to backend systems or the Response goes back to the user.

SUBROUTINES/METHODS

new

       my $icap = Net::ICAP::Client->new('icap://icap-proxy.example.com/');
       my $icap = Net::ICAP::Client->new('icaps://icap-proxy.example.com/', SSL_ca_path => '/path/to/ca-bundle.crt', %other_IO_SSL_Socket_options);

   By default, the SSL_verifycn_scheme, SSL_verifycn_name and
   SSL_verify_mode parameters are automatically set for icaps URIs, but
   these parameters may be overridden.

debug

   $icap->debug() accepts an optional debug value and returns the current
   debug value

allow_204

   $icap->allow_204() accepts an optional value to set whether the client
   will send an Allow: 204
   <https://tools.ietf.org/html/rfc3507#section-4.6> and returns the
   current setting

allow_preview

   $icap->allow_preview() accepts an optional value to set whether the
   client will send an Preview
   <https://tools.ietf.org/html/rfc3507#section-4.5> and returns the
   current setting

agent

   $icap->agent() accepts an optional User Agent string and returns the
   current User Agent string

server_allows_204

   $icap->server_allows_204() returns true if the remote ICAP server can
   return a 204 (No modification needed) response. This method will issue
   an OPTIONS call to the remote server unless another OPTIONS call has
   been sent in the last ttl seconds.

is_tag

   $icap->is_tag() returns the value of the remote ICAP server's ISTag
   <https://tools.ietf.org/html/rfc3507#section-4.7> header. This method
   will issue an OPTIONS call to the remote server unless another OPTIONS
   call has been sent in the last ttl seconds.

service

   $icap->service() returns the value of the remote ICAP server's Service
   <https://tools.ietf.org/html/rfc3507#section-4.10.2> header. This
   method will issue an OPTIONS call to the remote server unless another
   OPTIONS call has been sent in the last ttl seconds.

ttl

   $icap->ttl() returns the value of the remote ICAP server's Options-TTL
   <https://tools.ietf.org/html/rfc3507#section-4.10.2> header. This
   method will issue an OPTIONS call to the remote server unless another
   OPTIONS call has been sent in the last ttl seconds.

max_connections

   $icap->max_connections() returns the value of the remote ICAP server's
   Max-Connections <https://tools.ietf.org/html/rfc3507#section-4.10.2>
   header. This method will issue an OPTIONS call to the remote server
   unless another OPTIONS call has been sent in the last ttl seconds.

preview_size

   $icap->preview_size() returns the value of the remote ICAP server's
   Preview <https://tools.ietf.org/html/rfc3507#section-4.10.2> header.
   This method will issue an OPTIONS call to the remote server unless
   another OPTIONS call has been sent in the last ttl seconds.

uri

   $icap->uri() returns the current URI of the remote ICAP server as a URI
   object.

request

       my $icap = Net::ICAP::Client->new('icap://icap-proxy.example.com/');
       my $request_headers = HTTP::Headers->new();
       my $request = HTTP::Request->new( 'POST' => "https://www.example.com/path?name=value", $request_headers, "name2=value2" );
       my ( $request_or_response_headers, $filehandle_containing_possibly_updated_body ) = $icap->request( $request, $filehandle_containing_request_body );

   $icap->request() expects an HTTP::Request object and an optional
   filehandle. It will return an HTTP::Request or an HTTP::Response object
   containing the request or response without the body and a filehandle
   containing the body.

response

       my $icap = Net::ICAP::Client->new('icap://icap-proxy.example.com/');
       my $response = HTTP::Response->new( '200', 'OK' );
       my ( $response_headers, $filehandle_containing_possibly_updated_body ) = $icap->response( $optional_request_or_undef, $response, $filehandle_containing_response_body );

   $icap->response() expects an HTTP::Request object (if available), an
   HTTP::Response object and an optional filehandle. It will return an
   HTTP::Response object containing the response without the response body
   and a filehandle containing the response body.

AUTHOR

   David Dick, <ddick at cpan.org>

DIAGNOSTICS

   Failed to write to icap server at %s

     Failed to write to the remote icap server. Check network status.

   Failed to write to STDERR

     Failed to write to STDERR. Check local machine settings.

   Incorrectly formatted debug line

     A debug call was made without being prefixed with a '>> ' or '<< '.
     This is a bug in Net::ICAP::Client

   Failed to connect to %s on port %s

     The connection to the remote icap server failed. Check
     network/SSL/TLS settings and status

   Failed to read from %s

     Failed to read from the remote icap server. Check network status

   Failed to seek to start of temporary file

     Failed to do a disk operation. Check disk settings for the mount
     point belonging to where temp files are being created

   Failed to seek to start of content handle

     Failed to do a disk operation. Check disk settings for the mount
     point belonging to the file that are passed into the request/response
     method

   ICAP Server returned a %s error

     The remote ICAP server returned an error. The TCP connection to the
     remote ICAP server will be automatically disconnected. Capture the
     network traffic and enter a bug report

   Failed to parse chunking length

     This is a bug in Net::ICAP::Client

   Unable to parse Encapsulated header

     The remote ICAP server did not return an Encapsulated header that
     could be understood by Net::ICAP::Client. Capture the network traffic
     and enter a bug report

   Unable to parse ICAP header

     The remote ICAP server did not return an ICAP header that could be
     understood by Net::ICAP::Client. Capture the network traffic and
     enter a bug report

   Failed to read from content handle

     Failed to do a disk operation. Check disk settings for the mount
     point belonging to the file that are passed into the request/response
     method

CONFIGURATION AND ENVIRONMENT

   Net::ICAP::Client requires no configuration files or environment
   variables.

DEPENDENCIES

   Net::ICAP::Client requires the following non-core modules

     HTTP::Request
     HTTP::Response
     IO::Socket::INET
     IO::Socket::SSL
     URI

INCOMPATIBILITIES

   None reported

BUGS AND LIMITATIONS

   Please report any bugs or feature requests to bug-net-icap-client at
   rt.cpan.org, or through the web interface at
   http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Net-ICAP-Client. I will
   be notified, and then you'll automatically be notified of progress on
   your bug as I make changes.

SUPPORT

   You can find documentation for this module with the perldoc command.

       perldoc Net::ICAP::Client

   You can also look for information at:

     * RT: CPAN's request tracker (report bugs here)

     http://rt.cpan.org/NoAuth/Bugs.html?Dist=Net-ICAP-Client

     * AnnoCPAN: Annotated CPAN documentation

     http://annocpan.org/dist/Net-ICAP-Client

     * CPAN Ratings

     http://cpanratings.perl.org/d/Net-ICAP-Client

     * Search CPAN

     http://search.cpan.org/dist/Net-ICAP-Client/

LICENSE AND COPYRIGHT

   Copyright 2016 David Dick.

   This program is free software; you can redistribute it and/or modify it
   under the terms of either: the GNU General Public License as published
   by the Free Software Foundation; or the Artistic License.

   See http://dev.perl.org/licenses/ for more information.