SNAP Library , Developer Reference
2013-01-07 14:03:36
SNAP, a general purpose, high performance system for analysis and manipulation of large networks
|
#include <http.h>
Public Member Functions | |
THttpRq (const PSIn &SIn) | |
THttpRq (const THttpRqMethod &_Method, const PUrl &_Url, const TStr &ContTypeFldVal, const TMem &_BodyMem, const int &FetchId=-1) | |
~THttpRq () | |
THttpRq (TSIn &) | |
void | Save (TSOut &) |
THttpRq & | operator= (const THttpRq &) |
bool | IsOk () const |
bool | IsComplete () const |
THttpRqMethod | GetMethod () const |
const TStr & | GetMethodNm () const |
PUrl | GetUrl () const |
PUrlEnv | GetUrlEnv () const |
bool | IsFldNm (const TStr &FldNm) const |
TStr | GetFldVal (const TStr &FldNm) const |
bool | IsFldVal (const TStr &FldNm, const TStr &FldVal) const |
void | AddFldVal (const TStr &FldNm, const TStr &FldVal) |
const TStrStrH & | GetFldValH () const |
TStr | GetHdStr () const |
int | GetBodyLen () const |
TStr | GetBodyAsStr () const |
PSIn | GetBodyAsSIn () const |
void | GetBodyAsMem (TMem &Mem) const |
void | GetAsMem (TMem &Mem) const |
bool | IsContType (const TStr &ContTypeStr) const |
bool | IsContLen (int &ContLen) const |
TStr | GetStr () const |
Static Public Member Functions | |
static PHttpRq | New (const PSIn &SIn) |
static PHttpRq | New (const THttpRqMethod &Method, const PUrl &Url, const TStr &ContTypeFldVal, const TMem &BodyMem) |
static PHttpRq | New (const PUrl &Url, const int &FetchId=-1) |
static PHttpRq | Load (TSIn &) |
Private Member Functions | |
void | ParseSearch (const TStr &SearchStr) |
void | ParseHttpRq (const PSIn &SIn) |
Private Attributes | |
TCRef | CRef |
bool | Ok |
bool | CompleteP |
int | MajorVerN |
int | MinorVerN |
THttpRqMethod | Method |
PUrl | Url |
TStrStrH | FldNmToValH |
PUrlEnv | UrlEnv |
TStr | HdStr |
TMem | BodyMem |
Friends | |
class | TPt< THttpRq > |
THttpRq::THttpRq | ( | const PSIn & | SIn | ) |
Definition at line 580 of file http.cpp.
References Ok, and ParseHttpRq().
: Ok(false), MajorVerN(0), MinorVerN(0), Method(hrmUndef), FldNmToValH(), UrlEnv(TUrlEnv::New()), HdStr(), BodyMem(){ try { ParseHttpRq(SIn); } catch (THttpEx){Ok=false;} }
THttpRq::THttpRq | ( | const THttpRqMethod & | _Method, |
const PUrl & | _Url, | ||
const TStr & | ContTypeFldVal, | ||
const TMem & | _BodyMem, | ||
const int & | FetchId = -1 |
||
) |
Definition at line 590 of file http.cpp.
References THash< TKey, TDat, THashFunc >::AddDat(), TStr::Empty(), FldNmToValH, TUrl::GetHostNm(), GetMethodNm(), THttpLx::GetNrStr(), TUrl::GetPathStr(), TUrl::GetSearchStr(), GetStr(), HdStr, TUrl::IsOk(), Ok, ParseSearch(), and Url.
: Ok(false), MajorVerN(1), MinorVerN(0), Method(_Method), Url(_Url), FldNmToValH(), UrlEnv(TUrlEnv::New()), HdStr(), BodyMem(_BodyMem){ // compose head-http-request TChA HdChA; if (Url->IsOk()){ TStr AbsPath=Url->GetPathStr()+Url->GetSearchStr(); HdChA+=GetMethodNm(); HdChA+=' '; HdChA+=AbsPath; HdChA+=" HTTP/1.0\r\n"; } // add content-type if (!ContTypeFldVal.Empty()){ FldNmToValH.AddDat(THttpLx::GetNrStr(THttp::ContTypeFldNm), ContTypeFldVal); HdChA+=THttpLx::GetNrStr(THttp::ContTypeFldNm); HdChA+=": "; HdChA+=ContTypeFldVal; HdChA+="\r\n"; } // add host if (Url->IsOk()){ TStr HostNm=Url->GetHostNm(); FldNmToValH.AddDat(THttpLx::GetNrStr(THttp::HostFldNm), HostNm); HdChA+=THttpLx::GetNrStr(THttp::HostFldNm); HdChA+=": "; HdChA+=HostNm; HdChA+="\r\n"; ParseSearch(Url->GetSearchStr()); } // add fetch-id if (Url->IsOk()&&(FetchId!=-1)){ TStr FetchIdStr=TInt::GetStr(FetchId); FldNmToValH.AddDat(THttpLx::GetNrStr(THttp::FetchIdFldNm), FetchIdStr); HdChA+=THttpLx::GetNrStr(THttp::FetchIdFldNm); HdChA+=": "; HdChA+=FetchIdStr; HdChA+="\r\n"; } // finish head-http-request if (Url->IsOk()){ HdChA+="\r\n"; HdStr=HdChA; } // set http-request ok Ok=true; }
THttpRq::~THttpRq | ( | ) | [inline] |
void THttpRq::AddFldVal | ( | const TStr & | FldNm, |
const TStr & | FldVal | ||
) |
Definition at line 663 of file http.cpp.
References THash< TKey, TDat, THashFunc >::AddDat(), FldNmToValH, and THttpLx::GetNrStr().
{ TStr NrFldNm=THttpLx::GetNrStr(FldNm); FldNmToValH.AddDat(NrFldNm, FldVal); }
void THttpRq::GetAsMem | ( | TMem & | Mem | ) | const [inline] |
void THttpRq::GetBodyAsMem | ( | TMem & | Mem | ) | const [inline] |
Definition at line 117 of file http.h.
References TMem::Clr().
PSIn THttpRq::GetBodyAsSIn | ( | ) | const [inline] |
Definition at line 116 of file http.h.
References TMemIn::New().
{ return TMemIn::New(BodyMem); }
TStr THttpRq::GetBodyAsStr | ( | ) | const [inline] |
int THttpRq::GetBodyLen | ( | ) | const [inline] |
TStr THttpRq::GetFldVal | ( | const TStr & | FldNm | ) | const |
Definition at line 649 of file http.cpp.
References FldNmToValH, THash< TKey, TDat, THashFunc >::GetDat(), THttpLx::GetNrStr(), and THash< TKey, TDat, THashFunc >::IsKey().
Referenced by IsFldVal(), and ParseHttpRq().
{ TStr NrFldNm=THttpLx::GetNrStr(FldNm); if (FldNmToValH.IsKey(NrFldNm)){ return FldNmToValH.GetDat(NrFldNm); } else { return TStr(); } }
const TStrStrH & THttpRq::GetFldValH | ( | ) | const |
TStr THttpRq::GetHdStr | ( | ) | const [inline] |
THttpRqMethod THttpRq::GetMethod | ( | ) | const [inline] |
const TStr & THttpRq::GetMethodNm | ( | ) | const |
Definition at line 636 of file http.cpp.
References hrmGet, hrmHead, hrmPost, and Method.
Referenced by GetStr(), and THttpRq().
{ switch (Method){ case hrmGet: return THttp::GetMethodNm; case hrmHead: return THttp::HeadMethodNm; case hrmPost: return THttp::PostMethodNm; default: return THttp::UndefMethodNm; } }
TStr THttpRq::GetStr | ( | ) | const |
Definition at line 672 of file http.cpp.
References BodyMem, TMem::Empty(), FldNmToValH, TMem::GetAsStr(), THash< TKey, TDat, THashFunc >::GetKey(), GetMethodNm(), TUrl::GetUrlStr(), TMem::Len(), THash< TKey, TDat, THashFunc >::Len(), and Url.
Referenced by THttpRq().
{ TChA ChA; ChA+=GetMethodNm(); ChA+=' '; ChA+=Url->GetUrlStr(); ChA+=' '; ChA+="HTTP/1.0\r\n"; for (int FldN=0; FldN<FldNmToValH.Len(); FldN++){ ChA+=FldNmToValH.GetKey(FldN); ChA+=": "; ChA+=FldNmToValH[FldN]; ChA+="\r\n"; } if (!BodyMem.Empty()) { ChA+=THttp::ContLenFldNm; ChA+=": "; ChA+=TInt::GetStr(BodyMem.Len()); ChA+="\r\n"; } ChA+="\r\n"; ChA+=BodyMem.GetAsStr(); return ChA; }
PUrl THttpRq::GetUrl | ( | ) | const [inline] |
PUrlEnv THttpRq::GetUrlEnv | ( | ) | const [inline] |
bool THttpRq::IsComplete | ( | ) | const [inline] |
bool THttpRq::IsContLen | ( | int & | ContLen | ) | const [inline] |
Definition at line 123 of file http.h.
References THttp::ContLenFldNm.
{ return GetFldVal(THttp::ContLenFldNm).IsInt(ContLen);}
bool THttpRq::IsContType | ( | const TStr & | ContTypeStr | ) | const [inline] |
Definition at line 121 of file http.h.
References THttp::ContTypeFldNm.
{ return GetFldVal(THttp::ContTypeFldNm).IsStrIn(ContTypeStr);}
bool THttpRq::IsFldNm | ( | const TStr & | FldNm | ) | const |
Definition at line 645 of file http.cpp.
References FldNmToValH, THttpLx::GetNrStr(), and THash< TKey, TDat, THashFunc >::IsKey().
Referenced by ParseHttpRq().
{ return FldNmToValH.IsKey(THttpLx::GetNrStr(FldNm)); }
bool THttpRq::IsFldVal | ( | const TStr & | FldNm, |
const TStr & | FldVal | ||
) | const |
Definition at line 658 of file http.cpp.
References GetFldVal(), and THttpLx::GetNrStr().
{ return THttpLx::GetNrStr(FldVal)==THttpLx::GetNrStr(GetFldVal(FldNm)); }
bool THttpRq::IsOk | ( | ) | const [inline] |
static PHttpRq THttpRq::Load | ( | TSIn & | ) | [inline, static] |
static PHttpRq THttpRq::New | ( | const PSIn & | SIn | ) | [inline, static] |
Definition at line 81 of file http.h.
Referenced by ParseHttpRq(), and ParseSearch().
static PHttpRq THttpRq::New | ( | const THttpRqMethod & | Method, |
const PUrl & | Url, | ||
const TStr & | ContTypeFldVal, | ||
const TMem & | BodyMem | ||
) | [inline, static] |
static PHttpRq THttpRq::New | ( | const PUrl & | Url, |
const int & | FetchId = -1 |
||
) | [inline, static] |
void THttpRq::ParseHttpRq | ( | const PSIn & | SIn | ) | [private] |
Definition at line 512 of file http.cpp.
References THash< TKey, TDat, THashFunc >::AddDat(), BodyMem, THttpLx::ClrMemSf(), CompleteP, THttpLx::Eof(), FldNmToValH, TMem::GetAsStr(), THttpLx::GetCrLf(), GetFldVal(), THttpLx::GetFldVal(), THttpLx::GetInt(), TStr::GetInt(), THttpLx::GetMemSf(), THttpLx::GetNrStr(), THttpLx::GetPeriod(), THttpLx::GetRest(), THttpLx::GetRqMethod(), TUrl::GetSearchStr(), THttpLx::GetSpec(), THttpLx::GetToken(), THttpLx::GetUrlStr(), THttpLx::GetWs(), HdStr, heBadUrl, hrmGet, hrmPost, THttpLx::IsCrLf(), IsFldNm(), TUrl::IsOk(), TMem::Len(), MajorVerN, Method, MinorVerN, New(), Ok, ParseSearch(), TMem::Trunc(), and Url.
Referenced by THttpRq().
{ THttpLx Lx(SIn); // initial status Ok=false; CompleteP=false; // request-line Method=Lx.GetRqMethod(); Lx.GetWs(); //Url=Lx.GetUrl(); TStr UrlStr=Lx.GetUrlStr(); Lx.GetWs(); Lx.GetToken(THttp::HttpStr); Lx.GetSpec(THttp::SlashStr); MajorVerN=Lx.GetInt(1); Lx.GetPeriod(); MinorVerN=Lx.GetInt(1); Lx.GetCrLf(); // header fields & values while ((!Lx.Eof())&&(!Lx.IsCrLf())){ TStr FldNm=Lx.GetToken(); Lx.GetSpec(THttp::ColonStr); TStr FldVal=Lx.GetFldVal(); Lx.GetCrLf(); TStr NrFldNm=THttpLx::GetNrStr(FldNm); FldNmToValH.AddDat(NrFldNm, FldVal); } // separator CrLf if (!Lx.IsCrLf()){return;} // to avoid exceptions Lx.GetCrLf(); // header & body strings HdStr=Lx.GetMemSf().GetAsStr(); Lx.ClrMemSf(); Lx.GetRest(); BodyMem=Lx.GetMemSf(); // completeness int ContLen=GetFldVal(THttp::ContLenFldNm).GetInt(-1); if (ContLen==-1){ // if not content-len is given we assume http-request is ok CompleteP=true; } else { if (ContLen<=BodyMem.Len()){ // if we read enough data, we claim completeness CompleteP=true; BodyMem.Trunc(ContLen); } else { // if we read not enough data we claim incompleteness CompleteP=false; } } // url if (CompleteP){ const TStr LocalBaseUrlStr="http://localhost/"; Url=TUrl::New(UrlStr, LocalBaseUrlStr); if (!Url->IsOk()){ throw THttpEx(heBadUrl);} } // search string TStr SearchStr; if (Method==hrmGet){ SearchStr=Url->GetSearchStr(); } else if ((Method==hrmPost)&&( (!IsFldNm(THttp::ContTypeFldNm))|| (GetFldVal(THttp::ContTypeFldNm)==THttp::TextHtmlFldVal)|| (GetFldVal(THttp::ContTypeFldNm)==THttp::AppW3FormFldVal))){ SearchStr=TStr("?")+BodyMem.GetAsStr(); } ParseSearch(SearchStr); // at this point ok=true Ok=true; }
void THttpRq::ParseSearch | ( | const TStr & | SearchStr | ) | [private] |
Definition at line 461 of file http.cpp.
References TChA::AddCh(), TUrlEnv::AddToKeyVal(), TChA::Clr(), THttpChRet::Eof(), THttpChRet::GetCh(), TCh::GetHex(), heBadSearchStr, TCh::IsHex(), New(), Ok, and UrlEnv.
Referenced by ParseHttpRq(), and THttpRq().
{ PSIn SIn=TStrIn::New(SearchStr); THttpChRet ChRet(SIn, heBadSearchStr); try { // check empty search string if (ChRet.Eof()){return;} // require '?' at the beginning if (ChRet.GetCh()!='?'){ throw THttpEx(heBadSearchStr);} // parse key=val{&...} pairs TChA KeyNm; TChA ValStr; while (!ChRet.Eof()){ char Ch; KeyNm.Clr(); ValStr.Clr(); // key while ((Ch=ChRet.GetCh())!='='){ switch (Ch){ case '%':{ char Ch1=ChRet.GetCh(); if (!TCh::IsHex(Ch1)) { throw THttpEx(heBadSearchStr); } char Ch2=ChRet.GetCh(); if (!TCh::IsHex(Ch2)) { throw THttpEx(heBadSearchStr); } KeyNm.AddCh(char(16*TCh::GetHex(Ch1)+TCh::GetHex(Ch2)));} break; case '+': KeyNm.AddCh(' '); break; case '&': throw THttpEx(heBadSearchStr); default: KeyNm.AddCh(Ch); } } // equals if (Ch!='='){ throw THttpEx(heBadSearchStr);} // value while ((!ChRet.Eof())&&((Ch=ChRet.GetCh())!='&')){ switch (Ch){ case '%':{ char Ch1=ChRet.GetCh(); if (!TCh::IsHex(Ch1)) { throw THttpEx(heBadSearchStr); } char Ch2=ChRet.GetCh(); if (!TCh::IsHex(Ch2)) { throw THttpEx(heBadSearchStr); } ValStr.AddCh(char(16*TCh::GetHex(Ch1)+TCh::GetHex(Ch2)));} break; case '+': ValStr.AddCh(' '); break; case '&': throw THttpEx(heBadSearchStr); default: ValStr.AddCh(Ch); } } // save key-value pair UrlEnv->AddToKeyVal(KeyNm, ValStr); } } catch (THttpEx){Ok=false;} }
void THttpRq::Save | ( | TSOut & | ) | [inline] |
TMem THttpRq::BodyMem [private] |
Definition at line 76 of file http.h.
Referenced by GetStr(), and ParseHttpRq().
bool THttpRq::CompleteP [private] |
Definition at line 69 of file http.h.
Referenced by ParseHttpRq().
TCRef THttpRq::CRef [private] |
TStrStrH THttpRq::FldNmToValH [private] |
Definition at line 73 of file http.h.
Referenced by AddFldVal(), GetFldVal(), GetFldValH(), GetStr(), IsFldNm(), ParseHttpRq(), and THttpRq().
TStr THttpRq::HdStr [private] |
Definition at line 75 of file http.h.
Referenced by ParseHttpRq(), and THttpRq().
int THttpRq::MajorVerN [private] |
Definition at line 70 of file http.h.
Referenced by ParseHttpRq().
THttpRqMethod THttpRq::Method [private] |
Definition at line 71 of file http.h.
Referenced by GetMethodNm(), and ParseHttpRq().
int THttpRq::MinorVerN [private] |
Definition at line 70 of file http.h.
Referenced by ParseHttpRq().
bool THttpRq::Ok [private] |
Definition at line 68 of file http.h.
Referenced by ParseHttpRq(), ParseSearch(), and THttpRq().
PUrl THttpRq::Url [private] |
Definition at line 72 of file http.h.
Referenced by GetStr(), ParseHttpRq(), and THttpRq().
PUrlEnv THttpRq::UrlEnv [private] |
Definition at line 74 of file http.h.
Referenced by ParseSearch().