this is using the mbed os version 5-13-1

Dependencies:   mbed-http

Branch:
PassingRegression
Revision:
127:a21788227ca6
Parent:
126:9bc33f8b57d5
Child:
128:3a641aaad2d9
--- a/source/WiFiManager.cpp	Sun Jul 07 20:36:41 2019 +0000
+++ b/source/WiFiManager.cpp	Mon Jul 15 21:37:22 2019 +0000
@@ -51,8 +51,8 @@
     //_event_queue.call_every(10000, this, &WiFiManager::callWifiWatchDog);
     //keep_alive_id = _event_queue.call_every(CLOUD_KEEP_ALIVE_INTERVAL, this, &WiFiManager::callInternetKeepAlive);
     keep_alive_id = 0;
+    https_request_succeeded = false;
     //watchDogTick.attach(callback(this, &WiFiManager::callWifiWatchDogIsr), 10.0); // call flip function every 10 seconds
-    
 }
 
 WiFiManager::~WiFiManager()
@@ -61,6 +61,8 @@
     wifiWatchdogTimer.stop();
     socket->close();
     delete socket;
+    free(aws_id_token);
+    free(aws_refresh_token);    
 }
 //#define DISABLE_WATCHDOG
 
@@ -118,6 +120,7 @@
     // Send data
     nsapi_size_or_error_t error;
     //serr = socket->send("GET /nudgebox/v1 HTTP/1.0\r\nHost: https://dev2.dnanudge.io\r\n\r\n", 18);
+    dbg_printf(LOG, "\n[WIFI MAN] KEEP ALIVE SERVER REQUEST\r\n");
     error = socket->send(HELLO_MSG, sizeof(HELLO_MSG));
     
     if(error < 0)
@@ -133,7 +136,7 @@
     // Receive data
     char buf[500];
     error = socket->recv(buf, 500);
-    if(error >= 0)
+    if(error >= 0 && strstr(buf, "HTTP/1.1 200")!= NULL) // received HTTP 200 OK status
     {
         dbg_printf(LOG, "\n[WIFI MAN] KEEP ALIVE SERVER RESPONSE: \r\n %s\r\n", buf);
         queueATresponse(AT_SOCKET_KEEP_ALIVE_OK);
@@ -146,6 +149,70 @@
     }
 }
 
+void WiFiManager::CreateTokenHttpsRequest(char * httpsReq)
+{
+    
+    sprintf(httpsReq, "%s\r\n\r\n{\r\n\"AuthParameters\" : {\r\n"
+                     "\"USERNAME\" : \"%s\",\r\n\"PASSWORD\" : \"%s\"\r\n},\r\n"
+                     "\"AuthFlow\" : \"%s\",\r\n"
+                     "\"ClientId\" : \"%s\"\r\n}", TOKEN_REQ_HDR, UserName, Password, AuthFlow, ClientId);
+    dbg_printf(LOG, "\n[WIFI MAN] Cloud Access Token REQUEST:\r\n%s\r\n", httpsReq);
+}
+
+void WiFiManager::GetCloudAccessToken()
+{
+    // Send data
+    nsapi_size_or_error_t error;
+    dbg_printf(LOG, "\n[WIFI MAN] Get Cloud Access Token REQUEST\r\n");
+    char *httpsReq = new char[500];
+    httpsReq[0] = NULL;
+    CreateTokenHttpsRequest(httpsReq);
+    if(strlen(httpsReq) == 0)
+    {
+       queueATresponse(AT_SOCKET_KEEP_ALIVE_FAILED);
+       return;
+    }
+    error = socket->send(httpsReq, strlen(httpsReq)+1);
+    
+    if(error < 0)
+    {
+       queueATresponse(AT_SOCKET_KEEP_ALIVE_FAILED);
+       return;
+    }
+    
+    // Receive data
+    // reserve large buffer from heap to hold response
+    char *respBuf = new char[TOKEN_RESPONSE_SIZE]; 
+    error = socket->recv(respBuf, TOKEN_RESPONSE_SIZE);
+    if(error >= 0 && strstr(respBuf, "HTTP/1.1 200")!= NULL) // received HTTP 200 OK status
+    {
+        dbg_printf(LOG, "\n[WIFI MAN] ACCESS TOKEN RESPONSE: \r\n %s\r\n", respBuf);
+        // reserve memomry on the heap for tokens
+        aws_id_token      = new char[ID_TOKEN_SIZE]; 
+        aws_refresh_token = new char[REFRESH_TOKEN_SIZE];  
+        // extract ID TOKEN    
+        char *sp1 = strstr(respBuf,ID_TOKEN_STR_START);   
+        char *sp2 = strstr(respBuf,ACCESS_TOKEN_STR_END);  
+        int tokenLen = sp2-sp1;
+        strncpy(aws_id_token, sp1, tokenLen);
+        dbg_printf(LOG, "\n[WIFI MAN] IdToken: \r\n %s\r\n", aws_id_token);
+        // extract Refresh TOKEN    
+        sp1 = strstr(respBuf,REFRESH_TOKEN_STR_START);   
+        sp2 = strstr(respBuf,ACCESS_TOKEN_STR_END);  
+        tokenLen = sp2-sp1;
+        strncpy(aws_refresh_token, sp1, tokenLen);
+        dbg_printf(LOG, "\n[WIFI MAN] RefreshToken: \r\n %s\r\n", aws_refresh_token);       
+        queueATresponse(AT_SOCKET_KEEP_ALIVE_OK);
+        https_connection_active = true;
+    }
+    else
+    {
+       queueATresponse(AT_SOCKET_KEEP_ALIVE_FAILED);
+       https_connection_active = false;
+    }
+    delete respBuf;
+}
+
 
 void  WiFiManager::sendThreadATresponseString(const char * buf, at_cmd_resp_t at_cmd)
 {
@@ -446,6 +513,11 @@
                     }
                     sendATresponseString(AT_COMMAND_FAILED);
                 }
+                if(https_request_succeeded == false)
+                {
+                    https_request_succeeded = result;
+                }
+                
                 dbg_printf(LOG, "after call to send http request \n");
                 print_memory_info();
                 wifiCmd = WIFI_CMD_NONE;