HOme Sheriff And Lamp
Dependencies: CameraC328 HCSR04 SDFileSystem WIZnetInterface mbed
Fork of HoSAL by
rev_httpFile.cpp@10:0868448017da, 2015-08-12 (annotated)
- Committer:
- Gunn
- Date:
- Wed Aug 12 10:18:46 2015 +0000
- Revision:
- 10:0868448017da
- Parent:
- 5:217f40f0a415
- Child:
- 12:974f7a96d6ab
lgh
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
uasonice | 3:8c4e0e7c8cea | 1 | /* |
uasonice | 3:8c4e0e7c8cea | 2 | # coded by revival / uasonice (at) gmail.com |
uasonice | 3:8c4e0e7c8cea | 3 | # DATE: 2015/08/10 / Mon Aug 10 00:01:54 KST 2015 |
uasonice | 3:8c4e0e7c8cea | 4 | # |
uasonice | 3:8c4e0e7c8cea | 5 | # DESCRIPTION: |
uasonice | 3:8c4e0e7c8cea | 6 | # http file server |
uasonice | 3:8c4e0e7c8cea | 7 | */ |
uasonice | 3:8c4e0e7c8cea | 8 | |
uasonice | 3:8c4e0e7c8cea | 9 | #include "mbed.h" |
uasonice | 3:8c4e0e7c8cea | 10 | #include "EthernetInterface.h" |
uasonice | 3:8c4e0e7c8cea | 11 | #include "SDFileSystem.h" |
uasonice | 3:8c4e0e7c8cea | 12 | #include <stdio.h> |
uasonice | 3:8c4e0e7c8cea | 13 | #include <string.h> |
uasonice | 3:8c4e0e7c8cea | 14 | |
uasonice | 3:8c4e0e7c8cea | 15 | #define DEBUG_TYPE 1 |
uasonice | 3:8c4e0e7c8cea | 16 | #define P_ uart.printf |
uasonice | 3:8c4e0e7c8cea | 17 | #include "rev_config.h" |
uasonice | 3:8c4e0e7c8cea | 18 | |
uasonice | 3:8c4e0e7c8cea | 19 | #include "rev_httpFile.h" |
uasonice | 3:8c4e0e7c8cea | 20 | |
uasonice | 3:8c4e0e7c8cea | 21 | #if defined(USE_HTTP_FILE_SERVER) |
uasonice | 3:8c4e0e7c8cea | 22 | //Serial uart(USBTX, USBRX); |
uasonice | 3:8c4e0e7c8cea | 23 | |
uasonice | 3:8c4e0e7c8cea | 24 | //TCPSocketServer server; |
uasonice | 3:8c4e0e7c8cea | 25 | //TCPSocketConnection client; |
uasonice | 3:8c4e0e7c8cea | 26 | |
uasonice | 3:8c4e0e7c8cea | 27 | char buffer[HTTPD_MAX_REQ_LENGTH]; |
uasonice | 3:8c4e0e7c8cea | 28 | char httpHeader[HTTPD_MAX_HDR_LENGTH+1]; |
uasonice | 3:8c4e0e7c8cea | 29 | char fileName[HTTPD_MAX_FNAME_LENGTH+1]; |
uasonice | 3:8c4e0e7c8cea | 30 | char dirName[HTTPD_MAX_DNAME_LENGTH+1]; |
uasonice | 3:8c4e0e7c8cea | 31 | char *uristr; |
uasonice | 3:8c4e0e7c8cea | 32 | char *eou; |
uasonice | 3:8c4e0e7c8cea | 33 | |
uasonice | 3:8c4e0e7c8cea | 34 | FILE *fp; |
uasonice | 3:8c4e0e7c8cea | 35 | int rdCnt; |
uasonice | 3:8c4e0e7c8cea | 36 | |
uasonice | 3:8c4e0e7c8cea | 37 | //DigitalOut led1(LED1); //server listning status |
uasonice | 3:8c4e0e7c8cea | 38 | //DigitalOut led2(LED2); //socket connecting status |
uasonice | 3:8c4e0e7c8cea | 39 | |
uasonice | 3:8c4e0e7c8cea | 40 | |
uasonice | 3:8c4e0e7c8cea | 41 | void get_file(char* uri) |
uasonice | 3:8c4e0e7c8cea | 42 | { |
uasonice | 3:8c4e0e7c8cea | 43 | DM_FLN("get_file %s", uri); |
uasonice | 3:8c4e0e7c8cea | 44 | char *lstchr = strrchr(uri, NULL) -1; |
uasonice | 3:8c4e0e7c8cea | 45 | if ('/' == *lstchr) { |
uasonice | 3:8c4e0e7c8cea | 46 | DM_FLN("Open directory /sd%s", uri); |
uasonice | 3:8c4e0e7c8cea | 47 | *lstchr = 0; |
uasonice | 3:8c4e0e7c8cea | 48 | sprintf(fileName, "/sd%s", uri); |
uasonice | 3:8c4e0e7c8cea | 49 | DIR *d = opendir(fileName); |
uasonice | 3:8c4e0e7c8cea | 50 | if (d != NULL) { |
uasonice | 3:8c4e0e7c8cea | 51 | sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); |
uasonice | 3:8c4e0e7c8cea | 52 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 53 | sprintf(httpHeader,"<html><head><title>Directory Listing</title></head><body><h1>%s Directory Listing</h1><ul>", uri); |
uasonice | 3:8c4e0e7c8cea | 54 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 55 | struct dirent *p; |
uasonice | 3:8c4e0e7c8cea | 56 | while((p = readdir(d)) != NULL) { |
uasonice | 3:8c4e0e7c8cea | 57 | sprintf(dirName, "%s/%s", fileName, p->d_name); |
uasonice | 3:8c4e0e7c8cea | 58 | DM_FLN("%s", dirName); |
uasonice | 3:8c4e0e7c8cea | 59 | DIR *subDir = opendir(dirName); |
uasonice | 3:8c4e0e7c8cea | 60 | if (subDir != NULL) { |
Gunn | 10:0868448017da | 61 | /* sprintf(httpHeader,"<li><a href=\"./%s/\">%s/</a></li>", p->d_name, p->d_name); */ |
Gunn | 10:0868448017da | 62 | sprintf(httpHeader,"<li><img width=50 height=50 src=\"./%s/\">%s/</li>", p->d_name, p->d_name); |
uasonice | 3:8c4e0e7c8cea | 63 | } else { |
uasonice | 3:8c4e0e7c8cea | 64 | sprintf(httpHeader,"<li><a href=\"./%s\">%s</a></li>", p->d_name, p->d_name); |
uasonice | 3:8c4e0e7c8cea | 65 | } |
uasonice | 3:8c4e0e7c8cea | 66 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 67 | } |
uasonice | 3:8c4e0e7c8cea | 68 | } |
uasonice | 3:8c4e0e7c8cea | 69 | closedir(d); |
uasonice | 3:8c4e0e7c8cea | 70 | DM_FLN("Directory closed"); |
uasonice | 3:8c4e0e7c8cea | 71 | sprintf(httpHeader,"</ul></body></html>"); |
uasonice | 3:8c4e0e7c8cea | 72 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 73 | } else { |
uasonice | 3:8c4e0e7c8cea | 74 | sprintf(fileName, "/sd%s", uri); |
uasonice | 3:8c4e0e7c8cea | 75 | fp = fopen(fileName, "r"); |
uasonice | 3:8c4e0e7c8cea | 76 | if (fp == NULL) { |
uasonice | 3:8c4e0e7c8cea | 77 | DM_FLN("File not found"); |
uasonice | 3:8c4e0e7c8cea | 78 | sprintf(httpHeader,"HTTP/1.1 404 Not Found \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
uasonice | 3:8c4e0e7c8cea | 79 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 80 | client.send(uri,strlen(uri)); |
uasonice | 3:8c4e0e7c8cea | 81 | } else { |
uasonice | 3:8c4e0e7c8cea | 82 | DM_FLN("Sending: header"); |
uasonice | 3:8c4e0e7c8cea | 83 | sprintf(httpHeader,"HTTP/1.1 200 OK\r\nContent-Type: text/html\r\nConnection: Close\r\n\r\n"); |
uasonice | 3:8c4e0e7c8cea | 84 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 85 | DM_FLN(" file"); |
uasonice | 3:8c4e0e7c8cea | 86 | while ((rdCnt = fread(buffer, sizeof( char ), HTTPD_MAX_REQ_LENGTH, fp)) == HTTPD_MAX_REQ_LENGTH) { |
uasonice | 3:8c4e0e7c8cea | 87 | client.send(buffer, rdCnt); |
uasonice | 5:217f40f0a415 | 88 | DM_("."); |
uasonice | 3:8c4e0e7c8cea | 89 | } |
uasonice | 3:8c4e0e7c8cea | 90 | client.send(buffer, rdCnt); |
uasonice | 3:8c4e0e7c8cea | 91 | fclose(fp); |
uasonice | 3:8c4e0e7c8cea | 92 | DM_FLN("done"); |
uasonice | 3:8c4e0e7c8cea | 93 | } |
uasonice | 3:8c4e0e7c8cea | 94 | } |
uasonice | 3:8c4e0e7c8cea | 95 | } |
uasonice | 3:8c4e0e7c8cea | 96 | |
uasonice | 3:8c4e0e7c8cea | 97 | void fileServer(void) |
uasonice | 3:8c4e0e7c8cea | 98 | { |
uasonice | 5:217f40f0a415 | 99 | int ret; |
uasonice | 5:217f40f0a415 | 100 | |
uasonice | 5:217f40f0a415 | 101 | //DM_FLN("Wait for new connection..."); |
uasonice | 5:217f40f0a415 | 102 | ret = server.accept(client); |
uasonice | 5:217f40f0a415 | 103 | if(ret < 0) return; |
uasonice | 3:8c4e0e7c8cea | 104 | client.set_blocking(false, 1500); // Timeout after 1500ms |
uasonice | 3:8c4e0e7c8cea | 105 | |
uasonice | 3:8c4e0e7c8cea | 106 | DM_FLN("Connection from: %s", client.get_address()); |
uasonice | 3:8c4e0e7c8cea | 107 | while (true) { |
uasonice | 3:8c4e0e7c8cea | 108 | led2 = true; |
uasonice | 3:8c4e0e7c8cea | 109 | int n = client.receive(buffer, sizeof(buffer)); |
uasonice | 3:8c4e0e7c8cea | 110 | if (n <= 0) break; |
uasonice | 3:8c4e0e7c8cea | 111 | DM_FLN("Recieved Data: %d\r\n\r\n%.*s",n,n,buffer); |
uasonice | 3:8c4e0e7c8cea | 112 | if (n >= 1024) { |
uasonice | 3:8c4e0e7c8cea | 113 | sprintf(httpHeader,"HTTP/1.1 413 Request Entity Too Large \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
uasonice | 3:8c4e0e7c8cea | 114 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 115 | client.send(buffer,n); |
uasonice | 3:8c4e0e7c8cea | 116 | break; |
uasonice | 3:8c4e0e7c8cea | 117 | } else { |
uasonice | 3:8c4e0e7c8cea | 118 | buffer[n]=0; |
uasonice | 3:8c4e0e7c8cea | 119 | } |
uasonice | 3:8c4e0e7c8cea | 120 | if (!strncmp(buffer, "GET ", 4)) { |
uasonice | 3:8c4e0e7c8cea | 121 | uristr = buffer + 4; |
uasonice | 3:8c4e0e7c8cea | 122 | eou = strstr(uristr, " "); |
uasonice | 3:8c4e0e7c8cea | 123 | if (eou == NULL) { |
uasonice | 3:8c4e0e7c8cea | 124 | sprintf(httpHeader,"HTTP/1.1 400 Bad Request \r\nContent-Type: text\r\nConnection: Close\r\n\r\n"); |
uasonice | 3:8c4e0e7c8cea | 125 | client.send(httpHeader,strlen(httpHeader)); |
uasonice | 3:8c4e0e7c8cea | 126 | client.send(buffer,n); |
uasonice | 3:8c4e0e7c8cea | 127 | } else { |
uasonice | 3:8c4e0e7c8cea | 128 | *eou = 0; |
uasonice | 3:8c4e0e7c8cea | 129 | get_file(uristr); |
uasonice | 3:8c4e0e7c8cea | 130 | } |
uasonice | 3:8c4e0e7c8cea | 131 | } |
uasonice | 3:8c4e0e7c8cea | 132 | } |
uasonice | 3:8c4e0e7c8cea | 133 | led2 = false; |
uasonice | 3:8c4e0e7c8cea | 134 | client.close(); |
uasonice | 3:8c4e0e7c8cea | 135 | return; |
uasonice | 3:8c4e0e7c8cea | 136 | } |
uasonice | 3:8c4e0e7c8cea | 137 | #endif // defined(USE_HTTP_FILE_SERVER) |
uasonice | 3:8c4e0e7c8cea | 138 | |
uasonice | 3:8c4e0e7c8cea | 139 | |
uasonice | 3:8c4e0e7c8cea | 140 |