5 #include <boost/iostreams/code_converter.hpp>
8 #include "utf8_codecvt.hpp"
12 static std::map<charT, std::basic_string<charT> > htmlCharacters;
13 if(!htmlCharacters.size())
15 const char quot[]=
""";
16 std::copy(quot, quot+
sizeof(quot)-1, std::back_inserter(htmlCharacters[
'"']));
18 const char gt[]=
">";
19 std::copy(gt, gt+
sizeof(gt)-1, std::back_inserter(htmlCharacters[
'>']));
21 const char lt[]=
"<";
22 std::copy(lt, lt+
sizeof(lt)-1, std::back_inserter(htmlCharacters[
'<']));
24 const char amp[]=
"&";
25 std::copy(amp, amp+
sizeof(amp)-1, std::back_inserter(htmlCharacters[
'&']));
27 const char apos[]=
"'";
28 std::copy(apos, apos+
sizeof(apos)-1, std::back_inserter(htmlCharacters[
'\'']));
31 static std::map<charT, std::basic_string<charT> > urlCharacters;
32 if(!urlCharacters.size())
34 const char exclaim[]=
"%21";
35 std::copy(exclaim, exclaim+
sizeof(exclaim)-1, std::back_inserter(urlCharacters[
'!']));
37 const char rightbrac[]=
"%5D";
38 std::copy(rightbrac, rightbrac+
sizeof(rightbrac)-1, std::back_inserter(urlCharacters[
']']));
40 const char leftbrac[]=
"%5B";
41 std::copy(leftbrac, leftbrac+
sizeof(leftbrac)-1, std::back_inserter(urlCharacters[
'[']));
43 const char number[]=
"%23";
44 std::copy(number, number+
sizeof(number)-1, std::back_inserter(urlCharacters[
'#']));
46 const char question[]=
"%3F";
47 std::copy(question, question+
sizeof(question)-1, std::back_inserter(urlCharacters[
'?']));
49 const char slash[]=
"%2F";
50 std::copy(slash, slash+
sizeof(slash)-1, std::back_inserter(urlCharacters[
'/']));
52 const char comma[]=
"%2C";
53 std::copy(comma, comma+
sizeof(comma)-1, std::back_inserter(urlCharacters[
',']));
55 const char money[]=
"%24";
56 std::copy(money, money+
sizeof(money)-1, std::back_inserter(urlCharacters[
'$']));
58 const char plus[]=
"%2B";
59 std::copy(plus, plus+
sizeof(plus)-1, std::back_inserter(urlCharacters[
'+']));
61 const char equal[]=
"%3D";
62 std::copy(equal, equal+
sizeof(equal)-1, std::back_inserter(urlCharacters[
'=']));
64 const char andsym[]=
"%26";
65 std::copy(andsym, andsym+
sizeof(andsym)-1, std::back_inserter(urlCharacters[
'&']));
67 const char at[]=
"%40";
68 std::copy(at, at+
sizeof(at)-1, std::back_inserter(urlCharacters[
'@']));
70 const char colon[]=
"%3A";
71 std::copy(colon, colon+
sizeof(colon)-1, std::back_inserter(urlCharacters[
':']));
73 const char semi[]=
"%3B";
74 std::copy(semi, semi+
sizeof(semi)-1, std::back_inserter(urlCharacters[
';']));
76 const char rightpar[]=
"%29";
77 std::copy(rightpar, rightpar+
sizeof(rightpar)-1, std::back_inserter(urlCharacters[
')']));
79 const char leftpar[]=
"%28";
80 std::copy(leftpar, leftpar+
sizeof(leftpar)-1, std::back_inserter(urlCharacters[
'(']));
82 const char apos[]=
"%27";
83 std::copy(apos, apos+
sizeof(apos)-1, std::back_inserter(urlCharacters[
'\'']));
85 const char star[]=
"%2A";
86 std::copy(star, star+
sizeof(star)-1, std::back_inserter(urlCharacters[
'*']));
88 const char lt[]=
"%3C";
89 std::copy(lt, lt+
sizeof(lt)-1, std::back_inserter(urlCharacters[
'<']));
91 const char gt[]=
"%3E";
92 std::copy(gt, gt+
sizeof(gt)-1, std::back_inserter(urlCharacters[
'>']));
94 const char quot[]=
"%22";
95 std::copy(quot, quot+
sizeof(quot)-1, std::back_inserter(urlCharacters[
'"']));
97 const char space[]=
"%20";
98 std::copy(space, space+
sizeof(space)-1, std::back_inserter(urlCharacters[
' ']));
100 const char percent[]=
"%25";
101 std::copy(percent, percent+
sizeof(percent)-1, std::back_inserter(urlCharacters[
'%']));
108 std::map<charT, std::basic_string<charT> >* characters;
112 characters = &htmlCharacters;
115 characters = &urlCharacters;
119 const charT* start=s;
120 typename std::map<charT, std::basic_string<charT> >::const_iterator it;
121 for(
const charT* i=s; i < s+n; ++i)
123 it=characters->find(*i);
124 if(it!=characters->end())
140 using namespace Protocol;
141 const std::streamsize totalUsed=n;
148 size_t size=n+
sizeof(Header)+(remainder?(
chunkSize-remainder):remainder);
149 if(size>numeric_limits<uint16_t>::max()) size=numeric_limits<uint16_t>::max();
150 Block dataBlock(m_transceiver->requestWrite(size));
153 uint16_t contentLength=std::min(size-
sizeof(Header),
size_t(n));
154 memcpy(dataBlock.data+
sizeof(Header), s, contentLength);
160 if(contentPadding==8) contentPadding=0;
162 Header& header=*(Header*)dataBlock.data;
164 header.setType(m_type);
165 header.setRequestId(m_id.fcgiId);
166 header.setContentLength(contentLength);
167 header.setPaddingLength(contentPadding);
169 m_transceiver->secureWrite(size, m_id,
false);
176 const size_t bufferSize=32768;
177 char buffer[bufferSize];
181 stream.read(buffer, bufferSize);
182 write(buffer, stream.gcount());
186 template<
typename T,
typename toChar,
typename fromChar> T&
fixPush(boost::iostreams::filtering_stream<boost::iostreams::output, fromChar>& stream,
const T& t,
int buffer_size)
188 stream.push(t, buffer_size);
189 return *stream.template component<T>(stream.size()-1);
194 stream.push(boost::iostreams::code_converter<Fastcgipp::FcgistreamSink, utf8CodeCvt::utf8_codecvt_facet>(t, buffer_size));
195 return **stream.component<boost::iostreams::code_converter<Fastcgipp::FcgistreamSink, utf8CodeCvt::utf8_codecvt_facet> >(stream.size()-1);
206 template std::basic_ostream<char, std::char_traits<char> >& Fastcgipp::operator<< <char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >& os,
const encoding& enc);
207 template std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& Fastcgipp::operator<< <wchar_t, std::char_traits<wchar_t> >(std::basic_ostream<wchar_t, std::char_traits<wchar_t> >& os,
const encoding& enc);
208 template<
class charT,
class Traits> std::basic_ostream<charT, Traits>& Fastcgipp::operator<<(std::basic_ostream<charT, Traits>& os,
const encoding& enc)
215 catch(std::bad_cast& bc)