Example node for Yodiwo's Plegma API

Dependencies:   EthernetInterface FXOS8700Q HTTPClient HTTPD MQTTS SDFileSystem YodiwoPlegma mbed-rpc mbed-rtos mbed wolfSSL

pairing_http_handler.cpp

Committer:
mitsarionas
Date:
2015-09-28
Revision:
5:1ef168357347
Parent:
2:b7489c070d1f

File content as of revision 5:1ef168357347:

#include "EthernetInterface.h"
#include "HTTPD.h"
#include "string.h"
#include "pairing_backend.h"
#include "pairing_http_handler.h"

HTTPD *httpd;
pairing_context pairing_state;
onPaired_callback pairing_done_cb;
EthernetInterface *interface;
void pairing_handler (int id);
int server_port; //TODO: get this from HTTPD?


int startpairing(int id);
int next(int id);

int start_pairing_http_server(void *ifdata, int port, onPaired_callback onPaired)
{
    interface = (EthernetInterface *)ifdata;
    pairing_done_cb = onPaired;
    httpd = new HTTPD;
//    httpd->attach("/cgi-bin/", &callback_cgi);
//    httpd->attach("/ws/", &callback_ws);
    httpd->attach("/pairing/", &pairing_handler);
    httpd->attach("/", "/sd/www/");
    return httpd->start(port);
}

void pairing_handler (int id)
{
    if (!strcmp(httpd->getFilename(id), "startpairing")) {
        if (!startpairing(id)) {
            return;
        }
    } else if (!strcmp(httpd->getFilename(id), "next")) {
        if (!next(id)) {
            return;
        }

    } else {
        httpd->httpdError(id, 404);
    }
    httpd->httpdError(id, 400);
}

int startpairing(int id)
{
    char urlBase[100];
    int i;
    printf("starting pairing...\n");
    pairing_context_init_from_config(&pairing_state, pairing_done_cb);
    pairing_get_tokens(&pairing_state);
    
    int idx = 0;
    i = 0;
    char *uri = httpd->getUri(id);
    while (uri[i] != '\0') {
        if (uri[i] == '/') {
            idx = i;
        }
        i++;
    }
    urlBase[0] = '\0';
    strncat(urlBase, uri, idx + 1);
    char *redirect = get_server_phase2_url(&pairing_state, interface->getIPAddress(), server_port, urlBase);
    printf("redirect url: %s\n", redirect);
    if (redirect) {
        httpd->redirect(id, 302, redirect, NULL, 0, NULL);
        free(redirect);
        return 0;
    }
    return -1;
}

int next(int id)
{
    char buf[300];
    int ret;
    ret = pairing_get_keys(&pairing_state);
    if (ret) {
        return ret;
    }
    pairing_done_cb(pairing_state.nodeKey, pairing_state.secretKey);
    sprintf(buf, "OK\r\nnodeKey: %s\r\nsecretKey: %s\r\n", pairing_state.nodeKey, pairing_state.secretKey);
    httpd->send(id, buf, strlen(buf), "Content-Type: text/plain\r\n");
    return 0;
}