how to send request parameters with beast

2.9k Views Asked by At

body in the docs i am trying to send to the server : https://binance-docs.github.io/apidocs/spot/en/#order-book

    // Start the asynchronous operation
    void
    run(
        char const* host,
        char const* port,
        char const* target)
    {
        // Set SNI Hostname (many hosts need this to handshake successfully)
        if(! SSL_set_tlsext_host_name(stream_.native_handle(), host))
        {
            beast::error_code ec{static_cast<int>(::ERR_get_error()), net::error::get_ssl_category()};
            std::cerr << ec.message() << "\n";
            return;
        }

        // Set up an HTTP GET request message
        // req_.version(version);
        req_.method(http::verb::get);
        req_.target(target);
        req_.set(http::field::host, host);
        req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
        req_.body() = "symbol=btcusdt";
        req_.prepare_payload(); // make HTTP 1.1 compliant

        // Look up the domain name
        resolver_.async_resolve(
            host,
            port,
            beast::bind_front_handler(
                &session::on_resolve,
                shared_from_this()));
    }

As you can see req_.body() = "symbol=btcusdt"; clearly not working(which i got from stackoverflow), is there another way to do it ? I dont want to use boost json for sending the body, maybe could use jsoncpp. please help me and advance thanks!

1

There are 1 best solutions below

4
On BEST ANSWER

As you can see req_.body() = "symbol=btcusdt"; clearly not working(which i got from stackoverflow),

You didn't get that from StackOverflow. You did get:

    req_.body() = serialize(json::object {{"symbol", "btcusdt"}});
    req_.prepare_payload(); // make HTTP 1.1 compliant

Now if you somehow have an issue with that, you forgot to describe what the issue is.

As the commenter points out, it doesn't normally make sense to pass content with a GET request (background: HTTP GET with request body).

Checking the docs confirms it should be GET. So, then likely it expects query parameters. Poking at it with "/api/v3/depth?symbol=btcusdt" gives

{"code":-1100,"msg":"Illegal characters found in parameter 'symbol'; legal range is '^[A-Z0-9-_.]{1,20}$'."}
shutdown: stream truncated

So, yeah, it reads those. "/api/v3/depth?symbol=BTCUSDT" fixes the error:

{"lastUpdateId":18749392570,"bids":[["38337.57000000","2.48048000"],["38337.53000000","0.00391000"],["38336.74000000","0.03264000"],["38336.73000000","0.35211000"],["38336.72000000","0.13042000"],["38336.08000000","0.00455000"],["38335.00000000","0.09385000"],["38334.83000000","0.38462000"],["38334.82000000","0.39125000"],["38334.73000000","0.00052000"],["38334.69000000","0.00037000"],["38334.43000000","0.09528000"],["38333.01000000","0.00400000"],["38332.78000000","0.00037000"],["38332.71000000","0.01319000"],["38331.84000000","0.00833000"],["38331.46000000","0.39126000"],["38331.41000000","0.04000000"],["38330.93000000","0.39128000"],["38330.83000000","1.20000000"],["38330.33000000","0.24000000"],["38329.94000000","0.06407000"],["38329.90000000","0.06000000"],["38329.44000000","0.35216000"],["38329.39000000","0.39131000"],["38329.22000000","0.94299000"],["38327.88000000","0.01829000"],["38326.06000000","0.06000000"],["38325.76000000","0.01738000"],["38325.69000000","0.39133000"],["38324.82000000","0.02000000"],["38324.53000000","0.03771000"],["38323.43000000","0.01423000"],["38323.17000000","0.06352000"],["38323.01000000","0.11626000"],["38322.97000000","0.26100000"],["38322.82000000","1.95599000"],["38322.64000000","0.24845000"],["38322.36000000","0.00260000"],["38322.32000000","0.00187000"],["38322.27000000","0.23664000"],["38322.23000000","0.06000000"],["38321.90000000","0.24187000"],["38320.80000000","0.01048000"],["38320.70000000","0.00964000"],["38320.43000000","0.02202000"],["38320.39000000","0.09000000"],["38320.26000000","0.98600000"],["38320.00000000","0.05333000"],["38319.69000000","0.16310000"],["38319.59000000","0.03000000"],["38319.49000000","0.00037000"],["38319.45000000","0.06000000"],["38318.60000000","0.15000000"],["38318.41000000","0.02600000"],["38317.94000000","0.03086000"],["38317.57000000","0.00037000"],["38317.28000000","1.97450000"],["38317.18000000","0.01232000"],["38317.07000000","0.07704000"],["38316.71000000","0.01105000"],["38316.42000000","0.26120000"],["38316.41000000","0.03933000"],["38315.53000000","0.39000000"],["38315.05000000","2.51774000"],["38314.81000000","0.00903000"],["38314.59000000","0.34420000"],["38313.73000000","0.30000000"],["38313.60000000","0.03706000"],["38313.04000000","0.01234000"],["38312.79000000","0.00040000"],["38312.74000000","0.00160000"],["38312.64000000","0.03970000"],["38312.45000000","0.03989000"],["38311.93000000","0.00100000"],["38311.80000000","0.19965000"],["38311.68000000","0.03787000"],["38310.81000000","0.03086000"],["38310.79000000","0.00652000"],["38310.72000000","0.00180000"],["38310.39000000","0.07902000"],["38310.30000000","0.00027000"],["38310.16000000","0.00037000"],["38310.12000000","0.00100000"],["38310.00000000","0.05221000"],["38309.42000000","0.00505000"],["38309.29000000","0.02601000"],["38309.28000000","0.02601000"],["38309.27000000","0.02601000"],["38308.35000000","0.03918000"],["38308.24000000","0.00037000"],["38307.90000000","0.04000000"],["38307.60000000","0.00034000"],["38305.40000000","5.56346000"],["38304.47000000","0.87474000"],["38304.16000000","0.04030000"],["38304.00000000","0.09062000"],["38303.40000000","0.47680000"],["38303.29000000","0.28900000"],["38303.24000000","0.05433000"]],"asks":[["38337.58000000","0.59927000"],["38337.59000000","0.01654000"],["38338.13000000","0.00400000"],["38338.15000000","0.00900000"],["38340.27000000","0.00027000"],["38340.45000000","0.00037000"],["38342.37000000","0.00037000"],["38342.44000000","0.05200000"],["38343.93000000","0.01976000"],["38344.51000000","0.13042000"],["38345.19000000","0.44713000"],["38345.28000000","0.04998000"],["38345.43000000","0.26087000"],["38346.10000000","0.26089000"],["38346.12000000","0.26100000"],["38346.23000000","0.00991000"],["38346.24000000","0.04876000"],["38346.59000000","0.26086000"],["38347.13000000","0.01940000"],["38347.20000000","0.04705000"],["38347.40000000","0.26100000"],["38347.44000000","0.02478000"],["38347.45000000","0.00266000"],["38347.47000000","0.01491000"],["38347.66000000","0.07824000"],["38348.16000000","0.14054000"],["38348.48000000","0.26085000"],["38349.93000000","0.10000000"],["38350.00000000","0.00055000"],["38350.08000000","0.09146000"],["38350.33000000","0.00037000"],["38351.23000000","0.02553000"],["38352.00000000","0.17533000"],["38352.22000000","0.74700000"],["38352.40000000","0.26085000"],["38352.50000000","1.98993000"],["38352.75000000","0.00100000"],["38352.92000000","0.06000000"],["38353.92000000","0.09146000"],["38354.16000000","0.10000000"],["38355.10000000","0.10000000"],["38355.87000000","0.01829000"],["38356.19000000","0.12915000"],["38356.81000000","0.04000000"],["38358.94000000","0.10000000"],["38359.02000000","0.00187000"],["38359.04000000","0.57852000"],["38359.27000000","0.00037000"],["38359.66000000","0.09730000"],["38359.92000000","0.05000000"],["38360.00000000","0.26059000"],["38360.01000000","0.00525000"],["38360.65000000","0.00100000"],["38361.18000000","0.00037000"],["38361.83000000","0.10000000"],["38363.42000000","0.01940000"],["38363.81000000","0.00037000"],["38364.66000000","1.91518000"],["38364.88000000","0.02609000"],["38366.58000000","0.10000000"],["38366.60000000","0.14645000"],["38366.82000000","0.02601000"],["38366.83000000","0.02601000"],["38366.84000000","0.02601000"],["38367.18000000","0.00037000"],["38367.47000000","0.00140000"],["38368.35000000","0.22000000"],["38368.59000000","0.01301000"],["38368.91000000","0.01824000"],["38369.10000000","0.00037000"],["38369.61000000","0.00170000"],["38370.00000000","0.05214000"],["38370.30000000","0.00652000"],["38370.40000000","0.01105000"],["38370.69000000","0.00050000"],["38370.81000000","0.15840000"],["38371.11000000","0.03086000"],["38371.18000000","0.00410000"],["38371.49000000","0.00037000"],["38372.35000000","0.07818000"],["38372.98000000","0.03978000"],["38373.12000000","1.05945000"],["38373.20000000","0.03086000"],["38373.67000000","0.06000000"],["38373.95000000","0.03000000"],["38374.04000000","0.05434000"],["38374.19000000","1.48075000"],["38374.41000000","0.05447000"],["38374.55000000","0.09000000"],["38374.64000000","0.00902000"],["38374.80000000","0.00120000"],["38374.91000000","0.26059000"],["38374.92000000","4.97054000"],["38375.05000000","0.00357000"],["38375.26000000","0.00050000"],["38375.61000000","6.50000000"],["38376.62000000","0.04173000"],["38376.97000000","1.48075000"],["38378.17000000","0.03908000"],["38378.18000000","0.06270000"]]}

Proper Solution

You should add the query parameters. Beast doesn't have facilities for that:

It is the caller's responsibility to ensure that the request target string follows the syntax rules for URIs used with HTTP. In particular, reserved or special characters must be url-encoded. The implementation does not perform syntax checking on the passed string.

So consider using something like e.g. Boost URL:

static boost::url_view const base_api{"wss://api.binance.com/api/v3/"};

boost::url method{"depth"};
method.params().emplace_back("symbol", "BTCUSDT");

std::make_shared<session>(net::make_strand(ioc), ctx)
    ->run(make_url(base_api, method));

Where make_url is a convenience wrapper around boost::urls::resolve:

boost::url make_url(boost::url_view base_api, boost::url_view method) {
    assert(!method.is_path_absolute());
    assert(base_api.data()[base_api.size() - 1] == '/');

    boost::urls::error_code ec;
    boost::url              url;
    resolve(base_api, method, url, ec);
    if (ec)
        throw boost::system::system_error(ec);
    return url;
}

Which allows some simplification in run as well:

run(boost::url_view url) {
    std::string const host(url.host());
    std::string const service = url.has_port() //
        ? url.port()
        : (url.scheme_id() == boost::urls::scheme::wss) //
            ? "https"
            : "http";
    url.remove_origin(); // becomes target

Full Listing

#include <boost/asio.hpp>
#include <boost/beast.hpp>
#include <boost/beast/ssl.hpp>
#include <boost/json.hpp>
#include <boost/json/src.hpp>
#include <functional>
#include <iostream>
#include <memory>
#include <string>

#include <boost/url.hpp>
#include <boost/url/src.hpp> // for "header-only"

namespace beast = boost::beast;         // from <boost/beast.hpp>
namespace http  = beast::http;          // from <boost/beast/http.hpp>
namespace net   = boost::asio;          // from <boost/asio.hpp>
namespace ssl   = boost::asio::ssl;     // from <boost/asio/ssl.hpp>
namespace json  = boost::json;
using tcp       = boost::asio::ip::tcp; // from <boost/asio/ip/tcp.hpp>

using executor = net::any_io_executor; // boost 1.78 compat, comment if not applicable

//------------------------------------------------------------------------------

boost::url make_url(boost::url_view base_api, boost::url_view method) {
    assert(!method.is_path_absolute());
    assert(base_api.data()[base_api.size() - 1] == '/');

    boost::urls::error_code ec;
    boost::url              url;
    resolve(base_api, method, url, ec);
    if (ec)
        throw boost::system::system_error(ec);
    return url;
}
// Report a failure
void
fail(beast::error_code ec, char const* what)
{
    std::cerr << what << ": " << ec.message() << "\n";
}

// Performs an HTTP GET and prints the response
class session : public std::enable_shared_from_this<session>
{
    tcp::resolver                        resolver_;
    beast::ssl_stream<beast::tcp_stream> stream_;
    beast::flat_buffer                buffer_; // (Must persist between reads)
    http::request<http::string_body>  req_;
    http::response<http::string_body> res_;

  public:
    explicit session(executor ex, ssl::context& ctx)
        : resolver_(ex)
        , stream_(ex, ctx) {}

    // Start the asynchronous operation
    void
    run(boost::url url) {
        std::string const host(url.host());
        std::string const service = url.has_port() //
            ? url.port()
            : (url.scheme_id() == boost::urls::scheme::wss) //
                ? "https"
                : "http";
        url.remove_origin(); // becomes req_.target()

        // Set SNI Hostname (many hosts need this to handshake successfully)
        if(! SSL_set_tlsext_host_name(stream_.native_handle(), host.c_str()))
        {
            beast::error_code ec{static_cast<int>(::ERR_get_error()), net::error::get_ssl_category()};
            std::cerr << ec.message() << "\n";
            return;
        }

        // Set up an HTTP GET request message
        // req_.version(version);
        req_.method(http::verb::get);
        req_.target(url.c_str());
        req_.set(http::field::host, host);
        req_.set(http::field::user_agent, BOOST_BEAST_VERSION_STRING);
        //req_.body() = serialize(json::object {{"symbol", "btcusdt"}});
        req_.prepare_payload(); // make HTTP 1.1 compliant

        // Look up the domain name

        resolver_.async_resolve(host, service,
                                beast::bind_front_handler(&session::on_resolve,
                                                          shared_from_this()));
    }

    void
    on_resolve(
        beast::error_code ec,
        tcp::resolver::results_type results)
    {
        if(ec)
            return fail(ec, "resolve");

        // Set a timeout on the operation
        beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));

        // Make the connection on the IP address we get from a lookup
        beast::get_lowest_layer(stream_).async_connect(
            results,
            beast::bind_front_handler(
                &session::on_connect,
                shared_from_this()));
    }

    void
    on_connect(beast::error_code ec, tcp::resolver::results_type::endpoint_type)
    {
        if(ec)
            return fail(ec, "connect");

        // Perform the SSL handshake
        stream_.async_handshake(
            ssl::stream_base::client,
            beast::bind_front_handler(
                &session::on_handshake,
                shared_from_this()));
    }

    void
    on_handshake(beast::error_code ec)
    {
        if(ec)
            return fail(ec, "handshake");

        // Set a timeout on the operation
        beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));

        // Send the HTTP request to the remote host
        std::cout << "Sending " << req_ << std::endl;
        http::async_write(stream_, req_,
            beast::bind_front_handler(
                &session::on_write,
                shared_from_this()));
    }

    void
    on_write(
        beast::error_code ec,
        std::size_t bytes_transferred)
    {
        boost::ignore_unused(bytes_transferred);

        if(ec)
            return fail(ec, "write");

        // Receive the HTTP response
        http::async_read(stream_, buffer_, res_,
            beast::bind_front_handler(
                &session::on_read,
                shared_from_this()));
    }

    void
    on_read(
        beast::error_code ec,
        std::size_t bytes_transferred)
    {
        boost::ignore_unused(bytes_transferred);

        if(ec)
            return fail(ec, "read");

        // Write the message to standard out
        std::cout << res_ << std::endl;

        // Set a timeout on the operation
        beast::get_lowest_layer(stream_).expires_after(std::chrono::seconds(30));

        // Gracefully close the stream
        stream_.async_shutdown(
            beast::bind_front_handler(
                &session::on_shutdown,
                shared_from_this()));
    }

    void
    on_shutdown(beast::error_code ec)
    {
        if(ec == net::error::eof)
        {
            // Rationale:
            // http://stackoverflow.com/questions/25587403/boost-asio-ssl-async-shutdown-always-finishes-with-an-error
            ec = {};
        }
        if(ec)
            return fail(ec, "shutdown");

        // If we get here then the connection is closed gracefully
    }
};

//------------------------------------------------------------------------------

int main() {
    // The io_context is required for all I/O
    net::io_context ioc;

    // The SSL context is required, and holds certificates
    ssl::context ctx{ssl::context::tlsv12_client};

    // Verify the remote server's certificate
    ctx.set_verify_mode(ssl::verify_peer);
    ctx.set_default_verify_paths();

    // Launch the asynchronous operation
    // see for endpoints: https://binance-docs.github.io/apidocs/spot/en/#general-info
    static boost::url_view const base_api{"wss://api.binance.com/api/v3/"};

    boost::url method{"depth"};
    method.params().emplace_back("symbol", "BTCUSDT");

    // The session is constructed with a strand to
    // ensure that handlers do not execute concurrently.
    std::make_shared<session>(net::make_strand(ioc), ctx)
        ->run(make_url(base_api, method));

    // Run the I/O service. The call will return when
    // the get operation is complete.
    ioc.run();
}

Prints

url: wss://api.binance.com/api/v3/depth?symbol=BTCUSDT
url.host(): api.binance.com
url.encoded_path(): /api/v3/depth
url.encoded_origin(): wss://api.binance.com
url.encoded_query(): symbol=BTCUSDT
url.encoded_authority(): api.binance.com
Sending GET /api/v3/depth?symbol=BTCUSDT HTTP/1.1
Host: api.binance.com
User-Agent: Boost.Beast/322


HTTP/1.1 200 OK
Content-Type: application/json;charset=UTF-8
Content-Length: 6447
Connection: keep-alive
Date: Tue, 26 Apr 2022 22:47:24 GMT
Server: nginx
Vary: Accept-Encoding
x-mbx-uuid: 9e00433d-5123-472c-9bf1-10104394266d
x-mbx-used-weight: 1
x-mbx-used-weight-1m: 1
Strict-Transport-Security: max-age=31536000; includeSubdomains
X-Frame-Options: SAMEORIGIN
X-Xss-Protection: 1; mode=block
X-Content-Type-Options: nosniff
Content-Security-Policy: default-src 'self'
X-Content-Security-Policy: default-src 'self'
X-WebKit-CSP: default-src 'self'
Cache-Control: no-cache, no-store, must-revalidate
Pragma: no-cache
Expires: 0
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET, HEAD, OPTIONS
X-Cache: Miss from cloudfront
Via: 1.1 fa544a973edca8926f95609301f23b66.cloudfront.net (CloudFront)
X-Amz-Cf-Pop: DUS51-P2
X-Amz-Cf-Id: NIOqhB8rrl5nqCo_-TBwYPkgPXdREtQY4PwIi441WxjKRMOoeBkERQ==

{"lastUpdateId":18749934602,"bids":[["38290.70000000","4.61843000"],["38290.69000000","0.00060000"],["38290.65000000","0.00416000"],["38290.34000000","0.35254000"],["38290.33000000","0.75000000"],["38289.79000000","0.13058000"],["38289.00000000","0.18264000"],["38288.82000000","0.39171000"],["38288.63000000","0.00052000"],["38288.62000000","0.29100000"],["38288.02000000","0.39173000"],["38288.01000000","0.13484000"],["38287.31000000","0.53725000"],["38286.71000000","0.01319000"],["38286.70000000","1.74256000"],["38285.48000000","0.04000000"],["38285.41000000","0.57240000"],["38284.97000000","5.41100000"],["38284.96000000","2.50745000"],["38284.95000000","0.00091000"],["38284.14000000","0.00100000"],["38283.95000000","0.00027000"],["38283.81000000","0.74700000"],["38283.72000000","0.39175000"],["38283.14000000","0.39177000"],["38283.04000000","0.06000000"],["38282.99000000","0.35261000"],["38282.81000000","2.41006000"],["38282.54000000","0.39178000"],["38281.24000000","0.00400000"],["38281.13000000","0.75000000"],["38281.00000000","0.10000000"],["38280.99000000","0.04000000"],["38280.84000000","0.01829000"],["38280.44000000","0.00027000"],["38280.00000000","0.05225000"],["38279.53000000","0.45585000"],["38279.21000000","0.06000000"],["38278.89000000","0.00029000"],["38278.76000000","0.12000000"],["38277.61000000","0.04000000"],["38276.08000000","0.08000000"],["38275.62000000","0.07982000"],["38275.48000000","0.00900000"],["38275.42000000","0.26100000"],["38275.38000000","0.06000000"],["38274.31000000","0.26100000"],["38274.29000000","0.00340000"],["38274.28000000","0.80417000"],["38274.24000000","0.44994000"],["38273.47000000","0.03000000"],["38273.43000000","0.12968000"],["38272.96000000","0.04102000"],["38272.86000000","0.03091000"],["38272.68000000","1.89237000"],["38271.97000000","0.01304000"],["38271.79000000","0.00416000"],["38271.73000000","0.00028000"],["38271.48000000","0.06000000"],["38271.40000000","0.00037000"],["38270.64000000","0.02600000"],["38270.63000000","0.00027000"],["38270.46000000","0.10000000"],["38270.45000000","0.75000000"],["38270.41000000","0.66800000"],["38270.00000000","0.05356000"],["38269.77000000","0.02615000"],["38269.76000000","0.02615000"],["38269.45000000","0.00037000"],["38269.44000000","0.09999000"],["38269.09000000","0.58398000"],["38269.02000000","0.07824000"],["38269.00000000","0.00169000"],["38268.92000000","0.31167000"],["38268.88000000","0.00306000"],["38268.83000000","0.02028000"],["38268.81000000","0.12271000"],["38268.36000000","0.39000000"],["38268.19000000","0.04166000"],["38267.89000000","1.93553000"],["38267.52000000","0.01041000"],["38267.31000000","0.00027000"],["38267.12000000","0.00037000"],["38266.66000000","0.04000000"],["38266.35000000","0.09000000"],["38265.65000000","0.75000000"],["38265.63000000","0.00037000"],["38265.60000000","0.00057000"],["38265.55000000","2.54224000"],["38265.39000000","0.15000000"],["38265.27000000","0.01047000"],["38265.20000000","0.10000000"],["38265.10000000","0.10000000"],["38264.94000000","0.03086000"],["38264.19000000","0.03086000"],["38263.48000000","0.03960000"],["38263.39000000","0.62956000"],["38262.53000000","0.02615000"],["38261.88000000","0.28928000"],["38261.84000000","0.00037000"]],"asks":[["38290.71000000","1.11417000"],["38290.73000000","0.59583000"],["38291.16000000","0.00900000"],["38291.98000000","0.02421000"],["38292.63000000","0.00522000"],["38293.95000000","0.00307000"],["38294.17000000","0.01310000"],["38294.30000000","0.00037000"],["38295.50000000","0.00037000"],["38296.22000000","0.75000000"],["38297.00000000","0.01469000"],["38297.16000000","0.75000000"],["38297.36000000","0.00041000"],["38297.42000000","0.00037000"],["38297.62000000","0.10660000"],["38298.13000000","0.00783000"],["38298.14000000","0.00339000"],["38298.18000000","0.61816000"],["38298.24000000","0.09585000"],["38298.32000000","0.01910000"],["38298.63000000","0.26119000"],["38299.00000000","0.01486000"],["38299.70000000","0.13057000"],["38300.00000000","24.61496000"],["38300.16000000","0.09585000"],["38300.85000000","0.12969000"],["38300.91000000","0.00037000"],["38301.48000000","0.26149000"],["38301.62000000","0.04340000"],["38302.08000000","0.14125000"],["38302.20000000","0.06000000"],["38302.69000000","0.01020000"],["38302.78000000","0.75000000"],["38302.84000000","0.04702000"],["38302.88000000","0.00037000"],["38303.04000000","0.04823000"],["38303.25000000","0.26118000"],["38303.30000000","0.00100000"],["38303.57000000","0.08000000"],["38304.00000000","0.14262000"],["38304.04000000","0.00100000"],["38304.10000000","0.25976000"],["38304.39000000","0.94299000"],["38304.80000000","0.00037000"],["38304.96000000","0.08314000"],["38305.04000000","0.00050000"],["38305.10000000","0.32000000"],["38305.16000000","0.07648000"],["38305.34000000","0.00040000"],["38305.66000000","0.10000000"],["38305.72000000","0.10000000"],["38306.19000000","0.26114000"],["38306.25000000","0.64000000"],["38306.48000000","0.00055000"],["38306.72000000","0.75000000"],["38306.73000000","0.26116000"],["38306.80000000","0.74700000"],["38306.91000000","0.07105000"],["38306.92000000","0.00260000"],["38307.06000000","1.93567000"],["38307.11000000","0.00037000"],["38307.55000000","0.01829000"],["38307.60000000","0.00034000"],["38309.64000000","0.03000000"],["38310.00000000","0.30197000"],["38310.15000000","0.01827000"],["38310.24000000","0.04923000"],["38310.30000000","0.00027000"],["38310.68000000","0.05000000"],["38310.76000000","0.05454000"],["38310.87000000","0.09141000"],["38311.29000000","0.00059000"],["38311.42000000","0.02300000"],["38311.64000000","0.01105000"],["38312.29000000","0.03939000"],["38313.03000000","0.00221000"],["38313.43000000","0.12801000"],["38313.57000000","1.97481000"],["38314.24000000","0.00052000"],["38314.34000000","0.75000000"],["38315.53000000","0.04020000"],["38315.56000000","0.02727000"],["38315.70000000","0.00064000"],["38315.78000000","0.00904000"],["38316.45000000","0.00074000"],["38316.80000000","0.06000000"],["38317.12000000","0.05453000"],["38317.26000000","0.12029000"],["38317.59000000","0.30000000"],["38317.61000000","0.00030000"],["38317.65000000","0.06813000"],["38318.20000000","0.24169000"],["38318.28000000","0.02581000"],["38318.56000000","0.31333000"],["38318.81000000","0.04102000"],["38318.82000000","0.03086000"],["38319.67000000","0.03086000"],["38319.98000000","0.00885000"],["38319.99000000","0.01051000"],["38320.00000000","0.05221000"]]}
shutdown: stream truncated