A client for the SmartREST protocol from Cumulocity.

Dependencies:   SmartRest

Fork of MbedSmartRest by Vincent Wochnik

Committer:
vwochnik
Date:
Tue Apr 15 16:57:53 2014 +0000
Revision:
15:0ce90c525e7a
Parent:
14:dc3f8dd5c02b
Child:
16:ee4f052c7570
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 15:0ce90c525e7a 8 const char *cContentLength = "Content-Length: ";
vwochnik 14:dc3f8dd5c02b 9
vwochnik 14:dc3f8dd5c02b 10 HTTPResponseFilter::HTTPResponseFilter(AbstractDataSource& source) : _source(source), _state(RESPF_STATE_INIT)
vwochnik 14:dc3f8dd5c02b 11 {
vwochnik 15:0ce90c525e7a 12 _length = _read = 0;
vwochnik 14:dc3f8dd5c02b 13 }
vwochnik 14:dc3f8dd5c02b 14
vwochnik 14:dc3f8dd5c02b 15 HTTPResponseFilter::~HTTPResponseFilter()
vwochnik 14:dc3f8dd5c02b 16 {
vwochnik 14:dc3f8dd5c02b 17 }
vwochnik 14:dc3f8dd5c02b 18
vwochnik 14:dc3f8dd5c02b 19 char HTTPResponseFilter::read()
vwochnik 14:dc3f8dd5c02b 20 {
vwochnik 14:dc3f8dd5c02b 21 if (_state != RESPF_STATE_READ_HEADERS)
vwochnik 14:dc3f8dd5c02b 22 return 0;
vwochnik 14:dc3f8dd5c02b 23 return _source.read();
vwochnik 14:dc3f8dd5c02b 24 }
vwochnik 14:dc3f8dd5c02b 25
vwochnik 14:dc3f8dd5c02b 26 uint8_t HTTPResponseFilter::status()
vwochnik 14:dc3f8dd5c02b 27 {
vwochnik 14:dc3f8dd5c02b 28 if (_state != RESPF_STATE_READ_HEADERS)
vwochnik 14:dc3f8dd5c02b 29 return DS_STATUS_ERROR;
vwochnik 14:dc3f8dd5c02b 30 return _source.status();
vwochnik 14:dc3f8dd5c02b 31 }
vwochnik 14:dc3f8dd5c02b 32
vwochnik 14:dc3f8dd5c02b 33 uint16_t HTTPResponseFilter::readStatus()
vwochnik 14:dc3f8dd5c02b 34 {
vwochnik 14:dc3f8dd5c02b 35 uint16_t res = 0; uint8_t state = 0; char c; size_t offset = 0; uint8_t status;
vwochnik 14:dc3f8dd5c02b 36
vwochnik 14:dc3f8dd5c02b 37 if (_state != RESPF_STATE_INIT)
vwochnik 14:dc3f8dd5c02b 38 return 0;
vwochnik 14:dc3f8dd5c02b 39
vwochnik 14:dc3f8dd5c02b 40 while ((state < 3) && (((c = _source.read()) > 0) || ((status = _source.status()) == DS_STATUS_OK))) {
vwochnik 14:dc3f8dd5c02b 41 switch (state) {
vwochnik 14:dc3f8dd5c02b 42 case 0: // read expected status line
vwochnik 14:dc3f8dd5c02b 43 if ((cExpectedStatus[offset] != c) && (cExpectedStatus[offset] != '*'))
vwochnik 14:dc3f8dd5c02b 44 state = 3;
vwochnik 14:dc3f8dd5c02b 45 offset++;
vwochnik 14:dc3f8dd5c02b 46 if (offset == strlen(cExpectedStatus)) {
vwochnik 14:dc3f8dd5c02b 47 state = 1;
vwochnik 14:dc3f8dd5c02b 48 }
vwochnik 14:dc3f8dd5c02b 49 break;
vwochnik 14:dc3f8dd5c02b 50 case 1:
vwochnik 14:dc3f8dd5c02b 51 if (isspace(c))
vwochnik 14:dc3f8dd5c02b 52 state = 2;
vwochnik 14:dc3f8dd5c02b 53 if (isdigit(c))
vwochnik 14:dc3f8dd5c02b 54 res = (res * 10) + (c - '0');
vwochnik 14:dc3f8dd5c02b 55 break;
vwochnik 14:dc3f8dd5c02b 56 case 2:
vwochnik 14:dc3f8dd5c02b 57 if (c == '\n')
vwochnik 14:dc3f8dd5c02b 58 state = 3;
vwochnik 14:dc3f8dd5c02b 59 break;
vwochnik 14:dc3f8dd5c02b 60 }
vwochnik 14:dc3f8dd5c02b 61 }
vwochnik 14:dc3f8dd5c02b 62
vwochnik 14:dc3f8dd5c02b 63 if ((status != DS_STATUS_OK) || (state != 3))
vwochnik 14:dc3f8dd5c02b 64 return 0;
vwochnik 14:dc3f8dd5c02b 65
vwochnik 14:dc3f8dd5c02b 66 _state = RESPF_STATE_READ_STATUS;
vwochnik 14:dc3f8dd5c02b 67 return res;
vwochnik 14:dc3f8dd5c02b 68 }
vwochnik 14:dc3f8dd5c02b 69
vwochnik 14:dc3f8dd5c02b 70 bool HTTPResponseFilter::skipHeaders()
vwochnik 14:dc3f8dd5c02b 71 {
vwochnik 14:dc3f8dd5c02b 72 uint16_t res = 0; uint8_t state = 0; char c; size_t offset = 0; uint8_t status;
vwochnik 14:dc3f8dd5c02b 73
vwochnik 14:dc3f8dd5c02b 74 if (_state != RESPF_STATE_READ_STATUS)
vwochnik 14:dc3f8dd5c02b 75 return false;
vwochnik 14:dc3f8dd5c02b 76
vwochnik 15:0ce90c525e7a 77 while ((state < 5) && (((c = _source.read()) > 0) || ((status = _source.status()) == DS_STATUS_OK))) {
vwochnik 14:dc3f8dd5c02b 78 switch (state) {
vwochnik 14:dc3f8dd5c02b 79 case 0: // start of line
vwochnik 15:0ce90c525e7a 80 if (offset == 0) {
vwochnik 15:0ce90c525e7a 81 if (cContentLength[0] == c)
vwochnik 14:dc3f8dd5c02b 82 state = 1;
vwochnik 15:0ce90c525e7a 83 if (c == '\r')
vwochnik 15:0ce90c525e7a 84 state = 4;
vwochnik 14:dc3f8dd5c02b 85 } else {
vwochnik 15:0ce90c525e7a 86 if (c == '\r')
vwochnik 15:0ce90c525e7a 87 state = 3;
vwochnik 14:dc3f8dd5c02b 88 }
vwochnik 15:0ce90c525e7a 89 offset++;
vwochnik 14:dc3f8dd5c02b 90 break;
vwochnik 14:dc3f8dd5c02b 91 case 1:
vwochnik 15:0ce90c525e7a 92 if (offset == strlen(cContentLength)
vwochnik 15:0ce90c525e7a 93 state = 2;
vwochnik 15:0ce90c525e7a 94 else if (c == '\r')
vwochnik 15:0ce90c525e7a 95 state = 3;
vwochnik 15:0ce90c525e7a 96 else if (cContentLength[offset] != c)
vwochnik 15:0ce90c525e7a 97 state = 0;
vwochnik 15:0ce90c525e7a 98 offset++;
vwochnik 15:0ce90c525e7a 99 break;
vwochnik 15:0ce90c525e7a 100 case 2:
vwochnik 15:0ce90c525e7a 101 if (isdigit(c))
vwochnik 15:0ce90c525e7a 102 _length = (_length * 10) + (c - '0');
vwochnik 15:0ce90c525e7a 103 else if (c == '\r')
vwochnik 15:0ce90c525e7a 104 state = 3;
vwochnik 15:0ce90c525e7a 105 else
vwochnik 15:0ce90c525e7a 106 state = 0;
vwochnik 15:0ce90c525e7a 107 offset++;
vwochnik 15:0ce90c525e7a 108 break;
vwochnik 15:0ce90c525e7a 109 case 3:
vwochnik 14:dc3f8dd5c02b 110 if (c == '\n') {
vwochnik 14:dc3f8dd5c02b 111 state = 0;
vwochnik 14:dc3f8dd5c02b 112 offset = 0;
vwochnik 14:dc3f8dd5c02b 113 }
vwochnik 14:dc3f8dd5c02b 114 break;
vwochnik 15:0ce90c525e7a 115 case 4:
vwochnik 14:dc3f8dd5c02b 116 if (c == '\n')
vwochnik 15:0ce90c525e7a 117 state = 5;
vwochnik 14:dc3f8dd5c02b 118 break;
vwochnik 14:dc3f8dd5c02b 119 }
vwochnik 14:dc3f8dd5c02b 120 }
vwochnik 14:dc3f8dd5c02b 121
vwochnik 14:dc3f8dd5c02b 122 if ((status != DS_STATUS_OK) || (state != 3))
vwochnik 14:dc3f8dd5c02b 123 return false;
vwochnik 14:dc3f8dd5c02b 124
vwochnik 14:dc3f8dd5c02b 125 _state = RESPF_STATE_READ_HEADERS;
vwochnik 14:dc3f8dd5c02b 126 return true;
vwochnik 14:dc3f8dd5c02b 127 }
vwochnik 14:dc3f8dd5c02b 128
vwochnik 14:dc3f8dd5c02b 129 void HTTPResponseFilter::reset()
vwochnik 14:dc3f8dd5c02b 130 {
vwochnik 14:dc3f8dd5c02b 131 _state = RESPF_STATE_INIT;
vwochnik 15:0ce90c525e7a 132 _length = _read = 0;
vwochnik 14:dc3f8dd5c02b 133 }