MtGox API и websocketpp

Я не могу получить информацию от MtGox API через библиотеку WebSockets C++ с именем websocketpp:

#include <websocketpp/config/asio_no_tls_client.hpp>
#include <websocketpp/client.hpp>

#include <iostream>

typedef websocketpp::client<websocketpp::config::asio_client> client;

using websocketpp::lib::placeholders::_1;
using websocketpp::lib::placeholders::_2;
using websocketpp::lib::bind;

typedef websocketpp::config::asio_client::message_type::ptr message_ptr;

void on_open(websocketpp::connection_hdl hdl)
{
    std::cout << "on_open \n";
}

void on_close(websocketpp::connection_hdl hdl)
{
    std::cout << "on_close \n";
}

void on_message(client* c, websocketpp::connection_hdl hdl, message_ptr msg)
{
    std::cout << msg->get_payload() << '\n';
}

int main()
{
    client c;

    try
    {
        c.init_asio();

        c.set_open_handler(on_open);
        c.set_close_handler(on_close);
        c.set_message_handler(bind(&on_message, &c, ::_1, ::_2));

        websocketpp::lib::error_code ec;
        client::connection_ptr con = c.get_connection("ws://websocket.mtgox.com:80/mtgox?Currency=EUR", ec);
        c.connect(con);

        c.run();
    }
    catch (const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
    catch (websocketpp::lib::error_code e)
    {
        std::cout << e.message() << std::endl;
    }
    catch (...)
    {
        std::cout << "other exception" << std::endl;
    }
}

Вывод

[2013-11-18 23:10:10] [подключиться] Успешное подключение

[2013-11-18 23:10:14] [ошибка] Ответ сервера на рукопожатие был недействительным: неверный статус HTTP.

[2013-11-18 23:10:14] [отключить] Ошибка: неверный статус HTTP.

В отладчике я вижу запрещенную ошибку 403, но я могу использовать ее через такие сервисы, как http://www.websocket.org/echo.html.

Я уже пытался использовать ws://socketio.mtgox.com:80/mtgox?Currency=EUR, но получил следующую ошибку:

[2013-11-18 23:18:07] [подключить] Успешное подключение

[2013-11-18 23:18:08] [ошибка] ошибка в handle_read_http_response: конец файла

[2013-11-18 23:18:08] [отключить] Ошибка: конец файла

Что не так с этим кодом?


person FrozenHeart    schedule 18.11.2013    source источник


Ответы (1)


MtGox, похоже, выполняет фильтрацию происхождения. Соединения WebSocket на основе браузера будут иметь автоматически отправленный заголовок источника со значением домена, из которого запускается скрипт. Поскольку это прежде всего мера безопасности для браузеров, использующих потенциально неизвестный код Javascript, WebSocket++ по умолчанию не отправляет заголовок источника.

MtGox отлично работает с любым источником, который я пробовал, если он вообще установлен. Предположительно, они используют это для внесения в черный список источников, которые они считают вредоносными. Вы можете отправить заголовок источника с помощью WebSocket++ со следующим кодом (заполните любой источник, который кажется подходящим для вашего приложения):

con->replace_header("Origin","http://www.example.com");

Запустите это после запроса нового соединения с endpoint::get_connection, но перед вызовом endpoint::connect.

Подробнее см. http://en.wikipedia.org/wiki/Same-origin_policy. о методе безопасности «политики того же происхождения», который используется здесь.

person zaphoyd    schedule 19.11.2013