HTTP File Server using SD Card for STM32F407VET6.
Dependencies: EthernetInterface SDFileSystem mbed-rtos mbed
Fork of Arch_Max_SD_HTTP_Server by
HTTP File Server using SD Card
This is a fork of a program first published by Ivan Georgiev.
- See https://os.mbed.com/users/hudakz/code/STM32F407VET6_Hello/ for more info about the Ethernet interface.
- See https://os.mbed.com/users/hudakz/code/STM32F407VET6_SDCard/ for more details on the SD Card slot.
main.cpp@4:4ddfbdaafbac, 2018-06-05 (annotated)
- Committer:
- hudakz
- Date:
- Tue Jun 05 08:11:10 2018 +0000
- Revision:
- 4:4ddfbdaafbac
- Parent:
- 3:aaf055cd9d06
Updated.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
azsymaivan | 0:fbb29d9ea96b | 1 | #include "mbed.h" |
azsymaivan | 0:fbb29d9ea96b | 2 | #include "EthernetInterface.h" |
azsymaivan | 0:fbb29d9ea96b | 3 | #include "SDFileSystem.h" |
azsymaivan | 0:fbb29d9ea96b | 4 | |
hudakz | 4:4ddfbdaafbac | 5 | #define EnDebugMSG false //true-> print debug message to PC USB terminal, false->not print |
hudakz | 4:4ddfbdaafbac | 6 | |
azsymaivan | 0:fbb29d9ea96b | 7 | #include "filelib.h" |
azsymaivan | 0:fbb29d9ea96b | 8 | |
hudakz | 4:4ddfbdaafbac | 9 | #define IP "192.168.1.184" |
azsymaivan | 0:fbb29d9ea96b | 10 | #define MASK "255.255.255.0" |
hudakz | 4:4ddfbdaafbac | 11 | #define GATEWAY "192.168.1.1" |
azsymaivan | 0:fbb29d9ea96b | 12 | #define PORT 80 |
azsymaivan | 0:fbb29d9ea96b | 13 | |
hudakz | 4:4ddfbdaafbac | 14 | Serial pc(USBTX, USBRX); // tx, rx |
hudakz | 4:4ddfbdaafbac | 15 | SDFileSystem sd(PC_3, PC_2, PB_10, PC_0, "wfs"); // mosi, miso, sck, cs |
hudakz | 4:4ddfbdaafbac | 16 | char sMethod[7]; |
hudakz | 4:4ddfbdaafbac | 17 | char sURL[250]; |
hudakz | 4:4ddfbdaafbac | 18 | char sProtocol[8]; |
hudakz | 4:4ddfbdaafbac | 19 | EthernetInterface eth; |
hudakz | 4:4ddfbdaafbac | 20 | TCPSocketServer svr; |
hudakz | 4:4ddfbdaafbac | 21 | bool serverIsListened = false; |
hudakz | 4:4ddfbdaafbac | 22 | TCPSocketConnection client; |
hudakz | 4:4ddfbdaafbac | 23 | bool clientIsConnected = false; |
hudakz | 4:4ddfbdaafbac | 24 | char sentBuffer[1608] = { }; // 2*536=1072, 3*536=1608, 4*536=2144 !1500 |
hudakz | 4:4ddfbdaafbac | 25 | char line_response[256] = { 0 }; |
hudakz | 4:4ddfbdaafbac | 26 | char file_path[256] = { 0 }; |
hudakz | 4:4ddfbdaafbac | 27 | DigitalOut led1(PA_6); //server listning status |
hudakz | 4:4ddfbdaafbac | 28 | Ticker ledTick; |
azsymaivan | 0:fbb29d9ea96b | 29 | |
hudakz | 4:4ddfbdaafbac | 30 | /** |
hudakz | 4:4ddfbdaafbac | 31 | * @brief |
hudakz | 4:4ddfbdaafbac | 32 | * @note |
hudakz | 4:4ddfbdaafbac | 33 | * @param |
hudakz | 4:4ddfbdaafbac | 34 | * @retval |
hudakz | 4:4ddfbdaafbac | 35 | */ |
azsymaivan | 0:fbb29d9ea96b | 36 | void ledTickfunc() |
azsymaivan | 0:fbb29d9ea96b | 37 | { |
hudakz | 4:4ddfbdaafbac | 38 | if (serverIsListened) |
azsymaivan | 0:fbb29d9ea96b | 39 | led1 = !led1; |
hudakz | 4:4ddfbdaafbac | 40 | else |
azsymaivan | 0:fbb29d9ea96b | 41 | led1 = false; |
azsymaivan | 0:fbb29d9ea96b | 42 | } |
azsymaivan | 0:fbb29d9ea96b | 43 | |
hudakz | 4:4ddfbdaafbac | 44 | /** |
hudakz | 4:4ddfbdaafbac | 45 | * @brief |
hudakz | 4:4ddfbdaafbac | 46 | * @note |
hudakz | 4:4ddfbdaafbac | 47 | * @param |
hudakz | 4:4ddfbdaafbac | 48 | * @retval |
hudakz | 4:4ddfbdaafbac | 49 | */ |
azsymaivan | 0:fbb29d9ea96b | 50 | void send_HTTP_header(char* protocol, int code, char* title, char* mime_type, long long lengthBody) |
azsymaivan | 0:fbb29d9ea96b | 51 | { |
hudakz | 4:4ddfbdaafbac | 52 | snprintf(line_response, sizeof(line_response), "%s %d %s\r\n", protocol, code, title); |
hudakz | 4:4ddfbdaafbac | 53 | snprintf(sentBuffer, sizeof(sentBuffer), "%s", line_response); |
azsymaivan | 0:fbb29d9ea96b | 54 | |
hudakz | 4:4ddfbdaafbac | 55 | if (mime_type != NULL) |
hudakz | 4:4ddfbdaafbac | 56 | { |
hudakz | 4:4ddfbdaafbac | 57 | snprintf(line_response, sizeof(line_response), "Content-Type: %s\r\n", mime_type); |
hudakz | 4:4ddfbdaafbac | 58 | snprintf(sentBuffer, sizeof(sentBuffer), "%s%s", sentBuffer, line_response); //append to sentBuffer |
azsymaivan | 0:fbb29d9ea96b | 59 | } |
hudakz | 4:4ddfbdaafbac | 60 | |
hudakz | 4:4ddfbdaafbac | 61 | if (lengthBody >= 0) |
hudakz | 4:4ddfbdaafbac | 62 | { |
hudakz | 4:4ddfbdaafbac | 63 | snprintf(line_response, sizeof(line_response), "Content-Length: %lld\r\n", lengthBody); |
hudakz | 4:4ddfbdaafbac | 64 | snprintf(sentBuffer, sizeof(sentBuffer), "%s%s", sentBuffer, line_response); //append to sentBuffer |
azsymaivan | 0:fbb29d9ea96b | 65 | } |
azsymaivan | 0:fbb29d9ea96b | 66 | |
hudakz | 4:4ddfbdaafbac | 67 | snprintf(line_response, sizeof(line_response), "Connection: close\r\n"); |
hudakz | 4:4ddfbdaafbac | 68 | snprintf(sentBuffer, sizeof(sentBuffer), "%s%s\r\n", sentBuffer, line_response); //append to sentBuffer |
azsymaivan | 0:fbb29d9ea96b | 69 | if (EnDebugMSG) |
azsymaivan | 0:fbb29d9ea96b | 70 | printf("\n-->sent Header--\n"); |
azsymaivan | 0:fbb29d9ea96b | 71 | |
hudakz | 4:4ddfbdaafbac | 72 | client.send_all(sentBuffer, strlen(sentBuffer)); |
hudakz | 4:4ddfbdaafbac | 73 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 74 | { |
azsymaivan | 0:fbb29d9ea96b | 75 | printf(sentBuffer); |
hudakz | 4:4ddfbdaafbac | 76 | printf("\n--end Header-- bytes:%d", strlen(sentBuffer)); |
azsymaivan | 0:fbb29d9ea96b | 77 | } |
hudakz | 4:4ddfbdaafbac | 78 | |
azsymaivan | 0:fbb29d9ea96b | 79 | Thread::wait(200); //200ms important for browser! |
azsymaivan | 0:fbb29d9ea96b | 80 | } |
azsymaivan | 0:fbb29d9ea96b | 81 | |
hudakz | 4:4ddfbdaafbac | 82 | /** |
hudakz | 4:4ddfbdaafbac | 83 | * @brief |
hudakz | 4:4ddfbdaafbac | 84 | * @note |
hudakz | 4:4ddfbdaafbac | 85 | * @param |
hudakz | 4:4ddfbdaafbac | 86 | * @retval |
hudakz | 4:4ddfbdaafbac | 87 | */ |
azsymaivan | 0:fbb29d9ea96b | 88 | void send_HTML_line(char* line, unsigned int length_line) |
azsymaivan | 0:fbb29d9ea96b | 89 | { |
hudakz | 4:4ddfbdaafbac | 90 | client.send_all(line, length_line); |
azsymaivan | 0:fbb29d9ea96b | 91 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 92 | printf("\n-->send HTML line:\n%s ...Ok!", line); |
azsymaivan | 0:fbb29d9ea96b | 93 | Thread::wait(10); |
azsymaivan | 0:fbb29d9ea96b | 94 | } |
azsymaivan | 0:fbb29d9ea96b | 95 | |
hudakz | 4:4ddfbdaafbac | 96 | /** |
hudakz | 4:4ddfbdaafbac | 97 | * @brief |
hudakz | 4:4ddfbdaafbac | 98 | * @note |
hudakz | 4:4ddfbdaafbac | 99 | * @param |
hudakz | 4:4ddfbdaafbac | 100 | * @retval |
hudakz | 4:4ddfbdaafbac | 101 | */ |
hudakz | 4:4ddfbdaafbac | 102 | void send_HTML_error(int status_code, char* title, char* body_text) |
azsymaivan | 0:fbb29d9ea96b | 103 | { |
azsymaivan | 0:fbb29d9ea96b | 104 | send_HTTP_header("HTTP/1.1", status_code, title, "text/html", -1); |
azsymaivan | 0:fbb29d9ea96b | 105 | if (EnDebugMSG) |
azsymaivan | 0:fbb29d9ea96b | 106 | printf("\n-->send_error...\n"); |
hudakz | 4:4ddfbdaafbac | 107 | sentBuffer[0] = NULL; //clear buffer |
hudakz | 4:4ddfbdaafbac | 108 | sprintf |
hudakz | 4:4ddfbdaafbac | 109 | ( |
hudakz | 4:4ddfbdaafbac | 110 | line_response, |
hudakz | 4:4ddfbdaafbac | 111 | "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<title>%d %s</title>\r\n</head>\r\n", |
hudakz | 4:4ddfbdaafbac | 112 | status_code, |
hudakz | 4:4ddfbdaafbac | 113 | title |
hudakz | 4:4ddfbdaafbac | 114 | ); |
hudakz | 4:4ddfbdaafbac | 115 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 116 | sprintf(line_response, "<body><center><h2><center>%d %s</center></h2>\r\n", status_code, title); |
hudakz | 4:4ddfbdaafbac | 117 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 118 | sprintf(line_response, "%s\r\n", body_text); |
hudakz | 4:4ddfbdaafbac | 119 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
azsymaivan | 0:fbb29d9ea96b | 120 | sprintf(line_response, "<p>mbed HTTP File Server</p>\r\n</center></body></html>\r\n"); |
hudakz | 4:4ddfbdaafbac | 121 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
azsymaivan | 0:fbb29d9ea96b | 122 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
azsymaivan | 0:fbb29d9ea96b | 123 | } |
azsymaivan | 0:fbb29d9ea96b | 124 | |
hudakz | 4:4ddfbdaafbac | 125 | /** |
hudakz | 4:4ddfbdaafbac | 126 | * @brief |
hudakz | 4:4ddfbdaafbac | 127 | * @note |
hudakz | 4:4ddfbdaafbac | 128 | * @param |
hudakz | 4:4ddfbdaafbac | 129 | * @retval |
hudakz | 4:4ddfbdaafbac | 130 | */ |
hudakz | 4:4ddfbdaafbac | 131 | int send_file(char* path_file) |
azsymaivan | 0:fbb29d9ea96b | 132 | { |
hudakz | 4:4ddfbdaafbac | 133 | char* mime_type = { 0 }; |
hudakz | 4:4ddfbdaafbac | 134 | unsigned int bytes_for_send = 0; |
hudakz | 4:4ddfbdaafbac | 135 | long long filesize, all_send_bytes = 0; |
azsymaivan | 0:fbb29d9ea96b | 136 | |
hudakz | 4:4ddfbdaafbac | 137 | mime_type = get_mime_type(path_file); |
hudakz | 4:4ddfbdaafbac | 138 | snprintf(file_path, sizeof(file_path), "/wfs/%s", path_file); |
hudakz | 4:4ddfbdaafbac | 139 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 140 | { |
hudakz | 4:4ddfbdaafbac | 141 | printf("\n-->from send_file:%s", file_path); |
hudakz | 4:4ddfbdaafbac | 142 | printf("\n-->from send_file mime type:%s", mime_type); |
azsymaivan | 0:fbb29d9ea96b | 143 | } |
azsymaivan | 0:fbb29d9ea96b | 144 | |
hudakz | 4:4ddfbdaafbac | 145 | if (Mystat(path_file, &myStatBuf)) |
hudakz | 4:4ddfbdaafbac | 146 | { //fault with file |
hudakz | 4:4ddfbdaafbac | 147 | send_HTML_error(403, "Forbidden", "403 - File access forbidden."); |
azsymaivan | 0:fbb29d9ea96b | 148 | return 403; |
azsymaivan | 0:fbb29d9ea96b | 149 | } |
hudakz | 4:4ddfbdaafbac | 150 | |
hudakz | 4:4ddfbdaafbac | 151 | FILE* fp = NULL; |
hudakz | 4:4ddfbdaafbac | 152 | fp = fopen(file_path, "r"); |
hudakz | 4:4ddfbdaafbac | 153 | if (fp == NULL) |
hudakz | 4:4ddfbdaafbac | 154 | { |
hudakz | 4:4ddfbdaafbac | 155 | send_HTML_error(403, "Forbidden", "403 - File access forbidden."); |
azsymaivan | 0:fbb29d9ea96b | 156 | return 403; |
azsymaivan | 0:fbb29d9ea96b | 157 | } |
azsymaivan | 0:fbb29d9ea96b | 158 | |
azsymaivan | 0:fbb29d9ea96b | 159 | filesize = myStatBuf.st_size; |
azsymaivan | 0:fbb29d9ea96b | 160 | send_HTTP_header("HTTP/1.1", 200, "Ok", mime_type, myStatBuf.st_size); |
azsymaivan | 0:fbb29d9ea96b | 161 | //binary send |
hudakz | 4:4ddfbdaafbac | 162 | all_send_bytes = 0; |
hudakz | 4:4ddfbdaafbac | 163 | while (filesize) |
hudakz | 4:4ddfbdaafbac | 164 | { //check for EOF !feof(fp) |
azsymaivan | 0:fbb29d9ea96b | 165 | bytes_for_send = filesize; |
hudakz | 4:4ddfbdaafbac | 166 | if (bytes_for_send > sizeof(sentBuffer)) |
azsymaivan | 0:fbb29d9ea96b | 167 | bytes_for_send = sizeof(sentBuffer); |
hudakz | 4:4ddfbdaafbac | 168 | |
hudakz | 4:4ddfbdaafbac | 169 | fread(sentBuffer, 1, bytes_for_send, fp); |
azsymaivan | 0:fbb29d9ea96b | 170 | filesize -= bytes_for_send; |
azsymaivan | 0:fbb29d9ea96b | 171 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 172 | printf("\n---bytes_for_send...%d", bytes_for_send); |
hudakz | 4:4ddfbdaafbac | 173 | client.send_all(sentBuffer, bytes_for_send); |
azsymaivan | 0:fbb29d9ea96b | 174 | //Thread::wait(10); |
azsymaivan | 0:fbb29d9ea96b | 175 | all_send_bytes += bytes_for_send; |
azsymaivan | 0:fbb29d9ea96b | 176 | } |
hudakz | 4:4ddfbdaafbac | 177 | |
azsymaivan | 0:fbb29d9ea96b | 178 | if (EnDebugMSG) |
azsymaivan | 0:fbb29d9ea96b | 179 | printf("\n---buffer fill end - all ...%lld", all_send_bytes); |
azsymaivan | 0:fbb29d9ea96b | 180 | //binary send |
azsymaivan | 0:fbb29d9ea96b | 181 | sprintf(line_response, "\r\n"); |
hudakz | 4:4ddfbdaafbac | 182 | client.send_all(line_response, strlen(line_response)); |
hudakz | 4:4ddfbdaafbac | 183 | if (fp != NULL) |
azsymaivan | 0:fbb29d9ea96b | 184 | fclose(fp); |
azsymaivan | 0:fbb29d9ea96b | 185 | //Thread::wait(10); |
azsymaivan | 0:fbb29d9ea96b | 186 | return 0; |
azsymaivan | 0:fbb29d9ea96b | 187 | } |
azsymaivan | 0:fbb29d9ea96b | 188 | |
hudakz | 4:4ddfbdaafbac | 189 | /** |
hudakz | 4:4ddfbdaafbac | 190 | * @brief |
hudakz | 4:4ddfbdaafbac | 191 | * @note |
hudakz | 4:4ddfbdaafbac | 192 | * @param |
hudakz | 4:4ddfbdaafbac | 193 | * @retval |
hudakz | 4:4ddfbdaafbac | 194 | */ |
hudakz | 4:4ddfbdaafbac | 195 | int send_directory(char* path) |
azsymaivan | 0:fbb29d9ea96b | 196 | { |
hudakz | 4:4ddfbdaafbac | 197 | char process_name[64] = { 0 }; |
hudakz | 4:4ddfbdaafbac | 198 | char posOfLastSlash; |
hudakz | 4:4ddfbdaafbac | 199 | char* pLS; |
hudakz | 4:4ddfbdaafbac | 200 | struct dirent* p; |
hudakz | 4:4ddfbdaafbac | 201 | struct sMystat sb; |
hudakz | 4:4ddfbdaafbac | 202 | struct tm* timeinfo; |
hudakz | 4:4ddfbdaafbac | 203 | char timeBuf[40]; |
azsymaivan | 0:fbb29d9ea96b | 204 | |
azsymaivan | 0:fbb29d9ea96b | 205 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 206 | printf("\n-->from send_directory:%s", path); |
hudakz | 4:4ddfbdaafbac | 207 | snprintf(file_path, sizeof(file_path), "/wfs%s", path); |
hudakz | 4:4ddfbdaafbac | 208 | |
hudakz | 4:4ddfbdaafbac | 209 | DIR* d = opendir(file_path); |
hudakz | 4:4ddfbdaafbac | 210 | if (EnDebugMSG && d != NULL) |
hudakz | 4:4ddfbdaafbac | 211 | printf("\n-->from send_directory:%s ...open OK", file_path); |
hudakz | 4:4ddfbdaafbac | 212 | if (d == NULL) |
hudakz | 4:4ddfbdaafbac | 213 | { //error open dir |
hudakz | 4:4ddfbdaafbac | 214 | send_HTML_error(403, "Forbidden", "403 - Directory access forbidden."); |
azsymaivan | 0:fbb29d9ea96b | 215 | return -1; |
azsymaivan | 0:fbb29d9ea96b | 216 | } |
yihui | 1:8150297e8849 | 217 | |
hudakz | 4:4ddfbdaafbac | 218 | send_HTTP_header("HTTP/1.1", 200, "Ok", NULL, -1); |
hudakz | 4:4ddfbdaafbac | 219 | sentBuffer[0] = NULL; |
hudakz | 4:4ddfbdaafbac | 220 | sprintf(line_response, "<!DOCTYPE html>\r\n<html>\n<head><title>Index of %s</title>\n", path); |
hudakz | 4:4ddfbdaafbac | 221 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 222 | sprintf(line_response, "<meta content=\"text/html; charset=iso-8859-1\" http-equiv=\"Content-Type\"></head>\n"); |
hudakz | 4:4ddfbdaafbac | 223 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 224 | sprintf(line_response, "<body><center>\n<h3>Index of %s</h3>\n", path); |
hudakz | 4:4ddfbdaafbac | 225 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
azsymaivan | 0:fbb29d9ea96b | 226 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
hudakz | 4:4ddfbdaafbac | 227 | //begin table |
hudakz | 4:4ddfbdaafbac | 228 | sentBuffer[0] = NULL; //clear buffer |
hudakz | 4:4ddfbdaafbac | 229 | sprintf(line_response, "<table border=\"0\">\n"); |
hudakz | 4:4ddfbdaafbac | 230 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 231 | sprintf |
hudakz | 4:4ddfbdaafbac | 232 | ( |
hudakz | 4:4ddfbdaafbac | 233 | line_response, |
hudakz | 4:4ddfbdaafbac | 234 | "<tr><th align=\"left\" width=\"200\">Name</th><th align=\"right\" width=\"100\">Size(bytes)</th><th align=\"right\" width=\"200\">Date/Time</th></tr>\n" |
hudakz | 4:4ddfbdaafbac | 235 | ); |
hudakz | 4:4ddfbdaafbac | 236 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 237 | //begin table |
hudakz | 4:4ddfbdaafbac | 238 | pLS = strrchr(path, '/'); |
hudakz | 4:4ddfbdaafbac | 239 | posOfLastSlash = pLS - path + 1; |
azsymaivan | 0:fbb29d9ea96b | 240 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 241 | printf("\r\n>>posOfLastSlash=%d", posOfLastSlash); |
hudakz | 4:4ddfbdaafbac | 242 | snprintf(process_name, posOfLastSlash + 1, "%s", path); |
azsymaivan | 0:fbb29d9ea96b | 243 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 244 | printf("\r\n>>process_name=%s", process_name); |
hudakz | 4:4ddfbdaafbac | 245 | sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">../</a></td></tr>\n", process_name); |
hudakz | 4:4ddfbdaafbac | 246 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 247 | while ((p = readdir(d)) != NULL) |
hudakz | 4:4ddfbdaafbac | 248 | { |
azsymaivan | 0:fbb29d9ea96b | 249 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 250 | printf("\n :%s", p->d_name); |
hudakz | 4:4ddfbdaafbac | 251 | sprintf(file_path, "%s/%s", path, p->d_name); |
hudakz | 4:4ddfbdaafbac | 252 | Mystat(file_path, &sb); |
hudakz | 4:4ddfbdaafbac | 253 | if (get_dirInfo(file_path) == 0) |
hudakz | 4:4ddfbdaafbac | 254 | { //this is directory path |
azsymaivan | 0:fbb29d9ea96b | 255 | if (EnDebugMSG) |
azsymaivan | 0:fbb29d9ea96b | 256 | printf("\nDIR"); |
hudakz | 4:4ddfbdaafbac | 257 | sprintf |
hudakz | 4:4ddfbdaafbac | 258 | ( |
hudakz | 4:4ddfbdaafbac | 259 | line_response, |
hudakz | 4:4ddfbdaafbac | 260 | "<tr><td align=\"left\"><a href=\"%s\">%s</a><br></td></tr>\n", |
hudakz | 4:4ddfbdaafbac | 261 | file_path, |
hudakz | 4:4ddfbdaafbac | 262 | p->d_name |
hudakz | 4:4ddfbdaafbac | 263 | ); |
hudakz | 4:4ddfbdaafbac | 264 | if (strlen(line_response) > (sizeof(sentBuffer) - strlen(sentBuffer))) |
hudakz | 4:4ddfbdaafbac | 265 | { //buffer must be sent |
azsymaivan | 0:fbb29d9ea96b | 266 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
hudakz | 4:4ddfbdaafbac | 267 | sentBuffer[0] = NULL; //clear buffer |
azsymaivan | 0:fbb29d9ea96b | 268 | } |
azsymaivan | 0:fbb29d9ea96b | 269 | |
hudakz | 4:4ddfbdaafbac | 270 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
hudakz | 4:4ddfbdaafbac | 271 | } |
hudakz | 4:4ddfbdaafbac | 272 | else |
hudakz | 4:4ddfbdaafbac | 273 | { //this is file |
azsymaivan | 0:fbb29d9ea96b | 274 | if (EnDebugMSG) |
azsymaivan | 0:fbb29d9ea96b | 275 | printf("\nFILE"); |
hudakz | 4:4ddfbdaafbac | 276 | timeinfo = localtime(&sb.st_mtime); |
azsymaivan | 0:fbb29d9ea96b | 277 | //strftime(timeBuf,40, "%I:%M:%S %p (%Y/%m/%d)\r\n", localtime(&sb.st_mtime)); |
azsymaivan | 0:fbb29d9ea96b | 278 | strftime(timeBuf, 40, "%c", timeinfo); |
hudakz | 4:4ddfbdaafbac | 279 | sprintf |
hudakz | 4:4ddfbdaafbac | 280 | ( |
hudakz | 4:4ddfbdaafbac | 281 | line_response, |
hudakz | 4:4ddfbdaafbac | 282 | "<tr><td align=\"left\"><a href=\"%s\">%s</a></td><td align=\"right\">%lld</td><td align=\"right\">%s</td></tr>\n", |
hudakz | 4:4ddfbdaafbac | 283 | file_path, |
hudakz | 4:4ddfbdaafbac | 284 | p->d_name, |
hudakz | 4:4ddfbdaafbac | 285 | (long long)sb.st_size, |
hudakz | 4:4ddfbdaafbac | 286 | timeBuf |
hudakz | 4:4ddfbdaafbac | 287 | ); // asctime(timeinfo) ); |
hudakz | 4:4ddfbdaafbac | 288 | if (strlen(line_response) > (sizeof(sentBuffer) - strlen(sentBuffer))) |
hudakz | 4:4ddfbdaafbac | 289 | { //buffer must be sent |
azsymaivan | 0:fbb29d9ea96b | 290 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
hudakz | 4:4ddfbdaafbac | 291 | sentBuffer[0] = NULL; //clear buffer |
azsymaivan | 0:fbb29d9ea96b | 292 | } |
hudakz | 4:4ddfbdaafbac | 293 | |
hudakz | 4:4ddfbdaafbac | 294 | snprintf(&(sentBuffer[strlen(sentBuffer)]), sizeof(sentBuffer), "%s", line_response); //append to buffer |
azsymaivan | 0:fbb29d9ea96b | 295 | } |
azsymaivan | 0:fbb29d9ea96b | 296 | } |
hudakz | 4:4ddfbdaafbac | 297 | |
azsymaivan | 0:fbb29d9ea96b | 298 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
azsymaivan | 0:fbb29d9ea96b | 299 | closedir(d); |
azsymaivan | 0:fbb29d9ea96b | 300 | |
azsymaivan | 0:fbb29d9ea96b | 301 | sprintf(line_response, "</table>\n<br><h4>mbed HTTP File Server</h4>\n</center></body></html>\n"); |
azsymaivan | 0:fbb29d9ea96b | 302 | send_HTML_line(line_response, strlen(line_response)); |
azsymaivan | 0:fbb29d9ea96b | 303 | |
azsymaivan | 0:fbb29d9ea96b | 304 | return 0; |
azsymaivan | 0:fbb29d9ea96b | 305 | } |
azsymaivan | 0:fbb29d9ea96b | 306 | |
hudakz | 4:4ddfbdaafbac | 307 | /** |
hudakz | 4:4ddfbdaafbac | 308 | * @brief |
hudakz | 4:4ddfbdaafbac | 309 | * @note |
hudakz | 4:4ddfbdaafbac | 310 | * @param |
hudakz | 4:4ddfbdaafbac | 311 | * @retval |
hudakz | 4:4ddfbdaafbac | 312 | */ |
azsymaivan | 0:fbb29d9ea96b | 313 | void parseHTTPRequest(char* buffer) |
azsymaivan | 0:fbb29d9ea96b | 314 | { |
hudakz | 3:aaf055cd9d06 | 315 | char space1Pos, space2Pos, newlinePos; |
hudakz | 3:aaf055cd9d06 | 316 | char* tmpBuffer; |
hudakz | 3:aaf055cd9d06 | 317 | space1Pos = strcspn(buffer, " "); //position of first space character |
hudakz | 3:aaf055cd9d06 | 318 | snprintf(sMethod, space1Pos + 1, "%s", buffer); |
azsymaivan | 0:fbb29d9ea96b | 319 | |
hudakz | 3:aaf055cd9d06 | 320 | tmpBuffer = buffer + space1Pos + 1; |
hudakz | 3:aaf055cd9d06 | 321 | space2Pos = strcspn(tmpBuffer, " "); //position of second space character |
hudakz | 3:aaf055cd9d06 | 322 | snprintf(sURL, space2Pos + 1, "%s", tmpBuffer); |
azsymaivan | 0:fbb29d9ea96b | 323 | |
hudakz | 3:aaf055cd9d06 | 324 | tmpBuffer = buffer + space1Pos + 1 + space2Pos + 1; |
hudakz | 3:aaf055cd9d06 | 325 | newlinePos = strcspn(tmpBuffer, "\r\n"); //position of newline + carriage return |
hudakz | 3:aaf055cd9d06 | 326 | snprintf(sProtocol, newlinePos + 1, "%s", tmpBuffer); |
azsymaivan | 0:fbb29d9ea96b | 327 | |
hudakz | 3:aaf055cd9d06 | 328 | printf("\nParse Method:%s", sMethod); |
hudakz | 3:aaf055cd9d06 | 329 | printf("\nParse URL:%s", sURL); |
hudakz | 3:aaf055cd9d06 | 330 | printf("\nParse Protocol:%s", sProtocol); |
azsymaivan | 0:fbb29d9ea96b | 331 | printf("\n\r\n"); |
azsymaivan | 0:fbb29d9ea96b | 332 | } |
azsymaivan | 0:fbb29d9ea96b | 333 | |
hudakz | 4:4ddfbdaafbac | 334 | /** |
hudakz | 4:4ddfbdaafbac | 335 | * @brief |
hudakz | 4:4ddfbdaafbac | 336 | * @note |
hudakz | 4:4ddfbdaafbac | 337 | * @param |
hudakz | 4:4ddfbdaafbac | 338 | * @retval |
hudakz | 4:4ddfbdaafbac | 339 | */ |
azsymaivan | 0:fbb29d9ea96b | 340 | int processHTTP(char* sMethod, char* sURL, char* sProtocol) |
azsymaivan | 0:fbb29d9ea96b | 341 | { |
hudakz | 4:4ddfbdaafbac | 342 | int gdi, gfi; //status of get_dir_info(xxx), and get_file_info(xxx) |
azsymaivan | 0:fbb29d9ea96b | 343 | |
hudakz | 4:4ddfbdaafbac | 344 | if (strcmp(sMethod, "GET") != 0) |
hudakz | 4:4ddfbdaafbac | 345 | { |
hudakz | 4:4ddfbdaafbac | 346 | send_HTML_error(501, "501 Not Implemented", "501 - The server either does not recognize the request method"); |
azsymaivan | 0:fbb29d9ea96b | 347 | return 501; |
azsymaivan | 0:fbb29d9ea96b | 348 | } |
hudakz | 4:4ddfbdaafbac | 349 | |
hudakz | 4:4ddfbdaafbac | 350 | if (sURL[0] != '/') |
hudakz | 4:4ddfbdaafbac | 351 | { |
hudakz | 4:4ddfbdaafbac | 352 | send_HTML_error(400, "Bad Request", "400 - The request cannot be fulfilled due to bad syntax."); |
azsymaivan | 0:fbb29d9ea96b | 353 | return 400; |
azsymaivan | 0:fbb29d9ea96b | 354 | } |
hudakz | 4:4ddfbdaafbac | 355 | |
hudakz | 4:4ddfbdaafbac | 356 | if (sURL[strlen(sURL) - 1] == '/') |
hudakz | 4:4ddfbdaafbac | 357 | { |
hudakz | 4:4ddfbdaafbac | 358 | sURL[strlen(sURL) - 1] = sURL[strlen(sURL)]; //delete last symbol |
azsymaivan | 0:fbb29d9ea96b | 359 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 360 | printf("\n delete last:%s", sURL); |
azsymaivan | 0:fbb29d9ea96b | 361 | } |
hudakz | 4:4ddfbdaafbac | 362 | |
hudakz | 4:4ddfbdaafbac | 363 | gdi = get_dirInfo(sURL); |
hudakz | 4:4ddfbdaafbac | 364 | gfi = get_fileInfo(sURL); |
hudakz | 4:4ddfbdaafbac | 365 | if (gfi != 0) |
hudakz | 4:4ddfbdaafbac | 366 | { //!=0 file not found |
hudakz | 4:4ddfbdaafbac | 367 | if (gdi == 0) |
hudakz | 4:4ddfbdaafbac | 368 | { //0-ok this is directory |
azsymaivan | 0:fbb29d9ea96b | 369 | return send_directory(sURL); |
azsymaivan | 0:fbb29d9ea96b | 370 | } |
hudakz | 4:4ddfbdaafbac | 371 | |
azsymaivan | 0:fbb29d9ea96b | 372 | if (EnDebugMSG) |
hudakz | 4:4ddfbdaafbac | 373 | printf("\n404-br File not found or...(Fresult is:%d)", gfi); |
hudakz | 4:4ddfbdaafbac | 374 | send_HTML_error(404, "Not Found", "404 - The requested resource could not be found."); |
azsymaivan | 0:fbb29d9ea96b | 375 | return 404; |
hudakz | 4:4ddfbdaafbac | 376 | } |
hudakz | 4:4ddfbdaafbac | 377 | else |
hudakz | 4:4ddfbdaafbac | 378 | { //==0 found |
hudakz | 4:4ddfbdaafbac | 379 | if (gdi == 0) //0-ok this is directory |
azsymaivan | 0:fbb29d9ea96b | 380 | return send_directory(sURL); |
azsymaivan | 0:fbb29d9ea96b | 381 | else |
azsymaivan | 0:fbb29d9ea96b | 382 | return send_file(sURL); |
azsymaivan | 0:fbb29d9ea96b | 383 | } |
azsymaivan | 0:fbb29d9ea96b | 384 | } |
azsymaivan | 0:fbb29d9ea96b | 385 | |
hudakz | 4:4ddfbdaafbac | 386 | /** |
hudakz | 4:4ddfbdaafbac | 387 | * @brief |
hudakz | 4:4ddfbdaafbac | 388 | * @note |
hudakz | 4:4ddfbdaafbac | 389 | * @param |
hudakz | 4:4ddfbdaafbac | 390 | * @retval |
hudakz | 4:4ddfbdaafbac | 391 | */ |
azsymaivan | 0:fbb29d9ea96b | 392 | int main() |
azsymaivan | 0:fbb29d9ea96b | 393 | { |
yihui | 1:8150297e8849 | 394 | printf("\r\n---- HTTP Server ----\r\n"); |
azsymaivan | 0:fbb29d9ea96b | 395 | |
hudakz | 4:4ddfbdaafbac | 396 | ledTick.attach(&ledTickfunc, 0.5); |
azsymaivan | 0:fbb29d9ea96b | 397 | //ledTick.detach(); |
hudakz | 3:aaf055cd9d06 | 398 | printf("\r\n"); |
hudakz | 3:aaf055cd9d06 | 399 | printf("Mounting file system...\r\n"); |
hudakz | 3:aaf055cd9d06 | 400 | |
hudakz | 3:aaf055cd9d06 | 401 | int err = sd.mount(); |
hudakz | 3:aaf055cd9d06 | 402 | printf("%s\r\n", (err ? "Failed :(\r\n" : "OK\r\n")); |
hudakz | 3:aaf055cd9d06 | 403 | if (err) |
hudakz | 3:aaf055cd9d06 | 404 | return err; |
hudakz | 4:4ddfbdaafbac | 405 | |
azsymaivan | 0:fbb29d9ea96b | 406 | //setup ethernet interface |
hudakz | 4:4ddfbdaafbac | 407 | eth.init(); //Use DHCP |
yihui | 1:8150297e8849 | 408 | // eth.init(IP,MASK,GATEWAY); //IP,mask,Gateway |
azsymaivan | 0:fbb29d9ea96b | 409 | eth.connect(); |
azsymaivan | 0:fbb29d9ea96b | 410 | printf("IP Address is %s\n\r", eth.getIPAddress()); |
azsymaivan | 0:fbb29d9ea96b | 411 | |
azsymaivan | 0:fbb29d9ea96b | 412 | //setup tcp socket |
hudakz | 4:4ddfbdaafbac | 413 | if (svr.bind(PORT) < 0) |
hudakz | 4:4ddfbdaafbac | 414 | { |
azsymaivan | 0:fbb29d9ea96b | 415 | printf("tcp server bind failed.\n\r"); |
azsymaivan | 0:fbb29d9ea96b | 416 | return -1; |
hudakz | 4:4ddfbdaafbac | 417 | } |
hudakz | 4:4ddfbdaafbac | 418 | else |
hudakz | 4:4ddfbdaafbac | 419 | { |
azsymaivan | 0:fbb29d9ea96b | 420 | printf("tcp server bind successed.\n\r"); |
azsymaivan | 0:fbb29d9ea96b | 421 | serverIsListened = true; |
azsymaivan | 0:fbb29d9ea96b | 422 | } |
azsymaivan | 0:fbb29d9ea96b | 423 | |
hudakz | 4:4ddfbdaafbac | 424 | if (svr.listen(1) < 0) |
hudakz | 4:4ddfbdaafbac | 425 | { |
azsymaivan | 0:fbb29d9ea96b | 426 | printf("tcp server listen failed.\n\r"); |
azsymaivan | 0:fbb29d9ea96b | 427 | return -1; |
hudakz | 4:4ddfbdaafbac | 428 | } |
hudakz | 4:4ddfbdaafbac | 429 | else |
hudakz | 4:4ddfbdaafbac | 430 | { |
azsymaivan | 0:fbb29d9ea96b | 431 | printf("tcp server is listening...\n\r"); |
azsymaivan | 0:fbb29d9ea96b | 432 | } |
azsymaivan | 0:fbb29d9ea96b | 433 | |
azsymaivan | 0:fbb29d9ea96b | 434 | //listening for http GET request |
hudakz | 4:4ddfbdaafbac | 435 | while (serverIsListened) |
hudakz | 4:4ddfbdaafbac | 436 | { |
azsymaivan | 0:fbb29d9ea96b | 437 | //blocking mode(never timeout) |
hudakz | 4:4ddfbdaafbac | 438 | if (svr.accept(client) < 0) |
hudakz | 4:4ddfbdaafbac | 439 | { |
azsymaivan | 0:fbb29d9ea96b | 440 | printf("failed to accept connection.\n\r"); |
hudakz | 4:4ddfbdaafbac | 441 | } |
hudakz | 4:4ddfbdaafbac | 442 | else |
hudakz | 4:4ddfbdaafbac | 443 | { |
azsymaivan | 0:fbb29d9ea96b | 444 | //client.set_blocking(false,5000); //5000=5sec |
hudakz | 4:4ddfbdaafbac | 445 | printf("connection success!\n\rIP: %s\n\r", client.get_address()); |
azsymaivan | 0:fbb29d9ea96b | 446 | clientIsConnected = true; |
hudakz | 4:4ddfbdaafbac | 447 | while (clientIsConnected) |
hudakz | 4:4ddfbdaafbac | 448 | { |
hudakz | 4:4ddfbdaafbac | 449 | char buffer[1024] = { }; |
hudakz | 4:4ddfbdaafbac | 450 | switch (client.receive(buffer, 1023)) { |
azsymaivan | 0:fbb29d9ea96b | 451 | case 0: |
azsymaivan | 0:fbb29d9ea96b | 452 | printf("recieved buffer is empty.\n\r"); |
azsymaivan | 0:fbb29d9ea96b | 453 | clientIsConnected = false; |
azsymaivan | 0:fbb29d9ea96b | 454 | break; |
hudakz | 4:4ddfbdaafbac | 455 | |
azsymaivan | 0:fbb29d9ea96b | 456 | case -1: |
azsymaivan | 0:fbb29d9ea96b | 457 | printf("failed to read data from client.\n\r"); |
azsymaivan | 0:fbb29d9ea96b | 458 | clientIsConnected = false; |
azsymaivan | 0:fbb29d9ea96b | 459 | break; |
hudakz | 4:4ddfbdaafbac | 460 | |
azsymaivan | 0:fbb29d9ea96b | 461 | default: |
hudakz | 4:4ddfbdaafbac | 462 | printf("Recieved Data: %d\n\r\n\r%.*s\n\r", strlen(buffer), strlen(buffer), buffer); |
azsymaivan | 0:fbb29d9ea96b | 463 | parseHTTPRequest(buffer); |
azsymaivan | 0:fbb29d9ea96b | 464 | //if(buffer[0] == 'G' && buffer[1] == 'E' && buffer[2] == 'T' ) { |
hudakz | 4:4ddfbdaafbac | 465 | if (strcmp(sMethod, "GET") == 0) |
hudakz | 4:4ddfbdaafbac | 466 | { |
azsymaivan | 0:fbb29d9ea96b | 467 | printf("GET request incomming.\n\r"); |
azsymaivan | 0:fbb29d9ea96b | 468 | processHTTP(sMethod, sURL, sProtocol); |
azsymaivan | 0:fbb29d9ea96b | 469 | clientIsConnected = false; |
hudakz | 4:4ddfbdaafbac | 470 | } //if get |
azsymaivan | 0:fbb29d9ea96b | 471 | break; |
hudakz | 4:4ddfbdaafbac | 472 | } //switch |
hudakz | 4:4ddfbdaafbac | 473 | |
azsymaivan | 0:fbb29d9ea96b | 474 | //ledTick.attach(&ledTickfunc,0.5); |
hudakz | 4:4ddfbdaafbac | 475 | } //while |
hudakz | 4:4ddfbdaafbac | 476 | |
azsymaivan | 0:fbb29d9ea96b | 477 | printf("close connection.\n\rHTTP server is listening...\n\r\n"); |
azsymaivan | 0:fbb29d9ea96b | 478 | client.close(); |
azsymaivan | 0:fbb29d9ea96b | 479 | Thread::wait(50); |
azsymaivan | 0:fbb29d9ea96b | 480 | } |
azsymaivan | 0:fbb29d9ea96b | 481 | } |
azsymaivan | 0:fbb29d9ea96b | 482 | } |