11 class HttpRequestParser;
15 friend class HttpRequestParser;
21 BadRequestError = -400,
31 typedef QPair<QByteArray, QByteArray> pair_type;
32 typedef QList<pair_type> list_type;
33 typedef list_type::const_iterator const_iterator;
40 QByteArray method() const;
41 QByteArray url() const;
42 QByteArray version() const;
44 bool has_attribute(QByteArray const& name) const;
45 QByteArray attribute(QByteArray const& name) const;
47 const_iterator begin();
50 QByteArray const& content() const;
52 void state(int state);
55 int content_length() const;
56 QByteArray transfer_encoding() const;
58 QByteArray dump() const;
66 list_type m_attributes;
71 class HttpRequestParser
78 HeaderReady, // ヘッダの解析が完了した状態
86 void attach(HttpRequest *request);
87 void detach(HttpRequest *request);
89 int push(int offset, QByteArray const &bytes);
92 int parse(int offset, QByteArray const &bytes);
95 int content(int offset, QByteArray const &bytes);
97 bool isOneOf(char ch, char const *string)
99 for(int i = 0; char c = string[i]; i++) if(c == ch) return true;
102 bool isToken(char ch) { return !isCTL(ch) && !isSeparators(ch); }
103 bool isSeparators(char ch) { return isOneOf(ch, "()<>@,;:\\\"/[]?={} \t"); }
107 return ('0' <= ch && ch <= '9') || ('A' <= ch && ch <= 'Z')
108 || ('a' <= ch && ch <= 'z') || isOneOf(ch, "^!#$&'()*+,/:;=?@[]-._~%");
110 bool isCHAR(char ch) { return 0 <= ch && ch <= 127; }
111 bool isCTL(char ch) { return (0 <= ch && ch <= 31) || ch == 127; }
112 bool isUPALPHA(char ch) { return 'A' <= ch && ch <= 'Z'; }
113 bool isLOALPHA(char ch) { return 'A' <= ch && ch <= 'Z'; }
114 bool isALPHA(char ch) { return isUPALPHA(ch) || isLOALPHA(ch); }
115 bool isDIGIT(char ch) { return '0' <= ch && ch <= '9'; }
118 HttpRequest *m_request; /*!< 出力先 */
120 int m_count; /*!< 読み込んだバイト数 */
121 int m_state; /*!< パーサの進行状態 */
123 int m_state0; /*!< 状態変数 0 */
124 std::function<int(int, QByteArray const&)> m_cparser; /*!< コンテンツ用パーサ */
129 ContentReader(int length, HttpRequestParser *parser);
130 int operator()(int offset, QByteArray const &bytes);
133 HttpRequestParser *m_parser;
139 ChunkReader(HttpRequestParser *parser);
140 int operator()(int offset, QByteArray const &bytes);
147 #endif // HTTPREQUEST_H