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

Committer:
aktk
Date:
Fri Mar 23 07:40:26 2018 +0000
Revision:
18:ad5c461905bd
Parent:
handlers/Filehandler.cpp@17:ce5845164001
rename: Filehandler.h -> FileHandler.h

Who changed what in which revision?

UserRevisionLine numberNew contents of line
aktk 0:cc483bea4fe3 1 #include "FileHandler.h"
aktk 16:c3920b5b8572 2 //#ifndef DEBUG
aktk 16:c3920b5b8572 3 #define FILE_HANDLER_DEBUG
aktk 16:c3920b5b8572 4 //#endif
aktk 17:ce5845164001 5 LocalFileSystem local("local");
aktk 16:c3920b5b8572 6
aktk 16:c3920b5b8572 7 namespace FILE_HANDLER
aktk 16:c3920b5b8572 8 {
aktk 16:c3920b5b8572 9 void DEBUG_PRINT_NAME()
aktk 16:c3920b5b8572 10 {
aktk 16:c3920b5b8572 11 #ifdef FILE_HANDLER_DEBUG
aktk 16:c3920b5b8572 12 printf("(DEBUG LINE: FILE_HANDLER) ");
aktk 16:c3920b5b8572 13 #endif
aktk 16:c3920b5b8572 14 }
aktk 16:c3920b5b8572 15
aktk 16:c3920b5b8572 16 void DEBUG_PRINT_LINE(const char* arg_line)
aktk 16:c3920b5b8572 17 {
aktk 16:c3920b5b8572 18 #ifdef FILE_HANDLER_DEBUG
aktk 16:c3920b5b8572 19 DEBUG_PRINT_NAME();
aktk 16:c3920b5b8572 20 printf(arg_line);
aktk 16:c3920b5b8572 21 printf("\r\n");
aktk 0:cc483bea4fe3 22 #endif
aktk 16:c3920b5b8572 23 }
aktk 16:c3920b5b8572 24 template<typename T>
aktk 16:c3920b5b8572 25 void DEBUG_PRINT_LINE(const char* arg_line, T arg_t)
aktk 16:c3920b5b8572 26 {
aktk 16:c3920b5b8572 27 #ifdef FILE_HANDLER_DEBUG
aktk 16:c3920b5b8572 28 DEBUG_PRINT_NAME();
aktk 16:c3920b5b8572 29 printf(arg_line, arg_t);
aktk 16:c3920b5b8572 30 printf("\r\n");
aktk 16:c3920b5b8572 31 #endif
aktk 16:c3920b5b8572 32 }
aktk 16:c3920b5b8572 33 template<typename T1, typename T2>
aktk 16:c3920b5b8572 34 void DEBUG_PRINT_LINE(const char* arg_line, T1 arg_t1, T2 arg_t2)
aktk 16:c3920b5b8572 35 {
aktk 16:c3920b5b8572 36 #ifdef FILE_HANDLER_DEBUG
aktk 16:c3920b5b8572 37 DEBUG_PRINT_NAME();
aktk 16:c3920b5b8572 38 printf(arg_line, arg_t1, arg_t2);
aktk 16:c3920b5b8572 39 printf("\r\n");
aktk 16:c3920b5b8572 40 #endif
aktk 16:c3920b5b8572 41 }
aktk 16:c3920b5b8572 42 }
aktk 16:c3920b5b8572 43 using namespace FILE_HANDLER;
aktk 16:c3920b5b8572 44
aktk 0:cc483bea4fe3 45 FileHandler::FileHandler()
aktk 0:cc483bea4fe3 46 {
aktk 0:cc483bea4fe3 47 fullpath = NULL;
aktk 0:cc483bea4fe3 48 filename = NULL;
aktk 0:cc483bea4fe3 49 suffix = NULL;
aktk 0:cc483bea4fe3 50 fp = NULL;
aktk 0:cc483bea4fe3 51 file_size = 0;
aktk 0:cc483bea4fe3 52 }
aktk 0:cc483bea4fe3 53 FileHandler::~FileHandler()
aktk 0:cc483bea4fe3 54 {
aktk 0:cc483bea4fe3 55 if (fullpath != NULL) free(fullpath);
aktk 0:cc483bea4fe3 56 if (fp != NULL) fclose(fp);
aktk 0:cc483bea4fe3 57 }
aktk 0:cc483bea4fe3 58
aktk 0:cc483bea4fe3 59 FILE* FileHandler::open
aktk 0:cc483bea4fe3 60 ( const char* arg_filepath,
aktk 0:cc483bea4fe3 61 const char* arg_mode
aktk 0:cc483bea4fe3 62 )
aktk 0:cc483bea4fe3 63 {
aktk 0:cc483bea4fe3 64 FILE *tmp;
aktk 0:cc483bea4fe3 65
aktk 17:ce5845164001 66 DEBUG_PRINT_LINE("fp: %d", fp);
aktk 0:cc483bea4fe3 67 if (fullpath != NULL) free(fullpath);
aktk 17:ce5845164001 68 // Allocating memory for fullpath;
aktk 17:ce5845164001 69 // [[+ strlen("index.htm") + 1]] at the end of line is ONLY a MARGIN allowed for concatenating the string.
aktk 0:cc483bea4fe3 70 fullpath = (char*)malloc(sizeof(char) * (strlen("/local/") + strlen(arg_filepath) + strlen("index.htm") + 1));
aktk 0:cc483bea4fe3 71
aktk 0:cc483bea4fe3 72 // Path formatting
aktk 0:cc483bea4fe3 73 if (arg_filepath[0] == '/') {
aktk 0:cc483bea4fe3 74 sprintf(fullpath, "/local/%s", arg_filepath + 1);
aktk 0:cc483bea4fe3 75 } else {
aktk 0:cc483bea4fe3 76 sprintf(fullpath, "/local/%s", arg_filepath);
aktk 0:cc483bea4fe3 77 }
aktk 0:cc483bea4fe3 78 // if the argument has no file name but directory, defalt settiing.
aktk 0:cc483bea4fe3 79 if (fullpath[strlen(fullpath) - 1] == '/')
aktk 0:cc483bea4fe3 80 strcat(fullpath, "index.htm");
aktk 17:ce5845164001 81 DEBUG_PRINT_LINE("full-file-path: %s", fullpath);
aktk 16:c3920b5b8572 82 // store the file name part into a pointer
aktk 0:cc483bea4fe3 83 filename = strrchr(fullpath, '/');
aktk 17:ce5845164001 84 // remove '/' and just get only the file name.
aktk 17:ce5845164001 85 if(filename != NULL) filename++;
aktk 0:cc483bea4fe3 86 // store the suffix part to a pointer
aktk 0:cc483bea4fe3 87 suffix = strchr(filename, '.');
aktk 17:ce5845164001 88 // remove '.' and just get only the suffix.
aktk 17:ce5845164001 89 if(suffix != NULL) suffix++;
aktk 17:ce5845164001 90 DEBUG_PRINT_LINE("!!Public function check...");
aktk 17:ce5845164001 91 DEBUG_PRINT_LINE(" full path: %s", getFullpath());
aktk 17:ce5845164001 92 DEBUG_PRINT_LINE(" filename : %s", getFilename());
aktk 17:ce5845164001 93 DEBUG_PRINT_LINE(" suffix : %s", getSuffix());
aktk 17:ce5845164001 94 DEBUG_PRINT_LINE("...DONE!!");
aktk 17:ce5845164001 95 DEBUG_PRINT_LINE("fopen(...)");
aktk 17:ce5845164001 96 DEBUG_PRINT_LINE(" path: %s", fullpath);
aktk 17:ce5845164001 97 DEBUG_PRINT_LINE(" mode: %s", arg_mode);
aktk 0:cc483bea4fe3 98 fp = fopen(fullpath, arg_mode);
aktk 17:ce5845164001 99 if(fp != NULL) {
aktk 17:ce5845164001 100 DEBUG_PRINT_LINE("file opened");
aktk 17:ce5845164001 101 DEBUG_PRINT_LINE("fp: %d", fp);
aktk 17:ce5845164001 102 } else {
aktk 17:ce5845164001 103 DEBUG_PRINT_LINE("Something is wrong @fopen(...)");
aktk 17:ce5845164001 104 }
aktk 0:cc483bea4fe3 105 // mesure file size
aktk 0:cc483bea4fe3 106 file_size = 0;
aktk 0:cc483bea4fe3 107 tmp = fp;
aktk 0:cc483bea4fe3 108 if(tmp != NULL ) {
aktk 11:0ee7d100db24 109 ////printf("\r\nfile content\r\n");
aktk 0:cc483bea4fe3 110 int ctmp;
aktk 0:cc483bea4fe3 111 while(1) {
aktk 0:cc483bea4fe3 112 ctmp = fgetc(tmp);
aktk 0:cc483bea4fe3 113 if(ctmp != EOF) {
aktk 11:0ee7d100db24 114 //////printf("%c", ctmp);
aktk 0:cc483bea4fe3 115 file_size++;
aktk 0:cc483bea4fe3 116 } else {
aktk 11:0ee7d100db24 117 //////printf("[EOF]\r\n");
aktk 0:cc483bea4fe3 118 break;
aktk 0:cc483bea4fe3 119 }
aktk 0:cc483bea4fe3 120 }
aktk 11:0ee7d100db24 121 ////printf("file size: %d\r\n", file_size);
aktk 0:cc483bea4fe3 122 if(fseek(tmp, 0L, SEEK_SET) != 0) {
aktk 11:0ee7d100db24 123 //////printf("fseek failed\r\n");
aktk 0:cc483bea4fe3 124 }
aktk 0:cc483bea4fe3 125 } else {
aktk 0:cc483bea4fe3 126 file_size = 0;
aktk 0:cc483bea4fe3 127 }
aktk 0:cc483bea4fe3 128
aktk 0:cc483bea4fe3 129 return fp;
aktk 0:cc483bea4fe3 130 }
aktk 0:cc483bea4fe3 131 int FileHandler::close()
aktk 0:cc483bea4fe3 132 {
aktk 0:cc483bea4fe3 133 int tmp;
aktk 7:184c6f1ace94 134
aktk 7:184c6f1ace94 135 if(fp != NULL) {
aktk 0:cc483bea4fe3 136 tmp = fclose(fp);
aktk 0:cc483bea4fe3 137 fp = NULL;
aktk 0:cc483bea4fe3 138 return tmp;
aktk 7:184c6f1ace94 139 } else {
aktk 0:cc483bea4fe3 140 return 1;
aktk 0:cc483bea4fe3 141 }
aktk 0:cc483bea4fe3 142 }
aktk 0:cc483bea4fe3 143
aktk 0:cc483bea4fe3 144 int FileHandler::getc()
aktk 0:cc483bea4fe3 145 {
aktk 0:cc483bea4fe3 146 int tmp = fgetc(fp);
aktk 11:0ee7d100db24 147 #ifdef DEBUG
aktk 0:cc483bea4fe3 148 if(0x20 < tmp && tmp < 0x7e)
aktk 0:cc483bea4fe3 149 printf("%c", tmp);
aktk 0:cc483bea4fe3 150 else if (tmp == '\r')
aktk 0:cc483bea4fe3 151 printf("\r");
aktk 0:cc483bea4fe3 152 else if (tmp == '\n')
aktk 0:cc483bea4fe3 153 printf("\n");
aktk 0:cc483bea4fe3 154 else
aktk 0:cc483bea4fe3 155 printf("@");
aktk 11:0ee7d100db24 156 #endif
aktk 11:0ee7d100db24 157 return tmp;
aktk 0:cc483bea4fe3 158 }
aktk 0:cc483bea4fe3 159 bool FileHandler::arrival()
aktk 0:cc483bea4fe3 160 {
aktk 0:cc483bea4fe3 161 return (bool)fp;
aktk 0:cc483bea4fe3 162 }
aktk 0:cc483bea4fe3 163 bool FileHandler::atEOF()
aktk 0:cc483bea4fe3 164 {
aktk 0:cc483bea4fe3 165 return (bool)feof(fp);
aktk 0:cc483bea4fe3 166 }
aktk 0:cc483bea4fe3 167 bool FileHandler::hasError()
aktk 0:cc483bea4fe3 168 {
aktk 0:cc483bea4fe3 169 return (bool)ferror(fp);
aktk 0:cc483bea4fe3 170 }
aktk 0:cc483bea4fe3 171 char *FileHandler::getFullpath()
aktk 0:cc483bea4fe3 172 {
aktk 0:cc483bea4fe3 173 return fullpath;
aktk 0:cc483bea4fe3 174 }
aktk 0:cc483bea4fe3 175 char *FileHandler::getFilename()
aktk 0:cc483bea4fe3 176 {
aktk 0:cc483bea4fe3 177 return filename;
aktk 0:cc483bea4fe3 178 }
aktk 0:cc483bea4fe3 179 char *FileHandler::getSuffix()
aktk 0:cc483bea4fe3 180 {
aktk 0:cc483bea4fe3 181 return suffix;
aktk 0:cc483bea4fe3 182 }
aktk 0:cc483bea4fe3 183 int FileHandler::getFileSize()
aktk 0:cc483bea4fe3 184 {
aktk 0:cc483bea4fe3 185 return file_size;
aktk 0:cc483bea4fe3 186 }