LRSD stephane / Mbed 2 deprecated WEBserverv4

Dependencies:   mbed

Committer:
geiineuville
Date:
Thu Sep 22 15:59:17 2011 +0000
Revision:
0:3c32eeb9292a
V4

Who changed what in which revision?

UserRevisionLine numberNew contents of line
geiineuville 0:3c32eeb9292a 1 #ifndef HTTPFILESYSTEM_H
geiineuville 0:3c32eeb9292a 2 #define HTTPFILESYSTEM_H
geiineuville 0:3c32eeb9292a 3
geiineuville 0:3c32eeb9292a 4 #include "mbed.h"
geiineuville 0:3c32eeb9292a 5 extern char *lieu;
geiineuville 0:3c32eeb9292a 6 extern int par1;
geiineuville 0:3c32eeb9292a 7 #include "HTTPServer.h"
geiineuville 0:3c32eeb9292a 8
geiineuville 0:3c32eeb9292a 9 #define HTTP_BUFFER_SIZE 700
geiineuville 0:3c32eeb9292a 10 #define FILENAMELANGTH 100
geiineuville 0:3c32eeb9292a 11
geiineuville 0:3c32eeb9292a 12 /**
geiineuville 0:3c32eeb9292a 13 * This class will store the data which are required for an request.
geiineuville 0:3c32eeb9292a 14 * We are not in every case able to return all data at once, that means we have to store
geiineuville 0:3c32eeb9292a 15 * the actual level of transmission.
geiineuville 0:3c32eeb9292a 16 */
geiineuville 0:3c32eeb9292a 17 class HTTPFileSystemData : public HTTPData {
geiineuville 0:3c32eeb9292a 18 public:
geiineuville 0:3c32eeb9292a 19 int fleft;
geiineuville 0:3c32eeb9292a 20 int bleft;
geiineuville 0:3c32eeb9292a 21 int offset;
geiineuville 0:3c32eeb9292a 22 FILE *file;
geiineuville 0:3c32eeb9292a 23 char buffer[HTTP_BUFFER_SIZE];
geiineuville 0:3c32eeb9292a 24
geiineuville 0:3c32eeb9292a 25 virtual ~HTTPFileSystemData() {
geiineuville 0:3c32eeb9292a 26 if(file) {
geiineuville 0:3c32eeb9292a 27 fclose(file);
geiineuville 0:3c32eeb9292a 28 file = 0;
geiineuville 0:3c32eeb9292a 29 }
geiineuville 0:3c32eeb9292a 30 }
geiineuville 0:3c32eeb9292a 31 };
geiineuville 0:3c32eeb9292a 32
geiineuville 0:3c32eeb9292a 33 /**
geiineuville 0:3c32eeb9292a 34 * This class will deliver files form the virtual file system.
geiineuville 0:3c32eeb9292a 35 * Furthermore it is a simple example how to implement an HTTPHandler for big data requests.
geiineuville 0:3c32eeb9292a 36 */
geiineuville 0:3c32eeb9292a 37 class HTTPFileSystemHandler : public HTTPHandler {
geiineuville 0:3c32eeb9292a 38 public:
geiineuville 0:3c32eeb9292a 39 /**
geiineuville 0:3c32eeb9292a 40 * Create a new HTTPFileSzstemHandler.
geiineuville 0:3c32eeb9292a 41 * @param prefix The Prefix is the URL Proefix in witch the Handler will work.
geiineuville 0:3c32eeb9292a 42 * @param dir The Prefix will be directly mappt on the dir.
geiineuville 0:3c32eeb9292a 43 */
geiineuville 0:3c32eeb9292a 44 HTTPFileSystemHandler(const char *path, const char *dir) : HTTPHandler(path), _dir(dir) {}
geiineuville 0:3c32eeb9292a 45 HTTPFileSystemHandler(HTTPServer *server, const char *path, const char *dir) : HTTPHandler(path), _dir(dir) { server->addHandler(this); }
geiineuville 0:3c32eeb9292a 46
geiineuville 0:3c32eeb9292a 47 private:
geiineuville 0:3c32eeb9292a 48 /**
geiineuville 0:3c32eeb9292a 49 * Check if a requested file exists.
geiineuville 0:3c32eeb9292a 50 * If it exists open it and store the data back in the HTTPConnection.
geiineuville 0:3c32eeb9292a 51 * We would not store connection specific data into the Handler.
geiineuville 0:3c32eeb9292a 52 * If the file exists and we can serve a page return HTTP_OK else HTTP_NotFound.
geiineuville 0:3c32eeb9292a 53 */
geiineuville 0:3c32eeb9292a 54 virtual HTTPStatus init(HTTPConnection *con) const {
geiineuville 0:3c32eeb9292a 55 char filename[FILENAMELANGTH];
geiineuville 0:3c32eeb9292a 56 HTTPFileSystemData *data = new HTTPFileSystemData();
geiineuville 0:3c32eeb9292a 57 snprintf(filename, FILENAMELANGTH, "%s%s\0", _dir, con->getURL() + strlen(_prefix));
geiineuville 0:3c32eeb9292a 58 printf("fichier: %s \r\n", filename ); // verif
geiineuville 0:3c32eeb9292a 59 lieu = filename;
geiineuville 0:3c32eeb9292a 60 char ou[3] = "00";
geiineuville 0:3c32eeb9292a 61 if ( filename[15] == '?' ) // si il y a ? for metho get en HTML il y aura ?
geiineuville 0:3c32eeb9292a 62 { lieu = "/sd/testbed.htm"; //on force une reponse avec testbed.htm
geiineuville 0:3c32eeb9292a 63 ou[0] = filename[20]; // extraction parametre derriere ?varxx
geiineuville 0:3c32eeb9292a 64 ou[1] = filename[21];
geiineuville 0:3c32eeb9292a 65 ou[2] = 0;
geiineuville 0:3c32eeb9292a 66 par1 = atoi(ou); //ici on peut en creer d'autres ou tester var
geiineuville 0:3c32eeb9292a 67 }
geiineuville 0:3c32eeb9292a 68 data->file = fopen(lieu, "r");
geiineuville 0:3c32eeb9292a 69 if(!data->file) {
geiineuville 0:3c32eeb9292a 70 delete data;
geiineuville 0:3c32eeb9292a 71 return HTTP_NotFound;
geiineuville 0:3c32eeb9292a 72 }
geiineuville 0:3c32eeb9292a 73 data->fleft = fleft(data->file);
geiineuville 0:3c32eeb9292a 74 data->bleft = 0;
geiineuville 0:3c32eeb9292a 75 data->offset = 0;
geiineuville 0:3c32eeb9292a 76
geiineuville 0:3c32eeb9292a 77 con->data = data;
geiineuville 0:3c32eeb9292a 78 con->setLength(data->fleft);
geiineuville 0:3c32eeb9292a 79 loadFromFile(con);
geiineuville 0:3c32eeb9292a 80 return HTTP_OK;
geiineuville 0:3c32eeb9292a 81 }
geiineuville 0:3c32eeb9292a 82
geiineuville 0:3c32eeb9292a 83 /**
geiineuville 0:3c32eeb9292a 84 * Send the maximum available data chunk to the Client.
geiineuville 0:3c32eeb9292a 85 * If it is the last chunk close connection by returning HTTP_SuccessEnded
geiineuville 0:3c32eeb9292a 86 * @param con The connection to handle
geiineuville 0:3c32eeb9292a 87 * @param maximum The maximal available sendbuffer size.
geiineuville 0:3c32eeb9292a 88 * @return HTTP_Success when mor data is available or HTTP_SuccessEnded when the file is complete.
geiineuville 0:3c32eeb9292a 89 */
geiineuville 0:3c32eeb9292a 90 virtual HTTPHandle send(HTTPConnection *con, int maximum) const {
geiineuville 0:3c32eeb9292a 91 HTTPFileSystemData *data = static_cast<HTTPFileSystemData *>(con->data);
geiineuville 0:3c32eeb9292a 92 err_t err;
geiineuville 0:3c32eeb9292a 93 u16_t len = min(data->bleft, maximum);
geiineuville 0:3c32eeb9292a 94 // printf("Send File\n");
geiineuville 0:3c32eeb9292a 95 if(len) {
geiineuville 0:3c32eeb9292a 96 do {
geiineuville 0:3c32eeb9292a 97 err = con->write(
geiineuville 0:3c32eeb9292a 98 &data->buffer[data->offset], len, (((!data->fleft)&&(data->bleft==len))?
geiineuville 0:3c32eeb9292a 99 (TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE) : (TCP_WRITE_FLAG_COPY)));
geiineuville 0:3c32eeb9292a 100 if(err == ERR_MEM) {
geiineuville 0:3c32eeb9292a 101 len /= 2;
geiineuville 0:3c32eeb9292a 102 }
geiineuville 0:3c32eeb9292a 103 } while (err == ERR_MEM && len > 1);
geiineuville 0:3c32eeb9292a 104
geiineuville 0:3c32eeb9292a 105 if(err == ERR_OK) {
geiineuville 0:3c32eeb9292a 106 data->offset += len;
geiineuville 0:3c32eeb9292a 107 data->bleft -= len;
geiineuville 0:3c32eeb9292a 108 }
geiineuville 0:3c32eeb9292a 109 }
geiineuville 0:3c32eeb9292a 110 return loadFromFile(con);
geiineuville 0:3c32eeb9292a 111 }
geiineuville 0:3c32eeb9292a 112
geiineuville 0:3c32eeb9292a 113 /**
geiineuville 0:3c32eeb9292a 114 * Returns the left size of a file.
geiineuville 0:3c32eeb9292a 115 * @param fd The filehandler of which we want to know the filesize.
geiineuville 0:3c32eeb9292a 116 * @return The filesize of fd.
geiineuville 0:3c32eeb9292a 117 */
geiineuville 0:3c32eeb9292a 118 long fleft(FILE *fd) const {
geiineuville 0:3c32eeb9292a 119 long len, cur;
geiineuville 0:3c32eeb9292a 120 cur = ftell(fd);
geiineuville 0:3c32eeb9292a 121 fseek(fd, 0, SEEK_END);
geiineuville 0:3c32eeb9292a 122 len = ftell(fd);
geiineuville 0:3c32eeb9292a 123 fseek(fd, cur, SEEK_SET);
geiineuville 0:3c32eeb9292a 124 return len;
geiineuville 0:3c32eeb9292a 125 }
geiineuville 0:3c32eeb9292a 126
geiineuville 0:3c32eeb9292a 127 /**
geiineuville 0:3c32eeb9292a 128 * Fill the buffer if the buffer is empty.
geiineuville 0:3c32eeb9292a 129 * If the file is complete close the filehandler and return HTTP_SuccessEnded.
geiineuville 0:3c32eeb9292a 130 */
geiineuville 0:3c32eeb9292a 131 HTTPHandle loadFromFile(HTTPConnection *con) const {
geiineuville 0:3c32eeb9292a 132 HTTPFileSystemData *data = static_cast<HTTPFileSystemData *>(con->data);
geiineuville 0:3c32eeb9292a 133 if(!data->bleft) {
geiineuville 0:3c32eeb9292a 134 if(data->fleft) {
geiineuville 0:3c32eeb9292a 135 int len = fread(&data->buffer[0], sizeof(char), HTTP_BUFFER_SIZE, data->file);
geiineuville 0:3c32eeb9292a 136 data->fleft -= len;
geiineuville 0:3c32eeb9292a 137 data->bleft = len;
geiineuville 0:3c32eeb9292a 138 data->offset = 0;
geiineuville 0:3c32eeb9292a 139 } else {
geiineuville 0:3c32eeb9292a 140 if(data->file) {
geiineuville 0:3c32eeb9292a 141 fclose(data->file);
geiineuville 0:3c32eeb9292a 142 data->file = 0;
geiineuville 0:3c32eeb9292a 143 }
geiineuville 0:3c32eeb9292a 144 return HTTP_SuccessEnded;
geiineuville 0:3c32eeb9292a 145 }
geiineuville 0:3c32eeb9292a 146 }
geiineuville 0:3c32eeb9292a 147 return HTTP_Success;
geiineuville 0:3c32eeb9292a 148 }
geiineuville 0:3c32eeb9292a 149
geiineuville 0:3c32eeb9292a 150 /** The Directory which will replace the prefix of the URL */
geiineuville 0:3c32eeb9292a 151 const char *_dir;
geiineuville 0:3c32eeb9292a 152 };
geiineuville 0:3c32eeb9292a 153
geiineuville 0:3c32eeb9292a 154 #endif