一、前言git
最近由於工做須要判斷一個域名是否備案,實際提取的域名就是HTTP報文中的Host的內容,而判斷一個域名是不是根據根域名進行的。例如訪問www.qq.com,提取Host的內容爲www.qq.com,而判斷這個域名是否備案,是經過qq.com進行,所以須要從Host內容中提取出根域名。 github
遇到的問題api
一、頂級域名的種類存在如下不一樣狀況,例如 www.google.com www.google.com.cn 頂級域名分別是.com 和.com.cn提取頂級名分別爲google.com goolge.com.cndom
二、Host的長度不一,例如 api.best.com upload.api.best.com 提取的根域名都爲best.com測試
解決思路: google
因爲程序是用C語言實現,因此就寫一個C語言的lib庫了。首先頂級域名是公開的,能夠參考維基百科https://zh.wikipedia.org/wiki/%E4%BA%92%E8%81%94%E7%BD%91%E9%A1%B6%E7%BA%A7%E5%9F%9F%E5%88%97%E8%A1%A8 使用hash表將頂級域名存儲起來,方便後面查找頂級域名在O(1)時間內找出來。blog
解析Host, 例如 api.upload.qq.com 大概的思路以下:ip
一、先計算出域名中每一個點(.)在字符串中的位置字符串
二、而後根據Host中點個個數提取出頂級域名,判斷頂級域名是否在hash表get
三、找到頂級域名後,再提取頂級域名的根域名,組合起來就組成了最終的結果
實現代碼放在了github上:https://github.com/FatAnker/domain_parser
測試結果以下圖所示: