/*
- * DEBUG: section 93 Adaptation
+ * Copyright (C) 1996-2018 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-old.h"
-#include "ConfigParser.h"
+/* DEBUG: section 93 Adaptation */
+
+#include "squid.h"
#include "adaptation/ServiceConfig.h"
+#include "ConfigParser.h"
+#include "Debug.h"
+#include "globals.h"
#include "ip/tools.h"
#include <set>
Adaptation::ServiceConfig::ServiceConfig():
- port(-1), method(methodNone), point(pointNone),
- bypass(false), maxConn(-1), onOverload(srvWait),
- routing(false), ipv6(false)
+ port(-1), method(methodNone), point(pointNone),
+ bypass(false), maxConn(-1), onOverload(srvWait),
+ routing(false), ipv6(false)
{}
const char *
if (q)
t = q + 1;
- if (!strcasecmp(t, "precache"))
+ if (!strcmp(t, "precache"))
return Adaptation::pointPreCache;
- if (!strcasecmp(t, "postcache"))
+ if (!strcmp(t, "postcache"))
return Adaptation::pointPostCache;
return Adaptation::pointNone;
bool
Adaptation::ServiceConfig::parse()
{
- String method_point;
+ key = ConfigParser::NextToken();
+ String method_point = ConfigParser::NextToken();
+ if (!method_point.size()) {
+ debugs(3, DBG_CRITICAL, "ERROR: " << cfg_filename << ':' << config_lineno << ": " <<
+ "Missing vectoring point in adaptation service definition");
+ return false;
+ }
- ConfigParser::ParseString(&key);
- ConfigParser::ParseString(&method_point);
method = parseMethod(method_point.termedBuf());
point = parseVectPoint(method_point.termedBuf());
+ if (method == Adaptation::methodNone && point == Adaptation::pointNone) {
+ debugs(3, DBG_CRITICAL, "ERROR: " << cfg_filename << ':' << config_lineno << ": " <<
+ "Unknown vectoring point '" << method_point << "' in adaptation service definition");
+ return false;
+ }
// reset optional parameters in case we are reconfiguring
bypass = routing = false;
bool onOverloadSet = false;
std::set<std::string> options;
- while (char *option = strtok(NULL, w_space)) {
+ while (char *option = ConfigParser::NextToken()) {
const char *name = option;
const char *value = "";
if (strcmp(option, "0") == 0) { // backward compatibility
name = "bypass";
value = "off";
- debugs(3, opt_parse_cfg_only?0:1, "UPGRADE: Please use 'bypass=off' option to disable service bypass");
+ debugs(3, DBG_PARSE_NOTE(DBG_IMPORTANT), "UPGRADE: Please use 'bypass=off' option to disable service bypass");
} else if (strcmp(option, "1") == 0) { // backward compatibility
name = "bypass";
value = "on";
- debugs(3, opt_parse_cfg_only?0:1, "UPGRADE: Please use 'bypass=on' option to enable service bypass");
+ debugs(3, DBG_PARSE_NOTE(DBG_IMPORTANT), "UPGRADE: Please use 'bypass=on' option to enable service bypass");
} else {
char *eq = strstr(option, "=");
const char *sffx = strstr(option, "://");
// Check if option is set twice
if (options.find(name) != options.end()) {
- debugs(3, DBG_CRITICAL, cfg_filename << ':' << config_lineno << ": " <<
+ debugs(3, DBG_CRITICAL, "ERROR: " << cfg_filename << ':' << config_lineno << ": " <<
"Duplicate option \"" << name << "\" in adaptation service definition");
return false;
}
else if (strcmp(name, "ipv6") == 0) {
grokked = grokBool(ipv6, name, value);
if (grokked && ipv6 && !Ip::EnableIpv6)
- debugs(3, DBG_IMPORTANT, "WARNING: IPv6 is disabled. ICAP service option ignored.");
+ debugs(3, DBG_PARSE_NOTE(DBG_IMPORTANT), "WARNING: IPv6 is disabled. ICAP service option ignored.");
} else if (strcmp(name, "max-conn") == 0)
grokked = grokLong(maxConn, name, value);
else if (strcmp(name, "on-overload") == 0) {
grokked = grokOnOverload(onOverload, value);
onOverloadSet = true;
+ } else if (strcmp(name, "connection-encryption") == 0) {
+ bool encrypt = false;
+ grokked = grokBool(encrypt, name, value);
+ connectionEncryption.configure(encrypt);
+ } else if (strncmp(name, "ssl", 3) == 0 || strncmp(name, "tls-", 4) == 0) {
+#if !USE_OPENSSL
+ debugs(3, DBG_PARSE_NOTE(DBG_IMPORTANT), "WARNING: adaptation option '" << name << "' requires --with-openssl. ICAP service option ignored.");
+#else
+ // name prefix is "ssl" or "tls-"
+ std::string tmp = name + (name[0] == 's' ? 3 : 4);
+ tmp += "=";
+ tmp += value;
+ secure.parse(tmp.c_str());
+ grokked = true;
+#endif
} else
grokked = grokExtension(name, value);
if (!onOverloadSet)
onOverload = bypass ? srvBypass : srvWait;
+ // disable the TLS NPN extension if encrypted.
+ // Squid advertises "http/1.1", which is wrong for ICAPS.
+ if (secure.encryptTransport)
+ secure.parse("no-npn");
+
// is the service URI set?
if (!grokkedUri) {
- debugs(3, DBG_CRITICAL, cfg_filename << ':' << config_lineno << ": " <<
+ debugs(3, DBG_CRITICAL, "ERROR: " << cfg_filename << ':' << config_lineno << ": " <<
"No \"uri\" option in adaptation service definition");
return false;
}
Adaptation::ServiceConfig::grokUri(const char *value)
{
// TODO: find core code that parses URLs and extracts various parts
- // AYJ: most of this is duplicate of urlParse() in src/url.cc
+ // AYJ: most of this is duplicate of URL::parse() in src/url.cc
if (!value || !*value) {
- debugs(3, 0, HERE << cfg_filename << ':' << config_lineno << ": " <<
+ debugs(3, DBG_CRITICAL, HERE << cfg_filename << ':' << config_lineno << ": " <<
"empty adaptation service URI");
return false;
}
}
host.limitInit(s, len);
+#if USE_OPENSSL
+ if (secure.sslDomain.isEmpty())
+ secure.sslDomain.assign(host.rawBuf(), host.size());
+#endif
s = e;
port = -1;
len = e - s;
if (len > 1024) {
- debugs(3, 0, HERE << cfg_filename << ':' << config_lineno << ": " <<
+ debugs(3, DBG_CRITICAL, HERE << cfg_filename << ':' << config_lineno << ": " <<
"long resource name (>1024), probably wrong");
}
return true;
}
-
bool
Adaptation::ServiceConfig::grokBool(bool &var, const char *name, const char *value)
{
else if (!strcmp(value, "1") || !strcmp(value, "on"))
var = true;
else {
- debugs(3, 0, HERE << cfg_filename << ':' << config_lineno << ": " <<
+ debugs(3, DBG_CRITICAL, HERE << cfg_filename << ':' << config_lineno << ": " <<
"wrong value for boolean " << name << "; " <<
"'0', '1', 'on', or 'off' expected but got: " << value);
return false;
name << '=' << value);
return false;
}
+