ChipMaster's trial hacks on C++CMS starting with v1.2.1. Not sure I'll follow on with the v2 since it looks to be breaking and mostly frivolous.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

159 lines
3.4 KiB

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
  4. //
  5. // See accompanying file COPYING.TXT file for licensing details.
  6. //
  7. ///////////////////////////////////////////////////////////////////////////////
  8. #define CPPCMS_SOURCE
  9. #include <cppcms/util.h>
  10. #include "http_protocol.h"
  11. #include <stdio.h>
  12. #include <iterator>
  13. #include "md5.h"
  14. #include "tohex.h"
  15. namespace cppcms {
  16. namespace util {
  17. std::string escape(std::string const &s)
  18. {
  19. std::string content;
  20. unsigned i,len=s.size();
  21. content.reserve(len*3/2);
  22. for(i=0;i<len;i++) {
  23. char c=s[i];
  24. switch(c){
  25. case '<': content+="&lt;"; break;
  26. case '>': content+="&gt;"; break;
  27. case '&': content+="&amp;"; break;
  28. case '\"': content+="&quot;"; break;
  29. default: content+=c;
  30. }
  31. }
  32. return content;
  33. }
  34. void escape(char const *begin,char const *end,std::ostream &output)
  35. {
  36. while(begin!=end) {
  37. char c=*begin++;
  38. switch(c){
  39. case '<': output << "&lt;"; break;
  40. case '>': output << "&gt;"; break;
  41. case '&': output << "&amp;"; break;
  42. case '\"': output<<"&quot;"; break;
  43. default: output << c;
  44. }
  45. }
  46. }
  47. template<typename Iterator>
  48. void urlencode_impl(char const *b,char const *e,Iterator out)
  49. {
  50. while(b!=e){
  51. char c=*b++;
  52. if( ('a'<=c && c<='z')
  53. || ('A'<=c && c<='Z')
  54. || ('0'<=c && c<='9'))
  55. {
  56. *out++ = c;
  57. }
  58. else {
  59. switch(c) {
  60. case '-':
  61. case '_':
  62. case '.':
  63. case '~':
  64. *out++ = c;
  65. break;
  66. default:
  67. {
  68. static char const hex[]="0123456789abcdef";
  69. unsigned char uc = c;
  70. *out++ = '%';
  71. *out++ = hex[(uc >> 4) & 0xF];
  72. *out++ = hex[ uc & 0xF];
  73. }
  74. };
  75. }
  76. };
  77. }
  78. void urlencode(char const *b,char const *e,std::ostream &out)
  79. {
  80. std::ostream_iterator<char> it(out);
  81. urlencode_impl(b,e,it);
  82. }
  83. std::string urlencode(std::string const &s)
  84. {
  85. std::string content;
  86. content.reserve(3*s.size());
  87. std::back_insert_iterator<std::string> out(content);
  88. urlencode_impl(s.c_str(),s.c_str()+s.size(),out);
  89. return content;
  90. }
  91. std::string urldecode(std::string const &s)
  92. {
  93. return urldecode(s.c_str(),s.c_str()+s.size());
  94. }
  95. // TODO: Find correct RFC for proprer decoding
  96. std::string urldecode(char const *begin,char const *end)
  97. {
  98. std::string result;
  99. result.reserve(end-begin);
  100. for(;begin<end;begin++) {
  101. char c=*begin;
  102. switch(c) {
  103. case '+': result+=' ';
  104. break;
  105. case '%':
  106. if(end-begin >= 3 && http::protocol::xdigit(begin[1]) && http::protocol::xdigit(begin[2])) {
  107. char buf[3]={begin[1],begin[2],0};
  108. int value;
  109. sscanf(buf,"%x",&value);
  110. result+=char(value);
  111. begin+=2;
  112. }
  113. break;
  114. default:
  115. result+=c;
  116. }
  117. }
  118. return result;
  119. }
  120. std::string md5(std::string const &in)
  121. {
  122. using namespace cppcms::impl;
  123. unsigned char data[16];
  124. md5_state_t state;
  125. md5_init(&state);
  126. md5_append(&state,reinterpret_cast<unsigned const char *>(in.c_str()),in.size());
  127. md5_finish(&state,data);
  128. return std::string(reinterpret_cast<char *>(data),16);
  129. }
  130. std::string md5hex(std::string const &in)
  131. {
  132. using namespace cppcms::impl;
  133. unsigned char data[16];
  134. md5_state_t state;
  135. md5_init(&state);
  136. md5_append(&state,reinterpret_cast<unsigned const char *>(in.c_str()),in.size());
  137. md5_finish(&state,data);
  138. char buf[33]={0};
  139. impl::tohex(data,sizeof(data),buf);
  140. return buf;
  141. }
  142. } // util
  143. } // util