#define FCGI_NET_PARAM_ERROR 2
enum fcgi_net_type
{
FCGI_NET_TEXT = 0,
FCGI_NET_APP_STREAM,
FCGI_NET_IMAGE,
};
class fcgi_net_duty
{
public:
fcgi_net_duty();
~fcgi_net_duty();
void do_request();
protected:
void do_prev();
void do_cast();
virtual void do_handle();
void do_write();
void do_finish();
int get_req_int( const char* param, int *value );
int get_req_ll( const char* param, long long *value );
int get_req_str( const char* param, const char **value );
int get_cookie_int( const char* param, int *value );
int get_cookie_ll( const char* param, long long *value );
int get_cookie_str( const char* param, const char **value );
private:
std::map< const char*, const char* > m_req;
std::map< const char*, const char* > m_cookie;
int rtn;
int content_type;
int content_length;
char* content_buf;
};
#ifndef __FCGI_NET_H__
#define __FCGI_NET_H__
#define FCGI_NET_OK 0
#define FCGI_NET_ERROR 1
#define FCGI_NET_PARAM_ERROR 2
enum fcgi_net_type
{
FCGI_NET_TEXT = 0,
FCGI_NET_APP_STREAM,
FCGI_NET_IMAGE,
};
class fcgi_net_duty
{
public:
fcgi_net_duty();
~fcgi_net_duty();
void do_request();
protected:
void do_prev();
void do_cast();
virtual void do_handle();
void do_write();
void do_finish();
int get_req_int( const char* param, int *value );
int get_req_ll( const char* param, long long *value );
int get_req_str( const char* param, const char **value );
int get_cookie_int( const char* param, int *value );
int get_cookie_ll( const char* param, long long *value );
int get_cookie_str( const char* param, const char **value );
private:
std::map< const char*, const char* > m_req;
std::map< const char*, const char* > m_cookie;
int rtn;
int content_type;
int content_length;
char* content_buf;
};
主循环放在do_request 函数里
fcgi_net_duty.cpp
[cpp]
void fcgi_net_duty::do_request()
{
while( FCGI_Accept() >= 0 ){
do_prev();
do_cast();
do_handle();
do_write();
do_finish();
}
}
void fcgi_net_duty::do_request()
{
while( FCGI_Accept() >= 0 ){
do_prev();
do_cast();
do_handle();
do_write();
do_finish();
}
}
子类只需要关心相应的业务,每个业务可以用一个子类完成,如现有三个业务:busi1, busi2, busi3,我们以其中一个为例:
fcig_busi1.h
[cpp]
#ifndef __FCGI_BUSI1_H__
#define __FCGI_BUSI1_H__
class fcgi_busi1 : public fcgi_net_duty
{
public:
fcgi_busi1();
~fcgi_busi1();
void do_handle();
};
#endif //__FCGI_BUSI1_H__
#ifndef __FCGI_BUSI1_H__
#define __FCGI_BUSI1_H__
class fcgi_busi1 : public fcgi_net_duty
{
public:
fcgi_busi1();
~fcgi_busi1();
void do_handle();
};
#endif //__FCGI_BUSI1_H__
fcgi_busi1.cpp
[cpp]
void fcgi_busi1::do_handle()
{
const char* busi1;
int flag;
rtn = FCGI_NET_ERROR;
flag = get_req_str( "busi1", &busi1 );
if( flag ){
rtn = FCGI_NET_PARAM_ERROR;