mirror of
https://github.com/gnustep/libs-gsweb.git
synced 2025-05-31 01:01:19 +00:00
*** empty log message ***
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@6293 72102866-910b-0410-8b05-ffd578937521
This commit is contained in:
parent
b45dc89478
commit
b13501c8e3
62 changed files with 3645 additions and 1770 deletions
13
ChangeLog
13
ChangeLog
|
@ -1,3 +1,16 @@
|
||||||
|
2000-03-16 Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
|
||||||
|
* All Files in GSWAdaptors: Clean code, changes in config file,...
|
||||||
|
Netscap Adaptor hasn't been re-tested.
|
||||||
|
|
||||||
|
2000-03-16 Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
|
||||||
|
* PageDef.g: handle escaped characters in strings
|
||||||
|
* GSWPageDefParser.h: handle escaped characters in strings
|
||||||
|
* GSWPageDefParser.m: handle escaped characters in strings
|
||||||
|
* htmltag.g: changes on HEXDIGIT
|
||||||
|
* html.g: changes on HEXDIGIT
|
||||||
|
|
||||||
2000-03-09 Karl Kraft <karl@nfox.com>
|
2000-03-09 Karl Kraft <karl@nfox.com>
|
||||||
Change to GSWPopUpButton
|
Change to GSWPopUpButton
|
||||||
* the <option> tag should not have a </option> closing tag.
|
* the <option> tag should not have a </option> closing tag.
|
||||||
|
|
24
GSWAdaptors/Apache/INSTALL
Normal file
24
GSWAdaptors/Apache/INSTALL
Normal file
|
@ -0,0 +1,24 @@
|
||||||
|
You have to do:
|
||||||
|
|
||||||
|
o make
|
||||||
|
o copy mod_gsweb.so in apache libexec (the apache directory of modules, in which you should have mod_mime.so, mod_alias.so,...)
|
||||||
|
o edit your apache configuration file:
|
||||||
|
|
||||||
|
- Add
|
||||||
|
|
||||||
|
LoadModule GSWeb_Module libexec/mod_gsweb.so
|
||||||
|
AddModule mod_gsweb.c
|
||||||
|
|
||||||
|
- Add Global configuration directives:
|
||||||
|
o gsweb configuration file path
|
||||||
|
GSWeb_ConfigFilePath /etc/httpd/conf/gsweb.conf (for exemple)
|
||||||
|
o gsweb alias
|
||||||
|
GSWeb_Alias /GSWeb (for exemple)
|
||||||
|
|
||||||
|
- Add the following lines for a virtual host (or all hosts)
|
||||||
|
<Location /GSWeb*>
|
||||||
|
SetHandler GSWeb
|
||||||
|
</Location>
|
||||||
|
|
||||||
|
o create your gsweb configuration file (see ../Doc/ConfigurationFile.html)
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
|
#include "GSWString.h"
|
||||||
#include "GSWConfig.h"
|
#include "GSWConfig.h"
|
||||||
#include "GSWURLUtil.h"
|
#include "GSWURLUtil.h"
|
||||||
#include "GSWHTTPHeaders.h"
|
#include "GSWHTTPHeaders.h"
|
||||||
|
@ -57,7 +58,7 @@ typedef struct _GSWeb_Config
|
||||||
{
|
{
|
||||||
const char* pszGSWeb; // default = GSWeb
|
const char* pszGSWeb; // default = GSWeb
|
||||||
const char* pszConfigPath; // path to GSWeb.conf
|
const char* pszConfigPath; // path to GSWeb.conf
|
||||||
const char* pszRoot; // normally htdocs/GSWeb
|
// const char* pszRoot; // normally htdocs/GSWeb
|
||||||
} GSWeb_Config;
|
} GSWeb_Config;
|
||||||
|
|
||||||
|
|
||||||
|
@ -75,7 +76,7 @@ struct table
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
static CONST char* GSWeb_SetDocRoot(cmd_parms* p_pCmdParams,void* p_pUnused,char *p_pszArg);
|
//static CONST char* GSWeb_SetDocRoot(cmd_parms* p_pCmdParams,void* p_pUnused,char *p_pszArg);
|
||||||
static CONST char* GSWeb_SetScriptAlias(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg);
|
static CONST char* GSWeb_SetScriptAlias(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg);
|
||||||
static CONST char *GSWeb_SetConfig(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg);
|
static CONST char *GSWeb_SetConfig(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg);
|
||||||
static int GSWeb_Handler(request_rec* p_pRequestRec);
|
static int GSWeb_Handler(request_rec* p_pRequestRec);
|
||||||
|
@ -86,20 +87,21 @@ static void GSWeb_Init(server_rec* p_pServerRec, pool *p)
|
||||||
{
|
{
|
||||||
GSWDict* pDict=GSWDict_New(0);
|
GSWDict* pDict=GSWDict_New(0);
|
||||||
GSWeb_Config* pConfig=NULL;
|
GSWeb_Config* pConfig=NULL;
|
||||||
GSWConfig_Init();
|
|
||||||
pConfig=(GSWeb_Config*)ap_get_module_config(p_pServerRec->module_config,
|
pConfig=(GSWeb_Config*)ap_get_module_config(p_pServerRec->module_config,
|
||||||
&GSWeb_Module);
|
&GSWeb_Module);
|
||||||
GSWLog_Init(NULL,GSW_INFO);
|
GSWLog_Init(NULL,GSW_INFO);
|
||||||
|
GSWLog(GSW_INFO,p_pServerRec,"GSWeb Init Start Config" GSWEB_HANDLER);
|
||||||
|
|
||||||
if (pConfig && pConfig->pszConfigPath)
|
if (pConfig && pConfig->pszConfigPath)
|
||||||
GSWDict_AddStringDup(pDict,
|
GSWDict_AddStringDup(pDict,
|
||||||
g_szGSWeb_Conf_ConfigFilePath,
|
g_szGSWeb_Conf_ConfigFilePath,
|
||||||
pConfig->pszConfigPath);
|
pConfig->pszConfigPath);
|
||||||
if (pConfig && pConfig->pszRoot)
|
/* if (pConfig && pConfig->pszRoot)
|
||||||
GSWDict_AddStringDup(pDict,
|
GSWDict_AddStringDup(pDict,
|
||||||
g_szGSWeb_Conf_DocRoot,
|
g_szGSWeb_Conf_DocRoot,
|
||||||
pConfig->pszRoot);
|
pConfig->pszRoot);*/
|
||||||
GSWLoadBalancing_Init(pDict);
|
GSWLog(GSW_INFO,p_pServerRec,"GSWeb Init LB Init" GSWEB_HANDLER);
|
||||||
|
GSWConfig_Init(pDict);
|
||||||
|
|
||||||
GSWLog(GSW_INFO,p_pServerRec,"GSWeb Init" GSWEB_HANDLER);
|
GSWLog(GSW_INFO,p_pServerRec,"GSWeb Init" GSWEB_HANDLER);
|
||||||
GSWDict_Free(pDict);
|
GSWDict_Free(pDict);
|
||||||
|
@ -107,35 +109,41 @@ static void GSWeb_Init(server_rec* p_pServerRec, pool *p)
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// Create Config
|
// Create Config
|
||||||
static void *GSWeb_CreateConfig(pool* p_pPool,
|
static void* GSWeb_CreateConfig(pool* p_pPool,
|
||||||
server_rec* p_pServerRec)
|
server_rec* p_pServerRec)
|
||||||
{
|
{
|
||||||
GSWeb_Config *pConfig = (GSWeb_Config*)ap_palloc(p_pPool,sizeof(GSWeb_Config));
|
GSWeb_Config *pConfig = (GSWeb_Config*)ap_palloc(p_pPool,sizeof(GSWeb_Config));
|
||||||
pConfig->pszGSWeb = g_szGSWeb_Prefix;
|
pConfig->pszGSWeb = g_szGSWeb_Prefix;
|
||||||
pConfig->pszConfigPath = NULL;
|
pConfig->pszConfigPath = NULL;
|
||||||
pConfig->pszRoot = NULL;
|
// pConfig->pszRoot = NULL;
|
||||||
return pConfig;
|
return pConfig;
|
||||||
};
|
};
|
||||||
|
/*
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// Set Param: DocRoot
|
// Set Param: DocRoot
|
||||||
static CONST char* GSWeb_SetDocRoot(cmd_parms* p_pCmdParams,void* p_pUnused,char *p_pszArg)
|
static CONST char* GSWeb_SetDocRoot(cmd_parms* p_pCmdParams,void* p_pUnused,char *p_pszArg)
|
||||||
{
|
{
|
||||||
server_rec* pServerRec = p_pCmdParams->server;
|
server_rec* pServerRec = p_pCmdParams->server;
|
||||||
GSWeb_Config* pConfig = (GSWeb_Config *)ap_get_module_config(pServerRec->module_config,
|
GSWeb_Config* pConfig = NULL;
|
||||||
&GSWeb_Module);
|
GSWLog(GSW_DEBUG,pServerRec,"Start GSWeb_SetDocRoot");
|
||||||
pConfig->pszRoot = p_pszArg;
|
pConfig=(GSWeb_Config *)ap_get_module_config(pServerRec->module_config,
|
||||||
return NULL;
|
&GSWeb_Module);
|
||||||
|
pConfig->pszRoot = p_pszArg;
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Start GSWeb_SetDocRoot");
|
||||||
|
return NULL;
|
||||||
};
|
};
|
||||||
|
*/
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// Set Param: ScriptAlias
|
// Set Param: ScriptAlias
|
||||||
static CONST char* GSWeb_SetScriptAlias(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg)
|
static CONST char* GSWeb_SetScriptAlias(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg)
|
||||||
{
|
{
|
||||||
server_rec* pServerRec = p_pCmdParams->server;
|
server_rec* pServerRec = p_pCmdParams->server;
|
||||||
GSWeb_Config* pConfig = (GSWeb_Config *)ap_get_module_config(pServerRec->module_config,
|
GSWeb_Config* pConfig = NULL;
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Start GSWeb_SetScriptAlias");
|
||||||
|
pConfig=(GSWeb_Config *)ap_get_module_config(pServerRec->module_config,
|
||||||
&GSWeb_Module);
|
&GSWeb_Module);
|
||||||
pConfig->pszGSWeb = p_pszArg;
|
pConfig->pszGSWeb = p_pszArg;
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Stop GSWeb_SetScriptAlias");
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -144,9 +152,12 @@ static CONST char* GSWeb_SetScriptAlias(cmd_parms *p_pCmdParams, void *p_pUnused
|
||||||
static CONST char *GSWeb_SetConfig(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg)
|
static CONST char *GSWeb_SetConfig(cmd_parms *p_pCmdParams, void *p_pUnused, char *p_pszArg)
|
||||||
{
|
{
|
||||||
server_rec* pServerRec = p_pCmdParams->server;
|
server_rec* pServerRec = p_pCmdParams->server;
|
||||||
GSWeb_Config* pConfig = (GSWeb_Config *)ap_get_module_config(pServerRec->module_config,
|
GSWeb_Config* pConfig = NULL;
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Start GSWeb_SetConfig");
|
||||||
|
pConfig=(GSWeb_Config *)ap_get_module_config(pServerRec->module_config,
|
||||||
&GSWeb_Module);
|
&GSWeb_Module);
|
||||||
pConfig->pszConfigPath = p_pszArg;
|
pConfig->pszConfigPath = p_pszArg;
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Stop GSWeb_SetConfig");
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -156,39 +167,43 @@ static CONST char *GSWeb_SetConfig(cmd_parms *p_pCmdParams, void *p_pUnused, cha
|
||||||
int GSWeb_Translation(request_rec* p_pRequestRec)
|
int GSWeb_Translation(request_rec* p_pRequestRec)
|
||||||
{
|
{
|
||||||
int iRetValue=OK;
|
int iRetValue=OK;
|
||||||
GSWeb_Config *pConfig= (GSWeb_Config *)ap_get_module_config(p_pRequestRec->server->module_config,
|
GSWeb_Config* pConfig=NULL;
|
||||||
&GSWeb_Module);
|
|
||||||
GSWURLComponents stURL;
|
GSWURLComponents stURL;
|
||||||
|
memset(&stURL,0,sizeof(stURL));
|
||||||
|
GSWLog(GSW_DEBUG,p_pRequestRec->server,"Start GSWeb_Translation");
|
||||||
|
pConfig=(GSWeb_Config *)ap_get_module_config(p_pRequestRec->server->module_config,
|
||||||
|
&GSWeb_Module);
|
||||||
// Is this for us ?
|
// Is this for us ?
|
||||||
if (strncmp(pConfig->pszGSWeb,
|
if (strncmp(pConfig->pszGSWeb,
|
||||||
p_pRequestRec->uri,
|
p_pRequestRec->uri,
|
||||||
strlen(pConfig->pszGSWeb))==0)
|
strlen(pConfig->pszGSWeb))==0)
|
||||||
{
|
{
|
||||||
GSWURLError eError=GSWParseURL(&stURL,p_pRequestRec->uri);
|
GSWURLError eError=GSWParseURL(&stURL,p_pRequestRec->uri,
|
||||||
GSWLog(GSW_ERROR,p_pRequestRec->server,"==>GSWeb_Translation Error=%d",eError);
|
p_pRequestRec->server);
|
||||||
/* if (eError!=GSWURLError_OK)
|
if (eError!=GSWURLError_OK)
|
||||||
{
|
{
|
||||||
GSWLog(GSW_ERROR,p_pRequestRec->server,"==>GSWeb_Translation Decliend");
|
GSWLog(GSW_ERROR,p_pRequestRec->server,"GSWeb_Translation Declined (Error %d)",(int)eError);
|
||||||
iRetValue=DECLINED;
|
iRetValue=DECLINED;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{*/
|
{
|
||||||
GSWLog(GSW_INFO,
|
GSWLog(GSW_DEBUG,
|
||||||
p_pRequestRec->server,
|
p_pRequestRec->server,
|
||||||
"GSWeb_Translation Handler p_pRequestRec->handler=%s pool=%p handler=%s pConfig->pszGSWeb=%s",
|
"GSWeb_Translation Handler p_pRequestRec->handler=%s pool=%p handler=%s pConfig->pszGSWeb=%s",
|
||||||
p_pRequestRec->handler,
|
p_pRequestRec->handler,
|
||||||
p_pRequestRec->pool,
|
p_pRequestRec->pool,
|
||||||
g_szGSWeb_Handler,
|
g_szGSWeb_Handler,
|
||||||
pConfig->pszGSWeb);
|
pConfig->pszGSWeb);
|
||||||
p_pRequestRec->handler=(char*)ap_pstrdup(p_pRequestRec->pool,g_szGSWeb_Handler);
|
p_pRequestRec->handler=(char*)ap_pstrdup(p_pRequestRec->pool,g_szGSWeb_Handler);
|
||||||
iRetValue=OK;
|
iRetValue=OK;
|
||||||
/* };*/
|
};
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GSWLog(GSW_INFO,p_pRequestRec->server,"GSWeb_Translation Decliend");
|
GSWLog(GSW_DEBUG,p_pRequestRec->server,"GSWeb_Translation Decliend");
|
||||||
iRetValue=DECLINED;
|
iRetValue=DECLINED;
|
||||||
};
|
};
|
||||||
|
GSWLog(GSW_DEBUG,p_pRequestRec->server,"Stop GSWeb_Translation");
|
||||||
return iRetValue;
|
return iRetValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -202,6 +217,7 @@ static void copyHeaders(request_rec* p_pRequestRec,GSWHTTPRequest* p_pGSWHTTPReq
|
||||||
int i;
|
int i;
|
||||||
char szPort[40]="";
|
char szPort[40]="";
|
||||||
CONST char* pszRemoteLogName=NULL;
|
CONST char* pszRemoteLogName=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Start copyHeaders");
|
||||||
|
|
||||||
// copy p_pRequestRec headers
|
// copy p_pRequestRec headers
|
||||||
pHeader = (table_entry*)(&pHeadersIn->a)->elts;
|
pHeader = (table_entry*)(&pHeadersIn->a)->elts;
|
||||||
|
@ -263,6 +279,7 @@ static void copyHeaders(request_rec* p_pRequestRec,GSWHTTPRequest* p_pGSWHTTPReq
|
||||||
GSWHTTPRequest_AddHeader(p_pGSWHTTPRequest,
|
GSWHTTPRequest_AddHeader(p_pGSWHTTPRequest,
|
||||||
g_szServerInfo_RemoteIdent,
|
g_szServerInfo_RemoteIdent,
|
||||||
pszRemoteLogName);
|
pszRemoteLogName);
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Stop copyHeaders");
|
||||||
};
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
@ -283,6 +300,8 @@ static void getHeader(GSWDictElem* p_pElem,void* p_pRequestRec)
|
||||||
static void sendResponse(request_rec* p_pRequestRec,GSWHTTPResponse* p_pHTTPResponse)
|
static void sendResponse(request_rec* p_pRequestRec,GSWHTTPResponse* p_pHTTPResponse)
|
||||||
{
|
{
|
||||||
char szStatusBuffer[512]="";
|
char szStatusBuffer[512]="";
|
||||||
|
server_rec* pServerRec = p_pRequestRec->server;
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Start sendResponse");
|
||||||
|
|
||||||
// Process Headers
|
// Process Headers
|
||||||
GSWDict_PerformForAllElem(p_pHTTPResponse->pHeaders,getHeader,p_pRequestRec);
|
GSWDict_PerformForAllElem(p_pHTTPResponse->pHeaders,getHeader,p_pRequestRec);
|
||||||
|
@ -312,15 +331,20 @@ static void sendResponse(request_rec* p_pRequestRec,GSWHTTPResponse* p_pHTTPResp
|
||||||
ap_rwrite(p_pHTTPResponse->pContent,p_pHTTPResponse->uContentLength,p_pRequestRec);
|
ap_rwrite(p_pHTTPResponse->pContent,p_pHTTPResponse->uContentLength,p_pRequestRec);
|
||||||
ap_kill_timeout(p_pRequestRec);
|
ap_kill_timeout(p_pRequestRec);
|
||||||
};
|
};
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Stop sendResponse");
|
||||||
};
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
// die/send response
|
// die/send response
|
||||||
static int dieSendResponse(request_rec* p_pRequestRec,GSWHTTPResponse** p_ppHTTPResponse,BOOL p_fDecline)
|
static int dieSendResponse(request_rec* p_pRequestRec,GSWHTTPResponse** p_ppHTTPResponse,BOOL p_fDecline)
|
||||||
{
|
{
|
||||||
|
server_rec* pServerRec = p_pRequestRec->server;
|
||||||
|
void* pLogServerData=pServerRec;
|
||||||
|
GSWLog(GSW_DEBUG,pLogServerData,"Start dieSendResponse");
|
||||||
sendResponse(p_pRequestRec,*p_ppHTTPResponse);
|
sendResponse(p_pRequestRec,*p_ppHTTPResponse);
|
||||||
GSWHTTPResponse_Free(*p_ppHTTPResponse);
|
GSWHTTPResponse_Free(*p_ppHTTPResponse,pLogServerData);
|
||||||
*p_ppHTTPResponse=NULL;
|
*p_ppHTTPResponse=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,pLogServerData,"Start dieSendResponse");
|
||||||
return p_fDecline ? DECLINED : OK;
|
return p_fDecline ? DECLINED : OK;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -328,11 +352,15 @@ static int dieSendResponse(request_rec* p_pRequestRec,GSWHTTPResponse** p_ppHTTP
|
||||||
// die with a message
|
// die with a message
|
||||||
static int dieWithMessage(request_rec* p_pRequestRec,CONST char* p_pszMessage,BOOL p_fDecline)
|
static int dieWithMessage(request_rec* p_pRequestRec,CONST char* p_pszMessage,BOOL p_fDecline)
|
||||||
{
|
{
|
||||||
GSWHTTPResponse* pResponse=NULL;
|
int iReturn=0;
|
||||||
server_rec* pServerRec = p_pRequestRec->server;
|
GSWHTTPResponse* pResponse=NULL;
|
||||||
GSWLog(GSW_ERROR,pServerRec,"Send Error Response: %s",p_pszMessage);
|
server_rec* pServerRec = p_pRequestRec->server;
|
||||||
pResponse = GSWHTTPResponse_BuildErrorResponse(p_pszMessage);
|
GSWLog(GSW_DEBUG,pServerRec,"Start dieWithMessage");
|
||||||
return dieSendResponse(p_pRequestRec,&pResponse,p_fDecline);
|
GSWLog(GSW_ERROR,pServerRec,"Send Error Response: %s",p_pszMessage);
|
||||||
|
pResponse = GSWHTTPResponse_BuildErrorResponse(NULL,p_pszMessage,p_pRequestRec->server);
|
||||||
|
iReturn=dieSendResponse(p_pRequestRec,&pResponse,p_fDecline);
|
||||||
|
GSWLog(GSW_DEBUG,pServerRec,"Stop dieWithMessage");
|
||||||
|
return iReturn;
|
||||||
};
|
};
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
@ -345,23 +373,28 @@ static int GSWeb_Handler(request_rec* p_pRequestRec)
|
||||||
GSWURLError eError=GSWURLError_OK;
|
GSWURLError eError=GSWURLError_OK;
|
||||||
CONST char* pszURLError=NULL;
|
CONST char* pszURLError=NULL;
|
||||||
server_rec* pServerRec = p_pRequestRec->server;
|
server_rec* pServerRec = p_pRequestRec->server;
|
||||||
|
void* pLogServerData=pServerRec;
|
||||||
memset(&stURLComponents,0,sizeof(stURLComponents));
|
memset(&stURLComponents,0,sizeof(stURLComponents));
|
||||||
|
GSWLog(GSW_DEBUG,pLogServerData,"Start GSWeb_Handler");
|
||||||
|
|
||||||
// Log the request
|
// Log the request
|
||||||
GSWLog(GSW_INFO,
|
GSWLog(GSW_INFO,
|
||||||
pServerRec,
|
pLogServerData,
|
||||||
"GNUstepWeb New request: %s",
|
"GNUstepWeb New request: %s",
|
||||||
p_pRequestRec->uri);
|
p_pRequestRec->uri);
|
||||||
|
|
||||||
// Parse the uri
|
// Parse the uri
|
||||||
eError=GSWParseURL(&stURLComponents,p_pRequestRec->uri);
|
eError=GSWParseURL(&stURLComponents,p_pRequestRec->uri,
|
||||||
|
pLogServerData);
|
||||||
if (eError!=GSWURLError_OK)
|
if (eError!=GSWURLError_OK)
|
||||||
{
|
{
|
||||||
pszURLError=GSWURLErrorMessage(eError);
|
pszURLError=GSWURLErrorMessage(eError,
|
||||||
GSWLog(GSW_INFO,pServerRec,"URL Parsing Error: %s", pszURLError);
|
pLogServerData);
|
||||||
if (eError==GSWURLError_InvalidAppName && GSWDumpConfigFile_CanDump())
|
GSWLog(GSW_INFO,pLogServerData,"URL Parsing Error: %s", pszURLError);
|
||||||
|
if (eError==GSWURLError_InvalidAppName)
|
||||||
{
|
{
|
||||||
pResponse = GSWDumpConfigFile(p_pRequestRec->server,&stURLComponents);
|
pResponse = GSWDumpConfigFile(&stURLComponents,
|
||||||
|
p_pRequestRec->server);
|
||||||
iRetVal=dieSendResponse(p_pRequestRec,&pResponse,NO);
|
iRetVal=dieSendResponse(p_pRequestRec,&pResponse,NO);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -373,10 +406,13 @@ static int GSWeb_Handler(request_rec* p_pRequestRec)
|
||||||
if (iRetVal==0) // OK Continue
|
if (iRetVal==0) // OK Continue
|
||||||
{
|
{
|
||||||
// Build the GSWHTTPRequest with the method
|
// Build the GSWHTTPRequest with the method
|
||||||
GSWHTTPRequest* pRequest=GSWHTTPRequest_New(p_pRequestRec->method,NULL);
|
GSWHTTPRequest* pRequest=NULL;
|
||||||
|
CONST char* pszRequestError=NULL;
|
||||||
|
|
||||||
|
pRequest=GSWHTTPRequest_New(p_pRequestRec->method,NULL,pLogServerData);
|
||||||
|
|
||||||
// validate the method
|
// validate the method
|
||||||
CONST char* pszRequestError=GSWHTTPRequest_ValidateMethod(pRequest);
|
pszRequestError=GSWHTTPRequest_ValidateMethod(pRequest,pLogServerData);
|
||||||
if (pszRequestError)
|
if (pszRequestError)
|
||||||
{
|
{
|
||||||
iRetVal=dieWithMessage(p_pRequestRec,pszRequestError,NO);
|
iRetVal=dieWithMessage(p_pRequestRec,pszRequestError,NO);
|
||||||
|
@ -408,7 +444,7 @@ static int GSWeb_Handler(request_rec* p_pRequestRec)
|
||||||
pszData += iReadLength;
|
pszData += iReadLength;
|
||||||
iRemainingLength-=iReadLength;
|
iRemainingLength-=iReadLength;
|
||||||
};
|
};
|
||||||
GSWLog(GSW_INFO,pServerRec,"pszBuffer(%p)=%.*s",
|
GSWLog(GSW_INFO,pLogServerData,"pszBuffer(%p)=%.*s",
|
||||||
(void*)pszBuffer,
|
(void*)pszBuffer,
|
||||||
(int)pRequest->uContentLength,
|
(int)pRequest->uContentLength,
|
||||||
pszBuffer);
|
pszBuffer);
|
||||||
|
@ -422,10 +458,10 @@ static int GSWeb_Handler(request_rec* p_pRequestRec)
|
||||||
};
|
};
|
||||||
|
|
||||||
// get the document root
|
// get the document root
|
||||||
pConfig=(GSWeb_Config*)ap_get_module_config(p_pRequestRec->per_dir_config,&GSWeb_Module);
|
/* pConfig=(GSWeb_Config*)ap_get_module_config(p_pRequestRec->per_dir_config,&GSWeb_Module);
|
||||||
if (pConfig && pConfig->pszRoot)
|
if (pConfig && pConfig->pszRoot)
|
||||||
pszDocRoot = pConfig->pszRoot;
|
pszDocRoot = pConfig->pszRoot;
|
||||||
else
|
else*/
|
||||||
pszDocRoot=(char*)ap_document_root(p_pRequestRec);
|
pszDocRoot=(char*)ap_document_root(p_pRequestRec);
|
||||||
|
|
||||||
// Build the response (Beware: tr_handleRequest free pRequest)
|
// Build the response (Beware: tr_handleRequest free pRequest)
|
||||||
|
@ -435,15 +471,15 @@ static int GSWeb_Handler(request_rec* p_pRequestRec)
|
||||||
&stURLComponents,
|
&stURLComponents,
|
||||||
p_pRequestRec->protocol,
|
p_pRequestRec->protocol,
|
||||||
pszDocRoot,
|
pszDocRoot,
|
||||||
"SB", //TODO AppTest name
|
g_szGSWeb_StatusResponseAppName, //AppTest name
|
||||||
(void*)p_pRequestRec->server);
|
pLogServerData);
|
||||||
ap_kill_timeout(p_pRequestRec);
|
ap_kill_timeout(p_pRequestRec);
|
||||||
|
|
||||||
// Send the response (if any)
|
// Send the response (if any)
|
||||||
if (pResponse)
|
if (pResponse)
|
||||||
{
|
{
|
||||||
sendResponse(p_pRequestRec,pResponse);
|
sendResponse(p_pRequestRec,pResponse);
|
||||||
GSWHTTPResponse_Free(pResponse);
|
GSWHTTPResponse_Free(pResponse,pLogServerData);
|
||||||
iRetVal = OK;
|
iRetVal = OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -451,8 +487,9 @@ static int GSWeb_Handler(request_rec* p_pRequestRec)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
GSWLog(GSW_DEBUG,pLogServerData,"Stop GSWeb_Handler");
|
||||||
return iRetVal;
|
return iRetVal;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
||||||
//--------------------------------------------------------------------
|
//--------------------------------------------------------------------
|
||||||
|
@ -461,7 +498,7 @@ static int GSWeb_Handler(request_rec* p_pRequestRec)
|
||||||
|
|
||||||
static command_rec GSWeb_Commands[20] =
|
static command_rec GSWeb_Commands[20] =
|
||||||
{
|
{
|
||||||
{
|
/*NEW {
|
||||||
GSWEB_CONF__DOC_ROOT, // Command keyword
|
GSWEB_CONF__DOC_ROOT, // Command keyword
|
||||||
GSWeb_SetDocRoot, // Function
|
GSWeb_SetDocRoot, // Function
|
||||||
NULL, // Fixed Arg
|
NULL, // Fixed Arg
|
||||||
|
@ -469,6 +506,7 @@ static command_rec GSWeb_Commands[20] =
|
||||||
TAKE1, // Args Descr
|
TAKE1, // Args Descr
|
||||||
"RootDirectory for GSWeb"
|
"RootDirectory for GSWeb"
|
||||||
},
|
},
|
||||||
|
*/
|
||||||
{
|
{
|
||||||
GSWEB_CONF__ALIAS, // Command keyword
|
GSWEB_CONF__ALIAS, // Command keyword
|
||||||
GSWeb_SetScriptAlias, // Function
|
GSWeb_SetScriptAlias, // Function
|
||||||
|
@ -516,3 +554,4 @@ module GSWeb_Module =
|
||||||
NULL,
|
NULL,
|
||||||
NULL
|
NULL
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
96
GSWAdaptors/Doc/ConfigurationFile.html
Normal file
96
GSWAdaptors/Doc/ConfigurationFile.html
Normal file
|
@ -0,0 +1,96 @@
|
||||||
|
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>Adaptor Configuration File</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
Configuration file path is specified with Apache directive (/etc/httpd/conf/gsweb.conf is an exemple): <BR>
|
||||||
|
<PRE>GSWeb_ConfigFilePath /etc/httpd/conf/gsweb.conf</PRE><BR>
|
||||||
|
|
||||||
|
|
||||||
|
The format is GNUstep/OpenStep property list.<BR>
|
||||||
|
Here is an exemple with all the possible options:<BR>
|
||||||
|
|
||||||
|
<PRE>
|
||||||
|
|
||||||
|
{
|
||||||
|
//Global Parameters
|
||||||
|
canDumpStatus=YES; //YES if server can display status (URL: /GSWeb/status)
|
||||||
|
GSWExtensionsFrameworkWebServerResources="/GSW/GSWExtensions/WebServerResources"; //URL of GSWExtensions Framework WebServerResources directory
|
||||||
|
|
||||||
|
//List of applications
|
||||||
|
applications= {
|
||||||
|
//The 1st application: MyApp
|
||||||
|
MyApp = {
|
||||||
|
//List of its instances
|
||||||
|
instances = {
|
||||||
|
//First Instance
|
||||||
|
1 = {
|
||||||
|
host=145.146.147.20; //Host of this instance
|
||||||
|
port=9001; //Port of this instance
|
||||||
|
parameters= { //Unused
|
||||||
|
transport=socket;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
//The 2nd application: AnotherOne
|
||||||
|
AnotherOne = {
|
||||||
|
//URL of GSWExtensions Framework WebServerResources directory. It overides Global parameter
|
||||||
|
GSWExtensionsFrameworkWebServerResources="/GSW/GSWExtensions/WebServerResources";
|
||||||
|
//YES to say that this application can be listed when the adaptor don't find an application
|
||||||
|
canDump = YES;
|
||||||
|
//Unused for the moment
|
||||||
|
applicationHeaders = {
|
||||||
|
header1=1264;
|
||||||
|
header2=4567;
|
||||||
|
};
|
||||||
|
//Instances
|
||||||
|
instances = {
|
||||||
|
//1st instance
|
||||||
|
1 = {
|
||||||
|
host=145.146.147.20;
|
||||||
|
port=9002;
|
||||||
|
parameters= {
|
||||||
|
transport=socket;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
MyAppVoid = {
|
||||||
|
//Here we have 3 instances
|
||||||
|
instances = {
|
||||||
|
1 = {
|
||||||
|
host=145.146.147.20;
|
||||||
|
port=9001;
|
||||||
|
parameters= {
|
||||||
|
transport=socket;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
2 = {
|
||||||
|
host=145.146.147.21;
|
||||||
|
port=9002;
|
||||||
|
parameters= {
|
||||||
|
transport=socket;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
5 ={
|
||||||
|
host=145.146.147.22;
|
||||||
|
port=9003;
|
||||||
|
parameters= {
|
||||||
|
transport=socket;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
</PRE>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
194
GSWAdaptors/common/GSWApp.c
Normal file
194
GSWAdaptors/common/GSWApp.c
Normal file
|
@ -0,0 +1,194 @@
|
||||||
|
/* GSWApp.c - GSWeb: Adaptors: GSWApp & GSWAppInstance
|
||||||
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
Date: March 2000
|
||||||
|
|
||||||
|
This file is part of the GNUstep Web Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include "GSWUtil.h"
|
||||||
|
#include "GSWDict.h"
|
||||||
|
#include "GSWString.h"
|
||||||
|
#include "GSWUtil.h"
|
||||||
|
#include "GSWApp.h"
|
||||||
|
|
||||||
|
void GSWApp_InternFreeNotValidInstances(GSWDictElem* p_pElem,void* p_pData);
|
||||||
|
void GSWApp_InternClearInstances(GSWDictElem* p_pElem,void* p_pData);
|
||||||
|
void GSWAppInstance_InternClear(GSWDictElem* p_pElem,void* p_pData);
|
||||||
|
|
||||||
|
//====================================================================
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
GSWApp* GSWApp_New()
|
||||||
|
{
|
||||||
|
GSWApp* pApp=(GSWApp*)calloc(1,sizeof(GSWApp));
|
||||||
|
memset(pApp,0,sizeof(GSWApp));
|
||||||
|
pApp->iUsageCounter++;
|
||||||
|
return pApp;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWApp_Free(GSWApp* p_pApp)
|
||||||
|
{
|
||||||
|
if (!p_pApp)
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"No App to free");
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p_pApp->iUsageCounter--;
|
||||||
|
if (p_pApp->iUsageCounter<0)
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"App seems to have been freed too much times");
|
||||||
|
if (p_pApp->iUsageCounter<=0)
|
||||||
|
{
|
||||||
|
if (p_pApp->pszName)
|
||||||
|
free(p_pApp->pszName);
|
||||||
|
if (p_pApp->pszGSWExtensionsFrameworkWebServerResources)
|
||||||
|
free(p_pApp->pszGSWExtensionsFrameworkWebServerResources);
|
||||||
|
GSWDict_FreeElements(&p_pApp->stInstancesDict);
|
||||||
|
GSWDict_FreeElements(&p_pApp->stHeadersDict);
|
||||||
|
free(p_pApp);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWApp_AddInstance(GSWApp* p_pApp,CONST char* p_pszInstanceNum,GSWAppInstance* p_pInstance)
|
||||||
|
{
|
||||||
|
if (!p_pApp)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"No App to add instance");
|
||||||
|
}
|
||||||
|
else if (!p_pInstance)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"No instance to add");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (p_pInstance->pApp!=p_pApp)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"Trying to add instance to another app");
|
||||||
|
if (p_pInstance->pApp)
|
||||||
|
p_pInstance->pApp->iUsageCounter--;
|
||||||
|
p_pInstance->pApp=p_pApp;
|
||||||
|
p_pInstance->pApp->iUsageCounter++;
|
||||||
|
};
|
||||||
|
GSWDict_Add(&p_pApp->stInstancesDict,p_pszInstanceNum,p_pInstance,FALSE);//NotOwner
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWApp_InternFreeNotValidInstances(GSWDictElem* p_pElem,void* p_pData)
|
||||||
|
{
|
||||||
|
GSWDict* pInstancesDict=(GSWDict*)p_pData;
|
||||||
|
GSWAppInstance* pInstance=(GSWAppInstance*)p_pElem->pValue;
|
||||||
|
if (!pInstance->fValid)
|
||||||
|
{
|
||||||
|
GSWDict_RemoveKey(pInstancesDict,p_pElem->pszKey);
|
||||||
|
if (GSWAppInstance_FreeIFND(pInstance))
|
||||||
|
pInstance=NULL;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWApp_FreeNotValidInstances(GSWApp* p_pApp)
|
||||||
|
{
|
||||||
|
GSWDict_PerformForAllElem(&p_pApp->stInstancesDict,
|
||||||
|
GSWApp_InternFreeNotValidInstances,
|
||||||
|
&p_pApp->stInstancesDict);
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWApp_InternClearInstances(GSWDictElem* p_pElem,void* p_pData)
|
||||||
|
{
|
||||||
|
GSWApp* pApp=(GSWApp*)(p_pElem->pValue);
|
||||||
|
GSWDict_PerformForAllElem(&pApp->stInstancesDict,
|
||||||
|
GSWAppInstance_InternClear,
|
||||||
|
NULL);
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWApp_AppsClearInstances(GSWDict* p_pAppsDict)
|
||||||
|
{
|
||||||
|
GSWDict_PerformForAllElem(p_pAppsDict,
|
||||||
|
GSWApp_InternClearInstances,
|
||||||
|
NULL);
|
||||||
|
};
|
||||||
|
|
||||||
|
//====================================================================
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
GSWAppInstance* GSWAppInstance_New(GSWApp* p_pApp)
|
||||||
|
{
|
||||||
|
GSWAppInstance* pInstance=(GSWAppInstance*)calloc(1,sizeof(GSWAppInstance));
|
||||||
|
memset(pInstance,0,sizeof(GSWAppInstance));
|
||||||
|
if (!p_pApp)
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"Intance %p created without App",
|
||||||
|
pInstance);
|
||||||
|
pInstance->pApp=p_pApp;
|
||||||
|
return pInstance;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWAppInstance_Free(GSWAppInstance* p_pInstance)
|
||||||
|
{
|
||||||
|
if (p_pInstance)
|
||||||
|
{
|
||||||
|
if (p_pInstance->pszHostName)
|
||||||
|
free(p_pInstance->pszHostName);
|
||||||
|
if (p_pInstance->pApp)
|
||||||
|
{
|
||||||
|
char szBuffer[128]="";
|
||||||
|
sprintf(szBuffer,"%d",p_pInstance->iInstance);
|
||||||
|
if (GSWDict_ValueForKey(&p_pInstance->pApp->stInstancesDict,szBuffer)==p_pInstance)
|
||||||
|
GSWDict_RemoveKey(&p_pInstance->pApp->stInstancesDict,szBuffer);
|
||||||
|
p_pInstance->pApp->iUsageCounter--;
|
||||||
|
};
|
||||||
|
free(p_pInstance);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
BOOL GSWAppInstance_FreeIFND(GSWAppInstance* p_pInstance)
|
||||||
|
{
|
||||||
|
if (p_pInstance->uOpenedRequestsNb==0)
|
||||||
|
{
|
||||||
|
GSWAppInstance_Free(p_pInstance);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWAppInstance_InternClear(GSWDictElem* p_pElem,void* p_pData)
|
||||||
|
{
|
||||||
|
GSWAppInstance* pInstance=(GSWAppInstance*)(p_pElem->pValue);
|
||||||
|
pInstance->fValid=FALSE;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
62
GSWAdaptors/common/GSWApp.h
Normal file
62
GSWAdaptors/common/GSWApp.h
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/* GSWApp.h - GSWeb: Adaptors: GSWApp & GSWAppInstance
|
||||||
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
Date: March 2000
|
||||||
|
|
||||||
|
This file is part of the GNUstep Web Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _GSWApp_h__
|
||||||
|
#define _GSWApp_h__
|
||||||
|
|
||||||
|
typedef struct _GSWApp
|
||||||
|
{
|
||||||
|
int iUsageCounter;
|
||||||
|
char* pszName;
|
||||||
|
int iIndex;//Current Instance Index
|
||||||
|
GSWDict stInstancesDict;
|
||||||
|
GSWDict stHeadersDict;
|
||||||
|
char* pszGSWExtensionsFrameworkWebServerResources;
|
||||||
|
BOOL fCanDump;
|
||||||
|
} GSWApp;
|
||||||
|
|
||||||
|
typedef struct _GSWAppInstance
|
||||||
|
{
|
||||||
|
GSWApp* pApp;
|
||||||
|
int iInstance;
|
||||||
|
char* pszHostName;
|
||||||
|
int iPort;
|
||||||
|
time_t timeNextRetryTime; // Timer
|
||||||
|
unsigned int uOpenedRequestsNb;
|
||||||
|
BOOL fValid;
|
||||||
|
} GSWAppInstance;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
GSWApp* GSWApp_New();
|
||||||
|
void GSWApp_Free(GSWApp* p_pApp);
|
||||||
|
void GSWApp_FreeNotValidInstances(GSWApp* p_pApp);
|
||||||
|
void GSWApp_AppsClearInstances(GSWDict* p_pAppsDict);
|
||||||
|
void GSWApp_AddInstance(GSWApp* p_pApp,CONST char* p_pszInstanceNum,GSWAppInstance* p_pInstance);
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
GSWAppInstance* GSWAppInstance_New(GSWApp* p_pApp);
|
||||||
|
void GSWAppInstance_Free(GSWAppInstance* p_pInstance);
|
||||||
|
BOOL GSWAppInstance_FreeIFND(GSWAppInstance* p_pInstance);
|
||||||
|
|
||||||
|
#endif // _GSWApp_h__
|
||||||
|
|
|
@ -32,27 +32,27 @@ typedef struct _STAppConnectHandle
|
||||||
typedef STAppConnectHandle* AppConnectHandle;
|
typedef STAppConnectHandle* AppConnectHandle;
|
||||||
|
|
||||||
|
|
||||||
AppConnectHandle GSWApp_Open(void* p_pLogServerData,
|
AppConnectHandle GSWApp_Open(GSWAppRequest* p_pAppRequest,
|
||||||
GSWAppRequest* p_pAppRequest);
|
void* p_pLogServerData);
|
||||||
void GSWApp_Close(void* p_pLogServerData,
|
void GSWApp_Close(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle);
|
void* p_pLogServerData);
|
||||||
|
|
||||||
int GSWApp_SendBlock(void* p_pLogServerData,
|
int GSWApp_SendBlock(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
|
||||||
CONST char* p_pszBuffer,
|
CONST char* p_pszBuffer,
|
||||||
int p_iSize);
|
int p_iSize,
|
||||||
int GSWApp_ReceiveBlock(void* p_pLogServerData,
|
void* p_pLogServerData);
|
||||||
AppConnectHandle p_handle,
|
int GSWApp_ReceiveBlock(AppConnectHandle p_handle,
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize);
|
int p_iBufferSize,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
int GSWApp_SendLine(void* p_pLogServerData,
|
int GSWApp_SendLine(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
CONST char* p_pszBuffer,
|
||||||
CONST char* p_pszBuffer);
|
void* p_pLogServerData);
|
||||||
int GSWApp_ReceiveLine(void* p_pLogServerData,
|
int GSWApp_ReceiveLine(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize);
|
int p_iBufferSize,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
|
|
||||||
#endif // _GSWAppConnect_h__
|
#endif // _GSWAppConnect_h__
|
||||||
|
|
|
@ -35,8 +35,8 @@
|
||||||
|
|
||||||
typedef SYS_NETFD AppConnectNSSocketHandle;
|
typedef SYS_NETFD AppConnectNSSocketHandle;
|
||||||
|
|
||||||
AppConnectHandle GSWApp_Open(void* p_pLogServerData,
|
AppConnectHandle GSWApp_Open(GSWAppRequest* p_pAppRequest,
|
||||||
GSWAppRequest* p_pAppRequest)
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
AppConnectHandle handle=NULL;
|
AppConnectHandle handle=NULL;
|
||||||
if (!p_pAppRequest)
|
if (!p_pAppRequest)
|
||||||
|
@ -92,8 +92,8 @@ AppConnectHandle GSWApp_Open(void* p_pLogServerData,
|
||||||
return handle;
|
return handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWApp_Close(void* p_pLogServerData,
|
void GSWApp_Close(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle)
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
{
|
{
|
||||||
|
@ -103,9 +103,9 @@ void GSWApp_Close(void* p_pLogServerData,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
int GSWApp_SendLine(void* p_pLogServerData,
|
int GSWApp_SendLine(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
CONST char* p_pszBuffer,
|
||||||
CONST char* p_pszBuffer)
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
|
@ -113,10 +113,10 @@ int GSWApp_SendLine(void* p_pLogServerData,
|
||||||
return iRetValue;
|
return iRetValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GSWApp_SendBlock(void* p_pLogServerData,
|
int GSWApp_SendBlock(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
|
||||||
CONST char* p_pszBuffer,
|
CONST char* p_pszBuffer,
|
||||||
int p_iSize)
|
int p_iSize,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
|
@ -142,10 +142,10 @@ int GSWApp_SendBlock(void* p_pLogServerData,
|
||||||
return iRetValue;
|
return iRetValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
int GSWApp_ReceiveLine(void* p_pLogServerData,
|
int GSWApp_ReceiveLine(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize)
|
int p_iBufferSize,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
|
@ -180,10 +180,10 @@ int GSWApp_ReceiveLine(void* p_pLogServerData,
|
||||||
return iRetValue;
|
return iRetValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
int GSWApp_ReceiveBlock(void* p_pLogServerData,
|
int GSWApp_ReceiveBlock(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize)
|
int p_iBufferSize,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
|
|
|
@ -38,6 +38,7 @@
|
||||||
#include "GSWAppRequestStruct.h"
|
#include "GSWAppRequestStruct.h"
|
||||||
#include "GSWAppConnect.h"
|
#include "GSWAppConnect.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
typedef struct _STAppConnectSocket
|
typedef struct _STAppConnectSocket
|
||||||
{
|
{
|
||||||
int iSocketDescr;
|
int iSocketDescr;
|
||||||
|
@ -46,16 +47,19 @@ typedef struct _STAppConnectSocket
|
||||||
} STAppConnectSocket;
|
} STAppConnectSocket;
|
||||||
typedef STAppConnectSocket* AppConnectSocketHandle;
|
typedef STAppConnectSocket* AppConnectSocketHandle;
|
||||||
|
|
||||||
AppConnectHandle GSWApp_Open(void* p_pLogServerData,GSWAppRequest* p_pAppRequest)
|
//--------------------------------------------------------------------
|
||||||
|
AppConnectHandle GSWApp_Open(GSWAppRequest* p_pAppRequest,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
AppConnectHandle handle=NULL;
|
AppConnectHandle handle=NULL;
|
||||||
if (!p_pAppRequest)
|
if (!p_pAppRequest)
|
||||||
{
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,p_pLogServerData,
|
||||||
|
"No AppRequest !");
|
||||||
//TODO
|
//TODO
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
PSTHostent pHost = GSWUtil_FindHost(p_pLogServerData,p_pAppRequest->pszHost);
|
PSTHostent pHost = GSWUtil_FindHost(p_pAppRequest->pszHost,p_pLogServerData);
|
||||||
if (!pHost)
|
if (!pHost)
|
||||||
{
|
{
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,
|
GSWLog(GSW_ERROR,p_pLogServerData,
|
||||||
|
@ -143,7 +147,8 @@ AppConnectHandle GSWApp_Open(void* p_pLogServerData,GSWAppRequest* p_pAppRequest
|
||||||
return handle;
|
return handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWApp_Close(void* p_pLogServerData,AppConnectHandle p_handle)
|
//--------------------------------------------------------------------
|
||||||
|
void GSWApp_Close(AppConnectHandle p_handle,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
|
@ -168,7 +173,8 @@ void GSWApp_Close(void* p_pLogServerData,AppConnectHandle p_handle)
|
||||||
*/
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
int GSWApp_SendLine(void* p_pLogServerData,AppConnectHandle p_handle, CONST char* p_pszBuffer)
|
//--------------------------------------------------------------------
|
||||||
|
int GSWApp_SendLine(AppConnectHandle p_handle, CONST char* p_pszBuffer,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
|
@ -190,13 +196,14 @@ int GSWApp_SendLine(void* p_pLogServerData,AppConnectHandle p_handle, CONST char
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
return iRetValue;
|
return iRetValue;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
|
||||||
int GSWApp_SendBlock(void* p_pLogServerData,
|
//--------------------------------------------------------------------
|
||||||
AppConnectHandle p_handle,
|
int GSWApp_SendBlock(AppConnectHandle p_handle,
|
||||||
CONST char* p_pszBuffer,
|
CONST char* p_pszBuffer,
|
||||||
int p_iSize)
|
int p_iSize,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
int iBytesSent=0;
|
int iBytesSent=0;
|
||||||
|
@ -221,11 +228,11 @@ int GSWApp_SendBlock(void* p_pLogServerData,
|
||||||
return iRetValue;
|
return iRetValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
int GSWApp_ReceiveLine(void* p_pLogServerData,
|
int GSWApp_ReceiveLine(AppConnectHandle p_handle,
|
||||||
AppConnectHandle p_handle,
|
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize)
|
int p_iBufferSize,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
|
@ -245,10 +252,11 @@ int GSWApp_ReceiveLine(void* p_pLogServerData,
|
||||||
return iRetValue;
|
return iRetValue;
|
||||||
};
|
};
|
||||||
|
|
||||||
int GSWApp_ReceiveBlock(void* p_pLogServerData,
|
//--------------------------------------------------------------------
|
||||||
AppConnectHandle p_handle,
|
int GSWApp_ReceiveBlock(AppConnectHandle p_handle,
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize)
|
int p_iBufferSize,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iRetValue=-1;
|
int iRetValue=-1;
|
||||||
if (p_handle)
|
if (p_handle)
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
|
#include "GSWString.h"
|
||||||
#include "GSWConfig.h"
|
#include "GSWConfig.h"
|
||||||
#include "GSWURLUtil.h"
|
#include "GSWURLUtil.h"
|
||||||
#include "GSWAppRequestStruct.h"
|
#include "GSWAppRequestStruct.h"
|
||||||
|
@ -39,102 +40,12 @@
|
||||||
#include "GSWAppRequest.h"
|
#include "GSWAppRequest.h"
|
||||||
#include "GSWHTTPHeaders.h"
|
#include "GSWHTTPHeaders.h"
|
||||||
#include "GSWLoadBalancing.h"
|
#include "GSWLoadBalancing.h"
|
||||||
|
#include "GSWTemplates.h"
|
||||||
|
|
||||||
unsigned long glbRequestsNb = 0;
|
unsigned long glbRequestsNb = 0;
|
||||||
unsigned long glbResponsesNb = 0;
|
unsigned long glbResponsesNb = 0;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequest,
|
|
||||||
GSWURLComponents* p_pURLComponents,
|
|
||||||
GSWAppRequest* p_pAppRequest,
|
|
||||||
CONST char* p_pszHTTPVersion,
|
|
||||||
void* p_pLogServerData);
|
|
||||||
|
|
||||||
GSWHTTPResponse* GSWAppRequest_HandleRequest(GSWHTTPRequest** p_ppHTTPRequest,
|
|
||||||
GSWURLComponents* p_pURLComponents,
|
|
||||||
CONST char* p_pszHTTPVersion,
|
|
||||||
CONST char* p_pszDocRoot,
|
|
||||||
CONST char* p_pszTestAppName,
|
|
||||||
void* p_pLogServerData)
|
|
||||||
{
|
|
||||||
GSWHTTPResponse* pHTTPResponse=NULL;
|
|
||||||
glbRequestsNb++;
|
|
||||||
|
|
||||||
if (p_pURLComponents->stAppName.iLength<=0
|
|
||||||
|| !p_pURLComponents->stAppName.pszStart)
|
|
||||||
{
|
|
||||||
pHTTPResponse=GSWHTTPResponse_BuildErrorResponse("No Application Name");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char szAppName[MAXPATHLEN+1]="";
|
|
||||||
char szHost[MAXHOSTNAMELEN+1]="";
|
|
||||||
GSWAppRequest stAppRequest;
|
|
||||||
memset(&stAppRequest,0,sizeof(stAppRequest));
|
|
||||||
|
|
||||||
// Get App Name
|
|
||||||
strncpy(szAppName,
|
|
||||||
p_pURLComponents->stAppName.pszStart,
|
|
||||||
p_pURLComponents->stAppName.iLength);
|
|
||||||
szAppName[p_pURLComponents->stAppName.iLength]=0;
|
|
||||||
|
|
||||||
DeleteTrailingSlash(szAppName);
|
|
||||||
if (strcmp(szAppName,p_pszTestAppName) == 0)
|
|
||||||
pHTTPResponse=GSWHTTPResponse_BuildTestResponse(p_pLogServerData,*p_ppHTTPRequest);
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Get Host Name
|
|
||||||
if (p_pURLComponents->stAppHost.iLength>0 && p_pURLComponents->stAppHost.pszStart)
|
|
||||||
{
|
|
||||||
strncpy(szHost,
|
|
||||||
p_pURLComponents->stAppHost.pszStart,
|
|
||||||
p_pURLComponents->stAppHost.iLength);
|
|
||||||
szHost[p_pURLComponents->stAppHost.iLength] = '\0';
|
|
||||||
};
|
|
||||||
|
|
||||||
// Get Request Instance Number
|
|
||||||
|
|
||||||
// in URL ?
|
|
||||||
if (p_pURLComponents->stAppNumber.iLength>0 && p_pURLComponents->stAppNumber.pszStart)
|
|
||||||
stAppRequest.iInstance = atoi(p_pURLComponents->stAppNumber.pszStart);
|
|
||||||
|
|
||||||
// In Cookie ?
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CONST char* pszCookie=GSWHTTPRequest_HeaderForKey(*p_ppHTTPRequest,g_szHeader_Cookie);
|
|
||||||
if (pszCookie)
|
|
||||||
{
|
|
||||||
CONST char* pszInstanceCookie=strstr(pszCookie, g_szGSWeb_InstanceCookie);
|
|
||||||
if (pszInstanceCookie)
|
|
||||||
{
|
|
||||||
stAppRequest.iInstance = atoi(pszInstanceCookie + strlen(g_szGSWeb_InstanceCookie));
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"Cookie instance %d from %s",
|
|
||||||
stAppRequest.iInstance,
|
|
||||||
pszCookie);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
stAppRequest.pszName = szAppName;
|
|
||||||
stAppRequest.pszHost = szHost;
|
|
||||||
stAppRequest.pszDocRoot = p_pszDocRoot;
|
|
||||||
stAppRequest.pRequest = *p_ppHTTPRequest;
|
|
||||||
stAppRequest.uURLVersion = (p_pURLComponents->stVersion.pszStart) ?
|
|
||||||
atoi(p_pURLComponents->stVersion.pszStart) : GSWEB_VERSION_MAJOR;
|
|
||||||
|
|
||||||
GSWHTTPRequest_AddHeader(*p_ppHTTPRequest,
|
|
||||||
g_szHeader_GSWeb_ServerAdaptor,
|
|
||||||
g_szGSWeb_ServerAndAdaptorVersion);
|
|
||||||
pHTTPResponse=GSWAppRequest_SendAppRequestToApp(p_ppHTTPRequest,
|
|
||||||
p_pURLComponents,
|
|
||||||
&stAppRequest,
|
|
||||||
p_pszHTTPVersion,
|
|
||||||
p_pLogServerData);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
return pHTTPResponse;
|
|
||||||
}
|
|
||||||
|
|
||||||
GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequest,
|
GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequest,
|
||||||
GSWURLComponents* p_pURLComponents,
|
GSWURLComponents* p_pURLComponents,
|
||||||
GSWAppRequest* p_pAppRequest,
|
GSWAppRequest* p_pAppRequest,
|
||||||
|
@ -143,33 +54,37 @@ GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequ
|
||||||
{
|
{
|
||||||
GSWHTTPResponse* pHTTPResponse=NULL;
|
GSWHTTPResponse* pHTTPResponse=NULL;
|
||||||
BOOL fAppFound=FALSE;
|
BOOL fAppFound=FALSE;
|
||||||
|
BOOL fAppNotResponding=FALSE;
|
||||||
int iAttemptsRemaining=APP_CONNECT_RETRIES_NB;
|
int iAttemptsRemaining=APP_CONNECT_RETRIES_NB;
|
||||||
AppConnectHandle hConnect=NULL;
|
AppConnectHandle hConnect=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWAppRequest_SendAppRequestToApp");
|
||||||
|
|
||||||
if (p_pAppRequest->iInstance)
|
if (p_pAppRequest->iInstance)
|
||||||
fAppFound = GSWLoadBalancing_FindInstance(p_pLogServerData,p_pAppRequest);
|
fAppFound = GSWLoadBalancing_FindInstance(p_pAppRequest,p_pLogServerData);
|
||||||
else
|
else
|
||||||
fAppFound = GSWLoadBalancing_FindApp(p_pLogServerData,p_pAppRequest);
|
fAppFound = GSWLoadBalancing_FindApp(p_pAppRequest,p_pLogServerData);
|
||||||
|
|
||||||
if (!fAppFound)
|
if (!fAppFound)
|
||||||
{
|
{
|
||||||
|
GSWLog(GSW_WARNING,p_pLogServerData,"App not found");
|
||||||
//TODO
|
//TODO
|
||||||
// Call AppStart daemon
|
// Call AppStart daemon
|
||||||
};
|
};
|
||||||
|
|
||||||
while (!pHTTPResponse && fAppFound && iAttemptsRemaining-->0)
|
while (!pHTTPResponse && fAppFound && iAttemptsRemaining-->0)
|
||||||
{
|
{
|
||||||
|
fAppNotResponding=FALSE;
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"Trying to contact %s:%d on %s(%d)",
|
GSWLog(GSW_INFO,p_pLogServerData,"Trying to contact %s:%d on %s(%d)",
|
||||||
p_pAppRequest->pszName,
|
p_pAppRequest->pszName,
|
||||||
p_pAppRequest->iInstance,
|
p_pAppRequest->iInstance,
|
||||||
p_pAppRequest->pszHost,
|
p_pAppRequest->pszHost,
|
||||||
p_pAppRequest->iPort);
|
p_pAppRequest->iPort);
|
||||||
|
|
||||||
hConnect = GSWApp_Open(p_pLogServerData,p_pAppRequest);
|
hConnect = GSWApp_Open(p_pAppRequest,p_pLogServerData);
|
||||||
if (hConnect)
|
if (hConnect)
|
||||||
{
|
{
|
||||||
if (p_pAppRequest->eType==EAppType_LoadBalanced)
|
if (p_pAppRequest->eType==EAppType_LoadBalanced)
|
||||||
GSWLoadBalancing_StartAppRequest(p_pLogServerData,p_pAppRequest);
|
GSWLoadBalancing_StartAppRequest(p_pAppRequest,p_pLogServerData);
|
||||||
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"%s:%d on %s(%d) connected",
|
GSWLog(GSW_INFO,p_pLogServerData,"%s:%d on %s(%d) connected",
|
||||||
p_pAppRequest->pszName,
|
p_pAppRequest->pszName,
|
||||||
|
@ -180,13 +95,16 @@ GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequ
|
||||||
GSWHTTPRequest_HTTPToAppRequest(*p_ppHTTPRequest,
|
GSWHTTPRequest_HTTPToAppRequest(*p_ppHTTPRequest,
|
||||||
p_pAppRequest,
|
p_pAppRequest,
|
||||||
p_pURLComponents,
|
p_pURLComponents,
|
||||||
p_pszHTTPVersion);
|
p_pszHTTPVersion,
|
||||||
if (GSWHTTPRequest_SendRequest(p_pLogServerData,*p_ppHTTPRequest, hConnect) != 0)
|
p_pLogServerData);
|
||||||
|
if (GSWHTTPRequest_SendRequest(*p_ppHTTPRequest,
|
||||||
|
hConnect,
|
||||||
|
p_pLogServerData) != 0)
|
||||||
{
|
{
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"Failed to send request");
|
GSWLog(GSW_ERROR,p_pLogServerData,"Failed to send request");
|
||||||
GSWApp_Close(p_pLogServerData,hConnect);
|
GSWApp_Close(hConnect,p_pLogServerData);
|
||||||
hConnect=NULL;
|
hConnect=NULL;
|
||||||
pHTTPResponse=GSWHTTPResponse_BuildErrorResponse("No Response");
|
fAppNotResponding=TRUE;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -195,14 +113,13 @@ GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequ
|
||||||
(*p_ppHTTPRequest)->pszRequest);
|
(*p_ppHTTPRequest)->pszRequest);
|
||||||
|
|
||||||
p_pAppRequest->pRequest = NULL;
|
p_pAppRequest->pRequest = NULL;
|
||||||
pHTTPResponse = GSWHTTPResponse_GetResponse(p_pLogServerData,hConnect);
|
pHTTPResponse = GSWHTTPResponse_GetResponse(hConnect,p_pLogServerData);
|
||||||
// GSWLog(GSW_INFO,p_pLogServerData,"GetResponse End pHTTPResponse=%p",pHTTPResponse);
|
|
||||||
p_pAppRequest->pResponse = pHTTPResponse;
|
p_pAppRequest->pResponse = pHTTPResponse;
|
||||||
|
|
||||||
if (p_pAppRequest->eType == EAppType_LoadBalanced)
|
if (p_pAppRequest->eType == EAppType_LoadBalanced)
|
||||||
GSWLoadBalancing_StopAppRequest(p_pLogServerData,p_pAppRequest);
|
GSWLoadBalancing_StopAppRequest(p_pAppRequest,p_pLogServerData);
|
||||||
|
|
||||||
GSWApp_Close(p_pLogServerData,hConnect);
|
GSWApp_Close(hConnect,p_pLogServerData);
|
||||||
hConnect=NULL;
|
hConnect=NULL;
|
||||||
|
|
||||||
glbResponsesNb++;
|
glbResponsesNb++;
|
||||||
|
@ -217,7 +134,8 @@ GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequ
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"%s:%d NOT LISTENING on %s(%d)",
|
fAppNotResponding=TRUE;
|
||||||
|
GSWLog(GSW_WARNING,p_pLogServerData,"%s:%d NOT LISTENING on %s:%d",
|
||||||
p_pAppRequest->pszName,
|
p_pAppRequest->pszName,
|
||||||
p_pAppRequest->iInstance,
|
p_pAppRequest->iInstance,
|
||||||
p_pAppRequest->pszHost,
|
p_pAppRequest->pszHost,
|
||||||
|
@ -225,26 +143,31 @@ GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequ
|
||||||
//TODO
|
//TODO
|
||||||
/*
|
/*
|
||||||
if (p_pAppRequest->eType == EAppType_Auto)
|
if (p_pAppRequest->eType == EAppType_Auto)
|
||||||
GSWLoadBalancing_MarkNotRespondingApp(p_pLogServerData,p_pAppRequest);
|
GSWLoadBalancing_MarkNotRespondingApp(p_pAppRequest,p_pLogServerData);
|
||||||
|
|
||||||
else*/ if (p_pAppRequest->eType == EAppType_LoadBalanced)
|
else*/ if (p_pAppRequest->eType==EAppType_LoadBalanced)
|
||||||
{
|
{
|
||||||
GSWLoadBalancing_MarkNotRespondingApp(p_pLogServerData,p_pAppRequest);
|
GSWLoadBalancing_MarkNotRespondingApp(p_pAppRequest,p_pLogServerData);
|
||||||
if (iAttemptsRemaining-- > 0)
|
if (iAttemptsRemaining-->0)
|
||||||
fAppFound = GSWLoadBalancing_FindApp(p_pLogServerData,p_pAppRequest);
|
fAppFound=GSWLoadBalancing_FindApp(p_pAppRequest,p_pLogServerData);
|
||||||
};
|
};
|
||||||
pHTTPResponse = GSWHTTPResponse_BuildErrorResponse("No Response");
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
if (fAppNotResponding)
|
||||||
|
{
|
||||||
|
pHTTPResponse = GSWHTTPResponse_BuildErrorResponse(p_pAppRequest,
|
||||||
|
GSWTemplate_ErrorNoResponseMessage(TRUE),
|
||||||
|
p_pLogServerData);
|
||||||
|
};
|
||||||
if (!pHTTPResponse)
|
if (!pHTTPResponse)
|
||||||
{
|
{
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,
|
GSWLog(GSW_WARNING,p_pLogServerData,
|
||||||
"Application %s not found or not responding",
|
"Application %s not found or not responding",
|
||||||
p_pAppRequest->pszName);
|
p_pAppRequest->pszName);
|
||||||
pHTTPResponse = GSWDumpConfigFile(p_pLogServerData,p_pURLComponents);
|
pHTTPResponse = GSWDumpConfigFile(p_pURLComponents,p_pLogServerData);
|
||||||
if (!pHTTPResponse)
|
if (!pHTTPResponse)
|
||||||
{
|
{
|
||||||
pHTTPResponse = GSWHTTPResponse_BuildErrorResponse("No App Found");
|
pHTTPResponse = GSWHTTPResponse_BuildErrorResponse(p_pAppRequest,"No App Found",p_pLogServerData);
|
||||||
pHTTPResponse->uStatus = 404;
|
pHTTPResponse->uStatus = 404;
|
||||||
if (pHTTPResponse->pszStatusMessage)
|
if (pHTTPResponse->pszStatusMessage)
|
||||||
{
|
{
|
||||||
|
@ -254,7 +177,108 @@ GSWHTTPResponse* GSWAppRequest_SendAppRequestToApp(GSWHTTPRequest** p_ppHTTPRequ
|
||||||
pHTTPResponse->pszStatusMessage = strdup("File Not found");
|
pHTTPResponse->pszStatusMessage = strdup("File Not found");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
GSWHTTPRequest_Free(*p_ppHTTPRequest);
|
GSWHTTPRequest_Free(*p_ppHTTPRequest,p_pLogServerData);
|
||||||
*p_ppHTTPRequest=NULL;
|
*p_ppHTTPRequest=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWAppRequest_SendAppRequestToApp");
|
||||||
return pHTTPResponse;
|
return pHTTPResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
GSWHTTPResponse* GSWAppRequest_HandleRequest(GSWHTTPRequest** p_ppHTTPRequest,
|
||||||
|
GSWURLComponents* p_pURLComponents,
|
||||||
|
CONST char* p_pszHTTPVersion,
|
||||||
|
CONST char* p_pszDocRoot,
|
||||||
|
CONST char* p_pszTestAppName,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
GSWHTTPResponse* pHTTPResponse=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWAppRequest_HandleRequest");
|
||||||
|
glbRequestsNb++;
|
||||||
|
if (!p_pURLComponents)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,p_pLogServerData,"p_pURLComponents is NULL in GSWAppRequest_HandleRequest");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (p_pURLComponents->stAppName.iLength<=0
|
||||||
|
|| !p_pURLComponents->stAppName.pszStart)
|
||||||
|
{
|
||||||
|
pHTTPResponse=GSWHTTPResponse_BuildErrorResponse(NULL,"No Application Name",p_pLogServerData);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char szAppName[MAXPATHLEN+1]="";
|
||||||
|
char szHost[MAXHOSTNAMELEN+1]="";
|
||||||
|
GSWAppRequest stAppRequest;
|
||||||
|
memset(&stAppRequest,0,sizeof(stAppRequest));
|
||||||
|
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Copy AppName");
|
||||||
|
// Get App Name
|
||||||
|
strncpy(szAppName,
|
||||||
|
p_pURLComponents->stAppName.pszStart,
|
||||||
|
p_pURLComponents->stAppName.iLength);
|
||||||
|
szAppName[p_pURLComponents->stAppName.iLength]=0;
|
||||||
|
|
||||||
|
DeleteTrailingSlash(szAppName);
|
||||||
|
if (strcmp(szAppName,p_pszTestAppName)==0)
|
||||||
|
pHTTPResponse=GSWHTTPResponse_BuildStatusResponse(*p_ppHTTPRequest,p_pLogServerData);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Get HostByName");
|
||||||
|
// Get Host Name
|
||||||
|
if (p_pURLComponents->stAppHost.iLength>0 && p_pURLComponents->stAppHost.pszStart)
|
||||||
|
{
|
||||||
|
strncpy(szHost,
|
||||||
|
p_pURLComponents->stAppHost.pszStart,
|
||||||
|
p_pURLComponents->stAppHost.iLength);
|
||||||
|
szHost[p_pURLComponents->stAppHost.iLength] = '\0';
|
||||||
|
};
|
||||||
|
|
||||||
|
// Get Request Instance Number
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Get Request Instance Number");
|
||||||
|
|
||||||
|
// in URL ?
|
||||||
|
if (p_pURLComponents->stAppNumber.iLength>0 && p_pURLComponents->stAppNumber.pszStart)
|
||||||
|
stAppRequest.iInstance = atoi(p_pURLComponents->stAppNumber.pszStart);
|
||||||
|
|
||||||
|
// In Cookie ?
|
||||||
|
else
|
||||||
|
{
|
||||||
|
CONST char* pszCookie=GSWHTTPRequest_HeaderForKey(*p_ppHTTPRequest,g_szHeader_Cookie);
|
||||||
|
if (pszCookie)
|
||||||
|
{
|
||||||
|
CONST char* pszInstanceCookie=strstr(pszCookie, g_szGSWeb_InstanceCookie);
|
||||||
|
if (pszInstanceCookie)
|
||||||
|
{
|
||||||
|
stAppRequest.iInstance = atoi(pszInstanceCookie + strlen(g_szGSWeb_InstanceCookie));
|
||||||
|
GSWLog(GSW_INFO,p_pLogServerData,"Cookie instance %d from %s",
|
||||||
|
stAppRequest.iInstance,
|
||||||
|
pszCookie);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
stAppRequest.pszName = szAppName;
|
||||||
|
stAppRequest.pszHost = szHost;
|
||||||
|
stAppRequest.pszDocRoot = p_pszDocRoot;
|
||||||
|
stAppRequest.pRequest = *p_ppHTTPRequest;
|
||||||
|
stAppRequest.uURLVersion = (p_pURLComponents->stVersion.pszStart) ?
|
||||||
|
atoi(p_pURLComponents->stVersion.pszStart) : GSWEB_VERSION_MAJOR;
|
||||||
|
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Add Header");
|
||||||
|
GSWHTTPRequest_AddHeader(*p_ppHTTPRequest,
|
||||||
|
g_szHeader_GSWeb_ServerAdaptor,
|
||||||
|
g_szGSWeb_ServerAndAdaptorVersion);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"SendAppRequestToApp");
|
||||||
|
pHTTPResponse=GSWAppRequest_SendAppRequestToApp(p_ppHTTPRequest,
|
||||||
|
p_pURLComponents,
|
||||||
|
&stAppRequest,
|
||||||
|
p_pszHTTPVersion,
|
||||||
|
p_pLogServerData);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWAppRequest_HandleRequest");
|
||||||
|
return pHTTPResponse;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#ifndef _GSWAppRequestStruct_h__
|
#ifndef _GSWAppRequestStruct_h__
|
||||||
#define _GSWAppRequestStruct_h__
|
#define _GSWAppRequestStruct_h__
|
||||||
|
|
||||||
|
#include "GSWApp.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
@ -49,7 +51,7 @@ typedef struct _GSWAppRequest
|
||||||
CONST char* pszDocRoot; // Doc Root
|
CONST char* pszDocRoot; // Doc Root
|
||||||
void* pRequest; // HTTPRequest
|
void* pRequest; // HTTPRequest
|
||||||
void* pResponse; // HTTPResponse
|
void* pResponse; // HTTPResponse
|
||||||
void* pLoadBalancingData; // Load Balancing Data
|
GSWAppInstance* pAppInstance;
|
||||||
} GSWAppRequest;
|
} GSWAppRequest;
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -21,65 +21,61 @@
|
||||||
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// $Id$
|
||||||
|
|
||||||
#ifndef _GSWConfig_h__
|
#ifndef _GSWConfig_h__
|
||||||
#define _GSWConfig_h__
|
#define _GSWConfig_h__
|
||||||
|
|
||||||
#include <proplist.h>
|
#include <proplist.h>
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include "GSWList.h"
|
#include "GSWList.h"
|
||||||
|
#include "GSWDict.h"
|
||||||
|
#include "GSWLock.h"
|
||||||
|
#include "GSWString.h"
|
||||||
|
#include "GSWApp.h"
|
||||||
|
|
||||||
|
extern GSWLock g_lockAppList;
|
||||||
|
extern GSWDict* g_pAppDict;
|
||||||
|
extern time_t config_mtime;
|
||||||
|
|
||||||
// AppName=Instance@Hostname:Port[ Key=Value]*
|
|
||||||
|
|
||||||
extern const char* g_szGSWeb_AdaptorVersion;
|
extern const char* g_szGSWeb_AdaptorVersion;
|
||||||
|
|
||||||
extern const char* g_szGSWeb_Prefix;
|
extern const char* g_szGSWeb_Prefix;
|
||||||
extern const char* g_szGSWeb_Handler;
|
extern const char* g_szGSWeb_Handler;
|
||||||
|
extern const char* g_szGSWeb_StatusResponseAppName;
|
||||||
|
|
||||||
|
|
||||||
extern const char* g_szGSWeb_AppExtention;
|
extern const char* g_szGSWeb_AppExtention;
|
||||||
|
|
||||||
extern const char* g_szGSWeb_MimeType;
|
extern const char* g_szGSWeb_MimeType;
|
||||||
extern const char* g_szGSWeb_Conf_DocRoot;
|
//extern const char* g_szGSWeb_Conf_DocRoot;
|
||||||
extern const char* g_szGSWeb_Conf_ConfigFilePath;
|
extern const char* g_szGSWeb_Conf_ConfigFilePath;
|
||||||
|
|
||||||
|
|
||||||
// Apache
|
// Apache
|
||||||
|
#if defined(Apache)
|
||||||
extern const char* g_szGSWeb_Conf_Alias;
|
extern const char* g_szGSWeb_Conf_Alias;
|
||||||
|
#endif
|
||||||
|
|
||||||
// Netscape
|
// Netscape
|
||||||
|
#if defined(Netscape)
|
||||||
extern const char* g_szGSWeb_Conf_PathTrans;
|
extern const char* g_szGSWeb_Conf_PathTrans;
|
||||||
extern const char* g_szGSWeb_Conf_AppRoot;
|
extern const char* g_szGSWeb_Conf_AppRoot;
|
||||||
extern const char* g_szGSWeb_Conf_Name;
|
extern const char* g_szGSWeb_Conf_Name;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
extern const char* g_szGSWeb_DefaultConfigFilePath;
|
|
||||||
extern const char* g_szGSWeb_DefaultLogFilePath;
|
|
||||||
extern const char* g_szGSWeb_DefaultLogFlagPath;
|
|
||||||
extern const char* g_szGSWeb_DefaultDumpFlagPath;
|
|
||||||
|
|
||||||
|
|
||||||
extern const char* g_szGSWeb_DefaultGSWExtensionsFrameworkWebServerResources;
|
|
||||||
|
|
||||||
extern const char* g_szGSWeb_InstanceCookie;
|
extern const char* g_szGSWeb_InstanceCookie;
|
||||||
|
|
||||||
extern const char* g_szGSWeb_Server;
|
extern const char* g_szGSWeb_Server;
|
||||||
extern const char* g_szGSWeb_ServerAndAdaptorVersion;
|
extern const char* g_szGSWeb_ServerAndAdaptorVersion;
|
||||||
|
|
||||||
extern const char* g_szDumpConfFile_Head;
|
|
||||||
extern const char* g_szDumpConfFile_Foot;
|
|
||||||
|
|
||||||
extern const char* const g_szGNUstep;
|
extern const char* const g_szGNUstep;
|
||||||
extern const char* const g_szOKGSWeb;
|
extern const char* const g_szOKGSWeb;
|
||||||
extern const char* const g_szOKStatus;
|
extern const char* const g_szOKStatus;
|
||||||
|
|
||||||
extern const char* g_szErrorResponseHTMLTextTpl;
|
|
||||||
|
|
||||||
typedef struct _STGSWConfigEntry
|
|
||||||
{
|
|
||||||
const char* pszAppName;
|
|
||||||
int iInstance;
|
|
||||||
const char* pszHostName;
|
|
||||||
int iPort;
|
|
||||||
GSWDict* pParams;
|
|
||||||
} STGSWConfigEntry;
|
|
||||||
|
|
||||||
typedef enum
|
typedef enum
|
||||||
{
|
{
|
||||||
|
@ -94,49 +90,44 @@ typedef enum
|
||||||
EGSWConfigResult__Add = 1
|
EGSWConfigResult__Add = 1
|
||||||
} EGSWConfigCallType;
|
} EGSWConfigCallType;
|
||||||
|
|
||||||
typedef struct _GSWApp
|
typedef struct _GSWConfig
|
||||||
{
|
{
|
||||||
char* pszName;
|
char* pszConfigFilePath;
|
||||||
int iIndex;
|
char* pszGSWExtensionsFrameworkWebServerResources;
|
||||||
GSWList stInstances;
|
BOOL fCanDumpStatus;
|
||||||
} GSWApp;
|
} GSWConfig;
|
||||||
|
|
||||||
typedef struct _GSWAppInstance
|
|
||||||
{
|
|
||||||
int iInstance;
|
|
||||||
char* pszHost;
|
|
||||||
int iPort;
|
|
||||||
time_t timeNextRetryTime; // Timer
|
|
||||||
unsigned int uOpenedRequestsNb;
|
|
||||||
BOOL fValid;
|
|
||||||
} GSWAppInstance;
|
|
||||||
|
|
||||||
extern proplist_t configKey__Applications;
|
|
||||||
extern proplist_t configKey__InstanceNum;
|
|
||||||
extern proplist_t configKey__Host;
|
|
||||||
extern proplist_t configKey__Port;
|
|
||||||
extern proplist_t configKey__Parameters;
|
|
||||||
|
|
||||||
EGSWConfigResult GSWConfig_ReadIFND(CONST char* p_pszConfigPath,
|
EGSWConfigResult GSWConfig_ReadIFND(CONST char* p_pszConfigPath,
|
||||||
time_t* p_pLastReadTime,
|
time_t* p_pLastReadTime,
|
||||||
proplist_t* p_ppPropList,
|
proplist_t* p_ppPropList,//Please, PLRelease it after used !
|
||||||
void* p_pLogServerData);
|
void* p_pLogServerData);
|
||||||
|
|
||||||
proplist_t GSWConfig_GetApplicationsFromConfig(proplist_t p_propListConfig);
|
proplist_t GSWConfig_GetApplicationsFromConfig(proplist_t p_propListConfig,void* p_pLogServerData);
|
||||||
proplist_t GSWConfig_ApplicationKeyFromApplicationsKey(proplist_t p_propListApplicationsKeys,
|
proplist_t GSWConfig_ApplicationKeyFromApplicationsKey(proplist_t p_propListApplicationsKeys,
|
||||||
int p_iIndex);
|
int p_iIndex,
|
||||||
proplist_t GSWConfig_InstancesFromApplication(proplist_t p_propListApplication);
|
void* p_pLogServerData);
|
||||||
|
proplist_t GSWConfig_InstancesFromApplication(proplist_t p_propListApplication,void* p_pLogServerData);
|
||||||
proplist_t GSWConfig_ApplicationFromApplications(proplist_t p_propListApplications,
|
proplist_t GSWConfig_ApplicationFromApplications(proplist_t p_propListApplications,
|
||||||
proplist_t p_propListApplicationKey);
|
proplist_t p_propListApplicationKey,void* p_pLogServerData);
|
||||||
proplist_t GSWConfig_ApplicationsKeysFromApplications(proplist_t p_propListApplications);
|
proplist_t GSWConfig_ApplicationsKeysFromApplications(proplist_t p_propListApplications,void* p_pLogServerData);
|
||||||
proplist_t GSWConfig_ApplicationsKeysFromConfig(proplist_t p_propListConfig);
|
proplist_t GSWConfig_ApplicationsKeysFromConfig(proplist_t p_propListConfig,void* p_pLogServerData);
|
||||||
BOOL GSWConfig_PropListInstanceToInstanceEntry(STGSWConfigEntry* p_pInstanceEntry,
|
|
||||||
proplist_t p_propListInstance,
|
|
||||||
CONST char* p_pszAppName);
|
|
||||||
|
|
||||||
|
GSWConfig* GSWConfig_GetConfig();
|
||||||
|
BOOL GSWConfig_CanDumpStatus();
|
||||||
CONST char* GSWConfig_GetConfigFilePath();
|
CONST char* GSWConfig_GetConfigFilePath();
|
||||||
void GSWConfig_SetConfigFilePath(CONST char* p_pszConfigFilePath);
|
void GSWConfig_SetConfigFilePath(CONST char* p_pszConfigFilePath);
|
||||||
|
GSWString* GSWConfig_DumpGSWApps(const char* p_pszReqApp,
|
||||||
|
const char* p_pszPrefix,
|
||||||
|
BOOL p_fForceDump,
|
||||||
|
BOOL p_fHTML,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
GSWApp* GSWConfig_GetApp(CONST char* p_pszAppName);
|
||||||
|
CONST char* GSWConfig_AdaptorBuilt();
|
||||||
|
CONST char* GSWConfig_ServerStringInfo();
|
||||||
|
CONST char* g_szGSWeb_AdaptorStringInfo();
|
||||||
|
CONST char* GSWConfig_ServerURL();
|
||||||
|
CONST char* g_szGSWeb_AdaptorURL();
|
||||||
|
|
||||||
#endif // _GSWConfig_h__
|
#endif // _GSWConfig_h__
|
||||||
|
|
||||||
|
|
|
@ -29,49 +29,75 @@
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
|
|
||||||
|
void GSWDict_SetCapacity(GSWDict* p_pDict,unsigned int p_uCapacity)
|
||||||
|
{
|
||||||
|
if (!p_pDict)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"NULL GSWDict");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p_uCapacity=max(16,p_uCapacity);
|
||||||
|
if (p_uCapacity>p_pDict->uCapacity)
|
||||||
|
{
|
||||||
|
if (p_pDict->pElems)
|
||||||
|
p_pDict->pElems = realloc(p_pDict->pElems,p_uCapacity*sizeof(GSWDictElem));
|
||||||
|
else
|
||||||
|
p_pDict->pElems = malloc(p_uCapacity*sizeof(GSWDictElem));
|
||||||
|
p_pDict->uCapacity = p_uCapacity;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
GSWDict *GSWDict_New(unsigned int p_uCapacity)
|
GSWDict *GSWDict_New(unsigned int p_uCapacity)
|
||||||
{
|
{
|
||||||
GSWDict* pDict = malloc(sizeof(GSWDict));
|
GSWDict* pDict = malloc(sizeof(GSWDict));
|
||||||
memset(pDict,0,sizeof(GSWDict));
|
memset(pDict,0,sizeof(GSWDict));
|
||||||
pDict->uCapacity = (p_uCapacity==0) ? 16 : p_uCapacity;
|
GSWDict_SetCapacity(pDict,max(16,p_uCapacity));
|
||||||
pDict->pElems = malloc(sizeof(GSWDictElem) * pDict->uCapacity);
|
|
||||||
return pDict;
|
return pDict;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWDict_FreeElem(GSWDictElem* p_pElem,void* p_pData)
|
void GSWDict_FreeElem(GSWDictElem* p_pElem,void* p_pData)
|
||||||
{
|
{
|
||||||
if (p_pElem->pszKey)
|
if (!p_pElem)
|
||||||
{
|
{
|
||||||
free((char*)p_pElem->pszKey);
|
GSWLog(GSW_CRITICAL,NULL,"NULL GSWDict pElem");
|
||||||
p_pElem->pszKey=NULL;
|
}
|
||||||
};
|
else
|
||||||
if (p_pElem->pValue && p_pElem->fValueOwner)
|
|
||||||
{
|
{
|
||||||
free((void*)p_pElem->pValue);
|
if (p_pElem->pszKey)
|
||||||
|
{
|
||||||
|
free((char*)p_pElem->pszKey);
|
||||||
|
p_pElem->pszKey=NULL;
|
||||||
|
};
|
||||||
|
if (p_pElem->pValue && p_pElem->fValueOwner)
|
||||||
|
{
|
||||||
|
free((void*)p_pElem->pValue);
|
||||||
|
};
|
||||||
|
p_pElem->pValue=NULL;
|
||||||
};
|
};
|
||||||
p_pElem->pValue=NULL;
|
};
|
||||||
|
|
||||||
|
void GSWDict_FreeElements(GSWDict* p_pDict)
|
||||||
|
{
|
||||||
|
GSWDict_PerformForAllElem(p_pDict,GSWDict_FreeElem,NULL);
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWDict_Free(GSWDict* p_pDict)
|
void GSWDict_Free(GSWDict* p_pDict)
|
||||||
{
|
{
|
||||||
GSWDict_PerformForAllElem(p_pDict,GSWDict_FreeElem,NULL);
|
if (!p_pDict)
|
||||||
if (p_pDict->pElems)
|
{
|
||||||
free(p_pDict->pElems);
|
GSWLog(GSW_ERROR,NULL,"NULL GSWDict");
|
||||||
free(p_pDict);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GSWDict_FreeElements(p_pDict);
|
||||||
|
if (p_pDict->pElems)
|
||||||
|
free(p_pDict->pElems);
|
||||||
|
free(p_pDict);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWDict_SetCapacity(GSWDict* p_pDict,unsigned int p_uCapacity)
|
|
||||||
{
|
|
||||||
if (p_uCapacity>p_pDict->uCapacity)
|
|
||||||
{
|
|
||||||
if (p_pDict->pElems)
|
|
||||||
p_pDict->pElems = realloc(p_pDict->pElems,p_uCapacity*sizeof(GSWDictElem));
|
|
||||||
else
|
|
||||||
p_pDict->pElems = malloc(p_uCapacity*sizeof(GSWDictElem));
|
|
||||||
};
|
|
||||||
p_pDict->uCapacity = p_uCapacity;
|
|
||||||
};
|
|
||||||
|
|
||||||
static GSWDictElem* GSWDict_FindFirstNullKey(GSWDict* p_pDict)
|
static GSWDictElem* GSWDict_FindFirstNullKey(GSWDict* p_pDict)
|
||||||
{
|
{
|
||||||
|
@ -83,27 +109,56 @@ static GSWDictElem* GSWDict_FindFirstNullKey(GSWDict* p_pDict)
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWDict_Add(GSWDict* p_pDict,CONST char* p_pszKey,CONST void* p_pValue,BOOL p_fValueOwner)
|
unsigned int GSWDict_Count(GSWDict* p_pDict)
|
||||||
{
|
{
|
||||||
GSWDictElem* pElem=NULL;
|
unsigned int uCount=0;
|
||||||
if (p_pDict->uCount>=p_pDict->uCapacity)
|
if (!p_pDict)
|
||||||
{
|
{
|
||||||
pElem=GSWDict_FindFirstNullKey(p_pDict);
|
GSWLog(GSW_CRITICAL,NULL,"NULL GSWDict");
|
||||||
if (!pElem)
|
|
||||||
{
|
|
||||||
GSWDict_SetCapacity(p_pDict,p_pDict->uCapacity*2);
|
|
||||||
pElem=p_pDict->pElems+p_pDict->uCount;
|
|
||||||
p_pDict->uCount++;
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
pElem=p_pDict->pElems+p_pDict->uCount;
|
int i=0;
|
||||||
p_pDict->uCount++;
|
GSWDictElem* pElem=NULL;
|
||||||
|
for (pElem=p_pDict->pElems;i<p_pDict->uCount;i++,pElem++)
|
||||||
|
if (pElem->pszKey)
|
||||||
|
uCount++;
|
||||||
|
};
|
||||||
|
return uCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
void GSWDict_Add(GSWDict* p_pDict,CONST char* p_pszKey,CONST void* p_pValue,BOOL p_fValueOwner)
|
||||||
|
{
|
||||||
|
GSWDictElem* pElem=NULL;
|
||||||
|
if (!p_pDict)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"NULL GSWDict");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (p_pDict->uCount>=p_pDict->uCapacity)
|
||||||
|
{
|
||||||
|
pElem=GSWDict_FindFirstNullKey(p_pDict);
|
||||||
|
if (!pElem)
|
||||||
|
{
|
||||||
|
GSWDict_SetCapacity(p_pDict,p_pDict->uCapacity*2);
|
||||||
|
pElem=p_pDict->pElems+p_pDict->uCount;
|
||||||
|
p_pDict->uCount++;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pElem=p_pDict->pElems+p_pDict->uCount;
|
||||||
|
p_pDict->uCount++;
|
||||||
|
};
|
||||||
|
if (!pElem)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"No pElem in GSWDict Add");
|
||||||
|
};
|
||||||
|
pElem->pszKey=strdup(p_pszKey);
|
||||||
|
pElem->pValue=p_pValue;
|
||||||
|
pElem->fValueOwner=p_fValueOwner;
|
||||||
};
|
};
|
||||||
pElem->pszKey=strdup(p_pszKey);
|
|
||||||
pElem->pValue=p_pValue;
|
|
||||||
pElem->fValueOwner=p_fValueOwner;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWDict_AddString(GSWDict* p_pDict,CONST char* p_pszKey,CONST char* p_pszValue,BOOL p_fValueOwner)
|
void GSWDict_AddString(GSWDict* p_pDict,CONST char* p_pszKey,CONST char* p_pszValue,BOOL p_fValueOwner)
|
||||||
|
@ -120,9 +175,16 @@ static GSWDictElem* GSWDict_FindKey(GSWDict* p_pDict,CONST char* p_pszKey)
|
||||||
{
|
{
|
||||||
int iIndex=0;
|
int iIndex=0;
|
||||||
GSWDictElem* pElem=NULL;
|
GSWDictElem* pElem=NULL;
|
||||||
for (pElem=p_pDict->pElems;iIndex<p_pDict->uCount;iIndex++,pElem++)
|
if (!p_pDict)
|
||||||
if (pElem->pszKey && strcasecmp(pElem->pszKey,p_pszKey)==0)
|
{
|
||||||
return pElem;
|
GSWLog(GSW_CRITICAL,NULL,"NULL GSWDict");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
for (pElem=p_pDict->pElems;iIndex<p_pDict->uCount;iIndex++,pElem++)
|
||||||
|
if (pElem->pszKey && strcasecmp(pElem->pszKey,p_pszKey)==0)
|
||||||
|
return pElem;
|
||||||
|
};
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -143,11 +205,39 @@ void GSWDict_PerformForAllElem(GSWDict* p_pDict,
|
||||||
void (*pFN)(GSWDictElem* p_pElem,void* p_pData),
|
void (*pFN)(GSWDictElem* p_pElem,void* p_pData),
|
||||||
void* p_pData)
|
void* p_pData)
|
||||||
{
|
{
|
||||||
int i=0;
|
if (!p_pDict)
|
||||||
GSWDictElem* pElem=NULL;
|
|
||||||
for (pElem=p_pDict->pElems;i<p_pDict->uCount;i++,pElem++)
|
|
||||||
{
|
{
|
||||||
if (pElem->pszKey)
|
GSWLog(GSW_CRITICAL,NULL,"NULL GSWDict");
|
||||||
pFN(pElem,p_pData);
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i=0;
|
||||||
|
GSWDictElem* pElem=NULL;
|
||||||
|
for (pElem=p_pDict->pElems;i<p_pDict->uCount;i++,pElem++)
|
||||||
|
{
|
||||||
|
if (pElem->pszKey)
|
||||||
|
pFN(pElem,p_pData);
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GSWList* GSWDict_AllKeys(GSWDict* p_pDict)
|
||||||
|
{
|
||||||
|
GSWList* pList=NULL;
|
||||||
|
if (!p_pDict)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,NULL,"NULL GSWDict");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
int i=0;
|
||||||
|
GSWDictElem* pElem=NULL;
|
||||||
|
pList=GSWList_New(p_pDict->uCount);
|
||||||
|
for (pElem=p_pDict->pElems;i<p_pDict->uCount;i++,pElem++)
|
||||||
|
{
|
||||||
|
if (pElem->pszKey)
|
||||||
|
GSWList_Add(pList,pElem->pszKey);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return pList;
|
||||||
|
};
|
||||||
|
|
|
@ -28,6 +28,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif // __cplusplus
|
#endif // __cplusplus
|
||||||
|
|
||||||
|
#include "GSWList.h"
|
||||||
|
|
||||||
typedef struct _GSWDictElem
|
typedef struct _GSWDictElem
|
||||||
{
|
{
|
||||||
CONST char *pszKey;
|
CONST char *pszKey;
|
||||||
|
@ -47,16 +49,21 @@ typedef struct _GSWDict
|
||||||
GSWDict *GSWDict_New(unsigned int p_uCapacity);
|
GSWDict *GSWDict_New(unsigned int p_uCapacity);
|
||||||
|
|
||||||
void GSWDict_Free(GSWDict* p_pDict);
|
void GSWDict_Free(GSWDict* p_pDict);
|
||||||
|
void GSWDict_FreeElements(GSWDict* p_pDict);
|
||||||
void GSWDict_Add(GSWDict* p_pDict,CONST char* p_pszKey,CONST void* p_pValue,BOOL p_fValueOwner);
|
void GSWDict_Add(GSWDict* p_pDict,CONST char* p_pszKey,CONST void* p_pValue,BOOL p_fValueOwner);
|
||||||
void GSWDict_AddString(GSWDict* p_pDict,CONST char* p_pszKey,CONST char* p_pValue,BOOL p_fValueOwner);
|
void GSWDict_AddString(GSWDict* p_pDict,CONST char* p_pszKey,CONST char* p_pValue,BOOL p_fValueOwner);
|
||||||
void GSWDict_AddStringDup(GSWDict* p_pDict,CONST char* p_pszKey,CONST char* p_pValue);
|
void GSWDict_AddStringDup(GSWDict* p_pDict,CONST char* p_pszKey,CONST char* p_pValue);
|
||||||
void GSWDict_RemoveKey(GSWDict* p_pDict, CONST char* p_pszKey);
|
void GSWDict_RemoveKey(GSWDict* p_pDict, CONST char* p_pszKey);
|
||||||
CONST void* GSWDict_ValueForKey(GSWDict* p_pDict, CONST char* p_pszKey);
|
CONST void* GSWDict_ValueForKey(GSWDict* p_pDict, CONST char* p_pszKey);
|
||||||
|
unsigned int GSWDict_Count(GSWDict* p_pDict);
|
||||||
|
|
||||||
void GSWDict_PerformForAllElem(GSWDict* p_pDict,
|
void GSWDict_PerformForAllElem(GSWDict* p_pDict,
|
||||||
void (*pFN)(GSWDictElem* p_pElem,void* p_pData),
|
void (*pFN)(GSWDictElem* p_pElem,void* p_pData),
|
||||||
void* p_pData);
|
void* p_pData);
|
||||||
|
|
||||||
|
//Free the list but Do Not Free Elements
|
||||||
|
GSWList* GSWDict_AllKeys(GSWDict* p_pDict);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // end of C header
|
} // end of C header
|
||||||
#endif //_cplusplus
|
#endif //_cplusplus
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
|
#include "GSWString.h"
|
||||||
#include "GSWURLUtil.h"
|
#include "GSWURLUtil.h"
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWConfig.h"
|
#include "GSWConfig.h"
|
||||||
|
@ -143,6 +144,7 @@ const char* g_szContentType_TextHtml="text/html";
|
||||||
/*const*/ GSWHeaderTranslationItem GSWHeaderTranslationTable[50];
|
/*const*/ GSWHeaderTranslationItem GSWHeaderTranslationTable[50];
|
||||||
int GSWHeaderTranslationTableItemsNb=0;
|
int GSWHeaderTranslationTableItemsNb=0;
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWHeaderTranslationTable_Init()
|
void GSWHeaderTranslationTable_Init()
|
||||||
{
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
|
|
|
@ -44,16 +44,21 @@ static char* GSWHTTPRequest_PackageHeaders(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
int p_iBufferSize);
|
int p_iBufferSize);
|
||||||
|
|
||||||
|
|
||||||
GSWHTTPRequest* GSWHTTPRequest_New(CONST char* p_pszMethod,char* p_pszURI)
|
//--------------------------------------------------------------------
|
||||||
|
GSWHTTPRequest* GSWHTTPRequest_New(CONST char* p_pszMethod,char* p_pszURI,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWHTTPRequest* pHTTPRequest=calloc(1,sizeof(GSWHTTPRequest));
|
GSWHTTPRequest* pHTTPRequest=calloc(1,sizeof(GSWHTTPRequest));
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPRequest_New");
|
||||||
pHTTPRequest->eMethod = GetHTTPRequestMethod(p_pszMethod);
|
pHTTPRequest->eMethod = GetHTTPRequestMethod(p_pszMethod);
|
||||||
pHTTPRequest->pszRequest = p_pszURI; // It will be freed
|
pHTTPRequest->pszRequest = p_pszURI; // It will be freed
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPRequest_New");
|
||||||
return pHTTPRequest;
|
return pHTTPRequest;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWHTTPRequest_Free(GSWHTTPRequest* p_pHTTPRequest)
|
//--------------------------------------------------------------------
|
||||||
|
void GSWHTTPRequest_Free(GSWHTTPRequest* p_pHTTPRequest,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPRequest_Free");
|
||||||
if (p_pHTTPRequest)
|
if (p_pHTTPRequest)
|
||||||
{
|
{
|
||||||
if (p_pHTTPRequest->pHeaders)
|
if (p_pHTTPRequest->pHeaders)
|
||||||
|
@ -74,36 +79,52 @@ void GSWHTTPRequest_Free(GSWHTTPRequest* p_pHTTPRequest)
|
||||||
free(p_pHTTPRequest);
|
free(p_pHTTPRequest);
|
||||||
p_pHTTPRequest=NULL;
|
p_pHTTPRequest=NULL;
|
||||||
};
|
};
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPRequest_Free");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
CONST char* GSWHTTPRequest_ValidateMethod(GSWHTTPRequest* p_pHTTPRequest)
|
CONST char* GSWHTTPRequest_ValidateMethod(GSWHTTPRequest* p_pHTTPRequest,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
switch(p_pHTTPRequest->eMethod)
|
CONST char* pszMsg=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPRequest_ValidateMethod");
|
||||||
|
if (!p_pHTTPRequest)
|
||||||
{
|
{
|
||||||
case ERequestMethod_None:
|
GSWLog(GSW_CRITICAL,p_pLogServerData,"No Request in GSWHTTPRequest_ValidateMethod");
|
||||||
return "GSWeb Application must be launched by HTTP Server";
|
pszMsg="No Request in GSWHTTPRequest_ValidateMethod";
|
||||||
break;
|
}
|
||||||
case ERequestMethod_Unknown:
|
else
|
||||||
case ERequestMethod_Head:
|
{
|
||||||
case ERequestMethod_Put:
|
switch(p_pHTTPRequest->eMethod)
|
||||||
return "Invalid Method";
|
{
|
||||||
|
case ERequestMethod_None:
|
||||||
|
pszMsg="GSWeb Application must be launched by HTTP Server";
|
||||||
|
break;
|
||||||
|
case ERequestMethod_Unknown:
|
||||||
|
case ERequestMethod_Head:
|
||||||
|
case ERequestMethod_Put:
|
||||||
|
pszMsg="Invalid Method";
|
||||||
break;
|
break;
|
||||||
case ERequestMethod_Get:
|
case ERequestMethod_Get:
|
||||||
case ERequestMethod_Post:
|
case ERequestMethod_Post:
|
||||||
default:
|
default:
|
||||||
return NULL;
|
pszMsg=NULL;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPRequest_ValidateMethod");
|
||||||
|
return pszMsg;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWHTTPRequest_HTTPToAppRequest(GSWHTTPRequest* p_pHTTPRequest,
|
void GSWHTTPRequest_HTTPToAppRequest(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
GSWAppRequest* p_pAppRequest,
|
GSWAppRequest* p_pAppRequest,
|
||||||
GSWURLComponents* p_pURLComponents,
|
GSWURLComponents* p_pURLComponents,
|
||||||
CONST char* p_pszHTTPVersion)
|
CONST char* p_pszHTTPVersion,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
char szInstanceBuffer[65]="";
|
char szInstanceBuffer[65]="";
|
||||||
char* pszDefaultHTTPVersion = "HTTP/1.0";
|
char* pszDefaultHTTPVersion = "HTTP/1.0";
|
||||||
int iHTTPVersionLength = p_pszHTTPVersion ? strlen(p_pszHTTPVersion) : strlen(pszDefaultHTTPVersion);
|
int iHTTPVersionLength = p_pszHTTPVersion ? strlen(p_pszHTTPVersion) : strlen(pszDefaultHTTPVersion);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPRequest_HTTPToAppRequest");
|
||||||
if (p_pAppRequest->iInstance > 0) /* should be -1 !!! */
|
if (p_pAppRequest->iInstance > 0) /* should be -1 !!! */
|
||||||
sprintf(szInstanceBuffer,"%d",p_pAppRequest->iInstance);
|
sprintf(szInstanceBuffer,"%d",p_pAppRequest->iInstance);
|
||||||
p_pURLComponents->stAppName.pszStart = p_pAppRequest->pszName;
|
p_pURLComponents->stAppName.pszStart = p_pAppRequest->pszName;
|
||||||
|
@ -119,8 +140,9 @@ void GSWHTTPRequest_HTTPToAppRequest(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
p_pHTTPRequest->pszRequest=NULL;
|
p_pHTTPRequest->pszRequest=NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
p_pHTTPRequest->pszRequest = malloc(8 + (GSWComposeURLLen(p_pURLComponents)+1) + iHTTPVersionLength);
|
p_pHTTPRequest->pszRequest=malloc(8
|
||||||
|
+(GSWComposeURLLen(p_pURLComponents,p_pLogServerData)+1)
|
||||||
|
+iHTTPVersionLength);
|
||||||
if (p_pHTTPRequest->uContentLength>0)
|
if (p_pHTTPRequest->uContentLength>0)
|
||||||
{
|
{
|
||||||
strcpy(p_pHTTPRequest->pszRequest,"POST ");
|
strcpy(p_pHTTPRequest->pszRequest,"POST ");
|
||||||
|
@ -131,7 +153,9 @@ void GSWHTTPRequest_HTTPToAppRequest(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
strcpy(p_pHTTPRequest->pszRequest,"GET ");
|
strcpy(p_pHTTPRequest->pszRequest,"GET ");
|
||||||
GSWHTTPRequest_AddHeader(p_pHTTPRequest,g_szHeader_GSWeb_RequestMethod,"GET");
|
GSWHTTPRequest_AddHeader(p_pHTTPRequest,g_szHeader_GSWeb_RequestMethod,"GET");
|
||||||
};
|
};
|
||||||
GSWComposeURL(p_pHTTPRequest->pszRequest+strlen(p_pHTTPRequest->pszRequest),p_pURLComponents);
|
GSWComposeURL(p_pHTTPRequest->pszRequest+strlen(p_pHTTPRequest->pszRequest),
|
||||||
|
p_pURLComponents,
|
||||||
|
p_pLogServerData);
|
||||||
strcat(p_pHTTPRequest->pszRequest," ");
|
strcat(p_pHTTPRequest->pszRequest," ");
|
||||||
if (p_pszHTTPVersion)
|
if (p_pszHTTPVersion)
|
||||||
strcat(p_pHTTPRequest->pszRequest,p_pszHTTPVersion);
|
strcat(p_pHTTPRequest->pszRequest,p_pszHTTPVersion);
|
||||||
|
@ -139,9 +163,11 @@ void GSWHTTPRequest_HTTPToAppRequest(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
strcat(p_pHTTPRequest->pszRequest,pszDefaultHTTPVersion);
|
strcat(p_pHTTPRequest->pszRequest,pszDefaultHTTPVersion);
|
||||||
strcat(p_pHTTPRequest->pszRequest,"\n");
|
strcat(p_pHTTPRequest->pszRequest,"\n");
|
||||||
|
|
||||||
GSWLog(GSW_INFO,NULL,"App Request: %s",p_pHTTPRequest->pszRequest);
|
GSWLog(GSW_INFO,p_pLogServerData,"App Request: %s",p_pHTTPRequest->pszRequest);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPRequest_HTTPToAppRequest");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWHTTPRequest_AddHeader(GSWHTTPRequest* p_pHTTPRequest,
|
void GSWHTTPRequest_AddHeader(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
CONST char* p_pszKey,
|
CONST char* p_pszKey,
|
||||||
CONST char* p_pszValue)
|
CONST char* p_pszValue)
|
||||||
|
@ -161,6 +187,7 @@ void GSWHTTPRequest_AddHeader(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
GSWDict_AddString(p_pHTTPRequest->pHeaders,pszHeaderKey,p_pszValue,FALSE);
|
GSWDict_AddString(p_pHTTPRequest->pHeaders,pszHeaderKey,p_pszValue,FALSE);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
CONST char* GSWHTTPRequest_HeaderForKey(GSWHTTPRequest* p_pHTTPRequest,CONST char* p_pszKey)
|
CONST char* GSWHTTPRequest_HeaderForKey(GSWHTTPRequest* p_pHTTPRequest,CONST char* p_pszKey)
|
||||||
{
|
{
|
||||||
if (p_pHTTPRequest->pHeaders)
|
if (p_pHTTPRequest->pHeaders)
|
||||||
|
@ -169,6 +196,7 @@ CONST char* GSWHTTPRequest_HeaderForKey(GSWHTTPRequest* p_pHTTPRequest,CONST cha
|
||||||
return NULL;
|
return NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static void GetHeaderLength(GSWDictElem* p_pElem,
|
static void GetHeaderLength(GSWDictElem* p_pElem,
|
||||||
void* p_piAddTo)
|
void* p_piAddTo)
|
||||||
{
|
{
|
||||||
|
@ -178,6 +206,7 @@ static void GetHeaderLength(GSWDictElem* p_pElem,
|
||||||
(*piAddTo)+=strlen(p_pElem->pszKey)+strlen((char*)(p_pElem->pValue))+2+1+1;
|
(*piAddTo)+=strlen(p_pElem->pszKey)+strlen((char*)(p_pElem->pValue))+2+1+1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static void FormatHeader(GSWDictElem* p_pElem,
|
static void FormatHeader(GSWDictElem* p_pElem,
|
||||||
void* p_ppszBuffer)
|
void* p_ppszBuffer)
|
||||||
{
|
{
|
||||||
|
@ -190,17 +219,20 @@ static void FormatHeader(GSWDictElem* p_pElem,
|
||||||
(*ppszBuffer)++;
|
(*ppszBuffer)++;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
// Handle Request (send it to Application)
|
// Handle Request (send it to Application)
|
||||||
|
BOOL GSWHTTPRequest_SendRequest(GSWHTTPRequest* p_pHTTPRequest,AppConnectHandle p_socket,void* p_pLogServerData)
|
||||||
BOOL GSWHTTPRequest_SendRequest(void* p_pLogServerData,GSWHTTPRequest* p_pHTTPRequest,AppConnectHandle p_socket)
|
|
||||||
{
|
{
|
||||||
BOOL fOk = TRUE;
|
BOOL fOk = TRUE;
|
||||||
char* pszBuffer=NULL;
|
char* pszBuffer=NULL;
|
||||||
char* pszTmp=NULL;
|
char* pszTmp=NULL;
|
||||||
int iLength = 0;
|
int iLength = 0;
|
||||||
int iHeaderLength = 0;
|
int iHeaderLength = 0;
|
||||||
int iRequestLength = strlen(p_pHTTPRequest->pszRequest);
|
int iRequestLength = 0;
|
||||||
int iContentLength = p_pHTTPRequest->uContentLength;
|
int iContentLength = 0;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPRequest_SendRequest");
|
||||||
|
iRequestLength = strlen(p_pHTTPRequest->pszRequest);
|
||||||
|
iContentLength = p_pHTTPRequest->uContentLength;
|
||||||
|
|
||||||
GSWDict_PerformForAllElem(p_pHTTPRequest->pHeaders,
|
GSWDict_PerformForAllElem(p_pHTTPRequest->pHeaders,
|
||||||
GetHeaderLength,
|
GetHeaderLength,
|
||||||
|
@ -234,12 +266,14 @@ BOOL GSWHTTPRequest_SendRequest(void* p_pLogServerData,GSWHTTPRequest* p_pHTTPRe
|
||||||
iContentLength);
|
iContentLength);
|
||||||
// Just To be sure of the length
|
// Just To be sure of the length
|
||||||
iLength = pszTmp - pszBuffer;
|
iLength = pszTmp - pszBuffer;
|
||||||
fOk = GSWApp_SendBlock(p_pLogServerData,p_socket,pszBuffer,iLength);
|
fOk = GSWApp_SendBlock(p_socket,pszBuffer,iLength,p_pLogServerData);
|
||||||
free(pszBuffer);
|
free(pszBuffer);
|
||||||
pszBuffer=NULL;
|
pszBuffer=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPRequest_SendRequest");
|
||||||
return fOk;
|
return fOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static char* GSWHTTPRequest_PackageHeaders(GSWHTTPRequest* p_pHTTPRequest,
|
static char* GSWHTTPRequest_PackageHeaders(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize)
|
int p_iBufferSize)
|
||||||
|
@ -260,7 +294,7 @@ static char* GSWHTTPRequest_PackageHeaders(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
return pszBuffer;
|
return pszBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static ERequestMethod GetHTTPRequestMethod(CONST char* pszMethod)
|
static ERequestMethod GetHTTPRequestMethod(CONST char* pszMethod)
|
||||||
{
|
{
|
||||||
if (pszMethod)
|
if (pszMethod)
|
||||||
|
@ -280,8 +314,7 @@ static ERequestMethod GetHTTPRequestMethod(CONST char* pszMethod)
|
||||||
return ERequestMethod_None;
|
return ERequestMethod_None;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
static int compareHeader(CONST void* p_pKey0,CONST void* p_pKey1)
|
static int compareHeader(CONST void* p_pKey0,CONST void* p_pKey1)
|
||||||
{
|
{
|
||||||
CONST char* pKey1=((GSWHeaderTranslationItem*)p_pKey1)->pszHTTP;
|
CONST char* pKey1=((GSWHeaderTranslationItem*)p_pKey1)->pszHTTP;
|
||||||
|
@ -301,8 +334,9 @@ static int compareHeader(CONST void* p_pKey0,CONST void* p_pKey1)
|
||||||
return 0;
|
return 0;
|
||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
}
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static CONST char* GSWebHeaderForHTTPHeader(CONST char* p_pszHTTPHeader)
|
static CONST char* GSWebHeaderForHTTPHeader(CONST char* p_pszHTTPHeader)
|
||||||
{
|
{
|
||||||
GSWHeaderTranslationItem* pItem=NULL;
|
GSWHeaderTranslationItem* pItem=NULL;
|
||||||
|
|
|
@ -52,17 +52,22 @@ typedef struct _GSWHTTPRequest
|
||||||
} GSWHTTPRequest;
|
} GSWHTTPRequest;
|
||||||
|
|
||||||
|
|
||||||
GSWHTTPRequest* GSWHTTPRequest_New(CONST char* pszMethod,char* p_pszURI);
|
GSWHTTPRequest* GSWHTTPRequest_New(CONST char* pszMethod,
|
||||||
void GSWHTTPRequest_Free(GSWHTTPRequest* p_pHTTPRequest);
|
char* p_pszURI,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
void GSWHTTPRequest_Free(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
// Return error message (NULL if ok)
|
// Return error message (NULL if ok)
|
||||||
CONST char*GSWHTTPRequest_ValidateMethod(GSWHTTPRequest* p_pHTTPRequest);
|
CONST char*GSWHTTPRequest_ValidateMethod(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
// HTTP Request -> GSWeb App Request
|
// HTTP Request -> GSWeb App Request
|
||||||
void GSWHTTPRequest_HTTPToAppRequest(GSWHTTPRequest* p_pHTTPRequest,
|
void GSWHTTPRequest_HTTPToAppRequest(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
GSWAppRequest* p_pAppRequest,
|
GSWAppRequest* p_pAppRequest,
|
||||||
GSWURLComponents* p_pURLComponents,
|
GSWURLComponents* p_pURLComponents,
|
||||||
CONST char* p_pszHTTPVersion);
|
CONST char* p_pszHTTPVersion,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
// Add Header
|
// Add Header
|
||||||
void GSWHTTPRequest_AddHeader(GSWHTTPRequest* p_pHTTPRequest,
|
void GSWHTTPRequest_AddHeader(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
|
@ -74,7 +79,9 @@ CONST char* GSWHTTPRequest_HeaderForKey(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
CONST char* p_pszKey);
|
CONST char* p_pszKey);
|
||||||
|
|
||||||
// Handle Request (send it to Application)
|
// Handle Request (send it to Application)
|
||||||
BOOL GSWHTTPRequest_SendRequest(void* p_pLogServerData,GSWHTTPRequest* p_pHTTPRequest,AppConnectHandle p_socket);
|
BOOL GSWHTTPRequest_SendRequest(GSWHTTPRequest* p_pHTTPRequest,
|
||||||
|
AppConnectHandle p_socket,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@
|
||||||
#include "GSWHTTPRequest.h"
|
#include "GSWHTTPRequest.h"
|
||||||
#include "GSWHTTPResponse.h"
|
#include "GSWHTTPResponse.h"
|
||||||
#include "GSWAppRequest.h"
|
#include "GSWAppRequest.h"
|
||||||
|
#include "GSWTemplates.h"
|
||||||
|
|
||||||
|
|
||||||
static char* g_pszLocalHostName = NULL;
|
static char* g_pszLocalHostName = NULL;
|
||||||
|
@ -46,8 +47,8 @@ static char* g_pszLocalHostName = NULL;
|
||||||
#define STATUS "Status"
|
#define STATUS "Status"
|
||||||
#define HTTP_SLASH "HTTP/"
|
#define HTTP_SLASH "HTTP/"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
GSWHTTPResponse* GSWHTTPResponse_New(void* p_pLogServerData,CONST char* p_pszStatus)
|
GSWHTTPResponse* GSWHTTPResponse_New(CONST char* p_pszStatus,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWHTTPResponse* pHTTPResponse=NULL;
|
GSWHTTPResponse* pHTTPResponse=NULL;
|
||||||
BOOL fOk=FALSE;
|
BOOL fOk=FALSE;
|
||||||
|
@ -84,11 +85,22 @@ GSWHTTPResponse* GSWHTTPResponse_New(void* p_pLogServerData,CONST char* p_pszSta
|
||||||
return pHTTPResponse;
|
return pHTTPResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
GSWHTTPResponse* GSWHTTPResponse_BuildErrorResponse(CONST char* p_pszMessage)
|
GSWHTTPResponse* GSWHTTPResponse_BuildErrorResponse(GSWAppRequest* p_pAppRequest,
|
||||||
|
CONST char* p_pszMessage,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
|
char szBuffer[128]="";
|
||||||
|
GSWApp* pApp=NULL;
|
||||||
|
GSWString* pBuffer=GSWString_New();
|
||||||
|
GSWString* pBufferMessage=GSWString_New();
|
||||||
GSWHTTPResponse* pHTTPResponse=calloc(1,sizeof(GSWHTTPResponse));
|
GSWHTTPResponse* pHTTPResponse=calloc(1,sizeof(GSWHTTPResponse));
|
||||||
char szBuffer[RESPONSE__LINE_MAX_SIZE]="";
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPResponse_BuildErrorResponse");
|
||||||
|
if (p_pAppRequest && p_pAppRequest->pAppInstance)
|
||||||
|
pApp=p_pAppRequest->pAppInstance->pApp;
|
||||||
|
#ifdef DEBUG
|
||||||
|
GSWLog(GSW_INFO,p_pLogServerData,"Build Error Response [%s] pApp=%p",p_pszMessage,pApp);
|
||||||
|
#endif
|
||||||
pHTTPResponse->uStatus = 200;
|
pHTTPResponse->uStatus = 200;
|
||||||
pHTTPResponse->pszStatusMessage = strdup(g_szOKGSWeb);
|
pHTTPResponse->pszStatusMessage = strdup(g_szOKGSWeb);
|
||||||
pHTTPResponse->pHeaders = GSWDict_New(2);
|
pHTTPResponse->pHeaders = GSWDict_New(2);
|
||||||
|
@ -96,28 +108,52 @@ GSWHTTPResponse* GSWHTTPResponse_BuildErrorResponse(CONST char* p_pszMessage)
|
||||||
g_szHeader_ContentType,
|
g_szHeader_ContentType,
|
||||||
g_szContentType_TextHtml,
|
g_szContentType_TextHtml,
|
||||||
FALSE);
|
FALSE);
|
||||||
sprintf(szBuffer,g_szErrorResponseHTMLTextTpl,p_pszMessage);
|
GSWString_Append(pBufferMessage,p_pszMessage);
|
||||||
pHTTPResponse->uContentLength = strlen(szBuffer);
|
if (p_pAppRequest)
|
||||||
|
{
|
||||||
|
GSWString_SearchReplace(pBufferMessage,"##APP_NAME##",p_pAppRequest->pszName);
|
||||||
|
sprintf(szBuffer,"%d",p_pAppRequest->iInstance);
|
||||||
|
GSWString_SearchReplace(pBufferMessage,"##APP_INSTANCE##",szBuffer);
|
||||||
|
GSWString_SearchReplace(pBufferMessage,"##APP_HOST##",p_pAppRequest->pszHost);
|
||||||
|
sprintf(szBuffer,"%d",p_pAppRequest->iPort);
|
||||||
|
GSWString_SearchReplace(pBufferMessage,"##APP_PORT##",szBuffer);
|
||||||
|
};
|
||||||
|
GSWTemplate_ReplaceStd(pBufferMessage,pApp);
|
||||||
|
|
||||||
|
GSWString_Append(pBuffer,GSWTemplate_ErrorResponseText(TRUE));
|
||||||
|
GSWString_SearchReplace(pBuffer,"##TEXT##",pBufferMessage->pszData);
|
||||||
|
GSWTemplate_ReplaceStd(pBuffer,pApp);
|
||||||
|
pHTTPResponse->uContentLength = GSWString_Len(pBuffer);
|
||||||
pHTTPResponse->pContent = malloc(pHTTPResponse->uContentLength);
|
pHTTPResponse->pContent = malloc(pHTTPResponse->uContentLength);
|
||||||
strcpy(pHTTPResponse->pContent,szBuffer);
|
strcpy(pHTTPResponse->pContent,pBuffer->pszData);
|
||||||
|
GSWString_Free(pBuffer);
|
||||||
|
pBuffer=NULL;
|
||||||
|
GSWString_Free(pBufferMessage);
|
||||||
|
pBufferMessage=NULL;
|
||||||
sprintf(szBuffer,"%d",pHTTPResponse->uContentLength);
|
sprintf(szBuffer,"%d",pHTTPResponse->uContentLength);
|
||||||
GSWDict_AddStringDup(pHTTPResponse->pHeaders,g_szHeader_ContentLength,szBuffer);
|
GSWDict_AddStringDup(pHTTPResponse->pHeaders,g_szHeader_ContentLength,szBuffer);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPResponse_BuildErrorResponse");
|
||||||
return pHTTPResponse;
|
return pHTTPResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
GSWHTTPResponse* GSWHTTPResponse_BuildRedirectedResponse(CONST char* p_pszRedirectPath)
|
//--------------------------------------------------------------------
|
||||||
|
GSWHTTPResponse* GSWHTTPResponse_BuildRedirectedResponse(CONST char* p_pszRedirectPath,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWHTTPResponse* pHTTPResponse=calloc(1,sizeof(GSWHTTPResponse));
|
GSWHTTPResponse* pHTTPResponse=calloc(1,sizeof(GSWHTTPResponse));
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPResponse_BuildRedirectedResponse");
|
||||||
pHTTPResponse->uStatus = 302;
|
pHTTPResponse->uStatus = 302;
|
||||||
pHTTPResponse->pszStatusMessage = strdup(g_szOKGSWeb);
|
pHTTPResponse->pszStatusMessage = strdup(g_szOKGSWeb);
|
||||||
pHTTPResponse->pHeaders=GSWDict_New(2);
|
pHTTPResponse->pHeaders=GSWDict_New(2);
|
||||||
GSWDict_Add(pHTTPResponse->pHeaders, g_szHeader_ContentType, g_szContentType_TextHtml,FALSE);
|
GSWDict_Add(pHTTPResponse->pHeaders, g_szHeader_ContentType, g_szContentType_TextHtml,FALSE);
|
||||||
GSWDict_AddStringDup(pHTTPResponse->pHeaders,"location",p_pszRedirectPath);
|
GSWDict_AddStringDup(pHTTPResponse->pHeaders,"location",p_pszRedirectPath);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPResponse_BuildRedirectedResponse");
|
||||||
return pHTTPResponse;
|
return pHTTPResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWHTTPResponse_Free(GSWHTTPResponse* p_pHTTPResponse)
|
//--------------------------------------------------------------------
|
||||||
|
void GSWHTTPResponse_Free(GSWHTTPResponse* p_pHTTPResponse,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPResponse_Free");
|
||||||
if (p_pHTTPResponse)
|
if (p_pHTTPResponse)
|
||||||
{
|
{
|
||||||
if (p_pHTTPResponse->pHeaders)
|
if (p_pHTTPResponse->pHeaders)
|
||||||
|
@ -138,9 +174,10 @@ void GSWHTTPResponse_Free(GSWHTTPResponse* p_pHTTPResponse)
|
||||||
free(p_pHTTPResponse);
|
free(p_pHTTPResponse);
|
||||||
p_pHTTPResponse=NULL;
|
p_pHTTPResponse=NULL;
|
||||||
};
|
};
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPResponse_Free");
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWHTTPResponse_AddHeader(GSWHTTPResponse* p_pHTTPResponse,char* p_pszHeader)
|
void GSWHTTPResponse_AddHeader(GSWHTTPResponse* p_pHTTPResponse,char* p_pszHeader)
|
||||||
{
|
{
|
||||||
char* pszKey=NULL;
|
char* pszKey=NULL;
|
||||||
|
@ -161,33 +198,34 @@ void GSWHTTPResponse_AddHeader(GSWHTTPResponse* p_pHTTPResponse,char* p_pszHeade
|
||||||
if (p_pHTTPResponse->uContentLength==0 && strcmp(g_szHeader_ContentLength,pszKey)==0)
|
if (p_pHTTPResponse->uContentLength==0 && strcmp(g_szHeader_ContentLength,pszKey)==0)
|
||||||
p_pHTTPResponse->uContentLength = atoi(pszValue);
|
p_pHTTPResponse->uContentLength = atoi(pszValue);
|
||||||
}
|
}
|
||||||
/*
|
|
||||||
else
|
else
|
||||||
Pb
|
{
|
||||||
*/
|
//TODO PB
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
GSWHTTPResponse* GSWHTTPResponse_GetResponse(void* p_pLogServerData,AppConnectHandle p_socket)
|
//--------------------------------------------------------------------
|
||||||
|
GSWHTTPResponse* GSWHTTPResponse_GetResponse(AppConnectHandle p_socket,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWHTTPResponse* pHTTPResponse=NULL;
|
GSWHTTPResponse* pHTTPResponse=NULL;
|
||||||
char szResponseBuffer[RESPONSE__LINE_MAX_SIZE];
|
char szResponseBuffer[RESPONSE__LINE_MAX_SIZE];
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPResponse_GetResponse");
|
||||||
|
|
||||||
// Get the 1st Line
|
// Get the 1st Line
|
||||||
GSWApp_ReceiveLine(p_pLogServerData,p_socket,szResponseBuffer, RESPONSE__LINE_MAX_SIZE);
|
GSWApp_ReceiveLine(p_socket,szResponseBuffer, RESPONSE__LINE_MAX_SIZE,p_pLogServerData);
|
||||||
pHTTPResponse = GSWHTTPResponse_New(p_pLogServerData,szResponseBuffer);
|
pHTTPResponse = GSWHTTPResponse_New(szResponseBuffer,p_pLogServerData);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"Response receive first line:\t\t[%s]",szResponseBuffer);
|
GSWLog(GSW_INFO,p_pLogServerData,"Response receive first line:\t\t[%s]",szResponseBuffer);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!pHTTPResponse) //Error
|
if (!pHTTPResponse) //Error
|
||||||
pHTTPResponse=GSWHTTPResponse_BuildErrorResponse("Invalid Response");
|
pHTTPResponse=GSWHTTPResponse_BuildErrorResponse(NULL,"Invalid Response",p_pLogServerData);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
int iHeader=0;
|
int iHeader=0;
|
||||||
// Headers
|
// Headers
|
||||||
while (GSWApp_ReceiveLine(p_pLogServerData,p_socket,szResponseBuffer,RESPONSE__LINE_MAX_SIZE)>0
|
while (GSWApp_ReceiveLine(p_socket,szResponseBuffer,RESPONSE__LINE_MAX_SIZE,p_pLogServerData)>0
|
||||||
&& szResponseBuffer[0]
|
&& szResponseBuffer[0])
|
||||||
)
|
|
||||||
{
|
{
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"Header %d=\t\t[%s]",iHeader,szResponseBuffer);
|
GSWLog(GSW_INFO,p_pLogServerData,"Header %d=\t\t[%s]",iHeader,szResponseBuffer);
|
||||||
|
@ -199,19 +237,19 @@ GSWHTTPResponse* GSWHTTPResponse_GetResponse(void* p_pLogServerData,AppConnectHa
|
||||||
if (pHTTPResponse->uContentLength)
|
if (pHTTPResponse->uContentLength)
|
||||||
{
|
{
|
||||||
char* pszBuffer= malloc(pHTTPResponse->uContentLength);
|
char* pszBuffer= malloc(pHTTPResponse->uContentLength);
|
||||||
int iReceivedCount=GSWApp_ReceiveBlock(p_pLogServerData,p_socket,pszBuffer,pHTTPResponse->uContentLength);
|
int iReceivedCount=GSWApp_ReceiveBlock(p_socket,pszBuffer,pHTTPResponse->uContentLength,p_pLogServerData);
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"iReceivedCount=%d",iReceivedCount);
|
GSWLog(GSW_INFO,p_pLogServerData,"iReceivedCount=%d",iReceivedCount);
|
||||||
#endif
|
#endif
|
||||||
if (iReceivedCount!= pHTTPResponse->uContentLength)
|
if (iReceivedCount!= pHTTPResponse->uContentLength)
|
||||||
{
|
{
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,
|
GSWLog(GSW_ERROR,p_pLogServerData,
|
||||||
"Content received doesn't equal to ContentLength. Too bad, same player must shoot again !");
|
"Content received doesn't equal to ContentLength. Too bad, same player shoot again !");
|
||||||
free(pszBuffer);
|
free(pszBuffer);
|
||||||
pszBuffer=NULL;
|
pszBuffer=NULL;
|
||||||
GSWHTTPResponse_Free(pHTTPResponse);
|
GSWHTTPResponse_Free(pHTTPResponse,p_pLogServerData);
|
||||||
pHTTPResponse=NULL;
|
pHTTPResponse=NULL;
|
||||||
pHTTPResponse = GSWHTTPResponse_BuildErrorResponse("Invalid Response");
|
pHTTPResponse = GSWHTTPResponse_BuildErrorResponse(NULL,"Invalid Response",p_pLogServerData);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
pHTTPResponse->pContent = pszBuffer;
|
pHTTPResponse->pContent = pszBuffer;
|
||||||
|
@ -232,10 +270,12 @@ GSWHTTPResponse* GSWHTTPResponse_GetResponse(void* p_pLogServerData,AppConnectHa
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPResponse_GetResponse");
|
||||||
return pHTTPResponse;
|
return pHTTPResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static void GetHeaderLength(GSWDictElem* p_pElem,
|
static void GetHeaderLength(GSWDictElem* p_pElem,
|
||||||
void* p_piAddTo)
|
void* p_piAddTo)
|
||||||
{
|
{
|
||||||
|
@ -246,6 +286,7 @@ static void GetHeaderLength(GSWDictElem* p_pElem,
|
||||||
(*piAddTo)+=strlen(p_pElem->pszKey)+strlen((char*)p_pElem->pValue)+2+1+2;
|
(*piAddTo)+=strlen(p_pElem->pszKey)+strlen((char*)p_pElem->pValue)+2+1+2;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static void FormatHeader(GSWDictElem* p_pElem,
|
static void FormatHeader(GSWDictElem* p_pElem,
|
||||||
void* p_ppszBuffer)
|
void* p_ppszBuffer)
|
||||||
{
|
{
|
||||||
|
@ -260,6 +301,7 @@ static void FormatHeader(GSWDictElem* p_pElem,
|
||||||
(*ppszBuffer)++;
|
(*ppszBuffer)++;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
char *GSWHTTPResponse_PackageHeaders(GSWHTTPResponse* p_pHTTPResponse,
|
char *GSWHTTPResponse_PackageHeaders(GSWHTTPResponse* p_pHTTPResponse,
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int p_iBufferSize)
|
int p_iBufferSize)
|
||||||
|
@ -285,6 +327,7 @@ char *GSWHTTPResponse_PackageHeaders(GSWHTTPResponse* p_pHTTPResponse,
|
||||||
return pszBuffer;
|
return pszBuffer;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWHTTPResponse_AddHeaderToString(GSWDictElem* p_pElem,void* p_pData)
|
void GSWHTTPResponse_AddHeaderToString(GSWDictElem* p_pElem,void* p_pData)
|
||||||
{
|
{
|
||||||
GSWString* pString=(GSWString*)p_pData;
|
GSWString* pString=(GSWString*)p_pData;
|
||||||
|
@ -294,195 +337,92 @@ void GSWHTTPResponse_AddHeaderToString(GSWDictElem* p_pElem,void* p_pData)
|
||||||
GSWString_Append(pString,"<br>");
|
GSWString_Append(pString,"<br>");
|
||||||
};
|
};
|
||||||
|
|
||||||
GSWHTTPResponse* GSWHTTPResponse_BuildTestResponse(void* p_pLogServerData,GSWHTTPRequest* p_pHTTPRequest)
|
//--------------------------------------------------------------------
|
||||||
|
GSWHTTPResponse* GSWHTTPResponse_BuildStatusResponse(GSWHTTPRequest* p_pHTTPRequest,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWHTTPResponse* pHTTPResponse=GSWHTTPResponse_New(p_pLogServerData,g_szOKStatus);
|
GSWHTTPResponse* pHTTPResponse=GSWHTTPResponse_New(g_szOKStatus,p_pLogServerData);
|
||||||
GSWDict* pRequestHeaders=NULL;
|
GSWDict* pRequestHeaders=NULL;
|
||||||
GSWString* pContent=GSWString_New();
|
GSWString* pContent=GSWString_New();
|
||||||
|
GSWString* pHeadersBuffer=GSWString_New();
|
||||||
|
const char* pszRemoteAddr=NULL;
|
||||||
|
const char* pszRemoteHost=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWHTTPResponse_BuildStatusResponse");
|
||||||
|
GSWLog(GSW_INFO,p_pLogServerData,"Build Status Page.");
|
||||||
|
GSWConfig_LoadConfiguration(p_pLogServerData);
|
||||||
GSWDict_AddString(pHTTPResponse->pHeaders,
|
GSWDict_AddString(pHTTPResponse->pHeaders,
|
||||||
g_szHeader_ContentType,
|
g_szHeader_ContentType,
|
||||||
g_szContentType_TextHtml,
|
g_szContentType_TextHtml,
|
||||||
FALSE);
|
FALSE);
|
||||||
|
|
||||||
GSWString_Append(pContent, "<HTML><BODY>");
|
|
||||||
GSWString_Append(pContent, "<br><strong>Server Adaptor:</strong><br>");
|
|
||||||
GSWString_Append(pContent, "<p>Server = ");
|
|
||||||
GSWString_Append(pContent, g_szGSWeb_Server);
|
|
||||||
GSWString_Append(pContent, " <br>");
|
|
||||||
GSWString_Append(pContent, "GNUstepWeb Web Server Adaptor version = ");
|
|
||||||
GSWString_Append(pContent, g_szGSWeb_AdaptorVersion);
|
|
||||||
GSWString_Append(pContent, "</p>");
|
|
||||||
|
|
||||||
GSWString_Append(pContent, "<br><strong>Headers:</strong><br>");
|
|
||||||
pRequestHeaders = (GSWDict*)(p_pHTTPRequest->pHeaders);
|
pRequestHeaders = (GSWDict*)(p_pHTTPRequest->pHeaders);
|
||||||
GSWDict_PerformForAllElem(pRequestHeaders,GSWHTTPResponse_AddHeaderToString,pContent);
|
GSWDict_PerformForAllElem(pRequestHeaders,GSWHTTPResponse_AddHeaderToString,pHeadersBuffer);
|
||||||
|
if (GSWConfig_CanDumpStatus())
|
||||||
GSWString_Append(pContent, "</BODY></HTML>");
|
GSWString_Append(pContent,GSWTemplate_StatusAllowedResponse(TRUE));
|
||||||
|
else
|
||||||
|
GSWString_Append(pContent,GSWTemplate_StatusDeniedResponse(TRUE));
|
||||||
|
pszRemoteAddr=(const char*)GSWDict_ValueForKey(pRequestHeaders,"x-gsweb-remote-addr");
|
||||||
|
if (!pszRemoteAddr)
|
||||||
|
pszRemoteAddr="";
|
||||||
|
pszRemoteHost=(const char*)GSWDict_ValueForKey(pRequestHeaders,"x-gsweb-remote-host");
|
||||||
|
if (!pszRemoteHost)
|
||||||
|
pszRemoteHost="";
|
||||||
|
GSWString_SearchReplace(pContent,"##REMOTE_ADDR##",pszRemoteAddr);
|
||||||
|
GSWString_SearchReplace(pContent,"##REMOTE_HOST##",pszRemoteHost);
|
||||||
|
GSWString_SearchReplace(pContent,"##SERVER_INFO##",GSWConfig_ServerStringInfo());
|
||||||
|
GSWString_SearchReplace(pContent,"##SERVER_URL##",GSWConfig_ServerURL());
|
||||||
|
GSWString_SearchReplace(pContent,"##ADAPTOR_INFO##",g_szGSWeb_AdaptorStringInfo());
|
||||||
|
GSWString_SearchReplace(pContent,"##ADAPTOR_URL##",g_szGSWeb_AdaptorURL());
|
||||||
|
GSWString_SearchReplace(pContent,"##HEADERS##",pHeadersBuffer->pszData);
|
||||||
|
GSWTemplate_ReplaceStd(pContent,NULL);
|
||||||
|
GSWString_Free(pHeadersBuffer);
|
||||||
|
pHeadersBuffer=NULL;
|
||||||
|
|
||||||
|
pHTTPResponse->uContentLength = GSWString_Len(pContent);
|
||||||
|
pHTTPResponse->pContent = pContent->pszData;
|
||||||
|
GSWString_Detach(pContent);
|
||||||
|
GSWString_Free(pContent);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWHTTPResponse_BuildStatusResponse");
|
||||||
|
return pHTTPResponse;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
GSWHTTPResponse* GSWDumpConfigFile(GSWURLComponents* p_pURLComponents,void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
GSWHTTPResponse* pHTTPResponse=NULL;
|
||||||
|
GSWString* pContent=NULL;
|
||||||
|
char pszPrefix[MAXPATHLEN]="";
|
||||||
|
char szReqAppName[MAXPATHLEN]="Unknown";
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWDumpConfigFile");
|
||||||
|
GSWLog(GSW_INFO,p_pLogServerData,"Creating Applications Page.");
|
||||||
|
if (!g_pszLocalHostName)
|
||||||
|
{
|
||||||
|
char szHostName[MAXHOSTNAMELEN+1];
|
||||||
|
gethostname(szHostName, MAXHOSTNAMELEN);
|
||||||
|
g_pszLocalHostName= strdup(szHostName);
|
||||||
|
};
|
||||||
|
|
||||||
|
pHTTPResponse = GSWHTTPResponse_New(g_szOKStatus,p_pLogServerData);
|
||||||
|
GSWDict_AddString(pHTTPResponse->pHeaders,
|
||||||
|
g_szHeader_ContentType,
|
||||||
|
g_szContentType_TextHtml,
|
||||||
|
FALSE);
|
||||||
|
if (p_pURLComponents->stAppName.iLength>0 && p_pURLComponents->stAppName.pszStart)
|
||||||
|
{
|
||||||
|
strncpy(szReqAppName,p_pURLComponents->stAppName.pszStart,p_pURLComponents->stAppName.iLength);
|
||||||
|
szReqAppName[p_pURLComponents->stAppName.iLength]=0;
|
||||||
|
};
|
||||||
|
|
||||||
|
strncpy(pszPrefix, p_pURLComponents->stPrefix.pszStart,p_pURLComponents->stPrefix.iLength);
|
||||||
|
pszPrefix[p_pURLComponents->stPrefix.iLength] = '\0';
|
||||||
|
|
||||||
|
GSWConfig_LoadConfiguration(p_pLogServerData);
|
||||||
|
pContent=GSWConfig_DumpGSWApps(szReqAppName,pszPrefix,FALSE,TRUE,p_pLogServerData);
|
||||||
|
GSWTemplate_ReplaceStd(pContent,NULL);
|
||||||
pHTTPResponse->uContentLength = pContent->iLen;
|
pHTTPResponse->uContentLength = pContent->iLen;
|
||||||
pHTTPResponse->pContent = pContent->pszData;
|
pHTTPResponse->pContent = pContent->pszData;
|
||||||
GSWString_Detach(pContent);
|
GSWString_Detach(pContent);
|
||||||
GSWString_Free(pContent);
|
GSWString_Free(pContent);
|
||||||
return pHTTPResponse;
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWDumpConfigFile");
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
GSWHTTPResponse* GSWDumpConfigFile(void* p_pLogServerData,GSWURLComponents* p_pURLComponents)
|
|
||||||
{
|
|
||||||
GSWHTTPResponse* pHTTPResponse=NULL;
|
|
||||||
if (GSWDumpConfigFile_CanDump())
|
|
||||||
{
|
|
||||||
proplist_t propListConfig=NULL;
|
|
||||||
char szBuffer[4096]="";
|
|
||||||
GSWString* pContent=GSWString_New();
|
|
||||||
time_t nullTime=(time_t)0;
|
|
||||||
char pszPrefix[MAXPATHLEN]="";
|
|
||||||
char szReqAppName[MAXPATHLEN]="Unknown";
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"Creating Applications Page.");
|
|
||||||
|
|
||||||
if (!g_pszLocalHostName)
|
|
||||||
{
|
|
||||||
char szHostName[MAXHOSTNAMELEN+1];
|
|
||||||
gethostname(szHostName, MAXHOSTNAMELEN);
|
|
||||||
g_pszLocalHostName= strdup(szHostName);
|
|
||||||
};
|
|
||||||
|
|
||||||
pHTTPResponse = GSWHTTPResponse_New(p_pLogServerData,g_szOKStatus);
|
|
||||||
GSWDict_AddString(pHTTPResponse->pHeaders,
|
|
||||||
g_szHeader_ContentType,
|
|
||||||
g_szContentType_TextHtml,
|
|
||||||
FALSE);
|
|
||||||
|
|
||||||
if (p_pURLComponents->stAppName.iLength>0 && p_pURLComponents->stAppName.pszStart)
|
|
||||||
{
|
|
||||||
strncpy(szReqAppName,p_pURLComponents->stAppName.pszStart,p_pURLComponents->stAppName.iLength);
|
|
||||||
szReqAppName[p_pURLComponents->stAppName.iLength]=0;
|
|
||||||
};
|
|
||||||
sprintf(szBuffer,
|
|
||||||
g_szDumpConfFile_Head,
|
|
||||||
szReqAppName,
|
|
||||||
GSWConfig_GetConfigFilePath());
|
|
||||||
GSWString_Append(pContent,szBuffer);
|
|
||||||
|
|
||||||
strncpy(pszPrefix, p_pURLComponents->stPrefix.pszStart,p_pURLComponents->stPrefix.iLength);
|
|
||||||
pszPrefix[p_pURLComponents->stPrefix.iLength] = '\0';
|
|
||||||
|
|
||||||
if (GSWConfig_ReadIFND(GSWConfig_GetConfigFilePath(),
|
|
||||||
&nullTime,
|
|
||||||
&propListConfig,
|
|
||||||
p_pLogServerData)==EGSWConfigResult__Ok)
|
|
||||||
{
|
|
||||||
proplist_t propListApps=NULL;
|
|
||||||
propListApps=GSWConfig_GetApplicationsFromConfig(propListConfig);
|
|
||||||
if (propListApps)
|
|
||||||
{
|
|
||||||
int iAppIndex=0;
|
|
||||||
int iInstanceIndex=0;
|
|
||||||
GSWApp* pApp=NULL;
|
|
||||||
GSWAppInstance* pAppInstance=NULL;
|
|
||||||
proplist_t propListAppsNames=GSWConfig_ApplicationsKeysFromApplications(propListApps);
|
|
||||||
unsigned int uAppNb=PLGetNumberOfElements(propListAppsNames);
|
|
||||||
for(iAppIndex=0;iAppIndex<uAppNb;iAppIndex++)
|
|
||||||
{
|
|
||||||
proplist_t propListAppKey=GSWConfig_ApplicationKeyFromApplicationsKey(propListAppsNames,
|
|
||||||
iAppIndex);
|
|
||||||
if (!propListAppKey)
|
|
||||||
{
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char url[MAXPATHLEN+256];
|
|
||||||
CONST char* pszAppName=PLGetString(propListAppKey);
|
|
||||||
proplist_t propListApp;
|
|
||||||
|
|
||||||
sprintf(url,"%s/%s",pszPrefix,pszAppName);
|
|
||||||
sprintf(szBuffer,"<TR>\n<TD>%s</TD>\n<TD><A HREF=\"%s\">%s</A></TD>",
|
|
||||||
pszAppName,
|
|
||||||
url,
|
|
||||||
url);
|
|
||||||
GSWString_Append(pContent,szBuffer);
|
|
||||||
propListApp=GSWConfig_ApplicationFromApplications(propListApps,
|
|
||||||
propListAppKey);
|
|
||||||
if (!propListApp)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"no ppropListApp");
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
proplist_t propListInstances=GSWConfig_InstancesFromApplication(propListApp);
|
|
||||||
if (!propListInstances)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"no propListInstances");
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
unsigned int uInstancesNb=PLGetNumberOfElements(propListInstances);
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"uInstancesNb=%u",uInstancesNb);
|
|
||||||
if (uInstancesNb>0)
|
|
||||||
{
|
|
||||||
sprintf(szBuffer,"<TD colspan=3><TABLE border=1>\n");
|
|
||||||
GSWString_Append(pContent,szBuffer);
|
|
||||||
};
|
|
||||||
|
|
||||||
for(iInstanceIndex=0;iInstanceIndex<uInstancesNb;iInstanceIndex++)
|
|
||||||
{
|
|
||||||
proplist_t propListInstance=PLGetArrayElement(propListInstances,iInstanceIndex);
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"propListInstance=%p",propListInstance);
|
|
||||||
if (!propListInstance)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"no propListInstance");
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else if (!PLIsDictionary(propListInstance))
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"propListInstance is not a dictionary");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
STGSWConfigEntry stEntry;
|
|
||||||
GSWConfig_PropListInstanceToInstanceEntry(&stEntry,
|
|
||||||
propListInstance,
|
|
||||||
pszAppName);
|
|
||||||
sprintf(url,
|
|
||||||
"http://%s:%d%s/%s",
|
|
||||||
stEntry.pszHostName,
|
|
||||||
stEntry.iPort,
|
|
||||||
pszPrefix,
|
|
||||||
pszAppName);
|
|
||||||
sprintf(szBuffer,
|
|
||||||
"<TR>\n<TD><A HREF=\"%s\">%d</A></TD>\n<TD>%s</TD>\n<TD>%d</TD>\n</TR>\n",
|
|
||||||
url,
|
|
||||||
stEntry.iInstance,
|
|
||||||
stEntry.pszHostName,
|
|
||||||
stEntry.iPort);
|
|
||||||
GSWString_Append(pContent,szBuffer);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
if (uInstancesNb>0)
|
|
||||||
{
|
|
||||||
sprintf(szBuffer,"</TABLE></TD>");
|
|
||||||
GSWString_Append(pContent,szBuffer);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
sprintf(szBuffer,
|
|
||||||
g_szDumpConfFile_Foot,
|
|
||||||
g_szGSWeb_DefaultGSWExtensionsFrameworkWebServerResources);
|
|
||||||
GSWString_Append(pContent,szBuffer);
|
|
||||||
|
|
||||||
pHTTPResponse->uContentLength = pContent->iLen;
|
|
||||||
pHTTPResponse->pContent = pContent->pszData;
|
|
||||||
GSWString_Detach(pContent);
|
|
||||||
GSWString_Free(pContent);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
return pHTTPResponse;
|
return pHTTPResponse;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -37,17 +37,17 @@ typedef struct _GSWHTTPResponse
|
||||||
void* pContent;
|
void* pContent;
|
||||||
} GSWHTTPResponse;
|
} GSWHTTPResponse;
|
||||||
|
|
||||||
GSWHTTPResponse* GSWHTTPResponse_New(void* p_pLogServerData,CONST char* p_pszStatus);
|
GSWHTTPResponse* GSWHTTPResponse_New(CONST char* p_pszStatus,void* p_pLogServerData);
|
||||||
void GSWHTTPResponse_Free(GSWHTTPResponse* p_pHTTPResponse);
|
void GSWHTTPResponse_Free(GSWHTTPResponse* p_pHTTPResponse,void* p_pLogServerData);
|
||||||
|
|
||||||
// Get The response from Application
|
// Get The response from Application
|
||||||
GSWHTTPResponse* GSWHTTPResponse_GetResponse(void* p_pLogServerData,AppConnectHandle p_socket);
|
GSWHTTPResponse* GSWHTTPResponse_GetResponse(AppConnectHandle p_socket,void* p_pLogServerData);
|
||||||
|
|
||||||
// Build an error response
|
// Build an error response
|
||||||
GSWHTTPResponse *GSWHTTPResponse_BuildErrorResponse(CONST char* p_pszMessage);
|
GSWHTTPResponse *GSWHTTPResponse_BuildErrorResponse(GSWAppRequest* p_pAppRequest,CONST char* p_pszMessage,void* p_pLogServerData);
|
||||||
|
|
||||||
// Redirect Response
|
// Redirect Response
|
||||||
GSWHTTPResponse* GSWHTTPResponse_BuildRedirectedResponse(CONST char* p_pszRedirectPath);
|
GSWHTTPResponse* GSWHTTPResponse_BuildRedirectedResponse(CONST char* p_pszRedirectPath,void* p_pLogServerData);
|
||||||
|
|
||||||
// Add Header
|
// Add Header
|
||||||
void GSWHTTPResponse_AddHeader(GSWHTTPResponse* p_pHTTPResponse,
|
void GSWHTTPResponse_AddHeader(GSWHTTPResponse* p_pHTTPResponse,
|
||||||
|
@ -57,10 +57,8 @@ char* p_pszGSWHTTPResponse_PackageHeaders(GSWHTTPResponse* p_pHTTPResponse,
|
||||||
char* p_pszBuffer,
|
char* p_pszBuffer,
|
||||||
int iBufferSize);
|
int iBufferSize);
|
||||||
|
|
||||||
GSWHTTPResponse* GSWHTTPResponse_BuildTestResponse(void* p_pLogServerData,GSWHTTPRequest* p_pHTTPRequest);
|
GSWHTTPResponse* GSWHTTPResponse_BuildStatusResponse(GSWHTTPRequest* p_pHTTPRequest,void* p_pLogServerData);
|
||||||
|
GSWHTTPResponse* GSWDumpConfigFile(GSWURLComponents* p_pURLComponents,void* p_pLogServerData);
|
||||||
BOOL GSWDumpConfigFile_CanDump();
|
|
||||||
GSWHTTPResponse* GSWDumpConfigFile(void* p_pLogServerData,GSWURLComponents* p_pURLComponents);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
#include "GSWList.h"
|
#include "GSWList.h"
|
||||||
|
#include "GSWString.h"
|
||||||
#include "GSWURLUtil.h"
|
#include "GSWURLUtil.h"
|
||||||
#include "GSWConfig.h"
|
#include "GSWConfig.h"
|
||||||
#include "GSWAppRequestStruct.h"
|
#include "GSWAppRequestStruct.h"
|
||||||
|
@ -42,303 +43,68 @@
|
||||||
#include "GSWLoadBalancing.h"
|
#include "GSWLoadBalancing.h"
|
||||||
#include "GSWLock.h"
|
#include "GSWLock.h"
|
||||||
|
|
||||||
static GSWLock g_lockAppList;
|
//--------------------------------------------------------------------
|
||||||
static GSWList* g_pAppList = NULL;
|
BOOL GSWLoadBalancing_FindApp(GSWAppRequest* p_pAppRequest,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
|
||||||
|
|
||||||
static time_t config_mtime = (time_t)0;
|
|
||||||
|
|
||||||
// Callback Functions
|
|
||||||
static int compareApps(CONST void *p1, CONST void *p2)
|
|
||||||
{
|
|
||||||
GSWApp* pApp1=*(GSWApp**)p1;
|
|
||||||
GSWApp* pApp2=*(GSWApp**)p2;
|
|
||||||
return strcmp(pApp1->pszName,pApp2->pszName);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int compareInstances(CONST void *p1, CONST void *p2)
|
|
||||||
{
|
|
||||||
GSWAppInstance* pAppInstance1=*(GSWAppInstance**)p1;
|
|
||||||
GSWAppInstance* pAppInstance2=*(GSWAppInstance**)p2;
|
|
||||||
return (pAppInstance1->iInstance-pAppInstance2->iInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int compareAppNames(CONST void *p1, CONST void *p2)
|
|
||||||
{
|
|
||||||
GSWApp* pApp=*(GSWApp**)p2;
|
|
||||||
return strcmp((char*)p1,pApp->pszName);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void GSWLoadBalancing_Init(GSWDict* p_pDict)
|
|
||||||
{
|
|
||||||
if (p_pDict)
|
|
||||||
{
|
|
||||||
CONST char* pszPath=GSWDict_ValueForKey(p_pDict,g_szGSWeb_Conf_ConfigFilePath);
|
|
||||||
GSWConfig_SetConfigFilePath(pszPath);
|
|
||||||
};
|
|
||||||
|
|
||||||
GSWLock_Init(g_lockAppList);
|
|
||||||
};
|
|
||||||
|
|
||||||
static GSWLoadBalancing_ClearInstances()
|
|
||||||
{
|
|
||||||
int iAppIndex=0;
|
|
||||||
int iInstanceIndex=0;
|
|
||||||
GSWApp *pApp = NULL;
|
|
||||||
GSWAppInstance *pAppInstance = NULL;
|
|
||||||
for (iAppIndex=0;iAppIndex<g_pAppList->uCount;iAppIndex++)
|
|
||||||
{
|
|
||||||
pApp = GSWList_ElementAtIndex(g_pAppList,iAppIndex);
|
|
||||||
for (iInstanceIndex=0;iInstanceIndex<pApp->stInstances.uCount;iInstanceIndex++)
|
|
||||||
{
|
|
||||||
pAppInstance = GSWList_ElementAtIndex(&pApp->stInstances,iInstanceIndex);
|
|
||||||
pAppInstance->fValid=FALSE;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
static EGSWConfigResult GSWLoadBalancing_NewInstance(STGSWConfigEntry* p_pConfigEntry,
|
|
||||||
void* p_pLogServerData)
|
|
||||||
{
|
|
||||||
EGSWConfigResult eResult=EGSWConfigResult__Ok;
|
|
||||||
int iAppIndex=0;
|
|
||||||
int iInstanceIndex=0;
|
|
||||||
GSWApp *pApp = NULL;
|
|
||||||
GSWAppInstance *pAppInstance = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
if (p_pConfigEntry)
|
|
||||||
{
|
|
||||||
BOOL fFound=FALSE;
|
|
||||||
for (iAppIndex=0;! fFound && iAppIndex<g_pAppList->uCount;iAppIndex++)
|
|
||||||
{
|
|
||||||
pApp = GSWList_ElementAtIndex(g_pAppList,iAppIndex);
|
|
||||||
fFound=(strcmp(p_pConfigEntry->pszAppName,pApp->pszName)==0);
|
|
||||||
};
|
|
||||||
if (!fFound)
|
|
||||||
{
|
|
||||||
time_t now;
|
|
||||||
time(&now);
|
|
||||||
srand(now);
|
|
||||||
pApp=(GSWApp*)calloc(1,sizeof(GSWApp));
|
|
||||||
pApp->pszName=strdup(p_pConfigEntry->pszAppName);
|
|
||||||
pApp->iIndex = rand();
|
|
||||||
GSWList_Add(g_pAppList,pApp);
|
|
||||||
};
|
|
||||||
fFound = 0;
|
|
||||||
for (iInstanceIndex=0;!fFound && iInstanceIndex<pApp->stInstances.uCount;iInstanceIndex++)
|
|
||||||
{
|
|
||||||
pAppInstance = GSWList_ElementAtIndex(&(pApp->stInstances),iInstanceIndex);
|
|
||||||
if (pAppInstance->iInstance==p_pConfigEntry->iInstance)
|
|
||||||
{
|
|
||||||
fFound=TRUE;
|
|
||||||
free(pAppInstance->pszHost);
|
|
||||||
pAppInstance->pszHost=NULL;
|
|
||||||
pAppInstance->pszHost=strdup(p_pConfigEntry->pszHostName);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
if (!fFound)
|
|
||||||
{
|
|
||||||
pAppInstance = (GSWAppInstance *)calloc(1,sizeof(GSWAppInstance));
|
|
||||||
pAppInstance->iInstance = p_pConfigEntry->iInstance;
|
|
||||||
pAppInstance->pszHost = strdup(p_pConfigEntry->pszHostName);
|
|
||||||
GSWList_Add(&pApp->stInstances,pAppInstance);
|
|
||||||
};
|
|
||||||
|
|
||||||
pAppInstance->iPort = p_pConfigEntry->iPort;
|
|
||||||
pAppInstance->timeNextRetryTime=0;
|
|
||||||
pAppInstance->fValid=TRUE;
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,
|
|
||||||
"Config: %s instance %d host %s port %d Valid:%s timeNextRetryTime? %d",
|
|
||||||
pApp->pszName,
|
|
||||||
pAppInstance->iInstance,
|
|
||||||
pAppInstance->pszHost,
|
|
||||||
pAppInstance->iPort,
|
|
||||||
(pAppInstance->fValid ? "YES" : "NO"),
|
|
||||||
pAppInstance->timeNextRetryTime);
|
|
||||||
};
|
|
||||||
return eResult;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
static void GSWLoadBalancing_VerifyConfiguration(void* p_pLogServerData)
|
|
||||||
{
|
|
||||||
proplist_t propListConfig=NULL;
|
|
||||||
if (!g_pAppList)
|
|
||||||
g_pAppList = GSWList_New(16);
|
|
||||||
|
|
||||||
if (GSWConfig_ReadIFND(GSWConfig_GetConfigFilePath(),
|
|
||||||
&config_mtime,
|
|
||||||
&propListConfig,
|
|
||||||
p_pLogServerData)==EGSWConfigResult__Ok)
|
|
||||||
{
|
|
||||||
proplist_t propListApps=NULL;
|
|
||||||
GSWLoadBalancing_ClearInstances();
|
|
||||||
propListApps=GSWConfig_GetApplicationsFromConfig(propListConfig);
|
|
||||||
if (propListApps)
|
|
||||||
{
|
|
||||||
int iAppIndex=0;
|
|
||||||
int iInstanceIndex=0;
|
|
||||||
GSWApp* pApp=NULL;
|
|
||||||
GSWAppInstance* pAppInstance=NULL;
|
|
||||||
proplist_t propListAppsNames=GSWConfig_ApplicationsKeysFromApplications(propListApps);
|
|
||||||
unsigned int uAppNb=PLGetNumberOfElements(propListAppsNames);
|
|
||||||
for(iAppIndex=0;iAppIndex<uAppNb;iAppIndex++)
|
|
||||||
{
|
|
||||||
proplist_t propListAppKey=GSWConfig_ApplicationKeyFromApplicationsKey(propListAppsNames,iAppIndex);
|
|
||||||
if (!propListAppKey)
|
|
||||||
{
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
CONST char* pszAppName=PLGetString(propListAppKey);
|
|
||||||
proplist_t propListApp=GSWConfig_ApplicationFromApplications(propListApps,
|
|
||||||
propListAppKey);
|
|
||||||
if (!propListApp)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"no ppropListApp");
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
proplist_t propListInstances=GSWConfig_InstancesFromApplication(propListApp);
|
|
||||||
if (!propListInstances)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"no propListInstances");
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
unsigned int uInstancesNb=PLGetNumberOfElements(propListInstances);
|
|
||||||
|
|
||||||
for(iInstanceIndex=0;iInstanceIndex<uInstancesNb;iInstanceIndex++)
|
|
||||||
{
|
|
||||||
proplist_t propListInstance=PLGetArrayElement(propListInstances,iInstanceIndex);
|
|
||||||
if (!propListInstance)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"no propListInstance");
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
else if (!PLIsDictionary(propListInstance))
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"propListInstance is not a dictionary");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
STGSWConfigEntry stEntry;
|
|
||||||
GSWConfig_PropListInstanceToInstanceEntry(&stEntry,
|
|
||||||
propListInstance,
|
|
||||||
pszAppName);
|
|
||||||
GSWLoadBalancing_NewInstance(&stEntry,p_pLogServerData);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
// Changed !
|
|
||||||
for (iAppIndex=g_pAppList->uCount-1;iAppIndex>=0;iAppIndex--)
|
|
||||||
{
|
|
||||||
pApp=GSWList_ElementAtIndex(g_pAppList,iAppIndex);
|
|
||||||
for (iInstanceIndex=pApp->stInstances.uCount-1;iInstanceIndex>=0;iInstanceIndex--)
|
|
||||||
{
|
|
||||||
pAppInstance = GSWList_ElementAtIndex(&pApp->stInstances,iInstanceIndex);
|
|
||||||
if (!pAppInstance->fValid)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"Removing %s instance %d %s",
|
|
||||||
pApp->pszName,
|
|
||||||
pAppInstance->iInstance,
|
|
||||||
pAppInstance->pszHost);
|
|
||||||
GSWList_RemoveAtIndex(&pApp->stInstances,iInstanceIndex);
|
|
||||||
if (pAppInstance->uOpenedRequestsNb==0)
|
|
||||||
{
|
|
||||||
free(pAppInstance->pszHost);
|
|
||||||
pAppInstance->pszHost=NULL;
|
|
||||||
free(pAppInstance);
|
|
||||||
pAppInstance=NULL;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
if (pApp->stInstances.uCount==0)
|
|
||||||
{
|
|
||||||
GSWList_RemoveAtIndex(g_pAppList,iAppIndex);
|
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"Removing application %s as there is no instance left.",
|
|
||||||
pApp->pszName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
GSWList_Sort(&pApp->stInstances,compareInstances);
|
|
||||||
for (iInstanceIndex=0;iInstanceIndex<pApp->stInstances.uCount-1;iInstanceIndex++)
|
|
||||||
{
|
|
||||||
GSWAppInstance* pAppInstance0=GSWList_ElementAtIndex(&pApp->stInstances,iInstanceIndex);
|
|
||||||
GSWAppInstance* pAppInstance1=GSWList_ElementAtIndex(&pApp->stInstances,iInstanceIndex+1);
|
|
||||||
if (pAppInstance0->iInstance == pAppInstance1->iInstance)
|
|
||||||
{
|
|
||||||
GSWLog(GSW_ERROR,
|
|
||||||
p_pLogServerData,
|
|
||||||
"Configuration error: instance numbers must be unique:\n\t(%s:%d@%s) == (%s:%d@%s)",
|
|
||||||
pApp->pszName,pAppInstance0->iInstance,
|
|
||||||
pAppInstance0->pszHost,
|
|
||||||
pApp->pszName,pAppInstance1->iInstance,
|
|
||||||
pAppInstance1->pszHost);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
GSWList_Sort(g_pAppList,compareApps);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
BOOL GSWLoadBalancing_FindApp(void* p_pLogServerData,GSWAppRequest *p_pAppRequest)
|
|
||||||
{
|
{
|
||||||
BOOL fFound=FALSE;
|
BOOL fFound=FALSE;
|
||||||
GSWApp* pApp=NULL;
|
GSWApp* pApp=NULL;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWLoadBalancing_FindApp");
|
||||||
|
GSWLog(GSW_INFO,p_pLogServerData,"LoadBalance: looking for %s",
|
||||||
|
p_pAppRequest->pszName);
|
||||||
|
GSWConfig_LoadConfiguration(p_pLogServerData);
|
||||||
GSWLock_Lock(g_lockAppList);
|
GSWLock_Lock(g_lockAppList);
|
||||||
GSWLoadBalancing_VerifyConfiguration(p_pLogServerData);
|
pApp = GSWConfig_GetApp(p_pAppRequest->pszName);
|
||||||
pApp = GSWList_BSearch(g_pAppList,
|
|
||||||
p_pAppRequest->pszName,
|
|
||||||
compareAppNames);
|
|
||||||
if (pApp)
|
if (pApp)
|
||||||
{
|
{
|
||||||
int iTries=pApp->stInstances.uCount;
|
GSWList* pInstancesList=GSWDict_AllKeys(&pApp->stInstancesDict);
|
||||||
|
unsigned int uInstancesCount=GSWList_Count(pInstancesList);
|
||||||
|
int iTries=uInstancesCount;
|
||||||
GSWAppInstance* pAppInstance=NULL;
|
GSWAppInstance* pAppInstance=NULL;
|
||||||
time_t curTime = (time_t)0;
|
time_t curTime = (time_t)0;
|
||||||
|
|
||||||
while (!fFound && iTries-->0)
|
while (!fFound && iTries-->0)
|
||||||
{
|
{
|
||||||
pApp->iIndex = (pApp->iIndex+1) % pApp->stInstances.uCount;
|
pApp->iIndex = (pApp->iIndex+1) % uInstancesCount;
|
||||||
pAppInstance=GSWList_ElementAtIndex((&pApp->stInstances),pApp->iIndex);
|
pAppInstance=(GSWAppInstance*)GSWDict_ValueForKey(&pApp->stInstancesDict,
|
||||||
if (pAppInstance->timeNextRetryTime!=0)
|
GSWList_ElementAtIndex(pInstancesList,pApp->iIndex));
|
||||||
|
if (pAppInstance)
|
||||||
{
|
{
|
||||||
if (!curTime)
|
if (!pAppInstance->pApp)
|
||||||
time(&curTime);
|
|
||||||
if (pAppInstance->timeNextRetryTime<curTime)
|
|
||||||
{
|
{
|
||||||
GSWLog(GSW_INFO,
|
GSWLog(GSW_CRITICAL,p_pLogServerData,
|
||||||
p_pLogServerData,
|
"AppInstance pApp is null pAppInstance=%p",
|
||||||
"LoadBalance: Instance %s:%d was marked dead for %d secs. Now resurecting !",
|
pAppInstance);
|
||||||
p_pAppRequest->pszName,
|
};
|
||||||
pAppInstance->iInstance,
|
if (pAppInstance->timeNextRetryTime!=0)
|
||||||
APP_CONNECT_RETRY_DELAY);
|
{
|
||||||
pAppInstance->timeNextRetryTime=0;
|
if (!curTime)
|
||||||
|
time(&curTime);
|
||||||
|
if (pAppInstance->timeNextRetryTime<curTime)
|
||||||
|
{
|
||||||
|
GSWLog(GSW_CRITICAL,
|
||||||
|
p_pLogServerData,
|
||||||
|
"LoadBalance: Instance %s:%d was marked dead for %d secs. Now resurecting !",
|
||||||
|
p_pAppRequest->pszName,
|
||||||
|
pAppInstance->iInstance,
|
||||||
|
APP_CONNECT_RETRY_DELAY);
|
||||||
|
pAppInstance->timeNextRetryTime=0;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (pAppInstance->timeNextRetryTime==0 && pAppInstance->fValid)
|
||||||
|
{
|
||||||
|
fFound = TRUE;
|
||||||
|
strcpy(p_pAppRequest->pszName,pApp->pszName);
|
||||||
|
p_pAppRequest->iInstance = pAppInstance->iInstance;
|
||||||
|
p_pAppRequest->pszHost = pAppInstance->pszHostName;
|
||||||
|
p_pAppRequest->iPort = pAppInstance->iPort;
|
||||||
|
p_pAppRequest->eType = EAppType_LoadBalanced;
|
||||||
|
p_pAppRequest->pAppInstance = pAppInstance;
|
||||||
|
pAppInstance->uOpenedRequestsNb++;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
if (pAppInstance->timeNextRetryTime==0 && pAppInstance->fValid)
|
|
||||||
{
|
|
||||||
fFound = TRUE;
|
|
||||||
strcpy(p_pAppRequest->pszName,pApp->pszName);
|
|
||||||
p_pAppRequest->iInstance = pAppInstance->iInstance;
|
|
||||||
p_pAppRequest->pszHost = pAppInstance->pszHost;
|
|
||||||
p_pAppRequest->iPort = pAppInstance->iPort;
|
|
||||||
p_pAppRequest->eType = EAppType_LoadBalanced;
|
|
||||||
p_pAppRequest->pLoadBalancingData = pAppInstance;
|
|
||||||
pAppInstance->uOpenedRequestsNb++;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
GSWList_Free(pInstancesList,FALSE);
|
||||||
};
|
};
|
||||||
GSWLock_Unlock(g_lockAppList);
|
GSWLock_Unlock(g_lockAppList);
|
||||||
|
|
||||||
|
@ -347,60 +113,69 @@ BOOL GSWLoadBalancing_FindApp(void* p_pLogServerData,GSWAppRequest *p_pAppReques
|
||||||
p_pAppRequest->pszName,
|
p_pAppRequest->pszName,
|
||||||
p_pAppRequest->iInstance,
|
p_pAppRequest->iInstance,
|
||||||
p_pAppRequest->pszHost,
|
p_pAppRequest->pszHost,
|
||||||
p_pAppRequest->iPort);
|
p_pAppRequest->iPort);
|
||||||
else
|
else
|
||||||
GSWLog(GSW_INFO,p_pLogServerData,"LoadBalance: looking for %s, Not Found",
|
GSWLog(GSW_INFO,p_pLogServerData,"LoadBalance: looking for %s, Not Found",
|
||||||
p_pAppRequest->pszName);
|
p_pAppRequest->pszName);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWLoadBalancing_FindApp");
|
||||||
return fFound;
|
return fFound;
|
||||||
};
|
};
|
||||||
|
|
||||||
BOOL GSWLoadBalancing_FindInstance(void* p_pLogServerData,GSWAppRequest *p_pAppRequest)
|
//--------------------------------------------------------------------
|
||||||
|
BOOL GSWLoadBalancing_FindInstance(GSWAppRequest *p_pAppRequest,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
BOOL fFound=FALSE;
|
BOOL fFound=FALSE;
|
||||||
GSWApp* pApp=NULL;
|
GSWApp* pApp=NULL;
|
||||||
int i=0;
|
int i=0;
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Start GSWLoadBalancing_FindInstance");
|
||||||
|
GSWConfig_LoadConfiguration(p_pLogServerData);
|
||||||
GSWLock_Lock(g_lockAppList);
|
GSWLock_Lock(g_lockAppList);
|
||||||
GSWLoadBalancing_VerifyConfiguration(p_pLogServerData);
|
pApp = (GSWApp*)GSWConfig_GetApp(p_pAppRequest->pszName);
|
||||||
|
|
||||||
pApp=GSWList_BSearch(g_pAppList,p_pAppRequest->pszName,compareAppNames);
|
|
||||||
if (pApp)
|
if (pApp)
|
||||||
{
|
{
|
||||||
GSWAppInstance* pAppInstance=NULL;
|
GSWAppInstance* pAppInstance=NULL;
|
||||||
for (i=0;i<pApp->stInstances.uCount && !fFound;i++)
|
char szInstanceNum[50]="";
|
||||||
|
sprintf(szInstanceNum,"%d",p_pAppRequest->iInstance);
|
||||||
|
pAppInstance=(GSWAppInstance*)GSWDict_ValueForKey(&pApp->stInstancesDict,szInstanceNum);
|
||||||
|
if (pAppInstance && pAppInstance->fValid)
|
||||||
{
|
{
|
||||||
pAppInstance = GSWList_ElementAtIndex((&pApp->stInstances),i);
|
fFound=TRUE;
|
||||||
if (pAppInstance->iInstance
|
p_pAppRequest->iInstance = pAppInstance->iInstance;
|
||||||
&& pAppInstance->iInstance==p_pAppRequest->iInstance
|
p_pAppRequest->pszHost = pAppInstance->pszHostName;
|
||||||
&& pAppInstance->fValid)
|
p_pAppRequest->iPort = pAppInstance->iPort;
|
||||||
{
|
p_pAppRequest->eType = EAppType_LoadBalanced;
|
||||||
fFound=TRUE;
|
p_pAppRequest->pAppInstance = pAppInstance;
|
||||||
p_pAppRequest->iInstance = pAppInstance->iInstance;
|
pAppInstance->uOpenedRequestsNb++;
|
||||||
p_pAppRequest->pszHost = pAppInstance->pszHost;
|
|
||||||
p_pAppRequest->iPort = pAppInstance->iPort;
|
|
||||||
p_pAppRequest->eType = EAppType_LoadBalanced;
|
|
||||||
p_pAppRequest->pLoadBalancingData = pAppInstance;
|
|
||||||
pAppInstance->uOpenedRequestsNb++;
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
GSWLock_Unlock(g_lockAppList);
|
GSWLock_Unlock(g_lockAppList);
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"Stop GSWLoadBalancing_FindInstance");
|
||||||
return fFound;
|
return fFound;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWLoadBalancing_MarkNotRespondingApp(void* p_pLogServerData,GSWAppRequest *p_pAppRequest)
|
//--------------------------------------------------------------------
|
||||||
|
void GSWLoadBalancing_MarkNotRespondingApp(GSWAppRequest* p_pAppRequest,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWAppInstance* pAppInstance;
|
GSWAppInstance* pAppInstance;
|
||||||
time_t now;
|
time_t now;
|
||||||
time(&now);
|
time(&now);
|
||||||
pAppInstance = (GSWAppInstance *)p_pAppRequest->pLoadBalancingData;
|
pAppInstance =p_pAppRequest->pAppInstance;
|
||||||
pAppInstance->uOpenedRequestsNb--;
|
pAppInstance->uOpenedRequestsNb--;
|
||||||
pAppInstance->timeNextRetryTime=now+APP_CONNECT_RETRY_DELAY;
|
pAppInstance->timeNextRetryTime=now+APP_CONNECT_RETRY_DELAY;
|
||||||
GSWLog(GSW_WARNING,p_pLogServerData,"Marking %s unresponsive",p_pAppRequest->pszName);
|
GSWLog(GSW_WARNING,p_pLogServerData,"Marking %s unresponsive",p_pAppRequest->pszName);
|
||||||
}
|
if (!pAppInstance->fValid)
|
||||||
|
{
|
||||||
|
if (GSWAppInstance_FreeIFND(pAppInstance))
|
||||||
|
pAppInstance=NULL;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
void GSWLoadBalancing_StartAppRequest(void* p_pLogServerData,GSWAppRequest *p_pAppRequest)
|
//--------------------------------------------------------------------
|
||||||
|
void GSWLoadBalancing_StartAppRequest(GSWAppRequest* p_pAppRequest,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWAppInstance* pAppInstance=(GSWAppInstance*)p_pAppRequest->pLoadBalancingData;
|
GSWAppInstance* pAppInstance=p_pAppRequest->pAppInstance;
|
||||||
if (pAppInstance->timeNextRetryTime!=0)
|
if (pAppInstance->timeNextRetryTime!=0)
|
||||||
{
|
{
|
||||||
pAppInstance->timeNextRetryTime=0;
|
pAppInstance->timeNextRetryTime=0;
|
||||||
|
@ -408,18 +183,19 @@ void GSWLoadBalancing_StartAppRequest(void* p_pLogServerData,GSWAppRequest *p_pA
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
void GSWLoadBalancing_StopAppRequest(void* p_pLogServerData,GSWAppRequest *p_pAppRequest)
|
//--------------------------------------------------------------------
|
||||||
|
void GSWLoadBalancing_StopAppRequest(GSWAppRequest *p_pAppRequest,
|
||||||
|
void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWAppInstance* pAppInstance=(GSWAppInstance*)p_pAppRequest->pLoadBalancingData;
|
GSWAppInstance* pAppInstance=p_pAppRequest->pAppInstance;
|
||||||
GSWLock_Lock(g_lockAppList);
|
GSWLock_Lock(g_lockAppList);
|
||||||
pAppInstance->uOpenedRequestsNb--;
|
pAppInstance->uOpenedRequestsNb--;
|
||||||
if (!pAppInstance->fValid && pAppInstance->uOpenedRequestsNb==0)
|
if (!pAppInstance->fValid)
|
||||||
{
|
{
|
||||||
GSWLog(GSW_ERROR,p_pLogServerData,"Not deleted (not implemented) %s (%d)",
|
if (GSWAppInstance_FreeIFND(pAppInstance))
|
||||||
p_pAppRequest->pszName,
|
pAppInstance=NULL;
|
||||||
p_pAppRequest->iInstance);
|
|
||||||
};
|
};
|
||||||
GSWLock_Unlock(g_lockAppList);
|
GSWLock_Unlock(g_lockAppList);
|
||||||
p_pAppRequest->pLoadBalancingData = NULL;
|
p_pAppRequest->pAppInstance = NULL;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -24,12 +24,11 @@
|
||||||
#ifndef _GSWLoadBalancing_h__
|
#ifndef _GSWLoadBalancing_h__
|
||||||
#define _GSWLoadBalancing_h__
|
#define _GSWLoadBalancing_h__
|
||||||
|
|
||||||
void GSWLoadBalancing_Init(GSWDict *dict);
|
BOOL GSWLoadBalancing_FindApp(GSWAppRequest* p_pAppRequest,void* p_pLogServerData);
|
||||||
BOOL GSWLoadBalancing_FindApp(void* p_pLogServerData,GSWAppRequest *app);
|
BOOL GSWLoadBalancing_FindInstance(GSWAppRequest* p_pAppRequest,void* p_pLogServerData);
|
||||||
BOOL GSWLoadBalancing_FindInstance(void* p_pLogServerData,GSWAppRequest *app);
|
void GSWLoadBalancing_MarkNotRespondingApp(GSWAppRequest* p_pAppRequest,void* p_pLogServerData);
|
||||||
void GSWLoadBalancing_MarkNotRespondingApp(void* p_pLogServerData,GSWAppRequest *app);
|
void GSWLoadBalancing_StartAppRequest(GSWAppRequest* p_pAppRequest,void* p_pLogServerData);
|
||||||
void GSWLoadBalancing_StartAppRequest(void* p_pLogServerData,GSWAppRequest *app);
|
void GSWLoadBalancing_StopAppRequest(GSWAppRequest* p_pAppRequest,void* p_pLogServerData);
|
||||||
void GSWLoadBalancing_StopAppRequest(void* p_pLogServerData,GSWAppRequest *app);
|
|
||||||
|
|
||||||
#endif // GSWLoadBalancing
|
#endif // GSWLoadBalancing
|
||||||
|
|
||||||
|
|
270
GSWAdaptors/common/GSWPropList.c
Normal file
270
GSWAdaptors/common/GSWPropList.c
Normal file
|
@ -0,0 +1,270 @@
|
||||||
|
/* GSWPropList.c - GSWeb: Adaptors: GSWPropList
|
||||||
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
Date: March 2000
|
||||||
|
|
||||||
|
This file is part of the GNUstep Web Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include "GSWUtil.h"
|
||||||
|
#include "GSWDict.h"
|
||||||
|
#include "GSWString.h"
|
||||||
|
#include "GSWUtil.h"
|
||||||
|
#include "GSWPropList.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* PLGetType(proplist_t pl)
|
||||||
|
{
|
||||||
|
if (!pl)
|
||||||
|
return "NULL";
|
||||||
|
else if (PLIsDictionary(pl))
|
||||||
|
return "Dictionary";
|
||||||
|
else if (PLIsArray(pl))
|
||||||
|
return "Array";
|
||||||
|
else if (PLIsString(pl))
|
||||||
|
return "String";
|
||||||
|
else if (PLIsData(pl))
|
||||||
|
return "Data";
|
||||||
|
else if (PLIsSimple(pl))
|
||||||
|
return "Simple";
|
||||||
|
else if (PLIsCompound(pl))
|
||||||
|
return "Compound";
|
||||||
|
else
|
||||||
|
return "Unknown";
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
BOOL GSWPropList_TestDictionary(proplist_t pl,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
char* pszMsgInfo0=NULL;
|
||||||
|
char* pszMsgInfo1=NULL;
|
||||||
|
BOOL fOk=TRUE;
|
||||||
|
if (pl)
|
||||||
|
{
|
||||||
|
if (!PLIsDictionary(pl))
|
||||||
|
{
|
||||||
|
CONST char* pszType=PLGetType(pl);
|
||||||
|
pszMsgInfo0=calloc(256+SafeStrlen(pszType),sizeof(char));
|
||||||
|
sprintf(pszMsgInfo0,"is not a dictionary its a %s:",pszType);
|
||||||
|
pszMsgInfo1=PLGetDescription(pl);//We have to free it
|
||||||
|
fOk=FALSE;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (p_fErrorIfNotExists)
|
||||||
|
{
|
||||||
|
pszMsgInfo0=strdup("not found");
|
||||||
|
fOk=FALSE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (!fOk)
|
||||||
|
{
|
||||||
|
GSWLogSized(GSW_CRITICAL,
|
||||||
|
p_pLogServerData,
|
||||||
|
256+SafeStrlen(p_pszParents)+SafeStrlen(p_pszKey)+SafeStrlen(pszMsgInfo0)+SafeStrlen(pszMsgInfo1),
|
||||||
|
"%s/%s %s %s",
|
||||||
|
(p_pszParents ? p_pszParents : ""),
|
||||||
|
(p_pszKey ? p_pszKey : ""),
|
||||||
|
(pszMsgInfo0 ? pszMsgInfo0 : ""),
|
||||||
|
(pszMsgInfo1 ? pszMsgInfo1 : ""));
|
||||||
|
if (pszMsgInfo0)
|
||||||
|
free(pszMsgInfo0);
|
||||||
|
if (pszMsgInfo1)
|
||||||
|
free(pszMsgInfo1);
|
||||||
|
};
|
||||||
|
return fOk;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
BOOL GSWPropList_TestArray(proplist_t pl,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
char* pszMsgInfo0=NULL;
|
||||||
|
char* pszMsgInfo1=NULL;
|
||||||
|
BOOL fOk=TRUE;
|
||||||
|
if (pl)
|
||||||
|
{
|
||||||
|
if (!PLIsArray(pl))
|
||||||
|
{
|
||||||
|
CONST char* pszType=PLGetType(pl);
|
||||||
|
pszMsgInfo0=calloc(256+SafeStrlen(pszType),sizeof(char));
|
||||||
|
sprintf(pszMsgInfo0,"is not an array its a %s:",pszType);
|
||||||
|
pszMsgInfo1=PLGetDescription(pl);//We have to free it
|
||||||
|
fOk=FALSE;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (p_fErrorIfNotExists)
|
||||||
|
{
|
||||||
|
pszMsgInfo0="not found";
|
||||||
|
fOk=FALSE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (!fOk)
|
||||||
|
{
|
||||||
|
GSWLogSized(GSW_CRITICAL,
|
||||||
|
p_pLogServerData,
|
||||||
|
256+SafeStrlen(p_pszParents)+SafeStrlen(p_pszKey)+SafeStrlen(pszMsgInfo0)+SafeStrlen(pszMsgInfo1),
|
||||||
|
"%s/%s %s %s",
|
||||||
|
(p_pszParents ? p_pszParents : ""),
|
||||||
|
(p_pszKey ? p_pszKey : ""),
|
||||||
|
(pszMsgInfo0 ? pszMsgInfo0 : ""),
|
||||||
|
(pszMsgInfo1 ? pszMsgInfo1 : ""));
|
||||||
|
if (pszMsgInfo0)
|
||||||
|
free(pszMsgInfo0);
|
||||||
|
if (pszMsgInfo1)
|
||||||
|
free(pszMsgInfo1);
|
||||||
|
};
|
||||||
|
return fOk;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
BOOL GSWPropList_TestString(proplist_t pl,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
char* pszMsgInfo0=NULL;
|
||||||
|
char* pszMsgInfo1=NULL;
|
||||||
|
BOOL fOk=TRUE;
|
||||||
|
if (pl)
|
||||||
|
{
|
||||||
|
if (!PLIsString(pl))
|
||||||
|
{
|
||||||
|
CONST char* pszType=PLGetType(pl);
|
||||||
|
pszMsgInfo0=calloc(256+SafeStrlen(pszType),sizeof(char));
|
||||||
|
sprintf(pszMsgInfo0,"is not a string its a %s:",pszType);
|
||||||
|
pszMsgInfo1=PLGetDescription(pl);//We have to free it
|
||||||
|
fOk=FALSE;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (p_fErrorIfNotExists)
|
||||||
|
{
|
||||||
|
pszMsgInfo0="not found";
|
||||||
|
fOk=FALSE;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
if (!fOk)
|
||||||
|
{
|
||||||
|
GSWLogSized(GSW_CRITICAL,
|
||||||
|
p_pLogServerData,
|
||||||
|
256+SafeStrlen(p_pszParents)+SafeStrlen(p_pszKey)+SafeStrlen(pszMsgInfo0)+SafeStrlen(pszMsgInfo1),
|
||||||
|
"%s/%s %s %s",
|
||||||
|
(p_pszParents ? p_pszParents : ""),
|
||||||
|
(p_pszKey ? p_pszKey : ""),
|
||||||
|
(pszMsgInfo0 ? pszMsgInfo0 : ""),
|
||||||
|
(pszMsgInfo1 ? pszMsgInfo1 : ""));
|
||||||
|
if (pszMsgInfo0)
|
||||||
|
free(pszMsgInfo0);
|
||||||
|
if (pszMsgInfo1)
|
||||||
|
free(pszMsgInfo1);
|
||||||
|
};
|
||||||
|
return fOk;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
//Do not destroy the returned proplist !
|
||||||
|
proplist_t GSWPropList_GetDictionaryEntry(proplist_t p_propListDictionary,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
PLTypeTestFn p_pTestFn,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
proplist_t propListKey=PLMakeString((char*)p_pszKey);
|
||||||
|
proplist_t propList=NULL;
|
||||||
|
if (GSWPropList_TestDictionary(p_propListDictionary,TRUE,NULL,p_pszParents,p_pLogServerData))
|
||||||
|
{
|
||||||
|
propList=PLGetDictionaryEntry(p_propListDictionary,propListKey);
|
||||||
|
if (p_pTestFn)
|
||||||
|
{
|
||||||
|
if (!(*p_pTestFn)(propList,p_fErrorIfNotExists,p_pszKey,p_pszParents,p_pLogServerData))
|
||||||
|
propList=NULL;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
PLRelease(propListKey);
|
||||||
|
return propList;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
//Do not destroy the returned proplist !
|
||||||
|
proplist_t GSWPropList_GetArrayElement(proplist_t p_propListArray,
|
||||||
|
int p_iIndex,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
PLTypeTestFn p_pTestFn,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
proplist_t propList=NULL;
|
||||||
|
if (GSWPropList_TestArray(p_propListArray,TRUE,NULL,p_pszParents,p_pLogServerData))
|
||||||
|
{
|
||||||
|
propList=PLGetArrayElement(p_propListArray,p_iIndex);
|
||||||
|
if (p_pTestFn)
|
||||||
|
{
|
||||||
|
char szKey[120]="";
|
||||||
|
sprintf(szKey,"index: %d",p_iIndex);
|
||||||
|
if (!(*p_pTestFn)(propList,p_fErrorIfNotExists,szKey,p_pszParents,p_pLogServerData))
|
||||||
|
propList=NULL;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return propList;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
//You have to free the returned proplist !
|
||||||
|
proplist_t GSWPropList_GetAllDictionaryKeys(proplist_t p_propListDictionary,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
PLTypeTestFn p_pTestFn,
|
||||||
|
void* p_pLogServerData)
|
||||||
|
{
|
||||||
|
proplist_t propList=NULL;
|
||||||
|
if (GSWPropList_TestDictionary(p_propListDictionary,TRUE,NULL,p_pszParents,p_pLogServerData))
|
||||||
|
{
|
||||||
|
propList=PLGetAllDictionaryKeys(p_propListDictionary);
|
||||||
|
if (p_pTestFn)
|
||||||
|
{
|
||||||
|
if (!(*p_pTestFn)(propList,p_fErrorIfNotExists,NULL,p_pszParents,p_pLogServerData))
|
||||||
|
propList=NULL;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return propList;
|
||||||
|
};
|
71
GSWAdaptors/common/GSWPropList.h
Normal file
71
GSWAdaptors/common/GSWPropList.h
Normal file
|
@ -0,0 +1,71 @@
|
||||||
|
/* GSWPropList.h - GSWeb: PropList
|
||||||
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
Date: March 2000
|
||||||
|
|
||||||
|
This file is part of the GNUstep Web Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _GSWPropList_h__
|
||||||
|
#define _GSWPropList_h__
|
||||||
|
|
||||||
|
#include <proplist.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include "GSWList.h"
|
||||||
|
|
||||||
|
typedef BOOL (*PLTypeTestFn)(proplist_t pl,BOOL p_fErrorIfNotExists,CONST char* p_pszKey,CONST char* p_pszParents,void* p_pLogServerData);
|
||||||
|
|
||||||
|
CONST char* PLGetType(proplist_t pl);
|
||||||
|
BOOL GSWPropList_TestDictionary(proplist_t pl,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
BOOL GSWPropList_TestArray(proplist_t pl,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
BOOL GSWPropList_TestString(proplist_t pl,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
|
//Do not destroy the returned proplist !
|
||||||
|
proplist_t GSWPropList_GetDictionaryEntry(proplist_t p_propListDictionary,
|
||||||
|
CONST char* p_pszKey,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
PLTypeTestFn p_pTestFn,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
//Do not destroy the returned proplist !
|
||||||
|
proplist_t GSWPropList_GetArrayElement(proplist_t p_propListArray,
|
||||||
|
int p_iIndex,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
PLTypeTestFn p_pTestFn,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
//You have to free the returned proplist !
|
||||||
|
proplist_t GSWPropList_GetAllDictionaryKeys(proplist_t p_propListDictionary,
|
||||||
|
CONST char* p_pszParents,
|
||||||
|
BOOL p_fErrorIfNotExists,
|
||||||
|
PLTypeTestFn p_pTestFn,
|
||||||
|
void* p_pLogServerData);
|
||||||
|
|
||||||
|
#endif //_GSWPropList_h__
|
|
@ -32,6 +32,7 @@
|
||||||
#include "GSWString.h"
|
#include "GSWString.h"
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
GSWString* GSWString_New()
|
GSWString* GSWString_New()
|
||||||
{
|
{
|
||||||
GSWString* pString = malloc(sizeof(GSWString));
|
GSWString* pString = malloc(sizeof(GSWString));
|
||||||
|
@ -39,6 +40,7 @@ GSWString* GSWString_New()
|
||||||
return pString;
|
return pString;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWString_Free(GSWString* p_pString)
|
void GSWString_Free(GSWString* p_pString)
|
||||||
{
|
{
|
||||||
if (p_pString)
|
if (p_pString)
|
||||||
|
@ -52,29 +54,75 @@ void GSWString_Free(GSWString* p_pString)
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
int GSWString_Len(GSWString* p_pString)
|
||||||
|
{
|
||||||
|
return p_pString->iLen;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWString_Detach(GSWString* p_pString)
|
void GSWString_Detach(GSWString* p_pString)
|
||||||
{
|
{
|
||||||
memset(p_pString,0,sizeof(GSWString));
|
memset(p_pString,0,sizeof(GSWString));
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWString_Append(GSWString* p_pString,
|
//--------------------------------------------------------------------
|
||||||
CONST char* p_pszString)
|
void GSWString_GrowUpToSize(GSWString* p_pString,
|
||||||
|
int p_iSize)
|
||||||
{
|
{
|
||||||
int iLen = strlen(p_pszString);
|
if (p_iSize>p_pString->iSize)
|
||||||
if ((p_pString->iLen+iLen+1)>p_pString->iSize)
|
|
||||||
{
|
{
|
||||||
if (!p_pString->pszData)
|
if (!p_pString->pszData)
|
||||||
{
|
{
|
||||||
p_pString->iSize=max(iLen+1,4096);
|
p_pString->iSize=max(p_iSize,4096);
|
||||||
p_pString->pszData=malloc(p_pString->iSize);
|
p_pString->pszData=malloc(p_pString->iSize);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
p_pString->iSize+=max(iLen+1,4096);
|
p_pString->iSize=max(p_iSize,4096);
|
||||||
p_pString->pszData=realloc(p_pString->pszData,p_pString->iSize);
|
p_pString->pszData=realloc(p_pString->pszData,p_pString->iSize);
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWString_Append(GSWString* p_pString,
|
||||||
|
CONST char* p_pszString)
|
||||||
|
{
|
||||||
|
int iLen = strlen(p_pszString);
|
||||||
|
GSWString_GrowUpToSize(p_pString,p_pString->iLen+iLen+1);
|
||||||
memcpy(p_pString->pszData+p_pString->iLen,p_pszString,iLen+1);
|
memcpy(p_pString->pszData+p_pString->iLen,p_pszString,iLen+1);
|
||||||
p_pString->iLen+=iLen;
|
p_pString->iLen+=iLen;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWString_SearchReplace(GSWString* p_pString,
|
||||||
|
CONST char* p_pszSearch,
|
||||||
|
CONST char* p_pszReplace)
|
||||||
|
{
|
||||||
|
int iSearchLen=SafeStrlen(p_pszSearch);
|
||||||
|
if (iSearchLen>0)
|
||||||
|
{
|
||||||
|
char* p=strstr(p_pString->pszData,p_pszSearch);
|
||||||
|
if (p)
|
||||||
|
{
|
||||||
|
int iIndex=0;
|
||||||
|
int iReplaceLen=SafeStrlen(p_pszReplace);
|
||||||
|
int iDiff=iReplaceLen-iSearchLen;
|
||||||
|
while(p)
|
||||||
|
{
|
||||||
|
iIndex=p-p_pString->pszData;
|
||||||
|
if (iDiff>0)
|
||||||
|
GSWString_GrowUpToSize(p_pString,p_pString->iSize+iDiff);
|
||||||
|
if (iDiff!=0)
|
||||||
|
memmove(p_pString->pszData+iIndex+iReplaceLen,
|
||||||
|
p_pString->pszData+iIndex+iSearchLen,
|
||||||
|
p_pString->iLen-iIndex-iSearchLen+1);
|
||||||
|
if (iReplaceLen>0)
|
||||||
|
memcpy(p_pString->pszData+iIndex,p_pszReplace,iReplaceLen);
|
||||||
|
p_pString->iLen+=iDiff;
|
||||||
|
p=strstr(p_pString->pszData+iIndex+iReplaceLen,p_pszSearch);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
|
@ -36,11 +36,14 @@ typedef struct _GSWString
|
||||||
} GSWString;
|
} GSWString;
|
||||||
|
|
||||||
GSWString* GSWString_New();
|
GSWString* GSWString_New();
|
||||||
|
int GSWString_Len(GSWString* p_pString);
|
||||||
void GSWString_Free(GSWString* p_pString);
|
void GSWString_Free(GSWString* p_pString);
|
||||||
void GSWString_Detach(GSWString* p_pString);
|
void GSWString_Detach(GSWString* p_pString);
|
||||||
void GSWString_Append(GSWString* p_pString,
|
void GSWString_Append(GSWString* p_pString,
|
||||||
CONST char* p_pszString);
|
CONST char* p_pszString);
|
||||||
|
void GSWString_SearchReplace(GSWString* p_pString,
|
||||||
|
CONST char* p_pszSearch,
|
||||||
|
CONST char* p_pszReplace);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
} // end of C header
|
} // end of C header
|
||||||
#endif //_cplusplus
|
#endif //_cplusplus
|
||||||
|
|
196
GSWAdaptors/common/GSWTemplates.c
Normal file
196
GSWAdaptors/common/GSWTemplates.c
Normal file
|
@ -0,0 +1,196 @@
|
||||||
|
/* GSWTemplates.c - GSWeb: GSWTemplates
|
||||||
|
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
Date: March 2000
|
||||||
|
|
||||||
|
This file is part of the GNUstep Web Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include "config.h"
|
||||||
|
#include "GSWConfig.h"
|
||||||
|
#include "GSWUtil.h"
|
||||||
|
#include "GSWTemplates.h"
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
const char* g_szErrorResponseTextTemplate[2]={
|
||||||
|
"##TEXT##",
|
||||||
|
"<HTML><BODY BGCOLOR=\"#FFFFFF\">\n"
|
||||||
|
"<CENTER><H1>##TEXT##</H1></CENTER>\n"
|
||||||
|
"<BR>\n"
|
||||||
|
"<CENTER><A HREF=\"http://www.gnustepweb.org\"><IMG SRC=\"##GSWEXTFWKWSR##/PoweredByGNUstepWeb.gif\" ALT=\"Powered By GNUstepWeb\" BORDER=0></A></CENTER>\n"
|
||||||
|
"</BODY></HTML>\n"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
const char* g_szErrorNoResponseMessageTemplate[2]={
|
||||||
|
"##APP_NAME##:##APP_INSTANCE## (##APP_HOST##:##APP_PORT##) doesn't repond",
|
||||||
|
"##APP_NAME##:##APP_INSTANCE## (##APP_HOST##:##APP_PORT##) doesn't repond"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
const char* g_szStatusResponseAllowedTemplate[2]={
|
||||||
|
"Server Status\n"
|
||||||
|
"##SERVER_INFO## ##SERVER_URL##\n"
|
||||||
|
"##ADAPTOR_INFO## ##ADAPTOR_URL##\n"
|
||||||
|
"##HEADERS##\n",
|
||||||
|
|
||||||
|
"<HTML><HEAD><TITLE>Server Status</TITLE></HEAD>\n"
|
||||||
|
"<BODY BGCOLOR=\"#FFFFFF\">\n"
|
||||||
|
"<br><strong>Server Adaptor:</strong><br>"
|
||||||
|
"<p>Server = <A HREF=\"##SERVER_URL##\">##SERVER_INFO##</A><BR>\n"
|
||||||
|
"Adaptor = <A HREF=\"##ADAPTOR_URL##\">##ADAPTOR_INFO##</A></p>\n"
|
||||||
|
"<p><strong>Headers:</strong><br>\n"
|
||||||
|
"##HEADERS##\n"
|
||||||
|
"<BR>\n"
|
||||||
|
"<CENTER><A HREF=\"http://www.gnustepweb.org\"><IMG SRC=\"##GSWEXTFWKWSR##/PoweredByGNUstepWeb.gif\" ALT=\"Powered By GNUstepWeb\" BORDER=0></A></CENTER>\n"
|
||||||
|
"</BODY></HTML>\n"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
const char* g_szStatusResponseDeniedTemplate[2]={
|
||||||
|
"Don't play with me ##REMOTE_ADDR## ##REMOTE_HOST##, I'll win!\n",
|
||||||
|
|
||||||
|
"<HTML><HEAD><TITLE>Server Status</TITLE></HEAD>\n"
|
||||||
|
"<BODY BGCOLOR=\"#FFFFFF\">\n"
|
||||||
|
"<CENTER><H1>Don't play with me ##REMOTE_ADDR## ##REMOTE_HOST##, I'll win!</H1></CENTER>"
|
||||||
|
"<BR>\n"
|
||||||
|
"<CENTER><A HREF=\"http://www.gnustepweb.org\"><IMG SRC=\"##GSWEXTFWKWSR##/PoweredByGNUstepWeb.gif\" ALT=\"Powered By GNUstepWeb\" BORDER=0></A></CENTER>\n"
|
||||||
|
"</BODY></HTML>\n"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
const char* g_szDump_HeadTemplate[2]={
|
||||||
|
"GNUstepWeb Application\n",
|
||||||
|
"<HTML><HEAD><TITLE>Index of GNUstepWeb Applications</TITLE></HEAD>\n"
|
||||||
|
"<BODY BGCOLOR=\"#FFFFFF\">"
|
||||||
|
"<CENTER><H3>Could not find the application specified in the URL (##APP_NAME##).</H3>\n"
|
||||||
|
"<H4>Index of GNUstepWeb Applications in ##CONF_FILE## (some applications may be down)</H4>\n"
|
||||||
|
"<table border=1>"
|
||||||
|
"<tr>\n"
|
||||||
|
"<td align=center rowspan=2>Name</td>"
|
||||||
|
"<td align=center rowspan=2>Application Access</td>"
|
||||||
|
"<td align=center colspan=3>Instances</td>"
|
||||||
|
"</tr>\n"
|
||||||
|
"<tr>\n"
|
||||||
|
"<td align=center>#</td>"
|
||||||
|
"<td align=center>Host</td>"
|
||||||
|
"<td align=center>Port</td>"
|
||||||
|
"</tr>\n"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
const char* g_szDump_FootTemplate[2]={
|
||||||
|
"",
|
||||||
|
"</table></CENTER>\n"
|
||||||
|
"<BR>\n"
|
||||||
|
"<CENTER><A HREF=\"http://www.gnustepweb.org\"><IMG SRC=\"##GSWEXTFWKWSR##/PoweredByGNUstepWeb.gif\" ALT=\"Powered By GNUstepWeb\" BORDER=0></A></CENTER>\n"
|
||||||
|
"</BODY></HTML>"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
char* g_szDump_AppTemplate[2]={
|
||||||
|
"AppName: ##NAME##\n"
|
||||||
|
"URL: ##URL##\n"
|
||||||
|
"Instances:\n"
|
||||||
|
"##INSTANCES##\n",
|
||||||
|
|
||||||
|
"<TR>\n"
|
||||||
|
"<TD>##NAME##</TD>\n"
|
||||||
|
"<TD><A HREF=\"##URL##\">##URL##</A></TD>\n"
|
||||||
|
"<TD colspan=3><TABLE border=1>\n"
|
||||||
|
"##INSTANCES##\n"
|
||||||
|
"</TABLE></TD>\n"
|
||||||
|
"</TR>\n"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
char* g_szDump_AppInstanceTemplate[2]={
|
||||||
|
"Instance ##NUM##\n"
|
||||||
|
"URL: ##URL##\n"
|
||||||
|
"HOST: ##HOST##\n"
|
||||||
|
"PORT: ##PORT##\n",
|
||||||
|
|
||||||
|
"<TR>\n"
|
||||||
|
"<TD><A HREF=\"##URL##\">##NUM##</A></TD>\n"
|
||||||
|
"<TD>##HOST##</TD>\n"
|
||||||
|
"<TD>##PORT##</TD>\n"
|
||||||
|
"</TR>"};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_ErrorResponseText(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szErrorResponseTextTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_ErrorNoResponseMessage(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szErrorNoResponseMessageTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_StatusAllowedResponse(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szStatusResponseAllowedTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_StatusDeniedResponse(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szStatusResponseDeniedTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_GetDumpHead(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szDump_HeadTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_GetDumpFoot(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szDump_FootTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_GetDumpApp(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szDump_AppTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* GSWTemplate_GetDumpAppInstance(BOOL p_fHTML)
|
||||||
|
{
|
||||||
|
return g_szDump_AppInstanceTemplate[p_fHTML ? 1 : 0];
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWTemplate_ReplaceStd(GSWString* p_pString,GSWApp* p_pApp)
|
||||||
|
{
|
||||||
|
GSWString_SearchReplace(p_pString,"##CONF_FILE##",GSWConfig_GetConfigFilePath());
|
||||||
|
if (p_pApp)
|
||||||
|
{
|
||||||
|
GSWString_SearchReplace(p_pString,"##APP_NAME##",p_pApp->pszName);
|
||||||
|
};
|
||||||
|
if (p_pApp && p_pApp->pszGSWExtensionsFrameworkWebServerResources)
|
||||||
|
GSWString_SearchReplace(p_pString,"##GSWEXTFWKWSR##",
|
||||||
|
p_pApp->pszGSWExtensionsFrameworkWebServerResources);
|
||||||
|
else
|
||||||
|
GSWString_SearchReplace(p_pString,"##GSWEXTFWKWSR##",
|
||||||
|
GSWConfig_GetConfig()->pszGSWExtensionsFrameworkWebServerResources);
|
||||||
|
};
|
39
GSWAdaptors/common/GSWTemplates.h
Normal file
39
GSWAdaptors/common/GSWTemplates.h
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
/* GSWTemplates.h - GSWeb: GSWTemplates
|
||||||
|
Copyright (C) 2000 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
||||||
|
Date: March 2000
|
||||||
|
|
||||||
|
This file is part of the GNUstep Web Library.
|
||||||
|
|
||||||
|
This library is free software; you can redistribute it and/or
|
||||||
|
modify it under the terms of the GNU Library General Public
|
||||||
|
License as published by the Free Software Foundation; either
|
||||||
|
version 2 of the License, or (at your option) any later version.
|
||||||
|
|
||||||
|
This library is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
Library General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Library General Public
|
||||||
|
License along with this library; if not, write to the Free
|
||||||
|
Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _GSWTemplates_h__
|
||||||
|
#define _GSWTemplates_h__
|
||||||
|
|
||||||
|
#include "GSWApp.h"
|
||||||
|
|
||||||
|
CONST char* GSWTemplate_ErrorResponseText(BOOL p_fHTML);
|
||||||
|
CONST char* GSWTemplate_ErrorNoResponseMessage(BOOL p_fHTML);
|
||||||
|
CONST char* GSWTemplate_StatusAllowedResponse(BOOL p_fHTML);
|
||||||
|
CONST char* GSWTemplate_StatusDeniedResponse(BOOL p_fHTML);
|
||||||
|
CONST char* GSWTemplate_GetDumpHead(BOOL p_fHTML);
|
||||||
|
CONST char* GSWTemplate_GetDumpFoot(BOOL p_fHTML);
|
||||||
|
CONST char* GSWTemplate_GetDumpApp(BOOL p_fHTML);
|
||||||
|
CONST char* GSWTemplate_GetDumpAppInstance(BOOL p_fHTML);
|
||||||
|
void GSWTemplate_ReplaceStd(GSWString* p_pString,GSWApp* p_pApp);
|
||||||
|
|
||||||
|
#endif //_GSWTemplates_h__
|
|
@ -31,10 +31,12 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
|
#include "GSWString.h"
|
||||||
#include "GSWConfig.h"
|
#include "GSWConfig.h"
|
||||||
#include "GSWURLUtil.h"
|
#include "GSWURLUtil.h"
|
||||||
|
|
||||||
GSWURLError GSWParseURL(GSWURLComponents* p_pURLComponents,CONST char* p_pszURL)
|
//--------------------------------------------------------------------
|
||||||
|
GSWURLError GSWParseURL(GSWURLComponents* p_pURLComponents,CONST char* p_pszURL,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWURLError eError=GSWURLError_OK;
|
GSWURLError eError=GSWURLError_OK;
|
||||||
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
||||||
|
@ -183,35 +185,60 @@ GSWURLError GSWParseURL(GSWURLComponents* p_pURLComponents,CONST char* p_pszURL)
|
||||||
if (!pURLCPrefix->pszStart || pURLCPrefix->iLength<=0)
|
if (!pURLCPrefix->pszStart || pURLCPrefix->iLength<=0)
|
||||||
{
|
{
|
||||||
eError=GSWURLError_InvalidPrefix;
|
eError=GSWURLError_InvalidPrefix;
|
||||||
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidPrefix");
|
GSWLog(GSW_ERROR,p_pLogServerData,"ParseURL GSWURLError_InvalidPrefix");
|
||||||
}
|
}
|
||||||
else if (!pURLCAppName->pszStart || pURLCAppName->iLength<=0)
|
else
|
||||||
{
|
{
|
||||||
eError=GSWURLError_InvalidAppName;
|
GSWLog(GSW_DEBUG,p_pLogServerData,
|
||||||
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidAppName");
|
"pURLCPrefix=%.*s",
|
||||||
}
|
pURLCPrefix->iLength,pURLCPrefix->pszStart);
|
||||||
else if (!pURLCAppNum->pszStart)
|
if (!pURLCAppName->pszStart || pURLCAppName->iLength<=0)
|
||||||
{
|
{
|
||||||
eError=GSWURLError_InvalidAppNumber;
|
eError=GSWURLError_InvalidAppName;
|
||||||
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidAppNumber");
|
GSWLog(GSW_ERROR,p_pLogServerData,"ParseURL GSWURLError_InvalidAppName");
|
||||||
}
|
}
|
||||||
else if ((!pURLCReqHandlerKey->pszStart || pURLCReqHandlerKey->iLength<=0)
|
else
|
||||||
&& pURLCReqHandlerPath->iLength>0)
|
{
|
||||||
{
|
GSWLog(GSW_DEBUG,p_pLogServerData,
|
||||||
eError=GSWURLError_InvalidRequestHandlerKey;
|
"pURLCAppName=%.*s",
|
||||||
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidRequestHandlerKey");
|
pURLCAppName->iLength,pURLCAppName->pszStart);
|
||||||
}
|
if (!pURLCAppNum->pszStart)
|
||||||
/*
|
{
|
||||||
else if (!pURLCReqHandlerPath->pszStart || pURLCReqHandlerPath->iLength<=0)
|
eError=GSWURLError_InvalidAppNumber;
|
||||||
eError=GSWURLError_InvalidRequestHandlerPath;
|
GSWLog(GSW_ERROR,p_pLogServerData,"ParseURL GSWURLError_InvalidAppNumber");
|
||||||
else if (!pURLCQueryString->pszStart || pURLCQueryString->iLength<=0)
|
}
|
||||||
eError=GSWURLError_InvalidQueryString;
|
else
|
||||||
*/
|
{
|
||||||
GSWLog(GSW_INFO,NULL,"End ParseURL eError=%d",eError);
|
GSWLog(GSW_DEBUG,p_pLogServerData,
|
||||||
|
"pURLCAppNum=%.*s",
|
||||||
|
pURLCAppNum->iLength,pURLCAppNum->pszStart);
|
||||||
|
if ((!pURLCReqHandlerKey->pszStart || pURLCReqHandlerKey->iLength<=0)
|
||||||
|
&& pURLCReqHandlerPath->iLength>0)
|
||||||
|
{
|
||||||
|
eError=GSWURLError_InvalidRequestHandlerKey;
|
||||||
|
GSWLog(GSW_ERROR,p_pLogServerData,"ParseURL GSWURLError_InvalidRequestHandlerKey");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,
|
||||||
|
"pURLCReqHandlerPath=%.*s",
|
||||||
|
pURLCReqHandlerPath->iLength,pURLCReqHandlerPath->pszStart);
|
||||||
|
/*
|
||||||
|
if (!pURLCReqHandlerPath->pszStart || pURLCReqHandlerPath->iLength<=0)
|
||||||
|
eError=GSWURLError_InvalidRequestHandlerPath;
|
||||||
|
else if (!pURLCQueryString->pszStart || pURLCQueryString->iLength<=0)
|
||||||
|
eError=GSWURLError_InvalidQueryString;
|
||||||
|
*/
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
GSWLog(GSW_DEBUG,p_pLogServerData,"End ParseURL eError=%d",eError);
|
||||||
return eError;
|
return eError;
|
||||||
};
|
};
|
||||||
|
|
||||||
void GSWComposeURL(char* p_pszURL,GSWURLComponents* p_pURLComponents)
|
//--------------------------------------------------------------------
|
||||||
|
void GSWComposeURL(char* p_pszURL,GSWURLComponents* p_pURLComponents,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
||||||
GSWURLComponent* pURLCAppName=&p_pURLComponents->stAppName;
|
GSWURLComponent* pURLCAppName=&p_pURLComponents->stAppName;
|
||||||
|
@ -259,7 +286,8 @@ void GSWComposeURL(char* p_pszURL,GSWURLComponents* p_pURLComponents)
|
||||||
*p_pszURL=0;
|
*p_pszURL=0;
|
||||||
};
|
};
|
||||||
|
|
||||||
int GSWComposeURLLen(GSWURLComponents* p_pURLComponents)
|
//--------------------------------------------------------------------
|
||||||
|
int GSWComposeURLLen(GSWURLComponents* p_pURLComponents,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
int iLength=0;
|
int iLength=0;
|
||||||
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
||||||
|
@ -283,6 +311,7 @@ int GSWComposeURLLen(GSWURLComponents* p_pURLComponents)
|
||||||
return iLength;
|
return iLength;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
CONST char* szGSWURLErrorMessage[]=
|
CONST char* szGSWURLErrorMessage[]=
|
||||||
{
|
{
|
||||||
"", // GSWURLError_OK
|
"", // GSWURLError_OK
|
||||||
|
@ -301,7 +330,7 @@ CONST char* szGSWURLErrorMessage[]=
|
||||||
"Invalid suffix in URL" // GSWURLError_InvalidSuffix
|
"Invalid suffix in URL" // GSWURLError_InvalidSuffix
|
||||||
};
|
};
|
||||||
|
|
||||||
CONST char* GSWURLErrorMessage(GSWURLError p_eError)
|
CONST char* GSWURLErrorMessage(GSWURLError p_eError,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
if (p_eError>=0 && p_eError<sizeof(szGSWURLErrorMessage)/sizeof(szGSWURLErrorMessage[0]))
|
if (p_eError>=0 && p_eError<sizeof(szGSWURLErrorMessage)/sizeof(szGSWURLErrorMessage[0]))
|
||||||
return szGSWURLErrorMessage[p_eError];
|
return szGSWURLErrorMessage[p_eError];
|
||||||
|
|
|
@ -69,10 +69,10 @@ typedef enum
|
||||||
GSWURLError_InvalidSuffix
|
GSWURLError_InvalidSuffix
|
||||||
} GSWURLError;
|
} GSWURLError;
|
||||||
|
|
||||||
GSWURLError GSWParseURL(GSWURLComponents* p_pURLComponents,CONST char* p_pszURL);
|
GSWURLError GSWParseURL(GSWURLComponents* p_pURLComponents,CONST char* p_pszURL,void* p_pLogServerData);
|
||||||
void GSWComposeURL(char* p_pszURL,GSWURLComponents* p_pURLComponents);
|
void GSWComposeURL(char* p_pszURL,GSWURLComponents* p_pURLComponents,void* p_pLogServerData);
|
||||||
int GSWComposeURLLen(GSWURLComponents* p_pURLComponents);
|
int GSWComposeURLLen(GSWURLComponents* p_pURLComponents,void* p_pLogServerData);
|
||||||
CONST char* GSWURLErrorMessage(GSWURLError p_eError);
|
CONST char* GSWURLErrorMessage(GSWURLError p_eError,void* p_pLogServerData);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif //_cplusplus
|
#endif //_cplusplus
|
||||||
|
|
|
@ -47,188 +47,147 @@
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
#include "GSWUtil.h"
|
#include "GSWUtil.h"
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
|
#include "GSWString.h"
|
||||||
#include "GSWConfig.h"
|
#include "GSWConfig.h"
|
||||||
|
|
||||||
|
|
||||||
static BOOL fLogInitialized = FALSE;
|
|
||||||
static const char* pszLogPath = NULL;
|
|
||||||
static const char* pszLogFlagPath = NULL;
|
|
||||||
static const char* pszDumpFlagPath = NULL;
|
|
||||||
|
|
||||||
static GSWLock g_lockLog=NULL;
|
|
||||||
|
|
||||||
const char* const pszLogLevels[] = {"Info", "Warn", "Error", "" };
|
|
||||||
|
|
||||||
#define MINLEVEL GSW_INFO
|
|
||||||
#define MAXLEVEL GSW_ERROR
|
|
||||||
|
|
||||||
static int iLogMinLevel = MINLEVEL;
|
|
||||||
|
|
||||||
// Hosts Cache
|
// Hosts Cache
|
||||||
static GSWDict* g_pHostCache = NULL;
|
static GSWDict* g_pHostCache = NULL;
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWLog_Init(GSWDict* p_pDict,int p_iLevel)
|
void GSWLog_Init(GSWDict* p_pDict,int p_iLevel)
|
||||||
{
|
{
|
||||||
char szPath[MAXPATHLEN];
|
|
||||||
GSWLock_Init(g_lockLog);
|
|
||||||
|
|
||||||
if (p_pDict)
|
|
||||||
{
|
|
||||||
pszLogFlagPath=GSWDict_ValueForKey(p_pDict,GSWEB_CONF__LOG_FLAG_FILE_PATH);
|
|
||||||
pszLogPath=GSWDict_ValueForKey(p_pDict,GSWEB_CONF__LOG_FILE_PATH);
|
|
||||||
pszDumpFlagPath=GSWDict_ValueForKey(p_pDict,GSWEB_CONF__DUMP_FLAG_FILE_PATH);
|
|
||||||
};
|
|
||||||
if (pszLogFlagPath)
|
|
||||||
pszLogFlagPath = strdup(pszLogFlagPath);
|
|
||||||
else
|
|
||||||
pszLogFlagPath = strdup(g_szGSWeb_DefaultLogFlagPath);
|
|
||||||
|
|
||||||
if (pszLogPath)
|
|
||||||
pszLogPath = strdup(pszLogPath);
|
|
||||||
else
|
|
||||||
pszLogPath = strdup(g_szGSWeb_DefaultLogFilePath);
|
|
||||||
|
|
||||||
if (pszDumpFlagPath)
|
|
||||||
pszDumpFlagPath = strdup(pszDumpFlagPath);
|
|
||||||
else
|
|
||||||
pszDumpFlagPath = strdup(g_szGSWeb_DefaultDumpFlagPath);
|
|
||||||
|
|
||||||
{
|
|
||||||
int fd;
|
|
||||||
fd = open(pszLogPath, O_WRONLY, 0666);
|
|
||||||
close(fd);
|
|
||||||
chmod(pszLogPath, 0666);
|
|
||||||
};
|
|
||||||
iLogMinLevel = p_iLevel;
|
|
||||||
fLogInitialized = 1;
|
|
||||||
GSWLog(GSW_INFO,NULL,"GSWebLog init");
|
|
||||||
GSWLog(GSW_INFO,NULL,"pszLogFlagPath=%s",pszLogFlagPath);
|
|
||||||
GSWLog(GSW_INFO,NULL,"pszDumpFlagPath=%s",pszDumpFlagPath);
|
|
||||||
GSWLog(GSW_INFO,NULL,"pszLogPath=%s",pszLogPath);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static BOOL isLoggingEnabled()
|
//--------------------------------------------------------------------
|
||||||
{
|
void VGSWLogSizedIntern(char* file,
|
||||||
static BOOL fLog=FALSE;
|
int line,
|
||||||
static int iStatCounter=0;
|
char* fn,
|
||||||
if (iStatCounter==0)
|
int p_iLevel,
|
||||||
{
|
|
||||||
struct stat stStat;
|
|
||||||
iStatCounter = LOG_FILE_STAT_COUNTER; // reset counter
|
|
||||||
fLog = ( (stat(pszLogFlagPath,&stStat) == 0) && (stStat.st_uid == 0));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
iStatCounter--;
|
|
||||||
return fLog;
|
|
||||||
};
|
|
||||||
|
|
||||||
BOOL GSWDumpConfigFile_CanDump()
|
|
||||||
{
|
|
||||||
static BOOL fDump=FALSE;
|
|
||||||
static int iDumpStatCounter=0;
|
|
||||||
if (iDumpStatCounter==0)
|
|
||||||
{
|
|
||||||
struct stat stStat;
|
|
||||||
iDumpStatCounter = DUMP_FILE_STAT_COUNTER; // reset counter
|
|
||||||
fDump = ( (stat(pszDumpFlagPath,&stStat) == 0) && (stStat.st_uid == 0));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
iDumpStatCounter--;
|
|
||||||
return fDump;
|
|
||||||
};
|
|
||||||
|
|
||||||
void VGSWLogSized(int p_iLevel,
|
|
||||||
#if defined(Apache)
|
#if defined(Apache)
|
||||||
server_rec* p_pLogServerData,
|
server_rec* p_pLogServerData,
|
||||||
#else
|
#else
|
||||||
void* p_pLogServerData,
|
void* p_pLogServerData,
|
||||||
#endif
|
#endif
|
||||||
int p_iBufferSize,
|
int p_iBufferSize,
|
||||||
CONST char* p_pszFormat,
|
CONST char* p_pszFormat,
|
||||||
va_list ap)
|
va_list ap)
|
||||||
{
|
{
|
||||||
FILE* pLog = NULL;
|
FILE* pLog = NULL;
|
||||||
char szBuffer[p_iBufferSize+128];
|
char szBuffer[p_iBufferSize+512];
|
||||||
|
szBuffer[0]=0;
|
||||||
if (p_iLevel>=iLogMinLevel)
|
errno=0;//Because Apache use it in ap_log_error to display the message.
|
||||||
{
|
vsprintf(szBuffer,p_pszFormat,ap);
|
||||||
BOOL fIsLoggingEnabled=FALSE;
|
|
||||||
if (!fLogInitialized)
|
|
||||||
GSWLog_Init(NULL,iLogMinLevel);
|
|
||||||
|
|
||||||
GSWLock_Lock(g_lockLog);
|
|
||||||
fIsLoggingEnabled=isLoggingEnabled();
|
|
||||||
if (fIsLoggingEnabled
|
|
||||||
#if defined(Netscape) || defined(Apache)
|
|
||||||
|| p_iLevel == GSW_ERROR
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
{
|
|
||||||
vsprintf(szBuffer,p_pszFormat,ap);
|
|
||||||
pLog=fopen(pszLogPath,"a+");
|
|
||||||
if (pLog)
|
|
||||||
{
|
|
||||||
fprintf(pLog,"%s: %s\n",pszLogLevels[p_iLevel],szBuffer);
|
|
||||||
fclose(pLog);
|
|
||||||
};
|
|
||||||
};
|
|
||||||
GSWLock_Unlock(g_lockLog);
|
|
||||||
|
|
||||||
#if defined(Netscape) || defined(Apache)
|
|
||||||
if (p_iLevel == GSW_ERROR)
|
|
||||||
{
|
|
||||||
#if defined(Netscape)
|
#if defined(Netscape)
|
||||||
log_error(0,"GSWeb",NULL,NULL,szBuffer);
|
log_error(0,"GSWeb",NULL,NULL,szBuffer);
|
||||||
#endif
|
#endif
|
||||||
#if defined(Apache)
|
#if defined(Apache)
|
||||||
ap_log_error(APLOG_MARK,APLOG_EMERG,
|
ap_log_error(APLOG_MARK,p_iLevel,
|
||||||
NULL/*(server_rec*)p_pLogServerData*/,"%s",szBuffer);
|
(server_rec*)p_pLogServerData,
|
||||||
//log_error(szBuffer,(server_rec*)p_pLogServerData);
|
"%s",szBuffer);
|
||||||
#endif
|
#endif
|
||||||
};
|
|
||||||
#endif
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWLog(int p_iLevel,
|
void GSWLog(int p_iLevel,
|
||||||
#if defined(Apache)
|
#if defined(Apache)
|
||||||
server_rec* p_pLogServerData,
|
server_rec* p_pLogServerData,
|
||||||
#else
|
#else
|
||||||
void* p_pLogServerData,
|
void* p_pLogServerData,
|
||||||
#endif
|
#endif
|
||||||
CONST char* p_pszFormat,...)
|
CONST char *p_pszFormat, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,p_pszFormat);
|
va_start(ap,p_pszFormat);
|
||||||
VGSWLogSized(p_iLevel,
|
VGSWLogSizedIntern(NULL,
|
||||||
p_pLogServerData,
|
0,
|
||||||
4096,
|
NULL,
|
||||||
p_pszFormat,
|
p_iLevel,
|
||||||
ap);
|
p_pLogServerData,
|
||||||
|
4096,
|
||||||
|
p_pszFormat,
|
||||||
|
ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
void GSWLogSized(int p_iLevel,
|
void GSWLogSized(int p_iLevel,
|
||||||
#if defined(Apache)
|
#if defined(Apache)
|
||||||
server_rec* p_pLogServerData,
|
server_rec* p_pLogServerData,
|
||||||
#else
|
#else
|
||||||
void* p_pLogServerData,
|
void* p_pLogServerData,
|
||||||
#endif
|
#endif
|
||||||
int p_iBufferSize,
|
int p_iBufferSize,
|
||||||
CONST char* p_pszFormat,...)
|
CONST char *p_pszFormat, ...)
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
va_start(ap,p_pszFormat);
|
va_start(ap,p_pszFormat);
|
||||||
VGSWLogSized(p_iLevel,
|
VGSWLogSizedIntern(NULL,
|
||||||
p_pLogServerData,
|
0,
|
||||||
p_iBufferSize,
|
NULL,
|
||||||
p_pszFormat,
|
p_iLevel,
|
||||||
ap);
|
p_pLogServerData,
|
||||||
|
p_iBufferSize,
|
||||||
|
p_pszFormat,
|
||||||
|
ap);
|
||||||
|
va_end(ap);
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWLogIntern(char* file,
|
||||||
|
int line,
|
||||||
|
char* fn,
|
||||||
|
int p_iLevel,
|
||||||
|
#if defined(Apache)
|
||||||
|
server_rec* p_pLogServerData,
|
||||||
|
#else
|
||||||
|
void* p_pLogServerData,
|
||||||
|
#endif
|
||||||
|
CONST char* p_pszFormat,...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap,p_pszFormat);
|
||||||
|
VGSWLogSizedIntern(file,
|
||||||
|
line,
|
||||||
|
fn,
|
||||||
|
p_iLevel,
|
||||||
|
p_pLogServerData,
|
||||||
|
4096,
|
||||||
|
p_pszFormat,
|
||||||
|
ap);
|
||||||
|
va_end(ap);
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
void GSWLogSizedIntern(char* file,
|
||||||
|
int line,
|
||||||
|
char* fn,
|
||||||
|
int p_iLevel,
|
||||||
|
#if defined(Apache)
|
||||||
|
server_rec* p_pLogServerData,
|
||||||
|
#else
|
||||||
|
void* p_pLogServerData,
|
||||||
|
#endif
|
||||||
|
int p_iBufferSize,
|
||||||
|
CONST char* p_pszFormat,...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
va_start(ap,p_pszFormat);
|
||||||
|
VGSWLogSizedIntern(file,
|
||||||
|
line,
|
||||||
|
fn,
|
||||||
|
p_iLevel,
|
||||||
|
p_pLogServerData,
|
||||||
|
p_iBufferSize,
|
||||||
|
p_pszFormat,
|
||||||
|
ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
// return new len
|
// return new len
|
||||||
int DeleteTrailingCRNL(char* p_pszString)
|
int DeleteTrailingCRNL(char* p_pszString)
|
||||||
{
|
{
|
||||||
|
@ -243,6 +202,7 @@ int DeleteTrailingCRNL(char* p_pszString)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
int DeleteTrailingSlash(char* p_pszString)
|
int DeleteTrailingSlash(char* p_pszString)
|
||||||
{
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
|
@ -256,6 +216,7 @@ int DeleteTrailingSlash(char* p_pszString)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
int DeleteTrailingSpaces(char* p_pszString)
|
int DeleteTrailingSpaces(char* p_pszString)
|
||||||
{
|
{
|
||||||
int i=0;
|
int i=0;
|
||||||
|
@ -269,6 +230,18 @@ int DeleteTrailingSpaces(char* p_pszString)
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
int SafeStrlen(CONST char* p_pszString)
|
||||||
|
{
|
||||||
|
return (p_pszString ? strlen(p_pszString) : 0);
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
char* SafeStrdup(CONST char* p_pszString)
|
||||||
|
{
|
||||||
|
return (p_pszString ? strdup(p_pszString) : NULL);
|
||||||
|
};
|
||||||
|
|
||||||
CONST char* strcasestr(CONST char* p_pszString,CONST char* p_pszSearchedString)
|
CONST char* strcasestr(CONST char* p_pszString,CONST char* p_pszSearchedString)
|
||||||
{
|
{
|
||||||
if (p_pszString && p_pszSearchedString)
|
if (p_pszString && p_pszSearchedString)
|
||||||
|
@ -300,10 +273,7 @@ CONST char* strcasestr(CONST char* p_pszString,CONST char* p_pszSearchedString)
|
||||||
#define _REENTRANT /* needs to be defined so proper structs get included */
|
#define _REENTRANT /* needs to be defined so proper structs get included */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void GSWUtil_ClearHostCache()
|
void GSWUtil_ClearHostCache()
|
||||||
{
|
{
|
||||||
if (g_pHostCache)
|
if (g_pHostCache)
|
||||||
|
@ -313,7 +283,8 @@ void GSWUtil_ClearHostCache()
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
PSTHostent GSWUtil_FindHost(void* p_pLogServerData,CONST char* p_pszHost)
|
//--------------------------------------------------------------------
|
||||||
|
PSTHostent GSWUtil_FindHost(CONST char* p_pszHost,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
PSTHostent pHost=NULL;
|
PSTHostent pHost=NULL;
|
||||||
if (!p_pszHost)
|
if (!p_pszHost)
|
||||||
|
@ -322,7 +293,7 @@ PSTHostent GSWUtil_FindHost(void* p_pLogServerData,CONST char* p_pszHost)
|
||||||
pHost = (g_pHostCache) ? (PSTHostent)GSWDict_ValueForKey(g_pHostCache,p_pszHost) : NULL;
|
pHost = (g_pHostCache) ? (PSTHostent)GSWDict_ValueForKey(g_pHostCache,p_pszHost) : NULL;
|
||||||
if (!pHost)
|
if (!pHost)
|
||||||
{
|
{
|
||||||
pHost = GSWUtil_HostLookup(p_pLogServerData,p_pszHost);
|
pHost = GSWUtil_HostLookup(p_pszHost,p_pLogServerData);
|
||||||
if (pHost)
|
if (pHost)
|
||||||
{
|
{
|
||||||
if (!g_pHostCache)
|
if (!g_pHostCache)
|
||||||
|
@ -344,27 +315,29 @@ PSTHostent GSWUtil_FindHost(void* p_pLogServerData,CONST char* p_pszHost)
|
||||||
#define NETDB_SUCCESS 0
|
#define NETDB_SUCCESS 0
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CONST char *hstrerror(int herr)
|
//--------------------------------------------------------------------
|
||||||
|
CONST char* hstrerror(int herr)
|
||||||
{
|
{
|
||||||
if (herr == -1) /* see errno */
|
if (herr == -1) // see errno
|
||||||
return strerror(errno);
|
return strerror(errno);
|
||||||
else if (herr == HOST_NOT_FOUND)
|
else if (herr == HOST_NOT_FOUND)
|
||||||
return "Host not found";
|
return "Host not found";
|
||||||
else if (herr == TRY_AGAIN)
|
else if (herr == TRY_AGAIN)
|
||||||
return "Try again"; /* ? */
|
return "Try again"; // ?
|
||||||
else if (herr == NO_RECOVERY)
|
else if (herr == NO_RECOVERY)
|
||||||
return "Non recoverable error";
|
return "Non recoverable error";
|
||||||
else if (herr == NO_DATA)
|
else if (herr == NO_DATA)
|
||||||
return "No data";
|
return "No data";
|
||||||
else if (herr == NO_ADDRESS)
|
else if (herr == NO_ADDRESS)
|
||||||
return "No address"; /* same as no data */
|
return "No address"; // same as no data
|
||||||
else if (herr == NETDB_SUCCESS)
|
else if (herr == NETDB_SUCCESS)
|
||||||
return "No error"; /* strange */
|
return "No error"; // Gag !
|
||||||
else
|
else
|
||||||
return "unknown error";
|
return "unknown error";
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
static PSTHostent GSWUtil_CopyHostent(PSTHostent p_pHost)
|
static PSTHostent GSWUtil_CopyHostent(PSTHostent p_pHost)
|
||||||
{
|
{
|
||||||
PSTHostent pNewHost=NULL;
|
PSTHostent pNewHost=NULL;
|
||||||
|
@ -434,7 +407,8 @@ static PSTHostent GSWUtil_CopyHostent(PSTHostent p_pHost)
|
||||||
return pNewHost;
|
return pNewHost;
|
||||||
};
|
};
|
||||||
|
|
||||||
PSTHostent GSWUtil_HostLookup(void* p_pLogServerData,CONST char *p_pszHost)
|
//--------------------------------------------------------------------
|
||||||
|
PSTHostent GSWUtil_HostLookup(CONST char *p_pszHost,void* p_pLogServerData)
|
||||||
{
|
{
|
||||||
PSTHostent pHost=NULL;
|
PSTHostent pHost=NULL;
|
||||||
struct in_addr hostaddr;
|
struct in_addr hostaddr;
|
||||||
|
|
|
@ -39,14 +39,27 @@ extern "C" {
|
||||||
|
|
||||||
#if defined(Apache)
|
#if defined(Apache)
|
||||||
#include "httpd.h"
|
#include "httpd.h"
|
||||||
|
#include "http_log.h"
|
||||||
|
//#define APLOG_EMERG LOG_EMERG /* system is unusable */
|
||||||
|
//#define APLOG_ALERT LOG_ALERT /* action must be taken immediately */
|
||||||
|
#define GSW_CRITICAL APLOG_CRIT /* critical conditions */
|
||||||
|
#define GSW_ERROR APLOG_ERR /* error conditions */
|
||||||
|
#define GSW_WARNING APLOG_WARNING /* warning conditions */
|
||||||
|
//#define APLOG_NOTICE LOG_NOTICE /* normal but significant condition */
|
||||||
|
#define GSW_INFO APLOG_INFO /* informational */
|
||||||
|
#define GSW_DEBUG APLOG_DEBUG /* debug-level messages */
|
||||||
|
#else
|
||||||
|
#define GSW_DEBUG 0
|
||||||
|
#define GSW_INFO 1
|
||||||
|
#define GSW_WARNING 2
|
||||||
|
#define GSW_ERROR 3
|
||||||
|
#define GSW_CRITICAL 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define GSW_INFO 0
|
|
||||||
#define GSW_WARNING 1
|
|
||||||
#define GSW_ERROR 2
|
|
||||||
#define max(x, y) ((x) > (y) ? (x) : (y))
|
#define max(x, y) ((x) > (y) ? (x) : (y))
|
||||||
#define min(x, y) ((x) < (y) ? (x) : (y))
|
#define min(x, y) ((x) < (y) ? (x) : (y))
|
||||||
|
|
||||||
void GSWLog(int p_iLevel,
|
void GSWLog(int p_iLevel,
|
||||||
#if defined(Apache)
|
#if defined(Apache)
|
||||||
server_rec* p_pLogServerData,
|
server_rec* p_pLogServerData,
|
||||||
|
@ -55,33 +68,59 @@ void GSWLog(int p_iLevel,
|
||||||
#endif
|
#endif
|
||||||
CONST char *p_pszFormat, ...);
|
CONST char *p_pszFormat, ...);
|
||||||
|
|
||||||
void GSWLogSized(int p_iLevel,
|
void GSWLogSized(int p_iLevel,
|
||||||
|
#if defined(Apache)
|
||||||
|
server_rec* p_pLogServerData,
|
||||||
|
#else
|
||||||
|
void* p_pLogServerData,
|
||||||
|
#endif
|
||||||
|
int p_iBufferSize,
|
||||||
|
CONST char *p_pszFormat, ...);
|
||||||
|
|
||||||
|
void GSWLogIntern(char* file,
|
||||||
|
int line,
|
||||||
|
char* fn,
|
||||||
|
int p_iLevel,
|
||||||
#if defined(Apache)
|
#if defined(Apache)
|
||||||
server_rec* p_pLogServerData,
|
server_rec* p_pLogServerData,
|
||||||
#else
|
#else
|
||||||
void* p_pLogServerData,
|
void* p_pLogServerData,
|
||||||
#endif
|
#endif
|
||||||
int p_iBufferSize,
|
|
||||||
CONST char *p_pszFormat, ...);
|
CONST char *p_pszFormat, ...);
|
||||||
|
|
||||||
|
|
||||||
|
void GSWLogSizedIntern(char* file,
|
||||||
|
int line,
|
||||||
|
char* fn,
|
||||||
|
int p_iLevel,
|
||||||
|
#if defined(Apache)
|
||||||
|
server_rec* p_pLogServerData,
|
||||||
|
#else
|
||||||
|
void* p_pLogServerData,
|
||||||
|
#endif
|
||||||
|
int p_iBufferSize,
|
||||||
|
CONST char *p_pszFormat, ...);
|
||||||
|
|
||||||
// return new len
|
// return new len
|
||||||
int DeleteTrailingCRNL(char* p_pszString);
|
int DeleteTrailingCRNL(char* p_pszString);
|
||||||
int DeleteTrailingSlash(char* p_pszString);
|
int DeleteTrailingSlash(char* p_pszString);
|
||||||
int DeleteTrailingSpaces(char* p_pszString);
|
int DeleteTrailingSpaces(char* p_pszString);
|
||||||
|
|
||||||
|
int SafeStrlen(CONST char* p_pszString);
|
||||||
|
char* SafeStrdup(CONST char* p_pszString);
|
||||||
CONST char* strcasestr(CONST char* p_pszString,CONST char* p_pszSearchedString);
|
CONST char* strcasestr(CONST char* p_pszString,CONST char* p_pszSearchedString);
|
||||||
|
|
||||||
|
|
||||||
//#include <netdb.h>
|
//#include <netdb.h>
|
||||||
typedef struct hostent* PSTHostent;
|
typedef struct hostent* PSTHostent;
|
||||||
|
|
||||||
PSTHostent GSWUtil_HostLookup(void* p_pLogServerData,CONST char* p_pszHost);
|
PSTHostent GSWUtil_HostLookup(CONST char* p_pszHost,void* p_pLogServerData);
|
||||||
void GSWUtil_ClearHostCache();
|
void GSWUtil_ClearHostCache();
|
||||||
PSTHostent GSWUtil_FindHost(void* p_pLogServerData,CONST char* p_pszHost);
|
PSTHostent GSWUtil_FindHost(CONST char* p_pszHost,void* p_pLogServerData);
|
||||||
|
|
||||||
#include "GSWDict.h"
|
#include "GSWDict.h"
|
||||||
|
|
||||||
void GSWLog_Init(GSWDict* p_pDict,int p_iLevel);
|
void GSWLog_Init(GSWDict* p_pDict,int p_iLevel);
|
||||||
BOOL GSWDumpConfigFile_CanDump();
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -20,18 +20,22 @@
|
||||||
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
# 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
||||||
|
|
||||||
COMMONFILES = $(COMMON)/GSWHTTPHeaders.c \
|
COMMONFILES = $(COMMON)/GSWHTTPHeaders.c \
|
||||||
$(COMMON)/config.c $(COMMON)/GSWURLUtil.c $(COMMON)/GSWDict.c \
|
$(COMMON)/config.c $(COMMON)/GSWConfig.c $(COMMON)/GSWPropList.c \
|
||||||
|
$(COMMON)/GSWTemplates.c $(COMMON)/GSWApp.c \
|
||||||
|
$(COMMON)/GSWURLUtil.c $(COMMON)/GSWDict.c \
|
||||||
$(COMMON)/GSWHTTPRequest.c $(COMMON)/GSWHTTPResponse.c \
|
$(COMMON)/GSWHTTPRequest.c $(COMMON)/GSWHTTPResponse.c \
|
||||||
$(COMMON)/GSWAppConnectSocket.c $(COMMON)/GSWUtil.c $(COMMON)/GSWAppRequest.c \
|
$(COMMON)/GSWAppConnectSocket.c $(COMMON)/GSWUtil.c $(COMMON)/GSWAppRequest.c \
|
||||||
$(COMMON)/GSWLoadBalancing.c $(COMMON)/GSWList.c $(COMMON)/GSWConfig.c \
|
$(COMMON)/GSWLoadBalancing.c $(COMMON)/GSWList.c \
|
||||||
$(COMMON)/GSWString.c
|
$(COMMON)/GSWString.c
|
||||||
|
|
||||||
|
|
||||||
COMMONOBJS = $(OBJROOT)/GSWHTTPHeaders.o \
|
COMMONOBJS = $(OBJROOT)/GSWHTTPHeaders.o \
|
||||||
$(OBJROOT)/config.o $(OBJROOT)/GSWURLUtil.o $(OBJROOT)/GSWDict.o \
|
$(OBJROOT)/config.o $(OBJROOT)/GSWConfig.o $(OBJROOT)/GSWPropList.o \
|
||||||
|
$(OBJROOT)/GSWTemplates.o $(OBJROOT)/GSWApp.o \
|
||||||
|
$(OBJROOT)/GSWURLUtil.o $(OBJROOT)/GSWDict.o \
|
||||||
$(OBJROOT)/GSWHTTPRequest.o $(OBJROOT)/GSWHTTPResponse.o \
|
$(OBJROOT)/GSWHTTPRequest.o $(OBJROOT)/GSWHTTPResponse.o \
|
||||||
$(OBJROOT)/GSWAppConnectSocket.o $(OBJROOT)/GSWUtil.o $(OBJROOT)/GSWAppRequest.o \
|
$(OBJROOT)/GSWAppConnectSocket.o $(OBJROOT)/GSWUtil.o $(OBJROOT)/GSWAppRequest.o \
|
||||||
$(OBJROOT)/GSWLoadBalancing.o $(OBJROOT)/GSWList.o $(OBJROOT)/GSWConfig.o \
|
$(OBJROOT)/GSWLoadBalancing.o $(OBJROOT)/GSWList.o \
|
||||||
$(OBJROOT)/GSWString.o
|
$(OBJROOT)/GSWString.o
|
||||||
|
|
||||||
$(ADAPTORLIB):: $(COMMONOBJS)
|
$(ADAPTORLIB):: $(COMMONOBJS)
|
||||||
|
@ -43,6 +47,15 @@ $(ADAPTORLIB):: $(COMMONOBJS)
|
||||||
$(OBJROOT)/GSWHTTPHeaders.o: $(COMMON)/GSWHTTPHeaders.c
|
$(OBJROOT)/GSWHTTPHeaders.o: $(COMMON)/GSWHTTPHeaders.c
|
||||||
$(CC) $(CFLAGS) -c -o $*.o $<
|
$(CC) $(CFLAGS) -c -o $*.o $<
|
||||||
|
|
||||||
|
$(OBJROOT)/GSWPropList.o: $(COMMON)/GSWPropList.c
|
||||||
|
$(CC) $(CFLAGS) -c -o $*.o $<
|
||||||
|
|
||||||
|
$(OBJROOT)/GSWTemplates.o: $(COMMON)/GSWTemplates.c
|
||||||
|
$(CC) $(CFLAGS) -c -o $*.o $<
|
||||||
|
|
||||||
|
$(OBJROOT)/GSWApp.o: $(COMMON)/GSWApp.c
|
||||||
|
$(CC) $(CFLAGS) -c -o $*.o $<
|
||||||
|
|
||||||
$(OBJROOT)/GSWConfig.o: $(COMMON)/GSWConfig.c
|
$(OBJROOT)/GSWConfig.o: $(COMMON)/GSWConfig.c
|
||||||
$(CC) $(CFLAGS) -c -o $*.o $<
|
$(CC) $(CFLAGS) -c -o $*.o $<
|
||||||
|
|
||||||
|
|
|
@ -35,16 +35,27 @@ extern "C" {
|
||||||
|
|
||||||
#define GSWEB_SERVER_ADAPTOR_VERSION_MAJOR 1
|
#define GSWEB_SERVER_ADAPTOR_VERSION_MAJOR 1
|
||||||
#define GSWEB_SERVER_ADAPTOR_VERSION_MAJOR_STRING "1"
|
#define GSWEB_SERVER_ADAPTOR_VERSION_MAJOR_STRING "1"
|
||||||
#define GSWEB_SERVER_ADAPTOR_VERSION_MINOR 0
|
#define GSWEB_SERVER_ADAPTOR_VERSION_MINOR 1
|
||||||
#define GSWEB_SERVER_ADAPTOR_VERSION_MINOR_STRING "0"
|
#define GSWEB_SERVER_ADAPTOR_VERSION_MINOR_STRING "1"
|
||||||
|
|
||||||
#define GSWEB_VERSION_MAJOR 1
|
#define GSWEB_VERSION_MAJOR 1
|
||||||
#define GSWEB_VERSION_MINOR 0
|
#define GSWEB_VERSION_MINOR 0
|
||||||
|
|
||||||
|
#if GSWEB_WONAMES
|
||||||
|
#define GSWEB_PREFIX "/WebObjects"
|
||||||
|
#define GSWEB_HANDLER "WebObjects"
|
||||||
|
#else
|
||||||
#define GSWEB_PREFIX "/GSWeb"
|
#define GSWEB_PREFIX "/GSWeb"
|
||||||
#define GSWEB_HANDLER "GSWeb"
|
#define GSWEB_HANDLER "GSWeb"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define GSWEB_STATUS_RESPONSE_APP_NAME "status"
|
||||||
|
|
||||||
|
#if GSWEB_WONAMES
|
||||||
|
#define GSWAPP_EXTENSION ".wa"
|
||||||
|
#else
|
||||||
#define GSWAPP_EXTENSION ".gswa"
|
#define GSWAPP_EXTENSION ".gswa"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Time Outs ...
|
// Time Outs ...
|
||||||
#define APP_CONNECT_TIMEOUT 300
|
#define APP_CONNECT_TIMEOUT 300
|
||||||
|
@ -54,44 +65,40 @@ extern "C" {
|
||||||
|
|
||||||
|
|
||||||
#define HITS_PER_SECOND 80
|
#define HITS_PER_SECOND 80
|
||||||
#define LOG_FILE_STAT_COUNTER (HITS_PER_SECOND*20)
|
|
||||||
#define DUMP_FILE_STAT_COUNTER (1)
|
|
||||||
#define CONFIG_FILE_STAT_INTERVAL 10
|
#define CONFIG_FILE_STAT_INTERVAL 10
|
||||||
|
|
||||||
|
|
||||||
// Configuration Strings
|
// Configuration Strings
|
||||||
|
#if GSWEB_WONAMES
|
||||||
|
#define GSWEB__MIME_TYPE "application/x-httpd-webobjects"
|
||||||
|
#else
|
||||||
#define GSWEB__MIME_TYPE "application/x-httpd-gsweb"
|
#define GSWEB__MIME_TYPE "application/x-httpd-gsweb"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Config File Keywords
|
// Config File Keywords
|
||||||
|
|
||||||
// All
|
// All
|
||||||
#define GSWEB_CONF__DOC_ROOT "GSWeb_DocumentRoot"
|
//#define GSWEB_CONF__DOC_ROOT "GSWeb_DocumentRoot"
|
||||||
#define GSWEB_CONF__CONFIG_FILE_PATH "GSWeb_ConfigFilePath"
|
#define GSWEB_CONF__CONFIG_FILE_PATH "GSWeb_ConfigFilePath"
|
||||||
#define GSWEB_CONF__LOG_FILE_PATH "GSWeb_LogFilePath"
|
|
||||||
#define GSWEB_CONF__LOG_FLAG_FILE_PATH "GSWeb_LogFlagFilePath"
|
|
||||||
#define GSWEB_CONF__DUMP_FLAG_FILE_PATH "GSWeb_DumpFlagFilePath"
|
|
||||||
|
|
||||||
|
|
||||||
// Aapche
|
// Aapche
|
||||||
#define GSWEB_CONF__ALIAS "GSWeb_Alias"
|
#if defined(Apache)
|
||||||
|
#define GSWEB_CONF__ALIAS "GSWeb_Alias"
|
||||||
|
#endif
|
||||||
|
|
||||||
// Netscape
|
// Netscape
|
||||||
|
#if defined(Netscape)
|
||||||
#define GSWEB_CONF__PATH_TRANS "from" // NameTrans
|
#define GSWEB_CONF__PATH_TRANS "from" // NameTrans
|
||||||
#define GSWEB_CONF__APP_ROOT "dir" // NameTrans
|
#define GSWEB_CONF__APP_ROOT "dir" // NameTrans
|
||||||
#define GSWEB_CONF__NAME "name" // NameTrans, Object
|
#define GSWEB_CONF__NAME "name" // NameTrans, Object
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#define DEFAULT_CONFIG_FILE_PATH "/etc/httpd/conf/gsweb.conf"
|
#if GSWEB_WONAMES
|
||||||
#define DEFAULT_LOG_FILE_PATH "/var/log/httpd/gsweb.log"
|
#define GSWEB_INSTANCE_COOKIE "woinst="
|
||||||
#define DEFAULT_LOG_FLAG_PATH "/etc/httpd/conf/gsweb-log"
|
#else
|
||||||
#define DEFAULT_DUMP_FLAG_PATH "/etc/httpd/conf/gsweb-dump"
|
|
||||||
|
|
||||||
#define DEFAULT_GSWEXTENSIONS_FRAMEWORK_WEB_SERVER_RESOURCES "/GSWeb/Frameworks/WOExtensions.framework/WebServerResources"
|
|
||||||
|
|
||||||
|
|
||||||
#define GSWEB_INSTANCE_COOKIE "gswinst="
|
#define GSWEB_INSTANCE_COOKIE "gswinst="
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* operating specific things regarding gethostbyname()
|
* operating specific things regarding gethostbyname()
|
||||||
|
@ -107,24 +114,12 @@ extern "C" {
|
||||||
#pragma message(Apache)
|
#pragma message(Apache)
|
||||||
#define SERVER "Apache"
|
#define SERVER "Apache"
|
||||||
#elif defined(Netscape)
|
#elif defined(Netscape)
|
||||||
#if defined(WAI)
|
|
||||||
#pragma message(WAI)
|
|
||||||
#define SERVER "WAI"
|
|
||||||
#else
|
|
||||||
#pragma message(NSAPI)
|
#pragma message(NSAPI)
|
||||||
#define SERVER "NSAPI"
|
#define SERVER "NSAPI"
|
||||||
#endif
|
#endif
|
||||||
#elif defined(CGI)
|
|
||||||
#pragma message(CGI)
|
|
||||||
#define SERVER "CGI"
|
|
||||||
#else
|
|
||||||
#pragma message(Unknwon)
|
|
||||||
#define SERVER "Unknown"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef MAXHOSTNAMELEN
|
#ifndef MAXHOSTNAMELEN
|
||||||
#define MAXHOSTNAMELEN 256 /* reasonable default */
|
#define MAXHOSTNAMELEN 256
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -89,7 +89,6 @@ int GSWeb_Init(pblock* p_pBlock,
|
||||||
GSWDict* pDict=NULL;
|
GSWDict* pDict=NULL;
|
||||||
const char* pDocRoot=NULL;
|
const char* pDocRoot=NULL;
|
||||||
int i=0;
|
int i=0;
|
||||||
GSWConfig_Init();
|
|
||||||
|
|
||||||
pDict=GSWDict_New(16);
|
pDict=GSWDict_New(16);
|
||||||
|
|
||||||
|
@ -106,7 +105,7 @@ int GSWeb_Init(pblock* p_pBlock,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
GSWLog_Init(pDict,GSW_INFO);
|
GSWLog_Init(pDict,GSW_INFO);
|
||||||
GSWLoadBalancing_Init(pDict);
|
GSWConfig_Init(pDict);
|
||||||
|
|
||||||
// Get The Document Root
|
// Get The Document Root
|
||||||
pDocRoot = GSWDict_ValueForKey(pDict,g_szGSWeb_Conf_DocRoot);
|
pDocRoot = GSWDict_ValueForKey(pDict,g_szGSWeb_Conf_DocRoot);
|
||||||
|
@ -202,7 +201,7 @@ NSAPI_PUBLIC int GSWeb_RequestHandler(pblock* p_pBlock,
|
||||||
pszURLError=GSWURLErrorMessage(eError);
|
pszURLError=GSWURLErrorMessage(eError);
|
||||||
// Log the error
|
// Log the error
|
||||||
GSWLog(GSW_INFO,NULL,"URL Parsing Error: %s", pszURLError);
|
GSWLog(GSW_INFO,NULL,"URL Parsing Error: %s", pszURLError);
|
||||||
if (eError==GSWURLError_InvalidAppName && GSWDumpConfigFile_CanDump())
|
if (eError==GSWURLError_InvalidAppName)
|
||||||
{
|
{
|
||||||
pResponse = GSWDumpConfigFile(NULL,&stURLComponents);
|
pResponse = GSWDumpConfigFile(NULL,&stURLComponents);
|
||||||
iRetVal=dieSendResponse(p_pSession,p_pRequest,&pResponse);
|
iRetVal=dieSendResponse(p_pSession,p_pRequest,&pResponse);
|
||||||
|
@ -248,7 +247,7 @@ NSAPI_PUBLIC int GSWeb_RequestHandler(pblock* p_pBlock,
|
||||||
p_pRequest,
|
p_pRequest,
|
||||||
"Error reading form data (Post Method)");
|
"Error reading form data (Post Method)");
|
||||||
free(pszBuffer);
|
free(pszBuffer);
|
||||||
pResponse = GSWHTTPResponse_BuildErrorResponse("Bad mojo"); // TODO
|
pResponse = GSWHTTPResponse_BuildErrorResponse(NULL,"Bad mojo",NULL); // TODO
|
||||||
};
|
};
|
||||||
// Add Data
|
// Add Data
|
||||||
*pszData++ = c;
|
*pszData++ = c;
|
||||||
|
@ -264,8 +263,7 @@ NSAPI_PUBLIC int GSWeb_RequestHandler(pblock* p_pBlock,
|
||||||
stURLComponents.stQueryString.iLength = pQueryString ? strlen(pQueryString) : 0;
|
stURLComponents.stQueryString.iLength = pQueryString ? strlen(pQueryString) : 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// So far, so good...
|
||||||
// So far, so good...
|
|
||||||
if (!pResponse)
|
if (!pResponse)
|
||||||
{
|
{
|
||||||
// Now we call the Application !
|
// Now we call the Application !
|
||||||
|
@ -279,7 +277,7 @@ NSAPI_PUBLIC int GSWeb_RequestHandler(pblock* p_pBlock,
|
||||||
&stURLComponents,
|
&stURLComponents,
|
||||||
pblock_findval("protocol",p_pRequest->reqpb),
|
pblock_findval("protocol",p_pRequest->reqpb),
|
||||||
pszDocRoot,
|
pszDocRoot,
|
||||||
"SB", // TODO AppTest name
|
g_szGSWeb_StatusResponseAppName, //AppTest name
|
||||||
NULL);
|
NULL);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -544,7 +542,7 @@ static int dieWithMessage(Session* p_pSession,
|
||||||
{
|
{
|
||||||
GSWHTTPResponse* pResponse=NULL;
|
GSWHTTPResponse* pResponse=NULL;
|
||||||
log_error(0,"GNUstepWeb",NULL,NULL,"Aborting request - %s",p_pszMessage);
|
log_error(0,"GNUstepWeb",NULL,NULL,"Aborting request - %s",p_pszMessage);
|
||||||
pResponse = GSWHTTPResponse_BuildErrorResponse(p_pszMessage);
|
pResponse = GSWHTTPResponse_BuildErrorResponse(NULL,p_pszMessage,NULL);
|
||||||
return dieSendResponse(p_pSession,
|
return dieSendResponse(p_pSession,
|
||||||
p_pRequest,
|
p_pRequest,
|
||||||
&pResponse);
|
&pResponse);
|
||||||
|
|
|
@ -76,6 +76,7 @@ Ascending.gif \
|
||||||
Descending.gif \
|
Descending.gif \
|
||||||
DownTriangle.gif \
|
DownTriangle.gif \
|
||||||
PoweredByGNUstep.gif \
|
PoweredByGNUstep.gif \
|
||||||
|
PoweredByGNUstepWeb.gif \
|
||||||
RightTriangle.gif \
|
RightTriangle.gif \
|
||||||
Unsorted.gif \
|
Unsorted.gif \
|
||||||
appOff.gif \
|
appOff.gif \
|
||||||
|
|
|
@ -11,8 +11,15 @@ Message : GSWString
|
||||||
Form: GSWForm
|
Form: GSWForm
|
||||||
{
|
{
|
||||||
target = ^target;
|
target = ^target;
|
||||||
|
name = "loginForm";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CurrentDate: GSWHiddenField
|
||||||
|
{
|
||||||
|
value = currentDate;
|
||||||
|
name = "currentDate";
|
||||||
|
};
|
||||||
|
|
||||||
User: GSWTextField
|
User: GSWTextField
|
||||||
{
|
{
|
||||||
value = user;
|
value = user;
|
||||||
|
@ -27,6 +34,7 @@ Submit: GSWSubmitButton
|
||||||
{
|
{
|
||||||
action = login;
|
action = login;
|
||||||
value = "Envoyer";
|
value = "Envoyer";
|
||||||
|
onClick = onClickString;
|
||||||
}
|
}
|
||||||
|
|
||||||
Reset: GSWResetButton
|
Reset: GSWResetButton
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<GSWEB NAME=Form>
|
<GSWEB NAME=Form>
|
||||||
|
<GSWEB NAME=CurrentDate></GSWEB>
|
||||||
<CENTER>
|
<CENTER>
|
||||||
<GSWEB NAME=MessageConditional>
|
<GSWEB NAME=MessageConditional>
|
||||||
<B><GSWEB NAME=Message></GSWEB><BR></B>
|
<B><GSWEB NAME=Message></GSWEB><BR></B>
|
||||||
|
|
|
@ -11,8 +11,15 @@ Message : GSWString
|
||||||
Form: GSWForm
|
Form: GSWForm
|
||||||
{
|
{
|
||||||
target=^target;
|
target=^target;
|
||||||
|
name = "loginForm";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CurrentDate: GSWHiddenField
|
||||||
|
{
|
||||||
|
value = currentDate;
|
||||||
|
name = "currentDate";
|
||||||
|
};
|
||||||
|
|
||||||
User: GSWTextField
|
User: GSWTextField
|
||||||
{
|
{
|
||||||
value = user;
|
value = user;
|
||||||
|
@ -27,6 +34,7 @@ Submit: GSWSubmitButton
|
||||||
{
|
{
|
||||||
action = login;
|
action = login;
|
||||||
value = "Login";
|
value = "Login";
|
||||||
|
onClick = onClickString;
|
||||||
}
|
}
|
||||||
|
|
||||||
Reset: GSWResetButton
|
Reset: GSWResetButton
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
<GSWEB NAME=Form>
|
<GSWEB NAME=Form>
|
||||||
|
<GSWEB NAME=CurrentDate></GSWEB>
|
||||||
<CENTER>
|
<CENTER>
|
||||||
<GSWEB NAME=MessageConditional>
|
<GSWEB NAME=MessageConditional>
|
||||||
<B><GSWEB NAME=Message></GSWEB><BR></B>
|
<B><GSWEB NAME=Message></GSWEB><BR></B>
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
NSString* message;
|
NSString* message;
|
||||||
NSString* user;
|
NSString* user;
|
||||||
NSString* password;
|
NSString* password;
|
||||||
|
NSCalendarDate* currentDate;
|
||||||
};
|
};
|
||||||
|
|
||||||
-(BOOL)synchronizesVariablesWithBindings;
|
-(BOOL)synchronizesVariablesWithBindings;
|
||||||
|
@ -37,7 +38,8 @@
|
||||||
-(void)awake;
|
-(void)awake;
|
||||||
-(void)sleep;
|
-(void)sleep;
|
||||||
-(GSWComponent*)login;
|
-(GSWComponent*)login;
|
||||||
|
-(NSString*)currentDate;
|
||||||
|
-(void)setCurrentDate:(NSString*)date_;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,6 +43,7 @@
|
||||||
message=nil;
|
message=nil;
|
||||||
user=nil;
|
user=nil;
|
||||||
password=nil;
|
password=nil;
|
||||||
|
currentDate=nil;
|
||||||
LOGObjectFnStop();
|
LOGObjectFnStop();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -52,6 +53,7 @@
|
||||||
message=nil;
|
message=nil;
|
||||||
user=nil;
|
user=nil;
|
||||||
password=nil;
|
password=nil;
|
||||||
|
currentDate=nil;
|
||||||
[super sleep];
|
[super sleep];
|
||||||
LOGObjectFnStop();
|
LOGObjectFnStop();
|
||||||
};
|
};
|
||||||
|
@ -107,5 +109,20 @@
|
||||||
return _nextPage;
|
return _nextPage;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
-(NSString*)currentDate
|
||||||
|
{
|
||||||
|
return @"--";
|
||||||
|
};
|
||||||
|
|
||||||
|
-(void)setCurrentDate:(NSString*)date_
|
||||||
|
{
|
||||||
|
NSDebugMLog(@"FDdate_=%@",date_);
|
||||||
|
};
|
||||||
|
|
||||||
|
-(NSString*)onClickString
|
||||||
|
{
|
||||||
|
return @"d=Date(); this.form.currentDate.value=Date.UTC(d.getYear(),d.getMonth(),d.getDay(),d.getHours(),d.getMinutes(),d.getSeconds())";
|
||||||
|
};
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
|
@ -229,9 +229,9 @@ int GSWApplicationMain(NSString* _applicationClassName,
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
//TODO
|
//TODO
|
||||||
GSWApplicationDebugSetChange();
|
|
||||||
if (_applicationClassName && [_applicationClassName length]>0)
|
if (_applicationClassName && [_applicationClassName length]>0)
|
||||||
ASSIGNCOPY(globalApplicationClassName,_applicationClassName);
|
ASSIGNCOPY(globalApplicationClassName,_applicationClassName);
|
||||||
|
GSWApplicationDebugSetChange();
|
||||||
applicationClass=[GSWApplication _applicationClass];
|
applicationClass=[GSWApplication _applicationClass];
|
||||||
if (!applicationClass)
|
if (!applicationClass)
|
||||||
{
|
{
|
||||||
|
@ -1029,6 +1029,7 @@ int GSWApplicationMain(NSString* _applicationClassName,
|
||||||
languages:(NSArray*)_languages
|
languages:(NSArray*)_languages
|
||||||
{
|
{
|
||||||
//OK
|
//OK
|
||||||
|
BOOL isCachedComponent=NO;
|
||||||
GSWComponentDefinition* _componentDefinition=nil;
|
GSWComponentDefinition* _componentDefinition=nil;
|
||||||
NSString* _language=nil;
|
NSString* _language=nil;
|
||||||
int iLanguage=0;
|
int iLanguage=0;
|
||||||
|
@ -1040,36 +1041,24 @@ int GSWApplicationMain(NSString* _applicationClassName,
|
||||||
if (_language)
|
if (_language)
|
||||||
{
|
{
|
||||||
NSDebugMLLog(@"gswcomponents",@"trying _language=%@",_language);
|
NSDebugMLLog(@"gswcomponents",@"trying _language=%@",_language);
|
||||||
NSDebugMLLog(@"gswcomponents",@"[self isCachingEnabled]=%s",([self isCachingEnabled] ? "YES" : "NO"));
|
NSDebugMLLog(@"gswcomponents",@"[self isCachingEnabled]=%s",([self isCachingEnabled] ? "YES" : "NO"));
|
||||||
if ([self isCachingEnabled])
|
if ([self isCachingEnabled])
|
||||||
{
|
{
|
||||||
_componentDefinition=[componentDefinitionCache objectForKeys:_name,_language,nil];
|
_componentDefinition=[componentDefinitionCache objectForKeys:_name,_language,nil];
|
||||||
NSDebugMLLog(@"gswcomponents",@"A _componentDefinition=%@",_componentDefinition);
|
|
||||||
if (_componentDefinition==(GSWComponentDefinition*)GSNotFoundMarker)
|
if (_componentDefinition==(GSWComponentDefinition*)GSNotFoundMarker)
|
||||||
_componentDefinition=nil;
|
_componentDefinition=nil;
|
||||||
else
|
else if (_componentDefinition)
|
||||||
{
|
isCachedComponent=YES;
|
||||||
GSWLogStdOut([NSString stringWithFormat:@"cachedComponent %@ language",_name,_language]);
|
|
||||||
GSWLog([NSString stringWithFormat:@"cachedComponent %@ language",_name,_language]);
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
if (!_componentDefinition)
|
if (!_componentDefinition)
|
||||||
{
|
{
|
||||||
_componentDefinition=[self lockedLoadComponentDefinitionWithName:_name
|
_componentDefinition=[self lockedLoadComponentDefinitionWithName:_name
|
||||||
language:_language];
|
language:_language];
|
||||||
NSDebugMLLog(@"gswcomponents",@"B _componentDefinition=%p",(void*)_componentDefinition);
|
|
||||||
if (_componentDefinition)
|
|
||||||
{
|
|
||||||
GSWLogStdOut([NSString stringWithFormat:@"not cachedComponent %@ language",_name,_language]);
|
|
||||||
GSWLog([NSString stringWithFormat:@"not cachedComponent %@ language",_name,_language]);
|
|
||||||
};
|
|
||||||
if ([self isCachingEnabled])
|
if ([self isCachingEnabled])
|
||||||
{
|
{
|
||||||
if (_componentDefinition)
|
if (_componentDefinition)
|
||||||
{
|
[componentDefinitionCache setObject:_componentDefinition
|
||||||
[componentDefinitionCache setObject:_componentDefinition
|
forKeys:_name,_language,nil];
|
||||||
forKeys:_name,_language,nil];
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
[componentDefinitionCache setObject:GSNotFoundMarker
|
[componentDefinitionCache setObject:GSNotFoundMarker
|
||||||
forKeys:_name,_language,nil];
|
forKeys:_name,_language,nil];
|
||||||
|
@ -1079,25 +1068,22 @@ int GSWApplicationMain(NSString* _applicationClassName,
|
||||||
};
|
};
|
||||||
if (!_componentDefinition)
|
if (!_componentDefinition)
|
||||||
{
|
{
|
||||||
|
_language=nil;
|
||||||
NSDebugMLLog0(@"low",@"trying no language");
|
NSDebugMLLog0(@"low",@"trying no language");
|
||||||
NSDebugMLLog(@"gswcomponents",@"[self isCachingEnabled]=%s",([self isCachingEnabled] ? "YES" : "NO"));
|
NSDebugMLLog(@"gswcomponents",@"[self isCachingEnabled]=%s",([self isCachingEnabled] ? "YES" : "NO"));
|
||||||
if ([self isCachingEnabled])
|
if ([self isCachingEnabled])
|
||||||
{
|
{
|
||||||
_componentDefinition=[componentDefinitionCache objectForKeys:_name,nil];
|
_componentDefinition=[componentDefinitionCache objectForKeys:_name,nil];
|
||||||
NSDebugMLLog(@"gswcomponents",@"C _componentDefinition=%@",_componentDefinition);
|
|
||||||
if (_componentDefinition==(GSWComponentDefinition*)GSNotFoundMarker)
|
if (_componentDefinition==(GSWComponentDefinition*)GSNotFoundMarker)
|
||||||
_componentDefinition=nil;
|
_componentDefinition=nil;
|
||||||
|
else if (_componentDefinition)
|
||||||
|
isCachedComponent=YES;
|
||||||
};
|
};
|
||||||
NSDebugMLLog(@"gswcomponents",@"D componentDefinition for %@ %s cached",_name,(_componentDefinition ? "" : "NOT"));
|
NSDebugMLLog(@"gswcomponents",@"D componentDefinition for %@ %s cached",_name,(_componentDefinition ? "" : "NOT"));
|
||||||
if (!_componentDefinition)
|
if (!_componentDefinition)
|
||||||
{
|
{
|
||||||
_componentDefinition=[self lockedLoadComponentDefinitionWithName:_name
|
_componentDefinition=[self lockedLoadComponentDefinitionWithName:_name
|
||||||
language:nil];
|
language:_language];
|
||||||
if (_componentDefinition)
|
|
||||||
{
|
|
||||||
GSWLogStdOut([NSString stringWithFormat:@"not cachedComponent %@ language",_name,_language]);
|
|
||||||
GSWLog([NSString stringWithFormat:@"not cachedComponent %@ language",_name,_language]);
|
|
||||||
};
|
|
||||||
if ([self isCachingEnabled])
|
if ([self isCachingEnabled])
|
||||||
{
|
{
|
||||||
if (_componentDefinition)
|
if (_componentDefinition)
|
||||||
|
@ -1116,12 +1102,21 @@ int GSWApplicationMain(NSString* _applicationClassName,
|
||||||
_name,
|
_name,
|
||||||
_languages);
|
_languages);
|
||||||
};
|
};
|
||||||
NSDebugMLLog(@"gswcomponents",@"E _componentDefinition=%@",_componentDefinition);
|
if (_componentDefinition)
|
||||||
NSDebugMLLog(@"gswcomponents",@"F componentDefinitionCache=%@",componentDefinitionCache);
|
{
|
||||||
NSDebugMLLog(@"low",@"%s componentDefinition for %@ class=%@",
|
NSString* _log=[NSString stringWithFormat:@"Component %@ %s language %@ (%sCached)",
|
||||||
|
_name,
|
||||||
|
(_language ? "" : "no"),
|
||||||
|
(_language ? _language : @""),
|
||||||
|
(isCachedComponent ? "" : "Not ")];
|
||||||
|
GSWLogStdOut(_log);
|
||||||
|
GSWLog(_log);
|
||||||
|
};
|
||||||
|
NSDebugMLLog(@"low",@"%s componentDefinition for %@ class=%@ %s",
|
||||||
(_componentDefinition ? "FOUND" : "NOTFOUND"),
|
(_componentDefinition ? "FOUND" : "NOTFOUND"),
|
||||||
_name,
|
_name,
|
||||||
(_componentDefinition ? [_componentDefinition class] : @""));
|
(_componentDefinition ? [_componentDefinition class] : @""),
|
||||||
|
(_componentDefinition ? (isCachedComponent ? "(Cached)" : "(Not Cached)") : ""));
|
||||||
LOGObjectFnStop();
|
LOGObjectFnStop();
|
||||||
return _componentDefinition;
|
return _componentDefinition;
|
||||||
};
|
};
|
||||||
|
|
|
@ -226,10 +226,14 @@ static char rcsId[] = "$Id$";
|
||||||
GSWDefaultAdaptorThread* _newThread=nil;
|
GSWDefaultAdaptorThread* _newThread=nil;
|
||||||
NSFileHandle* _listenHandle=nil;
|
NSFileHandle* _listenHandle=nil;
|
||||||
NSFileHandle* inStream = nil;
|
NSFileHandle* inStream = nil;
|
||||||
|
NSCalendarDate* requestDate=nil;
|
||||||
|
NSString* requestDateString=nil;
|
||||||
LOGObjectFnStart();
|
LOGObjectFnStart();
|
||||||
_listenHandle=[notification object];
|
_listenHandle=[notification object];
|
||||||
GSWLogCStdOut("New Request");
|
requestDate=[NSCalendarDate calendarDate];
|
||||||
GSWLogC("New Request");
|
requestDateString=[NSString stringWithFormat:@"New Request %@",requestDate];
|
||||||
|
GSWLogCStdOut([requestDateString cString]);
|
||||||
|
GSWLogC([requestDateString cString]);
|
||||||
NSDebugMLLog(@"info",@"_listenHandle=%p",(void*)_listenHandle);
|
NSDebugMLLog(@"info",@"_listenHandle=%p",(void*)_listenHandle);
|
||||||
inStream = [[notification userInfo]objectForKey:@"NSFileHandleNotificationFileHandleItem"];
|
inStream = [[notification userInfo]objectForKey:@"NSFileHandleNotificationFileHandleItem"];
|
||||||
NSDebugMLLog(@"info",@"announceNewConnection notification=%@\n",notification);
|
NSDebugMLLog(@"info",@"announceNewConnection notification=%@\n",notification);
|
||||||
|
@ -262,8 +266,10 @@ static char rcsId[] = "$Id$";
|
||||||
[threads addObject:_newThread];
|
[threads addObject:_newThread];
|
||||||
if (isMultiThreadEnabled)
|
if (isMultiThreadEnabled)
|
||||||
{
|
{
|
||||||
GSWLogCStdOut("Lauch Thread (Multi)");
|
requestDate=[NSCalendarDate calendarDate];
|
||||||
GSWLogC("Lauch Thread (Multi)");
|
requestDateString=[NSString stringWithFormat:@"Lauch Thread (Multi) %@",requestDate];
|
||||||
|
GSWLogCStdOut([requestDateString cString]);
|
||||||
|
GSWLogC([requestDateString cString]);
|
||||||
NSDebugMLLog(@"info",
|
NSDebugMLLog(@"info",
|
||||||
@"Lauch Thread (Multi) %p",
|
@"Lauch Thread (Multi) %p",
|
||||||
(void*)_newThread);
|
(void*)_newThread);
|
||||||
|
@ -312,15 +318,20 @@ static char rcsId[] = "$Id$";
|
||||||
};
|
};
|
||||||
if (!isMultiThreadEnabled && _newThread)
|
if (!isMultiThreadEnabled && _newThread)
|
||||||
{
|
{
|
||||||
GSWLogCStdOut("Lauch Thread (Mono)");
|
requestDate=[NSCalendarDate calendarDate];
|
||||||
|
requestDateString=[NSString stringWithFormat:@"Lauch Thread (Mono) %@",requestDate];
|
||||||
|
GSWLogCStdOut([requestDateString cString]);
|
||||||
NSDebugMLLog(@"info",
|
NSDebugMLLog(@"info",
|
||||||
@"Lauch Thread (Mono) %p",
|
@"%@ %p",
|
||||||
(void*)_newThread);
|
requestDateString,
|
||||||
|
(void*)_newThread);
|
||||||
[_newThread run:nil];
|
[_newThread run:nil];
|
||||||
DESTROY(_newThread);
|
DESTROY(_newThread);
|
||||||
GSWLogCStdOut("Stop Thread (Mono)");
|
requestDate=[NSCalendarDate calendarDate];
|
||||||
|
requestDateString=[NSString stringWithFormat:@"Stop Thread (Mono) %@",requestDate];
|
||||||
|
GSWLogCStdOut([requestDateString cString]);
|
||||||
NSDebugMLLog0(@"info",
|
NSDebugMLLog0(@"info",
|
||||||
@"Stop Thread (Mono)");
|
requestDateString);
|
||||||
};
|
};
|
||||||
if ([self tryLock])
|
if ([self tryLock])
|
||||||
{
|
{
|
||||||
|
|
|
@ -38,6 +38,10 @@
|
||||||
NSRunLoop* currentRunLoop;
|
NSRunLoop* currentRunLoop;
|
||||||
NSDate* runLoopDate;
|
NSDate* runLoopDate;
|
||||||
BOOL isMultiThread;
|
BOOL isMultiThread;
|
||||||
|
NSDate* creationDate;
|
||||||
|
NSDate* runDate;
|
||||||
|
NSDate* dispatchRequestDate;
|
||||||
|
NSDate* sendResponseDate;
|
||||||
}
|
}
|
||||||
|
|
||||||
-(id)initWithApp:(GSWApplication*)_application
|
-(id)initWithApp:(GSWApplication*)_application
|
||||||
|
|
|
@ -28,17 +28,30 @@ static char rcsId[] = "$Id$";
|
||||||
//====================================================================
|
//====================================================================
|
||||||
@implementation GSWDefaultAdaptorThread
|
@implementation GSWDefaultAdaptorThread
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
-(id)init
|
||||||
|
{
|
||||||
|
if ((self=[super init]))
|
||||||
|
{
|
||||||
|
ASSIGN(creationDate,[NSDate date]);
|
||||||
|
};
|
||||||
|
return self;
|
||||||
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
-(id)initWithApp:(GSWApplication*)application_
|
-(id)initWithApp:(GSWApplication*)application_
|
||||||
withAdaptor:(GSWAdaptor*)adaptor_
|
withAdaptor:(GSWAdaptor*)adaptor_
|
||||||
withStream:(NSFileHandle*)stream_
|
withStream:(NSFileHandle*)stream_
|
||||||
{
|
{
|
||||||
self=[super init];
|
if ((self=[self init]))
|
||||||
application=application_;
|
{
|
||||||
adaptor=adaptor_;
|
application=application_;
|
||||||
ASSIGN(stream,stream_);
|
adaptor=adaptor_;
|
||||||
keepAlive=NO;
|
ASSIGN(stream,stream_);
|
||||||
isMultiThread=[adaptor isMultiThreadEnabled];
|
keepAlive=NO;
|
||||||
NSDebugMLLog(@"info",@"isMultiThread=%d",(int)isMultiThread);
|
isMultiThread=[adaptor isMultiThreadEnabled];
|
||||||
|
NSDebugMLLog(@"info",@"isMultiThread=%d",(int)isMultiThread);
|
||||||
|
};
|
||||||
return self;
|
return self;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -47,6 +60,11 @@ static char rcsId[] = "$Id$";
|
||||||
{
|
{
|
||||||
GSWLogC("dealloc GSWDefaultAdaptorThread");
|
GSWLogC("dealloc GSWDefaultAdaptorThread");
|
||||||
DESTROY(stream);
|
DESTROY(stream);
|
||||||
|
GSWLogC("release dates");
|
||||||
|
DESTROY(creationDate);
|
||||||
|
DESTROY(runDate);
|
||||||
|
DESTROY(dispatchRequestDate);
|
||||||
|
DESTROY(sendResponseDate);
|
||||||
GSWLogC("release pool");
|
GSWLogC("release pool");
|
||||||
// DESTROY(pool);
|
// DESTROY(pool);
|
||||||
[super dealloc];
|
[super dealloc];
|
||||||
|
@ -84,6 +102,9 @@ static char rcsId[] = "$Id$";
|
||||||
NSString* _requestLine=nil;
|
NSString* _requestLine=nil;
|
||||||
NSDictionary* _headers=nil;
|
NSDictionary* _headers=nil;
|
||||||
NSData* _data=nil;
|
NSData* _data=nil;
|
||||||
|
ASSIGN(runDate,[NSDate date]);
|
||||||
|
DESTROY(dispatchRequestDate);
|
||||||
|
DESTROY(sendResponseDate);
|
||||||
GSWLogCStdOut("Thread run START");
|
GSWLogCStdOut("Thread run START");
|
||||||
GSWLogC("Thread run START");
|
GSWLogC("Thread run START");
|
||||||
pool=[NSAutoreleasePool new];
|
pool=[NSAutoreleasePool new];
|
||||||
|
@ -145,6 +166,7 @@ static char rcsId[] = "$Id$";
|
||||||
//call application resourceRequestHandlerKey (retourne wr)
|
//call application resourceRequestHandlerKey (retourne wr)
|
||||||
//call requets requestHandlerKey (retorune nil)
|
//call requets requestHandlerKey (retorune nil)
|
||||||
NSDebugMLLog(@"info",@"GSWDefaultAdaptorThread: run handleRequest:%@",request);
|
NSDebugMLLog(@"info",@"GSWDefaultAdaptorThread: run handleRequest:%@",request);
|
||||||
|
ASSIGN(dispatchRequestDate,[NSDate date]);
|
||||||
NS_DURING
|
NS_DURING
|
||||||
{
|
{
|
||||||
response=[application dispatchRequest:request];
|
response=[application dispatchRequest:request];
|
||||||
|
@ -165,6 +187,7 @@ static char rcsId[] = "$Id$";
|
||||||
if (response)
|
if (response)
|
||||||
{
|
{
|
||||||
RETAIN(response);
|
RETAIN(response);
|
||||||
|
ASSIGN(sendResponseDate,[NSDate date]);
|
||||||
NS_DURING
|
NS_DURING
|
||||||
{
|
{
|
||||||
[self sendResponse:response];
|
[self sendResponse:response];
|
||||||
|
|
|
@ -245,19 +245,19 @@ static char rcsId[] = "$Id$";
|
||||||
BOOL _multipleSubmit=NO;
|
BOOL _multipleSubmit=NO;
|
||||||
int i=0;
|
int i=0;
|
||||||
LOGObjectFnStartC("GSWForm");
|
LOGObjectFnStartC("GSWForm");
|
||||||
NSDebugMLLog(@"gswdync",@"ET=%@ id=%@ senderId=%@",[self class],[context_ elementID],[context_ senderID]);
|
_senderID=[context_ senderID];
|
||||||
|
_elementID=[context_ elementID];
|
||||||
|
NSDebugMLLog(@"gswdync",@"ET=%@ id=%@ senderId=%@",[self class],_elementID,_senderID);
|
||||||
NS_DURING
|
NS_DURING
|
||||||
{
|
{
|
||||||
GSWAssertCorrectElementID(context_);// Debug Only
|
GSWAssertCorrectElementID(context_);// Debug Only
|
||||||
_senderID=[context_ senderID];
|
|
||||||
_elementID=[context_ elementID];
|
|
||||||
if ([self prefixMatchSenderIDInContext:context_]) //Avoid trying to find action if we are not the good component
|
if ([self prefixMatchSenderIDInContext:context_]) //Avoid trying to find action if we are not the good component
|
||||||
{
|
{
|
||||||
_isFormSubmited=[_elementID isEqualToString:_senderID];
|
_isFormSubmited=[_elementID isEqualToString:_senderID];
|
||||||
NSDebugMLLog(@"gswdync",@"ET=%@ id=%@ senderId=%@ _isFormSubmited=%s",
|
NSDebugMLLog(@"gswdync",@"ET=%@ id=%@ senderId=%@ _isFormSubmited=%s",
|
||||||
[self class],
|
[self class],
|
||||||
[context_ elementID],
|
_elementID,
|
||||||
[context_ senderID],
|
_senderID,
|
||||||
(_isFormSubmited ? "YES" : "NO"));
|
(_isFormSubmited ? "YES" : "NO"));
|
||||||
#if !GSWEB_STRICT
|
#if !GSWEB_STRICT
|
||||||
if (_isFormSubmited && [self disabledInContext:context_])
|
if (_isFormSubmited && [self disabledInContext:context_])
|
||||||
|
@ -271,8 +271,8 @@ static char rcsId[] = "$Id$";
|
||||||
inContext:context_];
|
inContext:context_];
|
||||||
NSDebugMLLog(@"gswdync",@"ET=%@ id=%@ senderId=%@ _multipleSubmit=%s",
|
NSDebugMLLog(@"gswdync",@"ET=%@ id=%@ senderId=%@ _multipleSubmit=%s",
|
||||||
[self class],
|
[self class],
|
||||||
[context_ elementID],
|
_elementID,
|
||||||
[context_ senderID],
|
_senderID,
|
||||||
(_multipleSubmit ? "YES" : "NO"));
|
(_multipleSubmit ? "YES" : "NO"));
|
||||||
[context_ _setIsMultipleSubmitForm:_multipleSubmit];
|
[context_ _setIsMultipleSubmitForm:_multipleSubmit];
|
||||||
};
|
};
|
||||||
|
@ -288,9 +288,7 @@ static char rcsId[] = "$Id$";
|
||||||
if (_isFormSubmited)
|
if (_isFormSubmited)
|
||||||
{
|
{
|
||||||
if ([context_ _wasActionInvoked])
|
if ([context_ _wasActionInvoked])
|
||||||
{
|
|
||||||
[context_ _setIsMultipleSubmitForm:NO];
|
[context_ _setIsMultipleSubmitForm:NO];
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
NSDebugMLLog0(@"gswdync",@"formSubmitted but no action was invoked!");
|
NSDebugMLLog0(@"gswdync",@"formSubmitted but no action was invoked!");
|
||||||
|
@ -298,9 +296,10 @@ static char rcsId[] = "$Id$";
|
||||||
[context_ setInForm:NO];
|
[context_ setInForm:NO];
|
||||||
[context_ _setFormSubmitted:NO];
|
[context_ _setFormSubmitted:NO];
|
||||||
};
|
};
|
||||||
NSDebugMLLog(@"gswdync",@"END ET=%@ id=%@",[self class],[context_ elementID]);
|
_elementID=[context_ elementID];
|
||||||
|
NSDebugMLLog(@"gswdync",@"END ET=%@ id=%@",[self class],_elementID);
|
||||||
#ifndef NDEBBUG
|
#ifndef NDEBBUG
|
||||||
NSAssert(elementsNb==[(GSWElementIDString*)[context_ elementID]elementsNb],@"GSWForm invokeActionForRequest: bad elementID");
|
NSAssert(elementsNb==[(GSWElementIDString*)_elementID elementsNb],@"GSWForm invokeActionForRequest: bad elementID");
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -314,12 +313,14 @@ static char rcsId[] = "$Id$";
|
||||||
[localException raise];
|
[localException raise];
|
||||||
}
|
}
|
||||||
NS_ENDHANDLER;
|
NS_ENDHANDLER;
|
||||||
if (![context_ _wasActionInvoked] && [[context_ elementID] compare:[context_ senderID]]!=NSOrderedAscending)
|
_senderID=[context_ senderID];
|
||||||
|
_elementID=[context_ elementID];
|
||||||
|
if (![context_ _wasActionInvoked] && [_elementID compare:_senderID]!=NSOrderedAscending)
|
||||||
{
|
{
|
||||||
LOGError(@"Action not invoked at the end of %@ (id=%@) senderId=%@",
|
LOGError(@"Action not invoked at the end of %@ (id=%@) senderId=%@",
|
||||||
[self class],
|
[self class],
|
||||||
[context_ elementID],
|
_elementID,
|
||||||
[context_ senderID]);
|
_senderID);
|
||||||
};
|
};
|
||||||
LOGObjectFnStopC("GSWForm");
|
LOGObjectFnStopC("GSWForm");
|
||||||
return _element;
|
return _element;
|
||||||
|
|
|
@ -588,25 +588,33 @@ int _begin=[text length];
|
||||||
int _saveIndex;
|
int _saveIndex;
|
||||||
|
|
||||||
//LOGObjectFnStart();
|
//LOGObjectFnStart();
|
||||||
switch ( [self LA:1])
|
|
||||||
{
|
{
|
||||||
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
switch ( [self LA:1])
|
||||||
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
{
|
||||||
case ((unichar)('8')): case ((unichar)('9')):
|
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
||||||
{
|
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
||||||
[self matchRange:'0' :'9'];
|
case ((unichar)('8')): case ((unichar)('9')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'0' :'9'];
|
||||||
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
break;
|
||||||
case ((unichar)('e')): case ((unichar)('f')):
|
}
|
||||||
{
|
case ((unichar)('A')): case ((unichar)('B')): case ((unichar)('C')): case ((unichar)('D')):
|
||||||
[self matchRange:'a' :'f'];
|
case ((unichar)('E')): case ((unichar)('F')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'A' :'F'];
|
||||||
default:
|
break;
|
||||||
{
|
}
|
||||||
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
||||||
}
|
case ((unichar)('e')): case ((unichar)('f')):
|
||||||
|
{
|
||||||
|
[self matchRange:'a' :'f'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( _createToken && _token==0 )
|
if ( _createToken && _token==0 )
|
||||||
{
|
{
|
||||||
|
@ -642,7 +650,7 @@ CONST unsigned long GSWHTMLAttrLexer___tokenSet_1_data_[] = { 4294967288UL, 4294
|
||||||
static ANTLRBitSet* GSWHTMLAttrLexer___tokenSet_1=nil;
|
static ANTLRBitSet* GSWHTMLAttrLexer___tokenSet_1=nil;
|
||||||
CONST unsigned long GSWHTMLAttrLexer___tokenSet_2_data_[] = { 4294967288UL, 4294967167UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
CONST unsigned long GSWHTMLAttrLexer___tokenSet_2_data_[] = { 4294967288UL, 4294967167UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
||||||
static ANTLRBitSet* GSWHTMLAttrLexer___tokenSet_2=nil;
|
static ANTLRBitSet* GSWHTMLAttrLexer___tokenSet_2=nil;
|
||||||
CONST unsigned long GSWHTMLAttrLexer___tokenSet_3_data_[] = { 0UL, 67043328UL, 0UL, 126UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
CONST unsigned long GSWHTMLAttrLexer___tokenSet_3_data_[] = { 0UL, 67043328UL, 126UL, 126UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
||||||
static ANTLRBitSet* GSWHTMLAttrLexer___tokenSet_3=nil;
|
static ANTLRBitSet* GSWHTMLAttrLexer___tokenSet_3=nil;
|
||||||
+(void)initialize
|
+(void)initialize
|
||||||
{
|
{
|
||||||
|
|
|
@ -1035,31 +1035,33 @@ int _begin=[text length];
|
||||||
int _saveIndex;
|
int _saveIndex;
|
||||||
|
|
||||||
//LOGObjectFnStart();
|
//LOGObjectFnStart();
|
||||||
switch ( [self LA:1])
|
|
||||||
{
|
{
|
||||||
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
switch ( [self LA:1])
|
||||||
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
{
|
||||||
case ((unichar)('8')): case ((unichar)('9')):
|
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
||||||
{
|
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
||||||
[self matchRange:'0' :'9'];
|
case ((unichar)('8')): case ((unichar)('9')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'0' :'9'];
|
||||||
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
break;
|
||||||
case ((unichar)('e')): case ((unichar)('f')):
|
}
|
||||||
{
|
case ((unichar)('A')): case ((unichar)('B')): case ((unichar)('C')): case ((unichar)('D')):
|
||||||
[self matchRange:'a' :'f'];
|
case ((unichar)('E')): case ((unichar)('F')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'A' :'F'];
|
||||||
case ((unichar)('A')): case ((unichar)('B')): case ((unichar)('C')): case ((unichar)('D')):
|
break;
|
||||||
case ((unichar)('E')): case ((unichar)('F')):
|
}
|
||||||
{
|
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
||||||
[self matchRange:'A' :'F'];
|
case ((unichar)('e')): case ((unichar)('f')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'a' :'f'];
|
||||||
default:
|
break;
|
||||||
{
|
}
|
||||||
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
default:
|
||||||
}
|
{
|
||||||
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( _createToken && _token==0 )
|
if ( _createToken && _token==0 )
|
||||||
{
|
{
|
||||||
|
@ -1128,11 +1130,11 @@ int _begin=[text length];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
goto _loop63;
|
goto _loop64;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (YES);
|
} while (YES);
|
||||||
_loop63:;
|
_loop64:;
|
||||||
}
|
}
|
||||||
[self matchCharacter:'>'];
|
[self matchCharacter:'>'];
|
||||||
{
|
{
|
||||||
|
@ -1163,11 +1165,11 @@ int _begin=[text length];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
goto _loop66;
|
goto _loop67;
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (YES);
|
} while (YES);
|
||||||
_loop66:;
|
_loop67:;
|
||||||
}
|
}
|
||||||
NSLog(@"invalid tag: %@",[self text]);
|
NSLog(@"invalid tag: %@",[self text]);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
/*public: */-(void) mCOLUMNWithCreateToken:(BOOL)_createToken ;
|
/*public: */-(void) mCOLUMNWithCreateToken:(BOOL)_createToken ;
|
||||||
/*public: */-(void) mASSIGNWithCreateToken:(BOOL)_createToken ;
|
/*public: */-(void) mASSIGNWithCreateToken:(BOOL)_createToken ;
|
||||||
/*public: */-(void) mWSWithCreateToken:(BOOL)_createToken ;
|
/*public: */-(void) mWSWithCreateToken:(BOOL)_createToken ;
|
||||||
|
/*protected: */-(void) mESCWithCreateToken:(BOOL)_createToken ;
|
||||||
/*public: */-(void) mINTWithCreateToken:(BOOL)_createToken ;
|
/*public: */-(void) mINTWithCreateToken:(BOOL)_createToken ;
|
||||||
/*public: */-(void) mHEXNUMWithCreateToken:(BOOL)_createToken ;
|
/*public: */-(void) mHEXNUMWithCreateToken:(BOOL)_createToken ;
|
||||||
/*protected: */-(void) mHEXINTWithCreateToken:(BOOL)_createToken ;
|
/*protected: */-(void) mHEXINTWithCreateToken:(BOOL)_createToken ;
|
||||||
|
|
|
@ -635,48 +635,192 @@ int _begin=[text length];
|
||||||
//LOGObjectFnStart();
|
//LOGObjectFnStart();
|
||||||
switch ( [self LA:1])
|
switch ( [self LA:1])
|
||||||
{
|
{
|
||||||
case ((unichar)('"')):
|
|
||||||
{
|
|
||||||
[self matchCharacter:'"'];
|
|
||||||
{
|
|
||||||
do
|
|
||||||
{
|
|
||||||
if (([GSWPageDefLexer___tokenSet_5 isMember:[self LA:1]]))
|
|
||||||
{
|
|
||||||
[self matchNotCharacter:'"'];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
goto _loop59;
|
|
||||||
}
|
|
||||||
|
|
||||||
} while (YES);
|
|
||||||
_loop59:;
|
|
||||||
}
|
|
||||||
[self matchCharacter:'"'];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case ((unichar)('\'')):
|
case ((unichar)('\'')):
|
||||||
{
|
{
|
||||||
[self matchCharacter:'\''];
|
[self matchCharacter:'\''];
|
||||||
{
|
{
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (([GSWPageDefLexer___tokenSet_6 isMember:[self LA:1]]))
|
switch ( [self LA:1])
|
||||||
{
|
{
|
||||||
[self matchNotCharacter:'\''];
|
case ((unichar)('\\')):
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
{
|
||||||
goto _loop61;
|
[self mESCWithCreateToken:NO];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)(0x3)): case ((unichar)(0x4)): case ((unichar)(0x5)): case ((unichar)(0x6)):
|
||||||
|
case ((unichar)(0x7)): case ((unichar)(0x8)): case ((unichar)('\t')): case ((unichar)('\n')):
|
||||||
|
case ((unichar)(0xb)): case ((unichar)(0xc)): case ((unichar)('\r')): case ((unichar)(0xe)):
|
||||||
|
case ((unichar)(0xf)): case ((unichar)(0x10)): case ((unichar)(0x11)): case ((unichar)(0x12)):
|
||||||
|
case ((unichar)(0x13)): case ((unichar)(0x14)): case ((unichar)(0x15)): case ((unichar)(0x16)):
|
||||||
|
case ((unichar)(0x17)): case ((unichar)(0x18)): case ((unichar)(0x19)): case ((unichar)(0x1a)):
|
||||||
|
case ((unichar)(0x1b)): case ((unichar)(0x1c)): case ((unichar)(0x1d)): case ((unichar)(0x1e)):
|
||||||
|
case ((unichar)(0x1f)): case ((unichar)(' ')): case ((unichar)('!')): case ((unichar)('"')):
|
||||||
|
case ((unichar)('#')): case ((unichar)('$')): case ((unichar)('%')): case ((unichar)('&')):
|
||||||
|
case ((unichar)('(')): case ((unichar)(')')): case ((unichar)('*')): case ((unichar)('+')):
|
||||||
|
case ((unichar)(',')): case ((unichar)('-')): case ((unichar)('.')): case ((unichar)('/')):
|
||||||
|
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
||||||
|
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
||||||
|
case ((unichar)('8')): case ((unichar)('9')): case ((unichar)(':')): case ((unichar)(';')):
|
||||||
|
case ((unichar)('<')): case ((unichar)('=')): case ((unichar)('>')): case ((unichar)('?')):
|
||||||
|
case ((unichar)('@')): case ((unichar)('A')): case ((unichar)('B')): case ((unichar)('C')):
|
||||||
|
case ((unichar)('D')): case ((unichar)('E')): case ((unichar)('F')): case ((unichar)('G')):
|
||||||
|
case ((unichar)('H')): case ((unichar)('I')): case ((unichar)('J')): case ((unichar)('K')):
|
||||||
|
case ((unichar)('L')): case ((unichar)('M')): case ((unichar)('N')): case ((unichar)('O')):
|
||||||
|
case ((unichar)('P')): case ((unichar)('Q')): case ((unichar)('R')): case ((unichar)('S')):
|
||||||
|
case ((unichar)('T')): case ((unichar)('U')): case ((unichar)('V')): case ((unichar)('W')):
|
||||||
|
case ((unichar)('X')): case ((unichar)('Y')): case ((unichar)('Z')): case ((unichar)('[')):
|
||||||
|
case ((unichar)(']')): case ((unichar)('^')): case ((unichar)('_')): case ((unichar)('`')):
|
||||||
|
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
||||||
|
case ((unichar)('e')): case ((unichar)('f')): case ((unichar)('g')): case ((unichar)('h')):
|
||||||
|
case ((unichar)('i')): case ((unichar)('j')): case ((unichar)('k')): case ((unichar)('l')):
|
||||||
|
case ((unichar)('m')): case ((unichar)('n')): case ((unichar)('o')): case ((unichar)('p')):
|
||||||
|
case ((unichar)('q')): case ((unichar)('r')): case ((unichar)('s')): case ((unichar)('t')):
|
||||||
|
case ((unichar)('u')): case ((unichar)('v')): case ((unichar)('w')): case ((unichar)('x')):
|
||||||
|
case ((unichar)('y')): case ((unichar)('z')): case ((unichar)('{')): case ((unichar)('|')):
|
||||||
|
case ((unichar)('}')): case ((unichar)('~')): case ((unichar)(0x7f)): case ((unichar)(0x80)):
|
||||||
|
case ((unichar)(0x81)): case ((unichar)(0x82)): case ((unichar)(0x83)): case ((unichar)(0x84)):
|
||||||
|
case ((unichar)(0x85)): case ((unichar)(0x86)): case ((unichar)(0x87)): case ((unichar)(0x88)):
|
||||||
|
case ((unichar)(0x89)): case ((unichar)(0x8a)): case ((unichar)(0x8b)): case ((unichar)(0x8c)):
|
||||||
|
case ((unichar)(0x8d)): case ((unichar)(0x8e)): case ((unichar)(0x8f)): case ((unichar)(0x90)):
|
||||||
|
case ((unichar)(0x91)): case ((unichar)(0x92)): case ((unichar)(0x93)): case ((unichar)(0x94)):
|
||||||
|
case ((unichar)(0x95)): case ((unichar)(0x96)): case ((unichar)(0x97)): case ((unichar)(0x98)):
|
||||||
|
case ((unichar)(0x99)): case ((unichar)(0x9a)): case ((unichar)(0x9b)): case ((unichar)(0x9c)):
|
||||||
|
case ((unichar)(0x9d)): case ((unichar)(0x9e)): case ((unichar)(0x9f)): case ((unichar)(0xa0)):
|
||||||
|
case ((unichar)(0xa1)): case ((unichar)(0xa2)): case ((unichar)(0xa3)): case ((unichar)(0xa4)):
|
||||||
|
case ((unichar)(0xa5)): case ((unichar)(0xa6)): case ((unichar)(0xa7)): case ((unichar)(0xa8)):
|
||||||
|
case ((unichar)(0xa9)): case ((unichar)(0xaa)): case ((unichar)(0xab)): case ((unichar)(0xac)):
|
||||||
|
case ((unichar)(0xad)): case ((unichar)(0xae)): case ((unichar)(0xaf)): case ((unichar)(0xb0)):
|
||||||
|
case ((unichar)(0xb1)): case ((unichar)(0xb2)): case ((unichar)(0xb3)): case ((unichar)(0xb4)):
|
||||||
|
case ((unichar)(0xb5)): case ((unichar)(0xb6)): case ((unichar)(0xb7)): case ((unichar)(0xb8)):
|
||||||
|
case ((unichar)(0xb9)): case ((unichar)(0xba)): case ((unichar)(0xbb)): case ((unichar)(0xbc)):
|
||||||
|
case ((unichar)(0xbd)): case ((unichar)(0xbe)): case ((unichar)(0xbf)): case ((unichar)(0xc0)):
|
||||||
|
case ((unichar)(0xc1)): case ((unichar)(0xc2)): case ((unichar)(0xc3)): case ((unichar)(0xc4)):
|
||||||
|
case ((unichar)(0xc5)): case ((unichar)(0xc6)): case ((unichar)(0xc7)): case ((unichar)(0xc8)):
|
||||||
|
case ((unichar)(0xc9)): case ((unichar)(0xca)): case ((unichar)(0xcb)): case ((unichar)(0xcc)):
|
||||||
|
case ((unichar)(0xcd)): case ((unichar)(0xce)): case ((unichar)(0xcf)): case ((unichar)(0xd0)):
|
||||||
|
case ((unichar)(0xd1)): case ((unichar)(0xd2)): case ((unichar)(0xd3)): case ((unichar)(0xd4)):
|
||||||
|
case ((unichar)(0xd5)): case ((unichar)(0xd6)): case ((unichar)(0xd7)): case ((unichar)(0xd8)):
|
||||||
|
case ((unichar)(0xd9)): case ((unichar)(0xda)): case ((unichar)(0xdb)): case ((unichar)(0xdc)):
|
||||||
|
case ((unichar)(0xdd)): case ((unichar)(0xde)): case ((unichar)(0xdf)): case ((unichar)(0xe0)):
|
||||||
|
case ((unichar)(0xe1)): case ((unichar)(0xe2)): case ((unichar)(0xe3)): case ((unichar)(0xe4)):
|
||||||
|
case ((unichar)(0xe5)): case ((unichar)(0xe6)): case ((unichar)(0xe7)): case ((unichar)(0xe8)):
|
||||||
|
case ((unichar)(0xe9)): case ((unichar)(0xea)): case ((unichar)(0xeb)): case ((unichar)(0xec)):
|
||||||
|
case ((unichar)(0xed)): case ((unichar)(0xee)): case ((unichar)(0xef)): case ((unichar)(0xf0)):
|
||||||
|
case ((unichar)(0xf1)): case ((unichar)(0xf2)): case ((unichar)(0xf3)): case ((unichar)(0xf4)):
|
||||||
|
case ((unichar)(0xf5)): case ((unichar)(0xf6)): case ((unichar)(0xf7)): case ((unichar)(0xf8)):
|
||||||
|
case ((unichar)(0xf9)): case ((unichar)(0xfa)): case ((unichar)(0xfb)): case ((unichar)(0xfc)):
|
||||||
|
case ((unichar)(0xfd)): case ((unichar)(0xfe)): case ((unichar)(0xff)):
|
||||||
|
{
|
||||||
|
{
|
||||||
|
[self matchCharSet:GSWPageDefLexer___tokenSet_5];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
goto _loop60;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} while (YES);
|
} while (YES);
|
||||||
_loop61:;
|
_loop60:;
|
||||||
}
|
}
|
||||||
[self matchCharacter:'\''];
|
[self matchCharacter:'\''];
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case ((unichar)('"')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'"'];
|
||||||
|
{
|
||||||
|
do
|
||||||
|
{
|
||||||
|
switch ( [self LA:1])
|
||||||
|
{
|
||||||
|
case ((unichar)('\\')):
|
||||||
|
{
|
||||||
|
[self mESCWithCreateToken:NO];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)(0x3)): case ((unichar)(0x4)): case ((unichar)(0x5)): case ((unichar)(0x6)):
|
||||||
|
case ((unichar)(0x7)): case ((unichar)(0x8)): case ((unichar)('\t')): case ((unichar)('\n')):
|
||||||
|
case ((unichar)(0xb)): case ((unichar)(0xc)): case ((unichar)('\r')): case ((unichar)(0xe)):
|
||||||
|
case ((unichar)(0xf)): case ((unichar)(0x10)): case ((unichar)(0x11)): case ((unichar)(0x12)):
|
||||||
|
case ((unichar)(0x13)): case ((unichar)(0x14)): case ((unichar)(0x15)): case ((unichar)(0x16)):
|
||||||
|
case ((unichar)(0x17)): case ((unichar)(0x18)): case ((unichar)(0x19)): case ((unichar)(0x1a)):
|
||||||
|
case ((unichar)(0x1b)): case ((unichar)(0x1c)): case ((unichar)(0x1d)): case ((unichar)(0x1e)):
|
||||||
|
case ((unichar)(0x1f)): case ((unichar)(' ')): case ((unichar)('!')): case ((unichar)('#')):
|
||||||
|
case ((unichar)('$')): case ((unichar)('%')): case ((unichar)('&')): case ((unichar)('\'')):
|
||||||
|
case ((unichar)('(')): case ((unichar)(')')): case ((unichar)('*')): case ((unichar)('+')):
|
||||||
|
case ((unichar)(',')): case ((unichar)('-')): case ((unichar)('.')): case ((unichar)('/')):
|
||||||
|
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
||||||
|
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
||||||
|
case ((unichar)('8')): case ((unichar)('9')): case ((unichar)(':')): case ((unichar)(';')):
|
||||||
|
case ((unichar)('<')): case ((unichar)('=')): case ((unichar)('>')): case ((unichar)('?')):
|
||||||
|
case ((unichar)('@')): case ((unichar)('A')): case ((unichar)('B')): case ((unichar)('C')):
|
||||||
|
case ((unichar)('D')): case ((unichar)('E')): case ((unichar)('F')): case ((unichar)('G')):
|
||||||
|
case ((unichar)('H')): case ((unichar)('I')): case ((unichar)('J')): case ((unichar)('K')):
|
||||||
|
case ((unichar)('L')): case ((unichar)('M')): case ((unichar)('N')): case ((unichar)('O')):
|
||||||
|
case ((unichar)('P')): case ((unichar)('Q')): case ((unichar)('R')): case ((unichar)('S')):
|
||||||
|
case ((unichar)('T')): case ((unichar)('U')): case ((unichar)('V')): case ((unichar)('W')):
|
||||||
|
case ((unichar)('X')): case ((unichar)('Y')): case ((unichar)('Z')): case ((unichar)('[')):
|
||||||
|
case ((unichar)(']')): case ((unichar)('^')): case ((unichar)('_')): case ((unichar)('`')):
|
||||||
|
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
||||||
|
case ((unichar)('e')): case ((unichar)('f')): case ((unichar)('g')): case ((unichar)('h')):
|
||||||
|
case ((unichar)('i')): case ((unichar)('j')): case ((unichar)('k')): case ((unichar)('l')):
|
||||||
|
case ((unichar)('m')): case ((unichar)('n')): case ((unichar)('o')): case ((unichar)('p')):
|
||||||
|
case ((unichar)('q')): case ((unichar)('r')): case ((unichar)('s')): case ((unichar)('t')):
|
||||||
|
case ((unichar)('u')): case ((unichar)('v')): case ((unichar)('w')): case ((unichar)('x')):
|
||||||
|
case ((unichar)('y')): case ((unichar)('z')): case ((unichar)('{')): case ((unichar)('|')):
|
||||||
|
case ((unichar)('}')): case ((unichar)('~')): case ((unichar)(0x7f)): case ((unichar)(0x80)):
|
||||||
|
case ((unichar)(0x81)): case ((unichar)(0x82)): case ((unichar)(0x83)): case ((unichar)(0x84)):
|
||||||
|
case ((unichar)(0x85)): case ((unichar)(0x86)): case ((unichar)(0x87)): case ((unichar)(0x88)):
|
||||||
|
case ((unichar)(0x89)): case ((unichar)(0x8a)): case ((unichar)(0x8b)): case ((unichar)(0x8c)):
|
||||||
|
case ((unichar)(0x8d)): case ((unichar)(0x8e)): case ((unichar)(0x8f)): case ((unichar)(0x90)):
|
||||||
|
case ((unichar)(0x91)): case ((unichar)(0x92)): case ((unichar)(0x93)): case ((unichar)(0x94)):
|
||||||
|
case ((unichar)(0x95)): case ((unichar)(0x96)): case ((unichar)(0x97)): case ((unichar)(0x98)):
|
||||||
|
case ((unichar)(0x99)): case ((unichar)(0x9a)): case ((unichar)(0x9b)): case ((unichar)(0x9c)):
|
||||||
|
case ((unichar)(0x9d)): case ((unichar)(0x9e)): case ((unichar)(0x9f)): case ((unichar)(0xa0)):
|
||||||
|
case ((unichar)(0xa1)): case ((unichar)(0xa2)): case ((unichar)(0xa3)): case ((unichar)(0xa4)):
|
||||||
|
case ((unichar)(0xa5)): case ((unichar)(0xa6)): case ((unichar)(0xa7)): case ((unichar)(0xa8)):
|
||||||
|
case ((unichar)(0xa9)): case ((unichar)(0xaa)): case ((unichar)(0xab)): case ((unichar)(0xac)):
|
||||||
|
case ((unichar)(0xad)): case ((unichar)(0xae)): case ((unichar)(0xaf)): case ((unichar)(0xb0)):
|
||||||
|
case ((unichar)(0xb1)): case ((unichar)(0xb2)): case ((unichar)(0xb3)): case ((unichar)(0xb4)):
|
||||||
|
case ((unichar)(0xb5)): case ((unichar)(0xb6)): case ((unichar)(0xb7)): case ((unichar)(0xb8)):
|
||||||
|
case ((unichar)(0xb9)): case ((unichar)(0xba)): case ((unichar)(0xbb)): case ((unichar)(0xbc)):
|
||||||
|
case ((unichar)(0xbd)): case ((unichar)(0xbe)): case ((unichar)(0xbf)): case ((unichar)(0xc0)):
|
||||||
|
case ((unichar)(0xc1)): case ((unichar)(0xc2)): case ((unichar)(0xc3)): case ((unichar)(0xc4)):
|
||||||
|
case ((unichar)(0xc5)): case ((unichar)(0xc6)): case ((unichar)(0xc7)): case ((unichar)(0xc8)):
|
||||||
|
case ((unichar)(0xc9)): case ((unichar)(0xca)): case ((unichar)(0xcb)): case ((unichar)(0xcc)):
|
||||||
|
case ((unichar)(0xcd)): case ((unichar)(0xce)): case ((unichar)(0xcf)): case ((unichar)(0xd0)):
|
||||||
|
case ((unichar)(0xd1)): case ((unichar)(0xd2)): case ((unichar)(0xd3)): case ((unichar)(0xd4)):
|
||||||
|
case ((unichar)(0xd5)): case ((unichar)(0xd6)): case ((unichar)(0xd7)): case ((unichar)(0xd8)):
|
||||||
|
case ((unichar)(0xd9)): case ((unichar)(0xda)): case ((unichar)(0xdb)): case ((unichar)(0xdc)):
|
||||||
|
case ((unichar)(0xdd)): case ((unichar)(0xde)): case ((unichar)(0xdf)): case ((unichar)(0xe0)):
|
||||||
|
case ((unichar)(0xe1)): case ((unichar)(0xe2)): case ((unichar)(0xe3)): case ((unichar)(0xe4)):
|
||||||
|
case ((unichar)(0xe5)): case ((unichar)(0xe6)): case ((unichar)(0xe7)): case ((unichar)(0xe8)):
|
||||||
|
case ((unichar)(0xe9)): case ((unichar)(0xea)): case ((unichar)(0xeb)): case ((unichar)(0xec)):
|
||||||
|
case ((unichar)(0xed)): case ((unichar)(0xee)): case ((unichar)(0xef)): case ((unichar)(0xf0)):
|
||||||
|
case ((unichar)(0xf1)): case ((unichar)(0xf2)): case ((unichar)(0xf3)): case ((unichar)(0xf4)):
|
||||||
|
case ((unichar)(0xf5)): case ((unichar)(0xf6)): case ((unichar)(0xf7)): case ((unichar)(0xf8)):
|
||||||
|
case ((unichar)(0xf9)): case ((unichar)(0xfa)): case ((unichar)(0xfb)): case ((unichar)(0xfc)):
|
||||||
|
case ((unichar)(0xfd)): case ((unichar)(0xfe)): case ((unichar)(0xff)):
|
||||||
|
{
|
||||||
|
{
|
||||||
|
[self matchCharSet:GSWPageDefLexer___tokenSet_6];
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
goto _loop63;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (YES);
|
||||||
|
_loop63:;
|
||||||
|
}
|
||||||
|
[self matchCharacter:'"'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
@ -909,6 +1053,158 @@ int _begin=[text length];
|
||||||
//LOGObjectFnStop();
|
//LOGObjectFnStop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
-(void) mESCWithCreateToken:(BOOL)_createToken
|
||||||
|
{
|
||||||
|
ANTLRDefToken _token=nil;
|
||||||
|
int _begin=[text length];
|
||||||
|
ANTLRTokenType _ttype = GSWPageDefTokenType_ESC;
|
||||||
|
int _saveIndex;
|
||||||
|
|
||||||
|
//LOGObjectFnStart();
|
||||||
|
[self matchCharacter:'\\'];
|
||||||
|
{
|
||||||
|
switch ( [self LA:1])
|
||||||
|
{
|
||||||
|
case ((unichar)('n')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'n'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('r')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'r'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('t')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'t'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('b')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'b'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('f')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'f'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('"')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'"'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('\'')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'\''];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('\\')):
|
||||||
|
{
|
||||||
|
[self matchCharacter:'\\'];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('u')):
|
||||||
|
{
|
||||||
|
{
|
||||||
|
int _cnt72=0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
if (([self LA:1]==((unichar)('u'))))
|
||||||
|
{
|
||||||
|
[self matchCharacter:'u'];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if ( _cnt72>=1 ) { goto _loop72; } else {[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];}
|
||||||
|
}
|
||||||
|
|
||||||
|
_cnt72++;
|
||||||
|
} while (YES);
|
||||||
|
_loop72:;
|
||||||
|
}
|
||||||
|
[self mHEXDIGITWithCreateToken:NO];
|
||||||
|
[self mHEXDIGITWithCreateToken:NO];
|
||||||
|
[self mHEXDIGITWithCreateToken:NO];
|
||||||
|
[self mHEXDIGITWithCreateToken:NO];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
||||||
|
{
|
||||||
|
{
|
||||||
|
[self matchRange:'0' :'3'];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if ((([self LA:1] >= ((unichar)('0')) && [self LA:1] <= ((unichar)('9')))) && (([self LA:2] >= ((unichar)(0x3)) && [self LA:2] <= ((unichar)(0xff)))))
|
||||||
|
{
|
||||||
|
{
|
||||||
|
[self matchRange:'0' :'9'];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if ((([self LA:1] >= ((unichar)('0')) && [self LA:1] <= ((unichar)('9')))) && (([self LA:2] >= ((unichar)(0x3)) && [self LA:2] <= ((unichar)(0xff)))))
|
||||||
|
{
|
||||||
|
[self matchRange:'0' :'9'];
|
||||||
|
}
|
||||||
|
else if ((([self LA:1] >= ((unichar)(0x3)) && [self LA:1] <= ((unichar)(0xff)))))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((([self LA:1] >= ((unichar)(0x3)) && [self LA:1] <= ((unichar)(0xff)))))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
||||||
|
{
|
||||||
|
{
|
||||||
|
[self matchRange:'4' :'7'];
|
||||||
|
}
|
||||||
|
{
|
||||||
|
if ((([self LA:1] >= ((unichar)('0')) && [self LA:1] <= ((unichar)('9')))) && (([self LA:2] >= ((unichar)(0x3)) && [self LA:2] <= ((unichar)(0xff)))))
|
||||||
|
{
|
||||||
|
{
|
||||||
|
[self matchRange:'0' :'9'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if ((([self LA:1] >= ((unichar)(0x3)) && [self LA:1] <= ((unichar)(0xff)))))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
{
|
||||||
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if ( _createToken && _token==0 )
|
||||||
|
{
|
||||||
|
_token = [self makeToken:_ttype];
|
||||||
|
[_token setText:[text substringFromIndex:_begin]];
|
||||||
|
}
|
||||||
|
ASSIGN(_returnToken,_token);
|
||||||
|
//LOGObjectFnStop();
|
||||||
|
}
|
||||||
|
|
||||||
-(void) mINTWithCreateToken:(BOOL)_createToken
|
-(void) mINTWithCreateToken:(BOOL)_createToken
|
||||||
{
|
{
|
||||||
ANTLRDefToken _token=nil;
|
ANTLRDefToken _token=nil;
|
||||||
|
@ -918,7 +1214,7 @@ int _begin=[text length];
|
||||||
|
|
||||||
//LOGObjectFnStart();
|
//LOGObjectFnStart();
|
||||||
{
|
{
|
||||||
int _cnt65=0;
|
int _cnt67=0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if ((([self LA:1] >= ((unichar)('0')) && [self LA:1] <= ((unichar)('9')))))
|
if ((([self LA:1] >= ((unichar)('0')) && [self LA:1] <= ((unichar)('9')))))
|
||||||
|
@ -927,12 +1223,12 @@ int _begin=[text length];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( _cnt65>=1 ) { goto _loop65; } else {[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];}
|
if ( _cnt67>=1 ) { goto _loop67; } else {[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];}
|
||||||
}
|
}
|
||||||
|
|
||||||
_cnt65++;
|
_cnt67++;
|
||||||
} while (YES);
|
} while (YES);
|
||||||
_loop65:;
|
_loop67:;
|
||||||
}
|
}
|
||||||
if ( _createToken && _token==0 )
|
if ( _createToken && _token==0 )
|
||||||
{
|
{
|
||||||
|
@ -971,7 +1267,7 @@ int _begin=[text length];
|
||||||
|
|
||||||
//LOGObjectFnStart();
|
//LOGObjectFnStart();
|
||||||
{
|
{
|
||||||
int _cnt69=0;
|
int _cnt82=0;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
if (([GSWPageDefLexer___tokenSet_1 isMember:[self LA:1]]))
|
if (([GSWPageDefLexer___tokenSet_1 isMember:[self LA:1]]))
|
||||||
|
@ -980,12 +1276,12 @@ int _begin=[text length];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if ( _cnt69>=1 ) { goto _loop69; } else {[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];}
|
if ( _cnt82>=1 ) { goto _loop82; } else {[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];}
|
||||||
}
|
}
|
||||||
|
|
||||||
_cnt69++;
|
_cnt82++;
|
||||||
} while (YES);
|
} while (YES);
|
||||||
_loop69:;
|
_loop82:;
|
||||||
}
|
}
|
||||||
if ( _createToken && _token==0 )
|
if ( _createToken && _token==0 )
|
||||||
{
|
{
|
||||||
|
@ -1004,31 +1300,33 @@ int _begin=[text length];
|
||||||
int _saveIndex;
|
int _saveIndex;
|
||||||
|
|
||||||
//LOGObjectFnStart();
|
//LOGObjectFnStart();
|
||||||
switch ( [self LA:1])
|
|
||||||
{
|
{
|
||||||
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
switch ( [self LA:1])
|
||||||
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
{
|
||||||
case ((unichar)('8')): case ((unichar)('9')):
|
case ((unichar)('0')): case ((unichar)('1')): case ((unichar)('2')): case ((unichar)('3')):
|
||||||
{
|
case ((unichar)('4')): case ((unichar)('5')): case ((unichar)('6')): case ((unichar)('7')):
|
||||||
[self matchRange:'0' :'9'];
|
case ((unichar)('8')): case ((unichar)('9')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'0' :'9'];
|
||||||
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
break;
|
||||||
case ((unichar)('e')): case ((unichar)('f')):
|
}
|
||||||
{
|
case ((unichar)('A')): case ((unichar)('B')): case ((unichar)('C')): case ((unichar)('D')):
|
||||||
[self matchRange:'a' :'f'];
|
case ((unichar)('E')): case ((unichar)('F')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'A' :'F'];
|
||||||
case ((unichar)('A')): case ((unichar)('B')): case ((unichar)('C')): case ((unichar)('D')):
|
break;
|
||||||
case ((unichar)('E')): case ((unichar)('F')):
|
}
|
||||||
{
|
case ((unichar)('a')): case ((unichar)('b')): case ((unichar)('c')): case ((unichar)('d')):
|
||||||
[self matchRange:'A' :'F'];
|
case ((unichar)('e')): case ((unichar)('f')):
|
||||||
break;
|
{
|
||||||
}
|
[self matchRange:'a' :'f'];
|
||||||
default:
|
break;
|
||||||
{
|
}
|
||||||
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
default:
|
||||||
}
|
{
|
||||||
|
[ANTLRScannerException raiseWithReason:[NSString stringWithFormat:@"no viable alt for char: %@",[ANTLRCharScanner charName:[self LA:1]]] line:[self line]];
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if ( _createToken && _token==0 )
|
if ( _createToken && _token==0 )
|
||||||
{
|
{
|
||||||
|
@ -1068,9 +1366,9 @@ CONST unsigned long GSWPageDefLexer___tokenSet_3_data_[] = { 4294958072UL, 42949
|
||||||
static ANTLRBitSet* GSWPageDefLexer___tokenSet_3=nil;
|
static ANTLRBitSet* GSWPageDefLexer___tokenSet_3=nil;
|
||||||
CONST unsigned long GSWPageDefLexer___tokenSet_4_data_[] = { 4294958072UL, 4294966271UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
CONST unsigned long GSWPageDefLexer___tokenSet_4_data_[] = { 4294958072UL, 4294966271UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
||||||
static ANTLRBitSet* GSWPageDefLexer___tokenSet_4=nil;
|
static ANTLRBitSet* GSWPageDefLexer___tokenSet_4=nil;
|
||||||
CONST unsigned long GSWPageDefLexer___tokenSet_5_data_[] = { 4294967288UL, 4294967291UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
CONST unsigned long GSWPageDefLexer___tokenSet_5_data_[] = { 4294967288UL, 4294967167UL, 4026531839UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
||||||
static ANTLRBitSet* GSWPageDefLexer___tokenSet_5=nil;
|
static ANTLRBitSet* GSWPageDefLexer___tokenSet_5=nil;
|
||||||
CONST unsigned long GSWPageDefLexer___tokenSet_6_data_[] = { 4294967288UL, 4294967167UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
CONST unsigned long GSWPageDefLexer___tokenSet_6_data_[] = { 4294967288UL, 4294967291UL, 4026531839UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 4294967295UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL, 0UL };
|
||||||
static ANTLRBitSet* GSWPageDefLexer___tokenSet_6=nil;
|
static ANTLRBitSet* GSWPageDefLexer___tokenSet_6=nil;
|
||||||
+(void)initialize
|
+(void)initialize
|
||||||
{
|
{
|
||||||
|
|
|
@ -205,7 +205,7 @@
|
||||||
[astFactory addASTChild:includeObj_AST in:currentAST];
|
[astFactory addASTChild:includeObj_AST in:currentAST];
|
||||||
}
|
}
|
||||||
[self matchTokenType:GSWPageDefTokenType_STRING];
|
[self matchTokenType:GSWPageDefTokenType_STRING];
|
||||||
[includes addObject:[[[includeObj text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]];
|
[includes addObject:[self unescapedString:[[[includeObj text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]]];
|
||||||
include_AST = [currentAST root];
|
include_AST = [currentAST root];
|
||||||
}
|
}
|
||||||
NS_HANDLER
|
NS_HANDLER
|
||||||
|
@ -468,7 +468,7 @@
|
||||||
[astFactory addASTChild:assocConstantString_AST in:currentAST];
|
[astFactory addASTChild:assocConstantString_AST in:currentAST];
|
||||||
}
|
}
|
||||||
[self matchTokenType:GSWPageDefTokenType_STRING];
|
[self matchTokenType:GSWPageDefTokenType_STRING];
|
||||||
{ GSWAssociation* assoc=[GSWAssociation associationWithValue:[[[assocConstantString text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]];
|
{ GSWAssociation* assoc=[GSWAssociation associationWithValue:[self unescapedString:[[[assocConstantString text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]]];
|
||||||
ASSIGN(currentAssociation,assoc); };
|
ASSIGN(currentAssociation,assoc); };
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -611,6 +611,7 @@ static CONST NSString* GSWPageDefParser___tokenNames[] = {
|
||||||
@"SL_COMMENT",
|
@"SL_COMMENT",
|
||||||
@"ML_COMMENT",
|
@"ML_COMMENT",
|
||||||
@"POINT",
|
@"POINT",
|
||||||
|
@"ESC",
|
||||||
@"HEXINT",
|
@"HEXINT",
|
||||||
@"DIGIT",
|
@"DIGIT",
|
||||||
@"HEXDIGIT",
|
@"HEXDIGIT",
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
-(BOOL)isWarning;
|
-(BOOL)isWarning;
|
||||||
-(NSArray*)errors;
|
-(NSArray*)errors;
|
||||||
-(NSArray*)warnings;
|
-(NSArray*)warnings;
|
||||||
|
-(NSString*)unescapedString:(NSString*)string_;
|
||||||
@end
|
@end
|
||||||
|
|
||||||
#endif //_GSWPageDefParserExt_h__
|
#endif //_GSWPageDefParserExt_h__
|
||||||
|
|
|
@ -114,6 +114,27 @@ static char rcsId[] = "$Id$";
|
||||||
return warnings;
|
return warnings;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------
|
||||||
|
-(NSString*)unescapedString:(NSString*)string_
|
||||||
|
{
|
||||||
|
//TODO
|
||||||
|
string_=[string_ stringByReplacingString:@"\\n"
|
||||||
|
withString:@"\n"];
|
||||||
|
string_=[string_ stringByReplacingString:@"\\r"
|
||||||
|
withString:@"\r"];
|
||||||
|
string_=[string_ stringByReplacingString:@"\\t"
|
||||||
|
withString:@"\t"];
|
||||||
|
string_=[string_ stringByReplacingString:@"\\b"
|
||||||
|
withString:@"\b"];
|
||||||
|
string_=[string_ stringByReplacingString:@"\\f"
|
||||||
|
withString:@"\f"];
|
||||||
|
string_=[string_ stringByReplacingString:@"\\\""
|
||||||
|
withString:@"\""];
|
||||||
|
string_=[string_ stringByReplacingString:@"\\\'"
|
||||||
|
withString:@"\'"];
|
||||||
|
return string_;
|
||||||
|
};
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,10 +35,11 @@ enum GSWPageDefTokenTypes {
|
||||||
GSWPageDefTokenType_SL_COMMENT = 20,
|
GSWPageDefTokenType_SL_COMMENT = 20,
|
||||||
GSWPageDefTokenType_ML_COMMENT = 21,
|
GSWPageDefTokenType_ML_COMMENT = 21,
|
||||||
GSWPageDefTokenType_POINT = 22,
|
GSWPageDefTokenType_POINT = 22,
|
||||||
GSWPageDefTokenType_HEXINT = 23,
|
GSWPageDefTokenType_ESC = 23,
|
||||||
GSWPageDefTokenType_DIGIT = 24,
|
GSWPageDefTokenType_HEXINT = 24,
|
||||||
GSWPageDefTokenType_HEXDIGIT = 25,
|
GSWPageDefTokenType_DIGIT = 25,
|
||||||
GSWPageDefTokenType_LCLETTER = 26,
|
GSWPageDefTokenType_HEXDIGIT = 26,
|
||||||
GSWPageDefTokenType_LETTER = 27,
|
GSWPageDefTokenType_LCLETTER = 27,
|
||||||
|
GSWPageDefTokenType_LETTER = 28,
|
||||||
};
|
};
|
||||||
#endif /*INC_GSWPageDefTokenTypes_h_*/
|
#endif /*INC_GSWPageDefTokenTypes_h_*/
|
||||||
|
|
|
@ -18,8 +18,9 @@ PIDENT=19
|
||||||
SL_COMMENT=20
|
SL_COMMENT=20
|
||||||
ML_COMMENT=21
|
ML_COMMENT=21
|
||||||
POINT=22
|
POINT=22
|
||||||
HEXINT=23
|
ESC=23
|
||||||
DIGIT=24
|
HEXINT=24
|
||||||
HEXDIGIT=25
|
DIGIT=25
|
||||||
LCLETTER=26
|
HEXDIGIT=26
|
||||||
LETTER=27
|
LCLETTER=27
|
||||||
|
LETTER=28
|
||||||
|
|
|
@ -103,6 +103,7 @@ static char rcsId[] = "$Id$";
|
||||||
{
|
{
|
||||||
GSWAssertCorrectElementID(context_);// Debug Only
|
GSWAssertCorrectElementID(context_);// Debug Only
|
||||||
_disabled=[self disabledInContext:context_];
|
_disabled=[self disabledInContext:context_];
|
||||||
|
NSDebugMLLog(@"gswdync",@"_disabled=%s",(_disabled ? "YES" : "NO"));
|
||||||
if (!_disabled)
|
if (!_disabled)
|
||||||
{
|
{
|
||||||
BOOL _wasFormSubmitted=[context_ _wasFormSubmitted];
|
BOOL _wasFormSubmitted=[context_ _wasFormSubmitted];
|
||||||
|
@ -132,6 +133,7 @@ static char rcsId[] = "$Id$";
|
||||||
[context_ _setActionInvoked:1];
|
[context_ _setActionInvoked:1];
|
||||||
NS_DURING
|
NS_DURING
|
||||||
{
|
{
|
||||||
|
NSDebugMLLog(@"gswdync",@"Invoked Object Found: action=%@",action);
|
||||||
_actionValue=[action valueInComponent:_component];
|
_actionValue=[action valueInComponent:_component];
|
||||||
}
|
}
|
||||||
NS_HANDLER
|
NS_HANDLER
|
||||||
|
|
|
@ -43,10 +43,10 @@ document
|
||||||
: ((object { [elements setObject:currentElement forKey:[currentElement elementName]]; } )
|
: ((object { [elements setObject:currentElement forKey:[currentElement elementName]]; } )
|
||||||
| (include))+
|
| (include))+
|
||||||
;
|
;
|
||||||
|
//TODO unescapedString
|
||||||
include:
|
include:
|
||||||
(INCLUDE (WS)*)
|
(INCLUDE (WS)*)
|
||||||
includeObj:STRING { [includes addObject:[[[includeObj text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]]; }
|
includeObj:STRING { [includes addObject:[self unescapedString:[[[includeObj text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]]]; }
|
||||||
;
|
;
|
||||||
|
|
||||||
object:
|
object:
|
||||||
|
@ -71,6 +71,7 @@ member:
|
||||||
(SEMI)*!
|
(SEMI)*!
|
||||||
;
|
;
|
||||||
|
|
||||||
|
//TODO unescapedString
|
||||||
mvalue:
|
mvalue:
|
||||||
( assocKeyPath:idref
|
( assocKeyPath:idref
|
||||||
{ { GSWAssociation* assoc=[GSWAssociation associationWithKeyPath:[assocKeyPath_AST toStringListWithSiblingSeparator:@"" openSeparator:@"" closeSeparator:@""]];
|
{ { GSWAssociation* assoc=[GSWAssociation associationWithKeyPath:[assocKeyPath_AST toStringListWithSiblingSeparator:@"" openSeparator:@"" closeSeparator:@""]];
|
||||||
|
@ -85,7 +86,7 @@ mvalue:
|
||||||
{ { GSWAssociation* assoc=[GSWAssociation associationWithValue:[NSNumber numberWithBool:NO]];
|
{ { GSWAssociation* assoc=[GSWAssociation associationWithValue:[NSNumber numberWithBool:NO]];
|
||||||
ASSIGN(currentAssociation,assoc); }; }
|
ASSIGN(currentAssociation,assoc); }; }
|
||||||
| assocConstantString:STRING
|
| assocConstantString:STRING
|
||||||
{ { GSWAssociation* assoc=[GSWAssociation associationWithValue:[[[assocConstantString text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]];
|
{ { GSWAssociation* assoc=[GSWAssociation associationWithValue:[self unescapedString:[[[assocConstantString text] stringWithoutPrefix:@"\""] stringWithoutSuffix:@"\""]]];
|
||||||
ASSIGN(currentAssociation,assoc); }; }
|
ASSIGN(currentAssociation,assoc); }; }
|
||||||
| assocConstantHexNum:HEXNUM
|
| assocConstantHexNum:HEXNUM
|
||||||
{ { GSWAssociation* assoc=[GSWAssociation associationWithValue:[NSNumber valueFromString:[assocConstantHexNum text]]];
|
{ { GSWAssociation* assoc=[GSWAssociation associationWithValue:[NSNumber valueFromString:[assocConstantHexNum text]]];
|
||||||
|
@ -195,8 +196,10 @@ WS:
|
||||||
;
|
;
|
||||||
|
|
||||||
STRING
|
STRING
|
||||||
: '"' (~'"')* '"'
|
// : '"' (~'"')* '"'
|
||||||
| '\'' (~'\'')* '\''
|
// | '\'' (~'\'')* '\''
|
||||||
|
: '\'' ( ESC |~('\''|'\\'))* '\''
|
||||||
|
| '"' ( ESC |~('"'|'\\'))* '"'
|
||||||
;
|
;
|
||||||
|
|
||||||
POINT: '.';
|
POINT: '.';
|
||||||
|
@ -208,6 +211,48 @@ HEXNUM
|
||||||
: '#' HEXINT
|
: '#' HEXINT
|
||||||
;
|
;
|
||||||
|
|
||||||
|
// escape sequence -- note that this is protected; it can only be called
|
||||||
|
// from another lexer rule -- it will not ever directly return a token to
|
||||||
|
// the parser
|
||||||
|
// There are various ambiguities hushed in this rule. The optional
|
||||||
|
// '0'...'9' digit matches should be matched here rather than letting
|
||||||
|
// them go back to STRING_LITERAL to be matched. ANTLR does the
|
||||||
|
// right thing by matching immediately; hence, it's ok to shut off
|
||||||
|
// the FOLLOW ambig warnings.
|
||||||
|
protected
|
||||||
|
ESC
|
||||||
|
: '\\'
|
||||||
|
( 'n'
|
||||||
|
| 'r'
|
||||||
|
| 't'
|
||||||
|
| 'b'
|
||||||
|
| 'f'
|
||||||
|
| '"'
|
||||||
|
| '\''
|
||||||
|
| '\\'
|
||||||
|
| ('u')+ HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT
|
||||||
|
| ('0'..'3')
|
||||||
|
(
|
||||||
|
options {
|
||||||
|
warnWhenFollowAmbig = false;
|
||||||
|
}
|
||||||
|
: ('0'..'9')
|
||||||
|
(
|
||||||
|
options {
|
||||||
|
warnWhenFollowAmbig = false;
|
||||||
|
}
|
||||||
|
: '0'..'9'
|
||||||
|
)?
|
||||||
|
)?
|
||||||
|
| ('4'..'7')
|
||||||
|
(
|
||||||
|
options {
|
||||||
|
warnWhenFollowAmbig = false;
|
||||||
|
}
|
||||||
|
: ('0'..'9')
|
||||||
|
)?
|
||||||
|
)
|
||||||
|
;
|
||||||
protected
|
protected
|
||||||
HEXINT
|
HEXINT
|
||||||
: (
|
: (
|
||||||
|
@ -232,9 +277,7 @@ DIGIT
|
||||||
|
|
||||||
protected
|
protected
|
||||||
HEXDIGIT
|
HEXDIGIT
|
||||||
: '0'..'9'
|
: ('0'..'9'|'A'..'F'|'a'..'f')
|
||||||
| 'a'..'f'
|
|
||||||
| 'A'..'F'
|
|
||||||
;
|
;
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
|
@ -287,9 +287,7 @@ DIGIT
|
||||||
|
|
||||||
protected
|
protected
|
||||||
HEXDIGIT
|
HEXDIGIT
|
||||||
: '0'..'9'
|
: ('0'..'9'|'A'..'F'|'a'..'f')
|
||||||
| 'a'..'f'
|
|
||||||
| 'A'..'F'
|
|
||||||
;
|
;
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
|
@ -127,8 +127,7 @@ DIGIT
|
||||||
|
|
||||||
protected
|
protected
|
||||||
HEXDIGIT
|
HEXDIGIT
|
||||||
: '0'..'9'
|
: ('0'..'9'|'A'..'F'|'a'..'f')
|
||||||
| 'a'..'f'
|
|
||||||
;
|
;
|
||||||
|
|
||||||
protected
|
protected
|
||||||
|
|
83
INSTALL
83
INSTALL
|
@ -13,64 +13,85 @@ GNUstep core and db libraries, GSWAdaptor and Apache
|
||||||
Please download last up to date cvs version of GNUstep (some bugs
|
Please download last up to date cvs version of GNUstep (some bugs
|
||||||
have been corrected).
|
have been corrected).
|
||||||
|
|
||||||
|
Remark: We suppose that the GNUstep folder is on /usr/GNUstep, please check all the paths below with your configuration
|
||||||
|
|
||||||
Installing `gsweb'
|
Installing `gsweb'
|
||||||
====================
|
====================
|
||||||
|
|
||||||
Libraries:
|
Libraries requiered :
|
||||||
gsantlr/ GSANTLR (Parser classes,...)
|
---------------------
|
||||||
gsgd/ Objective-C/GD Interface
|
|
||||||
core/ GNUstep core
|
|
||||||
db/ GNUstep database
|
|
||||||
extensions/ Extensions
|
|
||||||
GNUstepWeb/ GNUstepWeb Root
|
|
||||||
GNUstepWeb/GSWeb.framework GNUstepWeb Main Part
|
|
||||||
|
|
||||||
GNUstepWeb/GSWExtensions.framework GNUstepWeb 'standard' Extensions
|
gsantlr/ GSANTLR (Parser classes,...)
|
||||||
|
gsgd/ Objective-C/GD Interface
|
||||||
|
core/ GNUstep core
|
||||||
|
db/ GNUstep database
|
||||||
|
extensions/ Extensions
|
||||||
|
You also need NGReflection
|
||||||
|
|
||||||
GNUstepWeb/GSWExtensionsGSW.framework GNUstepWeb Extensions
|
The GNUStepWeb package:
|
||||||
|
-----------------------
|
||||||
|
* GNUstepWeb/ -----> GNUstepWeb Root
|
||||||
|
* GNUstepWeb/GSWeb.framework -----> GNUstepWeb Main Part
|
||||||
|
* GNUstepWeb/GSWExtensions.framework -----> GNUstepWeb 'standard' Extensions
|
||||||
|
* GNUstepWeb/GSWExtensionsGSW.framework -----> GNUstepWeb Extensions
|
||||||
|
|
||||||
|
|
||||||
You also need NGReflection
|
|
||||||
|
|
||||||
Compilation Order:
|
Compilation Order:
|
||||||
|
------------------
|
||||||
|
|
||||||
1) core
|
1) core
|
||||||
|
After the compilation ok, and the 'make install', copy core/base/Sources/md5.h on your GNUstep's Header folder:
|
||||||
|
/usr/GNUstep/Headers/gnustep/base/md5.h
|
||||||
|
|
||||||
2) extensions
|
2) extensions
|
||||||
|
It adds the Header exceptions folders (both in Foundation an extensions)
|
||||||
|
|
||||||
3) db
|
3) db
|
||||||
4) gsantlr
|
4) gsantlr
|
||||||
5) gsgd
|
5) the 'gd' libraries. You must have a /usr/include/gd.h file. If not take sources on http://www.boutell.com/gd
|
||||||
6) MNGReflection (ftp://ftp.gnustep.org/pub/gnustep/contrib/MOF2-fd-1999-11-03.tgz)
|
Extract and compile
|
||||||
7) GNUstepWeb
|
|
||||||
|
|
||||||
|
6) gsgd
|
||||||
|
7) NGReflection
|
||||||
|
you can find it on ftp://ftp.gnustep.org/pub/gnustep/contrib/MOF2-fd-1999-11-03.tgz.
|
||||||
|
Remark that this archive contains many extension. GNUstepWeb only needs the Reflections objects.
|
||||||
|
So after the untar, go to MOF2/Foundation/NGReflection. Type make, them make install.
|
||||||
|
You can install the others but some are not in phase with GNUstep present libraries.
|
||||||
|
|
||||||
|
8) GNUstepWeb
|
||||||
|
Go in the GNUStepWeb folder. make and make install.
|
||||||
|
|
||||||
|
9) Apaches modules for GNUStepWeb
|
||||||
|
Still in the GNUStepWeb folder there is a GSWAdaptors/Apache folder, go in and make. There no make install. Instead You must copy the mod_gsweb.so module in you Apache libexec directory (something like usr/apache/libexec).
|
||||||
|
|
||||||
|
At this point everything is done, still remains the Apache configuration:
|
||||||
|
|
||||||
You have to export the following env var:
|
You have to export the following env var:
|
||||||
export GNUSTEP_STRING_ENCODING=NSISOLatin1StringEncoding
|
export GNUSTEP_STRING_ENCODING=NSISOLatin1StringEncoding
|
||||||
|
|
||||||
|
Configurating Apache:
|
||||||
|
=====================
|
||||||
|
|
||||||
GNUstepWeb Apache Adaptor:
|
In Apache httpd.conf file, add thoses lines:
|
||||||
Goto GNUstepWeb/GSWAdaptors/Apache/
|
|
||||||
Do make
|
|
||||||
Copy mod_gsweb.so into libexec directory of Apache
|
|
||||||
|
|
||||||
|
|
||||||
Add in Apache httpd.conf file
|
|
||||||
LoadModule GSWeb_Module libexec/mod_gsweb.so
|
LoadModule GSWeb_Module libexec/mod_gsweb.so
|
||||||
AddModule mod_gsweb.c
|
AddModule mod_gsweb.c
|
||||||
|
|
||||||
|
|
||||||
Add the following lines for a virtual host (or all hosts)
|
If you use virtual hosts (Apache in localhost doiues not requiered them), add the following lines:
|
||||||
|
|
||||||
<Location /GSWeb*>
|
<Location /GSWeb*>
|
||||||
SetHandler GSWeb
|
SetHandler GSWeb
|
||||||
</Location>
|
</Location>
|
||||||
<Location /GSWeb/xyzzy>
|
|
||||||
order deny,allow
|
|
||||||
#deny from all
|
|
||||||
allow from all
|
|
||||||
</Location>
|
|
||||||
|
|
||||||
|
Next if /etc/httpd/conf folders does not exist, you have to create them.
|
||||||
|
In this folder create an file file named gsweb-log (that will be GNUStepWeb reports file)
|
||||||
|
Then, create the file /etc/httpd/conf/gsweb.conf which contains parameters for GNUstepWeb Applications:
|
||||||
|
|
||||||
Next, create the file /etc/httpd/conf/gsweb.conf which will countain parameters for GNUstepWeb Applications
|
The format is(there is an example for values below):
|
||||||
|
|
||||||
The format is:
|
The format is (there is an example for values below):
|
||||||
{
|
{
|
||||||
applications= {
|
applications= {
|
||||||
ApplicationName = {
|
ApplicationName = {
|
||||||
|
@ -89,14 +110,14 @@ The format is:
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
exemple:
|
exemple values for a localhost use:
|
||||||
{
|
{
|
||||||
applications= {
|
applications= {
|
||||||
MyApp = {
|
MyApp = {
|
||||||
instances = (
|
instances = (
|
||||||
{
|
{
|
||||||
instanceNum= 1;
|
instanceNum= 1;
|
||||||
host= 200.13.12.48;
|
host= 127.0.0.1;
|
||||||
port= 9001;
|
port= 9001;
|
||||||
parameters= {
|
parameters= {
|
||||||
transport= socket;
|
transport= socket;
|
||||||
|
|
9
README
9
README
|
@ -18,8 +18,7 @@ Initial reading
|
||||||
How can you help?
|
How can you help?
|
||||||
=================
|
=================
|
||||||
|
|
||||||
* Provide feedback on the already written code (I'm not yet an
|
* Provide feedback on the already written code (some parts may be badly
|
||||||
expert in ObjC, GNUstep and WO, so some parts may be badly
|
|
||||||
coded or concepts may be misunderstood)
|
coded or concepts may be misunderstood)
|
||||||
|
|
||||||
* Check the TODO file and write GSWDynamicElements
|
* Check the TODO file and write GSWDynamicElements
|
||||||
|
@ -42,6 +41,12 @@ Special Thanks
|
||||||
explanation of some WO concepts and dark WO documentation.
|
explanation of some WO concepts and dark WO documentation.
|
||||||
I hope we'll work together someday :-)
|
I hope we'll work together someday :-)
|
||||||
|
|
||||||
|
* Mirko Viviani <mirko.viviani@rccr.cremona.it> for testing and
|
||||||
|
documenting GNUstepWeb
|
||||||
|
|
||||||
|
* Jocelyn Richard <bille2@free.fr> for testing and
|
||||||
|
documenting GNUstepWeb
|
||||||
|
|
||||||
* Catherine Biscourp <cbiscourp@sbuilders.com> for the
|
* Catherine Biscourp <cbiscourp@sbuilders.com> for the
|
||||||
GNUstepWeb logos and some other things...
|
GNUstepWeb logos and some other things...
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue