Sets a server variable to a specified value.
virtual HRESULT SetServerVariable(
PCSTR pszVariableName,
PCWSTR pszVariableValue
) = 0;
- pszVariableName
[IN] A pointer to a string that contains the name of the server variable to set.
- pszVariableValue
[IN] A pointer to a string that contains the value of the server variable to set.
An HRESULT. Possible values include, but are not limited to, those in the following table.
Value | Description |
|---|
S_OK | Indicates that the operation was successful. |
ERROR_NOT_ENOUGH_MEMORY | Indicates that there is insufficient memory to perform the operation. |
The SetServerVariable method specifies the values for Common Gateway Interface (CGI) server variables. The server variable specified by the pszVariableName parameter can be a custom variable or a variable defined in Request for Comments (RFC) 3875, "The Common Gateway Interface (CGI) Version 1.1."
Note: |
|---|
The server variable specified by the pszVariableName parameter is created if it does not exist. |
The following code example demonstrates how to use the SetServerVariable method to create an HTTP module that sets the value of the SERVER_NAME server variable to an example value.
#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>
// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
REQUEST_NOTIFICATION_STATUS
OnBeginRequest(
IN IHttpContext * pHttpContext,
IN IHttpEventProvider * pProvider
)
{
UNREFERENCED_PARAMETER( pProvider );
// Create an HRESULT to receive return values from methods.
HRESULT hr;
// Retrieve a pointer to the request.
IHttpRequest * pHttpRequest = pHttpContext->GetRequest();
// Test for an error.
if (pHttpRequest != NULL)
{
// Set the value of an example server variable.
hr = pHttpContext->SetServerVariable("SERVER_NAME", L"Example Value");
// Test for an error.
if (FAILED(hr))
{
// Set the error status.
pProvider->SetErrorStatus( hr );
// End additional processing.
return RQ_NOTIFICATION_FINISH_REQUEST;
}
}
// Return processing to the pipeline.
return RQ_NOTIFICATION_CONTINUE;
}
};
// Create the module's class factory.
class MyHttpModuleFactory : public IHttpModuleFactory
{
public:
HRESULT
GetHttpModule(
OUT CHttpModule ** ppModule,
IN IModuleAllocator * pAllocator
)
{
UNREFERENCED_PARAMETER( pAllocator );
// Create a new instance.
MyHttpModule * pModule = new MyHttpModule;
// Test for an error.
if (!pModule)
{
// Return an error if the factory cannot create the instance.
return HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY );
}
else
{
// Return a pointer to the module.
*ppModule = pModule;
pModule = NULL;
// Return a success status.
return S_OK;
}
}
void Terminate()
{
// Remove the class from memory.
delete this;
}
};
// Create the module's exported registration function.
HRESULT
__stdcall
RegisterModule(
DWORD dwServerVersion,
IHttpModuleRegistrationInfo * pModuleInfo,
IHttpServer * pGlobalInfo
)
{
UNREFERENCED_PARAMETER( dwServerVersion );
UNREFERENCED_PARAMETER( pGlobalInfo );
// Set the request notifications and exit.
return pModuleInfo->SetRequestNotifications(
new MyHttpModuleFactory,
RQ_BEGIN_REQUEST,
0
);
}
Your module must export the RegisterModule function. You can export this function by creating a module definition (.def) file for your project, or you can compile the module by using the /EXPORT:RegisterModule switch. For more information, see Walkthrough: Creating a Request-Level HTTP Module By Using Native Code [IIS 7].
You can compile the code by using the __stdcall (/Gz) calling convention instead of explicitly declaring the calling convention for each function.
Type | Description |
|---|
Client | Requires IIS 7 on Windows Vista. |
Server | Requires IIS 7 on Windows Vista. |
Product | IIS 7 |
Header | Httpserv.h |
Reference