Exemple #1
0
bool CMimeParser::ProcessMultipart(CString RawData, const CString& Boundary, CVectorTable<CStringTable>& Fields) {
  //cout << "expected boundary: [" << "--" + Boundary << "]" << endl;	
  CString OneLine; RawData.ExtractLine(&OneLine);
  //cout << "   found boundary: [" << OneLine << "]" << endl;
  CString PrefixedBoundary;
  while (OneLine.GetLength()) {
    //cout << OneLine << endl;
    PrefixedBoundary = g_strDashDash;
    PrefixedBoundary.Append(Boundary);
    if (OneLine == PrefixedBoundary) {
      CStringTable Table;
      CString Name, Value;
      RawData.ExtractLine(&OneLine);
      while (OneLine.GetLength()) {
        if (ParseLine(OneLine, Name, Value, Table)) {
          //Fields.Add(Name, Table);
          // _L_DEBUG(3, cout << "---------------------" << endl);
          // _L_DEBUG(3, cout << "Content disposition: " << Table.GetValue("Content-Disposition") << endl);
          // _L_DEBUG(3, cout << "               Name: " << Table.GetValue("name") << endl);
          // _L_DEBUG(3, cout << "       Content type: " << Table.GetValue("Content-type") << endl);
          // _L_DEBUG(3, cout << "           Filename: " << Table.GetValue("Filename") << endl);
        } else return false;
        RawData.ExtractLine(&OneLine);
      }            
      int NextBoundaryPosition = RawData.Pos(PrefixedBoundary);
      if (NextBoundaryPosition == -1) NextBoundaryPosition = RawData.GetLength();
      Table.Add(g_strValue, CString(RawData.GetBuffer(), NextBoundaryPosition-2));
      Fields.Add(Table.GetValue(g_strName), Table);
      RawData.Delete(0, NextBoundaryPosition);
      // _L_DEBUG(3, cout << "              Value: " << Table.GetValue(g_strValue) << endl);
      RawData.ExtractLine(&OneLine);
    } else return false;
  }
  return true;
}
Exemple #2
0
bool CMimeParser::ParseLine(const CString& CommandLine, CString& Name, CString& Value, CStringTable& Result) {
  int sPos = CommandLine.Pos(':');
  if (sPos > 0) {
    CommandLine.Mid(0, sPos, &Name);
    Name.Trim();    
    CommandLine.Mid(sPos+1, CommandLine.GetLength(), &Value); 
    Value.Trim();

    if (Name.Same("Authorization") || 
	Name.Same("Location")) {
      Result.Add(Name, Value);
      return true;
    }
 
    int CurPos = 0;
    int PrevPos = 0;
    CString ParameterName = Name;
    CString ParameterValue;
    bool Comment = false;
    while (CurPos < (int) Value.GetLength()) {
      switch(Value[CurPos]) {
      case '(':
        if (!Comment) Comment = true;
        break;
      case ')':
        Comment = false;
        break;
      case '=':
        // double ==, Base64 encoded for example
        if ((CurPos + 1) < (int) Value.GetLength()) {
          if (Value[CurPos + 1] == '=') {
            CurPos++;
            break;
          }
        }
        if (!Comment) {
          Value.Mid(PrevPos, CurPos - PrevPos, &ParameterName);
          ParameterName.Trim();
          PrevPos = CurPos+1;
        }
        break;
      case ';':
        if (!Comment) {
          Value.Mid(PrevPos, CurPos - PrevPos, &ParameterValue);
          ParameterValue.Trim();
          PrevPos = CurPos+1;
          ParameterName.Dequote();
          ParameterValue.Dequote();
          Result.Add(ParameterName, ParameterValue);
          /*
            CVector<CString> ParameterValueVector = CString::StrToVector(ParameterValue, ',');
            for (register int i=0;i<(int)ParameterValueVector.GetSize();i++) {
            _L_DEBUG(3, cout << "adding [" << ParameterName << "][" << ParameterValueVector[i].Trim() << "]" << endl);
            Result.Add(ParameterName, ParameterValueVector[i].Trim().Dequote());
            }
          */
        }
        break;
      default:
        break;
      };
      CurPos++;
    }
    if (PrevPos != (int) Value.GetLength()) {
      Value.Mid(PrevPos, Value.GetLength(), &ParameterValue);
      ParameterValue.Trim();
      /*
        CVector<CString> ParameterValueVector = CString::StrToVector(ParameterValue, ',');
        for (register int i=0;i<(int)ParameterValueVector.GetSize();i++) {
        _L_DEBUG(3, cout << "adding [" << ParameterName << "][" << ParameterValueVector[i].Trim() << "]" << endl);
        Result.Add(ParameterName, ParameterValueVector[i].Trim().Dequote());
        }
      */
      ParameterName.Dequote();
      ParameterValue.Dequote();
      Result.Add(ParameterName, ParameterValue);
    }

    return true;
  } else return false;
}