00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #include <cctype>
00027 #include <cstdio>
00028 #include <mpcl/net/url_encoder.hh>
00029 #include <mpcl/text/string.hh>
00030
00031
00032
00033
00034
00035
00036 mpcl::text::TString mpcl::net::TUrlEncoder::
00037 _encode (const text::TString& rkySOURCE_PLAIN)
00038 {
00039
00040 using std::isalnum;
00041 using std::sprintf;
00042
00043 TString yEncoded;
00044 char acConvertedBuffer[] = " ";
00045 const char* pkcSourcePlain = rkySOURCE_PLAIN.c_str();
00046
00047
00048
00049
00050
00051 for (register size_t J = 0, zLength = rkySOURCE_PLAIN.size(); ( J < zLength ) ;++J)
00052 {
00053 if ( isalnum (*pkcSourcePlain) )
00054 {
00055 yEncoded += *pkcSourcePlain;
00056 }
00057 else
00058 {
00059 yEncoded += '%';
00060 sprintf (acConvertedBuffer, "%02x", *pkcSourcePlain);
00061 yEncoded += acConvertedBuffer;
00062 }
00063 ++pkcSourcePlain;
00064 }
00065 yEncoded.replaceAll (' ', '+');
00066 return yEncoded;
00067
00068 }
00069
00070
00071 mpcl::text::TString mpcl::net::TUrlEncoder::
00072 _encode ( const util::collection::TStringToStringMap& rktSOURCE_PARAMETER_MAP ,
00073 bool gEMPTY_PARAMETERS_TOO )
00074 {
00075
00076 using util::collection::TStringToStringMap;
00077
00078 TString yParameter;
00079 TString yCgiParameters;
00080 TStringToStringMap::const_iterator ktIter = rktSOURCE_PARAMETER_MAP.begin();
00081 TStringToStringMap::const_iterator ktEnd = rktSOURCE_PARAMETER_MAP.end();
00082
00083 if ( gEMPTY_PARAMETERS_TOO )
00084 {
00085 for (; ( ktIter != ktEnd ) ;++ktIter)
00086 {
00087 yParameter += ktIter->first;
00088 yParameter += "=" ;
00089 yParameter += _encode (ktIter->second);
00090 yCgiParameters += yParameter;
00091 yParameter = "&";
00092 }
00093 }
00094 else
00095 {
00096 for (; ( ktIter != ktEnd ) ;++ktIter)
00097 {
00098 if ( !ktIter->second.empty() )
00099 {
00100 yParameter += ktIter->first;
00101 yParameter += "=" ;
00102 yParameter += _encode (ktIter->second);
00103 yCgiParameters += yParameter;
00104 yParameter = "&";
00105 }
00106 }
00107 }
00108 return yCgiParameters;
00109
00110 }