cclientibm-watsonlibwebsockets

c client call ibm-watson api with libwebsockets


I'am using libwebsockets library to create a c client which call ibm- watson speech to text server. So i've used minimal-ws-client-rx exemple https://github.com/warmcat/libwebsockets/blob/master/minimal-examples/ws-client/minimal-ws-client-rx/minimal-ws-client.c and then i changed the i.address to "gateway-lon.watsonplatform.net" and i.path to "/speech-to-text/api/v1/recognize?apikey:Xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" when i try to run the code it gives me:

NOTICE: created client ssl context for default WARN: lws_client_handshake: got bad HTTP response '401' ERR: CLIENT_CONNECTION_ERROR: HS: ws upgrade unauthorized but when i change i.port to 80 the error is:

NOTICE: created client ssl context for default ERR: CLIENT_CONNECTION_ERROR: Timed out waiting SSL USER: Completed Failed

the whole code is :

/* * lws-minimal-ws-client * * Copyright (C) 2018 Andy Green * * This file is made available under the Creative Commons CC0 1.0 * Universal Public Domain Dedication. * * This demonstrates the a minimal ws client using lws. * * It connects to https://libwebsockets.org/ and makes a * wss connection to the dumb-increment protocol there. While * connected, it prints the numbers it is being sent by * dumb-increment protocol. */

#include <libwebsockets.h>
#include <string.h>
#include <signal.h>

static int interrupted, rx_seen, test; static struct lws *client_wsi;

static int callback_dumb_increment(struct lws *wsi, enum lws_callback_reasons reason,
          void *user, void *in, size_t len) {   switch (reason) {

    /* because we are protocols[0] ... */   case LWS_CALLBACK_CLIENT_CONNECTION_ERROR:      lwsl_err("CLIENT_CONNECTION_ERROR: %s\n",
             in ? (char *)in : "(null)");       client_wsi = NULL;      break;

    case LWS_CALLBACK_CLIENT_ESTABLISHED:       lwsl_user("%s: established\n", __func__);       break;

    case LWS_CALLBACK_CLIENT_RECEIVE:       lwsl_user("RX: %s\n", (const char
*)in);      rx_seen++;      if (test && rx_seen == 10)          interrupted = 1;        break;

    case LWS_CALLBACK_CLIENT_CLOSED:        client_wsi = NULL;      break;

    default:        break;  }

    return lws_callback_http_dummy(wsi, reason, user, in, len); }

static const struct lws_protocols protocols[] = {   {       "dumb-increment-protocol",      callback_dumb_increment,        0,      0,  },  { NULL, NULL, 0, 0 } };

static void sigint_handler(int sig) {   interrupted = 1; }

int main(int argc, const char **argv) {     struct lws_context_creation_info info;  struct lws_client_connect_info i;   struct lws_context *context;    const char *p;  int n = 0, logs = LLL_USER | LLL_ERR | LLL_WARN | LLL_NOTICE        /* for LLL_ verbosity above NOTICE to be built into lws, lws         * must have been configured with -DCMAKE_BUILD_TYPE=DEBUG       * instead of =RELEASE */       /* | LLL_INFO */ /* | LLL_PARSER */ /* | LLL_HEADER */      /* | LLL_EXT */ /* | LLL_CLIENT */ /* | LLL_LATENCY */      /* | LLL_DEBUG */;

    signal(SIGINT, sigint_handler);     if ((p = lws_cmdline_option(argc, argv, "-d")))         logs = atoi(p);

    test = !!lws_cmdline_option(argc, argv, "-t");

    lws_set_log_level(logs, NULL);  lwsl_user("LWS minimal ws client rx [-d <logs>] [--h2] [-t (test)]\n");

    memset(&info, 0, sizeof info); /* otherwise uninitialized garbage */    info.options = LWS_SERVER_OPTION_DO_SSL_GLOBAL_INIT;    info.port = CONTEXT_PORT_NO_LISTEN; /* we do not run any server */  info.protocols
= protocols;
#if defined(LWS_WITH_MBEDTLS)   /*   * OpenSSL uses the system trust store.  mbedTLS has to be told which    * CA to trust explicitly.   */         //info.client_ssl_ca_filepath = "./libwebsockets.org.cer";

        info.client_ssl_ca_filepath = "/home/wafa/stt/*watsonplatformnet.crt";
#endif

    context = lws_create_context(&info);    if (!context) {         lwsl_err("lws init failed\n");      return 1;   }

    memset(&i, 0, sizeof i); /* otherwise uninitialized garbage */  i.context = context;    i.port = 443;   i.address = "gateway-lon.watsonplatform.net";   i.path = "/speech-to-text/api/v1/recognize?apikey:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";  //i.address = "libwebsockets.org";  i.host = i.address;     i.origin = i.address;   i.ssl_connection = LCCSCF_USE_SSL;  i.protocol = protocols[0].name; /* "dumb-increment-protocol" */     i.pwsi = &client_wsi;

    if (lws_cmdline_option(argc, argv, "--h2"))         i.alpn = "h2";

    lws_client_connect_via_info(&i);

    while (n >= 0 && client_wsi && !interrupted)        n = lws_service(context, 1000);

    lws_context_destroy(context);

    lwsl_user("Completed %s\n", rx_seen > 10 ? "OK" : "Failed");

    return rx_seen > 10; }

Solution

  • You really need to show the code that you are using to connect to the Speech To Text service rather than the code that you based it on, because that will the code that you have your coding error in. In the absence of which I can only speculate what you might have done wrong.

    Number 1: You should be connecting to something that looks like a web socket address and not a http address. eg.

    wss://stream.watsonplatform.net/speech-to-text/api/v1/recognize

    but with a london endpoint address.