Search code examples
c++clientboost-asioboost-beast

how to send request parameters with beast


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!


Solution

  • 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