Search::Elasticsearch::Cxn::NetCurl - A Cxn implementation which uses
    libcurl via Net::Curl

    version 7.717

    Provides an HTTP Cxn class based on Net::Curl. The "NetCurl" Cxn class
    is very fast and uses persistent connections but requires XS and

    This class does Search::Elasticsearch::Role::Cxn, whose documentation
    provides more information.

    Unlike most HTTP backends, Net::Curl accepts a separate
    "connect_timeout" parameter, which defaults to 2 seconds but can be
    reduced in an environment with low network latency.

  Inherited configuration
    From Search::Elasticsearch::Role::Cxn

    *   node

    *   max_content_length

    *   deflate

    *   deflate

    *   request_timeout

    *   ping_timeout

    *   dead_timeout

    *   max_dead_timeout

    *   sniff_request_timeout

    *   sniff_timeout

    *   handle_args

    *   handle_args

    Search::Elasticsearch::Cxn::NetCurl does no validation of remote hosts
    by default.

    This behaviour can be changed by passing the "ssl_options" parameter
    with any options accepted by Net::Curl (see

    For instance, to check that the remote host has a trusted certificate,
    and to avoid man-in-the-middle attacks, you could do the following:

        use Search::Elasticsearch;
        use Net::Curl::Easy qw(

        my $es = Search::Elasticsearch->new(
            cxn   => 'NetCurl',
            nodes => [
            ssl_options => {
                CURLOPT_CAINFO()  => '/path/to/cacert.pem'

    If the remote server cannot be verified, an Search::Elasticsearch::Error
    will be thrown.

    If you want your client to present its own certificate to the remote
    server, then use:

        use Net::Curl::Easy qw(

        my $es = Search::Elasticsearch->new(
            cxn   => 'NetCurl',
            nodes => [
            ssl_options => {
                CURLOPT_CAINFO()      => '/path/to/cacert.pem'
                CURLOPT_SSLCERT()     => '/path/to/client.pem',
                CURLOPT_SSLKEY()      => '/path/to/client.pem',

        ($status,$body) = $self->perform_request({
            # required
            method      => 'GET|HEAD|POST|PUT|DELETE',
            path        => '/path/of/request',
            qs          => \%query_string_params,

            # optional
            data        => $body_as_string,
            mime_type   => 'application/json',
            timeout     => $timeout

    Sends the request to the associated Elasticsearch node and returns a
    $status code and the decoded response $body, or throws an error if the
    request failed.

  Inherited methods
    From Search::Elasticsearch::Role::Cxn

    *   scheme()

    *   is_https()

    *   userinfo()

    *   default_headers()

    *   max_content_length()

    *   build_uri()

    *   host()

    *   port()

    *   uri()

    *   is_dead()

    *   is_live()

    *   next_ping()

    *   ping_failures()

    *   mark_dead()

    *   mark_live()

    *   force_ping()

    *   pings_ok()

    *   sniff()

    *   process_response()

    *   Search::Elasticsearch::Role::Cxn

    *   Search::Elasticsearch::Cxn::LWP

    *   Search::Elasticsearch::Cxn::HTTPTiny

    This is a stable API but this implemenation is new. Watch this space for
    new releases.

    If you have any suggestions for improvements, or find any bugs, please
    report them to
    <>. I will be
    notified, and then you'll automatically be notified of progress on your
    bug as I make changes.

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

        perldoc Search::Elasticsearch::Cxn::NetCurl

    You can also look for information at:

    *   GitHub


    *   CPAN Ratings


    *   Search MetaCPAN


    *   IRC

        The #elasticsearch <irc://> channel on

    *   Mailing list

        The main Elasticsearch mailing list

    Enrico Zimuel <>

    This software is Copyright (c) 2022 by Elasticsearch BV.

    This is free software, licensed under:

      The Apache License, Version 2.0, January 2004