• R/O
  • SSH
  • HTTPS

sf-04webserver: Commit


Commit MetaInfo

Revisión472 (tree)
Tiempo2011-09-14 06:35:24
Autoryuh

Log Message

(empty log message)

Cambiar Resumen

Diferencia incremental

--- 1xx/04WebServer/trunk/CGIManager.cpp (revision 471)
+++ 1xx/04WebServer/trunk/CGIManager.cpp (revision 472)
@@ -7,4 +7,48 @@
77
88 CCGIManager::~CCGIManager(void)
99 {
10+ Stop();
1011 }
12+
13+
14+///////////////////////////////////////////////////////////////////////////////
15+// インタフェース
16+///////////////////////////////////////////////////////////////////////////////
17+/*!
18+ 開始(throw CServerStartException)
19+*/
20+void CCGIManager::Start(CWorkspaceAccess setting)
21+{
22+ CWorkspaceAccess CGIEnvironment = setting.GetAccess(_T("CGIEnvironment"));
23+
24+ // 同時実行CGIプロセス数
25+ m_maxCGIProcessCount = CGIEnvironment.GetKeyInt(_T("MaxCGIProcessCount"), 0);
26+}
27+
28+/*!
29+ 停止
30+*/
31+void CCGIManager::Stop()
32+{
33+}
34+
35+/*!
36+ プロセス取得(throw CCGIProcessException)
37+*/
38+int CCGIManager::GetNewCGIProcess(CString commandLine, int cgiInterfaceType, int cgiProcessType, ICGIInterface **process)
39+{
40+ SCOPE_LOCK();
41+
42+ // CGI数取得
43+ if(m_maxCGIProcessCount != 0 && m_processList.GetSize() >= m_maxCGIProcessCount)
44+ return(CGI_NEW_PROCESS_ERROR_OVER_PROCESS);
45+}
46+
47+/*!
48+ プロセス使用終了
49+*/
50+void CCGIManager::DeleteCGIProcess(ICGIInterface *process)
51+{
52+ SCOPE_LOCK();
53+}
54+
--- 1xx/04WebServer/trunk/NormalCGIProcess.cpp (nonexistent)
+++ 1xx/04WebServer/trunk/NormalCGIProcess.cpp (revision 472)
@@ -0,0 +1,10 @@
1+#include "StdAfx.h"
2+#include "NormalCGIProcess.h"
3+
4+CNormalCGIProcess::CNormalCGIProcess(void)
5+{
6+}
7+
8+CNormalCGIProcess::~CNormalCGIProcess(void)
9+{
10+}
--- 1xx/04WebServer/trunk/NormalCGIProcess.h (nonexistent)
+++ 1xx/04WebServer/trunk/NormalCGIProcess.h (revision 472)
@@ -0,0 +1,43 @@
1+#pragma once
2+#include "CGIManager.h"
3+
4+
5+/*!
6+ 通常のCGI
7+*/
8+class CNormalCGIProcess : public ICGIInterface
9+{
10+public:
11+ CNormalCGIProcess(void);
12+ virtual ~CNormalCGIProcess(void);
13+
14+ ///////////////////////////////////////////////////////////////////////////////
15+ // 実行系インタフェース
16+ ///////////////////////////////////////////////////////////////////////////////
17+ //! CGI実行開始(throw CCGIProcessException)
18+ virtual void StartCGIProcess();
19+
20+ //! CGI実行終了
21+ virtual void CleanupCGIProcess();
22+
23+ ///////////////////////////////////////////////////////////////////////////////
24+ // 通信系インタフェース
25+ ///////////////////////////////////////////////////////////////////////////////
26+ //! 環境変数設定
27+ virtual void AddRequestHeaderEnv(CKeyDataArray &envs);
28+
29+ //! リクエストボディを書き込み(throw CCGIProcessException)
30+ virtual void WriteRequestBody(CBuffer &data, CInterruptEvents &breakEvents);
31+
32+ //! リクエスト受信の終了
33+ virtual void EndRecvRequest(CInterruptEvents &breakEvents);
34+
35+ //! レスポンスヘッダ取得(throw CCGIProcessException)
36+ virtual void ReadResponseHeader(CKeyDataArray &resHeaders, CInterruptEvents &breakEvents);
37+
38+ //! レスポンスボディを読み出し(throw CCGIProcessException)
39+ virtual void ReadResponseBody(CBuffer &data, CInterruptEvents &breakEvents);
40+
41+ //! レスポンス送信の終了
42+ virtual void EndSendResponse(CInterruptEvents &breakEvents);
43+};
--- 1xx/04WebServer/trunk/CGIProcessWrap.h (nonexistent)
+++ 1xx/04WebServer/trunk/CGIProcessWrap.h (revision 472)
@@ -0,0 +1,44 @@
1+#pragma once
2+#include "CGIManager.h"
3+
4+/*!
5+ CGI実行環境利用クラス(オートポインタ)
6+*/
7+class CCGIProcessWrap
8+{
9+public:
10+ ///////////////////////////////////////////////////////////////////////////////
11+ // コンストラクタ
12+ ///////////////////////////////////////////////////////////////////////////////
13+ CCGIProcessWrap(void);
14+ virtual ~CCGIProcessWrap(void);
15+
16+ ///////////////////////////////////////////////////////////////////////////////
17+ // 初期化・終了
18+ ///////////////////////////////////////////////////////////////////////////////
19+ //! 初期化(throw CCGIProcessException)
20+ void CreateProcess(CString commandLine, int cgiInterfaceType, int cgiProcessType, CCGIManager *manager);
21+
22+ //! 利用終了
23+ void DeleteProcess();
24+
25+
26+ ///////////////////////////////////////////////////////////////////////////////
27+ // ICGIInterface利用
28+ ///////////////////////////////////////////////////////////////////////////////
29+ //! ICGIInterface利用
30+ ICGIInterface *GetICGIInterface() { return m_cgiProcess; };
31+
32+ //! ICGIInterface利用
33+ ICGIInterface *operator->() { return m_cgiProcess; };
34+
35+protected:
36+ ///////////////////////////////////////////////////////////////////////////////
37+ // メンバ変数
38+ ///////////////////////////////////////////////////////////////////////////////
39+ //! 親マネージャ
40+ CCGIManager *m_cgiManager;
41+
42+ //! ICGIInterface
43+ ICGIInterface *m_cgiProcess;
44+};
--- 1xx/04WebServer/trunk/CGIProcessWrap.cpp (nonexistent)
+++ 1xx/04WebServer/trunk/CGIProcessWrap.cpp (revision 472)
@@ -0,0 +1,50 @@
1+#include "StdAfx.h"
2+#include "CGIProcessWrap.h"
3+
4+CCGIProcessWrap::CCGIProcessWrap(void)
5+{
6+ m_cgiManager = NULL;
7+ m_cgiProcess = NULL;
8+}
9+
10+CCGIProcessWrap::~CCGIProcessWrap(void)
11+{
12+ DeleteProcess();
13+}
14+
15+
16+///////////////////////////////////////////////////////////////////////////////
17+// 初期化・終了
18+///////////////////////////////////////////////////////////////////////////////
19+/*!
20+ 初期化(throw CCGIProcessException)
21+*/
22+void CCGIProcessWrap::CreateProcess(CString commandLine, int cgiInterfaceType, int cgiProcessType, CCGIManager *manager)
23+{
24+ m_cgiManager = manager;
25+ switch(manager->GetNewCGIProcess(commandLine, cgiInterfaceType, cgiProcessType, &m_cgiProcess))
26+ {
27+ case CGI_NEW_PROCESS_ERROR_NOERROR:
28+ default:
29+ break;
30+
31+ case CGI_NEW_PROCESS_ERROR_OVER_PROCESS:
32+ throw CCGIProcessException(_T("最大同時実行CGIプロセス数を超えました"));
33+ }
34+}
35+
36+/*!
37+ 利用終了
38+*/
39+void CCGIProcessWrap::DeleteProcess()
40+{
41+ if(m_cgiProcess != NULL)
42+ m_cgiProcess->CleanupCGIProcess();
43+
44+ if(m_cgiManager != NULL)
45+ m_cgiManager->DeleteCGIProcess(m_cgiProcess);
46+
47+ m_cgiManager = NULL;
48+ m_cgiProcess = NULL;
49+}
50+
--- 1xx/04WebServer/trunk/CGIManager.h (revision 471)
+++ 1xx/04WebServer/trunk/CGIManager.h (revision 472)
@@ -4,13 +4,47 @@
44 CGIの実行は、CGI実行環境を生成してから行う
55
66 CCGIProcessBase -> CFastCGIProcess
7- -> CCGIProcess
7+ -> CNormalCGIProcess
88 */
99 #pragma once
1010 #include "TextInfoExceptionBase.h"
1111 #include "InterruptEvents.h"
12+#include "SortArray.h"
13+#include "Buffer.h"
14+#include "Workspace.h"
1215
1316 /*!
17+ プロセスタイプ
18+*/
19+enum CGI_PROCESS_TYPE
20+{
21+ CGI_PROCESS_TYPE_EXECUTABLE = 0,
22+ CGI_PROCESS_TYPE_SCRIPT = 1,
23+};
24+
25+
26+/*!
27+ インタフェースタイプ
28+*/
29+enum CGI_INTERFACE_TYPE
30+{
31+ CGI_INTERFACE_TYPE_CGI = 0,
32+ CGI_INTERFACE_TYPE_FASTCGI = 1,
33+};
34+
35+/*!
36+ エラータイプ
37+*/
38+enum CGI_NEW_PROCESS_ERROR
39+{
40+ CGI_NEW_PROCESS_ERROR_NOERROR = 0,
41+
42+ //! プロセス数上限
43+ CGI_NEW_PROCESS_ERROR_OVER_PROCESS = -10,
44+};
45+
46+
47+/*!
1448 CGIプロセスエラー例外
1549 */
1650 DEFINE_TEXT_INFO_EXCEPTION(CCGIProcessException);
@@ -17,11 +51,11 @@
1751
1852
1953 /*!
20- CGI実行環境
54+ CGI実行環境インターフェース
2155
2256 インタプリタ+スクリプトは、クラス生成時に指定
2357 */
24-class CCGIProcessBase
58+class ICGIInterface
2559 {
2660 public:
2761 ///////////////////////////////////////////////////////////////////////////////
@@ -30,7 +64,7 @@
3064 //! CGI実行開始(throw CCGIProcessException)
3165 virtual void StartCGIProcess() = 0;
3266
33- //! CGI実行通常終了
67+ //! CGI実行終了
3468 virtual void CleanupCGIProcess() = 0;
3569
3670 ///////////////////////////////////////////////////////////////////////////////
@@ -37,16 +71,22 @@
3771 // 通信系インタフェース
3872 ///////////////////////////////////////////////////////////////////////////////
3973 //! 環境変数設定
40- virtual void AddRequestHeaderEnv(CKeyDataArray &envs);
74+ virtual void AddRequestHeaderEnv(CKeyDataArray &envs) = 0;
4175
4276 //! リクエストボディを書き込み(throw CCGIProcessException)
43- virtual void WriteRequestBody(CBuffer &data, CInterruptEvents &breakEvents);
77+ virtual void WriteRequestBody(CBuffer &data, CInterruptEvents &breakEvents) = 0;
4478
79+ //! リクエスト受信の終了
80+ virtual void EndRecvRequest(CInterruptEvents &breakEvents) = 0;
81+
4582 //! レスポンスヘッダ取得(throw CCGIProcessException)
46- virtual void ReadResponseHeader(CKeyDataArray &resHeaders, CInterruptEvents &breakEvents);
83+ virtual void ReadResponseHeader(CKeyDataArray &resHeaders, CInterruptEvents &breakEvents) = 0;
4784
4885 //! レスポンスボディを読み出し(throw CCGIProcessException)
49- virtual void ReadResponseBody(CBuffer &data, CInterruptEvents &breakEvents);
86+ virtual void ReadResponseBody(CBuffer &data, CInterruptEvents &breakEvents) = 0;
87+
88+ //! レスポンス送信の終了
89+ virtual void EndSendResponse(CInterruptEvents &breakEvents) = 0;
5090 };
5191
5292
@@ -54,6 +94,7 @@
5494 CGI管理クラス
5595
5696 CGI同時実行数、FastCGIの管理を行う
97+ マネージャは、開始時を除き、例外をスローしない
5798 */
5899 class CCGIManager
59100 {
@@ -70,13 +111,27 @@
70111 //! 停止
71112 void Stop();
72113
73- //! インタプリタ取得
74- int GetNewCGIProcess(int cgiProcessType, CString commandLine);
114+ //! プロセス取得(throw CCGIProcessException)
115+ int GetNewCGIProcess(CString commandLine, int cgiInterfaceType, int cgiProcessType, ICGIInterface **process);
75116
117+ //! プロセス使用終了
118+ void DeleteCGIProcess(ICGIInterface *process);
119+
76120 protected:
77121 ///////////////////////////////////////////////////////////////////////////////
122+ // 下請け
123+ ///////////////////////////////////////////////////////////////////////////////
124+
125+ ///////////////////////////////////////////////////////////////////////////////
78126 // メンバ変数
79127 ///////////////////////////////////////////////////////////////////////////////
80128 //! スコープ保護用
81129 CCriticalSection m_scopeLock;
130+
131+ //! 最大CGIプロセス数
132+ int m_maxCGIProcessCount;
133+
134+ //! 実行中のプロセス
135+ CTypedPtrArray<CPtrArray, ICGIInterface*> m_processList;
82136 };
137+
Show on old repository browser