fastcgi 的使用与封装 (二)

2014-11-24 02:00:42 · 作者: · 浏览: 4
ne 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;

};

#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;