HTTP Uplaod und Download



  • Hallo,
    ich möchte Daten auf einen Server hochladen und von woanders wieder runterladen.
    Die Internetverbindung habe ich erfolgreich hergestellt. Jetzt lade ich meine Daten hoch:

    SendString=Encrypt(SendString);
    	TRY
    	{
    		REQUEST_CONTEXT rc;
    		rc.pEx=this;
    		m_dwContext=0;
    		const char* strType[2]={"text/*",0};
    		HINTERNET hRequest;	hRequest=HttpOpenRequest(m_hSession,"POST","EkkiCW.html",NULL,NULL,strType, INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
    		INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
    		INTERNET_FLAG_KEEP_CONNECTION |
    		INTERNET_FLAG_NO_AUTH |
    		INTERNET_FLAG_NO_AUTO_REDIRECT |
    		INTERNET_FLAG_NO_COOKIES |
    		INTERNET_FLAG_NO_UI |
    		INTERNET_FLAG_RELOAD,(unsigned long)&rc);
    		INTERNET_BUFFERS BUF;
    		BUF.lpcszHeader=0;
    		BUF.dwHeadersLength=0;
    		BUF.dwHeadersTotal=0;
    		BUF.lpvBuffer=0;
    		BUF.dwBufferLength=0;
    		BUF.dwBufferTotal=0;
    		BUF.Next=0;
    		BUF.dwStructSize=sizeof(BUF);
    		DWORD OptionLength=0;
    		if(HttpSendRequestEx(hRequest,&BUF,0,0,(unsigned long)&rc))
    		{
    			DWORD error,length;
    			char buffer[666];
    			buffer[0]=0;
    			DWORD nWritten=0;
    			m_dwContext=0;
    			if(true/*InternetQueryDataAvailable(hRequest,&nWritten,0,(unsigned long)&rc)*/)
    			{
    				DWORD p=nWritten;
    				if(InternetWriteFile(hRequest,SendString.GetBuffer(SendString.GetLength()),SendString.GetLength(),&nWritten))
    				{
    					InternetGetLastResponseInfo(&error,buffer,&length);
    					short z=0;
    				}
    				else
    				{
    					int f=nWritten;
    					int d=GetLastError();
    					DWORD error,length;
    					char buffer[333];
    					InternetGetLastResponseInfo(&error,buffer,&length);
    					MessageBox(NULL,buffer,"",MB_OK);
    				}
    			}
    			HttpEndRequest(hRequest,0,0,(unsigned long)&rc);
    			InternetCloseHandle(hRequest);
    		}
    		else
    			int d=GetLastError();
    		MSG msg;
    		while(!m_dwContext)
    			while(::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE))
    			{
    				AfxGetThread()->PumpMessage();
    			}
    		m_dwContext=0;
    	}
    	CATCH(CException, Ex)
    	{
    		int d=GetLastError();
    		RestartConnection();
    		goto start;
    	}
    	END_CATCH
    

    Das klappt auch ganz gut. nWritten hat nach InternetWriteFile im Debugger den Wert, der die Länge des SendString darstellt. Soweit so gut.
    Jetzt wieder herunterladen:

    start:
    	bool bResult=false;
    	while(!bResult)
    	{
    		TRY
    		{//TRY
    			REQUEST_CONTEXT rc;
    			rc.pEx=this;
    			m_dwContext=0;
    			m_dwContext=0;
    			char* buffer;
    			const char* strType[2]={"*/*",0};
    			HINTERNET hRequest;
    			hRequest=HttpOpenRequest(m_hSession,"GET","EkkiCW.html",NULL,NULL,strType, INTERNET_FLAG_KEEP_CONNECTION|
    																				   INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS|
    																				   INTERNET_FLAG_RELOAD|INTERNET_FLAG_SECURE|
    																				   INTERNET_FLAG_NO_CACHE_WRITE|
    																				   INTERNET_FLAG_KEEP_CONNECTION,
    																							 (unsigned long)&rc);
    			if(HttpSendRequest(hRequest,NULL,0,0,0))
    			{
    				DWORD nToRead=0,nRead=0;
    				BOOL bRes=InternetQueryDataAvailable(hRequest,&nToRead,0,(unsigned long)&rc);
    				if(nToRead==0)
    					short v=0;
    				if(!bRes)
    					short z=0;
    				if(nToRead<=0)
    				{
    					int d=GetLastError();
    					goto stepMsg;
    				}
    				buffer= (char*) malloc(nToRead);
    				if(!InternetReadFile(hRequest,buffer,nToRead,&nRead))
    					int h=GetLastError();
    				HttpEndRequest(hRequest,0,0,0);
    				InternetCloseHandle(hRequest);
    				MessageBox(NULL,buffer,"",MB_OK);
    			}
    			MSG msg;
    			while(!m_dwContext)
    				while(::PeekMessage(&msg, NULL, NULL, NULL, PM_NOREMOVE))
    				{
    					AfxGetThread()->PumpMessage();
    				}
    			m_dwContext=0;
    			*strResult=buffer;
    			bResult=true;
    stepMsg:
    			HttpEndRequest(hRequest,0,0,0);
    			InternetCloseHandle(hRequest);
    		}
    		CATCH(CException, Ex)
    		{
    			int d=GetLastError();
    			RestartConnection();
    			goto start;
    		}
    

    Das Programm lädt etwas herunter, aber nur die Fehlermeldung 400: Url not found in Form einer html-Datei.
    Hat jemand einen Rat?
    Danke im Voraus
    Jens



  • Öh.
    Ich glaub nicht dass das senden so richtig ist.
    Ich denke du musst wohl die Daten in der INTERNET_BUFFERS Struktur mitgeben ODER HttpSendRequestEx verwenden.

    Also: entweder alles (inklusive Daten) mit einem HttpSendRequest Call schicken & empfangen, ODER HttpSendRequestEx + InternetWriteFile + HttpEndRequest.

    BTW: Doku lesen hilft oft.


Anmelden zum Antworten