天網搜尋TSE部分原始碼分析 url cpp

2021-05-17 15:17:08 字數 4679 閱讀 1763

//根據乙個給定的url,組成訊息體,傳送給該url指向的伺服器。

//為此,定義url類

//對**的"."分隔符進行判斷,主要分析是否以"."或".."結束

#define dotp(x) ((*(x) == '.') &&(!*(x + 1)))

#define ddotp(x) ((*(x) == '.') &&(*(x + 1) == '.') && (!*(x +2)))

mapmapcachehostlookup;

extern vectorvsunreachhost;

pthread_mutex_t mutexcachehost = pthread_mutex_initializer;

extern setsetvisitedurlmd5;

extern mapmapipblock;

typedefmap::value_typevaltypechl;

//定義連線型別結構

struct scheme_data;

//所有連線情況的定義

static struct scheme_data supported_schemes =,,

}; //分析並填充連線型別

void curl::parsescheme (const char *url)

else}

this->m_escheme= scheme_invalid;

return;}

bool curl::parseurlex(string strurl)

//如果是http型別,parseurlex繼續處理,注意每個引數都有傳送它的長度

parseurlex(strurl.c_str(),

protocol,sizeof(protocol),

host,sizeof(host),

request,sizeof(request),

&port);

//將取出後的url的相關資訊寫入成員變數中

m_surl  =strurl;

m_shost = host;

m_spath = request;

if( port > 0)

return true;}

//對url進一步處理

void curl::parseurlex(const char *url,

char *protocol, intlprotocol,

char *host, int lhost,

char *request, intlrequest,

int *port)

else

//跳過"//"

// skip past opening /'s

if( (*ptr=='/')&& (*(ptr+1)=='/') )

ptr+=2;

//使用ptr2處理主機

// find host

ptr2 = ptr;

while( isvalidhostchar(*ptr2)&& *ptr2 )

ptr2++;

*ptr2 = 0;//保證複製主機字元的正確性和安全性

strncpy( host, ptr, lhost );

//處理請求部分的字元

// find the request

int offset = ptr2 - work;

const char *pstr = url + offset;

//pstr指向請求部分的起始部分通過offset偏移位址

strncpy( request, pstr, lrequest );

//處理埠號

// find the port number, ifany

ptr = strchr( host, ':' );

if( ptr != null )

//pthread_mutex_lock(&mutexmemory);

delete work;

//pthread_mutex_unlock(&mutexmemory);

work = null;}

curl::curl()

if( !isvalidhost(host) )

unsigned long inaddr = 0;

char *result = null;

int len = 0;

//主機轉32位二進位制數的ip位址

inaddr = (unsigned long)inet_addr( host );

//if ( (int)inaddr != -1)}}

//均未找到,只能求助於dns服務

// if still not find, then try by dnsserver

struct hostent *hp; 

hp =gethostbyname(host);//通過主機名獲得ip位址

if(hp == null)

// cache host lookup

//in為32位的ip位址結構變數

struct  in_addr in;

bcopy(*(hp->h_addr_list),(caddr_t)&in, hp->h_length);

//inet_ntoa()是對structin_addr*結構轉變成可以答應的ip的點進字

//符串,inet_ntop也是同樣的功能,不過inet_ntop是使用於ipv4,ipv6

//而inet_ntoa只能用於ipv4

//af_inet表示為ip位址形式即internet位址家族

char   abuf[inet_addrstrlen];

//將in中的位址轉成帶點的ip位址字元形式

if( inet_ntop(af_inet, (void *)&in,abuf,sizeof(abuf)) == null ) else

pthread_mutex_unlock(&mutexcachehost);

// return result

len = strlen(abuf);

//pthread_mutex_lock(&mutexmemory);

result = new char[len + 1];

//pthread_mutex_unlock(&mutexmemory);

memset( result, 0, len+1 );

memcpy( result, abuf, len );

return result;

}bool curl::isvalidhostchar(char ch)

bool curl::isvalidhost(const char *host)

if( strlen(host) < 6 )

char ch;

for(unsigned int i=0;ireturn true;

}bool curl::isvisitedurl(const char *url)

cmd5 imd5;

imd5.generatemd5( (unsigned char*)url,strlen(url) );

string strdigest = imd5.tostring();

if( setvisitedurlmd5.find(strdigest) !=setvisitedurlmd5.end() ) else

bool curl::isvalidip(const char *ip)

unsigned long inaddr = (unsignedlong)inet_addr(ip);

if( inaddr == inaddr_none )

if( mapipblock.size() > 0)

}// outside

return false;

}// if block range is not given, we think itinside also

return true;

}bool curl::isforeignhost(string host)

string::size_type idx = host.rfind('.');

string tmp;

if( idx != string::npos )

cstrfun::str2lower( tmp, tmp.size() );

const char *home_host =;

int home_host_num = 10;

for(int i=0; ireturn true;

}bool curl::isimageurl(string url)

cstrfun::str2lower( tmp, tmp.size() );

const char *image_type =;

int image_type_num = 7;

for (int i=0; ireturn false;

}

TSE原始碼分析 url h

根據乙個給定的url,組成訊息體,傳送給該url指向的伺服器。為此,定義url類 url.h ifndef url h 030728 define url h 030728 include 定義url和host長度 const unsigned int url len 256 const unsig...

redux原始碼分析(三) 原始碼部分

下面是每個部分的一些解讀 createstore apicreatestore reducer,initialstate enhancer 曾經非常好奇這個函式的第二個引數到底是initialstate還是enhancer,因為見過兩種寫法都有的,以為是版本問題。看了原始碼才發現,都可以的。如果你不...

junit部分原始碼分析

通過對junit的粗略了解,大致的知道了這裡面的幾種模式 junit原始碼與之spring hibnate原始碼相比,就比較簡單了,但是麻雀雖小,五臟俱全,這裡面用到了幾 種設計模式,也是乙個短小精悍 非常完所的乙個框架。下面講乙個它的整體的框架吧 先得到testresult的物件,然後通過它的物件...