From dc0d7544aa587d3488ad78b593a494c77e98a6aa Mon Sep 17 00:00:00 2001 From: Bazsalanszky Date: Sun, 24 Nov 2019 23:23:48 +0100 Subject: [PATCH] Modified the Web Interface and finished documentation ins all files --- main.c | 2 +- modules/config.h | 3 ++ modules/peer.h | 10 ++-- modules/server.c | 2 +- modules/server.h | 33 ++++++------ modules/webio.c | 101 ++++++++++++++++++++++--------------- modules/webio.h | 127 +++++++++++++++++++++++++++++++++++++---------- 7 files changed, 189 insertions(+), 89 deletions(-) diff --git a/main.c b/main.c index 2fadb0e..6814b97 100644 --- a/main.c +++ b/main.c @@ -67,7 +67,7 @@ int main(void) { WebIO webIo; - res = webio_create(config,mynode, &webIo); + res = webio_create(config,&peerList1, &webIo); if (res != 0) { return EXIT_FAILURE; } diff --git a/modules/config.h b/modules/config.h index fc3bfa8..c1c92bc 100644 --- a/modules/config.h +++ b/modules/config.h @@ -9,12 +9,15 @@ #include "../utility.h" #include "../lib/map.h" #include "../lib/debugmalloc/debugmalloc.h" +//! Az alapértelmezett hallgató portszám #ifdef RANDOM_PORT #define DEFAULT_PORT "0" #else #define DEFAULT_PORT "6327" #endif +//! Az alapértelmezett hallgató portszám a felhasználói felület számára #define DEFAULT_INTERFACE_PORT "5081" +//! Az alapértelmezett mappa, ami felhasználói felület számára szükséges fájlokat tárolja #define DEFAULT_WWW_FOLDER "htdocs/" /*! * @brief Betölti a `config.ini` fájlt és létrehoz egy Map struktúrát abból. diff --git a/modules/peer.h b/modules/peer.h index 2849599..e50e353 100644 --- a/modules/peer.h +++ b/modules/peer.h @@ -1,7 +1,7 @@ -/*! - * @author Toldi Balázs Ádám - * @date 2019. 10. 09. -*/ +// +// Készítette: Toldi Balázs Ádám +// Dátum 2019. 10. 09. +// #pragma once #define _CRT_SECURE_NO_WARNINGS #include "../utility.h" @@ -22,7 +22,7 @@ typedef struct peer{ //! A peer általános adatait tartalmazó struktúr SOCKET socket; //! A socket-et főbb adatait tartalmazó struktúra struct sockaddr_in sockaddr; } Peer; -//! A peereket tartó lista +//! @brief A peereket tartó lista //! @note Ez egy dinaamikusan méretezett tömb. Használat után fel kell szabadítani a lefoglalt memoriaterületet. typedef struct PeerList{ //! A lista által lefoglalt hely diff --git a/modules/server.c b/modules/server.c index 7a2b30c..aa8464e 100644 --- a/modules/server.c +++ b/modules/server.c @@ -48,7 +48,7 @@ void serverThread(SOCKET listening, fd_set *master, WebIO webIo, PeerList list,N if (peer_HandleConnection(listening, &list, mynode, master) != 0) logger_log("Error while receiving connection..."); } else if (FD_ISSET(webIo.socket, ©)) { - int res = webio_handleRequest(webIo, &list); + int res = webio_handleRequest(webIo); if (res == -2) { run = false; } diff --git a/modules/server.h b/modules/server.h index e556fed..c738404 100644 --- a/modules/server.h +++ b/modules/server.h @@ -7,29 +7,32 @@ #include "webio.h" #include "../lib/debugmalloc/debugmalloc.h" /*! - * - * @param list - * @param mynode - * @param master + * @brief Betölti és csatlakozik a `peer.txt` fájlban megadott peerekhez + * @param[in,out] list A peerek listájának mutatója + * @param[in] mynode Az az adatstruktúra amiben a saját adatainkat tároljuk + * @param[in,out] master Ebben tároljuk a peer sokcet-ét. select() függvényhez szükséges */ void peer_loadPeerList(PeerList *list,Node_data mynode,fd_set * master); /*! - * - * @param[out] output + * @brief Generál vagy betölt egy azonosítót. + * Ha nem létezik a `seed.txt` fájl akkor generál egy 16 karakterből álló sztringet és elmenti az az újonnan létrehozott `seed.txt` fájéba. + * Ha létezik,akkor onnan betölti azt. + * @param[out] output Az azonosító */ void getSeed(char*output); /*! - * - * @param[in] cfg - * @return + * @brief Létrehozza azt az adatstruktúra amiben a saját adatainkat tároljuk. + * @param[in] cfg A program konfigurációja + * @return A létrehozott Node_data struktúra */ Node_data construct_Mynodedata(Config cfg); /*! - * - * @param listening - * @param master - * @param webIo - * @param list - * @param mynode + * @brief Ez a függvény a program "lelke".Ezt a program inicializálása után hívja meg. + * Ez kezeli a bejövő csomagokat,kapcsolatokat. + * @param[in] listening A socket amin a program fut. + * @param[in,out] master Ebben tároljuk a peer sokcet-ét. select() függvényhez szükséges + * @param[in] webIo A felhasználói felület adatstruktúrája + * @param[in] list A peerek listája + * @param[in] mynode Az az adatstruktúra amiben a saját adatainkat tároljuk */ void serverThread(SOCKET listening, fd_set* master, WebIO webIo, PeerList list,Node_data mynode); \ No newline at end of file diff --git a/modules/webio.c b/modules/webio.c index fc1f4d3..96d3c3a 100644 --- a/modules/webio.c +++ b/modules/webio.c @@ -4,7 +4,7 @@ // #include "webio.h" -int webio_create(Config config, struct Node_data myData, WebIO *webIo) { +int webio_create(Config config, struct PeerList *list, WebIO *webIo) { char *port = map_getValue(config, "interface-port"); if (port == NULL) port = DEFAULT_INTERFACE_PORT; @@ -20,23 +20,22 @@ int webio_create(Config config, struct Node_data myData, WebIO *webIo) { SOCKET listening; result = tcp_createIPv4Socket(&listening, atoi(port), !local_mode); if (result == NULL) { - return 1; + return 3; } int res = tcp_bindnlisten(listening, result, SOMAXCONN); if (res != 0) { - return 2; + return res; } WebIO wio; - wio.sockaddr = tcp_getAddr_in(listening); wio.socket = listening; - wio.nodeData = myData; + wio.list = list; strcpy(wio.folder, folder); *webIo = wio; return 0; } -int webio_handleRequest(WebIO wio, const PeerList *list) { +int webio_handleRequest(WebIO wio) { SOCKET client = accept(wio.socket, NULL, NULL); char buf[8192]; memset(buf, 0, 8192); @@ -46,13 +45,24 @@ int webio_handleRequest(WebIO wio, const PeerList *list) { closesocket(client); return -1; } + char method[5],v_major[2],v_minor[3],file[50]; + sscanf(buf, "%s %s %*[^/]/%[^.].%s",method,file,v_major,v_minor); + if(strcmp(v_major,"1") != 0){ + char *response = "HTTP/1.0 505 HTTP Version Not Supportedd" + "Content-Encoding: gzip\r\n" + "Content-Language: en\r\n" + "Content-Type: text/html\r\n\r\n" + "

Error 505: HTTP version not supportedd!

"; + res = send(client, response, (int) strlen(response), 0); + if (res == SOCKET_ERROR) { + logger_log("Error sending 505 page!"); + } + return -1; + } + if (strcmp(method, "GET") == 0) { + res = webio_handleGETrequest(client, wio, file); - if (strncmp(buf, "GET", 3) == 0) { - char file[50]; - sscanf(buf, "%*s %s", file); - res = webio_handleGETrequest(client, wio, file, list); - - } else if (strncmp(buf, "POST", 4) == 0) { + } else if (strcmp(method, "POST") == 0) { int i = (int) strlen(buf) - 1; while (buf[i] != '\n') { i--; @@ -62,10 +72,20 @@ int webio_handleRequest(WebIO wio, const PeerList *list) { strcpy(tmp, buf + i); Map post = getPacketData(tmp); - res = webio_handlePOSTrequest(client, wio, list, post); + res = webio_handlePOSTrequest(client, wio, post); free(post.pairs); - } else - res = -1; + } else{ + char *response = "HTTP/1.0 501 Not Implemented" + "Content-Encoding: gzip\r\n" + "Content-Language: en\r\n" + "Content-Type: text/html\r\n\r\n" + "

Error 501: Method not implemented!

"; + res = send(client, response, (int) strlen(response), 0); + if (res == SOCKET_ERROR) { + logger_log("Error sending 501 page!"); + } + } + return res; } @@ -102,6 +122,7 @@ char *webio_getMIMEtype(char *filename) { char *webio_getFiletype(char *filename) { char *ext = (char *) malloc(sizeof(char) * 10); + strcpy(ext,""); char *tmp = strtok(filename, "."); while (tmp != NULL) { strncpy(ext, tmp, 10); @@ -110,7 +131,7 @@ char *webio_getFiletype(char *filename) { return ext; } -static int webio_handleGETrequest(SOCKET client, WebIO wio, char *file, const PeerList *list) { +static int webio_handleGETrequest(SOCKET client, WebIO wio, char *file) { char path[129]; @@ -121,11 +142,11 @@ static int webio_handleGETrequest(SOCKET client, WebIO wio, char *file, const Pe memmove(file, file + 1, strlen(file)); if (strcmp(file, "") == 0) { char index[8192] = ""; - webio_getIndex(wio.folder, list, index); + webio_getIndex(wio, index); webio_sendPage(client, index); - } else if (peer_ID_isFound(*list, file) || webio_isPeerFound(wio.folder, file)) { + } else if (peer_ID_isFound(*(wio.list), file) || webio_isPeerFound(wio.folder, file)) { char cnt[8192] = ""; - webio_getPeerPage(wio.folder, file, (peer_ID_getPeer(*list, file) != -1), cnt); + webio_getPeerPage(wio, file, cnt); webio_sendPage(client, cnt); } else if (strcmp(file, "kill") == 0) { webio_sendPage(client, "

Server Killed!

"); @@ -173,9 +194,9 @@ static int webio_handleGETrequest(SOCKET client, WebIO wio, char *file, const Pe return 0; } -static int webio_handlePOSTrequest(SOCKET client, WebIO wio, const PeerList *list, Map post) { +static int webio_handlePOSTrequest(SOCKET client, WebIO wio, Map post) { shutdown(client, SD_RECEIVE); - char *response = "HTTP/1.1 304 Not Modified "; + char *response = "HTTP/1.0 304 Not Modified "; int res = send(client, response, (int) strlen(response), 0); if (res == SOCKET_ERROR) { @@ -192,7 +213,7 @@ static int webio_handlePOSTrequest(SOCKET client, WebIO wio, const PeerList *lis #if defined(_WIN32) mkdir(folder); #else - mkdir(folder, 0777); // notice that 777 is different than 0777 + mkdir(folder, 0777); #endif sprintf(file, "%s%s.txt", folder, map_getValue(post, "id")); FILE *f; @@ -200,20 +221,20 @@ static int webio_handlePOSTrequest(SOCKET client, WebIO wio, const PeerList *lis fprintf(f, "Me: %s\n", map_getValue(post, "message")); fclose(f); char buf[DEFAULT_BUFLEN]; - int i = peer_ID_getPeer(*list, map_getValue(post, "id")); + int i = peer_ID_getPeer(*(wio.list), map_getValue(post, "id")); if (i < 0) { logger_log("Error sending message! Error: Peer offline!"); return 1; } sprintf(buf, "@message=%s", map_getValue(post, "message")); - res = send(list->array[i].socket, buf, DEFAULT_BUFLEN, 0); + res = send(wio.list->array[i].socket, buf, DEFAULT_BUFLEN, 0); if (res == SOCKET_ERROR) { logger_log("Error sending message.Error: %d", errno); return 2; } logger_log("Message sent to %s", map_getValue(post, "id")); - } else map_dump(post); + } return 0; } @@ -236,24 +257,24 @@ static void webio_getHeader(char *folder, char result[]) { result = ""; } -static void webio_getIndex(char *folder, const PeerList *list, char *outputBuffer) { +static void webio_getIndex(WebIO wio, char *outputBuffer) { char content[8192] = ""; char header[4096] = ""; - webio_getHeader(folder, header); + webio_getHeader(wio.folder, header); strcpy(content, header); strcat(content, "

Peers:

\n"); - if (list->length > 0) { + if (wio.list->length > 0) { strcat(content, "\n"); } else @@ -262,7 +283,7 @@ static void webio_getIndex(char *folder, const PeerList *list, char *outputBuffe "\n", content); strcat(content, "

Offline messages:

\n"); char path[65]; - sprintf(path, "%s/peers/", folder); + sprintf(path, "%s/peers/", wio.folder); #ifdef _MSC_VER HANDLE dir; WIN32_FIND_DATA file_data; @@ -313,13 +334,13 @@ static void webio_getIndex(char *folder, const PeerList *list, char *outputBuffe strcpy(outputBuffer, content); } -static void webio_getPeerPage(char *folder, char *id, bool online, char *outputBuffer) { +static void webio_getPeerPage(WebIO wio, char *id, char *outputBuffer) { char content[8192] = ""; char header[4096] = ""; - webio_getHeader(folder, header); + webio_getHeader(wio.folder, header); strcpy(content, header); - + bool online = peer_ID_isFound(*wio.list,id); char *img = (online) ? "" : ""; char *disabled = (online) ? "" : "disabled"; @@ -352,7 +373,7 @@ static bool webio_isPeerFound(char *folder, char *id) { void webio_sendOKHeader(SOCKET socket, char *file) { char response[8192]; - sprintf(response, "HTTP/1.1 200 OK " + sprintf(response, "HTTP/1.0 200 OK " "Content-Encoding: gzip\r\n" "Content-Language: en\r\n" "Content-Type: %s\r\n\r\n", webio_getMIMEtype(file)); @@ -364,7 +385,7 @@ void webio_sendOKHeader(SOCKET socket, char *file) { void webio_sendOKHeader_wSize(SOCKET socket, char *file, int size) { char response[8192]; - sprintf(response, "HTTP/1.1 200 OK " + sprintf(response, "HTTP/1.0 200 OK " "Content-Encoding: gzip\r\n" "Content-Language: en\r\n" "Content-Length: %d\r\n" @@ -377,7 +398,7 @@ void webio_sendOKHeader_wSize(SOCKET socket, char *file, int size) { void webio_send404Page(SOCKET socket) { - char *response = "HTTP/1.1 404 Not Found " + char *response = "HTTP/1.0 404 Not Found " "Content-Encoding: gzip\r\n" "Content-Language: en\r\n" "Content-Type: text/html\r\n\r\n" diff --git a/modules/webio.h b/modules/webio.h index bc81dee..4f8842f 100644 --- a/modules/webio.h +++ b/modules/webio.h @@ -12,39 +12,112 @@ #include "../lib/debugmalloc/debugmalloc.h" - - -typedef struct webio{ - SOCKET socket; - struct sockaddr_in sockaddr; - char folder[65]; - struct Node_data nodeData; +/*! + * @brief A felhasználói felület számára szükséges adatokat tárolja + */ +typedef struct WebIO{ //!A felhasználói felület socket-e + SOCKET socket; //! A mappa amiben a felhasználói felület fájljai vannak + char folder[65]; //! A peerek listájának mutatója + struct PeerList * list; } WebIO; - -int webio_create(Config config, struct Node_data myData, WebIO *webIo); - -int webio_handleRequest(WebIO wio, const PeerList *list); - -static int webio_handleGETrequest(SOCKET client, WebIO wio, char * file, const PeerList *list); - -static int webio_handlePOSTrequest(SOCKET client, WebIO wio, const PeerList *list, Map post); - +/*! + * @brief A kapott adatok alapján létrehozza a felhasználói felületet + * @param[in] config A program konfigurációja lásd config.h + * @param[in] list A peerek listájának mutatója + * @param[out] webIo Mutató arra struktúrára ahová az adatokat írni szeretnénk + * @return A művelet sikerességét jelző szám + * + * + * + * + * + * + *
KódJelentése
0A művelet sikeres volt
1A bind() függvény futása közben hiba lépett fel
2A listen() függvény futása közben hiba lépett fel
3A tcp_createIPv4Socket() függvény futása közben hiba lépett fel
+ */ +int webio_create(Config config, struct PeerList *list, WebIO *webIo); +/*! + * @brief Fogadja a socket-re érkező csatlakozásokat és a HTTP request-ek alapján elküldi a HTTP response-okat + * @param[in] wio A felhasználói felület struktúrája + * @return A művelet sikerességét jelző szám.(Ha 0, akkor a sikeres volt,egyébként sikertelen) + */ +int webio_handleRequest(WebIO wio); +/*! + * @brief Ez a függvény kezeli a HTTP GET request-eket. Elküldi a kért filokat. + * @param[in] client A socket amire az adatokat kell küldeni + * @param[in] wio A felhasználói felület struktúrája + * @param[in] file A kért file neve + * @return A művelet sikerességét jelző szám.(Ha 0, akkor a sikeres volt,egyébként sikertelen) + */ +static int webio_handleGETrequest(SOCKET client, WebIO wio, char *file); +/*! + * @brief Ez a függvény kezeli a HTTP POST request-eket. + * @param[in] client A socket amire az adatokat kell küldeni + * @param[in] wio A felhasználói felület struktúrája + * @param[in] post A kapott adatokat tároló Map + * @return A művelet sikerességét jelző szám.(Ha 0, akkor a sikeres volt,egyébként sikertelen) + */ +static int webio_handlePOSTrequest(SOCKET client, WebIO wio, Map post); +/*! + * @brief a file neve alapján visszaadja a típusához tartozó MIME típust + * @param[in] filename A file neve + * @return A file típusához tartozó MIME típus + */ static char* webio_getMIMEtype(char* filename); - +/*! + * Visszaadja a paraméterként kapott fájl kiterjesztését + * @param[in] filename A fájl neve + * @return A fájl kiterjesztése + * @note A visszatérési érték címét a malloc() függvénnyel foglalja le,így később fel kell azt szabadítani + */ static char* webio_getFiletype(char* filename); - +/*! + * @brief Betölti a fejlécet a főbb oldalakhoz + * @param[in] folder A mappa amiben a fejléc fájl(header.html) található + * @param[out] result A fejléc tartalma + */ static void webio_getHeader(char* folder, char result[]); - -static void webio_getIndex(char* folder, const PeerList *list, char *outputBuffer); - -static void webio_getPeerPage(char* folder, char *id, bool online, char *outputBuffer); - +/*! + * @brief Betölti a főoldal tartalmát + * @param[in] wio A felhasználói felület struktúrája + * @param outputBuffer Ebbe a buffer-be fogja a főoldalt betölteni + */ +static void webio_getIndex(WebIO wio, char *outputBuffer); +/*! + * @brief Betölti egy megadott peerhez tartozó oldal tartalmát + * @param[in] wio A felhasználói felület struktúrája + * @param[in] id A peer,aminek az oldalát szeretnénk betölteni + * @param[out] outputBuffer Ebbe a buffer-be fogja az oldalt betölteni + */ +static void webio_getPeerPage(WebIO wio, char *id, char *outputBuffer); +/*! + * @brief Megnézi hogy egy adott azonosítójú peer létezik.e + * @param[in] folder A felhasználói felület mappája + * @param[in] id A peer azonosítója amit keresünk + * @return Igaz vagy hamis érték az alapján hogy a peer létezik-e( vagy létezett) + */ static bool webio_isPeerFound(char* folder,char* id); - +/*! + * @brief Elküldi a HTTP header-t,ami azt jelzi fogy a kért file létezik + * @param[in] socket A socket amire a header-t szeretnénk küldeni + * @param[in] file A kért file neve + * @note Ha ismerjük a file(vagyis az oldal) méretét, érdemesebb a webio_sendOKHeader_wSize() függvényt használni + */ static void webio_sendOKHeader(SOCKET socket,char* file); - +/*! + * @copybrief webio_sendOKHeader + * @param[in] socket A socket amire a header-t szeretnénk küldeni + * @param[in] file A kért file neve + * @param[in] size A kért file mérete + */ static void webio_sendOKHeader_wSize(SOCKET socket,char* file,int size); - +/*! + * @brief Elküld a egy oldalt + * @param[in] socket A socket amire az oldalt küldeni szeretnénk + * @param[in] content Az oldal tartalma + */ static void webio_sendPage(SOCKET socket, char* content); - +/*! + * @brief Elküldi a HTTP header-t,ami azt jelzi fogy a kért file nem létezik + * @param[in] socket A socket amire a header-t szeretnénk küldeni + */ static void webio_send404Page(SOCKET socket); \ No newline at end of file