创建mbed
Dependencies: EthernetInterface SDFileSystem mbed-rtos mbed
main.cpp@0:610235504baa, 2018-03-05 (annotated)
- Committer:
- sunyiming
- Date:
- Mon Mar 05 14:58:17 2018 +0000
- Revision:
- 0:610235504baa
- Child:
- 1:6465a3f5c58a
??
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
sunyiming | 0:610235504baa | 1 | #include "mbed.h" |
sunyiming | 0:610235504baa | 2 | #include "EthernetInterface.h" |
sunyiming | 0:610235504baa | 3 | #include "SDFileSystem.h" |
sunyiming | 0:610235504baa | 4 | #include "rtos.h" |
sunyiming | 0:610235504baa | 5 | |
sunyiming | 0:610235504baa | 6 | #define EnDebugMSG false //true-> print debug message to PC USB terminal, false->not print |
sunyiming | 0:610235504baa | 7 | #include "filelib.h" |
sunyiming | 0:610235504baa | 8 | |
sunyiming | 0:610235504baa | 9 | #define IP "192.168.100.100" |
sunyiming | 0:610235504baa | 10 | #define MASK "255.255.255.0" |
sunyiming | 0:610235504baa | 11 | #define GATEWAY "192.168.100.1" |
sunyiming | 0:610235504baa | 12 | #define PORT 80 |
sunyiming | 0:610235504baa | 13 | |
sunyiming | 0:610235504baa | 14 | Serial pc (USBTX,USBRX); // tx, rx |
sunyiming | 0:610235504baa | 15 | SDFileSystem sd(SD_MOSI, SD_MISO, SD_SCK, SD_CS, "wfs"); // the pinout on the mbed |
sunyiming | 0:610235504baa | 16 | |
sunyiming | 0:610235504baa | 17 | char sMethod[7]; |
sunyiming | 0:610235504baa | 18 | char sURL[250]; |
sunyiming | 0:610235504baa | 19 | char sProtocol[8]; |
sunyiming | 0:610235504baa | 20 | |
sunyiming | 0:610235504baa | 21 | EthernetInterface eth; |
sunyiming | 0:610235504baa | 22 | |
sunyiming | 0:610235504baa | 23 | TCPSocketServer svr; |
sunyiming | 0:610235504baa | 24 | bool serverIsListened = false; |
sunyiming | 0:610235504baa | 25 | |
sunyiming | 0:610235504baa | 26 | TCPSocketConnection client; |
sunyiming | 0:610235504baa | 27 | bool clientIsConnected = false; |
sunyiming | 0:610235504baa | 28 | |
sunyiming | 0:610235504baa | 29 | char sentBuffer[1608] = {}; // 2*536=1072, 3*536=1608, 4*536=2144 !1500 |
sunyiming | 0:610235504baa | 30 | char line_response[256]= {0}; |
sunyiming | 0:610235504baa | 31 | char file_path[256] = {0}; |
sunyiming | 0:610235504baa | 32 | |
sunyiming | 0:610235504baa | 33 | DigitalOut led1(LED1); //server listning status |
sunyiming | 0:610235504baa | 34 | DigitalOut led2(LED2); //socket connecting status |
sunyiming | 0:610235504baa | 35 | |
sunyiming | 0:610235504baa | 36 | Ticker ledTick; |
sunyiming | 0:610235504baa | 37 | |
sunyiming | 0:610235504baa | 38 | void ledTickfunc() |
sunyiming | 0:610235504baa | 39 | { |
sunyiming | 0:610235504baa | 40 | if(serverIsListened) { |
sunyiming | 0:610235504baa | 41 | led1 = !led1; |
sunyiming | 0:610235504baa | 42 | } else { |
sunyiming | 0:610235504baa | 43 | led1 = false; |
sunyiming | 0:610235504baa | 44 | } |
sunyiming | 0:610235504baa | 45 | } |
sunyiming | 0:610235504baa | 46 | |
sunyiming | 0:610235504baa | 47 | void send_HTTP_header(char* protocol, int code, char* title, char* mime_type, long long lengthBody) |
sunyiming | 0:610235504baa | 48 | { |
sunyiming | 0:610235504baa | 49 | snprintf(line_response, sizeof(line_response),"%s %d %s\r\n", protocol, code, title ); |
sunyiming | 0:610235504baa | 50 | snprintf(sentBuffer, sizeof(sentBuffer),"%s",line_response); |
sunyiming | 0:610235504baa | 51 | |
sunyiming | 0:610235504baa | 52 | if ( mime_type != NULL ) { |
sunyiming | 0:610235504baa | 53 | snprintf(line_response, sizeof(line_response), "Content-Type: %s\r\n", mime_type ); |
sunyiming | 0:610235504baa | 54 | snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer |
sunyiming | 0:610235504baa | 55 | } |
sunyiming | 0:610235504baa | 56 | if ( lengthBody >= 0 ) { |
sunyiming | 0:610235504baa | 57 | snprintf(line_response, sizeof(line_response), "Content-Length: %lld\r\n", lengthBody ); |
sunyiming | 0:610235504baa | 58 | snprintf(sentBuffer, sizeof(sentBuffer), "%s%s",sentBuffer,line_response); //append to sentBuffer |
sunyiming | 0:610235504baa | 59 | } |
sunyiming | 0:610235504baa | 60 | snprintf(line_response, sizeof(line_response), "Connection: close\r\n" ); |
sunyiming | 0:610235504baa | 61 | snprintf(sentBuffer, sizeof(sentBuffer),"%s%s\r\n",sentBuffer,line_response); //append to sentBuffer |
sunyiming | 0:610235504baa | 62 | |
sunyiming | 0:610235504baa | 63 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 64 | printf("\n-->sent Header--\n"); |
sunyiming | 0:610235504baa | 65 | |
sunyiming | 0:610235504baa | 66 | client.send_all(sentBuffer,strlen(sentBuffer)); |
sunyiming | 0:610235504baa | 67 | if (EnDebugMSG) { |
sunyiming | 0:610235504baa | 68 | printf(sentBuffer); |
sunyiming | 0:610235504baa | 69 | printf("\n--end Header-- bytes:%d",strlen(sentBuffer)); |
sunyiming | 0:610235504baa | 70 | } |
sunyiming | 0:610235504baa | 71 | Thread::wait(200); //200ms important for browser! |
sunyiming | 0:610235504baa | 72 | } |
sunyiming | 0:610235504baa | 73 | |
sunyiming | 0:610235504baa | 74 | void send_HTML_line(char* line, unsigned int length_line) |
sunyiming | 0:610235504baa | 75 | { |
sunyiming | 0:610235504baa | 76 | client.send_all(line,length_line); |
sunyiming | 0:610235504baa | 77 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 78 | printf("\n-->send HTML line:\n%s ...Ok!",line); |
sunyiming | 0:610235504baa | 79 | Thread::wait(10); |
sunyiming | 0:610235504baa | 80 | } |
sunyiming | 0:610235504baa | 81 | |
sunyiming | 0:610235504baa | 82 | void send_HTML_error( int status_code, char* title, char* body_text) |
sunyiming | 0:610235504baa | 83 | { |
sunyiming | 0:610235504baa | 84 | send_HTTP_header("HTTP/1.1", status_code, title, "text/html", -1); |
sunyiming | 0:610235504baa | 85 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 86 | printf("\n-->send_error...\n"); |
sunyiming | 0:610235504baa | 87 | sentBuffer[0]=NULL; //clear buffer |
sunyiming | 0:610235504baa | 88 | sprintf(line_response, "<!DOCTYPE html>\r\n<html>\r\n<head>\r\n<title>%d %s</title>\r\n</head>\r\n", status_code, title); |
sunyiming | 0:610235504baa | 89 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 90 | sprintf(line_response, "<body><center><h2><center>%d %s</center></h2>\r\n",status_code, title ); |
sunyiming | 0:610235504baa | 91 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 92 | sprintf(line_response, "%s\r\n", body_text ); |
sunyiming | 0:610235504baa | 93 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 94 | sprintf(line_response, "<p>mbed HTTP File Server</p>\r\n</center></body></html>\r\n"); |
sunyiming | 0:610235504baa | 95 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 96 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
sunyiming | 0:610235504baa | 97 | } |
sunyiming | 0:610235504baa | 98 | |
sunyiming | 0:610235504baa | 99 | int send_file(char *path_file) |
sunyiming | 0:610235504baa | 100 | { |
sunyiming | 0:610235504baa | 101 | char *mime_type = {0}; |
sunyiming | 0:610235504baa | 102 | unsigned int bytes_for_send=0; |
sunyiming | 0:610235504baa | 103 | long long filesize, all_send_bytes = 0; |
sunyiming | 0:610235504baa | 104 | |
sunyiming | 0:610235504baa | 105 | mime_type = get_mime_type( path_file ); |
sunyiming | 0:610235504baa | 106 | snprintf(file_path, sizeof(file_path),"/wfs/%s",path_file); |
sunyiming | 0:610235504baa | 107 | if (EnDebugMSG) { |
sunyiming | 0:610235504baa | 108 | printf("\n-->from send_file:%s",file_path); |
sunyiming | 0:610235504baa | 109 | printf("\n-->from send_file mime type:%s",mime_type); |
sunyiming | 0:610235504baa | 110 | } |
sunyiming | 0:610235504baa | 111 | |
sunyiming | 0:610235504baa | 112 | if (Mystat(path_file, &myStatBuf)) { //fault with file |
sunyiming | 0:610235504baa | 113 | send_HTML_error( 403, "Forbidden", "403 - File access forbidden."); |
sunyiming | 0:610235504baa | 114 | return 403; |
sunyiming | 0:610235504baa | 115 | } |
sunyiming | 0:610235504baa | 116 | FILE* fp = NULL; |
sunyiming | 0:610235504baa | 117 | fp = fopen(file_path,"r"); |
sunyiming | 0:610235504baa | 118 | if (fp==NULL ) { |
sunyiming | 0:610235504baa | 119 | send_HTML_error( 403, "Forbidden", "403 - File access forbidden."); |
sunyiming | 0:610235504baa | 120 | return 403; |
sunyiming | 0:610235504baa | 121 | } |
sunyiming | 0:610235504baa | 122 | |
sunyiming | 0:610235504baa | 123 | filesize = myStatBuf.st_size; |
sunyiming | 0:610235504baa | 124 | send_HTTP_header("HTTP/1.1", 200, "Ok", mime_type, myStatBuf.st_size); |
sunyiming | 0:610235504baa | 125 | //binary send |
sunyiming | 0:610235504baa | 126 | all_send_bytes=0; |
sunyiming | 0:610235504baa | 127 | while(filesize) { //check for EOF !feof(fp) |
sunyiming | 0:610235504baa | 128 | bytes_for_send = filesize; |
sunyiming | 0:610235504baa | 129 | if (bytes_for_send > sizeof(sentBuffer)) { |
sunyiming | 0:610235504baa | 130 | bytes_for_send = sizeof(sentBuffer); |
sunyiming | 0:610235504baa | 131 | } |
sunyiming | 0:610235504baa | 132 | fread (sentBuffer,1,bytes_for_send,fp); |
sunyiming | 0:610235504baa | 133 | filesize -= bytes_for_send; |
sunyiming | 0:610235504baa | 134 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 135 | printf("\n---bytes_for_send...%d",bytes_for_send); |
sunyiming | 0:610235504baa | 136 | client.send_all(sentBuffer,bytes_for_send); |
sunyiming | 0:610235504baa | 137 | //Thread::wait(10); |
sunyiming | 0:610235504baa | 138 | all_send_bytes += bytes_for_send; |
sunyiming | 0:610235504baa | 139 | } |
sunyiming | 0:610235504baa | 140 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 141 | printf("\n---buffer fill end - all ...%lld", all_send_bytes); |
sunyiming | 0:610235504baa | 142 | //binary send |
sunyiming | 0:610235504baa | 143 | |
sunyiming | 0:610235504baa | 144 | sprintf(line_response, "\r\n"); |
sunyiming | 0:610235504baa | 145 | client.send_all(line_response,strlen(line_response)); |
sunyiming | 0:610235504baa | 146 | if ( fp != NULL ) |
sunyiming | 0:610235504baa | 147 | fclose(fp); |
sunyiming | 0:610235504baa | 148 | //Thread::wait(10); |
sunyiming | 0:610235504baa | 149 | return 0; |
sunyiming | 0:610235504baa | 150 | } |
sunyiming | 0:610235504baa | 151 | |
sunyiming | 0:610235504baa | 152 | int send_directory(char *path) |
sunyiming | 0:610235504baa | 153 | { |
sunyiming | 0:610235504baa | 154 | char process_name[64]= {0}; |
sunyiming | 0:610235504baa | 155 | |
sunyiming | 0:610235504baa | 156 | char posOfLastSlash; |
sunyiming | 0:610235504baa | 157 | char *pLS; |
sunyiming | 0:610235504baa | 158 | |
sunyiming | 0:610235504baa | 159 | struct dirent *p; |
sunyiming | 0:610235504baa | 160 | struct sMystat sb; |
sunyiming | 0:610235504baa | 161 | struct tm *timeinfo; |
sunyiming | 0:610235504baa | 162 | char timeBuf[40]; |
sunyiming | 0:610235504baa | 163 | |
sunyiming | 0:610235504baa | 164 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 165 | printf("\n-->from send_directory:%s",path); |
sunyiming | 0:610235504baa | 166 | snprintf(file_path,sizeof(file_path),"/wfs%s",path); |
sunyiming | 0:610235504baa | 167 | DIR *d = opendir(file_path); |
sunyiming | 0:610235504baa | 168 | if (EnDebugMSG && d!=NULL) |
sunyiming | 0:610235504baa | 169 | printf("\n-->from send_directory:%s ...open OK",file_path); |
sunyiming | 0:610235504baa | 170 | if (d==NULL) { //error open dir |
sunyiming | 0:610235504baa | 171 | send_HTML_error( 403, "Forbidden", "403 - Directory access forbidden."); |
sunyiming | 0:610235504baa | 172 | return -1; |
sunyiming | 0:610235504baa | 173 | } |
sunyiming | 0:610235504baa | 174 | send_HTTP_header("HTTP/1.1", 200, "Ok",NULL, -1); |
sunyiming | 0:610235504baa | 175 | sentBuffer[0]=NULL; |
sunyiming | 0:610235504baa | 176 | sprintf(line_response,"<!DOCTYPE html>\r\n<html>\n<head><title>Index of %s</title>\n",path); |
sunyiming | 0:610235504baa | 177 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 178 | |
sunyiming | 0:610235504baa | 179 | sprintf(line_response,"<meta content=\"text/html; charset=iso-8859-1\" http-equiv=\"Content-Type\"></head>\n"); |
sunyiming | 0:610235504baa | 180 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 181 | |
sunyiming | 0:610235504baa | 182 | |
sunyiming | 0:610235504baa | 183 | sprintf(line_response,"<body><center>\n<h3>Index of %s</h3>\n", path); |
sunyiming | 0:610235504baa | 184 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 185 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
sunyiming | 0:610235504baa | 186 | //begin table |
sunyiming | 0:610235504baa | 187 | sentBuffer[0]=NULL; //clear buffer |
sunyiming | 0:610235504baa | 188 | sprintf(line_response,"<table border=\"0\">\n"); |
sunyiming | 0:610235504baa | 189 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 190 | sprintf(line_response,"<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"); |
sunyiming | 0:610235504baa | 191 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 192 | //begin table |
sunyiming | 0:610235504baa | 193 | |
sunyiming | 0:610235504baa | 194 | pLS=strrchr(path,'/'); |
sunyiming | 0:610235504baa | 195 | posOfLastSlash=pLS-path+1; |
sunyiming | 0:610235504baa | 196 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 197 | printf("\r\n>>posOfLastSlash=%d",posOfLastSlash); |
sunyiming | 0:610235504baa | 198 | snprintf(process_name,posOfLastSlash+1,"%s",path); |
sunyiming | 0:610235504baa | 199 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 200 | printf("\r\n>>process_name=%s",process_name); |
sunyiming | 0:610235504baa | 201 | sprintf(line_response,"<tr><td align=\"left\"><a href=\"%s\">../</a></td></tr>\n",process_name); |
sunyiming | 0:610235504baa | 202 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 203 | while((p = readdir(d)) != NULL) { |
sunyiming | 0:610235504baa | 204 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 205 | printf("\n :%s",p->d_name); |
sunyiming | 0:610235504baa | 206 | sprintf(file_path,"%s/%s",path,p->d_name); |
sunyiming | 0:610235504baa | 207 | Mystat( file_path, &sb ); |
sunyiming | 0:610235504baa | 208 | if (get_dirInfo(file_path)==0 ) { //this is directory path |
sunyiming | 0:610235504baa | 209 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 210 | printf("\nDIR"); |
sunyiming | 0:610235504baa | 211 | sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">%s</a><br></td></tr>\n",file_path,p->d_name); |
sunyiming | 0:610235504baa | 212 | if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent |
sunyiming | 0:610235504baa | 213 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
sunyiming | 0:610235504baa | 214 | sentBuffer[0]=NULL; //clear buffer |
sunyiming | 0:610235504baa | 215 | } |
sunyiming | 0:610235504baa | 216 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 217 | |
sunyiming | 0:610235504baa | 218 | } else { //this is file |
sunyiming | 0:610235504baa | 219 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 220 | printf("\nFILE"); |
sunyiming | 0:610235504baa | 221 | timeinfo = localtime (&sb.st_mtime); |
sunyiming | 0:610235504baa | 222 | //strftime(timeBuf,40, "%I:%M:%S %p (%Y/%m/%d)\r\n", localtime(&sb.st_mtime)); |
sunyiming | 0:610235504baa | 223 | strftime(timeBuf, 40, "%c", timeinfo); |
sunyiming | 0:610235504baa | 224 | sprintf(line_response, "<tr><td align=\"left\"><a href=\"%s\">%s</a></td><td align=\"right\">%lld</td><td align=\"right\">%s</td></tr>\n", file_path, p->d_name,(long long) sb.st_size,timeBuf); // asctime(timeinfo) ); |
sunyiming | 0:610235504baa | 225 | |
sunyiming | 0:610235504baa | 226 | if (strlen(line_response)>(sizeof(sentBuffer)-strlen(sentBuffer))) { //buffer must be sent |
sunyiming | 0:610235504baa | 227 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
sunyiming | 0:610235504baa | 228 | sentBuffer[0]=NULL; //clear buffer |
sunyiming | 0:610235504baa | 229 | } |
sunyiming | 0:610235504baa | 230 | snprintf(&(sentBuffer[strlen(sentBuffer)]),sizeof(sentBuffer),"%s",line_response); //append to buffer |
sunyiming | 0:610235504baa | 231 | } |
sunyiming | 0:610235504baa | 232 | } |
sunyiming | 0:610235504baa | 233 | send_HTML_line(sentBuffer, strlen(sentBuffer)); |
sunyiming | 0:610235504baa | 234 | closedir(d); |
sunyiming | 0:610235504baa | 235 | |
sunyiming | 0:610235504baa | 236 | sprintf(line_response, "</table>\n<br><h4>mbed HTTP File Server</h4>\n</center></body></html>\n"); |
sunyiming | 0:610235504baa | 237 | send_HTML_line(line_response, strlen(line_response)); |
sunyiming | 0:610235504baa | 238 | |
sunyiming | 0:610235504baa | 239 | return 0; |
sunyiming | 0:610235504baa | 240 | } |
sunyiming | 0:610235504baa | 241 | |
sunyiming | 0:610235504baa | 242 | void parseHTTPRequest(char* buffer) |
sunyiming | 0:610235504baa | 243 | { |
sunyiming | 0:610235504baa | 244 | char spacePos; |
sunyiming | 0:610235504baa | 245 | char *tmpBuffer; |
sunyiming | 0:610235504baa | 246 | spacePos = strcspn(buffer, " ") + 1; //position of first space character |
sunyiming | 0:610235504baa | 247 | snprintf(sMethod, spacePos,"%s", buffer); |
sunyiming | 0:610235504baa | 248 | |
sunyiming | 0:610235504baa | 249 | //get Protocol |
sunyiming | 0:610235504baa | 250 | tmpBuffer=&(buffer[spacePos]); //move pointer to buffer (delete Method) |
sunyiming | 0:610235504baa | 251 | spacePos = strcspn(tmpBuffer, "\r\n") + 1; |
sunyiming | 0:610235504baa | 252 | tmpBuffer[spacePos]='\0'; //set end of string ...cut |
sunyiming | 0:610235504baa | 253 | sprintf(sProtocol, "%s", strrchr(tmpBuffer,' ')); //get string after last (space ) |
sunyiming | 0:610235504baa | 254 | printf("\r\nsProtocol:%s", tmpBuffer); |
sunyiming | 0:610235504baa | 255 | buffer = &(sProtocol[1]); //cut first character (space) |
sunyiming | 0:610235504baa | 256 | sprintf(sProtocol, "%s", buffer); |
sunyiming | 0:610235504baa | 257 | |
sunyiming | 0:610235504baa | 258 | //get URL |
sunyiming | 0:610235504baa | 259 | snprintf(sURL,strlen(tmpBuffer)-strlen(sProtocol),"%s\r\n", tmpBuffer); //URL is between Method and Protocol |
sunyiming | 0:610235504baa | 260 | |
sunyiming | 0:610235504baa | 261 | printf("\nParse Method:%s",sMethod); |
sunyiming | 0:610235504baa | 262 | printf("\nParse URL:%s",sURL); |
sunyiming | 0:610235504baa | 263 | printf("\nParse PROTOCOL:%s",sProtocol); |
sunyiming | 0:610235504baa | 264 | printf("\n\r\n"); |
sunyiming | 0:610235504baa | 265 | } |
sunyiming | 0:610235504baa | 266 | |
sunyiming | 0:610235504baa | 267 | int processHTTP(char* sMethod, char* sURL, char* sProtocol) |
sunyiming | 0:610235504baa | 268 | { |
sunyiming | 0:610235504baa | 269 | int gdi, gfi; //status of get_dir_info(xxx), and get_file_info(xxx) |
sunyiming | 0:610235504baa | 270 | |
sunyiming | 0:610235504baa | 271 | if (strcmp(sMethod,"GET")!=0) { |
sunyiming | 0:610235504baa | 272 | send_HTML_error( 501, "501 Not Implemented", "501 - The server either does not recognize the request method"); |
sunyiming | 0:610235504baa | 273 | return 501; |
sunyiming | 0:610235504baa | 274 | } |
sunyiming | 0:610235504baa | 275 | if (sURL[0]!= '/') { |
sunyiming | 0:610235504baa | 276 | send_HTML_error( 400, "Bad Request", "400 - The request cannot be fulfilled due to bad syntax."); |
sunyiming | 0:610235504baa | 277 | return 400; |
sunyiming | 0:610235504baa | 278 | } |
sunyiming | 0:610235504baa | 279 | if (sURL[strlen(sURL)-1]=='/') { |
sunyiming | 0:610235504baa | 280 | sURL[strlen(sURL)-1]=sURL[strlen(sURL)]; //delete last symbol |
sunyiming | 0:610235504baa | 281 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 282 | printf("\n delete last:%s",sURL); |
sunyiming | 0:610235504baa | 283 | } |
sunyiming | 0:610235504baa | 284 | gdi= get_dirInfo(sURL); |
sunyiming | 0:610235504baa | 285 | gfi= get_fileInfo(sURL); |
sunyiming | 0:610235504baa | 286 | if (gfi!=0) { //!=0 file not found |
sunyiming | 0:610235504baa | 287 | if (gdi==0) { //0-ok this is directory |
sunyiming | 0:610235504baa | 288 | return send_directory(sURL); |
sunyiming | 0:610235504baa | 289 | } |
sunyiming | 0:610235504baa | 290 | if (EnDebugMSG) |
sunyiming | 0:610235504baa | 291 | printf("\n404-br File not found or...(Fresult is:%d)",gfi); |
sunyiming | 0:610235504baa | 292 | send_HTML_error( 404, "Not Found","404 - The requested resource could not be found."); |
sunyiming | 0:610235504baa | 293 | return 404; |
sunyiming | 0:610235504baa | 294 | } else { //==0 found |
sunyiming | 0:610235504baa | 295 | if (gdi==0) //0-ok this is directory |
sunyiming | 0:610235504baa | 296 | return send_directory(sURL); |
sunyiming | 0:610235504baa | 297 | else |
sunyiming | 0:610235504baa | 298 | return send_file(sURL); |
sunyiming | 0:610235504baa | 299 | } |
sunyiming | 0:610235504baa | 300 | } |
sunyiming | 0:610235504baa | 301 | |
sunyiming | 0:610235504baa | 302 | int main() |
sunyiming | 0:610235504baa | 303 | { |
sunyiming | 0:610235504baa | 304 | printf("\r\n---- HTTP Server ----\r\n"); |
sunyiming | 0:610235504baa | 305 | |
sunyiming | 0:610235504baa | 306 | ledTick.attach(&ledTickfunc,0.5); |
sunyiming | 0:610235504baa | 307 | //ledTick.detach(); |
sunyiming | 0:610235504baa | 308 | //setup ethernet interface |
sunyiming | 0:610235504baa | 309 | eth.init(); //Use DHCP |
sunyiming | 0:610235504baa | 310 | // eth.init(IP,MASK,GATEWAY); //IP,mask,Gateway |
sunyiming | 0:610235504baa | 311 | eth.connect(); |
sunyiming | 0:610235504baa | 312 | printf("IP Address is %s\n\r", eth.getIPAddress()); |
sunyiming | 0:610235504baa | 313 | |
sunyiming | 0:610235504baa | 314 | //setup tcp socket |
sunyiming | 0:610235504baa | 315 | if(svr.bind(PORT)< 0) { |
sunyiming | 0:610235504baa | 316 | printf("tcp server bind failed.\n\r"); |
sunyiming | 0:610235504baa | 317 | return -1; |
sunyiming | 0:610235504baa | 318 | } else { |
sunyiming | 0:610235504baa | 319 | printf("tcp server bind successed.\n\r"); |
sunyiming | 0:610235504baa | 320 | serverIsListened = true; |
sunyiming | 0:610235504baa | 321 | } |
sunyiming | 0:610235504baa | 322 | |
sunyiming | 0:610235504baa | 323 | if(svr.listen(1) < 0) { |
sunyiming | 0:610235504baa | 324 | printf("tcp server listen failed.\n\r"); |
sunyiming | 0:610235504baa | 325 | return -1; |
sunyiming | 0:610235504baa | 326 | } else { |
sunyiming | 0:610235504baa | 327 | printf("tcp server is listening...\n\r"); |
sunyiming | 0:610235504baa | 328 | } |
sunyiming | 0:610235504baa | 329 | |
sunyiming | 0:610235504baa | 330 | //listening for http GET request |
sunyiming | 0:610235504baa | 331 | while (serverIsListened) { |
sunyiming | 0:610235504baa | 332 | //blocking mode(never timeout) |
sunyiming | 0:610235504baa | 333 | if(svr.accept(client)<0) { |
sunyiming | 0:610235504baa | 334 | printf("failed to accept connection.\n\r"); |
sunyiming | 0:610235504baa | 335 | } else { |
sunyiming | 0:610235504baa | 336 | //client.set_blocking(false,5000); //5000=5sec |
sunyiming | 0:610235504baa | 337 | printf("connection success!\n\rIP: %s\n\r",client.get_address()); |
sunyiming | 0:610235504baa | 338 | clientIsConnected = true; |
sunyiming | 0:610235504baa | 339 | led2 = true; |
sunyiming | 0:610235504baa | 340 | while(clientIsConnected) { |
sunyiming | 0:610235504baa | 341 | char buffer[1024] = {}; |
sunyiming | 0:610235504baa | 342 | switch(client.receive(buffer, 1023)) { |
sunyiming | 0:610235504baa | 343 | case 0: |
sunyiming | 0:610235504baa | 344 | printf("recieved buffer is empty.\n\r"); |
sunyiming | 0:610235504baa | 345 | clientIsConnected = false; |
sunyiming | 0:610235504baa | 346 | break; |
sunyiming | 0:610235504baa | 347 | case -1: |
sunyiming | 0:610235504baa | 348 | printf("failed to read data from client.\n\r"); |
sunyiming | 0:610235504baa | 349 | clientIsConnected = false; |
sunyiming | 0:610235504baa | 350 | break; |
sunyiming | 0:610235504baa | 351 | default: |
sunyiming | 0:610235504baa | 352 | printf("Recieved Data: %d\n\r\n\r%.*s\n\r",strlen(buffer),strlen(buffer),buffer); |
sunyiming | 0:610235504baa | 353 | parseHTTPRequest(buffer); |
sunyiming | 0:610235504baa | 354 | //if(buffer[0] == 'G' && buffer[1] == 'E' && buffer[2] == 'T' ) { |
sunyiming | 0:610235504baa | 355 | if (strcmp(sMethod, "GET" ) == 0 ) { |
sunyiming | 0:610235504baa | 356 | printf("GET request incomming.\n\r"); |
sunyiming | 0:610235504baa | 357 | processHTTP(sMethod, sURL, sProtocol); |
sunyiming | 0:610235504baa | 358 | clientIsConnected = false; |
sunyiming | 0:610235504baa | 359 | }//if get |
sunyiming | 0:610235504baa | 360 | break; |
sunyiming | 0:610235504baa | 361 | } //switch |
sunyiming | 0:610235504baa | 362 | //ledTick.attach(&ledTickfunc,0.5); |
sunyiming | 0:610235504baa | 363 | }//while |
sunyiming | 0:610235504baa | 364 | printf("close connection.\n\rHTTP server is listening...\n\r\n"); |
sunyiming | 0:610235504baa | 365 | client.close(); |
sunyiming | 0:610235504baa | 366 | Thread::wait(50); |
sunyiming | 0:610235504baa | 367 | led2 = false; |
sunyiming | 0:610235504baa | 368 | } |
sunyiming | 0:610235504baa | 369 | } |
sunyiming | 0:610235504baa | 370 | |
sunyiming | 0:610235504baa | 371 | } |