Share via


IReadEntityProvider::SetEntity Method

 

Specifies the request entity.

Syntax

virtual VOID SetEntity(  
   PVOID pBuffer,  
   DWORD cbData,  
   DWORD cbBuffer  
) = 0;  

Parameters

pBuffer
A pointer to a void buffer that contains the request entity.

cbData
A DWORD that contains the size of the data in pBuffer.

cbBuffer
A DWORD that contains the size of the pBuffer buffer, which should be greater than or equal to cbData.

Return Value

VOID.

Remarks

The SetEntity method replaces the preloaded HTTP request entity body with the entity body that is pointed to by the pBuffer parameter. The cbData parameter must specify the size, in bytes, of the data in the request entity that was returned in pBuffer, and the cbBuffer parameter must specify the size, in bytes, of the request entity buffer that is pointed to by pBuffer.

Note

cbBuffer should always be greater than or equal to cbData.

Example

The following code example demonstrates how to create an HTTP module that performs the following tasks:

  1. Allocates a 1-KB buffer. If the buffer cannot be allocated, the module returns an error and exits.

  2. Creates a string that contains a response value.

  3. Specifies the request entity by using the SetEntity method, and then exits.

#define _WINSOCKAPI_
#include <windows.h>
#include <sal.h>
#include <httpserv.h>

// NOTE - Data needs to be passed to this module, e.g. a POST request, or it will not appear to return anything.

// Create the module class.
class MyHttpModule : public CHttpModule
{
public:
    REQUEST_NOTIFICATION_STATUS
    OnReadEntity(
        IN IHttpContext * pHttpContext,
        IN IReadEntityProvider * pProvider
    )
    {
        // Allocate a 1K buffer for the request entity.
        DWORD cbBuffer = 1024;
        void * pvBuffer = pHttpContext->AllocateRequestMemory(cbBuffer);
        
        // Test for an error.
        if (NULL == pvBuffer)
        {
            // Set the error status.
            pProvider->SetErrorStatus(
                HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY));
            // End additional processing.
            return RQ_NOTIFICATION_FINISH_REQUEST;
        }

        // Create a string to return.
        char szBuffer[] = "Name=Value";
        // Specify the exact data length.
        DWORD cbData = (DWORD) strlen(szBuffer);        
        // Copy a string into the request entity buffer.
        strcpy_s((char*)pvBuffer,cbBuffer,szBuffer);
        // Set the request entity to the buffer.
        pProvider->SetEntity(pvBuffer,cbData,cbBuffer);

        // 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_READ_ENTITY,
        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.

You can optionally compile the code by using the __stdcall (/Gz) calling convention instead of explicitly declaring the calling convention for each function.

Requirements

Type Description
Client - IIS 7.0 on Windows Vista
- IIS 7.5 on Windows 7
- IIS 8.0 on Windows 8
- IIS 10.0 on Windows 10
Server - IIS 7.0 on Windows Server 2008
- IIS 7.5 on Windows Server 2008 R2
- IIS 8.0 on Windows Server 2012
- IIS 8.5 on Windows Server 2012 R2
- IIS 10.0 on Windows Server 2016 Technical Preview
Product - IIS 7.0, IIS 7.5, IIS 8.0, IIS 8.5, IIS 10.0
- IIS Express 7.5, IIS Express 8.0, IIS Express 10.0
Header Httpserv.h

See Also

IReadEntityProvider Interface
IReadEntityProvider::GetEntity Method
IHttpRequest::ReadEntityBody Method
IHttpRequest::InsertEntityBody Method