Advertisement
Guest User

Untitled

a guest
Feb 4th, 2014
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.97 KB | None | 0 0
  1. #ifndef _WSS_UTIL_HPP_
  2. #define _WSS_UTIL_HPP_
  3.  
  4. #include <map>
  5. #include <string>
  6. #include <vector>
  7.  
  8. #include <boost/archive/iterators/base64_from_binary.hpp>
  9. #include <boost/archive/iterators/insert_linebreaks.hpp>
  10. #include <boost/archive/iterators/transform_width.hpp>
  11. #include <boost/archive/iterators/ostream_iterator.hpp>
  12. #include <boost/uuid/sha1.hpp>
  13.  
  14. namespace wss {
  15. namespace util {
  16. const char* WSGUID = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11";
  17.  
  18. typedef boost::archive::iterators::base64_from_binary<boost::archive::iterators::transform_width<const char *, 6, 8>> base64_enc;
  19.  
  20. void split_string(std::vector<std::string>* container, const char* data, const char* delim, size_t data_length, size_t delim_length) {
  21.     std::string buffer;
  22.  
  23.     while (*data) {
  24.         if (memcmp(data, delim, delim_length) == 0) {
  25.             if (buffer.empty() == false) {
  26.                 container->push_back(buffer);
  27.                 buffer.clear();
  28.             }
  29.             size_t temp = delim_length;
  30.             while (temp-- && *data++);
  31.         } else {
  32.             buffer += *data++;
  33.         }
  34.     }
  35.  
  36.     if (buffer.empty() == false) {
  37.         container->push_back(buffer);
  38.     }
  39. }
  40.  
  41. void parse_http_request(std::string* head, std::map<std::string,std::string>* args, const char* request, size_t request_len) {
  42.     std::vector<std::string> lines;
  43.     std::vector<std::string> buffer;
  44.  
  45.     split_string(&lines, request, "\r\n", request_len, 2);
  46.  
  47.     head->assign(lines[0]);
  48.     lines.erase(lines.begin(), lines.begin()+1);
  49.  
  50.     for (std::vector<std::string>::iterator itr = lines.begin(); itr != lines.end(); itr++) {
  51.         buffer.clear();
  52.         split_string(&buffer, itr->c_str(), ": ", itr->size(), 2);
  53.         args->insert(std::make_pair(buffer[0],buffer[1]));
  54.     }
  55. }
  56.  
  57. void sha1_hash(char* hash, const char* data, size_t data_nbytes) {
  58.     boost::uuids::detail::sha1 sha1;
  59.  
  60.     unsigned int digest[5];
  61.  
  62.     sha1.process_bytes(data, data_nbytes);
  63.     sha1.get_digest(digest);
  64.  
  65.     for(int i = 0; i < 5; ++i) {
  66.         const char* tmp = reinterpret_cast<char*>(digest);
  67.         hash[i*4] = tmp[i*4+3];
  68.         hash[i*4+1] = tmp[i*4+2];
  69.         hash[i*4+2] = tmp[i*4+1];
  70.         hash[i*4+3] = tmp[i*4];
  71.     }
  72. }
  73.  
  74. unsigned int base64_encode(char* dest, const char* src, unsigned int len) {
  75.     char tail[3] = {0,0,0};
  76.  
  77.     unsigned int one_third_len = len/3;
  78.     unsigned int len_rounded_down = one_third_len*3;
  79.     unsigned int j = len_rounded_down + one_third_len;
  80.  
  81.     std::copy(base64_enc(src), base64_enc(src + len_rounded_down), dest);
  82.  
  83.     if (len_rounded_down != len) {
  84.         unsigned int i=0;
  85.         for(; i < len - len_rounded_down; ++i) {
  86.             tail[i] = src[len_rounded_down+i];
  87.         }
  88.  
  89.         std::copy(base64_enc(tail), base64_enc(tail + 3), dest + j);
  90.  
  91.         for(i=len + one_third_len + 1; i < j+4; ++i) {
  92.             dest[i] = '=';
  93.         }
  94.  
  95.         return i;
  96.     }
  97.  
  98.     return j;
  99. }
  100.  
  101. std::string encode_key(std::string key) {
  102.     key += WSGUID;
  103.  
  104.     char hash[20] = {0};
  105.     char base64[128] = {0};
  106.  
  107.     sha1_hash(hash, key.c_str(), key.size());
  108.     base64_encode(base64, hash, 20);
  109.  
  110.     return base64;
  111. }
  112. }
  113. }
  114.  
  115. #endif
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement