mirror of
https://github.com/gnustep/libs-gsweb.git
synced 2025-02-23 03:31:16 +00:00
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@5815 72102866-910b-0410-8b05-ffd578937521
310 lines
11 KiB
C
310 lines
11 KiB
C
/* GSWURLUtil.c - GSWeb: Adaptors: URL Utils
|
|
Copyright (C) 1999 Free Software Foundation, Inc.
|
|
|
|
Written by: Manuel Guesdon <mguesdon@sbuilders.com>
|
|
Date: Jully 1999
|
|
|
|
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.
|
|
*/
|
|
|
|
//<PREFIX>/<APPLICATION-NAME>[ApplicationSuffix[/<APPLICATION-NUMBER>][/<REQUEST-HANDLER-KEY>[/<REQUEST-HANDLER-PATH>]]][?<QUERY-STRING>]
|
|
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#include "config.h"
|
|
#include "GSWUtil.h"
|
|
#include "GSWDict.h"
|
|
#include "GSWConfig.h"
|
|
#include "GSWURLUtil.h"
|
|
|
|
GSWURLError GSWParseURL(GSWURLComponents* p_pURLComponents,CONST char* p_pszURL)
|
|
{
|
|
GSWURLError eError=GSWURLError_OK;
|
|
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
|
GSWURLComponent* pURLCVersion=&p_pURLComponents->stVersion;
|
|
GSWURLComponent* pURLCAppName=&p_pURLComponents->stAppName;
|
|
GSWURLComponent* pURLCAppNum=&p_pURLComponents->stAppNumber;
|
|
GSWURLComponent* pURLCReqHandlerKey=&p_pURLComponents->stRequestHandlerKey;
|
|
GSWURLComponent* pURLCReqHandlerPath=&p_pURLComponents->stRequestHandlerPath;
|
|
GSWURLComponent* pURLCQueryString=&p_pURLComponents->stQueryString;
|
|
int iURLLen=p_pszURL ? strlen(p_pszURL) : 0;
|
|
CONST char* pszStart=pszStart = (p_pszURL ? p_pszURL : "");
|
|
CONST char *pszStop=NULL;
|
|
CONST char *pszNext=NULL;
|
|
CONST char* pszPrefix=NULL;
|
|
CONST char *pszS=NULL;
|
|
CONST char* pszURLEnd=p_pszURL+iURLLen;
|
|
CONST char* pszQueryStringMark=strchr(pszStart,'?');
|
|
CONST char* pszTmpStop=(pszQueryStringMark && pszQueryStringMark<pszURLEnd) ? pszQueryStringMark : pszURLEnd;
|
|
int i, j;
|
|
memset(p_pURLComponents,0,sizeof(GSWURLComponents));
|
|
|
|
// First, get URL prefix
|
|
pszPrefix=strcasestr(pszStart,g_szGSWeb_Prefix);
|
|
if (pszPrefix && pszQueryStringMark && pszQueryStringMark<=pszPrefix)
|
|
pszPrefix=NULL;
|
|
|
|
if (pszPrefix)
|
|
{
|
|
CONST char* pszAppExtension=NULL;
|
|
pszStop=pszPrefix+strlen(g_szGSWeb_Prefix);
|
|
pszNext=*pszStop ? pszStop+1 : pszStop; // Drop the trailing /
|
|
pURLCPrefix->pszStart = pszPrefix;
|
|
pURLCPrefix->iLength = pszStop-pszStart;
|
|
pURLCPrefix->iLength = max(pURLCPrefix->iLength,0);
|
|
pURLCVersion->pszStart = g_szGSWeb_AdaptorVersion;
|
|
pURLCVersion->iLength = strlen(g_szGSWeb_AdaptorVersion);
|
|
|
|
// Get Application Name
|
|
pszStart=pszNext;
|
|
pszAppExtension=strcasestr(pszStart,g_szGSWeb_AppExtention);
|
|
if (pszAppExtension)
|
|
{
|
|
if (pszQueryStringMark && pszQueryStringMark<=pszAppExtension)
|
|
{
|
|
pszAppExtension=NULL;
|
|
pszStop=pszURLEnd;
|
|
pszNext=pszStop;
|
|
}
|
|
else
|
|
{
|
|
pszStop=pszAppExtension;
|
|
pszNext=pszStop+strlen(g_szGSWeb_AppExtention);
|
|
};
|
|
}
|
|
else
|
|
{
|
|
pszStop=strchr(pszStart,'/');
|
|
if (pszStop && pszQueryStringMark && pszQueryStringMark<=pszStop)
|
|
pszStop=pszQueryStringMark-1;
|
|
if (pszStop)
|
|
pszNext=pszStop+1;
|
|
else
|
|
{
|
|
pszStop=pszTmpStop;
|
|
pszNext=NULL;
|
|
};
|
|
};
|
|
pURLCAppName->pszStart = pszStart;
|
|
pURLCAppName->iLength = pszStop-pszStart;
|
|
pURLCAppName->iLength = max(pURLCAppName->iLength,0);
|
|
// Drop trailing slashes
|
|
while(pURLCAppName->iLength && pURLCAppName->pszStart[pURLCAppName->iLength-1]== '/')
|
|
pURLCAppName->iLength--;
|
|
pURLCAppName->iLength = max(pURLCAppName->iLength,0);
|
|
|
|
// Get Instance Number
|
|
pszStart = pszNext;
|
|
if (!pszStart)
|
|
{
|
|
pURLCAppNum->pszStart="";
|
|
pURLCAppNum->iLength=0;
|
|
}
|
|
else
|
|
{
|
|
// Skip slashes
|
|
while(*pszStart=='/')
|
|
pszStart++;
|
|
|
|
// Find
|
|
for (pszS=pszStart;pszS<pszTmpStop && *pszS!='/';pszS++);
|
|
pszStop= pszS;
|
|
pszNext=(pszStop<pszTmpStop) ? pszStop+1 : pszStop;
|
|
pURLCAppNum->pszStart = pszStart;
|
|
pURLCAppNum->iLength = pszStop-pszStart;
|
|
pURLCAppNum->iLength = max(pURLCAppNum->iLength,0);
|
|
|
|
// -1 case ?
|
|
if (!(pURLCAppNum->iLength==2
|
|
&& pURLCAppNum->pszStart[0]=='-'
|
|
&& pURLCAppNum->pszStart[1]=='1'))
|
|
{
|
|
// Test if alldigits
|
|
for (pszS=pszStart;pszS<pszStop && isdigit(*pszS);pszS++);
|
|
|
|
if (pszS!=pszStop)
|
|
{
|
|
// not all digits, so it's the request handler key !
|
|
pURLCReqHandlerKey->pszStart = pURLCAppNum->pszStart;
|
|
pURLCReqHandlerKey->iLength = pURLCAppNum->iLength;
|
|
pURLCReqHandlerKey->iLength = max(pURLCReqHandlerKey->iLength,0);
|
|
pURLCAppNum->pszStart="";
|
|
pURLCAppNum->iLength=0;
|
|
}
|
|
else
|
|
{
|
|
pszStart=pszNext;
|
|
// Skip slashes
|
|
while(*pszStart=='/')
|
|
pszStart++;
|
|
|
|
for (pszS=pszStart;pszS<pszTmpStop && *pszS!='/';pszS++);
|
|
pszStop = pszS;
|
|
pURLCReqHandlerKey->pszStart = pszStart;
|
|
pURLCReqHandlerKey->iLength = pszStop-pszStart;
|
|
pURLCReqHandlerKey->iLength = max(pURLCReqHandlerKey->iLength,0);
|
|
pszNext=(pszStop<pszTmpStop) ? pszStop+1 : pszStop;
|
|
};
|
|
};
|
|
// Get Request Handler Path
|
|
pszStart = pszNext;
|
|
for (pszS=pszStart;pszS<pszTmpStop;pszS++);
|
|
pszStop = pszS;
|
|
pURLCReqHandlerPath->pszStart = pszStart;
|
|
pURLCReqHandlerPath->iLength = pszStop-pszStart;
|
|
pURLCReqHandlerPath->iLength = max(pURLCReqHandlerPath->iLength,0);
|
|
pszNext=(pszStop<pszTmpStop) ? pszStop+1 : pszStop;
|
|
pszStart=pszNext;
|
|
};
|
|
// Query String
|
|
if (!pszStart)
|
|
pszStart=pszTmpStop;
|
|
pURLCQueryString->pszStart = pszStart;
|
|
pURLCQueryString->iLength = pszURLEnd - pszStart;
|
|
pURLCQueryString->iLength = max(pURLCQueryString->iLength,0);
|
|
};
|
|
if (!pURLCPrefix->pszStart || pURLCPrefix->iLength<=0)
|
|
{
|
|
eError=GSWURLError_InvalidPrefix;
|
|
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidPrefix");
|
|
}
|
|
else if (!pURLCAppName->pszStart || pURLCAppName->iLength<=0)
|
|
{
|
|
eError=GSWURLError_InvalidAppName;
|
|
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidAppName");
|
|
}
|
|
else if (!pURLCAppNum->pszStart)
|
|
{
|
|
eError=GSWURLError_InvalidAppNumber;
|
|
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidAppNumber");
|
|
}
|
|
else if ((!pURLCReqHandlerKey->pszStart || pURLCReqHandlerKey->iLength<=0)
|
|
&& pURLCReqHandlerPath->iLength>0)
|
|
{
|
|
eError=GSWURLError_InvalidRequestHandlerKey;
|
|
GSWLog(GSW_ERROR,NULL,"ParseURL GSWURLError_InvalidRequestHandlerKey");
|
|
}
|
|
/*
|
|
else if (!pURLCReqHandlerPath->pszStart || pURLCReqHandlerPath->iLength<=0)
|
|
eError=GSWURLError_InvalidRequestHandlerPath;
|
|
else if (!pURLCQueryString->pszStart || pURLCQueryString->iLength<=0)
|
|
eError=GSWURLError_InvalidQueryString;
|
|
*/
|
|
GSWLog(GSW_INFO,NULL,"End ParseURL eError=%d",eError);
|
|
return eError;
|
|
};
|
|
|
|
void GSWComposeURL(char* p_pszURL,GSWURLComponents* p_pURLComponents)
|
|
{
|
|
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
|
GSWURLComponent* pURLCAppName=&p_pURLComponents->stAppName;
|
|
GSWURLComponent* pURLCAppNum=&p_pURLComponents->stAppNumber;
|
|
GSWURLComponent* pURLCReqHandlerKey=&p_pURLComponents->stRequestHandlerKey;
|
|
GSWURLComponent* pURLCReqHandlerPath=&p_pURLComponents->stRequestHandlerPath;
|
|
GSWURLComponent* pURLCQueryString=&p_pURLComponents->stQueryString;
|
|
|
|
strncpy(p_pszURL,pURLCPrefix->pszStart, pURLCPrefix->iLength);
|
|
p_pszURL+=pURLCPrefix->iLength;
|
|
|
|
*p_pszURL++='/';
|
|
strncpy(p_pszURL, pURLCAppName->pszStart, pURLCAppName->iLength);
|
|
p_pszURL+= pURLCAppName->iLength;
|
|
strcpy(p_pszURL,g_szGSWeb_AppExtention);
|
|
p_pszURL+=strlen(g_szGSWeb_AppExtention);
|
|
|
|
if (pURLCAppNum->iLength>0)
|
|
{
|
|
*p_pszURL++='/';
|
|
strncpy(p_pszURL,pURLCAppNum->pszStart,pURLCAppNum->iLength);
|
|
p_pszURL+= pURLCAppNum->iLength;
|
|
};
|
|
|
|
if (pURLCReqHandlerKey->iLength>0)
|
|
{
|
|
*p_pszURL++='/';
|
|
strncpy(p_pszURL, pURLCReqHandlerKey->pszStart,pURLCReqHandlerKey->iLength);
|
|
p_pszURL+= pURLCReqHandlerKey->iLength;
|
|
};
|
|
|
|
if (pURLCReqHandlerPath->iLength>0)
|
|
{
|
|
*p_pszURL++='/';
|
|
strncpy(p_pszURL, pURLCReqHandlerPath->pszStart,pURLCReqHandlerPath->iLength);
|
|
p_pszURL+= pURLCReqHandlerPath->iLength;
|
|
};
|
|
|
|
if (pURLCQueryString->iLength>0)
|
|
{
|
|
*p_pszURL++='?';
|
|
strncpy(p_pszURL,pURLCQueryString->pszStart,pURLCQueryString->iLength);
|
|
p_pszURL+= pURLCQueryString->iLength;
|
|
};
|
|
*p_pszURL=0;
|
|
};
|
|
|
|
int GSWComposeURLLen(GSWURLComponents* p_pURLComponents)
|
|
{
|
|
int iLength=0;
|
|
GSWURLComponent* pURLCPrefix=&p_pURLComponents->stPrefix;
|
|
GSWURLComponent* pURLCAppName=&p_pURLComponents->stAppName;
|
|
GSWURLComponent* pURLCAppNum=&p_pURLComponents->stAppNumber;
|
|
GSWURLComponent* pURLCReqHandlerKey=&p_pURLComponents->stRequestHandlerKey;
|
|
GSWURLComponent* pURLCReqHandlerPath=&p_pURLComponents->stRequestHandlerPath;
|
|
GSWURLComponent* pURLCQueryString=&p_pURLComponents->stQueryString;
|
|
|
|
iLength+=pURLCPrefix->iLength;
|
|
iLength+=1+pURLCAppName->iLength;
|
|
iLength+=strlen(g_szGSWeb_AppExtention);
|
|
if (pURLCAppNum->iLength>0)
|
|
iLength+= 1+pURLCAppNum->iLength;
|
|
if (pURLCReqHandlerKey->iLength>0)
|
|
iLength+=1+pURLCReqHandlerKey->iLength;
|
|
if (pURLCReqHandlerPath->iLength>0)
|
|
iLength+= 1+pURLCReqHandlerPath->iLength;
|
|
if (pURLCQueryString->iLength>0)
|
|
iLength+=1+pURLCQueryString->iLength;
|
|
return iLength;
|
|
};
|
|
|
|
CONST char* szGSWURLErrorMessage[]=
|
|
{
|
|
"", // GSWURLError_OK
|
|
"Invalid prefix in URL", // GSWURLError_InvalidPrefix
|
|
"Invalid version in URL", // GSWURLError_InvalidVersion
|
|
"Invalid application name", // GSWURLError_InvalidAppName
|
|
"Invalid application number in URL", // GSWURLError_InvalidAppNumber,
|
|
"Invalid request handler key in URL", // GSWURLError_InvalidRequestHandlerKey,
|
|
"Invalid request handler path in URL", // GSWURLError_InvalidRequestHandlerPath,
|
|
"Invalid application host name in URL", // GSWURLError_InvalidAppHost,
|
|
"Invalid page name in URL", // GSWURLError_InvalidPageName,
|
|
"Invalid session ID in URL", // GSWURLError_InvalidSessionID,
|
|
"Invalid context ID in URL", // GSWURLError_InvalidContextID,
|
|
"Invalid sender ID in URL", // GSWURLError_InvalidSenderID,
|
|
"Invalid query string in URL", // GSWURLError_InvalidQueryString,
|
|
"Invalid suffix in URL" // GSWURLError_InvalidSuffix
|
|
};
|
|
|
|
CONST char* GSWURLErrorMessage(GSWURLError p_eError)
|
|
{
|
|
if (p_eError>=0 && p_eError<sizeof(szGSWURLErrorMessage)/sizeof(szGSWURLErrorMessage[0]))
|
|
return szGSWURLErrorMessage[p_eError];
|
|
else
|
|
return "";
|
|
};
|