Ejemplo n.º 1
0
void clubby_proto_handler(struct mg_connection *nc, int ev, void *ev_data) {
  struct clubby_event evt;

  switch (ev) {
    case MG_EV_CONNECT: {
      evt.ev = CLUBBY_NET_CONNECT;
      evt.net_connect.success = (*(int *) ev_data == 0);

      LOG(LL_DEBUG, ("CONNECT (%d)", evt.net_connect.success));

      s_clubby_cb(&evt);

      if (evt.net_connect.success) {
        char *proto = NULL;
        (void) asprintf(
            &proto,
            "Sec-WebSocket-Protocol: %s\r\n"
            "Sec-WebSocket-Extensions: %s-encoding; in=json; out=ubjson\r\n",
            WS_PROTOCOL, WS_PROTOCOL);
        mg_send_websocket_handshake(nc, "/", proto);
        free(proto);
      }
      break;
    }

    case MG_EV_WEBSOCKET_HANDSHAKE_DONE: {
      LOG(LL_DEBUG, ("HANDSHAKE DONE"));
      nc->flags |= MG_F_CLUBBY_CONNECTED;
      evt.ev = CLUBBY_CONNECT;
      s_clubby_cb(&evt);
      break;
    }

    case MG_EV_WEBSOCKET_FRAME: {
      struct websocket_message *wm = (struct websocket_message *) ev_data;
      LOG(LL_DEBUG,
          ("GOT FRAME (%d): %.*s", (int) wm->size, (int) wm->size, wm->data));
      evt.frame.data.p = (char *) wm->data;
      /*
       * Mostly debug event, CLUBBY_REQUEST_RECEIVED and
       * CLUBY_RESPONSE_RECEIVED will be send as well
       */
      evt.frame.data.len = wm->size;
      evt.ev = CLUBBY_FRAME;
      s_clubby_cb(&evt);

      clubby_proto_handle_frame(evt.frame.data);

      break;
    }

    case MG_EV_CLOSE:
      LOG(LL_DEBUG, ("CLOSE"));
      nc->flags &= ~MG_F_CLUBBY_CONNECTED;
      s_clubby_conn = NULL;
      evt.ev = CLUBBY_DISCONNECT;
      s_clubby_cb(&evt);
      break;
  }
}
Ejemplo n.º 2
0
static void clubby_proto_handler(struct mg_connection *nc, int ev,
                                 void *ev_data) {
  struct clubby_event evt;

  switch (ev) {
    case MG_EV_CONNECT: {
      evt.ev = CLUBBY_NET_CONNECT;
      evt.net_connect.success = (*(int *) ev_data == 0);
      evt.context = nc->user_data;

      LOG(LL_DEBUG, ("CONNECT (%d)", evt.net_connect.success));

      s_clubby_cb(&evt);
      break;
    }

    case MG_EV_WEBSOCKET_HANDSHAKE_DONE: {
      LOG(LL_DEBUG, ("HANDSHAKE DONE"));
      nc->flags |= MG_F_CLUBBY_CONNECTED;
      evt.ev = CLUBBY_CONNECT;
      evt.context = nc->user_data;
      s_clubby_cb(&evt);
      break;
    }

    case MG_EV_WEBSOCKET_FRAME: {
      struct websocket_message *wm = (struct websocket_message *) ev_data;
      LOG(LL_DEBUG,
          ("GOT FRAME (%d): %.*s", (int) wm->size, (int) wm->size, wm->data));
      clubby_proto_handle_frame((char *) wm->data, wm->size, nc->user_data);

      break;
    }

    case MG_EV_CLOSE:
      LOG(LL_DEBUG, ("CLOSE"));
      nc->flags &= ~MG_F_CLUBBY_CONNECTED;
      evt.ev = CLUBBY_DISCONNECT;
      evt.context = nc->user_data;
      s_clubby_cb(&evt);
      break;
  }
}