Working Maveric

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?

UserRevisionLine numberNew 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