수안이의 컴퓨터 연구실

  • Mainpage
  • About Me
  • Tags
  • Metapage
  • Notice
  • Location
  • Keywords
  • Guestbook
  • Admin
  • Write an Article
  • Total | 1620965
  • Today | 345
  • Yesterday | 482

Programming/MFC2007/03/19 11:04

URL을 파싱하자

원본 : http://www.debuglab.com/knowledge/urlparsing.html

1.요약

AfxParseURL()을 이용하여 URL을 파싱할 수 있다.


2.본문

AfxParseURL()은 URL을 파싱하기위한 MFC 함수입니다.

사용법은 AfxParseURL의 인자로 URL의 문자열을 입력하면 서버와 프로토콜과 포트를 파싱해서 넘겨줍니다.

BOOL AFXAPI AfxParseURL( LPCTSTR pstrURL, DWORD& dwServiceType, CString& strServer, CString& strObject, INTERNET_PORT& nPort ); 
pstrURL : 파싱할 URL
dwServiceType : HTTP, FTP, ...
strServer : 서버 ( ex) www.microsoft.com)
nPort : port

여기까지만 하면 너무 허전하죠... 그래서 MFC를 쓰지않는 프로그램에서는 이런 기능을 구현하기 위해 MFC소스를 분석해 보겠습니다.

-----------------------------------------------------------------------------

BOOL AFXAPI AfxParseURL(LPCTSTR pstrURL, DWORD& dwServiceType, 

            CString& strServer, CString& strObject, INTERNET_PORT& nPort) 

{ 

    dwServiceType = AFX_INET_SERVICE_UNK; 

    

    ASSERT(pstrURL != NULL); 

    if (pstrURL == NULL) 

        return FALSE; 

    

    URL_COMPONENTS urlComponents; 

    memset(&urlComponents, 0, sizeof(URL_COMPONENTS)); 

    urlComponents.dwStructSize = sizeof(URL_COMPONENTS); 

    

    urlComponents.dwHostNameLength = INTERNET_MAX_URL_LENGTH; 

    urlComponents.lpszHostName = strServer.GetBuffer(INTERNET_MAX_URL_LENGTH+1); // --- ④ 

    urlComponents.dwUrlPathLength = INTERNET_MAX_URL_LENGTH; 

    urlComponents.lpszUrlPath = strObject.GetBuffer(INTERNET_MAX_URL_LENGTH+1); // --- ⑤ 

    

    BOOL bRetVal = _AfxParseURLWorker(pstrURL, &urlComponents, 

        dwServiceType, nPort, ICU_BROWSER_MODE); // 이게 진짜 

    

    strServer.ReleaseBuffer(); 

    strObject.ReleaseBuffer(); 

    return bRetVal; 

} 

-----------------------------------------------------------------------------

소스를 보시면 아시겠지만 구조체를 초기화 한다음에 _AfxParseURLWorker에서 모든 처리를 하게한 느낌을 줍니다.

그럼 _AfxParseURLWorker를 한번 보죠.

-----------------------------------------------------------------------------

AFX_STATIC BOOL AFXAPI _AfxParseURLWorker(LPCTSTR pstrURL, 

              LPURL_COMPONENTS lpComponents, DWORD& dwServiceType, 

              INTERNET_PORT& nPort, DWORD dwFlags) 

{ 

    // this function will return bogus stuff if lpComponents 

    // isn't set up to copy the components 

    

    ASSERT(lpComponents != NULL && pstrURL != NULL); 

    if (lpComponents == NULL || pstrURL == NULL) 

        return FALSE; 

    ASSERT(lpComponents->dwHostNameLength == 0 || 

        lpComponents->lpszHostName != NULL); 

    ASSERT(lpComponents->dwUrlPathLength == 0 || 

        lpComponents->lpszUrlPath != NULL); 

    ASSERT(lpComponents->dwUserNameLength == 0 || 

        lpComponents->lpszUserName != NULL); 

    ASSERT(lpComponents->dwPasswordLength == 0 || 

        lpComponents->lpszPassword != NULL); 

    

    ASSERT(AfxIsValidAddress(lpComponents, sizeof(URL_COMPONENTS), TRUE)); // --- ① 

    

    LPTSTR pstrCanonicalizedURL; 

    TCHAR szCanonicalizedURL[INTERNET_MAX_URL_LENGTH]; 

    DWORD dwNeededLength = INTERNET_MAX_URL_LENGTH; 

    BOOL bRetVal; 

    BOOL bMustFree = FALSE; 

    DWORD dwCanonicalizeFlags = dwFlags & 

        (ICU_NO_ENCODE | ICU_DECODE | ICU_NO_META | 

        ICU_ENCODE_SPACES_ONLY | ICU_BROWSER_MODE); 

    DWORD dwCrackFlags = dwFlags & (ICU_ESCAPE | ICU_USERNAME); 

    

    bRetVal = InternetCanonicalizeUrl(pstrURL, szCanonicalizedURL, 

        &dwNeededLength, dwCanonicalizeFlags); // --- ② 

    

    if (!bRetVal) 

    { 

        if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER) 

            return FALSE; 

        

        pstrCanonicalizedURL = new TCHAR[dwNeededLength]; 

        bMustFree = TRUE; 

        bRetVal = InternetCanonicalizeUrl(pstrURL, pstrCanonicalizedURL, 

            &dwNeededLength, dwCanonicalizeFlags); 

        if (!bRetVal) 

        { 

            delete [] pstrCanonicalizedURL; 

            return FALSE; 

        } 

    } 

    else 

        pstrCanonicalizedURL = szCanonicalizedURL; 

    

    // now that it's safely canonicalized, crack it 

    

    bRetVal = InternetCrackUrl(pstrCanonicalizedURL, 0, 

        dwCrackFlags, lpComponents); // --- ③ 

    if (bMustFree) 

        delete [] pstrCanonicalizedURL; 

    

    // convert to MFC-style service ID 

    

    if (!bRetVal) 

        dwServiceType = AFX_INET_SERVICE_UNK; 

    else 

    { 

        nPort = lpComponents->nPort; 

        switch (lpComponents->nScheme) 

        { 

        case INTERNET_SCHEME_FTP: 

            dwServiceType = AFX_INET_SERVICE_FTP; 

            break; 

            

        case INTERNET_SCHEME_GOPHER: 

            dwServiceType = AFX_INET_SERVICE_GOPHER; 

            break; 

            

        case INTERNET_SCHEME_HTTP: 

            dwServiceType = AFX_INET_SERVICE_HTTP; 

            break; 

            

        case INTERNET_SCHEME_HTTPS: 

            dwServiceType = AFX_INET_SERVICE_HTTPS; 

            break; 

            

        case INTERNET_SCHEME_FILE: 

            dwServiceType = AFX_INET_SERVICE_FILE; 

            break; 

            

        case INTERNET_SCHEME_NEWS: 

            dwServiceType = AFX_INET_SERVICE_NNTP; 

            break; 

            

        case INTERNET_SCHEME_MAILTO: 

            dwServiceType = AFX_INET_SERVICE_MAILTO; 

            break; 

            

        default: 

            dwServiceType = AFX_INET_SERVICE_UNK; 

        } 

    } 

    

    return bRetVal; 

-----------------------------------------------------------------------------

죄송합니다. 너무 길군요. 이렇게 긴것 같지 않았는데. ^ ^ㆀ

①에서 AfxIsValidAddress()를 이용하여 값이 유효한지 확인합니다.

AfxIsValidAddress()가 마치 URL이 옳바르게 쓰여는지 검사하는것 같은 분위기를 풍기는데 그냥 IsBadReadPtr()만 사용하여 메모리가 유효한지만 검사합니다.

②에서 InternetCanonicalizeUrl()를 통하여 URL이 정돈됩니다.

③에서 InternetCrackUrl()를 이용하여 실질적인 파싱을하는데 URL_COMPONENTS 라는 구조체를 이용했습니다. 그리고 나서 그냥 끝인데... 그럼 다시 AfxParseURL() 소스로 돌아가서 값이 어떻게 넘겨지는지 봐야겠습니다.

④에서 서버명을 그리고 ⑤에서 객체(파일)명의 CString 객체의 버퍼를 지정한것을 알 수 있습니다. 이렇게 분석을 해보니 우리가 이런 역활을 하는 프로그램을 만드는데 필요한것은 결국 InternetCrackUrl()뿐이군요. ^ ^



- 2001.08.13 Smile Seo -
"MFC" 카테고리의 다른 글
  • GUID 생성하기 (0)2007/03/21
  • MFC에서 NULL을 비교하는 것은 의미가 없다. (0)2007/03/21
  • URL을 파싱하자 (0)2007/03/19
  • 사용하지 않는 인자에 대한 warning 없애기 (0)2007/03/19
  • HBITMAP을 BMP 파일로 만들어 주는 함수 (0)2007/03/08
2007/03/19 11:04 2007/03/19 11:04
Posted by webdizen
No Trackback No Comment

Trackback URL : http://www.webdizen.net/blog/trackback/2705

Leave your greetings.

[로그인][오픈아이디란?]

«Prev  1 ... 532 533 534 535 536 537 538 539 540 ... 2998  Next»

RSS HanRSS
Blog Image
webdizen
이 곳은 컴퓨터에 대해 연구하고, 공유하고, 소통하기 위한 연구실입니다. 개인적으로는 OLAP, Data Mining, Semantic Web, Data Modeling에 대해서 연구하고 있습니다.

Categories

전체 (2998)
Webdizen (134)
Life (6)
Diary (16)
Blog (9)
IDEA (1)
Travel (10)
Book (14)
Photo (7)
Movie (7)
Music (13)
Leisure Sports (10)
Funny (5)
Hardware (119)
Software (120)
Windows (5)
Unix & Linux (119)
Installation (4)
Kernel (10)
System (34)
Develop (22)
X-Window (0)
Applicaton (31)
Security (4)
Framework (2)
Hadoop (2)
Programming (805)
Algorithm & Data Structure (1)
Assembly (38)
UNIX/Linux C (95)
C++ (128)
STL (4)
Java (38)
Win32 API (92)
ATL/COM (44)
MFC (151)
.NET (26)
WCF/WPF (4)
C# (28)
Network Programming (17)
Database Programming (12)
OpenGL / DirectX (13)
Multimedia Programming (0)
Game Programming (21)
Parallel Distributed Progra... (0)
Reverse Engineering (0)
Debugging (9)
Python (1)
Ruby (1)
Ruby on Rails (1)
QT (4)
GTK (0)
JSP (0)
PHP (6)
ASP.NET (6)
ASP (3)
Development (28)
Useful Library (2)
Data Modeling (0)
Database (105)
Oracle (4)
MSSQL (41)
MySQL (2)
Data Warehouse (2)
Data Mining (3)
Network (66)
Web (78)
DHTML (4)
XHTML (1)
Javascript (1)
CSS (1)
AJAX (9)
XML (11)
Flex (1)
Silverlight (3)
Security (91)
DoS (1)
Kernel (10)
Scanning (3)
Sniffing (0)
Spoofing (4)
Overflow (28)
Web (11)
Shell (10)
Format String (14)
Window (2)
Embedded (70)
Multimedia (27)
Mobile (14)
Graphic (24)
Management (633)
Knowledge (581)
Hadoop (0)

Notice

  • 메타 블로그 사이트에 등록
  • 새해 맞이 블로그의 변화
  • 블로그 명칭 변경
  • 도메인(www.webdizen.net) 구...
  • TEXTCUBE 1.6.1로 업그레이드...

Tags

  • 네트워크 포트
  • 파일 시스템
  • Named
  • Photography
  • 강원대학교 후문
  • 스마트폰
  • 디자인 패턴
  • 슬로코도
  • dialog
  • TRACE
  • 서비스팩 3
  • GCOE X
  • Interfaces
  • 비자
  • Browser detection
  • 파일 특성 조작
  • Data Warehouse
  • Text
  • Common Dialog
  • J&B 레어

Recent Articles

  • ASCII Code의 CRLF 제거 방법.
  • Hadoop 에서 c++ API 이용시....
  • Ubuntu Linux에서 Hadoop 구....
  • 내 심장을 한껏 뛰게한 "국가....
  • 스타 스키마 데이터베이스 설....

Recent Comments

  • ■ 온라인카지노 ▶ http://L....
    asdf 11/21
  • 그리고 혹시 해외여행자보험....
    kim 11/05
  • ★★실제 바다게임장과 똑같....
    asdf 11/04
  • sbsyama.co.to← 짱5000만당....
    asdf 11/04
  • ♡KicaZ??o(???) 바카라사....
    fdsf3fass 11/03

Recent Trackbacks

  • 파일 열기/저장하기 CFileDialog.
    은마군의 나태블록 02/11
  • World IT Show 2008.
    상우 :: Oranzie's BLOG 2008
  • cvs서버 설치하기.
    3인3색 2008
  • 속속 공개되는 Google Chart....
    PHP와 Web 2.0 2007
  • 마방진을 구하는 프로그램.
    Oranzie's BLOG 3 2007

Archive

  • 2009/09 (3)
  • 2009/08 (1)
  • 2009/03 (1)
  • 2009/02 (9)
  • 2009/01 (13)

Calendar

«   2009/11   »
일 월 화 수 목 금 토
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30          

Bookmarks

    • Administration
      • IIS.NET
      • NTFAQ
      • OS의 모든 것
      • 리눅스포털
    • Database
      • SQL Server Central
      • SQL Team
    • Development
      • .NET Heaven
      • ASP Alliance
      • ASP.NET 2.0
      • Bullog.net
      • C# Corner
      • C++ (C PlusPlus.com)
      • C++ Reference
      • CodeGuru
      • CodePlex
      • DebugLab
      • Dev Articles
      • Devpia
      • DotNet Junkies
      • DotNet Zone
      • Driver Online
      • GOSU.NET
      • HOONS 닷넷
      • Joinc 팀블로그
      • KOSR
      • MSDN Home Page
      • OSR Online
      • Sky.ph - 개발자 커뮤니...
      • TAEYO.NET
      • The Code Project
      • WindowsClient.net
      • 김상욱의 개발자 Side
      • 조인시 위키
    • Human Networks
      • belief21c's e-space
      • I think I can
      • Invisible Rover's Blog :D
      • Rodman®
      • ■ Feel So Good~! ■
      • 까만 나비
      • 나를 가꾸는 시간.
      • 나만의 즐거움~~!
      • 단녕
      • 상우 :: Oranzie's BLOG
    • Information Technology
      • Microsoft TechNet
      • 지디넷코리아 - 글로벌...
    • Security
      • FoundStone
      • milw0rm
      • NewOrder
      • OpenRCE
      • Phrack.org
      • Reverse Engineering b1...
      • Reverse Engineering Team
      • RootKit
      • SecurityFocus
      • SecurityXploded by Nag...
      • Wow Hacker
      • Zone-H
Textcube
Louice Studio Inc.
Powered by Textcube. Original designed by Tistory.