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) (unidiff) | |
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 { | |||
32 | * @param s the file descriptor of preopened socket. | 32 | * @param s the file descriptor of preopened socket. |
33 | */ | 33 | */ |
34 | fcgi_socket(int s); | 34 | fcgi_socket(int s); |
35 | ~fcgi_socket(); | 35 | ~fcgi_socket(); |
36 | }; | 36 | }; |
37 | 37 | ||
38 | /** | 38 | /** |
39 | * The implementation of the interface to the FastCGI. | 39 | * The implementation of the interface to the FastCGI. |
40 | */ | 40 | */ |
41 | class fcgi_interface : public cgi_interface { | 41 | class fcgi_interface : public cgi_interface { |
42 | public: | 42 | public: |
43 | /** | 43 | /** |
44 | * buffer for sbin | ||
45 | * @see sbin | ||
46 | */ | ||
47 | char buf_sbin[512]; | ||
48 | /** | ||
44 | * stdin fcgi streambuf. | 49 | * stdin fcgi streambuf. |
45 | */ | 50 | */ |
46 | fcgi_streambuf sbin; | 51 | fcgi_streambuf sbin; |
47 | /** | 52 | /** |
53 | * buffer for sbout | ||
54 | * @see sbout | ||
55 | */ | ||
56 | char buf_sbout[512]; | ||
57 | /** | ||
48 | * stdout fcgi streambuf. | 58 | * stdout fcgi streambuf. |
49 | */ | 59 | */ |
50 | fcgi_streambuf sbout; | 60 | fcgi_streambuf sbout; |
51 | /** | 61 | /** |
62 | * buffer for sberr | ||
63 | * @see sberr | ||
64 | */ | ||
65 | char buf_sberr[512]; | ||
66 | /** | ||
52 | * stderr fcgi streambuf. | 67 | * stderr fcgi streambuf. |
53 | */ | 68 | */ |
54 | fcgi_streambuf sberr; | 69 | fcgi_streambuf sberr; |
55 | /** | 70 | /** |
56 | * stdin istream. | 71 | * stdin istream. |
57 | */ | 72 | */ |
58 | istream sin; | 73 | istream sin; |
59 | /** | 74 | /** |
60 | * stdout ostream. | 75 | * stdout ostream. |
61 | */ | 76 | */ |
62 | ostream sout; | 77 | ostream sout; |
63 | /** | 78 | /** |
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 { | |||
28 | if(!_initialized) { | 28 | if(!_initialized) { |
29 | if( FCGX_Init() ) | 29 | if( FCGX_Init() ) |
30 | throw exception(CODEPOINT,"failed to FCGX_Init()"); | 30 | throw exception(CODEPOINT,"failed to FCGX_Init()"); |
31 | _initialized = true; | 31 | _initialized = true; |
32 | } | 32 | } |
33 | } | 33 | } |
34 | fcgi_socket::~fcgi_socket() { | 34 | fcgi_socket::~fcgi_socket() { |
35 | if(sock>=0) | 35 | if(sock>=0) |
36 | close(sock); | 36 | close(sock); |
37 | } | 37 | } |
38 | 38 | ||
39 | fcgi_interface::fcgi_interface(fcgi_socket& s,int f) | 39 | fcgi_interface::fcgi_interface(fcgi_socket& s,int f) |
40 | : sin(&sbin), sout(&sbout), serr(&sberr) { | 40 | : sbin(buf_sbin,sizeof(buf_sbin)), |
41 | sbout(buf_sbout,sizeof(buf_sbout)), | ||
42 | sberr(buf_sberr,sizeof(buf_sberr)), | ||
43 | sin(&sbin), sout(&sbout), serr(&sberr) { | ||
41 | if( FCGX_InitRequest(&request,s.sock,f) ) | 44 | if( FCGX_InitRequest(&request,s.sock,f) ) |
42 | throw exception(CODEPOINT,"failed to FCGX_InitRequest()"); | 45 | throw exception(CODEPOINT,"failed to FCGX_InitRequest()"); |
43 | if( FCGX_Accept_r(&request) ) | 46 | if( FCGX_Accept_r(&request) ) |
44 | throw exception(CODEPOINT,"failed to FCGX_Accept_r()"); | 47 | throw exception(CODEPOINT,"failed to FCGX_Accept_r()"); |
45 | sbin.attach(request.in); | 48 | sbin.attach(request.in); |
46 | sbout.attach(request.out); | 49 | sbout.attach(request.out); |
47 | sberr.attach(request.err); | 50 | sberr.attach(request.err); |
48 | for(char **p = request.envp; *p; p++) { | 51 | for(char **p = request.envp; *p; p++) { |
49 | const char *e = strchr(*p,'='); | 52 | const char *e = strchr(*p,'='); |
50 | if(!e){ | 53 | if(!e){ |
51 | // XXX: check if we have it already? | 54 | // XXX: check if we have it already? |
52 | metavars[*p] = string(0); | 55 | metavars[*p] = string(0); |