Шаг 7 - Узнаем кто пришел

Если в прошлый раз мы просто отсоединяли пользователя при запросе URL, то теперь попробуем узнать кто пришел. Изменяем код.

DWORD CMyFilterFilter::OnUrlMap(CHttpFilterContext* pfc, PHTTP_FILTER_URL_MAP pUrlMap) 
{
	char buffer[100];
	DWORD size=sizeof(buffer);
	pfc->ServerSupportFunction(SF_REQ_SEND_RESPONSE_HEADER,
		(PVOID)"200 OK",0,0);
	pfc->GetServerVariable("HTTP_USER_AGENT",buffer,&size);  
	pfc->WriteClient(buffer,&size); 
	return  SF_STATUS_REQ_FINISHED;
}

В этом коде есть три функции. Первая - это ServerSupportFunction, которая позволяет Вам эмулировать работу сервера. В данном случае мы отвечаем на клиенте, что все нормально вернув 200 OK, как и положенно по протоколу HTTP. Смотри соответсвующий раздел на сайте. Объвление этой функции такое.

BOOL ServerSupportFunction
(
	enum SF_REQ_TYPE sfReq,	// тип операции
	PVOID pvData,		// данные
	LPDWORD lpdwSize,		// размер данных
	LPDDWORD lpdwDataType	// дополнительные данные для заголовка
);

GetServerVariable позволяет получать переменные сервера. Вот как она определена:

BOOL GetServerVariable
( 
	LPTSTR lpszVariableName,	// имя переменной
	LPVOID lpvBuffer,		// указатель на буфер
	LPDWORD lpdwSize		// размер буфера
);

А последняя функция пересылает данные клиенту:

BOOL WriteClient
( 
	LPVOID lpvBuffer,		// указатель на данные
	LPDWORD lpdwBytes,		// размер данных
	DWORD dwReserved = 0	// зарезервировано
);

А вот результат для Exploler'а полученный данным фильтром:

7_1.gif (5911 b)

А вот для Teleport Pro :-)

7_2.gif (10505 b)

В не зависимости от того, кто обратился мы останавливаем связь. А могли бы остановить только Teleport Pro. Но эта защита легко обходится, изменением названия клиента HTTP в настройках Teleport Pro.


Предыдущий Шаг | Оглавление
Автор Каев Артем - 28.07.2000