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.
 
 
 
 
 
 

162 lines
3.0 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. #ifndef CPPCMS_HTTP_PROTOCOL_H
  9. #define CPPCMS_HTTP_PROTOCOL_H
  10. #include <string>
  11. namespace cppcms {
  12. namespace http {
  13. namespace protocol {
  14. inline bool separator(char c)
  15. {
  16. switch(c) {
  17. case '(':
  18. case ')':
  19. case '<':
  20. case '>':
  21. case '@':
  22. case ',':
  23. case ';':
  24. case ':':
  25. case '\\':
  26. case '"':
  27. case '/':
  28. case '[':
  29. case ']':
  30. case '?':
  31. case '=':
  32. case '{':
  33. case '}':
  34. case ' ':
  35. case '\t':
  36. return true;
  37. default:
  38. return false;
  39. }
  40. }
  41. inline char ascii_to_lower(char c)
  42. {
  43. if(c<'A' || c>'Z') return c;
  44. return c-'A'+'a';
  45. }
  46. template<typename It>
  47. It skip_ws(It p,It end)
  48. {
  49. while(p<end) {
  50. switch(*p) {
  51. case '\r': // Check for LWS (CRLF 1*( SP | HT))
  52. if(p+2 < end && *(p+1)=='\n' && (*(p+2)==' ' || *(p+2)=='\t')) {
  53. p+=2;
  54. break;
  55. }
  56. return p;
  57. case ' ':
  58. case '\t':
  59. break;
  60. default:
  61. return p;
  62. }
  63. p++;
  64. }
  65. return p;
  66. }
  67. template<typename It>
  68. It tocken(It begin,It end)
  69. {
  70. char c;
  71. while(begin < end && 0x20<=(c=*begin) && c<=0x7E && !separator(c))
  72. begin++;
  73. return begin;
  74. }
  75. template<typename It>
  76. std::string unquote(It &begin,It end)
  77. {
  78. It p=begin;
  79. std::string result;
  80. if(p>=end || *p!='\"')
  81. return result;
  82. result.reserve(end-p);
  83. p++;
  84. while(p < end) {
  85. char c=*p++;
  86. if(c=='\"') {
  87. begin=p;
  88. return result;
  89. }
  90. else if(c=='\\' && p<end)
  91. result+= *p++;
  92. else
  93. result+=c;
  94. }
  95. result.clear();
  96. return result;
  97. }
  98. inline int compare(std::string const &left,std::string const &right)
  99. {
  100. size_t lsize=left.size();
  101. size_t rsize=right.size();
  102. for(size_t i=0;i<lsize && i<rsize;i++) {
  103. char cl=ascii_to_lower(left[i]);
  104. char cr=ascii_to_lower(right[i]);
  105. if(cl<cr) return -1;
  106. if(cl>cr) return 1;
  107. // if(cl==cr) continue
  108. }
  109. if(lsize<rsize)
  110. return -1;
  111. if(lsize>rsize)
  112. return 1;
  113. return 0;
  114. }
  115. inline std::string quote(std::string const &input)
  116. {
  117. std::string result;
  118. result.reserve(input.size());
  119. result+='"';
  120. for(std::string::const_iterator p=input.begin();p!=input.end();++p) {
  121. char c=*p;
  122. if(0<=c && c<' ') {
  123. result+='\\';
  124. }
  125. result+=c;
  126. }
  127. result+='"';
  128. return result;
  129. }
  130. bool inline is_prefix_of(char const *prefix,std::string const &s)
  131. {
  132. std::string::const_iterator p=s.begin(),e=s.end();
  133. p=skip_ws(p,e);
  134. char c;
  135. while((c=(*prefix++))!=0) {
  136. if(p==e)
  137. return false;
  138. if(ascii_to_lower(c)!=ascii_to_lower(*p++))
  139. return false;
  140. }
  141. return true;
  142. }
  143. bool inline xdigit(int c) { return ('0'<=c && c<='9') || ('a'<=c && c<='f') || ('A'<=c && c<='F'); }
  144. } // protocol
  145. } // http
  146. } // cppcms
  147. #endif