Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 940
  • Last Modified:

Can't make CHttpConnection work

I'm trying to download web content, and I would like to try using the MFC wrapper. I keep getting "The URL is invalid", when using direct retrieval works fine. There is only bad documentation and no examples of usage. I'm sure I'm abusing the file specification in OpenRequest, but I can't find any permutation that works. Any help would be appreciated.
// GetYahooDataCA.cpp : Defines the entry point for the console application.
 
#include "stdafx.h"
#include <afxinet.h>
 
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
 
CWinApp theApp;
 
using namespace std;
 
// This function works perfectly...
void DisplayPage(LPCTSTR pszURL)
{
	CInternetSession session(_T("Yahoo Session"));
	CStdioFile* pFile = NULL;
	CHAR szBuff[1024];
	pFile = session.OpenURL(pszURL);
	while (pFile->Read(szBuff, 1024) > 0)
		printf_s("%-1023s", szBuff);
	delete pFile;
	session.Close();
}
 
// This one throws an exception on SendRequest();
static void DisplayHttpPage(LPCTSTR pszServerName, LPCTSTR pszFileName)
{
	CInternetSession session(_T("Yahoo Session"));
	try {
		CString strServerName;
		INTERNET_PORT nPort = 80;
		DWORD dwRet = 0;
 
		CHttpConnection*	pServer	= session.GetHttpConnection(pszServerName, nPort);
		CHttpFile*		pFile	= pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, pszFileName, pszServerName );
		pFile->SendRequest();		// throws "URL not found" exception here...
		pFile->QueryInfoStatusCode(dwRet);
 
		if (dwRet == HTTP_STATUS_OK) {
			CHAR szBuff[1024];
			while (pFile->Read(szBuff, 1024) > 0)
				printf_s("%-1023s", szBuff);
		}
		delete pFile;
		delete pServer;
	}
	catch (CInternetException* pEx) {		//catch errors from WinInet
		TCHAR pszError[64];
		pEx->GetErrorMessage(pszError, 64);
		_tprintf_s(_T("\n%-63s\n"), pszError);
	}
	session.Close();
}
 
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
	int nRetCode = 0;
	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {	// initialize MFC and print an error on failure
		_tprintf(_T("Fatal Error: MFC initialization failed\n"));
		nRetCode = 1;
	} else {
 
		CString GE_URL ( "http://biz.yahoo.com" );
		CString GE_File( "/research/earncal/today.html" );
 
		DisplayPage( GE_URL+GE_File );
		DisplayHttpPage( GE_URL, GE_File );
	}
	return nRetCode;
}

Open in new window

0
qstat
Asked:
qstat
  • 2
1 Solution
 
ZoppoCommented:
Hi qstat,

I played a bit around with your code and got it running.

First it seems for 'GetHttpConnection' the passed servername must not be preceeded by the protocol type, so it has to be 'biz.yahoo.com' instead of 'http://biz.yahoo.com'.

Next for 'OpenRequest' the passed filename must not be preceeded by a '/', so it has to be 'research/earncal/today.html' instead of '/research/earncal/today.html'.

At last if you need to pass a referrer-URL to 'OpenRequest' it has to be preceeded by 'http://'.

So, as a conclusion you need to change following:

1. In 'DisplayHttpPage' nitialize the up to now unused variable 'strServerName' like this:
> CString strServerName = CString( "http://" ) + pszServerName;

2. Change the call to OpenRequest in order to use that server name as referrer:
> CHttpFile*              pFile   = pServer->OpenRequest(CHttpConnection::HTTP_VERB_GET, pszFileName, strServerName );

3. Change the two strings for server- and file name in _tmain like this:
> CString GE_URL ( "biz.yahoo.com" );
> CString GE_File( "research/earncal/today.html" );

Hope that helps,

ZOPPO
0
 
qstatAuthor Commented:
Thanks for the help. It would be nice if MS would give the slightest clue for correct usage.
0
 
ZoppoCommented:
Hi qstat,

yes, I agree - it's often a long and exhausting work to find out how some things work, a combination of lot of searching the web and trial and error ...

Therefor we can be thankful for resources like experts exchange!

Have a nice day,

ZOPPO
0

Featured Post

Concerto's Cloud Advisory Services

Want to avoid the missteps to gaining all the benefits of the cloud? Learn more about the different assessment options from our Cloud Advisory team.

  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now