65.9K
CodeProject is changing. Read more.
Home

CSplitURL - split a URL into component parts

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.17/5 (9 votes)

Nov 11, 2002

viewsIcon

118026

downloadIcon

1807

Wrapper class for the WinInet InternetCrackUrl function

Sample Image - SplitURL.jpg

Introduction

Recently I needed some code that would split a URL into component parts (scheme, host, folder, etc.) and I came across a WinInet function called InternetCrackUrl which does the job. The function itself is fairly straighforward, but I thought the demo supplied on the MSDN might be a tad confusing for new users - so I have created CSplitURL to wrap the call.

This class is not going to win any prizes, but it is very easy to use - first include the header:

#include "url.h"

Then, to use the class, simply declare a CSplitURL object, passing the URL to split, e.g.:

CSplitURL url(_T("http://www.codeproject.com"));

Once you have created a CSplitURL, you can access the various URL components using the following methods:

  • GetScheme
  • GetPort
  • GetSchemeName
  • GetHostName
  • GetUserName
  • GetPassword
  • GetURLPath
  • GetExtraInfo

All pretty self-explanatory. Note that using this class in your application will create a dependency on WININET.DLL, which hopefully won't be a problem. Note also that this class can be used with any framework that includes a CString class - including MFC, WTL and ATL7.

CSplitURL

// Implementation of the CURLComponents and CSplitURL classes.

#pragma once
#pragma comment(lib, "wininet.lib")

#include "wininet.h"

// Class to wrap the Win32 URL_COMPONENTS structure
class CURLComponents : public URL_COMPONENTS
{
public:    
    CURLComponents(void)
    {
        memset(this, 0, sizeof(URL_COMPONENTS));
        dwStructSize = sizeof(URL_COMPONENTS);
    }
};

// Class used to split a URL into component parts.
// Note: Uses WININET InternetCrackUrl function.
class CSplitURL
{
private:
    CString m_strScheme;
    INTERNET_SCHEME m_nScheme;
    CString m_strHostName;
    INTERNET_PORT m_nPort;
    CString m_strUserName;
    CString m_strPassword;
    CString m_strURLPath;
    CString m_strExtraInfo;
public:    
    CSplitURL(void)
        : m_nScheme(INTERNET_SCHEME_DEFAULT)
        , m_nPort(0)
    {
    }
    
    CSplitURL(LPCTSTR lpsz)
        : m_nScheme(INTERNET_SCHEME_DEFAULT)
        , m_nPort(0)
    {
        Split(lpsz);
    }

    ~CSplitURL(void)
    {
    }

    // Split a URL into component parts
    bool Split(LPCTSTR lpsz)
    {
        // Be defensive
        ATLASSERT(lpsz != NULL && *lpsz != '\0');
        // Get the URL length
        DWORD dwLength = _tcslen(lpsz);

        CURLComponents url;        
        // Fill structure
        url.lpszScheme = m_strScheme.GetBuffer(dwLength);
        url.dwSchemeLength = dwLength;
        url.lpszHostName = m_strHostName.GetBuffer(dwLength);
        url.dwHostNameLength = dwLength;
        url.lpszUserName = m_strUserName.GetBuffer(dwLength);
        url.dwUserNameLength = dwLength;
        url.lpszPassword = m_strPassword.GetBuffer(dwLength);
        url.dwPasswordLength = dwLength;
        url.lpszUrlPath = m_strURLPath.GetBuffer(dwLength);
        url.dwUrlPathLength = dwLength;
        url.lpszExtraInfo = m_strExtraInfo.GetBuffer(dwLength);
        url.dwExtraInfoLength = dwLength;
        // Split
        bool bRet = InternetCrackUrl(lpsz, 0, 0, &url) != FALSE;
        // Release buffers
        m_strScheme.ReleaseBuffer();
        m_strHostName.ReleaseBuffer();
        m_strUserName.ReleaseBuffer();
        m_strPassword.ReleaseBuffer();
        m_strURLPath.ReleaseBuffer();
        m_strExtraInfo.ReleaseBuffer();
        // Get the scheme/port
        m_nScheme = url.nScheme;
        m_nPort = url.nPort;
        // Done
        return bRet;
    }

    // Get the scheme number
    inline INTERNET_SCHEME GetScheme(void) const { return m_nScheme; }
    // Get the port number
    inline INTERNET_PORT GetPort(void) const { return m_nPort; }
    // Get the scheme name
    inline LPCTSTR GetSchemeName(void) const { return m_strScheme; }
    // Get the host name
    inline LPCTSTR GetHostName(void) const { return m_strHostName; }
    // Get the user name
    inline LPCTSTR GetUserName(void) const { return m_strUserName; }
    // Get the password
    inline LPCTSTR GetPassword(void) const { return m_strPassword; }
    // Get the URL path
    inline LPCTSTR GetURLPath(void) const { return m_strURLPath; }
    // Get the extra info
    inline LPCTSTR GetExtraInfo(void) const { return m_strExtraInfo; }
};