Skip to content

Commit 074c827

Browse files
committed
- Implemented reply::AddHeader function.
- not_modified fixes.
1 parent c8cf89b commit 074c827

File tree

3 files changed

+51
-93
lines changed

3 files changed

+51
-93
lines changed

webserver/cWebem.cpp

Lines changed: 33 additions & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -678,7 +678,6 @@ bool cWebem::CheckForPageOverride(WebEmSession & session, request& req, reply& r
678678
rep.content.append(retstr.c_str(), retstr.size());
679679

680680
std::string strMimeType=mime_types::extension_to_type(extension);
681-
int extraheaders=0;
682681
if (session.outputfilename!="")
683682
{
684683
std::size_t last_dot_pos = session.outputfilename.find_last_of(".");
@@ -687,58 +686,36 @@ bool cWebem::CheckForPageOverride(WebEmSession & session, request& req, reply& r
687686
extension = session.outputfilename.substr(last_dot_pos + 1);
688687
strMimeType=mime_types::extension_to_type(extension);
689688
}
690-
extraheaders=1;
691-
}
692-
if (req.keep_alive) {
693-
extraheaders += 2;
694689
}
695690

696-
int iHeader = 0;
697691
if (!boost::algorithm::starts_with(strMimeType, "image"))
698692
{
699-
rep.headers.resize(5 + extraheaders);
700-
rep.headers[iHeader].name = "Content-Length";
701-
rep.headers[iHeader++].value = boost::lexical_cast<std::string>(rep.content.size());
702-
rep.headers[iHeader].name = "Content-Type";
703-
rep.headers[iHeader].value = strMimeType;
704-
rep.headers[iHeader++].value += ";charset=UTF-8"; //ISO-8859-1
705-
rep.headers[iHeader].name = "Cache-Control";
706-
rep.headers[iHeader++].value = "no-cache";
707-
rep.headers[iHeader].name = "Pragma";
708-
rep.headers[iHeader++].value = "no-cache";
709-
rep.headers[iHeader].name = "Access-Control-Allow-Origin";
710-
rep.headers[iHeader++].value = "*";
693+
reply::AddHeader(&rep, "Content-Length", boost::lexical_cast<std::string>(rep.content.size()));
694+
reply::AddHeader(&rep, "Content-Type", strMimeType + ";charset=UTF-8");
695+
reply::AddHeader(&rep, "Cache-Control", "no-cache");
696+
reply::AddHeader(&rep, "Pragma", "no-cache");
697+
reply::AddHeader(&rep, "Access-Control-Allow-Origin", "*");
711698
if (req.keep_alive) {
712-
rep.headers[iHeader].name = "Connection";
713-
rep.headers[iHeader++].value = "Keep-Alive";
714-
rep.headers[iHeader].name = "Keep-Alive";
715-
rep.headers[iHeader++].value = "max=20, timeout=10";
699+
reply::AddHeader(&rep, "Connection", "Keep-Alive");
700+
reply::AddHeader(&rep, "Keep-Alive", "max=20,l timeout=10");
716701
}
717702
if (session.outputfilename != "")
718703
{
719-
rep.headers[iHeader].name = "Content-Disposition";
720-
rep.headers[iHeader++].value = "attachment; filename=" + session.outputfilename;
704+
reply::AddHeader(&rep, "Content-Disposition", "attachment; filename=" + session.outputfilename);
721705
}
722706
}
723707
else
724708
{
725-
rep.headers.resize(3 + extraheaders);
726-
rep.headers[iHeader].name = "Content-Length";
727-
rep.headers[iHeader++].value = boost::lexical_cast<std::string>(rep.content.size());
728-
rep.headers[iHeader].name = "Content-Type";
729-
rep.headers[iHeader++].value = strMimeType;
730-
rep.headers[iHeader].name = "Cache-Control";
731-
rep.headers[iHeader++].value = "max-age=3600, public";
709+
reply::AddHeader(&rep, "Content-Length", boost::lexical_cast<std::string>(rep.content.size()));
710+
reply::AddHeader(&rep, "Content-Type", strMimeType);
711+
reply::AddHeader(&rep, "Cache-Control", "max-age=3600, public");
732712
if (req.keep_alive) {
733-
rep.headers[iHeader].name = "Connection";
734-
rep.headers[iHeader++].value = "Keep-Alive";
735-
rep.headers[iHeader].name = "Keep-Alive";
736-
rep.headers[iHeader++].value = "max=20, timeout=10";
713+
reply::AddHeader(&rep, "Connection", "Keep-Alive");
714+
reply::AddHeader(&rep, "Keep-Alive", "max=20,l timeout=10");
737715
}
738716
if (session.outputfilename != "")
739717
{
740-
rep.headers[iHeader].name = "Content-Disposition";
741-
rep.headers[iHeader++].value = "attachment; filename=" + session.outputfilename;
718+
reply::AddHeader(&rep, "Content-Disposition", "attachment; filename=" + session.outputfilename);
742719
}
743720
}
744721
return true;
@@ -760,32 +737,20 @@ bool cWebem::CheckForPageOverride(WebEmSession & session, request& req, reply& r
760737
}
761738
cUTF utf( wret.c_str() );
762739

763-
int extraheaders = 0;
764-
if (req.keep_alive) {
765-
extraheaders += 2;
766-
}
767-
768740
rep.status = reply::ok;
769741
rep.content.append(utf.get8(), strlen(utf.get8()));
770-
rep.headers.resize(5 + extraheaders);
771-
772-
int iHeader = 0;
773-
rep.headers[iHeader].name = "Content-Length";
774-
rep.headers[iHeader++].value = boost::lexical_cast<std::string>(rep.content.size());
775-
rep.headers[iHeader].name = "Content-Type";
776-
rep.headers[iHeader].value = mime_types::extension_to_type(extension);
777-
rep.headers[iHeader++].value += ";charset=UTF-8";
778-
rep.headers[iHeader].name = "Cache-Control";
779-
rep.headers[iHeader++].value = "no-cache";
780-
rep.headers[iHeader].name = "Pragma";
781-
rep.headers[iHeader++].value = "no-cache";
782-
rep.headers[iHeader].name = "Access-Control-Allow-Origin";
783-
rep.headers[iHeader++].value = "*";
742+
743+
reply::AddHeader(&rep, "Connection", "Keep-Alive");
744+
745+
reply::AddHeader(&rep, "Content-Length", boost::lexical_cast<std::string>(rep.content.size()));
746+
reply::AddHeader(&rep, "Content-Type", mime_types::extension_to_type(extension) + "; charset=UTF-8");
747+
reply::AddHeader(&rep, "Cache-Control", "no-cache");
748+
reply::AddHeader(&rep, "Pragma", "no-cache");
749+
reply::AddHeader(&rep, "Access-Control-Allow-Origin", "*");
750+
784751
if (req.keep_alive) {
785-
rep.headers[iHeader].name = "Connection";
786-
rep.headers[iHeader++].value = "Keep-Alive";
787-
rep.headers[iHeader].name = "Keep-Alive";
788-
rep.headers[iHeader++].value = "max=20, timeout=10";
752+
reply::AddHeader(&rep, "Connection", "Keep-Alive");
753+
reply::AddHeader(&rep, "Keep-Alive", "max=20,l timeout=10");
789754
}
790755
return true;
791756
}
@@ -1150,13 +1115,10 @@ char *make_web_time(const time_t rawtime)
11501115

11511116
void cWebemRequestHandler::send_remove_cookie(reply& rep)
11521117
{
1153-
size_t ahsize = rep.headers.size();
1154-
rep.headers.resize(ahsize + 1);
1155-
rep.headers[ahsize].name = "Set-Cookie";
11561118
std::stringstream sstr;
11571119
sstr << "SID=none";
11581120
sstr << "; path=/; Expires=" << make_web_time(0);
1159-
rep.headers[ahsize].value = sstr.str();
1121+
reply::AddHeader(&rep, "Set-Cookie", sstr.str(), false);
11601122
}
11611123

11621124
std::string cWebemRequestHandler::generateSessionID()
@@ -1212,30 +1174,22 @@ std::string cWebemRequestHandler::generateAuthToken(const WebEmSession & session
12121174

12131175
void cWebemRequestHandler::send_cookie(reply& rep, const WebEmSession & session)
12141176
{
1215-
int ahsize = rep.headers.size();
1216-
rep.headers.resize(ahsize + 1);
1217-
rep.headers[ahsize].name = "Set-Cookie";
12181177
std::stringstream sstr;
12191178
sstr << "SID=" << session.id << "_" << session.auth_token << "." << session.expires;
12201179
sstr << "; path=/; Expires=" << make_web_time(session.expires);
1221-
rep.headers[ahsize].value = sstr.str();
1180+
reply::AddHeader(&rep, "Set-Cookie", sstr.str(), false);
12221181
}
12231182

12241183
void cWebemRequestHandler::send_authorization_request(reply& rep)
12251184
{
12261185
rep.status = reply::unauthorized;
1227-
size_t ahsize = rep.headers.size();
1228-
rep.headers.resize(ahsize+2);
1229-
rep.headers[ahsize].name = "Content-Length";
1230-
rep.headers[ahsize].value = boost::lexical_cast<std::string>(rep.content.size());
1231-
rep.headers[ahsize+1].name = "WWW-Authenticate";
1232-
1186+
reply::AddHeader(&rep, "Content-Length", boost::lexical_cast<std::string>(rep.content.size()));
12331187
char szAuthHeader[200];
12341188
sprintf(szAuthHeader,
12351189
"Basic "
12361190
"realm=\"%s\"",
12371191
myWebem->m_DigistRealm.c_str());
1238-
rep.headers[ahsize+1].value = szAuthHeader;
1192+
reply::AddHeader(&rep, "WWW-Authenticate", szAuthHeader);
12391193
}
12401194

12411195
bool cWebemRequestHandler::CompressWebOutput(const request& req, reply& rep)
@@ -1271,10 +1225,7 @@ bool cWebemRequestHandler::CompressWebOutput(const request& req, reply& rep)
12711225

12721226
rep.headers[0].value = szSize;
12731227
//Add gzip header
1274-
int ohsize=rep.headers.size();
1275-
rep.headers.resize(ohsize+1);
1276-
rep.headers[ohsize].name = "Content-Encoding";
1277-
rep.headers[ohsize].value = "gzip";
1228+
reply::AddHeader(&rep, "Content-Encoding", "gzip");
12781229
return true;
12791230
}
12801231
}
@@ -1600,6 +1551,7 @@ void cWebemRequestHandler::handle_request(const request& req, reply& rep)
16001551
|| rep.headers[1].value == "text/plain"
16011552
|| rep.headers[1].value == "text/css"
16021553
|| rep.headers[1].value == "text/javascript"
1554+
|| rep.headers[1].value == "application/javascript"
16031555
)
16041556
{
16051557
// check if content is not gzipped, include won´t work with non-text content
@@ -1623,14 +1575,8 @@ void cWebemRequestHandler::handle_request(const request& req, reply& rep)
16231575
else if (rep.headers[1].value.find("image/")!=std::string::npos)
16241576
{
16251577
//Cache images
1626-
int theaders = rep.headers.size();
1627-
rep.headers.resize(theaders + 2);
1628-
1629-
rep.headers[theaders].name = "Date";
1630-
rep.headers[theaders].value = strftime_t("%a, %d %b %Y %H:%M:%S GMT",mytime(NULL));
1631-
1632-
rep.headers[theaders + 1].name = "Expires";
1633-
rep.headers[theaders + 1].value = "Sat, 26 Dec 2099 11:40:31 GMT";
1578+
reply::AddHeader(&rep, "Date", strftime_t("%a, %d %b %Y %H:%M:%S GMT", mytime(NULL)));
1579+
reply::AddHeader(&rep, "Expires", "Sat, 26 Dec 2099 11:40:31 GMT");
16341580
}
16351581
}
16361582
else

webserver/request_handler.cpp

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -253,6 +253,12 @@ void request_handler::handle_request(const request& req, reply& rep)
253253
std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary);
254254
if (is)
255255
{
256+
#ifdef HAVE_BOOST_FILESYSTEM
257+
// check if file date is still the same since last request
258+
if (not_modified(full_path, req, rep)) {
259+
return;
260+
}
261+
#endif
256262
bHaveLoadedgzip=true;
257263
rep.bIsGZIP=true;
258264
// Fill out the reply to be sent to the client.
@@ -268,17 +274,17 @@ void request_handler::handle_request(const request& req, reply& rep)
268274
std::ifstream is(full_path.c_str(), std::ios::in | std::ios::binary);
269275
if (!is)
270276
{
271-
#ifdef HAVE_BOOST_FILESYSTEM
272-
// check if file date is still the same since last request
273-
if (not_modified(full_path, req, rep)) {
274-
return;
275-
}
276-
#endif
277277
//maybe its a gz file (and clients browser does not support compression)
278278
full_path += ".gz";
279279
is.open(full_path.c_str(), std::ios::in | std::ios::binary);
280280
if (is.is_open())
281281
{
282+
#ifdef HAVE_BOOST_FILESYSTEM
283+
// check if file date is still the same since last request
284+
if (not_modified(full_path, req, rep)) {
285+
return;
286+
}
287+
#endif
282288
bHaveLoadedgzip = true;
283289
std::string gzcontent((std::istreambuf_iterator<char>(is)),
284290
(std::istreambuf_iterator<char>()));

webserver/request_handler.hpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,12 @@
1111
#ifndef HTTP_REQUEST_HANDLER_HPP
1212
#define HTTP_REQUEST_HANDLER_HPP
1313

14+
#if 0
15+
// RK, one can enable it if the boost::filesystem is available.
16+
// It allows for If-Not-Modified caching of the app cache.
17+
#define HAVE_BOOST_FILESYSTEM
18+
#endif
19+
1420
#include <string>
1521
#include <vector>
1622
#include <boost/noncopyable.hpp>

0 commit comments

Comments
 (0)