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

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers ResponseMessenger.cpp Source File

ResponseMessenger.cpp

00001 #include "ResponseMessenger.h"
00002 
00003 const char ResponseMessenger::http_ver[9] = "HTTP/1.1";
00004 ResponseMessenger::ResponseMessenger()
00005 {
00006     //  Status-Line
00007     status_code         = 0;
00008     reason_phrase[0]    = '\0';
00009     header_field_buffer[0]='\0';
00010     //  Response Header
00011 }
00012 ResponseMessenger::~ResponseMessenger()
00013 {
00014 }
00015 int ResponseMessenger::resetHeader()
00016 {
00017     //  Status-Line
00018     status_code         = 0;
00019     reason_phrase[0]    = '\0';
00020     //  Response Header
00021     header_field_buffer[0]='\0';
00022     return 0;
00023 }
00024 int ResponseMessenger::setStatusLine(
00025     int arg_status_code,
00026     const char* arg_reason_phrase
00027 )
00028 {
00029     status_code = arg_status_code;
00030     strcpy(reason_phrase, arg_reason_phrase);
00031 
00032     //  To be safe on the sage side
00033     reason_phrase[REASON_PHRASE_SIZE - 1] = '\0';
00034     //  Send 0 if arg str size is too big, else -1.
00035     if (strlen(arg_reason_phrase) < REASON_PHRASE_SIZE)
00036         return 0;
00037     else
00038         return -1;
00039 }
00040 
00041 int ResponseMessenger::setHeaderField(
00042     const char* arg_field_name, const char* arg_field_val)
00043 {
00044     const int nField = 7;
00045     char registered_field_name[nField][32]= {
00046         "Connection",
00047         "Location",
00048         "Keep-Alive",
00049         "Content-Type",
00050         "Upgrade",
00051         "Sec-WebSocket-Accept",
00052         "Access-Control-Allow-Origin"
00053     };
00054     bool flag = false;
00055     char header_field_line_buffer[128];
00056     int  buffer_size = strlen(header_field_buffer);
00057 
00058     for (int i = 0; i < nField; i++) {
00059         if(strcmp(arg_field_name, registered_field_name[i]) == 0)
00060             flag = true;
00061     }
00062     if(flag) {
00063         sprintf(header_field_line_buffer, "%s: %s\r\n", arg_field_name, arg_field_val);
00064         strcat(header_field_buffer, header_field_line_buffer);
00065         //printf("(RM) header field: \r\n%s\r\n", header_field_buffer);
00066     }
00067     //  To be safe on the sage side
00068     header_field_buffer[HEADER_FIELDS_SIZE - 1] = '\0';
00069     //  Send 0 if arg str size is too big, else -1.
00070     if (buffer_size + strlen(arg_field_name) + strlen(arg_field_val) < HEADER_FIELDS_SIZE + 1)
00071         return 0;
00072     else
00073         return -1;
00074 }
00075 
00076 int ResponseMessenger::setHeaderField(
00077     const char* arg_field_name, int arg_field_val)
00078 {
00079     const int nField = 1;
00080     char registered_field_name[nField][32]= {
00081         "Content-Length"
00082     };
00083     bool flag = false;
00084     char header_field_line_buffer[128];
00085     int  buffer_size = strlen(header_field_buffer);
00086 
00087     for (int i = 0; i < nField; i++) {
00088         if(strcmp(arg_field_name, registered_field_name[i]) == 0)
00089             flag = true;
00090     }
00091     if(flag) {
00092         sprintf(header_field_line_buffer, "%s: %d\r\n", arg_field_name, arg_field_val);
00093         strcat(header_field_buffer, header_field_line_buffer);
00094         //printf("(RM) header field: \r\n%s\r\n", header_field_buffer);
00095     }
00096     //  To be safe on the sage side
00097     header_field_buffer[HEADER_FIELDS_SIZE - 1] = '\0';
00098     //  Send 0 if arg str size is too big, else -1.
00099     if (buffer_size + strlen(arg_field_name) + 10 < HEADER_FIELDS_SIZE + 1)
00100         return 0;
00101     else
00102         return -1;
00103 }
00104 
00105 int ResponseMessenger::rmHeaderField(
00106     const char* arg_field_name)
00107 {
00108     char* removedLineHead;
00109     char* removedLineEnd;
00110     int  buffer_size;
00111 
00112     //  Look for the head of the line to want to remove
00113     removedLineHead = strstr(header_field_buffer, arg_field_name);
00114     if(removedLineHead == NULL) return -1;
00115     //  Look for the first "\r\n" which is the end of the line
00116     removedLineEnd = strstr(removedLineHead, "\r\n");
00117     removedLineEnd += 3; //pointing next line head or '\0' if the line of the last one.
00118     buffer_size = strlen(removedLineEnd);
00119 
00120     for(int i = 0; i < buffer_size + 1; i++)
00121         removedLineHead[i] = removedLineEnd[i];
00122 
00123     return 0;
00124 }
00125 
00126 int  ResponseMessenger::getStatusCode()
00127 {
00128     return status_code;
00129 }
00130 
00131 char ResponseMessenger::sendHTTPResponse(
00132     TCPSocket &arg_socket)
00133 {
00134     int err_log  = 0;
00135     int err_code = 0;
00136     enum {
00137         MAX_BUFFER_SIZE = 1024
00138     };
00139     char buffer[MAX_BUFFER_SIZE] = "\0";
00140 
00141     //
00142     //  Header
00143     //
00144     printf("(RM) [send]Header\r\n");
00145     //  Status Line
00146     sprintf(buffer, "%s %d %s\r\n", http_ver, status_code, reason_phrase);
00147     buffer[MAX_BUFFER_SIZE - 1] = '\0';
00148     err_log = arg_socket.send(buffer, strlen(buffer));
00149     if(err_log < 0) err_code = ((err_code << 1) | 1);
00150     //  Response Header
00151     err_log = arg_socket.send(header_field_buffer, strlen(header_field_buffer));
00152     if(err_log < 0) err_code = ((err_code << 1) | 1);
00153     //  Blank line
00154     err_log = arg_socket.send("\r\n", strlen("\r\n"));
00155     if(err_log < 0) err_code = ((err_code << 1) | 1);
00156     printf("(RM) [Header has sent]\r\n");
00157     //return error code
00158     return err_code << 2;
00159 
00160 }
00161 
00162 char ResponseMessenger::sendHTTPResponse(
00163     TCPSocket &arg_socket,
00164     FileHandler &arg_file)
00165 {
00166     int err_log  = 0;
00167     int err_code = 0;
00168     enum {
00169         MAX_BUFFER_SIZE = 1024
00170     };
00171     signed char buffer[MAX_BUFFER_SIZE];
00172 
00173     //
00174     //  Header
00175     //
00176     err_code = sendHTTPResponse(arg_socket);
00177     //
00178     //  Body
00179     //
00180     printf("(RM) file: %d\r\n"
00181     "(RM) status code: %d\r\n", arg_file.arrival(), status_code);
00182     if (arg_file.arrival() && status_code == 200) {
00183         printf("(RM) [send]Body\r\n");
00184         do {
00185             int i = 0;
00186             do {
00187                 buffer[i++] = arg_file.getc();//return a byte from file ponter, or -1 if EOF or ERROR
00188             } while ((i < MAX_BUFFER_SIZE - 1) && (buffer[i - 1] != EOF));
00189             if(buffer[i - 1] == EOF)buffer[i - 1] = '\0';
00190             buffer[i] = '\0';
00191             if (!arg_file.hasError()) {
00192                 err_log = arg_socket.send((char*)buffer, i);
00193                 //printf("(RM) buffer log: %s",  buffer);
00194             }
00195             if (arg_file.hasError()) printf("(RM)---[ERR]---\r\n");
00196             if (arg_file.atEOF())    printf("(RM)---[EOF]---\r\n");
00197         } while (!arg_file.atEOF() && !arg_file.hasError());
00198         printf("(RM) [Body has sent]\r\n");
00199 
00200         if (err_log < 0) err_code = ((err_code) | 2);
00201         if (!arg_file.hasError())err_code = ((err_code) | 1);
00202     } else {
00203         printf("(RM) [No Body]\r\n");
00204     }
00205     return (char)err_code;
00206 }