19d7 Subj : Re: ISAPI newbie question To : borland.public.cpp.borlandcpp From : Leo Siefert Date : Mon Jul 21 2003 10:41 am Here is the code for a small BC++ ISAPI application - not a filter, but it should give you some idea of how to do it. You should use target expert to set the project as a dll target on a Win32 platform and a console target model. It should use static multithreaded libraries. - Leo #include #include #include "isapi.hpp" #include "urlencode.h" #pragma hdrstop int WINAPI DllEntryPoint( HINSTANCE /*hinst*/, unsigned long /*reason*/, void* ) { return 1; } extern "C" __declspec(dllexport) BOOL __stdcall GetExtensionVersion( THSE_VERSION_INFO *pVer ) { pVer->dwExtensionVersion = MAKELONG( HSE_VERSION_MINOR, HSE_VERSION_MAJOR ); lstrcpyn( pVer->lpszExtensionDesc, "Web Server Application", HSE_MAX_EXT_DLL_NAME_LEN ); return TRUE; } void WriteClientData( TEXTENSION_CONTROL_BLOCK *Ecb, char *WriteBuffer ) { unsigned int bytes = strlen(WriteBuffer); Ecb->WriteClient( Ecb->ConnID, (void *)WriteBuffer, bytes, 0 ); } void RecordResults( char *DataFile, char *Results, char *data ) { char *p = strstr( data, "R1=" ); if ( p ) { FILE *df = fopen( DataFile, "r+t" ); int count, yes, no, error, pctyes, pctno; char buf[64]; fgets( buf, 64, df ); count = atoi( buf ); yes = atoi( buf+8 ); no = atoi( buf+16 ); error = atoi( buf+24 ); if ( !strncmp( p+3, "YES", 3 ) ) { ++yes; ++count; } else if ( !strncmp( p+3, "NO", 2 ) ) { ++no; ++count; } else ++error; pctno = no ? (100*no)/count : 0; pctyes = 100 - pctno; rewind( df ); fprintf( df, "%8d%8d%8d%8d", count, yes, no, error ); fclose( df ); sprintf( Results, "%d %d %d %d %d", count, yes, no, pctyes, pctno ); } } void WriteToFile( char *file, char *data ) { FILE *out = fopen( file, "a+t" ); fputs( data, out ); fputs( "\n", out ); fclose( out ); } extern "C" __declspec(dllexport) DWORD __stdcall HttpExtensionProc( TEXTENSION_CONTROL_BLOCK *Ecb ) { char *Buffer=0, OutBuf[1024], DataFile[64] = "", DetailFile[64] = "", ResponsePage[64] = "", Results[64] = "", MailTo[64], MailSubject[64]; unsigned int size = 0, dt = 0; Ecb->ServerSupportFunction( Ecb->ConnID, HSE_REQ_SEND_RESPONSE_HEADER, NULL, size, dt ); bool get = !strcmp( Ecb->lpszMethod,"GET" ); bool post = !strcmp( Ecb->lpszMethod,"POST" ); if ( get || ( post && Ecb->cbAvailable>0 ) ) { time_t t; t = time( NULL ); int BufLen = (get ? strlen(Ecb->lpszQueryString) : Ecb->cbAvailable) + 512; Buffer = new char[BufLen--]; strcpy( Buffer, ctime( &t ) ); // 24 chars + "\n\0" strcpy( Buffer+24, "\nIP Address = " ); // 15 chars size = 20; Ecb->GetServerVariable( Ecb->ConnID, "REMOTE_ADDR", Buffer+strlen(Buffer), size ); // 20 chars strcat( Buffer, "\nUser Agent = " ); // 15 chars size = 255; Ecb->GetServerVariable( Ecb->ConnID, "HTTP_USER_AGENT", Buffer+strlen(Buffer), size ); // 255 chars strcat( Buffer, "\n" ); // 1 char size = strlen(Buffer); if ( get ) { strncpy( Buffer+size, Ecb->lpszQueryString, BufLen-size ); Buffer[BufLen] = 0; } else { int left = Ecb->cbAvailable > BufLen-size ? BufLen-size : Ecb->cbAvailable; memcpy( (void *)(Buffer+size), (void *)Ecb->lpbData, left ); Buffer[left+size] = 0; } url2str( Buffer+size ); char *p = Buffer + size, *q; while ( p ) { if ( !strncmp( p, "DataFile=", 9 ) ) { if ( ( q = strchr(p,'&') ) != NULL ) { *q = 0; strcpy( DataFile, p+9 ); strcpy( p, q+1 ); } else { strcpy( DataFile, p+9 ); *p = 0; p = 0; } } else if ( !strncmp( p, "DetailFile=", 11 ) ) { if ( ( q = strchr(p,'&') ) != NULL ) { *q = 0; strcpy( DetailFile, p+11 ); strcpy( p, q+1 ); } else { strcpy( DetailFile, p+1 ); *p = 0; p = 0; } } else if ( !strncmp( p, "ResponsePage=", 13 ) ) { if ( ( q = strchr(p,'&') ) != NULL ) { *q = 0; strcpy( ResponsePage, p+13 ); strcpy( p, q+1 ); } else { strcpy( ResponsePage, p+13 ); *p = 0; p = 0; } } else if ( !strncmp( p, "B1=Submit&", 10 ) ) { strcpy( p, p+10 ); } else if ( ( p = strchr(p,'&') ) != NULL ) { *p++ = '\n'; } } } else if ( post ) return HSE_STATUS_SUCCESS; else { WriteClientData( Ecb, "Content-type: text/plain\n\n" ); WriteClientData( Ecb, "Unrecognized Method\n" ); return HSE_STATUS_SUCCESS; } if ( *Buffer ) strcat( Buffer, "\n" ); if ( *Buffer && *DetailFile ) WriteToFile( DetailFile, Buffer ); if ( *Buffer && *DataFile ) RecordResults( DataFile, Results, Buffer ); delete [] Buffer; if ( *ResponsePage ) { FILE *df = fopen( ResponsePage, "r" ); if ( df ) { WriteClientData( Ecb, "Content-type: text/html\n\n" ); if ( *DataFile ) { char *Y = strchr(Results, ' '); *Y++ = 0; char *N = strchr(Y, ' '); *N++ = 0; char *PctY = strchr(N, ' '); *PctY++ = 0; char *PctN = strchr(PctY, ' '); *PctN++ = 0; char *p; char TBuf[1024]; while ( !feof(df) ) { fgets( OutBuf, 1024, df ); if ( (p = strchr( OutBuf, '#' )) != 0 ) { if ( !strncmp( p, "#Total#", 7 ) ) { strcpy( TBuf, p + 7 ); *p = 0; strcat( OutBuf, Results ); strcat( OutBuf, TBuf ); } else if ( !strncmp( p, "#Yes#", 5 ) ) { strcpy( TBuf, p + 5 ); *p = 0; strcat( OutBuf, Y ); strcat( OutBuf, TBuf ); } else if ( !strncmp( p, "#No#", 4 ) ) { strcpy( TBuf, p + 4 ); *p = 0; strcat( OutBuf, N ); strcat( OutBuf, TBuf ); } else if ( !strncmp( p, "#PctYes#", 8 ) ) { strcpy( TBuf, p + 8 ); *p = 0; strcat( OutBuf, PctY ); strcat( OutBuf, TBuf ); } else if ( !strncmp( p, "#PctNo#", 7 ) ) { strcpy( TBuf, p + 7 ); *p = 0; strcat( OutBuf, PctN ); strcat( OutBuf, TBuf ); } } WriteClientData( Ecb, OutBuf ); } } else { while ( !feof(df) ) { fgets( OutBuf, 1024, df ); WriteClientData( Ecb, OutBuf ); } } fclose(df); } else { WriteClientData( Ecb, "Content-type: text/html\n\n" ); char ms[256] = "The requested page \n"; strcat( ms, ResponsePage ); strcat( ms, "\n could not be found.\n" ); WriteClientData( Ecb, ms ); } } return HSE_STATUS_SUCCESS; } . 0