_HTTP_URI::_HTTP_URI(string url)<br />{<br />if (url.IsNullOrEmpty())<br />{<br />return;<br />}<br />int Offset = url.IndexOf(_T("://"));//解析Scheme<br />if (Offset == -1)//不符合<br />{<br />return;<br />}<br />this->Scheme = _T("HTTP");//目前僅支援http協議<br />url = url.Substring(Offset + 3).Replace(_T("//"), _T("/"));<br />Offset = url.IndexOf(_T(":"));//解析host<br />if (Offset == -1)//沒有指定連接埠<br />{<br />this->Port = 80;//使用預設連接埠<br />Offset = url.IndexOf(_T("/"));<br />if (Offset == -1)//沒有指定路徑,連末尾的斜杠也沒有<br />{<br />this->Host = url.ToLower();//將主機名稱轉換為小寫<br />this->PathAndQuery = _T("/");<br />return;//解析完成 http:// hostname<br />}<br />else<br />{<br />this->Host = url.Substring(0, Offset).ToLower();<br />this->PathAndQuery = url.Substring(Offset);<br />return;//解析完成 http:// hostname /file?query=...<br />}<br />}<br />else<br />{<br />this->Host = url.Substring(0, Offset).ToLower();<br />url = url.Substring(Offset + 1);//不要":"<br />Offset = url.IndexOf(_T("/"));<br />if (Offset == -1)//沒有末尾的斜杠<br />{<br />this->Port = atoi(url);<br />this->PathAndQuery = _T("/");<br />return;//解析完成 http:// hostname:port<br />}<br />else<br />{<br />this->Port = atoi(url.Substring(0, Offset));<br />this->PathAndQuery = url.Substring(Offset);<br />return;//解析完成 http:// hostname:port /file?query=...<br />}<br />}<br />}
備忘:C++解析URL除了第三方庫之外,還可以使用ParseURL,該函數定義在Shlwapi.h中,美中不足的是,無法解析出連接埠.