//根據乙個給定的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的物件,然後通過它的物件...