'언어/C++'에 해당되는 글 1건

  1. 2011.06.09 URL에서 도매인 호스트 이름만 빼오기
언어/C++2011.06.09 14:34
언제나 우리는 MFC의 기능 좋은 클래스들을 아무런 제약없이 사용하게 된다... 하지만 언젠가 MFC가 없을때 정말 난감하다.. CString의 버그를 아는 순간 누구도 그것을 잘 사용하지 않는 것처럼 ............ URL에서 도매일을 얻고 싶을때도 항상 고민을 하게 된다.. AFXURLxxx API 함수들이 이용하면 좋지만 MFC 개발 환경을 사용 못하는 경우가 더 많음으로 아래와 같이 슈퍼 노가다 성 코드를 제작 해야 한다. 정답도 아니고 버그도 많고 보안상 문제 점도 많다.... 참고만 하시 길 바랍니다.

BOOL ParseHost(__in TCHAR * szFullUrlData, __out TCHAR * szOutDomainName)
{
               TCHAR  szUrlData[MAX_PATH] = {NULL,};
	//---------------------------------------------------------------
	// Data 검증 
	//---------------------------------------------------------------
	if(szFullUrlData == NULL || _tcslen(szFullUrlData) <= 0)
	{
		return FALSE;
	}
	//---------------------------------------------------------------
	// HTTP://, HTTPS://  이 두가지를 검사한다.
	//---------------------------------------------------------------
	if( _tcsstr(szFullUrlData,_T("http://")  ) == NULL  && 
		_tcsstr(szFullUrlData,_T("https://")  )== NULL)
	{
		return FALSE;
	}
	//---------------------------------------------------------------
	// HTTP://, HTTPS:// 에 따른 파싱을 시도한다.
	//---------------------------------------------------------------
	if(_tcsstr(szFullUrlData,_T("http://") ) != NULL )
	{
		TCHAR *  i = _tcsstr(szFullUrlData,_T("http://"));
		StringCchPrintf(szUrlData,MAX_PATH,_T("%s"),i+7);
	}
	else	if(_tcsstr(szFullUrlData,_T("https://") ) != NULL )
	{
		TCHAR *  i = _tcsstr(szFullUrlData,_T("https://"));
		StringCchPrintf(szUrlData,MAX_PATH,_T("%s"),i+8);
	}
	else
	{
		return FALSE;
	}

	//--------------------------------------------------------------
	// 호스트를 제외하고 전부 자른다.
	//---------------------------------------------------------------
	TCHAR * SplitUrl = _tcschr(szUrlData,'/');
	if(SplitUrl != NULL)
	{
		*SplitUrl = 0;
	}

	TCHAR szFullDomainName[MAX_PATH] = {NULL,};
	TCHAR szLastDomain[MAX_PATH]	 = {NULL,};
	TCHAR szSecDomain[MAX_PATH]		 = {NULL,};
	TCHAR szDomainName[MAX_PATH]	 = {NULL,};

	StringCchCopy(szFullDomainName,MAX_PATH,szUrlData);

	TCHAR * splitpath  = _tcsrchr(szFullDomainName,_T('.'));
	StringCchCopy(szLastDomain,MAX_PATH,splitpath);

	if( _tcslen(szLastDomain) > 3 ) // 최상위 도메인 
	{
		*splitpath = 0 ;
		TCHAR * splitpath2  = _tcsrchr(szFullDomainName,('.'));
		if(splitpath2 == NULL)
		{
			StringCchCopy(szDomainName,MAX_PATH,szFullDomainName);

		}
		else
		{
			StringCchCopy(szDomainName,MAX_PATH,splitpath2+1);
		}
	}
	else // 국가 도메인 
	{
		*splitpath = 0 ;
		TCHAR * splitpath2  = _tcsrchr(szFullDomainName,('.'));
		if(_tcslen(splitpath2) ==3 )
		{
			// 진정한 국가 도매인 
			* splitpath2 = 0 ;
			TCHAR * splitpath3  = _tcsrchr(szFullDomainName,('.'));
			if(splitpath3 == NULL)
			{
				StringCchCopy(szDomainName,MAX_PATH,szFullDomainName);
			}
			else
			{
				StringCchCopy(szDomainName,MAX_PATH,splitpath3+1);

			}

		}
		else // 두글짜 짜리 최상위 도메인 
		{
			StringCchCopy(szDomainName,MAX_PATH,splitpath2+1);
		}

	}
	StringCchCopy(szOutDomainName,MAX_PATH,szDomainName);
	
	return TRUE;
}

Posted by 최우림 -=HaeJuK=-

티스토리 툴바