Browse Source

Debugged and implemented scgi Web Server API

master
Artyom Beilis 16 years ago
parent
commit
e4137cac40
3 changed files with 33 additions and 39 deletions
  1. +28
    -34
      scgi.cpp
  2. +1
    -1
      scgi.h
  3. +4
    -4
      worker_thread.cpp

+ 28
- 34
scgi.cpp View File

@@ -14,46 +14,46 @@ namespace cppcms {
using namespace std;
namespace scgi {

static int safe_write(int fd,char const *s,size_t n)
{
if(n==0) return 0;
int wr,written=0;
while(n) {
wr=::write(fd,s,n);
if(wr<0) {
if(errno==EINTR)
continue;
return -1;
}
if(wr==0)
break;
n-=wr;
written+=wr;
s+=wr;
}
return written;
}
int scgi_outbuffer::overflow(int c)
{
int len=pptr()-pbase();
cerr<<"Len:"<<len<<endl;
if(len) {
{
int i;
for(i=0;i<len;i++) {
cerr<<*(pptr()+i);
}
cerr<<endl;
}
int wr=0;
while(wr<len){
int v=::write(fd,pbase()+wr,len-wr);
if(v<0) {
if(errno==EINTR)
continue;
return EOF;
}
if(v==0){
return EOF;
}
wr+=v;
}
pbump(-len);
int n=safe_write(fd,pbase(),len);
pbump(-n);
}
if(c!=EOF) {
char b=c;
int v;
cerr<<(char)c<<endl;
while((v=::write(fd,&b,1))!=1){
if(v<0 && errno==EINTR)
continue;
if(safe_write(fd,&b,1)<1)
return EOF;
}
}
return 0;
}

streamsize scgi_outbuffer::xsputn(char const *s,streamsize n)
{
return safe_write(fd,s,n);
}

scgi_outbuffer::~ scgi_outbuffer()
{
}
@@ -101,8 +101,6 @@ bool scgi_session::prepare()
n=p2-data_buffer;
}

buf.pubsetbuf(iobuf,256);

cgi_ptr=new cgicc::Cgicc(this);
return true;
}
@@ -205,10 +203,6 @@ cgi_session *scgi_api::accept_session()
if(socket<0) {
return NULL;
}
int yes=1;
if(setsockopt(socket,SOL_SOCKET,SO_LINGER,(char*)&yes,sizeof(yes))<0){
cppcms_error(errno,"setsockopt");
}
return new scgi_session(socket);
}



+ 1
- 1
scgi.h View File

@@ -20,6 +20,7 @@ namespace scgi {
public:
scgi_outbuffer(int descriptor) : fd(descriptor) {};
virtual int overflow ( int c = EOF );
virtual streamsize xsputn(char const *s,streamsize n);
virtual ~scgi_outbuffer();
};

@@ -34,7 +35,6 @@ class scgi_session : public cgicc::CgiInput,
map<string,string> envmap;
cgicc::Cgicc *cgi_ptr;
std::ostream out_stream;
char iobuf[256];
public:
scgi_session(int s) :
socket(s), buf(s), cgi_ptr(NULL), out_stream(&buf)


+ 4
- 4
worker_thread.cpp View File

@@ -57,15 +57,15 @@ void worker_thread::run(cgicc_connection &cgi_conn)
}

for(list<string>::iterator h=other_headers.begin();h!=other_headers.end();h++) {
cout<<*h<<"\r\n";
cout<<*h<<"\n";
}

if(gzip) {
if(out.size()>0) {
if(gzip_done){
cout<<"Content-Length: "<<out.size()<<"\r\n";
cout<<"Content-Length: "<<out.size()<<"\n";
}
cout<<"Content-Encoding: gzip\r\n";
cout<<"Content-Encoding: gzip\n";
cout<<*response_header;
if(gzip_done) {
cout<<out;
@@ -78,7 +78,7 @@ void worker_thread::run(cgicc_connection &cgi_conn)
}
}
else {
cout<<"Content-Length: "<<out.size()<<"\r\n";
cout<<"Content-Length: "<<out.size()<<"\n";
cout<<*response_header;
cout<<out;
}


Loading…
Cancel
Save