The lib with which to make LPC1768 a simple HTTP server. This have not yet implemented. fopen() DOESN'T WORK after EthernetInterface::connect() is called as using mbed-os 5.4~. See also https://os.mbed.com/questions/80658/HardFault-occurs-when-fopen-is-called-af/ or https://github.com/ARMmbed/mbed-os/issues/6578 and https://github.com/ARMmbed/mbed-os/issues/6624

Fork of HTTP_SERVER by Akifumi Takahashi

Revision:
0:cc483bea4fe3
Child:
1:3a1fe94c6e42
--- /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