Quentin Mettraux
/
MAVErIC_TEST
Working Maveric
HTTPServer.cpp@6:ef95300898b2, 2017-05-30 (annotated)
- Committer:
- mettrque
- Date:
- Tue May 30 21:11:54 2017 +0000
- Revision:
- 6:ef95300898b2
- Parent:
- 3:f2576c4a2862
- Child:
- 9:b6a9d1c44ed9
Working now
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
mettrque | 0:bdca5e4773dd | 1 | /* |
mettrque | 0:bdca5e4773dd | 2 | * HTTPServer.cpp |
mettrque | 0:bdca5e4773dd | 3 | * Copyright (c) 2017, ZHAW |
mettrque | 0:bdca5e4773dd | 4 | * All rights reserved. |
mettrque | 0:bdca5e4773dd | 5 | * |
mettrque | 0:bdca5e4773dd | 6 | * Created on: 02.02.2017 |
mettrque | 0:bdca5e4773dd | 7 | * Author: Marcel Honegger |
mettrque | 0:bdca5e4773dd | 8 | */ |
mettrque | 0:bdca5e4773dd | 9 | |
mettrque | 0:bdca5e4773dd | 10 | #include "HTTPScript.h" |
mettrque | 0:bdca5e4773dd | 11 | #include "HTTPServer.h" |
mettrque | 0:bdca5e4773dd | 12 | |
mettrque | 0:bdca5e4773dd | 13 | using namespace std; |
mettrque | 0:bdca5e4773dd | 14 | |
mettrque | 6:ef95300898b2 | 15 | inline string int2String(int32_t i) |
mettrque | 6:ef95300898b2 | 16 | { |
mettrque | 6:ef95300898b2 | 17 | |
mettrque | 0:bdca5e4773dd | 18 | char buffer[32]; |
mettrque | 0:bdca5e4773dd | 19 | sprintf(buffer, "%d", i); |
mettrque | 6:ef95300898b2 | 20 | |
mettrque | 0:bdca5e4773dd | 21 | return string(buffer); |
mettrque | 0:bdca5e4773dd | 22 | } |
mettrque | 0:bdca5e4773dd | 23 | |
mettrque | 0:bdca5e4773dd | 24 | /** |
mettrque | 0:bdca5e4773dd | 25 | * Create and initialize an http server object. |
mettrque | 0:bdca5e4773dd | 26 | * @param ethernet a reference to the embedded TCP/IP stack to use. |
mettrque | 0:bdca5e4773dd | 27 | */ |
mettrque | 6:ef95300898b2 | 28 | HTTPServer::HTTPServer(EthernetInterface* ethernet, FATFileSystem& fileSystem) : fileSystem(fileSystem), thread(osPriorityNormal, STACK_SIZE) |
mettrque | 6:ef95300898b2 | 29 | { |
mettrque | 6:ef95300898b2 | 30 | |
mettrque | 0:bdca5e4773dd | 31 | this->ethernet = ethernet; |
mettrque | 6:ef95300898b2 | 32 | |
mettrque | 0:bdca5e4773dd | 33 | // start thread |
mettrque | 6:ef95300898b2 | 34 | |
mettrque | 0:bdca5e4773dd | 35 | thread.start(callback(this, &HTTPServer::run)); |
mettrque | 0:bdca5e4773dd | 36 | } |
mettrque | 0:bdca5e4773dd | 37 | |
mettrque | 0:bdca5e4773dd | 38 | /** |
mettrque | 0:bdca5e4773dd | 39 | * Delete the http server object. |
mettrque | 0:bdca5e4773dd | 40 | */ |
mettrque | 0:bdca5e4773dd | 41 | HTTPServer::~HTTPServer() {} |
mettrque | 0:bdca5e4773dd | 42 | |
mettrque | 0:bdca5e4773dd | 43 | /** |
mettrque | 0:bdca5e4773dd | 44 | * Registers the given script with the http server. |
mettrque | 0:bdca5e4773dd | 45 | * This allows to call a method of this script object |
mettrque | 0:bdca5e4773dd | 46 | * through virtual cgi-bin requests from a remote system. |
mettrque | 0:bdca5e4773dd | 47 | */ |
mettrque | 6:ef95300898b2 | 48 | void HTTPServer::add(string name, HTTPScript* httpScript) |
mettrque | 6:ef95300898b2 | 49 | { |
mettrque | 6:ef95300898b2 | 50 | |
mettrque | 0:bdca5e4773dd | 51 | httpScriptNames.push_back(name); |
mettrque | 0:bdca5e4773dd | 52 | httpScripts.push_back(httpScript); |
mettrque | 0:bdca5e4773dd | 53 | } |
mettrque | 0:bdca5e4773dd | 54 | |
mettrque | 0:bdca5e4773dd | 55 | /** |
mettrque | 0:bdca5e4773dd | 56 | * Decodes a given URL string into a standard text string. |
mettrque | 0:bdca5e4773dd | 57 | */ |
mettrque | 6:ef95300898b2 | 58 | string HTTPServer::urlDecoder(string url) |
mettrque | 6:ef95300898b2 | 59 | { |
mettrque | 6:ef95300898b2 | 60 | |
mettrque | 0:bdca5e4773dd | 61 | size_t pos = 0; |
mettrque | 0:bdca5e4773dd | 62 | while ((pos = url.find("+")) != string::npos) url = url.substr(0, pos)+" "+url.substr(pos+1); |
mettrque | 0:bdca5e4773dd | 63 | while ((pos = url.find("%08")) != string::npos) url = url.substr(0, pos)+"\b"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 64 | while ((pos = url.find("%09")) != string::npos) url = url.substr(0, pos)+"\t"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 65 | while ((pos = url.find("%0A")) != string::npos) url = url.substr(0, pos)+"\n"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 66 | while ((pos = url.find("%0D")) != string::npos) url = url.substr(0, pos)+"\r"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 67 | while ((pos = url.find("%20")) != string::npos) url = url.substr(0, pos)+" "+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 68 | while ((pos = url.find("%22")) != string::npos) url = url.substr(0, pos)+"\""+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 69 | while ((pos = url.find("%23")) != string::npos) url = url.substr(0, pos)+"#"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 70 | while ((pos = url.find("%24")) != string::npos) url = url.substr(0, pos)+"$"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 71 | while ((pos = url.find("%25")) != string::npos) url = url.substr(0, pos)+"%"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 72 | while ((pos = url.find("%26")) != string::npos) url = url.substr(0, pos)+"&"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 73 | while ((pos = url.find("%2B")) != string::npos) url = url.substr(0, pos)+"+"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 74 | while ((pos = url.find("%2C")) != string::npos) url = url.substr(0, pos)+","+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 75 | while ((pos = url.find("%2F")) != string::npos) url = url.substr(0, pos)+"/"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 76 | while ((pos = url.find("%3A")) != string::npos) url = url.substr(0, pos)+":"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 77 | while ((pos = url.find("%3B")) != string::npos) url = url.substr(0, pos)+";"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 78 | while ((pos = url.find("%3C")) != string::npos) url = url.substr(0, pos)+"<"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 79 | while ((pos = url.find("%3D")) != string::npos) url = url.substr(0, pos)+"="+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 80 | while ((pos = url.find("%3E")) != string::npos) url = url.substr(0, pos)+">"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 81 | while ((pos = url.find("%3F")) != string::npos) url = url.substr(0, pos)+"?"+url.substr(pos+3); |
mettrque | 0:bdca5e4773dd | 82 | while ((pos = url.find("%40")) != string::npos) url = url.substr(0, pos)+"@"+url.substr(pos+3); |
mettrque | 6:ef95300898b2 | 83 | |
mettrque | 0:bdca5e4773dd | 84 | return url; |
mettrque | 0:bdca5e4773dd | 85 | } |
mettrque | 0:bdca5e4773dd | 86 | |
mettrque | 0:bdca5e4773dd | 87 | /** |
mettrque | 0:bdca5e4773dd | 88 | * This <code>run()</code> method binds the TCP/IP server to a given port number |
mettrque | 0:bdca5e4773dd | 89 | * and enters an infinite loop that waits for http requests and then processes |
mettrque | 0:bdca5e4773dd | 90 | * these requests and returns a response. |
mettrque | 0:bdca5e4773dd | 91 | */ |
mettrque | 6:ef95300898b2 | 92 | void HTTPServer::run() |
mettrque | 6:ef95300898b2 | 93 | { |
mettrque | 0:bdca5e4773dd | 94 | // bind the server to a given port number |
mettrque | 6:ef95300898b2 | 95 | |
mettrque | 0:bdca5e4773dd | 96 | server.open(ethernet); |
mettrque | 0:bdca5e4773dd | 97 | server.bind(PORT_NUMBER); |
mettrque | 0:bdca5e4773dd | 98 | server.listen(); |
mettrque | 6:ef95300898b2 | 99 | |
mettrque | 0:bdca5e4773dd | 100 | // enter infinite loop |
mettrque | 6:ef95300898b2 | 101 | |
mettrque | 0:bdca5e4773dd | 102 | while (true) { |
mettrque | 6:ef95300898b2 | 103 | |
mettrque | 0:bdca5e4773dd | 104 | TCPSocket client; |
mettrque | 0:bdca5e4773dd | 105 | server.accept(&client); |
mettrque | 0:bdca5e4773dd | 106 | client.set_blocking(false); // set nonblocking mode |
mettrque | 6:ef95300898b2 | 107 | client.set_timeout(1500); // set timeout after 1500 ms |
mettrque | 6:ef95300898b2 | 108 | |
mettrque | 0:bdca5e4773dd | 109 | // read input |
mettrque | 6:ef95300898b2 | 110 | |
mettrque | 6:ef95300898b2 | 111 | char inputBuffer[2048]; |
mettrque | 6:ef95300898b2 | 112 | int32_t inputSize = client.recv(inputBuffer, sizeof(inputBuffer)); |
mettrque | 6:ef95300898b2 | 113 | |
mettrque | 6:ef95300898b2 | 114 | if (inputSize > 0) { |
mettrque | 6:ef95300898b2 | 115 | |
mettrque | 6:ef95300898b2 | 116 | string input(inputBuffer, inputSize); |
mettrque | 0:bdca5e4773dd | 117 | string header; |
mettrque | 0:bdca5e4773dd | 118 | string output; |
mettrque | 6:ef95300898b2 | 119 | |
mettrque | 0:bdca5e4773dd | 120 | // parse input |
mettrque | 6:ef95300898b2 | 121 | |
mettrque | 0:bdca5e4773dd | 122 | if ((input.find("GET") == 0) || (input.find("HEAD") == 0)) { |
mettrque | 6:ef95300898b2 | 123 | |
mettrque | 0:bdca5e4773dd | 124 | if (input.find("cgi-bin") != string::npos) { |
mettrque | 6:ef95300898b2 | 125 | |
mettrque | 0:bdca5e4773dd | 126 | // process script request with arguments |
mettrque | 6:ef95300898b2 | 127 | |
mettrque | 0:bdca5e4773dd | 128 | string script = input.substr(input.find("cgi-bin/")+8, input.find(" ", input.find("cgi-bin/")+8)-input.find("cgi-bin/")-8); |
mettrque | 0:bdca5e4773dd | 129 | string name; |
mettrque | 0:bdca5e4773dd | 130 | vector<string> names; |
mettrque | 0:bdca5e4773dd | 131 | vector<string> values; |
mettrque | 6:ef95300898b2 | 132 | |
mettrque | 0:bdca5e4773dd | 133 | if (script.find("?") != string::npos) { |
mettrque | 6:ef95300898b2 | 134 | |
mettrque | 0:bdca5e4773dd | 135 | name = script.substr(0, script.find("?")); |
mettrque | 0:bdca5e4773dd | 136 | script = script.substr(script.find("?")+1); |
mettrque | 6:ef95300898b2 | 137 | |
mettrque | 0:bdca5e4773dd | 138 | vector<string> arguments; |
mettrque | 0:bdca5e4773dd | 139 | while (script.find("&") != string::npos) { |
mettrque | 0:bdca5e4773dd | 140 | arguments.push_back(script.substr(0, script.find("&"))); |
mettrque | 0:bdca5e4773dd | 141 | script = script.substr(script.find("&")+1); |
mettrque | 0:bdca5e4773dd | 142 | } |
mettrque | 0:bdca5e4773dd | 143 | arguments.push_back(script); |
mettrque | 6:ef95300898b2 | 144 | |
mettrque | 0:bdca5e4773dd | 145 | for (int32_t i = 0; i < arguments.size(); i++) { |
mettrque | 6:ef95300898b2 | 146 | |
mettrque | 0:bdca5e4773dd | 147 | if (arguments[i].find("=") != string::npos) { |
mettrque | 6:ef95300898b2 | 148 | |
mettrque | 0:bdca5e4773dd | 149 | names.push_back(arguments[i].substr(0, arguments[i].find("="))); |
mettrque | 0:bdca5e4773dd | 150 | values.push_back(urlDecoder(arguments[i].substr(arguments[i].find("=")+1))); |
mettrque | 6:ef95300898b2 | 151 | |
mettrque | 0:bdca5e4773dd | 152 | } else { |
mettrque | 6:ef95300898b2 | 153 | |
mettrque | 0:bdca5e4773dd | 154 | names.push_back(arguments[i]); |
mettrque | 0:bdca5e4773dd | 155 | values.push_back(""); |
mettrque | 0:bdca5e4773dd | 156 | } |
mettrque | 0:bdca5e4773dd | 157 | } |
mettrque | 6:ef95300898b2 | 158 | |
mettrque | 0:bdca5e4773dd | 159 | } else { |
mettrque | 6:ef95300898b2 | 160 | |
mettrque | 0:bdca5e4773dd | 161 | name = script; |
mettrque | 0:bdca5e4773dd | 162 | } |
mettrque | 6:ef95300898b2 | 163 | |
mettrque | 0:bdca5e4773dd | 164 | // look for corresponding script |
mettrque | 6:ef95300898b2 | 165 | |
mettrque | 0:bdca5e4773dd | 166 | for (int32_t i = 0; i < min(httpScriptNames.size(), httpScripts.size()); i++) { |
mettrque | 6:ef95300898b2 | 167 | |
mettrque | 0:bdca5e4773dd | 168 | if (httpScriptNames[i].compare(name) == 0) { |
mettrque | 6:ef95300898b2 | 169 | |
mettrque | 0:bdca5e4773dd | 170 | output = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"; |
mettrque | 0:bdca5e4773dd | 171 | output += "<!DOCTYPE html>\r\n"; |
mettrque | 0:bdca5e4773dd | 172 | output += "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\r\n"; |
mettrque | 0:bdca5e4773dd | 173 | output += "<body>\r\n"; |
mettrque | 0:bdca5e4773dd | 174 | output += httpScripts[i]->call(names, values); |
mettrque | 0:bdca5e4773dd | 175 | output += "</body>\r\n"; |
mettrque | 0:bdca5e4773dd | 176 | output += "</html>\r\n"; |
mettrque | 6:ef95300898b2 | 177 | |
mettrque | 0:bdca5e4773dd | 178 | header = "HTTP/1.1 200 OK\r\n"; |
mettrque | 0:bdca5e4773dd | 179 | header += "Content-Length: "+int2String(output.size())+"\r\n"; |
mettrque | 0:bdca5e4773dd | 180 | header += "Content-Type: text/xml\r\n"; |
mettrque | 0:bdca5e4773dd | 181 | header += "Expires: 0\r\n"; |
mettrque | 0:bdca5e4773dd | 182 | header += "\r\n"; |
mettrque | 6:ef95300898b2 | 183 | |
mettrque | 0:bdca5e4773dd | 184 | output = header+output; |
mettrque | 0:bdca5e4773dd | 185 | } |
mettrque | 0:bdca5e4773dd | 186 | } |
mettrque | 6:ef95300898b2 | 187 | |
mettrque | 0:bdca5e4773dd | 188 | // requested script was not found on this server |
mettrque | 6:ef95300898b2 | 189 | |
mettrque | 0:bdca5e4773dd | 190 | if (output.size() == 0) { |
mettrque | 6:ef95300898b2 | 191 | |
mettrque | 0:bdca5e4773dd | 192 | output += "<!DOCTYPE html>\r\n"; |
mettrque | 0:bdca5e4773dd | 193 | output += "<html lang=\"en\">\r\n"; |
mettrque | 0:bdca5e4773dd | 194 | output += "<head>\r\n"; |
mettrque | 0:bdca5e4773dd | 195 | output += " <title>400 Bad Request</title>\r\n"; |
mettrque | 0:bdca5e4773dd | 196 | output += " <style type=\"text/css\">\r\n"; |
mettrque | 0:bdca5e4773dd | 197 | output += " h2 {font-family:Helvetica,Arial,sans-serif; font-size: 24; color:#FFFFFF;}\r\n"; |
mettrque | 0:bdca5e4773dd | 198 | output += " p {font-family:Helvetica,Arial,sans-serif; font-size: 14; color:#444444;}\r\n"; |
mettrque | 0:bdca5e4773dd | 199 | output += " </style>\r\n"; |
mettrque | 0:bdca5e4773dd | 200 | output += "</head>\r\n"; |
mettrque | 0:bdca5e4773dd | 201 | output += "<body leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\">\r\n"; |
mettrque | 0:bdca5e4773dd | 202 | output += " <table width=\"100%\" height=\"100%\" border=\"0\" frame=\"void\" cellspacing=\"0\" cellpadding=\"20\">\r\n"; |
mettrque | 0:bdca5e4773dd | 203 | output += " <tr>\r\n"; |
mettrque | 0:bdca5e4773dd | 204 | output += " <td width=\"100%\" height=\"30\" bgcolor=\"#0064A6\"><h2>400 Bad Request</h2></td>\r\n"; |
mettrque | 0:bdca5e4773dd | 205 | output += " </tr>\r\n"; |
mettrque | 0:bdca5e4773dd | 206 | output += " <tr>\r\n"; |
mettrque | 0:bdca5e4773dd | 207 | output += " <td valign=\"top\" style=\"border-top-width:2px; border-left-width:0px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#444444;\">\r\n"; |
mettrque | 0:bdca5e4773dd | 208 | output += " <p>The requested script could not be found on this server!</p>\r\n"; |
mettrque | 0:bdca5e4773dd | 209 | output += " </td>\r\n"; |
mettrque | 0:bdca5e4773dd | 210 | output += " </tr>\r\n"; |
mettrque | 0:bdca5e4773dd | 211 | output += " </table>\r\n"; |
mettrque | 0:bdca5e4773dd | 212 | output += "</body>\r\n"; |
mettrque | 0:bdca5e4773dd | 213 | output += "</html>\r\n"; |
mettrque | 6:ef95300898b2 | 214 | |
mettrque | 0:bdca5e4773dd | 215 | header = "HTTP/1.1 404 Not Found\r\n"; |
mettrque | 0:bdca5e4773dd | 216 | header += "Content-Length: "+int2String(output.size())+"\r\n"; |
mettrque | 0:bdca5e4773dd | 217 | header += "Content-Type: text/html\r\n"; |
mettrque | 0:bdca5e4773dd | 218 | header += "\r\n"; |
mettrque | 6:ef95300898b2 | 219 | |
mettrque | 0:bdca5e4773dd | 220 | output = header+output; |
mettrque | 0:bdca5e4773dd | 221 | } |
mettrque | 6:ef95300898b2 | 222 | |
mettrque | 0:bdca5e4773dd | 223 | client.send((char*)(output.c_str()), output.size()); |
mettrque | 6:ef95300898b2 | 224 | |
mettrque | 0:bdca5e4773dd | 225 | } else { |
mettrque | 6:ef95300898b2 | 226 | |
mettrque | 0:bdca5e4773dd | 227 | // look for file to load and transmit |
mettrque | 6:ef95300898b2 | 228 | |
mettrque | 0:bdca5e4773dd | 229 | string filename = input.substr(input.find("/")+1, input.find(" ", input.find("/"))-input.find("/")-1); |
mettrque | 6:ef95300898b2 | 230 | if (filename.size() == 0) filename = "controller.html"; |
mettrque | 6:ef95300898b2 | 231 | |
mettrque | 0:bdca5e4773dd | 232 | filename = "/local/"+filename; |
mettrque | 0:bdca5e4773dd | 233 | |
mettrque | 0:bdca5e4773dd | 234 | FILE* file = fopen(filename.c_str(), "r"); |
mettrque | 0:bdca5e4773dd | 235 | if (file) { |
mettrque | 6:ef95300898b2 | 236 | |
mettrque | 0:bdca5e4773dd | 237 | // requested file exists |
mettrque | 0:bdca5e4773dd | 238 | fseek(file, 0, SEEK_END); |
mettrque | 6:ef95300898b2 | 239 | long n = ftell(file); |
mettrque | 6:ef95300898b2 | 240 | //printf("n=%d\r\n",n); |
mettrque | 6:ef95300898b2 | 241 | |
mettrque | 6:ef95300898b2 | 242 | |
mettrque | 0:bdca5e4773dd | 243 | header = "HTTP/1.1 200 OK\r\n"; |
mettrque | 0:bdca5e4773dd | 244 | header += "Content-Length: "+int2String(n)+"\r\n"; |
mettrque | 6:ef95300898b2 | 245 | |
mettrque | 0:bdca5e4773dd | 246 | if (filename.find(".htm") != string::npos) header += "Content-Type: text/html\r\n"; |
mettrque | 0:bdca5e4773dd | 247 | else if (filename.find(".txt") != string::npos) header += "Content-Type: text/plain\r\n"; |
mettrque | 0:bdca5e4773dd | 248 | else if (filename.find(".asc") != string::npos) header += "Content-Type: text/plain\r\n"; |
mettrque | 0:bdca5e4773dd | 249 | else if (filename.find(".css") != string::npos) header += "Content-Type: text/css\r\n"; |
mettrque | 0:bdca5e4773dd | 250 | else if (filename.find(".c") != string::npos) header += "Content-Type: text/plain\r\n"; |
mettrque | 0:bdca5e4773dd | 251 | else if (filename.find(".xml") != string::npos) header += "Content-Type: text/xml\r\n"; |
mettrque | 0:bdca5e4773dd | 252 | else if (filename.find(".dtd") != string::npos) header += "Content-Type: text/xml\r\n"; |
mettrque | 0:bdca5e4773dd | 253 | else if (filename.find(".js") != string::npos) header += "Content-Type: text/javascript\r\n"; |
mettrque | 0:bdca5e4773dd | 254 | else if (filename.find(".gif") != string::npos) header += "Content-Type: image/gif\r\n"; |
mettrque | 0:bdca5e4773dd | 255 | else if (filename.find(".jpg") != string::npos) header += "Content-Type: image/jpeg\r\n"; |
mettrque | 0:bdca5e4773dd | 256 | else if (filename.find(".png") != string::npos) header += "Content-Type: image/png\r\n"; |
mettrque | 0:bdca5e4773dd | 257 | else if (filename.find(".xbm") != string::npos) header += "Content-Type: image/x-xbitmap\r\n"; |
mettrque | 0:bdca5e4773dd | 258 | else if (filename.find(".xpm") != string::npos) header += "Content-Type: image/x-xpixmap\r\n"; |
mettrque | 0:bdca5e4773dd | 259 | else if (filename.find(".xwd") != string::npos) header += "Content-Type: image/x-xwindowdump\r\n"; |
mettrque | 0:bdca5e4773dd | 260 | else if (filename.find(".jar") != string::npos) header += "Content-Type: application/x-java-applet\r\n"; |
mettrque | 0:bdca5e4773dd | 261 | else if (filename.find(".pdf") != string::npos) header += "Content-Type: application/pdf\r\n"; |
mettrque | 0:bdca5e4773dd | 262 | else if (filename.find(".sig") != string::npos) header += "Content-Type: application/pgp-signature\r\n"; |
mettrque | 0:bdca5e4773dd | 263 | else if (filename.find(".spl") != string::npos) header += "Content-Type: application/futuresplash\r\n"; |
mettrque | 0:bdca5e4773dd | 264 | else if (filename.find(".ps") != string::npos) header += "Content-Type: application/postscript\r\n"; |
mettrque | 0:bdca5e4773dd | 265 | else if (filename.find(".dvi") != string::npos) header += "Content-Type: application/x-dvi\r\n"; |
mettrque | 0:bdca5e4773dd | 266 | else if (filename.find(".pac") != string::npos) header += "Content-Type: application/x-ns-proxy-autoconfig\r\n"; |
mettrque | 0:bdca5e4773dd | 267 | else if (filename.find(".swf") != string::npos) header += "Content-Type: application/x-shockwave-flash\r\n"; |
mettrque | 0:bdca5e4773dd | 268 | else if (filename.find(".tar.gz") != string::npos) header += "Content-Type: application/x-tgz\r\n"; |
mettrque | 0:bdca5e4773dd | 269 | else if (filename.find(".tar.bz2") != string::npos) header += "Content-Type: application/x-bzip-compressed-tar\r\n"; |
mettrque | 0:bdca5e4773dd | 270 | else if (filename.find(".gz") != string::npos) header += "Content-Type: application/x-gzip\r\n"; |
mettrque | 0:bdca5e4773dd | 271 | else if (filename.find(".tgz") != string::npos) header += "Content-Type: application/x-tgz\r\n"; |
mettrque | 0:bdca5e4773dd | 272 | else if (filename.find(".tar") != string::npos) header += "Content-Type: application/x-tar\r\n"; |
mettrque | 0:bdca5e4773dd | 273 | else if (filename.find(".bz2") != string::npos) header += "Content-Type: application/x-bzip\r\n"; |
mettrque | 0:bdca5e4773dd | 274 | else if (filename.find(".tbz") != string::npos) header += "Content-Type: application/x-bzip-compressed-tar\r\n"; |
mettrque | 0:bdca5e4773dd | 275 | else if (filename.find(".zip") != string::npos) header += "Content-Type: application/zip\r\n"; |
mettrque | 0:bdca5e4773dd | 276 | else if (filename.find(".mp3") != string::npos) header += "Content-Type: audio/mpeg\r\n"; |
mettrque | 0:bdca5e4773dd | 277 | else if (filename.find(".m3u") != string::npos) header += "Content-Type: audio/x-mpegurl\r\n"; |
mettrque | 0:bdca5e4773dd | 278 | else if (filename.find(".wma") != string::npos) header += "Content-Type: audio/x-ms-wma\r\n"; |
mettrque | 0:bdca5e4773dd | 279 | else if (filename.find(".wax") != string::npos) header += "Content-Type: audio/x-ms-wax\r\n"; |
mettrque | 0:bdca5e4773dd | 280 | else if (filename.find(".wav") != string::npos) header += "Content-Type: audio/x-wav\r\n"; |
mettrque | 0:bdca5e4773dd | 281 | else if (filename.find(".ogg") != string::npos) header += "Content-Type: audio/x-wav\r\n"; |
mettrque | 0:bdca5e4773dd | 282 | else if (filename.find(".mpg") != string::npos) header += "Content-Type: video/mpeg\r\n"; |
mettrque | 0:bdca5e4773dd | 283 | else if (filename.find(".mp4") != string::npos) header += "Content-Type: video/mp4\r\n"; |
mettrque | 0:bdca5e4773dd | 284 | else if (filename.find(".mov") != string::npos) header += "Content-Type: video/quicktime\r\n"; |
mettrque | 0:bdca5e4773dd | 285 | else if (filename.find(".qt") != string::npos) header += "Content-Type: video/quicktime\r\n"; |
mettrque | 0:bdca5e4773dd | 286 | else if (filename.find(".ogv") != string::npos) header += "Content-Type: video/ogg\r\n"; |
mettrque | 0:bdca5e4773dd | 287 | else if (filename.find(".avi") != string::npos) header += "Content-Type: video/x-msvideo\r\n"; |
mettrque | 0:bdca5e4773dd | 288 | else if (filename.find(".asf") != string::npos) header += "Content-Type: video/x-ms-asf\r\n"; |
mettrque | 0:bdca5e4773dd | 289 | else if (filename.find(".asx") != string::npos) header += "Content-Type: video/x-ms-asf\r\n"; |
mettrque | 0:bdca5e4773dd | 290 | else if (filename.find(".wmv") != string::npos) header += "Content-Type: video/x-ms-wmv\r\n"; |
mettrque | 6:ef95300898b2 | 291 | |
mettrque | 0:bdca5e4773dd | 292 | header += "\r\n"; |
mettrque | 6:ef95300898b2 | 293 | |
mettrque | 0:bdca5e4773dd | 294 | client.send((uint8_t*)(header.c_str()), header.size()); // BEFORE SEND_ALL |
mettrque | 0:bdca5e4773dd | 295 | |
mettrque | 6:ef95300898b2 | 296 | |
mettrque | 6:ef95300898b2 | 297 | |
mettrque | 0:bdca5e4773dd | 298 | if (input.find("GET") == 0) { |
mettrque | 6:ef95300898b2 | 299 | |
mettrque | 6:ef95300898b2 | 300 | // transmit file |
mettrque | 6:ef95300898b2 | 301 | |
mettrque | 0:bdca5e4773dd | 302 | fseek(file, 0, SEEK_SET); |
mettrque | 6:ef95300898b2 | 303 | char* fileBuffer = new char[1024]; |
mettrque | 6:ef95300898b2 | 304 | //uint8_t fileBuffer[1024]; |
mettrque | 6:ef95300898b2 | 305 | int read = 0; |
mettrque | 6:ef95300898b2 | 306 | while ((read = fread(fileBuffer, 1, 1024, file)) > 0) { |
mettrque | 6:ef95300898b2 | 307 | int32_t send = client.send(fileBuffer, read); |
mettrque | 6:ef95300898b2 | 308 | fseek(file,-(read-send), SEEK_CUR); |
mettrque | 0:bdca5e4773dd | 309 | } |
mettrque | 6:ef95300898b2 | 310 | delete[] fileBuffer; |
mettrque | 0:bdca5e4773dd | 311 | } |
mettrque | 0:bdca5e4773dd | 312 | fclose(file); |
mettrque | 6:ef95300898b2 | 313 | |
mettrque | 0:bdca5e4773dd | 314 | } else { |
mettrque | 6:ef95300898b2 | 315 | |
mettrque | 0:bdca5e4773dd | 316 | // file not found |
mettrque | 6:ef95300898b2 | 317 | |
mettrque | 0:bdca5e4773dd | 318 | output += "<!DOCTYPE html>\r\n"; |
mettrque | 0:bdca5e4773dd | 319 | output += "<html lang=\"en\">\r\n"; |
mettrque | 0:bdca5e4773dd | 320 | output += "<head>\r\n"; |
mettrque | 6:ef95300898b2 | 321 | output += "<title>404 Not Found</title>\r\n"; |
mettrque | 6:ef95300898b2 | 322 | output += "<style type=\"text/css\">\r\n"; |
mettrque | 6:ef95300898b2 | 323 | output += " h2 {font-family:Helvetica,Arial,sans-serif; font-size: 24; color:#FFFFFF;}\r\n"; |
mettrque | 6:ef95300898b2 | 324 | output += " p {font-family:Helvetica,Arial,sans-serif; font-size: 14; color:#444444;}\r\n"; |
mettrque | 6:ef95300898b2 | 325 | output += "</style>\r\n"; |
mettrque | 0:bdca5e4773dd | 326 | output += "</head>\r\n"; |
mettrque | 0:bdca5e4773dd | 327 | output += "<body leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\">\r\n"; |
mettrque | 6:ef95300898b2 | 328 | output += "<table width=\"100%\" height=\"100%\" border=\"0\" frame=\"void\" cellspacing=\"0\" cellpadding=\"20\">\r\n"; |
mettrque | 6:ef95300898b2 | 329 | output += " <tr>\r\n"; |
mettrque | 6:ef95300898b2 | 330 | output += " <td width=\"100%\" height=\"30\" bgcolor=\"#0064A6\"><h2>404 Not Found</h2></td>\r\n"; |
mettrque | 6:ef95300898b2 | 331 | output += " </tr>\r\n"; |
mettrque | 6:ef95300898b2 | 332 | output += " <tr>\r\n"; |
mettrque | 6:ef95300898b2 | 333 | output += " <td valign=\"top\" style=\"border-top-width:2px; border-left-width:0px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#444444;\">\r\n"; |
mettrque | 6:ef95300898b2 | 334 | output += " <p>The requested file could not be found on this server!</p>\r\n"; |
mettrque | 6:ef95300898b2 | 335 | output += " </td>\r\n"; |
mettrque | 6:ef95300898b2 | 336 | output += " </tr>\r\n"; |
mettrque | 6:ef95300898b2 | 337 | output += "</table>\r\n"; |
mettrque | 0:bdca5e4773dd | 338 | output += "</body>\r\n"; |
mettrque | 0:bdca5e4773dd | 339 | output += "</html>\r\n"; |
mettrque | 6:ef95300898b2 | 340 | |
mettrque | 0:bdca5e4773dd | 341 | header = "HTTP/1.1 404 Not Found\r\n"; |
mettrque | 0:bdca5e4773dd | 342 | header += "Content-Length: "+int2String(output.size())+"\r\n"; |
mettrque | 0:bdca5e4773dd | 343 | header += "Content-Type: text/html\r\n"; |
mettrque | 0:bdca5e4773dd | 344 | header += "\r\n"; |
mettrque | 6:ef95300898b2 | 345 | |
mettrque | 0:bdca5e4773dd | 346 | output = header+output; |
mettrque | 6:ef95300898b2 | 347 | |
mettrque | 0:bdca5e4773dd | 348 | client.send((char*)(output.c_str()), output.size()); |
mettrque | 0:bdca5e4773dd | 349 | } |
mettrque | 0:bdca5e4773dd | 350 | } |
mettrque | 6:ef95300898b2 | 351 | |
mettrque | 6:ef95300898b2 | 352 | |
mettrque | 6:ef95300898b2 | 353 | |
mettrque | 0:bdca5e4773dd | 354 | } else { |
mettrque | 6:ef95300898b2 | 355 | |
mettrque | 0:bdca5e4773dd | 356 | // the http method is not known |
mettrque | 6:ef95300898b2 | 357 | |
mettrque | 0:bdca5e4773dd | 358 | output += "<!DOCTYPE html>\r\n"; |
mettrque | 0:bdca5e4773dd | 359 | output += "<html lang=\"en\">\r\n"; |
mettrque | 0:bdca5e4773dd | 360 | output += "<head>\r\n"; |
mettrque | 6:ef95300898b2 | 361 | output += "<title>400 Bad Request</title>\r\n"; |
mettrque | 6:ef95300898b2 | 362 | output += "<style type=\"text/css\">\r\n"; |
mettrque | 6:ef95300898b2 | 363 | output += " h2 {font-family:Helvetica,Arial,sans-serif; font-size: 24; color:#FFFFFF;}\r\n"; |
mettrque | 6:ef95300898b2 | 364 | output += " p {font-family:Helvetica,Arial,sans-serif; font-size: 14; color:#444444;}\r\n"; |
mettrque | 6:ef95300898b2 | 365 | output += "</style>\r\n"; |
mettrque | 0:bdca5e4773dd | 366 | output += "</head>\r\n"; |
mettrque | 0:bdca5e4773dd | 367 | output += "<body leftmargin=\"0\" topmargin=\"0\" marginwidth=\"0\" marginheight=\"0\">\r\n"; |
mettrque | 6:ef95300898b2 | 368 | output += "<table width=\"100%\" height=\"100%\" border=\"0\" frame=\"void\" cellspacing=\"0\" cellpadding=\"20\">\r\n"; |
mettrque | 6:ef95300898b2 | 369 | output += " <tr>\r\n"; |
mettrque | 6:ef95300898b2 | 370 | output += " <td width=\"100%\" height=\"30\" bgcolor=\"#0064A6\"><h2>400 Bad Request</h2></td>\r\n"; |
mettrque | 6:ef95300898b2 | 371 | output += " </tr>\r\n"; |
mettrque | 6:ef95300898b2 | 372 | output += " <tr>\r\n"; |
mettrque | 6:ef95300898b2 | 373 | output += " <td valign=\"top\" style=\"border-top-width:2px; border-left-width:0px; border-bottom-width:0px; border-right-width:0px; border-style:solid; border-color:#444444;\">\r\n"; |
mettrque | 0:bdca5e4773dd | 374 | output += " <p>The requested method is not supported by this server!</p>\r\n"; |
mettrque | 0:bdca5e4773dd | 375 | output += " </td>\r\n"; |
mettrque | 0:bdca5e4773dd | 376 | output += " </tr>\r\n"; |
mettrque | 0:bdca5e4773dd | 377 | output += " </table>\r\n"; |
mettrque | 0:bdca5e4773dd | 378 | output += "</body>\r\n"; |
mettrque | 0:bdca5e4773dd | 379 | output += "</html>\r\n"; |
mettrque | 6:ef95300898b2 | 380 | |
mettrque | 0:bdca5e4773dd | 381 | header = "HTTP/1.1 404 Not Found\r\n"; |
mettrque | 0:bdca5e4773dd | 382 | header += "Content-Length: "+int2String(output.size())+"\r\n"; |
mettrque | 0:bdca5e4773dd | 383 | header += "Content-Type: text/html\r\n"; |
mettrque | 0:bdca5e4773dd | 384 | header += "\r\n"; |
mettrque | 6:ef95300898b2 | 385 | |
mettrque | 0:bdca5e4773dd | 386 | output = header+output; |
mettrque | 6:ef95300898b2 | 387 | |
mettrque | 0:bdca5e4773dd | 388 | client.send((char*)(output.c_str()), output.size()); |
mettrque | 0:bdca5e4773dd | 389 | } |
mettrque | 0:bdca5e4773dd | 390 | } |
mettrque | 6:ef95300898b2 | 391 | |
mettrque | 0:bdca5e4773dd | 392 | client.close(); |
mettrque | 0:bdca5e4773dd | 393 | } |
mettrque | 0:bdca5e4773dd | 394 | } |
mettrque | 0:bdca5e4773dd | 395 |