| 
    SNAP Library 2.0, Developer Reference
    2013-05-13 16:33:57
    
   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 | 
| bool | IsBody () 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 581 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 (const THttpEx&){Ok=false;} }

| THttpRq::THttpRq | ( | const THttpRqMethod & | _Method, | 
| const PUrl & | _Url, | ||
| const TStr & | ContTypeFldVal, | ||
| const TMem & | _BodyMem, | ||
| const int & | FetchId = -1  | 
        ||
| ) | 
Definition at line 591 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 664 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 119 of file http.h.
References TMem::Clr().

| PSIn THttpRq::GetBodyAsSIn | ( | ) |  const [inline] | 
        
Definition at line 118 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 650 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 637 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 673 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::IsBody | ( | ) |  const [inline] | 
        
| bool THttpRq::IsComplete | ( | ) |  const [inline] | 
        
| bool THttpRq::IsContLen | ( | int & | ContLen | ) |  const [inline] | 
        
Definition at line 125 of file http.h.
References THttp::ContLenFldNm.
                                     {
    return GetFldVal(THttp::ContLenFldNm).IsInt(ContLen);}
| bool THttpRq::IsContType | ( | const TStr & | ContTypeStr | ) |  const [inline] | 
        
Definition at line 123 of file http.h.
References THttp::ContTypeFldNm.
                                                 {
    return GetFldVal(THttp::ContTypeFldNm).IsStrIn(ContTypeStr);}
| bool THttpRq::IsFldNm | ( | const TStr & | FldNm | ) | const | 
Definition at line 646 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 659 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 82 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 513 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 462 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 (const THttpEx&){Ok=false;}
}


| void THttpRq::Save | ( | TSOut & | ) |  [inline] | 
        
TMem THttpRq::BodyMem [private] | 
        
Definition at line 77 of file http.h.
Referenced by GetStr(), and ParseHttpRq().
bool THttpRq::CompleteP [private] | 
        
Definition at line 70 of file http.h.
Referenced by ParseHttpRq().
TCRef THttpRq::CRef [private] | 
        
TStrStrH THttpRq::FldNmToValH [private] | 
        
Definition at line 74 of file http.h.
Referenced by AddFldVal(), GetFldVal(), GetFldValH(), GetStr(), IsFldNm(), ParseHttpRq(), and THttpRq().
TStr THttpRq::HdStr [private] | 
        
Definition at line 76 of file http.h.
Referenced by ParseHttpRq(), and THttpRq().
int THttpRq::MajorVerN [private] | 
        
Definition at line 71 of file http.h.
Referenced by ParseHttpRq().
THttpRqMethod THttpRq::Method [private] | 
        
Definition at line 72 of file http.h.
Referenced by GetMethodNm(), and ParseHttpRq().
int THttpRq::MinorVerN [private] | 
        
Definition at line 71 of file http.h.
Referenced by ParseHttpRq().
bool THttpRq::Ok [private] | 
        
Definition at line 69 of file http.h.
Referenced by ParseHttpRq(), ParseSearch(), and THttpRq().
PUrl THttpRq::Url [private] | 
        
Definition at line 73 of file http.h.
Referenced by GetStr(), ParseHttpRq(), and THttpRq().
PUrlEnv THttpRq::UrlEnv [private] | 
        
Definition at line 75 of file http.h.
Referenced by ParseSearch().