+/*
+ * Copyright (C) 1996-2015 The Squid Software Foundation and contributors
+ *
+ * Squid software is distributed under GPLv2+ license and includes
+ * contributions from numerous individuals and organizations.
+ * Please see the COPYING and CONTRIBUTORS files for details.
+ */
+
#include "squid.h"
#include "ErrorDetail.h"
-#include "errorpage.h"
#include "ErrorDetailManager.h"
+#include "errorpage.h"
+#include "mime_header.h"
void Ssl::errorDetailInitialize()
{
class ErrorDetailFile : public TemplateFile
{
public:
- explicit ErrorDetailFile(ErrorDetailsList::Pointer const details): TemplateFile("error-details.txt") {
+ explicit ErrorDetailFile(ErrorDetailsList::Pointer const details): TemplateFile("error-details.txt", ERR_NONE) {
buf.init();
theDetails = details;
}
TheDetailsManager = NULL;
}
-
Ssl::ErrorDetailsManager::ErrorDetailsManager()
{
theDefaultErrorDetails = new ErrorDetailsList();
}
bool
-Ssl::ErrorDetailsManager::getErrorDetail(Ssl::ssl_error_t value, HttpRequest *request, ErrorDetailEntry &entry)
+Ssl::ErrorDetailsManager::getErrorDetail(Ssl::ssl_error_t value, const HttpRequest::Pointer &request, ErrorDetailEntry &entry)
{
#if USE_ERR_LOCALES
String hdr;
- if (request && request->header.getList(HDR_ACCEPT_LANGUAGE, &hdr)) {
+ if (request != NULL && request->header.getList(HDR_ACCEPT_LANGUAGE, &hdr)) {
ErrorDetailsList::Pointer errDetails = NULL;
//Try to retrieve from cache
size_t pos = 0;
debugs(83, 8, HERE << "Creating new ErrDetailList to read from disk");
errDetails = new ErrorDetailsList();
ErrorDetailFile detailTmpl(errDetails);
- if (detailTmpl.loadFor(request)) {
+ if (detailTmpl.loadFor(request.getRaw())) {
if (detailTmpl.language()) {
debugs(83, 8, HERE << "Found details on disk for language " << detailTmpl.language());
errDetails->errLanguage = detailTmpl.language();
//ignore spaces, new lines and comment lines (starting with #) at the beggining
const char *s;
- for (s = buf.content(); (*s == '\n' || *s == ' ' || *s == '\t' || *s == '#') && s < e; s++) {
+ for (s = buf.content(); (*s == '\n' || *s == ' ' || *s == '\t' || *s == '#') && s < e; ++s) {
if (*s == '#')
- while (s<e && *s != '\n') s++; // skip untill the end of line
+ while (s<e && *s != '\n')
+ ++s; // skip untill the end of line
}
if ( s != e) {
DetailEntryParser parser;
- if (!parser.parse(s, e)) {
+ if (!parser.parse(s, e - s)) {
debugs(83, DBG_IMPORTANT, HERE <<
"WARNING! parse error on:" << s);
return false;
}
- const char *errorName = parser.getByName("name").termedBuf();
- if (!errorName) {
+ const String errorName = parser.getByName("name");
+ if (!errorName.size()) {
debugs(83, DBG_IMPORTANT, HERE <<
"WARNING! invalid or no error detail name on:" << s);
return false;
}
- Ssl::ssl_error_t ssl_error = Ssl::GetErrorCode(errorName);
- if (ssl_error == SSL_ERROR_NONE) {
- debugs(83, DBG_IMPORTANT, HERE <<
- "WARNING! invalid error detail name: " << errorName);
- return false;
- }
+ Ssl::ssl_error_t ssl_error = Ssl::GetErrorCode(errorName.termedBuf());
+ if (ssl_error != SSL_ERROR_NONE) {
- if (theDetails->getErrorDetail(ssl_error)) {
- debugs(83, DBG_IMPORTANT, HERE <<
- "WARNING! duplicate entry: " << errorName);
- return false;
- }
+ if (theDetails->getErrorDetail(ssl_error)) {
+ debugs(83, DBG_IMPORTANT, HERE <<
+ "WARNING! duplicate entry: " << errorName);
+ return false;
+ }
- ErrorDetailEntry &entry = theDetails->theList[ssl_error];
- entry.error_no = ssl_error;
- entry.name = errorName;
- String tmp = parser.getByName("detail");
- httpHeaderParseQuotedString(tmp.termedBuf(), tmp.size(), &entry.detail);
- tmp = parser.getByName("descr");
- httpHeaderParseQuotedString(tmp.termedBuf(), tmp.size(), &entry.descr);
- bool parseOK = entry.descr.defined() && entry.detail.defined();
+ ErrorDetailEntry &entry = theDetails->theList[ssl_error];
+ entry.error_no = ssl_error;
+ entry.name = errorName;
+ String tmp = parser.getByName("detail");
+ const int detailsParseOk = httpHeaderParseQuotedString(tmp.termedBuf(), tmp.size(), &entry.detail);
+ tmp = parser.getByName("descr");
+ const int descrParseOk = httpHeaderParseQuotedString(tmp.termedBuf(), tmp.size(), &entry.descr);
+
+ if (!detailsParseOk || !descrParseOk) {
+ debugs(83, DBG_IMPORTANT, HERE <<
+ "WARNING! missing important field for detail error: " << errorName);
+ return false;
+ }
- if (!parseOK) {
+ } else if (!Ssl::ErrorIsOptional(errorName.termedBuf())) {
debugs(83, DBG_IMPORTANT, HERE <<
- "WARNING! missing imporant field for detail error: " << errorName);
+ "WARNING! invalid error detail name: " << errorName);
return false;
}
+
}// else {only spaces and black lines; just ignore}
buf.consume(size);
debugs(83, 9, HERE << " Remain size: " << buf.contentSize() << " Content: " << buf.content());
return true;
}
+