mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-12 23:18:14 +01:00
init: Allow -proxy="" setting values
This drops the `No proxy server specified. Use -proxy=<ip> or -proxy=<ip:port>` error when a empty `-proxy=` command line argument, `bitcoin.conf` value, or `settings.json` value is specified, and just makes bitcoin connect and listen normally in these cases. The error was originally added in https://github.com/bitcoin/bitcoin/pull/20003 to prevent a bare `-proxy` command line argument with no assignment from clearing proxy settings. But it was implemented in an overbroad way breaking empty `-proxy=` assignments as well. The motivation for this change is to prevent a GUI bug that happens with https://github.com/bitcoin/bitcoin/pull/15936, reported in https://github.com/bitcoin/bitcoin/pull/15936#pullrequestreview-937685759 by vasild, that happens after a proxy setting is enabled and disabled in the GUI. But this change also makes sense on its own to remove a potentially confusing error message.
This commit is contained in:
@@ -236,7 +236,7 @@ KeyInfo InterpretKey(std::string key)
|
||||
* @return parsed settings value if it is valid, otherwise nullopt accompanied
|
||||
* by a descriptive error string
|
||||
*/
|
||||
static std::optional<util::SettingsValue> InterpretValue(const KeyInfo& key, const std::string& value,
|
||||
static std::optional<util::SettingsValue> InterpretValue(const KeyInfo& key, const std::string* value,
|
||||
unsigned int flags, std::string& error)
|
||||
{
|
||||
// Return negated settings as false values.
|
||||
@@ -246,13 +246,17 @@ static std::optional<util::SettingsValue> InterpretValue(const KeyInfo& key, con
|
||||
return std::nullopt;
|
||||
}
|
||||
// Double negatives like -nofoo=0 are supported (but discouraged)
|
||||
if (!InterpretBool(value)) {
|
||||
LogPrintf("Warning: parsed potentially confusing double-negative -%s=%s\n", key.name, value);
|
||||
if (value && !InterpretBool(*value)) {
|
||||
LogPrintf("Warning: parsed potentially confusing double-negative -%s=%s\n", key.name, *value);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
return value;
|
||||
if (!value && (flags & ArgsManager::DISALLOW_ELISION)) {
|
||||
error = strprintf("Can not set -%s with no value. Please specify value with -%s=value.", key.name, key.name);
|
||||
return std::nullopt;
|
||||
}
|
||||
return value ? *value : "";
|
||||
}
|
||||
|
||||
// Define default constructor and destructor that are not inline, so code instantiating this class doesn't need to
|
||||
@@ -320,7 +324,7 @@ bool ArgsManager::ParseParameters(int argc, const char* const argv[], std::strin
|
||||
#endif
|
||||
|
||||
if (key == "-") break; //bitcoin-tx using stdin
|
||||
std::string val;
|
||||
std::optional<std::string> val;
|
||||
size_t is_index = key.find('=');
|
||||
if (is_index != std::string::npos) {
|
||||
val = key.substr(is_index + 1);
|
||||
@@ -366,7 +370,7 @@ bool ArgsManager::ParseParameters(int argc, const char* const argv[], std::strin
|
||||
return false;
|
||||
}
|
||||
|
||||
std::optional<util::SettingsValue> value = InterpretValue(keyinfo, val, *flags, error);
|
||||
std::optional<util::SettingsValue> value = InterpretValue(keyinfo, val ? &*val : nullptr, *flags, error);
|
||||
if (!value) return false;
|
||||
|
||||
m_settings.command_line_options[keyinfo.name].push_back(*value);
|
||||
@@ -887,7 +891,7 @@ bool ArgsManager::ReadConfigStream(std::istream& stream, const std::string& file
|
||||
KeyInfo key = InterpretKey(option.first);
|
||||
std::optional<unsigned int> flags = GetArgFlags('-' + key.name);
|
||||
if (flags) {
|
||||
std::optional<util::SettingsValue> value = InterpretValue(key, option.second, *flags, error);
|
||||
std::optional<util::SettingsValue> value = InterpretValue(key, &option.second, *flags, error);
|
||||
if (!value) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -175,6 +175,7 @@ public:
|
||||
// ALLOW_STRING = 0x08, //!< unimplemented, draft implementation in #16545
|
||||
// ALLOW_LIST = 0x10, //!< unimplemented, draft implementation in #16545
|
||||
DISALLOW_NEGATION = 0x20, //!< disallow -nofoo syntax
|
||||
DISALLOW_ELISION = 0x40, //!< disallow -foo syntax that doesn't assign any value
|
||||
|
||||
DEBUG_ONLY = 0x100,
|
||||
/* Some options would cause cross-contamination if values for
|
||||
|
||||
Reference in New Issue
Block a user