home *** CD-ROM | disk | FTP | other *** search
/ io Programmo 9 / IOPROG_9.ISO / contrib / iis4 / iis4_07.cab / KeepAliveP.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-09-05  |  3.5 KB  |  131 lines

  1. // KeepAliveP.c  -> Sample ISAPI Extension demonstrating Keep-Alive with a thread pool
  2.  
  3. #define _WIN32_WINNT 0x0400
  4.  
  5. #include <windows.h>
  6. #include <httpext.h>
  7. #include <stdio.h>
  8. #include "threadpool.h"
  9.  
  10.  
  11. BOOL WINAPI DllMain(IN HINSTANCE hinstDll, IN DWORD fdwReason, IN LPVOID lpvContext OPTIONAL)
  12. {
  13.     BOOL fReturn=TRUE;
  14.  
  15.     switch (fdwReason )
  16.     {
  17.         case DLL_PROCESS_ATTACH:
  18.             fReturn=InitThreadPool();
  19.             break;
  20.     }
  21.     
  22.     return fReturn;
  23. }
  24.  
  25.  
  26. BOOL WINAPI GetExtensionVersion(HSE_VERSION_INFO *pVer)
  27. {
  28.     pVer->dwExtensionVersion = MAKELONG(HSE_VERSION_MINOR, HSE_VERSION_MAJOR);
  29.     lstrcpyn(pVer->lpszExtensionDesc, "ISAPI Keep-Alive with Thread Pool Extension Sample", 
  30.             HSE_MAX_EXT_DLL_NAME_LEN);
  31.  
  32.     return TRUE;
  33. }
  34.  
  35.  
  36. DWORD WINAPI HttpExtensionProc(EXTENSION_CONTROL_BLOCK *pECB)
  37. {
  38.     DWORD dwSize;
  39.     char szHeader[]="Connection: Keep-Alive\r\nContent-Length: %lu\r\nContent-type: text/html\r\n\r\n";
  40.     char szBusyMessage[]="<html> <form method=get action=KeepAliveP.dll> <input type=submit> " 
  41.                      "<br>pECB->ConnID=%lu  <br>Server was too busy. </form></html>";
  42.     char szBuffer[4096];
  43.     char szBuffer2[4096];
  44.  
  45.     EnterCriticalSection(&csQueueLock);
  46.     if(!AddWorkQueueEntry(pECB)) // if ECB could not be assigned
  47.     {
  48.         LeaveCriticalSection(&csQueueLock);
  49.  
  50.         sprintf(szBuffer2, szBusyMessage, pECB->ConnID);
  51.  
  52.         // Send outgoing header
  53.         sprintf(szBuffer, szHeader, strlen(szBuffer2));
  54.         dwSize = strlen(szBuffer);
  55.         pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER,
  56.             NULL, &dwSize, (unsigned long *)szBuffer);
  57.     
  58.         // Send content
  59.         dwSize = strlen(szBuffer2);
  60.         pECB->WriteClient(pECB->ConnID, szBuffer2, &dwSize, 0);
  61.  
  62.         return HSE_STATUS_SUCCESS_AND_KEEP_CONN;
  63.     }
  64.     else
  65.     {
  66.         ReleaseSemaphore( hWorkSem, 1, NULL );  //Release 1 thread from pool
  67.         LeaveCriticalSection(&csQueueLock);
  68.     }
  69.  
  70.     return HSE_STATUS_PENDING;
  71. }
  72.  
  73.  
  74. DWORD WINAPI WorkerFunction(LPVOID pvThreadNum)
  75. {
  76.     EXTENSION_CONTROL_BLOCK *pECB;
  77.     DWORD dwRet, dwState, dwSize, dwThreadNum;
  78.  
  79.     //This header will be filled in with the content length
  80.     char szHeader[]="Connection: Keep-Alive\r\nContent-Length: %lu\r\nContent-type: text/html\r\n\r\n";
  81.     char szContent[]="<html> <form method=get action=KeepAliveP.dll><input type=submit> "\
  82.                     "<br>pECB->ConnID=%lu  <br>dwThreadNum=%lu</form></html>";
  83.     char szBuffer[4096];
  84.     char szBuffer2[4096];
  85.  
  86.     dwThreadNum=(DWORD)pvThreadNum;
  87.  
  88.     while(TRUE)
  89.     {
  90.         dwRet = WaitForSingleObject( hWorkSem, INFINITE );
  91.         if ( dwRet == WAIT_OBJECT_0 )
  92.         {
  93.  
  94.             EnterCriticalSection(&csQueueLock);
  95.  
  96.             if( GetWorkQueueEntry(&pECB) )  // Found work to do
  97.             {
  98.                 LeaveCriticalSection(&csQueueLock);
  99.     
  100.                 sprintf(szBuffer2, szContent, pECB->ConnID, dwThreadNum);
  101.  
  102.                 // Send outgoing header
  103.                 sprintf(szBuffer, szHeader, strlen(szBuffer2));
  104.                 dwSize = strlen(szBuffer);
  105.                 pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_SEND_RESPONSE_HEADER,
  106.                     NULL, &dwSize, (unsigned long *)szBuffer);
  107.         
  108.                 // Simulate extended processing
  109.                 Sleep(3000);
  110.     
  111.                 // Send content
  112.                 dwSize = strlen(szBuffer2);
  113.                 pECB->WriteClient(pECB->ConnID, szBuffer2, &dwSize, 0);
  114.                 
  115.                 // Tell IIS to keep the connection open
  116.                 dwState = HSE_STATUS_SUCCESS_AND_KEEP_CONN;
  117.                 pECB->ServerSupportFunction(pECB->ConnID, HSE_REQ_DONE_WITH_SESSION, &dwState, NULL, 0);
  118.             }
  119.             else // No item found is unexpected condition - exit thread
  120.             {
  121.                 LeaveCriticalSection(&csQueueLock);
  122.                 ExitThread(0);
  123.             }
  124.         }
  125.         else
  126.             break;
  127.     }
  128.  
  129.     return 0;
  130. }
  131.