author | Michael Krelin <hacker@klever.net> | 2005-07-04 18:08:49 (UTC) |
---|---|---|
committer | Michael Krelin <hacker@klever.net> | 2005-07-04 18:08:49 (UTC) |
commit | c8bcbfb951eec5fe14dac0b14f4faaf4a9f9f229 (patch) (side-by-side diff) | |
tree | 60d24c0465cd57c839fa46de97cc35e59cc5b535 | |
parent | 43d47575878e4eaf3c8da84bf609fcd0bde595fb (diff) | |
download | kingate-c8bcbfb951eec5fe14dac0b14f4faaf4a9f9f229.zip kingate-c8bcbfb951eec5fe14dac0b14f4faaf4a9f9f229.tar.gz kingate-c8bcbfb951eec5fe14dac0b14f4faaf4a9f9f229.tar.bz2 |
added buffers to fastcgi streambufs. It gains compatibility with normal streambuf manipulations at the cost of performance (according to comments in fcgi devkit). The performance lost should not be disastrous, though.
-rw-r--r-- | include/kingate/fastcgi.h | 15 | ||||
-rw-r--r-- | src/fastcgi.cc | 5 |
2 files changed, 19 insertions, 1 deletions
diff --git a/include/kingate/fastcgi.h b/include/kingate/fastcgi.h index fd293b9..6f136b3 100644 --- a/include/kingate/fastcgi.h +++ b/include/kingate/fastcgi.h @@ -32,32 +32,47 @@ namespace kingate { * @param s the file descriptor of preopened socket. */ fcgi_socket(int s); ~fcgi_socket(); }; /** * The implementation of the interface to the FastCGI. */ class fcgi_interface : public cgi_interface { public: /** + * buffer for sbin + * @see sbin + */ + char buf_sbin[512]; + /** * stdin fcgi streambuf. */ fcgi_streambuf sbin; /** + * buffer for sbout + * @see sbout + */ + char buf_sbout[512]; + /** * stdout fcgi streambuf. */ fcgi_streambuf sbout; /** + * buffer for sberr + * @see sberr + */ + char buf_sberr[512]; + /** * stderr fcgi streambuf. */ fcgi_streambuf sberr; /** * stdin istream. */ istream sin; /** * stdout ostream. */ ostream sout; /** diff --git a/src/fastcgi.cc b/src/fastcgi.cc index 6285370..8b7668c 100644 --- a/src/fastcgi.cc +++ b/src/fastcgi.cc @@ -28,25 +28,28 @@ namespace kingate { if(!_initialized) { if( FCGX_Init() ) throw exception(CODEPOINT,"failed to FCGX_Init()"); _initialized = true; } } fcgi_socket::~fcgi_socket() { if(sock>=0) close(sock); } fcgi_interface::fcgi_interface(fcgi_socket& s,int f) - : sin(&sbin), sout(&sbout), serr(&sberr) { + : sbin(buf_sbin,sizeof(buf_sbin)), + sbout(buf_sbout,sizeof(buf_sbout)), + sberr(buf_sberr,sizeof(buf_sberr)), + sin(&sbin), sout(&sbout), serr(&sberr) { if( FCGX_InitRequest(&request,s.sock,f) ) throw exception(CODEPOINT,"failed to FCGX_InitRequest()"); if( FCGX_Accept_r(&request) ) throw exception(CODEPOINT,"failed to FCGX_Accept_r()"); sbin.attach(request.in); sbout.attach(request.out); sberr.attach(request.err); for(char **p = request.envp; *p; p++) { const char *e = strchr(*p,'='); if(!e){ // XXX: check if we have it already? metavars[*p] = string(0); |