Fork of the working HTTPClient adaptation using CyaSSL. This version adds a derivation of HTTPText called HTTPJson to emit JSON text properly. Additionally, the URL parser has defines that permit longer URLs to be utilized.

Dependencies:   mbedTLSLibrary

Dependents:   SalesforceInterface df-2014-heroku-thermostat-k64f SalesforceInterface

Fork of HTTPClient by wolf SSL

This is a fork of the working HTTPS/SSL library that contains two extensions:

- HTTPJson - a derivation of HTTPText for emitting JSON strings specifically. No JSON parsing/checking is accomplished - HTTPJson simply sets the right Content-Type for HTTP(S).

- Expanded internal buffers for longer URLs. This is set in HTTPClient.cpp and is tunable.

Revision:
46:7cd69cc809b8
Parent:
45:abd90d8a363f
Child:
48:db30340571c9
--- a/HTTPClient.cpp	Fri Sep 19 21:41:29 2014 +0000
+++ b/HTTPClient.cpp	Sun Sep 21 07:08:35 2014 +0000
@@ -17,11 +17,7 @@
  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
  */
  
-// DMA: Added tunable to adapt size of larger input URLs
-#define MAX_URL_HOSTNAME_LENGTH 128
-#define MAX_URL_PATH_LENGTH     128
-
-// DMA: RTOS for Thread definition
+// RTOS for Thread definition
 #include "rtos.h"
 
 //Debug is disabled by default
@@ -63,17 +59,36 @@
 // ************ should be a better way to adjust for platform limitations
 
 #if defined (TARGET_K64F)
-    // can use larger buffers since we have more memory
-    #define CHUNK_SIZE    768
-    #define SEND_BUF_SIZE 1280
+    // can use larger buffers since we have (lots) more memory
+    #define BIG_MEMORY_CHUNK        4096
+    #define CHUNK_SIZE              768
+    #define SEND_BUF_SIZE           BIG_MEMORY_CHUNK
+    #define MAX_URL_HOSTNAME_LENGTH 256 
+    #define MAX_URL_PATH_LENGTH     BIG_MEMORY_CHUNK
+    #define MAX_HEADER_VALUE_LENGTH BIG_MEMORY_CHUNK
+    #define MAX_HEADER_KEY_LENGTH   40
+    #define HEADER_SCANF_FORMAT     "%40[^:]: %4096[^\r\n]" /* must align with BIG_MEMORY_CHUNK */ 
+    #define REDIRECT_SCANF_FORMAT   "%40[^:]: %4096[^\r\n]" /* must align with BIG_MEMORY_CHUNK */
 #elif defined (TARGET_C027)
-    // can use larger buffers since we have more memory
-    #define CHUNK_SIZE    256
-    #define SEND_BUF_SIZE 1100
+    // default smaller buffers
+    #define CHUNK_SIZE              256
+    #define SEND_BUF_SIZE           1100
+    #define MAX_URL_HOSTNAME_LENGTH 128
+    #define MAX_URL_PATH_LENGTH     128
+    #define MAX_HEADER_VALUE_LENGTH 41
+    #define MAX_HEADER_KEY_LENGTH   40
+    #define HEADER_SCANF_FORMAT     "%40[^:]: %40[^\r\n]"   /* must align with MAX_HEADER_VALUE_LENGTH */ 
+    #define REDIRECT_SCANF_FORMAT   "%40[^:]: %128[^\r\n]"  /* must align with MAX_URL_PATH_LENGTH */
 #else
     // default smaller buffers
-    #define CHUNK_SIZE    256
-    #define SEND_BUF_SIZE 1100
+    #define CHUNK_SIZE              256
+    #define SEND_BUF_SIZE           1100
+    #define MAX_URL_HOSTNAME_LENGTH 128
+    #define MAX_URL_PATH_LENGTH     128
+    #define MAX_HEADER_VALUE_LENGTH 41
+    #define MAX_HEADER_KEY_LENGTH   40
+    #define HEADER_SCANF_FORMAT     "%40[^:]: %40[^\r\n]"   /* must align with MAX_HEADER_VALUE_LENGTH */ 
+    #define REDIRECT_SCANF_FORMAT   "%40[^:]: %128[^\r\n]"  /* must align with MAX_URL_PATH_LENGTH */
 #endif
 
 // ************ should be a better way to adjust for platform limitations
@@ -276,11 +291,14 @@
 
 HTTPResult HTTPClient::connect(const char* url, HTTP_METH method, IHTTPDataOut* pDataOut, IHTTPDataIn* pDataIn, int timeout) //Execute request
 {
-    CYASSL_METHOD * SSLmethod ;
+    CYASSL_METHOD * SSLmethod = NULL;
     m_httpResponseCode = 0; //Invalidate code
     m_timeout = timeout;
     redirect = 0 ;
     
+    // reset the send buffer
+    memset(send_buf,0,SEND_BUF_SIZE);
+        
     pDataIn->writeReset();
     if( pDataOut ) {
         pDataOut->readReset();
@@ -539,13 +557,13 @@
 
         buf[crlfPos] = '\0';
 
-        char key[41];
-        char value[41];
-
-        memset(key,0,41);
-        memset(value,0,41);
-
-        int n = sscanf(buf, "%40[^:]: %40[^\r\n]", key, value);
+        char key[MAX_HEADER_KEY_LENGTH+1];
+        memset(key,0,MAX_HEADER_KEY_LENGTH+1);
+        
+        char value[MAX_HEADER_VALUE_LENGTH+1];
+        memset(value,0,MAX_HEADER_VALUE_LENGTH+1);
+        
+        int n = sscanf(buf, HEADER_SCANF_FORMAT, key, value);
         if ( n == 2 ) {
             DBG("Read header : %s: %s\n", key, value);
             if( !strcmp(key, "Content-Length") ) {
@@ -558,8 +576,8 @@
                 }
             } else if( !strcmp(key, "Content-Type") ) {
                 pDataIn->setDataType(value);
-            } else if( !strcmp(key, "location") && redirect_url) {
-                sscanf(buf, "%40[^:]: %128[^\r\n]", key, redirect_url);
+            } else if( !strcmp(key, "Location") && redirect_url) {      // Location is capitalized...
+                sscanf(buf, REDIRECT_SCANF_FORMAT, key, redirect_url);
                 DBG("Redirect %s: %s", key, redirect_url) ;
                 redirect = 1 ;
             }
@@ -808,6 +826,7 @@
 
 HTTPResult HTTPClient::parseURL(const char* url, char* scheme, size_t maxSchemeLen, char* host, size_t maxHostLen, uint16_t* port, char* path, size_t maxPathLen)   //Parse URL
 {
+    DBG("Parsing URL: %s",url);
     char* schemePtr = (char*) url;
     char* hostPtr = (char*) strstr(url, "://");
     if(hostPtr == NULL) {
@@ -872,8 +891,9 @@
     HTTPResult ret ; 
     ret = send("Authorization: Bearer ") ;
     CHECK_CONN_ERR(ret);
+    strcat((char *)m_oauthToken,"\n");
     DBG("oauthToken: %s", m_oauthToken) ;
-    ret = send((char *)m_oauthToken) ;
+    ret = send((char *)m_oauthToken);
     CHECK_CONN_ERR(ret); 
     return HTTP_OK ;
 }