*** 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:
mguesdon 2000-03-16 16:16:49 +00:00
parent b45dc89478
commit b13501c8e3
62 changed files with 3645 additions and 1770 deletions

View file

@ -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.

View 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)

View file

@ -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
}; };

View 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
View 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;
};

View 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__

View file

@ -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__

View file

@ -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)

View file

@ -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)

View file

@ -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;
};

View file

@ -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

View file

@ -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__

View file

@ -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;
};

View file

@ -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

View file

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

View file

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

View file

@ -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
} }

View file

@ -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;
}; };

View file

@ -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
} }

View file

@ -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;
}; };

View file

@ -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

View 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;
};

View 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__

View file

@ -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);
};
};
};
};

View file

@ -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

View 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);
};

View 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__

View file

@ -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];

View file

@ -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

View file

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

View file

@ -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

View file

@ -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 $<

View file

@ -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

View file

@ -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);

View file

@ -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 \

View file

@ -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

View file

@ -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>

View file

@ -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

View file

@ -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>

View file

@ -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

View file

@ -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

View file

@ -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;
}; };

View file

@ -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])
{ {

View file

@ -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

View file

@ -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];

View file

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

View file

@ -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
{ {

View file

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

View file

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

View file

@ -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
{ {

View file

@ -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",

View file

@ -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__

View file

@ -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

View file

@ -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_*/

View file

@ -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

View file

@ -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

View file

@ -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

View file

@ -287,9 +287,7 @@ DIGIT
protected protected
HEXDIGIT HEXDIGIT
: '0'..'9' : ('0'..'9'|'A'..'F'|'a'..'f')
| 'a'..'f'
| 'A'..'F'
; ;
protected protected

View file

@ -127,8 +127,7 @@ DIGIT
protected protected
HEXDIGIT HEXDIGIT
: '0'..'9' : ('0'..'9'|'A'..'F'|'a'..'f')
| 'a'..'f'
; ;
protected protected

83
INSTALL
View file

@ -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
View file

@ -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...