Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: SalesforceInterface df-2014-heroku-thermostat-k64f SalesforceInterface
Fork of HTTPClient by
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 ;
}
