diff --git a/src/jni/lib_http_client_websocket.cpp b/src/jni/lib_http_client_websocket.cpp index ac98fc86..1dc20b39 100644 --- a/src/jni/lib_http_client_websocket.cpp +++ b/src/jni/lib_http_client_websocket.cpp @@ -16,6 +16,8 @@ HttpClientWebSocket::HttpClientWebSocket(FakeJni::JLong owner) { curl = curl_easy_init(); curl_easy_setopt(curl, CURLOPT_WRITEDATA, this); curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writecb); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, this); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, headercb); #endif jvm = (void*)&FakeJni::JniEnvContext().getJniEnv().getVM(); @@ -104,9 +106,6 @@ void HttpClientWebSocket::disconnect(int id) { size_t HttpClientWebSocket::write_callback(char *ptr, size_t size, size_t nmemb) { #ifdef ENABLE_WEBSOCKETS - if(!connected) { - sendOpened(); - } auto frame = curl_ws_meta(curl); if(frame->flags & CURLWS_TEXT) { std::string cont((const char*)ptr, nmemb); @@ -133,14 +132,21 @@ size_t HttpClientWebSocket::writecb(char *buffer, size_t size, size_t nitems, vo return ((HttpClientWebSocket*)userdata)->write_callback(buffer, size, nitems); } +size_t HttpClientWebSocket::headercb(char *ptr, size_t size, size_t nmemb, void *userdata) { + ((HttpClientWebSocket*)userdata)->sendOpened(); + return size * nmemb; +} + void HttpClientWebSocket::sendOpened() { + if(!connected) { #ifndef NDEBUG - Log::trace("HttpClientWebSocket", "Sending onOpen"); + Log::trace("HttpClientWebSocket", "Sending onOpen"); #endif - FakeJni::LocalFrame frame(*(FakeJni::Jvm*)jvm); - auto method = getClass().getMethod("()V", "onOpen"); - method->invoke(frame.getJniEnv(), this); - connected = true; + FakeJni::LocalFrame frame(*(FakeJni::Jvm*)jvm); + auto method = getClass().getMethod("()V", "onOpen"); + method->invoke(frame.getJniEnv(), this); + connected = true; + } } void HttpClientWebSocket::sendClosed() { diff --git a/src/jni/lib_http_client_websocket.h b/src/jni/lib_http_client_websocket.h index 6a178cdb..6aad5a3f 100644 --- a/src/jni/lib_http_client_websocket.h +++ b/src/jni/lib_http_client_websocket.h @@ -25,6 +25,7 @@ class HttpClientWebSocket : public FakeJni::JObject { struct curl_slist *header = nullptr; size_t write_callback(char *ptr, size_t size, size_t nmemb); static size_t writecb(char *buffer, size_t size, size_t nitems, void* data); + static size_t headercb(char *ptr, size_t size, size_t nmemb, void *userdata); void sendOpened(); void sendClosed(); };