Avatar billede entracore Nybegynder
18. juli 2002 - 22:18 Der er 10 kommentarer og
1 løsning

ISAPI HTTP Filter

Hej

Jeg sidder og roder med et ISAPI filter i C++. Det filtret gør er at kalde en HTTP forspørgsel også lægge denne ned i en variabel f.eks. HTTP_Path.

Denne variabel kan jeg så kalde fra en asp side - Request("HTTP_Path").

Problemet er at jeg gerne vil have mit filter til at ignorere forspørgsler hvor der f.eks indgår et punktum "."

Jeg har ikke så meget styr på koden fordi at den hovedsageligt er generet af en Wizard. Så hvis der er nogle der kan hjælp vil det være super fedt - og spørg endelig hvis der er noget der uklart.

Koden kommer her:
-------------------------------------------------------

#include "stdafx.h"
#include "Request Http Filter.h"

///////////////////////////////////////////////////////////////////////
// The one and only CWinApp object
// NOTE: You may remove this object if you alter your project to no
// longer use MFC in a DLL.

CWinApp theApp;



///////////////////////////////////////////////////////////////////////
// The one and only CRequestHttpFilter object

CRequestHttpFilterFilter theFilter;


///////////////////////////////////////////////////////////////////////
// CRequestHttpFilterFilter implementation

CRequestHttpFilterFilter::CRequestHttpFilterFilter()
{
}

CRequestHttpFilterFilter::~CRequestHttpFilterFilter()
{
}

BOOL CRequestHttpFilterFilter::GetFilterVersion(PHTTP_FILTER_VERSION pVer)
{
    // Call default implementation for initialization
    CHttpFilter::GetFilterVersion(pVer);

    // Clear the flags set by base class
    pVer->dwFlags &= ~SF_NOTIFY_ORDER_MASK;

    // Set the flags we are interested in
    pVer->dwFlags |= SF_NOTIFY_ORDER_HIGH | SF_NOTIFY_SECURE_PORT | SF_NOTIFY_NONSECURE_PORT
            | SF_NOTIFY_PREPROC_HEADERS;

    // Load description string
    TCHAR sz[SF_MAX_FILTER_DESC_LEN+1];
    ISAPIVERIFY(::LoadString(AfxGetResourceHandle(),
            IDS_FILTER, sz, SF_MAX_FILTER_DESC_LEN));
    _tcscpy(pVer->lpszFilterDesc, sz);
    return TRUE;
}

DWORD CRequestHttpFilterFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
    PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
{
    char inbuf[2048], buf[2048];
    DWORD szinbuf = sizeof(inbuf);
   
    pHeaderInfo->GetHeader(pCtxt->m_pFC,"url",inbuf,&szinbuf);

    if (*(inbuf+1)=='_') return SF_STATUS_REQ_NEXT_NOTIFICATION;

    sprintf(buf,"/default.asp?HTTP_Path=%s",inbuf);

    pHeaderInfo->SetHeader(pCtxt->m_pFC,"url",buf);
   
    return SF_STATUS_REQ_NEXT_NOTIFICATION;
}



// Do not edit the following lines, which are needed by ClassWizard.
#if 0
BEGIN_MESSAGE_MAP(CRequestHttpFilter, CHttpFilter)
    //{{AFX_MSG_MAP(CRequestHttpFilter)
    //}}AFX_MSG_MAP
END_MESSAGE_MAP()
#endif    // 0

///////////////////////////////////////////////////////////////////////
// If your extension will not use MFC, you'll need this code to make
// sure the extension objects can find the resource handle for the
// module.  If you convert your extension to not be dependent on MFC,
// remove the comments arounn the following AfxGetResourceHandle()
// and DllMain() functions, as well as the g_hInstance global.

/****

static HINSTANCE g_hInstance;

HINSTANCE AFXISAPI AfxGetResourceHandle()
{
    return g_hInstance;
}

BOOL WINAPI DllMain(HINSTANCE hInst, ULONG ulReason,
                    LPVOID lpReserved)
{
    if (ulReason == DLL_PROCESS_ATTACH)
    {
        g_hInstance = hInst;
    }

    return TRUE;
}

****/
Avatar billede jpk Nybegynder
19. juli 2002 - 09:25 #1
Jeg er ikke helt med!
Du skriver "Det filtret gør er at kalde en HTTP forspørgsel ..." (kalde en forespørgsel - dobbeltkonfekt?).
Ret mig hvis jeg tager fejl, men sidder et filter ikke mellem klienten og serveren, og kaldes således enten af serveren eller klienten? (altså, det er ikke filteret der laver et HTTP-kald..?

Hvis det du mener er, at filteret rent faktisk OGSÅ skal lave et kald (for at hente data, giver det dog mening...

"jeg gerne vil have mit filter til at ignorere forspørgsler hvor der f.eks indgår et punktum"
Betyder det, at når en bruger requester en side, måder navnet ikke indeholde '.'?
Kan du evt. give et eksempel på en request du gerne vil have sorteret fra?
Avatar billede entracore Nybegynder
19. juli 2002 - 10:50 #2
JPK >> Filtret installeres på IIS under et specifikt website.

Det filtret gør på nuværende tidspunk er at dele http forspørgslen op og lægge denne ned i en variabel. F.eks. http://www.navn.dk/minforspørgsel vil http://www.navn.dk blive filtret fra og /minforspørgsel vil blive lagt ned i en variabel. Variabelnavn = /minforspørgsel.

Så når jeg kalder min variabel fra et ASP script, Request("Variabelnavn") vil denne indeholde /minforspørgsel.

Jeg vil dog gerne have den til også at filtere de HTTP forspørgsler fra der indeholder et punktum "." F.eks. http://www.navn.dk/minforspørgsel.html.

minforspørgsel.htm skal ikke lægges ned i en variabel fordi at denne indeholder et punktum.

Håber at ovenstående kaster lidt lys over sagen :-)
Avatar billede jpk Nybegynder
19. juli 2002 - 10:57 #3
Okay, kan du poste koden der deler http forspørgslen op?
Avatar billede jpk Nybegynder
19. juli 2002 - 11:31 #4
Jeg ville mene du skulle gøre noget lign. understående i din notification handler:

    char cPathInfo[256];
    DWORD dwSize = sizeof(cPathInfo);
    pfc->GetServerVariable("PATH_INFO", cPathInfo, &dwSize);
    string strPathInfo(cPathInfo);
    if(strPathInfo.find('.'))
    {
        // '.' was found
    }
    else
    {
    }
Avatar billede entracore Nybegynder
22. juli 2002 - 13:05 #5
jpk >> Undskyld mit lidt sene tilbagesvar. Min kode har jeg postet i spørgsmålet.

Jeg godt se ideén med dit eksempel med at man anvender "find" til at lokalisere et punktum. Men mit problem er at jeg ved ikke hvilken variabel jeg skal se efter dette punktum og jeg er heller ikke klar over hvordan jeg skal aflsutte min klasse og retunere helle HTTP forspørgslen ;-)
Avatar billede jpk Nybegynder
22. juli 2002 - 13:55 #6
"Det filtret gør på nuværende tidspunk er at dele http forspørgslen op og lægge denne ned i en variabel. F.eks. http://www.navn.dk/minforspørgsel vil http://www.navn.dk blive filtret fra og /minforspørgsel vil blive lagt ned i en variabel. Variabelnavn = /minforspørgsel."

Hvor, i koden du har postet, sker dette?
Avatar billede entracore Nybegynder
22. juli 2002 - 20:34 #7
JPK >> Godt spørgsmål ;-) Det meste af min kode er genereret af en Wizard. De eneste jeg er klar over er hvor jeg lægger ned i en variabel. Dette sker i denne klasse:

DWORD CRequestHttpFilterFilter::OnPreprocHeaders(CHttpFilterContext* pCtxt,
    PHTTP_FILTER_PREPROC_HEADERS pHeaderInfo)
{
    char inbuf[2048], buf[2048];
    DWORD szinbuf = sizeof(inbuf);
   
    pHeaderInfo->GetHeader(pCtxt->m_pFC,"url",inbuf,&szinbuf);

    if (*(inbuf+1)=='_') return SF_STATUS_REQ_NEXT_NOTIFICATION;

    sprintf(buf,"/default.asp?HTTP_Path=%s",inbuf); //Her bliver HTTP_Path til værdien som er %s og så kalder jeg så HTTP_Path (Request("HTTP_Path")) fra en ASP side.

    pHeaderInfo->SetHeader(pCtxt->m_pFC,"url",buf);
   
    return SF_STATUS_REQ_NEXT_NOTIFICATION;
}

Jeg kan desværre ikke komme med noget mere uddbydene - håber at det giver mening. :-)
Avatar billede jpk Nybegynder
23. juli 2002 - 08:26 #8
Siden du anvender MFC, burde du bruge den funktionalitet der tilbydes til at gøre koden mere simpel (som jeg har gjort i mit eksempel).

Her er et par spørgsmål, så vi kan komme til bunds i det her:
1) Hvilken værdi har inbuf efter linien "pHeaderInfo->GetHeader(pCtxt->m_pFC,"url",inbuf,&szinbuf);" er udført? (har du prøvet at udskrive den eller debugge for at se indholdet?). Jeg spørger fordi jeg gerne vil vide om den indeholder hele url'en ("http://www.navn.dk/minforspørgsel") eller blot ("minforspørgsel") eller... Du skriver jo at url'en deles op, men det sker ikke explicit i din kode..?

2) I linien "if (*(inbuf+1)=='_') return SF_STATUS_REQ_NEXT_NOTIFICATION;" tjekker du om karakter nummer 2 i inbuf er et '_' hvorfor det?
Avatar billede entracore Nybegynder
23. juli 2002 - 11:39 #9
Ok takket være dig fandt jeg en løsning. Variabelen "inbuf" indeholder HTTP forspørgslen.

if (*(inbuf+1)=='_') return SF_STATUS_REQ_NEXT_NOTIFICATION; er et levn fra noget gammel kode. Hvis det sidste tegn i inbuf er "_" skal den ignorere forspørgslen og gå til den næste forspørgsel.

Jeg har så tilføjet følgende:

if (strstr(inbuf, ".") != NULL) return SF_STATUS_REQ_NEXT_NOTIFICATION;

Hvis inbuf indeholder "." skal den ligeledes ignorere forspørgslen og fortsætte til den næste.

Problemet var at efter jeg installerede ISAPI filtret på mit website blev bl.a. IMG tags også filtreret så stien ikke var korrekt og billedet blev ikke vist. Men nu er det kun forspørgsler fra brugeren der bliver filtreret.


Mange tak for din hjælp og tålmodighed og vil du komme med en besvarelse så jeg kan give dig dine point :-)
Avatar billede jpk Nybegynder
23. juli 2002 - 11:42 #10
Ok, her er svaret!
Jeg takker og er glad for at kunne hjælpe...
Avatar billede entracore Nybegynder
23. juli 2002 - 13:25 #11
Endnu engang tak ;-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester