warmcat / libwebsockets

canonical libwebsockets.org networking library
https://libwebsockets.org
Other
4.76k stars 1.48k forks source link

400 Bad Request - Bitfinex Websocket #1133

Closed lodenos closed 6 years ago

lodenos commented 6 years ago

I can not use the websocket with the libwebsocket, I will want to connect to this websocket bitfinex wss: //api.bitfinex.com/ws, and I have a 400 error Bad request, I do not understand how initializes properly lws_client_connect_info, i'd like with an example that works with bitfinex

include

static int callback(lws , lws_callback_reasons reason, void user, void p, size_t z) { switch (reason) { case LWS_CALLBACK_ESTABLISHED: // 0 cout << "LWS_CALLBACK_ESTABLISHED" << endl; break; case LWS_CALLBACK_CLIENT_CONNECTION_ERROR: // 1 cout << "LWS_CALLBACK_CLIENT_CONNECTION_ERROR" << endl; cout << (char )p << endl; break; case LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH: // 2 cout << "LWS_CALLBACK_CLIENT_FILTER_PRE_ESTABLISH" << endl; break; case LWS_CALLBACK_CLIENT_ESTABLISHED: // 3 cout << "LWS_CALLBACK_CLIENT_ESTABLISHED" << endl; break; case LWS_CALLBACK_CLOSED: // 4 cout << "LWS_CALLBACK_CLOSED" << endl; break; case LWS_CALLBACK_CLOSED_HTTP: // 5 cout << "LWS_CALLBACK_CLOSED_HTTP" << endl; break; case LWS_CALLBACK_RECEIVE: // 6 cout << "LWS_CALLBACK_RECEIVE" << endl; break; case LWS_CALLBACK_RECEIVE_PONG: // 7 cout << "LWS_CALLBACK_RECEIVE_PONG" << endl; break; case LWS_CALLBACK_CLIENT_RECEIVE: // 8 cout << "LWS_CALLBACK_RECEIVE_PONG" << endl; break; case LWS_CALLBACK_CLIENT_RECEIVE_PONG: // 9 cout << "LWS_CALLBACK_RECEIVE_PONG" << endl; break; case LWS_CALLBACK_CLIENT_WRITEABLE: // 10 cout << "LWS_CALLBACK_CLIENT_WRITEABLE" << endl; break; case LWS_CALLBACK_SERVER_WRITEABLE: // 11 cout << "LWS_CALLBACK_SERVER_WRITEABLE" << endl; break; case LWS_CALLBACK_HTTP: // 12 cout << "LWS_CALLBACK_HTTP" << endl; break; case LWS_CALLBACK_HTTP_BODY: // 13 cout << "LWS_CALLBACK_HTTP_BODY" << endl; break; case LWS_CALLBACK_HTTP_BODY_COMPLETION: // 14 cout << "LWS_CALLBACK_HTTP_BODY_COMPLETION" << endl; break; case LWS_CALLBACK_HTTP_FILE_COMPLETION: // 15 cout << "LWS_CALLBACK_HTTP_FILE_COMPLETION" << endl; break; case LWS_CALLBACK_HTTP_WRITEABLE: // 16 cout << "LWS_CALLBACK_HTTP_WRITEABLE" << endl; break; case LWS_CALLBACK_FILTER_NETWORK_CONNECTION: // 17 cout << "LWS_CALLBACK_FILTER_NETWORK_CONNECTION" << endl; break; case LWS_CALLBACK_FILTER_HTTP_CONNECTION: // 18 cout << "LWS_CALLBACK_FILTER_HTTP_CONNECTION" << endl; break; case LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED: // 19 cout << "LWS_CALLBACK_SERVER_NEW_CLIENT_INSTANTIATED" << endl; break; case LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION: // 20 cout << "LWS_CALLBACK_FILTER_PROTOCOL_CONNECTION" << endl; break; case LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS: // 21 cout << "LWS_CALLBACK_OPENSSL_LOAD_EXTRA_CLIENT_VERIFY_CERTS" << endl; break; case LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS: // 22 cout << "LWS_CALLBACK_OPENSSL_LOAD_EXTRA_SERVER_VERIFY_CERTS" << endl; break; case LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION: // 23 cout << "LWS_CALLBACK_OPENSSL_PERFORM_CLIENT_CERT_VERIFICATION" << endl; break; case LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER: // 24 cout << "LWS_CALLBACK_CLIENT_APPEND_HANDSHAKE_HEADER" << endl; break; case LWS_CALLBACK_CONFIRM_EXTENSION_OKAY: // 25 cout << "LWS_CALLBACK_CONFIRM_EXTENSION_OKAY" << endl; break; case LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED: // 26 cout << "LWS_CALLBACK_CLIENT_CONFIRM_EXTENSION_SUPPORTED" << endl; break; case LWS_CALLBACK_PROTOCOL_INIT: // 27 cout << "LWS_CALLBACK_PROTOCOL_INIT" << endl; break; case LWS_CALLBACK_PROTOCOL_DESTROY: // 28 cout << "LWS_CALLBACK_PROTOCOL_DESTROY" << endl; break; case LWS_CALLBACK_WSI_CREATE: // 29 cout << "LWS_CALLBACK_WSI_CREATE" << endl; break; case LWS_CALLBACK_WSI_DESTROY: // 30 cout << "LWS_CALLBACK_WSI_DESTROY" << endl; break; case LWS_CALLBACK_GET_THREAD_ID: // 31 cout << "LWS_CALLBACK_GET_THREAD_ID" << endl; break; case LWS_CALLBACK_ADD_POLL_FD: // 32 cout << "LWS_CALLBACK_ADD_POLL_FD" << endl; break; case LWS_CALLBACK_DEL_POLL_FD: // 33 cout << "LWS_CALLBACK_DEL_POLL_FD" << endl; break; case LWS_CALLBACK_CHANGE_MODE_POLL_FD: // 34 cout << "LWS_CALLBACK_CHANGE_MODE_POLL_FD" << endl; break; case LWS_CALLBACK_LOCK_POLL: // 35 cout << "LWS_CALLBACK_LOCK_POLL" << endl; break; case LWS_CALLBACK_UNLOCK_POLL: // 36 cout << "LWS_CALLBACK_UNLOCK_POLL" << endl; break; case LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY: // 37 cout << "LWS_CALLBACK_OPENSSL_CONTEXT_REQUIRES_PRIVATE_KEY" << endl; break; case LWS_CALLBACK_WS_PEER_INITIATED_CLOSE: // 38 cout << "LWS_CALLBACK_WS_PEER_INITIATED_CLOSE" << endl; break; case LWS_CALLBACK_WS_EXT_DEFAULTS: // 39 cout << "LWS_CALLBACK_WS_EXT_DEFAULTS" << endl; break; case LWS_CALLBACK_CGI: // 40 cout << "LWS_CALLBACK_CGI" << endl; break; case LWS_CALLBACK_CGI_TERMINATED: // 41 cout << "LWS_CALLBACK_CGI_TERMINATED" << endl; break; case LWS_CALLBACK_CGI_STDIN_COMPLETED: // 43 cout << "LWS_CALLBACK_CGI_STDIN_COMPLETED" << endl; break; case LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP: // 44 cout << "LWS_CALLBACK_ESTABLISHED_CLIENT_HTTP" << endl; break; case LWS_CALLBACK_CLOSED_CLIENT_HTTP: // 45 cout << "LWS_CALLBACK_CLOSED_CLIENT_HTTP" << endl; break; case LWS_CALLBACK_RECEIVE_CLIENT_HTTP: // 46 cout << "LWS_CALLBACK_RECEIVE_CLIENT_HTTP" << endl; break; case LWS_CALLBACK_COMPLETED_CLIENT_HTTP: // 47 cout << "LWS_CALLBACK_COMPLETED_CLIENT_HTTP" << endl; break; case LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ: // 48 cout << "LWS_CALLBACK_RECEIVE_CLIENT_HTTP_READ" << endl; break; case LWS_CALLBACK_HTTP_BIND_PROTOCOL: // 49 cout << "LWS_CALLBACK_HTTP_BIND_PROTOCOL" << endl; break; case LWS_CALLBACK_HTTP_DROP_PROTOCOL: // 50 cout << "LWS_CALLBACK_HTTP_DROP_PROTOCOL" << endl; break; case LWS_CALLBACK_CHECK_ACCESS_RIGHTS: // 51 cout << "LWS_CALLBACK_CHECK_ACCESS_RIGHTS" << endl; break; case LWS_CALLBACK_PROCESS_HTML: // 52 cout << "LWS_CALLBACK_PROCESS_HTML" << endl; break; case LWS_CALLBACK_ADD_HEADERS: // 53 cout << "LWS_CALLBACK_ADD_HEADERS" << endl; break; case LWS_CALLBACK_SESSION_INFO: // 54 cout << "LWS_CALLBACK_SESSION_INFO" << endl; break; case LWS_CALLBACK_GS_EVENT: // 55 cout << "LWS_CALLBACK_GS_EVENT" << endl; break; case LWS_CALLBACK_HTTP_PMO: // 56 cout << "LWS_CALLBACK_HTTP_PMO" << endl; break; case LWS_CALLBACK_CLIENT_HTTP_WRITEABLE: // 57 cout << "LWS_CALLBACK_CLIENT_HTTP_WRITEABLE" << endl; break; case LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION: // 58 cout << "LWS_CALLBACK_OPENSSL_PERFORM_SERVER_CERT_VERIFICATION" << endl; break; case LWS_CALLBACK_RAW_RX: // 59 cout << "LWS_CALLBACK_RAW_RX" << endl; break; case LWS_CALLBACK_RAW_CLOSE: // 60 cout << "LWS_CALLBACK_RAW_CLOSE" << endl; break; case LWS_CALLBACK_RAW_WRITEABLE: // 61 cout << "LWS_CALLBACK_RAW_WRITEABLE" << endl; break; case LWS_CALLBACK_RAW_ADOPT: // 62 cout << "LWS_CALLBACK_RAW_ADOPT" << endl; break; case LWS_CALLBACK_RAW_ADOPT_FILE: // 63 cout << "LWS_CALLBACK_RAW_ADOPT_FILE" << endl; break; case LWS_CALLBACK_RAW_RX_FILE: // 64 cout << "LWS_CALLBACK_RAW_RX_FILE" << endl; break; case LWS_CALLBACK_RAW_WRITEABLE_FILE: // 65 cout << "LWS_CALLBACK_RAW_WRITEABLE_FILE" << endl; break; case LWS_CALLBACK_RAW_CLOSE_FILE: // 66 cout << "LWS_CALLBACK_RAW_CLOSE_FILE" << endl; break; case LWS_CALLBACK_SSL_INFO: // 67 cout << "LWS_CALLBACK_SSL_INFO" << endl; break; case LWS_CALLBACK_CHILD_WRITE_VIA_PARENT: // 68 cout << "LWS_CALLBACK_CHILD_WRITE_VIA_PARENT" << endl; break; case LWS_CALLBACK_CHILD_CLOSING: // 69 cout << "LWS_CALLBACK_CHILD_CLOSING" << endl; break; case LWS_CALLBACK_CGI_PROCESS_ATTACH: // 70 cout << "LWS_CALLBACK_CGI_PROCESS_ATTACH" << endl; break; case LWS_CALLBACK_EVENT_WAIT_CANCELLED: // 71 cout << "LWS_CALLBACK_EVENT_WAIT_CANCELLED" << endl; break; case LWS_CALLBACK_VHOST_CERT_AGING: // 72 cout << "LWS_CALLBACK_VHOST_CERT_AGING" << endl; break; case LWS_CALLBACK_TIMER: // 73 cout << "LWS_CALLBACK_TIMER" << endl; break; case LWS_CALLBACK_VHOST_CERT_UPDATE: // 74 cout << "LWS_CALLBACK_VHOST_CERT_UPDATE" << endl; break; case LWS_CALLBACK_USER: // 1000 cout << "LWS_CALLBACK_USER" << endl; break; default: cout << reason << endl; break; } return 0; }

static lws_protocols protocols[] = { { "protocol", // protocol name callback, // callback for protocol 0, // per session data size 0, // receive buffer size 0, // user defined ID, not used by LWS nullptr // user defined pointer }, {nullptr, nullptr, 0, 0, 0, nullptr} // Terminator };

void main () { lws_context_creation_info cinfo; memset(&cinfo, 0, sizeof(cinfo)); cinfo.port = CONTEXT_PORT_NO_LISTEN; cinfo.protocols = protocols; cinfo.extensions = nullptr; cinfo.gid = -1; cinfo.uid = -1; cinfo.user = nullptr; cinfo.options = 0; lws_context context = lws_create_context(&cinfo); if (context) { lws_client_connect_info ccinfo; memset(&ccinfo, 0, sizeof(ccinfo)); ccinfo.context = context; ccinfo.address = "api.bitfinex.com"; // server name ccinfo.port = 443; // port number ccinfo.ssl_connection = 0; // SSL ccinfo.path = "/ws"; // path to access ccinfo.host = lws_canonical_hostname(context); // host name ccinfo.origin = "origin"; // origin ccinfo.protocol = "protocol"; // protocol ccinfo.ietf_version_or_minus_one = -1; // IETF version lws socket = lws_client_connect_via_info(&ccinfo); if (socket) { while (true) { lws_service(context, 250); lws_callback_on_writable_all_protocol(context, protocols); sleep(1); } } lws_context_destroy(context); return 0; }

lws-team commented 6 years ago

I have a 400 error Bad request

So the remote server doesn't like what you asked for. There's nothing saying it's an lws problem.

ccinfo.port = 443; // port number ccinfo.ssl_connection = 0; // SSL

... you're talking http, not https on 443?