From de16603f51d0327f6ab551a5ff92e8598c87b755 Mon Sep 17 00:00:00 2001 From: JAJames Date: Sat, 13 Feb 2016 06:47:17 -0500 Subject: [PATCH] Squished some bugs. Reduced default Socket buffer size from 4096 to 512. --- Jupiter/HTTP_Server.cpp | 8 ++++++-- Jupiter/Readable_String.h | 2 +- Jupiter/SecureSocket.h | 4 ++-- Jupiter/Socket.cpp | 4 +--- Jupiter/Socket.h | 4 ++-- Release/Jupiter.lib | Bin 300880 -> 300880 bytes 6 files changed, 12 insertions(+), 10 deletions(-) diff --git a/Jupiter/HTTP_Server.cpp b/Jupiter/HTTP_Server.cpp index ca99e8a..911350d 100644 --- a/Jupiter/HTTP_Server.cpp +++ b/Jupiter/HTTP_Server.cpp @@ -144,6 +144,7 @@ bool Jupiter::HTTP::Server::Directory::remove(const Jupiter::ReadableString &pat if (in_name_ref.isEmpty()) // Remove content { Jupiter::HTTP::Server::Content *content_node; + checksum = content_name.calcChecksum(); index = Jupiter::HTTP::Server::Directory::content.size(); while (index != 0) { @@ -797,7 +798,8 @@ int Jupiter::HTTP::Server::think() } else if ((std::chrono::steady_clock::now() > session->last_active + Jupiter::HTTP::Server::data_->keep_alive_session_timeout) || (session->keep_alive == false && std::chrono::steady_clock::now() > session->last_active + Jupiter::HTTP::Server::data_->session_timeout)) - session->sock.shutdown(); + delete Jupiter::HTTP::Server::data_->sessions.remove(index); + //session->sock.shutdown(); else if (session->sock.recv() > 0) { const Jupiter::ReadableString &sock_buffer = session->sock.getBuffer(); @@ -809,7 +811,8 @@ int Jupiter::HTTP::Server::think() session->last_active = std::chrono::steady_clock::now(); Jupiter::HTTP::Server::data_->process_request(*session); if (session->keep_alive == false) // remove completed session - session->sock.shutdown(); + delete Jupiter::HTTP::Server::data_->sessions.remove(index); + //session->sock.shutdown(); } else if (session->request.size() == Jupiter::HTTP::Server::data_->max_request_size) // reject (full buffer) delete Jupiter::HTTP::Server::data_->sessions.remove(index); @@ -831,6 +834,7 @@ int Jupiter::HTTP::Server::think() { socket->setBlocking(false); session = new HTTPSession(std::move(*socket)); + printf("Incoming session; %u other sessions already stored." ENDL, this->data_->sessions.size()); if (session->sock.recv() > 0) // data received { const Jupiter::ReadableString &sock_buffer = session->sock.getBuffer(); diff --git a/Jupiter/Readable_String.h b/Jupiter/Readable_String.h index 3db431f..ab02046 100644 --- a/Jupiter/Readable_String.h +++ b/Jupiter/Readable_String.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2014-2015 Jessica James. + * Copyright (C) 2014-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above diff --git a/Jupiter/SecureSocket.h b/Jupiter/SecureSocket.h index 1d63491..21f32f9 100644 --- a/Jupiter/SecureSocket.h +++ b/Jupiter/SecureSocket.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -168,7 +168,7 @@ namespace Jupiter /** * @brief Default constructor for the SecureSocket class. - * This constructor will set the buffer size to 4096 chars. + * This constructor will set the buffer size to 512 chars. */ SecureSocket(); diff --git a/Jupiter/Socket.cpp b/Jupiter/Socket.cpp index 395a085..7a25404 100644 --- a/Jupiter/Socket.cpp +++ b/Jupiter/Socket.cpp @@ -96,7 +96,7 @@ Jupiter::Socket &Jupiter::Socket::operator=(Jupiter::Socket &&source) return *this; } -Jupiter::Socket::Socket() : Jupiter::Socket::Socket(4096) +Jupiter::Socket::Socket() : Jupiter::Socket::Socket(512) { } @@ -116,9 +116,7 @@ Jupiter::Socket::~Socket() if (Jupiter::Socket::data_ != nullptr) { if (Jupiter::Socket::data_->rawSock > 0) - { Jupiter::Socket::close(); - } delete Jupiter::Socket::data_; } } diff --git a/Jupiter/Socket.h b/Jupiter/Socket.h index 29fda66..b83faa8 100644 --- a/Jupiter/Socket.h +++ b/Jupiter/Socket.h @@ -1,5 +1,5 @@ /** - * Copyright (C) 2013-2015 Jessica James. + * Copyright (C) 2013-2016 Jessica James. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -492,7 +492,7 @@ namespace Jupiter /** * @brief Default constructor for the Socket class. - * This constructor will set the buffer size to 4096 chars. + * This constructor will set the buffer size to 512 chars. */ Socket(); diff --git a/Release/Jupiter.lib b/Release/Jupiter.lib index dcb3a403149405a40563a8e668105e8dcc68d09f..fdf29bfd4224688a5ae47123b007f55d75137066 100644 GIT binary patch delta 21009 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 delta 21004 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