forked from Travis-Sun/pywin32
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathControlBlock.h
More file actions
126 lines (107 loc) · 3.01 KB
/
Copy pathControlBlock.h
File metadata and controls
126 lines (107 loc) · 3.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#ifndef __CONTROL_BLOCK_H__
#define __CONTROL_BLOCK_H__
// wrapper for the session context (ECB block for IIS)
// If we move away from IIS these will have to change
class CControlBlock
{
public:
CControlBlock(EXTENSION_CONTROL_BLOCK *pECB) :
m_pECB(pECB)
{
assert(pECB);
}
~CControlBlock()
{
}
void Done() {
assert(m_pECB); // destructed more than once?
m_pECB = NULL;
}
// member retrieval functions
EXTENSION_CONTROL_BLOCK * GetECB(void)
{
assert(m_pECB);
return m_pECB;
}
// wrappers for IIS ECB structures
void SetStatus(const DWORD status)
{
m_pECB->dwHttpStatusCode = status;
}
void SetLogMessage(const char *msg)
{
strncpy(m_pECB->lpszLogData, msg, HSE_LOG_BUFFER_LEN);
}
DWORD WriteStream(char *buffer, const int buffLen, const int reserved=0)
{
DWORD dwBufLen = buffLen;
m_pECB->WriteClient(m_pECB->ConnID, (void *) buffer, &dwBufLen, reserved);
return dwBufLen;
}
BOOL WriteClient(char *buffer, DWORD *buffLen, const int reserved = 0)
{
return m_pECB->WriteClient(m_pECB->ConnID, (void *) buffer, buffLen, reserved);
}
bool ReadClient(LPVOID lpvBuffer, LPDWORD lpdwSize)
{
return m_pECB->ReadClient(m_pECB->ConnID, lpvBuffer, lpdwSize) ? true : false;
}
void DoneWithSession(DWORD dwState)
{
// Let IIS know that this worker thread is done with this request. This will allow
// IIS to recycle the EXTENSION_CONTROL_BLOCK.
m_pECB->ServerSupportFunction(m_pECB->ConnID, HSE_REQ_DONE_WITH_SESSION, &dwState, NULL, 0);
}
bool GetServerVariable(char *varName, LPSTR lpBuff, DWORD *pBuffSize)
{
BOOL bOK = m_pECB->GetServerVariable(m_pECB->ConnID, varName, lpBuff, pBuffSize);
if (!bOK)
*pBuffSize = 0;
if ((int)(*pBuffSize)>0 && lpBuff[(*pBuffSize)-1]=='\0')
(*pBuffSize)--;
return (bOK) ? true : false;
}
bool GetImpersonationToken(HANDLE *ret)
{
return (m_pECB->ServerSupportFunction)( m_pECB->ConnID, HSE_REQ_GET_IMPERSONATION_TOKEN, ret, 0,0) ?
true : false;
}
bool TransmitFile(HSE_TF_INFO *info)
{
return (m_pECB->ServerSupportFunction)( m_pECB->ConnID, DWORD HSE_REQ_TRANSMIT_FILE, info, 0,0) ?
true : false;
}
BOOL Redirect(char *url)
{
DWORD buffSize = (DWORD)strlen(url);
BOOL bOK = (m_pECB->ServerSupportFunction)( m_pECB->ConnID, HSE_REQ_SEND_URL_REDIRECT_RESP, url, &buffSize,0);
return bOK;
}
BOOL MapURLToPath(char *buffer, LPDWORD pSizeofBuffer)
{
BOOL bOK = (m_pECB->ServerSupportFunction)(m_pECB->ConnID,
HSE_REQ_MAP_URL_TO_PATH,
(void *)buffer, pSizeofBuffer,0);
return bOK;
}
BOOL IsKeepConn(LPBOOL bIs)
{
BOOL bOK = (m_pECB->ServerSupportFunction)(m_pECB->ConnID,
HSE_REQ_IS_KEEP_CONN,
(void *)bIs, 0,0);
return bOK;
}
bool IsKeepAlive(void)
{
bool bKeepAlive = false;
char buf[256];
DWORD bufsize = sizeof(buf)/sizeof(buf[0]);
if (GetServerVariable("HTTP_CONNECTION",buf, &bufsize)){
bKeepAlive = _strcmpi(buf, "keep-alive")==0;
}
return bKeepAlive;
}
private:
EXTENSION_CONTROL_BLOCK * m_pECB; // IIS control block
};
#endif // __CONTROL_BLOCK_H__