Datei mit HTTP (CHttpConnection)



  • hallo

    ich moechte in nem prog überprüfen ob eine datei auf einem HTTP server vorhanden ist habe mir aus dem MFC FAQ diesen code von deus gesucht und nen bissi abgeändert aber so geht das noch ned 100%. Hoffe ich finde hier hilfe oder bekomm nen paar tips 🙂
    hier die funktion die das überprüfen soll

    int myclass::dateicheck(CString strURL)
    {
    
        strURL.ReleaseBuffer();
        CString strTmpURL = strURL;
        strTmpURL.MakeLower();
        if(strTmpURL.Find("http://")!=-1)
            strURL.Delete(0,7);
        CInternetSession INetSession;
        CHttpConnection *HTTPConn=NULL;
        CHttpFile *HTTPFile=NULL;
        TRY
        {
            UpdateData(true);
            INetSession.SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, m_timeout);
            INetSession.SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1);
            INetSession.SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);
    
            HTTPConn=INetSession.GetHttpConnection(strURL.Mid(0,strURL.Find("/")));
            strURL.Delete(0,strURL.Find("/")+1);
    
            HTTPFile = HTTPConn->OpenRequest(CHttpConnection::HTTP_VERB_GET,strURL);
            HTTPFile->SendRequest();
            if(HTTPFile != 0)
            {
                return SUCCESS;
            }
        }
        CATCH(CInternetException, pEx)
        {
            HTTPFile->Close();
            HTTPConn->Close();
            INetSession.Close();
            delete HTTPFile;
            delete HTTPConn;
            return FILE_NOT_FOUND;
        }
        END_CATCH
    
        return FILE_NOT_FOUND;
    
    }
    

    der übergebene CSTRing parameter sieht so aus
    "http://255.255.255.255/dir/test.exe"

    THX für alle Tips

    SplIFF



  • Was klappt denn nicht?

    Übrigens, die Variable INetSession würde ich umbenennen. Das 'I' am Anfang ist eigenlich den Interfaces und COM-Schnittstellen vorbehalten.



  • naja es wird IMMER SUCCES zurückgegeben auch wenn die datei nicht vorhanden ist

    die if

    if(HTTPFile != 0)
            {
                return SUCCESS;
            }
    

    kommt mir auch komisch vor aber mir fählt nix bessres ein

    ansonsten hab ich noch das problem das bei MIR bei SendRequest er einfach rausspringt bei nem freuden der das prog getestet hat ging aber also er gibt halt immer SUCCES zurück wenn der server Online ist auch wenn die date net da ist



  • @thomas:
    das I steht für Inter 😉
    INet -> InterNet 🙂



  • Es kann sein, dass dihc der Server auf ne HTML-Seite weiterleitet, wenn die datei nicht gefunden wird.
    Deswegen hab ich im FAQ-Code folgende überprüfung drinne:

    CString strMime;
        HttpFile->QueryInfo(HTTP_QUERY_CONTENT_TYPE, strMime);
        if(strMime.Find("html")!=-1)
        {
            HttpFile->Close();
            HttpConn->Close();
            INetSession.Close();
            delete HTTPFile;
            delete HTTPConn;
            return FILE_NOT_FOUND;
        }
    


  • aber ansonsten ist das so richtig mit dem datei überprüfen ??



  • Original erstellt von dEUs:
    @thomas:
    das I steht für Inter 😉
    INet -> InterNet 🙂

    Kann ja sein, ich würd meine Variablennamen trotzdem nicht mit nem I anfangen lassen.
    I == Interface (hmm, vielleicht färbt auch C# langsam auf mich ab)



  • Das mit dem I für Interface kenne ich schon auch (wie du oben gesagt hast, von COM). Allerdings sind da die Interfaceklassen so "gepräfixt", nciht die Variablen ...
    EDIT:
    Und da ich nix mit COM am Hut hab, ist mir das auch reichlich wurscht 😃 :p

    [ Dieser Beitrag wurde am 07.09.2002 um 19:46 Uhr von dEUs editiert. ]



  • @dEUS das wäre besser

    if(strMime.Find("htm")!=-1)
    

    hab noch das prob entdeckt also wenn ich
    CString Filename = HTTPFile->GetFileURL(); benutze sehe ich das dann
    Filename IMMER genau wie der an an

    HTTPFile = HTTPConn->OpenRequest
    (CHttpConnection::HTTP_VERB_HEAD,strURL);
    

    ünergebene string ist auch wenn er garned auf dem server vorhanden ist ?? kann mir das einer erklären 😕



  • ui durch das dumme copy paste und editieren denkt wohl jeder hier ich kann die deutsche sprache ned 😢 sollte mir den post vor dem abschicken nochmal durchlesen 🙂



  • habs nun selber gelöst aber da es ja keinen intressiert bin ich zu faul es zu posten THX trotzdem an alle ...



  • erstellt 07.09.2002 20:14
    erstellt 07.09.2002 21:25

    Da liegt gerade mal etwas mehr als 1 Stunden dazwischen.
    Was erwartest du. Das pausenlos jemmand im Board ist, der dir sofort eine Antwort gibt.

    Die Antwortgeber waren auch nicht zu faul dir Hilfestellungen zu geben.
    Wenn du eine Lösung zu deinem Problem nicht bekanntgeben willst ist das OK. Aber wegen Faulheit ! 😡

    [ Dieser Beitrag wurde am 07.09.2002 um 21:34 Uhr von Unix-Tom editiert. ]



  • hmm ja hast ja recht...

    aber war auch nen bissi sauer auf die andren beiden das sie sich da in meinem thread über diesen scheiss unterhalten haben und mich und das eigentliche thread thema misachteten...

    da ich aber jetzt wirklich zu faul bin die lösung zu erklären poste ich einfach die neue funktion 🙂

    int myClass::DateiCheckHTTPServer(CString strURL)
    {
        strURL.ReleaseBuffer();
        CString strTmpURL = strURL;
        strTmpURL.MakeLower();
        if(strTmpURL.Find("http://")!=-1)
            strURL.Delete(0,7);
        CInternetSession INetSession;
        CHttpConnection *HTTPConn=NULL;
        CHttpFile *HTTPFile=NULL;
        TRY
        {
            HTTPConn=INetSession.GetHttpConnection(strURL.Mid(0,strURL.Find("/")));
            if(HTTPConn != 0)
            {
                strURL.Delete(0,strURL.Find("/")+1);
    
                HTTPFile = HTTPConn->OpenRequest(CHttpConnection::HTTP_VERB_HEAD,strURL);
                if(HTTPFile != 0)
                {
                    UpdateData(true);
                    HTTPFile->SetOption(INTERNET_OPTION_CONNECT_TIMEOUT, m_timeout);
                    HTTPFile->SetOption(INTERNET_OPTION_CONNECT_BACKOFF, 1);
                    HTTPFile->SetOption(INTERNET_OPTION_CONNECT_RETRIES, 1);
    
                    HTTPFile->SendRequest();
                    CString strMime;
                    HTTPFile->QueryInfo(HTTP_QUERY_CONTENT_TYPE, strMime);
                    if(strMime.Find("application")!=-1)
                    {
                        HTTPFile->Close();
                        HTTPConn->Close();
                        INetSession.Close();
                        delete HTTPFile;
                        delete HTTPConn;
                        return SUCCESS;
                    }
                }
            }
        }
        CATCH(CInternetException ,pEx)
        {
            HTTPFile->Close();
            HTTPConn->Close();
            INetSession.Close();
            delete HTTPFile;
            delete HTTPConn;
        }
        END_CATCH
    return FILE_NOT_FOUND;
    }
    


  • 1.) Ich hab dir nen Lösungsvorschlag gemacht.
    2.) Deine Lösung ist nur begrenzt sinnvoll:
    Nämlich genau dann, wenn jemand ne ausführbare Datei überprüfen will. Wenn er aber ein BMP oder ZIP oder wasweissich überprüfen will, ist deine Lösung nix wert. Insofern war mein Vorschlag besser.


Log in to reply