A client for the SmartREST protocol from Cumulocity.

Dependencies:   SmartRest

Fork of MbedSmartRest by Vincent Wochnik

Committer:
vwochnik
Date:
Mon Apr 14 11:23:50 2014 +0000
Revision:
14:dc3f8dd5c02b
Child:
15:0ce90c525e7a
fix

Who changed what in which revision?

UserRevisionLine numberNew contents of line
vwochnik 14:dc3f8dd5c02b 1 #include "HTTPResponseFilter.h"
vwochnik 14:dc3f8dd5c02b 2 #include <stdlib.h>
vwochnik 14:dc3f8dd5c02b 3 #include <string.h>
vwochnik 14:dc3f8dd5c02b 4 #include <ctype.h>
vwochnik 14:dc3f8dd5c02b 5 #include <stdio.h>
vwochnik 14:dc3f8dd5c02b 6
vwochnik 14:dc3f8dd5c02b 7 const char *cExpectedStatus = "HTTP/1.* ";
vwochnik 14:dc3f8dd5c02b 8
vwochnik 14:dc3f8dd5c02b 9 HTTPResponseFilter::HTTPResponseFilter(AbstractDataSource& source) : _source(source), _state(RESPF_STATE_INIT)
vwochnik 14:dc3f8dd5c02b 10 {
vwochnik 14:dc3f8dd5c02b 11 }
vwochnik 14:dc3f8dd5c02b 12
vwochnik 14:dc3f8dd5c02b 13 HTTPResponseFilter::~HTTPResponseFilter()
vwochnik 14:dc3f8dd5c02b 14 {
vwochnik 14:dc3f8dd5c02b 15 }
vwochnik 14:dc3f8dd5c02b 16
vwochnik 14:dc3f8dd5c02b 17 char HTTPResponseFilter::read()
vwochnik 14:dc3f8dd5c02b 18 {
vwochnik 14:dc3f8dd5c02b 19 if (_state != RESPF_STATE_READ_HEADERS)
vwochnik 14:dc3f8dd5c02b 20 return 0;
vwochnik 14:dc3f8dd5c02b 21 return _source.read();
vwochnik 14:dc3f8dd5c02b 22 }
vwochnik 14:dc3f8dd5c02b 23
vwochnik 14:dc3f8dd5c02b 24 uint8_t HTTPResponseFilter::status()
vwochnik 14:dc3f8dd5c02b 25 {
vwochnik 14:dc3f8dd5c02b 26 if (_state != RESPF_STATE_READ_HEADERS)
vwochnik 14:dc3f8dd5c02b 27 return DS_STATUS_ERROR;
vwochnik 14:dc3f8dd5c02b 28 return _source.status();
vwochnik 14:dc3f8dd5c02b 29 }
vwochnik 14:dc3f8dd5c02b 30
vwochnik 14:dc3f8dd5c02b 31 uint16_t HTTPResponseFilter::readStatus()
vwochnik 14:dc3f8dd5c02b 32 {
vwochnik 14:dc3f8dd5c02b 33 uint16_t res = 0; uint8_t state = 0; char c; size_t offset = 0; uint8_t status;
vwochnik 14:dc3f8dd5c02b 34
vwochnik 14:dc3f8dd5c02b 35 if (_state != RESPF_STATE_INIT)
vwochnik 14:dc3f8dd5c02b 36 return 0;
vwochnik 14:dc3f8dd5c02b 37
vwochnik 14:dc3f8dd5c02b 38 while ((state < 3) && (((c = _source.read()) > 0) || ((status = _source.status()) == DS_STATUS_OK))) {
vwochnik 14:dc3f8dd5c02b 39 switch (state) {
vwochnik 14:dc3f8dd5c02b 40 case 0: // read expected status line
vwochnik 14:dc3f8dd5c02b 41 if ((cExpectedStatus[offset] != c) && (cExpectedStatus[offset] != '*'))
vwochnik 14:dc3f8dd5c02b 42 state = 3;
vwochnik 14:dc3f8dd5c02b 43 offset++;
vwochnik 14:dc3f8dd5c02b 44 if (offset == strlen(cExpectedStatus)) {
vwochnik 14:dc3f8dd5c02b 45 state = 1;
vwochnik 14:dc3f8dd5c02b 46 }
vwochnik 14:dc3f8dd5c02b 47 break;
vwochnik 14:dc3f8dd5c02b 48 case 1:
vwochnik 14:dc3f8dd5c02b 49 if (isspace(c))
vwochnik 14:dc3f8dd5c02b 50 state = 2;
vwochnik 14:dc3f8dd5c02b 51 if (isdigit(c))
vwochnik 14:dc3f8dd5c02b 52 res = (res * 10) + (c - '0');
vwochnik 14:dc3f8dd5c02b 53 break;
vwochnik 14:dc3f8dd5c02b 54 case 2:
vwochnik 14:dc3f8dd5c02b 55 if (c == '\n')
vwochnik 14:dc3f8dd5c02b 56 state = 3;
vwochnik 14:dc3f8dd5c02b 57 break;
vwochnik 14:dc3f8dd5c02b 58 }
vwochnik 14:dc3f8dd5c02b 59 }
vwochnik 14:dc3f8dd5c02b 60
vwochnik 14:dc3f8dd5c02b 61 if ((status != DS_STATUS_OK) || (state != 3))
vwochnik 14:dc3f8dd5c02b 62 return 0;
vwochnik 14:dc3f8dd5c02b 63
vwochnik 14:dc3f8dd5c02b 64 _state = RESPF_STATE_READ_STATUS;
vwochnik 14:dc3f8dd5c02b 65 return res;
vwochnik 14:dc3f8dd5c02b 66 }
vwochnik 14:dc3f8dd5c02b 67
vwochnik 14:dc3f8dd5c02b 68 bool HTTPResponseFilter::skipHeaders()
vwochnik 14:dc3f8dd5c02b 69 {
vwochnik 14:dc3f8dd5c02b 70 uint16_t res = 0; uint8_t state = 0; char c; size_t offset = 0; uint8_t status;
vwochnik 14:dc3f8dd5c02b 71
vwochnik 14:dc3f8dd5c02b 72 if (_state != RESPF_STATE_READ_STATUS)
vwochnik 14:dc3f8dd5c02b 73 return false;
vwochnik 14:dc3f8dd5c02b 74
vwochnik 14:dc3f8dd5c02b 75 while ((state < 3) && (((c = _source.read()) > 0) || ((status = _source.status()) == DS_STATUS_OK))) {
vwochnik 14:dc3f8dd5c02b 76 switch (state) {
vwochnik 14:dc3f8dd5c02b 77 case 0: // start of line
vwochnik 14:dc3f8dd5c02b 78 if (c == '\r') {
vwochnik 14:dc3f8dd5c02b 79 if (offset == 0)
vwochnik 14:dc3f8dd5c02b 80 state = 2;
vwochnik 14:dc3f8dd5c02b 81 else
vwochnik 14:dc3f8dd5c02b 82 state = 1;
vwochnik 14:dc3f8dd5c02b 83 } else {
vwochnik 14:dc3f8dd5c02b 84 offset++;
vwochnik 14:dc3f8dd5c02b 85 }
vwochnik 14:dc3f8dd5c02b 86 break;
vwochnik 14:dc3f8dd5c02b 87 case 1:
vwochnik 14:dc3f8dd5c02b 88 if (c == '\n') {
vwochnik 14:dc3f8dd5c02b 89 state = 0;
vwochnik 14:dc3f8dd5c02b 90 offset = 0;
vwochnik 14:dc3f8dd5c02b 91 }
vwochnik 14:dc3f8dd5c02b 92 break;
vwochnik 14:dc3f8dd5c02b 93 case 2:
vwochnik 14:dc3f8dd5c02b 94 if (c == '\n')
vwochnik 14:dc3f8dd5c02b 95 state = 3;
vwochnik 14:dc3f8dd5c02b 96 break;
vwochnik 14:dc3f8dd5c02b 97 }
vwochnik 14:dc3f8dd5c02b 98 }
vwochnik 14:dc3f8dd5c02b 99
vwochnik 14:dc3f8dd5c02b 100 if ((status != DS_STATUS_OK) || (state != 3))
vwochnik 14:dc3f8dd5c02b 101 return false;
vwochnik 14:dc3f8dd5c02b 102
vwochnik 14:dc3f8dd5c02b 103 _state = RESPF_STATE_READ_HEADERS;
vwochnik 14:dc3f8dd5c02b 104 return true;
vwochnik 14:dc3f8dd5c02b 105 }
vwochnik 14:dc3f8dd5c02b 106
vwochnik 14:dc3f8dd5c02b 107 void HTTPResponseFilter::reset()
vwochnik 14:dc3f8dd5c02b 108 {
vwochnik 14:dc3f8dd5c02b 109 _state = RESPF_STATE_INIT;
vwochnik 14:dc3f8dd5c02b 110 }