Menu

[r2289]: / framework / branches / reactor / src / scgi_filter.cpp  Maximize  Restore  History

Download this file

129 lines (122 with data), 2.9 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
///////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2008-2012 Artyom Beilis (Tonkikh) <artyomtnk@yahoo.com>
//
// See accompanying file COPYING.TXT file for licensing details.
//
///////////////////////////////////////////////////////////////////////////////
#include "cgi_filter.h"
namespace cppcms {
namespace impl {
class scgi_filter : public cgi_filter {
public:
scgi_filter() :
headers_length_(0),
got_len_(false),
reading_key_(true),
content_length_(-1),
consumed_content_(0)
{
}
virtual bool keep_alive_supported()
{
return false;
}
virtual size_t consume_headers(char const *data,size_t len,booster::system::error_code &e)
{
size_t saved_len = len;
if(!e && !got_len_) {
while(len > 0) {
char c = *data++;
len--;
if(c == ':') {
got_len_ = true;
pool_.set_page_size(len);
break;
}
if(c<'0' || '9'<c) {
e=vilotation();
break;
}
headers_length_=headers_length_*10 + (c-'0');
}
if(len > 65535) {
e=vilotation();
break;
}
}
while(!e && headers_length_ > 0 && len > 0) {
char c=*data++;
len--;
headers_length_--;
if(c!=0) {
if(reading_key_)
key_ += c;
else
value_+= c;
}
else {
if(reading_key_) {
reading_key_ =false;
}
else {
if(key_ == "CONTENT_LENGTH") {
long long cl = atoll(value_.c_str());
if(content_length_!=-1 || cl<0) {
e=violation();
breakl
}
content_length_ = cl;
}
setenv(key_.c_str(),value_.c_str());
reading_key_=true;
key_.resize(0);
value_resize(0);
}
}
}
if(!e && headers_length_ == 0 && len > 0) {
char c=*data++;
len--;
if(c==',') {
if(content_length_ != 0)
state(headers_ready);
else
state(body_read);
}
else
e=violation();
}
return saved_len - len;
}
virtual size_t consume_body(char const *data,size_t len,booster::system::error_code &e)
{
if(consumed_content_ + (long long)(len) > content_length_) {
e=violation();
len = content_length_ - consumed_content_;
}
consumed_content_ += len;
input = booster::aio::buffer(data,len);
if(consumed_content_ == content_length_)
state(body_read);
return len;
}
virtual size_t format_output(char const *data,size_t len,bool eof,booster::system::error_code &e)
{
output = booster::aio::buffer(data,len);
if(eof)
state(output_completed);
else
state(sending_content);
return len;
}
private:
int headers_length_;
bool got_len_;
bool reading_key_;
long long content_length_;
long long consumed_content_;
std::string key_,value_;
}
} // impl
} // cppcms
MongoDB Logo MongoDB