X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=src%2Fhttp-svc.c;h=b3b9a1f736540a10a40a79d1f554b27010d92137;hb=7181ede7add4eb3f5a92f5f8c9fd9cc8fdf6c659;hp=a5bd4b8080af4b2b022d13760f4e6dca40269b43;hpb=f51e658a95edeb35b7b3027f7f066d3af0de04c7;p=src%2Fapp-framework-binder.git diff --git a/src/http-svc.c b/src/http-svc.c index a5bd4b80..b3b9a1f7 100644 --- a/src/http-svc.c +++ b/src/http-svc.c @@ -70,14 +70,10 @@ static AFB_error initLibMagic (AFB_session *session) { // Because of POST call multiple time requestApi we need to free POST handle here static void endRequest (void *cls, struct MHD_Connection *connection, void **con_cls, enum MHD_RequestTerminationCode toe) { - AFB_HttpPost *posthandle = *con_cls; + AFB_PostHandle *posthandle = *con_cls; // if post handle was used let's free everything - if (posthandle) { - if (verbose) fprintf (stderr, "End Post Request UID=%d\n", posthandle->uid); - free (posthandle->data); - free (posthandle); - } + if (posthandle != NULL) endPostRequest (posthandle); } @@ -99,17 +95,7 @@ STATIC int servFile (struct MHD_Connection *connection, AFB_session *session, co fprintf(stderr, "Fail to stat file: [%s] error:%s\n", staticfile->path, strerror(errno)); goto abortRequest; } - - if (! S_ISREG (sbuf.st_mode)) { // only standard file any other one including symbolic links are refused. - close (staticfile->fd); // nothing useful to do with this file - fprintf (stderr, "Fail file: [%s] is not a regular file\n", staticfile->path); - const char *errorstr = "Alsa-Json-Gateway Invalid file type"; - response = MHD_create_response_from_buffer (strlen (errorstr), - (void *) errorstr, MHD_RESPMEM_PERSISTENT); - MHD_queue_response (connection, MHD_HTTP_INTERNAL_SERVER_ERROR, response); - goto sendRequest; - } - + // if url is a directory let's add index.html and redirect client if (S_ISDIR (sbuf.st_mode)) { close (staticfile->fd); // close directory check for Index @@ -117,6 +103,7 @@ STATIC int servFile (struct MHD_Connection *connection, AFB_session *session, co // No trailing '/'. Let's add one and redirect for relative paths to work if (url [strlen (url) -1] != '/') { response = MHD_create_response_from_buffer(0,"", MHD_RESPMEM_PERSISTENT); + strncpy(staticfile->path, url, sizeof (staticfile->path)); strncat(staticfile->path, "/", sizeof (staticfile->path)); MHD_add_response_header (response, "Location", staticfile->path); MHD_queue_response (connection, MHD_HTTP_MOVED_PERMANENTLY, response); @@ -128,8 +115,16 @@ STATIC int servFile (struct MHD_Connection *connection, AFB_session *session, co if (-1 == (staticfile->fd = open(staticfile->path, O_RDONLY)) || (fstat (staticfile->fd, &sbuf) != 0)) { fprintf(stderr, "No Index.html in direcory [%s]\n", staticfile->path); goto abortRequest; - } - } + } + } else if (! S_ISREG (sbuf.st_mode)) { // only standard file any other one including symbolic links are refused. + close (staticfile->fd); // nothing useful to do with this file + fprintf (stderr, "Fail file: [%s] is not a regular file\n", staticfile->path); + const char *errorstr = "Application Framework Binder Invalid file type"; + response = MHD_create_response_from_buffer (strlen (errorstr), + (void *) errorstr, MHD_RESPMEM_PERSISTENT); + MHD_queue_response (connection, MHD_HTTP_INTERNAL_SERVER_ERROR, response); + goto sendRequest; + } // https://developers.google.com/web/fundamentals/performance/optimizing-content-efficiency/http-caching?hl=fr // ftp://ftp.heanet.ie/disk1/www.gnu.org/software/libmicrohttpd/doxygen/dc/d0c/microhttpd_8h.html @@ -151,7 +146,7 @@ STATIC int servFile (struct MHD_Connection *connection, AFB_session *session, co if (session->magic) { mimetype= magic_descriptor(session->magic, staticfile->fd); if (mimetype != NULL) MHD_add_response_header (response, MHD_HTTP_HEADER_CONTENT_TYPE, mimetype); - } else mimetype="Unknown"; + } else mimetype="application/unknown"; if (verbose) fprintf(stderr, "Serving: [%s] mime=%s\n", staticfile->path, mimetype); response = MHD_create_response_from_fd(sbuf.st_size, staticfile->fd); @@ -196,14 +191,14 @@ STATIC int requestFile(struct MHD_Connection *connection, AFB_session *session, char *requestdir, *requesturl; // default search for file is rootdir base - requestdir = session->config->rootdir; - requesturl=url; + requestdir= session->config->rootdir; + requesturl=(char*)url; // Check for optional aliases for (idx=0; session->config->aliasdir[idx].url != NULL; idx++) { if (0 == strncmp(url, session->config->aliasdir[idx].url, session->config->aliasdir[idx].len)) { requestdir = session->config->aliasdir[idx].path; - requesturl=&url[session->config->aliasdir[idx].len]; + requesturl=(char*)&url[session->config->aliasdir[idx].len]; break; } } @@ -272,6 +267,9 @@ PUBLIC AFB_error httpdStart(AFB_session *session) { apiUrlLen = strlen (session->config->rootapi); baseUrlLen= strlen (session->config->rootbase); rootUrlLen= strlen (session->config->rootdir); + + // Initialise Client Session Hash Table + ctxStoreInit (CTX_NBCLIENTS); // TBD open libmagic cache [fail to pass EFENCE check] // initLibMagic (session);