/
zOMGdev
/
cppcms
Обзор
Документация
Войти
/
zOMGdev
/
cppcms
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
v2.0.0.beta2
private/http_protocol.h
161 строка
3 KB
Artyom Beilis
- Update copyright notice,
03 янв 2012, 17:58
03 янв 2012, 17:58
068d3f9
Код
Авторство
О чём код?
/////////////////////////////////////////////////////////////////////////////// // // Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com> // // See accompanying file COPYING.TXT file for licensing details. // /////////////////////////////////////////////////////////////////////////////// #ifndef CPPCMS_HTTP_PROTOCOL_H #define CPPCMS_HTTP_PROTOCOL_H #include <string> namespace cppcms { namespace http { namespace protocol { inline bool separator(char c) { switch(c) { case '(': case ')': case '<': case '>': case '@': case ',': case ';': case ':': case '\\': case '"': case '/': case '[': case ']': case '?': case '=': case '{': case '}': case ' ': case '\t': return true; default: return false; } } inline char ascii_to_lower(char c) { if(c<'A' || c>'Z') return c; return c-'A'+'a'; } template<typename It> It skip_ws(It p,It end) { while(p<end) { switch(*p) { case '\r': // Check for LWS (CRLF 1*( SP | HT)) if(p+2 < end && *(p+1)=='\n' && (*(p+2)==' ' || *(p+2)=='\t')) { p+=2; break; } return p; case ' ': case '\t': break; default: return p; } p++; } return p; } template<typename It> It tocken(It begin,It end) { char c; while(begin < end && 0x20<=(c=*begin) && c<=0x7E && !separator(c)) begin++; return begin; } template<typename It> std::string unquote(It &begin,It end) { It p=begin; std::string result; if(p>=end || *p!='\"') return result; result.reserve(end-p); p++; while(p < end) { char c=*p++; if(c=='\"') { begin=p; return result; } else if(c=='\\' && p<end) result+= *p++; else result+=c; } result.clear(); return result; } inline int compare(std::string const &left,std::string const &right) { size_t lsize=left.size(); size_t rsize=right.size(); for(size_t i=0;i<lsize && i<rsize;i++) { char cl=ascii_to_lower(left[i]); char cr=ascii_to_lower(right[i]); if(cl<cr) return -1; if(cl>cr) return 1; // if(cl==cr) continue } if(lsize<rsize) return -1; if(lsize>rsize) return 1; return 0; } inline std::string quote(std::string const &input) { std::string result; result.reserve(input.size()); result+='"'; for(std::string::const_iterator p=input.begin();p!=input.end();++p) { char c=*p; if(0<=c && c<' ') { result+='\\'; } result+=c; } result+='"'; return result; } bool inline is_prefix_of(char const *prefix,std::string const &s) { std::string::const_iterator p=s.begin(),e=s.end(); p=skip_ws(p,e); char c; while((c=(*prefix++))!=0) { if(p==e) return false; if(ascii_to_lower(c)!=ascii_to_lower(*p++)) return false; } return true; } bool inline xdigit(int c) { return ('0'<=c && c<='9') || ('a'<=c && c<='f') || ('A'<=c && c<='F'); } } // protocol } // http } // cppcms #endif