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 26:bf979804b653, committed 2014-07-21
- Comitter:
- wolfSSL
- Date:
- Mon Jul 21 11:30:29 2014 +0000
- Parent:
- 25:531f03a263a9
- Commit message:
Changed in this revision
| HTTPClient.cpp | Show annotated file Show diff for this revision Revisions of this file |
| HTTPClient.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/HTTPClient.cpp Sat Jul 12 12:09:38 2014 +0000
+++ b/HTTPClient.cpp Mon Jul 21 11:30:29 2014 +0000
@@ -114,6 +114,10 @@
ctx = 0 ;
ssl = 0 ;
SSLver = 3 ;
+ m_basicAuthUser = NULL ;
+ redirect_url = NULL ;
+ redirect = 0 ;
+ header = NULL ;
}
HTTPClient::~HTTPClient()
@@ -163,11 +167,17 @@
return m_httpResponseCode;
}
-void HTTPClient::setHeader(char * h)
+void HTTPClient::setHeader(const char * h)
{
header = h ;
}
+void HTTPClient::setLocationBuf(char * url, int size)
+{
+ redirect_url = url ;
+ redirect_url_size = size ;
+}
+
HTTPResult HTTPClient::setSSLversion(int minorV)
{
if((minorV>=0) && (minorV<=3))
@@ -213,7 +223,8 @@
CYASSL_METHOD * SSLmethod ;
m_httpResponseCode = 0; //Invalidate code
m_timeout = timeout;
-
+ redirect = 0 ;
+
pDataIn->writeReset();
if( pDataOut ) {
pDataOut->readReset();
@@ -263,7 +274,7 @@
if(port == HTTPS_PORT) {
/* Start SSL connect */
- DBG("SSLmethod=%d", SSLmethod) ;
+ DBG("SSLver=%d", SSLver) ;
if(ctx == NULL) {
switch(SSLver) {
case 0 : SSLmethod = CyaSSLv3_client_method() ; break ;
@@ -316,6 +327,9 @@
//Send default headers
DBG("Sending headers");
+ if(m_basicAuthUser) {
+ bAuth() ; /* send out Basic Auth header */
+ }
if( pDataOut != NULL ) {
if( pDataOut->getIsChunked() ) {
ret = send("Transfer-Encoding: chunked\r\n");
@@ -332,14 +346,11 @@
ret = send(buf);
CHECK_CONN_ERR(ret);
}
- if(m_basicAuthUser) {
- bAuth() ; /* send out Basic Auth header */
- }
}
//Add user headers
if(header) {
- ret = send(header);
+ ret = send((char *)header);
CHECK_CONN_ERR(ret);
}
@@ -421,7 +432,7 @@
PRTCL_ERR();
}
- if( (m_httpResponseCode < 200) || (m_httpResponseCode >= 300) ) {
+ if( (m_httpResponseCode < 200) || (m_httpResponseCode >= 400) ) {
//Did not return a 2xx code; TODO fetch headers/(&data?) anyway and implement a mean of writing/reading headers
WARN("Response code %d", m_httpResponseCode);
PRTCL_ERR();
@@ -481,8 +492,11 @@
}
} else if( !strcmp(key, "Content-Type") ) {
pDataIn->setDataType(value);
+ } else if( !strcmp(key, "location") && redirect_url) {
+ sscanf(buf, "%31[^:]: %128[^\r\n]", key, redirect_url);
+ DBG("Redirect %s: %s", key, redirect_url) ;
+ redirect = 1 ;
}
-
memmove(buf, &buf[crlfPos+2], trfLen - (crlfPos + 2) + 1); //Be sure to move NULL-terminating char as well
trfLen -= (crlfPos + 2);
@@ -584,8 +598,8 @@
cyassl_free() ;
m_sock.close();
DBG("Completed HTTP transaction");
-
- return HTTP_OK;
+ if(redirect)return HTTP_REDIRECT ;
+ else return HTTP_OK;
}
HTTPResult HTTPClient::recv(char* buf, size_t minLen, size_t maxLen, size_t* pReadLen) //0 on success, err code on failure
@@ -796,6 +810,7 @@
ret = send("Authorization: Basic ") ;
CHECK_CONN_ERR(ret);
sprintf(base64buff, "%s:%s", m_basicAuthUser, m_basicAuthPassword) ;
+ DBG("bAuth: %s", base64buff) ;
base64enc(b_auth, base64buff) ;
b_auth[strlen(b_auth)+1] = '\0' ;
b_auth[strlen(b_auth)] = '\n' ;
--- a/HTTPClient.h Sat Jul 12 12:09:38 2014 +0000
+++ b/HTTPClient.h Mon Jul 21 11:30:29 2014 +0000
@@ -43,6 +43,7 @@
HTTP_TIMEOUT, ///<Connection timeout
HTTP_CONN, ///<Connection error
HTTP_CLOSED, ///<Connection was closed by remote host
+ HTTP_REDIRECT, ///<HTTP 300 - 303
HTTP_OK = 0, ///<Success
};
@@ -121,8 +122,9 @@
*/
int getHTTPResponseCode();
- void setHeader(char *header) ; /* set http headers */
+ void setHeader(const char *header) ; /* set http headers */
HTTPResult setSSLversion(int minorV) ; /* set SSL/TLS version. 0: SSL3, 1: TLS1.0, 2: TLS1.1, 3: TLS1.2 */
+ void setLocationBuf(char *url, int size) ; /* set URL buffer for redirection */
private:
enum HTTP_METH {
@@ -140,6 +142,7 @@
HTTPResult parseURL(const char* url, char* scheme, size_t maxSchemeLen, char* host, size_t maxHostLen, uint16_t* port, char* path, size_t maxPathLen); //Parse URL
void cyassl_free(void) ;
HTTPResult bAuth(void) ;
+ HTTPResult readHeader(void) ;
//Parameters
@@ -149,8 +152,11 @@
const char* m_basicAuthPassword;
int m_httpResponseCode;
- char * header ;
-
+ const char * header ;
+ char * redirect_url ;
+ int redirect_url_size ;
+ int redirect ;
+
/* for CyaSSL */
int SSLver ;
uint16_t port;
