Skip to content

Commit fc9a51f

Browse files
committed
fix #220: support for environment variable based configuration
1 parent a45411a commit fc9a51f

File tree

3 files changed

+94
-18
lines changed

3 files changed

+94
-18
lines changed

Diff for: src/iisnode/cmoduleconfiguration.cpp

+92-18
Original file line numberDiff line numberDiff line change
@@ -403,20 +403,58 @@ HRESULT CModuleConfiguration::GetConfigSection(IHttpContext* context, IAppHostEl
403403
return hr;
404404
}
405405

406+
HRESULT CModuleConfiguration::GetEnvVariable(LPCWSTR propertyName, LPWSTR buffer, DWORD bufferSize, LPWSTR* result)
407+
{
408+
HRESULT hr;
409+
WCHAR variableName[124];
410+
411+
CheckNull(result);
412+
ErrorIf(124 < (wcslen(propertyName) + 9), IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
413+
wcscpy(variableName, L"IISNODE_");
414+
wcscat(variableName, propertyName);
415+
DWORD size = GetEnvironmentVariableW(variableName, buffer, bufferSize);
416+
ErrorIf(size > bufferSize, IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
417+
if (size == 0)
418+
{
419+
*result = NULL;
420+
ErrorIf(ERROR_ENVVAR_NOT_FOUND != (hr = GetLastError()), hr);
421+
}
422+
else
423+
{
424+
*result = buffer;
425+
}
426+
427+
return S_OK;
428+
Error:
429+
return hr;
430+
}
431+
406432
HRESULT CModuleConfiguration::GetString(IAppHostElement* section, LPCWSTR propertyName, LPWSTR* value)
407433
{
408434
HRESULT hr = S_OK;
409435
BSTR sysPropertyName = NULL;
410436
BSTR sysPropertyValue = NULL;
411437
IAppHostProperty* prop = NULL;
438+
WCHAR variableValueBuffer[1024];
439+
WCHAR* variableValue = NULL;
412440

413441
CheckNull(value);
414442
*value = NULL;
415-
ErrorIf(NULL == (sysPropertyName = SysAllocString(propertyName)), ERROR_NOT_ENOUGH_MEMORY);
416-
CheckError(section->GetPropertyByName(sysPropertyName, &prop));
417-
CheckError(prop->get_StringValue(&sysPropertyValue));
418-
ErrorIf(NULL == (*value = new WCHAR[wcslen(sysPropertyValue) + 1]), ERROR_NOT_ENOUGH_MEMORY);
419-
wcscpy(*value, sysPropertyValue);
443+
444+
CheckError(CModuleConfiguration::GetEnvVariable(propertyName, variableValueBuffer, 1024, &variableValue));
445+
if (variableValue)
446+
{
447+
ErrorIf(NULL == (*value = new WCHAR[wcslen(variableValue) + 1]), ERROR_NOT_ENOUGH_MEMORY);
448+
wcscpy(*value, variableValue);
449+
}
450+
else
451+
{
452+
ErrorIf(NULL == (sysPropertyName = SysAllocString(propertyName)), ERROR_NOT_ENOUGH_MEMORY);
453+
CheckError(section->GetPropertyByName(sysPropertyName, &prop));
454+
CheckError(prop->get_StringValue(&sysPropertyValue));
455+
ErrorIf(NULL == (*value = new WCHAR[wcslen(sysPropertyValue) + 1]), ERROR_NOT_ENOUGH_MEMORY);
456+
wcscpy(*value, sysPropertyValue);
457+
}
420458

421459
Error:
422460

@@ -447,20 +485,42 @@ HRESULT CModuleConfiguration::GetBOOL(IAppHostElement* section, LPCWSTR property
447485
BSTR sysPropertyName = NULL;
448486
IAppHostProperty* prop = NULL;
449487
VARIANT var;
488+
WCHAR variableValueBuffer[8];
489+
WCHAR* variableValue = NULL;
450490

451491
CheckNull(value);
452492
*value = FALSE;
453493
VariantInit(&var);
454-
ErrorIf(NULL == (sysPropertyName = SysAllocString(propertyName)), ERROR_NOT_ENOUGH_MEMORY);
455-
if (S_OK != section->GetPropertyByName(sysPropertyName, &prop))
494+
495+
CheckError(CModuleConfiguration::GetEnvVariable(propertyName, variableValueBuffer, 8, &variableValue));
496+
if (variableValue)
456497
{
457-
*value = defaultValue;
498+
if (0 == _wcsicmp(variableValue, L"true") || 0 == _wcsicmp(variableValue, L"1"))
499+
{
500+
*value = TRUE;
501+
}
502+
else if (0 == _wcsicmp(variableValue, L"false") || 0 == _wcsicmp(variableValue, L"0"))
503+
{
504+
*value = FALSE;
505+
}
506+
else
507+
{
508+
CheckError(IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
509+
}
458510
}
459-
else
511+
else
460512
{
461-
CheckError(prop->get_Value(&var));
462-
CheckError(VariantChangeType(&var, &var, 0, VT_BOOL));
463-
*value = (V_BOOL(&var) == VARIANT_TRUE);
513+
ErrorIf(NULL == (sysPropertyName = SysAllocString(propertyName)), ERROR_NOT_ENOUGH_MEMORY);
514+
if (S_OK != section->GetPropertyByName(sysPropertyName, &prop))
515+
{
516+
*value = defaultValue;
517+
}
518+
else
519+
{
520+
CheckError(prop->get_Value(&var));
521+
CheckError(VariantChangeType(&var, &var, 0, VT_BOOL));
522+
*value = (V_BOOL(&var) == VARIANT_TRUE);
523+
}
464524
}
465525

466526
Error:
@@ -488,15 +548,29 @@ HRESULT CModuleConfiguration::GetDWORD(IAppHostElement* section, LPCWSTR propert
488548
BSTR sysPropertyName = NULL;
489549
IAppHostProperty* prop = NULL;
490550
VARIANT var;
551+
WCHAR variableValueBuffer[64];
552+
WCHAR* variableValue = NULL;
553+
WCHAR* endValue = NULL;
491554

492555
CheckNull(value);
493-
*value = 0;
556+
*value = NULL;
494557
VariantInit(&var);
495-
ErrorIf(NULL == (sysPropertyName = SysAllocString(propertyName)), ERROR_NOT_ENOUGH_MEMORY);
496-
CheckError(section->GetPropertyByName(sysPropertyName, &prop));
497-
CheckError(prop->get_Value(&var));
498-
CheckError(VariantChangeType(&var, &var, 0, VT_UI4));
499-
*value = var.ulVal;
558+
559+
CheckError(CModuleConfiguration::GetEnvVariable(propertyName, variableValueBuffer, 64, &variableValue));
560+
if (variableValue)
561+
{
562+
long parsed = wcstol(variableValue, &endValue, 10);
563+
ErrorIf(ERANGE == errno || parsed < 0 || variableValue == endValue, IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT);
564+
*value = parsed;
565+
}
566+
else
567+
{
568+
ErrorIf(NULL == (sysPropertyName = SysAllocString(propertyName)), ERROR_NOT_ENOUGH_MEMORY);
569+
CheckError(section->GetPropertyByName(sysPropertyName, &prop));
570+
CheckError(prop->get_Value(&var));
571+
CheckError(VariantChangeType(&var, &var, 0, VT_UI4));
572+
*value = var.ulVal;
573+
}
500574

501575
Error:
502576

Diff for: src/iisnode/cmoduleconfiguration.h

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ class CModuleConfiguration : public IHttpStoredContext
5959
static HRESULT TokenizePromoteServerVars(CModuleConfiguration* c);
6060
static HRESULT ApplyDefaults(CModuleConfiguration* c);
6161
static HRESULT EnsureCurrent(IHttpContext* context, CModuleConfiguration* config);
62+
static HRESULT GetEnvVariable(LPCWSTR propertyName, LPWSTR buffer, DWORD bufferSize, LPWSTR* result);
6263

6364
CModuleConfiguration();
6465
~CModuleConfiguration();

Diff for: src/iisnode/errors.h

+1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@
99
#define IISNODE_ERROR_UNABLE_TO_CREATE_DEBUGGER_FILES 1030L
1010
#define IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION 1031L
1111
#define IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_OVERRIDE 1032L
12+
#define IISNODE_ERROR_UNABLE_TO_READ_CONFIGURATION_FROM_ENVIRONMENT 1033L
1213

1314
#endif

0 commit comments

Comments
 (0)