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:
- 0:cc483bea4fe3
- Child:
- 1:3a1fe94c6e42
diff -r 000000000000 -r cc483bea4fe3 handlers/ResponseMessenger.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/handlers/ResponseMessenger.cpp Tue Feb 16 10:59:31 2016 +0000 @@ -0,0 +1,180 @@ +#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'; + header_field_buffer[0]='\0'; + // Response Header + 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 = 4; + char registered_field_name[nField][32]= { + "Connection", + "Location", + "Keep-Alive", + "Content-Type" + }; + 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("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("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::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("[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("[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("[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("buffer log: %s", buffer); + } + if (arg_file.hasError()) printf("\r\n[ERR][ERR][ERR]\r\n"); + if (arg_file.atEOF()) printf("\r\n[EOF][EOF][EOF]\r\n"); + } while (!arg_file.atEOF() && !arg_file.hasError()); + printf("[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("[No Body]\r\n"); + } + return (char)err_code; +} \ No newline at end of file