Если в прошлый раз мы просто отсоединяли пользователя при запросе 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'а полученный данным фильтром:
А вот для Teleport Pro :-)
В не зависимости от того, кто обратился мы останавливаем связь. А могли бы остановить только Teleport Pro. Но эта защита легко обходится, изменением названия клиента HTTP в настройках Teleport Pro.