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.
Dependents: SalesforceInterface df-2014-heroku-thermostat-k64f SalesforceInterface
Fork of HTTPClient by
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, committed 2014-09-21
- Comitter:
- ansond
- Date:
- Sun Sep 21 07:08:35 2014 +0000
- Parent:
- 45:abd90d8a363f
- Child:
- 47:8a6098f41d15
- Commit message:
- lots of fixes for redirection and oauth token usage
Changed in this revision
HTTPClient.cpp | Show annotated file Show diff for this revision Revisions of this file |
--- 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 ; }