diff --git a/dpi/file.cc b/dpi/file.cc index 5f9e752..59dcafc 100644 --- a/dpi/file.cc +++ b/dpi/file.cc @@ -93,8 +93,8 @@ struct DilloDir { struct ClientInfo { Dsh *sh; - char *orig_url; - char *filename; + std::optional< std::string > orig_url; + std::optional< std::string > filename; int file_fd; off_t file_sz; DilloDir *d_dir; @@ -560,11 +560,11 @@ static const char *File_content_type(const char *filename) * Send an error page */ static void File_prepare_send_error_page(ClientInfo *client, int res, - const char *orig_url) + const std::string_view orig_url) { client->state = st_err; client->err_code = res; - client->orig_url = dStrdup(orig_url); + client->orig_url = orig_url; client->flags &= ~FILE_READ; client->flags |= FILE_WRITE; } @@ -612,7 +612,7 @@ static void File_send_error_page(ClientInfo *client) * Scan the directory, sort and prepare to send it enclosed in HTTP. */ static int File_prepare_send_dir(ClientInfo *client, - const char *DirName, const char *orig_url) + const char *DirName, const std::string_view orig_url) { std::string ds_dirname; DilloDir *Ddir; @@ -626,7 +626,7 @@ static int File_prepare_send_dir(ClientInfo *client, Ddir = File_dillodir_new(ds_dirname.c_str()).release(); if (Ddir) { /* looks ok, set things accordingly */ - client->orig_url = dStrdup(orig_url); + client->orig_url = orig_url; client->d_dir = Ddir; client->state = st_start; client->flags &= ~FILE_READ; @@ -641,7 +641,7 @@ static int File_prepare_send_dir(ClientInfo *client, */ static int File_prepare_send_file(ClientInfo *client, const char *filename, - const char *orig_url) + const std::string_view orig_url) { int fd, res = -1; struct stat sb; @@ -658,8 +658,8 @@ static int File_prepare_send_file(ClientInfo *client, client->file_sz = sb.st_size; client->d_dir = NULL; client->state = st_start; - client->filename = dStrdup(filename); - client->orig_url = dStrdup(orig_url); + client->filename = filename; + client->orig_url = orig_url; client->flags &= ~FILE_READ; client->flags |= FILE_WRITE; res = 0; @@ -717,9 +717,9 @@ static int File_send_file(ClientInfo *client) /* send HTTP header */ /* Check for gzipped file */ - namelen = strlen(client->filename); + namelen = client->filename.value().size(); if (namelen > 3 && - !dStrAsciiCasecmp(client->filename + namelen - 3, ".gz")) { + !dStrAsciiCasecmp(client->filename.value().c_str() + namelen - 3, ".gz")) { gzipped = true; namelen -= 3; } @@ -727,7 +727,7 @@ static int File_send_file(ClientInfo *client) * If there's no known extension, perform data sniffing. * If this doesn't lead to a conclusion, use "application/octet-stream". */ - name = dStrndup(client->filename, namelen); + name = dStrndup(client->filename.value().c_str(), namelen); if (!(ct = File_content_type(name))) ct = unknown_type; dFree(name); @@ -894,8 +894,6 @@ static ClientInfo *File_add_client(int sock_fd) { auto new_client = std::make_unique< ClientInfo >(); new_client->sh = a_Dpip_dsh_new(sock_fd, sock_fd, 8*1024); - new_client->orig_url = NULL; - new_client->filename = NULL; new_client->file_fd = -1; new_client->file_sz = 0; new_client->d_dir = NULL; @@ -920,8 +918,6 @@ static void File_remove_client(ClientInfo *client) a_Dpip_dsh_close(client->sh); a_Dpip_dsh_free(client->sh); File_close(client->file_fd); - dFree(client->orig_url); - dFree(client->filename); File_dillodir_free(client->d_dir); delete client;