Simple HTTP Server with one page index.html stored inside MBED as char vector and javascript to update a table content
Fork of HTTP_SERVER by
Diff: handlers/ResponseMessenger.cpp
- Revision:
- 14:f21da0acc9f6
- Parent:
- 13:b6dd6ed0060b
--- a/handlers/ResponseMessenger.cpp Fri Mar 16 21:55:50 2018 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,204 +0,0 @@ -#include "ResponseMessenger.h" - -const char ResponseMessenger::http_ver[9] = "HTTP/1.1"; -ResponseMessenger::ResponseMessenger() -{ - // Status-Line - status_code = 0; - reason_phrase[0] = '\0'; - header_field_buffer[0]='\0'; - // Response Header -} -ResponseMessenger::~ResponseMessenger() -{ -} -int ResponseMessenger::resetHeader() -{ - // Status-Line - status_code = 0; - reason_phrase[0] = '\0'; - // Response Header - header_field_buffer[0]='\0'; - return 0; -} -int ResponseMessenger::setStatusLine( - int arg_status_code, - const char* arg_reason_phrase -) -{ - status_code = arg_status_code; - strcpy(reason_phrase, arg_reason_phrase); - - // To be safe on the sage side - reason_phrase[REASON_PHRASE_SIZE - 1] = '\0'; - // Send 0 if arg str size is too big, else -1. - if (strlen(arg_reason_phrase) < REASON_PHRASE_SIZE) - return 0; - else - return -1; -} - -int ResponseMessenger::setHeaderField( - const char* arg_field_name, const char* arg_field_val) -{ - const int nField = 7; - char registered_field_name[nField][32]= { - "Connection", - "Location", - "Keep-Alive", - "Content-Type", - "Upgrade", - "Sec-WebSocket-Accept", - "Access-Control-Allow-Origin" - }; - bool flag = false; - char header_field_line_buffer[128]; - int buffer_size = strlen(header_field_buffer); - - for (int i = 0; i < nField; i++) { - if(strcmp(arg_field_name, registered_field_name[i]) == 0) - flag = true; - } - if(flag) { - sprintf(header_field_line_buffer, "%s: %s\r\n", arg_field_name, arg_field_val); - strcat(header_field_buffer, header_field_line_buffer); - //printf("(RM) header field: \r\n%s\r\n", header_field_buffer); - } - // To be safe on the sage side - header_field_buffer[HEADER_FIELDS_SIZE - 1] = '\0'; - // Send 0 if arg str size is too big, else -1. - if (buffer_size + strlen(arg_field_name) + strlen(arg_field_val) < HEADER_FIELDS_SIZE + 1) - return 0; - else - return -1; -} - -int ResponseMessenger::setHeaderField( - const char* arg_field_name, int arg_field_val) -{ - const int nField = 1; - char registered_field_name[nField][32]= { - "Content-Length" - }; - bool flag = false; - char header_field_line_buffer[128]; - int buffer_size = strlen(header_field_buffer); - - for (int i = 0; i < nField; i++) { - if(strcmp(arg_field_name, registered_field_name[i]) == 0) - flag = true; - } - if(flag) { - sprintf(header_field_line_buffer, "%s: %d\r\n", arg_field_name, arg_field_val); - strcat(header_field_buffer, header_field_line_buffer); - //printf("(RM) header field: \r\n%s\r\n", header_field_buffer); - } - // To be safe on the sage side - header_field_buffer[HEADER_FIELDS_SIZE - 1] = '\0'; - // Send 0 if arg str size is too big, else -1. - if (buffer_size + strlen(arg_field_name) + 10 < HEADER_FIELDS_SIZE + 1) - return 0; - else - return -1; -} - -int ResponseMessenger::rmHeaderField( - const char* arg_field_name) -{ - char* removedLineHead; - char* removedLineEnd; - int buffer_size; - - // Look for the head of the line to want to remove - removedLineHead = strstr(header_field_buffer, arg_field_name); - if(removedLineHead == NULL) return -1; - // Look for the first "\r\n" which is the end of the line - removedLineEnd = strstr(removedLineHead, "\r\n"); - removedLineEnd += 3; //pointing next line head or '\0' if the line of the last one. - buffer_size = strlen(removedLineEnd); - - for(int i = 0; i < buffer_size + 1; i++) - removedLineHead[i] = removedLineEnd[i]; - - return 0; -} - -int ResponseMessenger::getStatusCode() -{ - return status_code; -} - -char ResponseMessenger::sendHTTPResponse( - TCPSocketConnection &arg_connection) -{ - int err_log = 0; - int err_code = 0; - enum { - MAX_BUFFER_SIZE = 1024 - }; - char buffer[MAX_BUFFER_SIZE] = "\0"; - - // - // Header - // - printf("(RM) [send]Header\r\n"); - // Status Line - sprintf(buffer, "%s %d %s\r\n", http_ver, status_code, reason_phrase); - buffer[MAX_BUFFER_SIZE - 1] = '\0'; - err_log = arg_connection.send_all(buffer, strlen(buffer)); - if(err_log < 0) err_code = ((err_code << 1) | 1); - // Response Header - err_log = arg_connection.send_all(header_field_buffer, strlen(header_field_buffer)); - if(err_log < 0) err_code = ((err_code << 1) | 1); - // Blank line - err_log = arg_connection.send_all("\r\n", strlen("\r\n")); - if(err_log < 0) err_code = ((err_code << 1) | 1); - printf("(RM) [Header has sent]\r\n"); - //return error code - return err_code << 2; - -} - -char ResponseMessenger::sendHTTPResponse( - TCPSocketConnection &arg_connection, - FileHandler &arg_file) -{ - int err_log = 0; - int err_code = 0; - enum { - MAX_BUFFER_SIZE = 1024 - }; - signed char buffer[MAX_BUFFER_SIZE]; - - // - // Header - // - err_code = sendHTTPResponse(arg_connection); - // - // Body - // - if (arg_file.arrival() && status_code == 200) { - printf("(RM) [send]Body\r\n"); - do { - int i = 0; - do { - buffer[i++] = arg_file.getc();//return a byte from file ponter, or -1 if EOF or ERROR - } while ((i < MAX_BUFFER_SIZE - 1) && (buffer[i - 1] != EOF)); - if(buffer[i - 1] == EOF)buffer[i - 1] = '\0'; - buffer[i] = '\0'; - if (!arg_file.hasError()) { - err_log = arg_connection.send_all((char*)buffer, i); - //printf("(RM) buffer log: %s", buffer); - } - if (arg_file.hasError()) printf("(RM)---[ERR]---\r\n"); - if (arg_file.atEOF()) printf("(RM)---[EOF]---\r\n"); - } while (!arg_file.atEOF() && !arg_file.hasError()); - printf("(RM) [Body has sent]\r\n"); - - if (err_log < 0) err_code = ((err_code) | 2); - if (!arg_file.hasError())err_code = ((err_code) | 1); - } else { - printf("(RM) [No Body]\r\n"); - } - return (char)err_code; -} \ No newline at end of file