00001
00002
00003
00004
00005
00006 #include "fsURL.h"
00007 #include <fsString.h>
00008 #include "common.h"
00009
00010 fsURL::fsURL()
00011 {
00012
00013 }
00014
00015 fsURL::~fsURL()
00016 {
00017
00018 }
00019
00020 fsInternetResult fsURL::Crack(LPCSTR pszUrl, BOOL bCheckScheme)
00021 {
00022
00023 if (lstrcmpi (pszUrl, "http://") == 0)
00024 pszUrl = "http://url";
00025 else if (lstrcmpi (pszUrl, "ftp://") == 0)
00026 pszUrl = "ftp://url";
00027 else if (lstrcmpi (pszUrl, "https://") == 0)
00028 pszUrl = "https://url";
00029
00030 DWORD urlLen = strlen (pszUrl) * 2;
00031 CHAR *pszCanUrl = NULL;
00032 fsString strUrl;
00033
00034
00035 if (*pszUrl == '"' || *pszUrl == '\'')
00036 {
00037
00038
00039 strUrl = pszUrl + 1;
00040 if (strUrl [0] == 0)
00041 return IR_BADURL;
00042 strUrl [strUrl.Length () - 1] = 0;
00043 pszUrl = strUrl;
00044 }
00045
00046 fsnew (pszCanUrl, CHAR, urlLen);
00047 if (pszUrl [0] == '\\' && pszUrl [1] == '\\')
00048 {
00049 m_url.nScheme = INTERNET_SCHEME_FILE;
00050 strcpy (m_szPath, pszUrl);
00051 strcpy (m_szScheme, "file");
00052 *m_szUser = *m_szPassword = 0;
00053 m_url.nPort = 0;
00054 goto _lFileUrl;
00055 }
00056
00057 if (strnicmp (pszUrl, "file://", 7))
00058 {
00059
00060 if (!InternetCanonicalizeUrl (pszUrl, pszCanUrl, &urlLen, ICU_BROWSER_MODE))
00061 {
00062 delete pszCanUrl;
00063
00064 if (GetLastError () == ERROR_INSUFFICIENT_BUFFER)
00065 {
00066 fsnew (pszCanUrl, CHAR, urlLen+1);
00067 if (!InternetCanonicalizeUrl (pszUrl, pszCanUrl, &urlLen, ICU_BROWSER_MODE))
00068 {
00069 delete pszCanUrl;
00070 return fsWinInetErrorToIR ();
00071 }
00072 }
00073 else
00074 return fsWinInetErrorToIR ();
00075 }
00076 }
00077 else
00078 {
00079
00080 strcpy (pszCanUrl, pszUrl);
00081 }
00082
00083 ZeroMemory (&m_url, sizeof (m_url));
00084 m_url.dwStructSize = sizeof (m_url);
00085
00086 m_url.lpszHostName = m_szHost;
00087 m_url.lpszPassword = m_szPassword;
00088 m_url.lpszScheme = m_szScheme;
00089 m_url.lpszUrlPath = m_szPath;
00090 m_url.lpszUserName = m_szUser;
00091
00092 m_url.dwHostNameLength = URL_HOSTNAME_SIZE;
00093 m_url.dwPasswordLength = URL_PASSWORD_SIZE;
00094 m_url.dwSchemeLength = URL_SCHEME_SIZE;
00095 m_url.dwUrlPathLength = URL_PATH_SIZE;
00096 m_url.dwUserNameLength = URL_USERNAME_SIZE;
00097
00098
00099 if (!InternetCrackUrl (pszCanUrl, urlLen,
00100 _strnicmp (pszCanUrl, "ftp://", 6) == 0 ? ICU_DECODE : 0, &m_url))
00101 {
00102 delete pszCanUrl;
00103 return fsWinInetErrorToIR ();
00104 }
00105
00106
00107
00108 delete pszCanUrl;
00109
00110 if (bCheckScheme)
00111 {
00112 if (m_url.nScheme != INTERNET_SCHEME_HTTP && m_url.nScheme != INTERNET_SCHEME_FTP &&
00113 m_url.nScheme != INTERNET_SCHEME_HTTPS && m_url.nScheme != INTERNET_SCHEME_FILE)
00114 {
00115 return IR_BADURL;
00116 }
00117 }
00118
00119 FixWinInetBug ();
00120
00121 _lFileUrl:
00122 if (m_url.nScheme == INTERNET_SCHEME_FILE)
00123 {
00124
00125 if (m_szPath [0] == '\\' && m_szPath [1] == '\\')
00126
00127 {
00128
00129 size_t iPathStart = strcspn (m_szPath + 2, "\\/") + 2;
00130 if (iPathStart == strlen (m_szPath))
00131 return IR_BADURL;
00132 strncpy (m_szHost, m_szPath + 2, iPathStart - 2);
00133 m_szHost [iPathStart - 2] = 0;
00134 strcpy (m_szPath, m_szPath + iPathStart);
00135 }
00136 }
00137
00138 return IR_SUCCESS;
00139 }
00140
00141 LPCSTR fsURL::GetPath()
00142 {
00143 return m_szPath;
00144 }
00145
00146 LPCSTR fsURL::GetHostName()
00147 {
00148 return m_szHost;
00149 }
00150
00151 LPCSTR fsURL::GetScheme()
00152 {
00153 return m_szScheme;
00154 }
00155
00156 LPCSTR fsURL::GetUserName()
00157 {
00158 return m_szUser;
00159 }
00160
00161 LPCSTR fsURL::GetPassword()
00162 {
00163 return m_szPassword;
00164 }
00165
00166 INTERNET_SCHEME fsURL::GetInternetScheme()
00167 {
00168 return m_url.nScheme;
00169 }
00170
00171 INTERNET_PORT fsURL::GetPort()
00172 {
00173 return m_url.nPort;
00174 }
00175
00176 fsInternetResult fsURL::Create(INTERNET_SCHEME nScheme, LPCTSTR lpszHostName, INTERNET_PORT nPort, LPCTSTR lpszUserName, LPCTSTR lpszPassword, LPCTSTR lpszUrlPath, LPSTR lpszUrl, DWORD *pdwUrlLength)
00177 {
00178 ZeroMemory (&m_url, sizeof (m_url));
00179 m_url.dwStructSize = sizeof (m_url);
00180
00181 if (lpszUserName && *lpszUserName == 0)
00182 lpszUserName = NULL;
00183
00184 if (lpszPassword && *lpszPassword == 0)
00185 lpszPassword = NULL;
00186
00187 fsString strHost, strPath;
00188
00189 strHost = lpszHostName;
00190 strPath = lpszUrlPath;
00191
00192 if (nScheme == INTERNET_SCHEME_FILE)
00193 {
00194
00195
00196 lpszUserName = NULL;
00197 lpszPassword = NULL;
00198
00199 if (strHost.Length ())
00200 {
00201 fsString str;
00202 str = "\\\\";
00203 str += strHost;
00204 if (strPath [0] != '\\' && strPath [0] != '/')
00205 str += '\\';
00206 str += strPath;
00207 strHost = "";
00208 strPath = str;
00209 }
00210
00211 strcpy (lpszUrl, "file://");
00212 strcat (lpszUrl, strPath);
00213 return IR_SUCCESS;
00214 }
00215
00216 char szUser [1000] = "", szPwd [1000] = "";
00217 if (lpszUserName)
00218 {
00219 Encode (lpszUserName, szUser);
00220 lpszUserName = szUser;
00221 }
00222
00223 if (lpszPassword)
00224 {
00225 Encode (lpszPassword, szPwd);
00226 lpszPassword = szPwd;
00227 }
00228
00229 m_url.lpszHostName = (LPTSTR) strHost;
00230 m_url.lpszPassword = (LPTSTR) lpszPassword;
00231 m_url.lpszUrlPath = (LPTSTR) strPath;
00232 m_url.lpszUserName = (LPTSTR) lpszUserName;
00233 m_url.nScheme = nScheme;
00234 m_url.nPort = nPort;
00235
00236
00237 if (!InternetCreateUrl (&m_url, 0, lpszUrl, pdwUrlLength))
00238 return fsWinInetErrorToIR ();
00239
00240 return IR_SUCCESS;
00241 }
00242
00243 void fsURL::FixWinInetBug()
00244 {
00245 LPSTR psz = strchr (m_szHost, '@');
00246 if (psz == NULL)
00247 return;
00248
00249 strcat (m_szPassword, "@");
00250 strncat (m_szPassword, m_szHost, psz - m_szHost);
00251 strcpy (m_szHost, psz + 1);
00252 }
00253
00254 void fsURL::Encode(LPCSTR psz, LPSTR sz)
00255 {
00256 while (*psz)
00257 {
00258 char c = *psz++;
00259 char sz2 [10];
00260
00261 if (c == ':' || c == '@' || c == '%')
00262 {
00263 sprintf (sz2, "%%%x", (int)(BYTE)c);
00264 }
00265 else
00266 {
00267 sz2 [0] = c; sz2 [1] = 0;
00268 }
00269
00270 lstrcat (sz, sz2);
00271 }
00272 }