Skip to content

Commit 48cbde1

Browse files
Improve the routing mechanism for GAM services (#974)
* Improve the routing mechanism for GAM services using the appropriate namespace for each service. * Refactored minor improvements * Store names in HttpHelper.GamServicesInternalName without extension.
1 parent d9882e0 commit 48cbde1

File tree

3 files changed

+92
-83
lines changed

3 files changed

+92
-83
lines changed

dotnet/src/dotnetcore/GxClasses.Web/Middleware/HandlerFactory.cs

Lines changed: 8 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -37,25 +37,6 @@ public class HandlerFactory
3737
{"gxoauthuserinfo",typeof(GXOAuthUserInfo)},
3838
{"gxoauthaccesstoken",typeof(GXOAuthAccessToken)},
3939
{"gxmulticall",typeof(GXMultiCall)}};
40-
static Dictionary<string, string> _aspxRewrite = new Dictionary<string, string>(){
41-
{"oauth/access_token","gxoauthaccesstoken.aspx"},
42-
{"oauth/logout","gxoauthlogout.aspx"},
43-
{"oauth/userinfo","gxoauthuserinfo.aspx"},
44-
{"oauth/gam/signin","agamextauthinput.aspx"},
45-
{"oauth/gam/callback","agamextauthinput.aspx"},
46-
{"oauth/gam/access_token","agamoauth20getaccesstoken.aspx"},
47-
{"oauth/gam/userinfo","agamoauth20getuserinfo.aspx"},
48-
{"oauth/gam/signout","agamextauthinput.aspx"},
49-
{"saml/gam/signin","Saml2/SignIn"},
50-
{"saml/gam/callback","gamexternalauthenticationinputsaml20_ws.aspx"},
51-
{"saml/gam/signout","Saml2/Logout"},
52-
{"oauth/requesttokenservice","agamstsauthappgetaccesstoken.aspx"},
53-
{"oauth/queryaccesstoken","agamstsauthappvalidaccesstoken.aspx"},
54-
{"oauth/gam/v2.0/access_token","agamoauth20getaccesstoken_v20.aspx"},
55-
{"oauth/gam/v2.0/userinfo","agamoauth20getuserinfo_v20.aspx"},
56-
{"oauth/gam/v2.0/requesttokenanduserinfo","aGAMSSORestRequestTokenAndUserInfo_v20.aspx"}};
57-
private const string QUERYVIEWER_NAMESPACE = "QueryViewer.Services";
58-
private const string GXFLOW_NSPACE = "GXflow.Programs";
5940
private static List<string> GxNamespaces;
6041

6142
public HandlerFactory()
@@ -122,9 +103,9 @@ private static string ObjectUrl(string requestPath, string basePath)
122103
}
123104
lastSegment = CleanUploadUrlSuffix(lastSegment.TrimStart('/').ToLower());
124105
GXLogging.Debug(log, "ObjectUrl:", lastSegment);
125-
if (_aspxRewrite.ContainsKey(lastSegment))
106+
if (HttpHelper.GAMServices.ContainsKey(lastSegment))
126107
{
127-
return _aspxRewrite[lastSegment];
108+
return HttpHelper.GAMServices[lastSegment];
128109
}
129110
return lastSegment;
130111
}
@@ -167,11 +148,15 @@ public IHttpHandler GetHandler(HttpContext context, string requestType, string u
167148
string className;
168149
if (cname.StartsWith("agxpl_", StringComparison.OrdinalIgnoreCase) || cname.Equals("gxqueryviewerforsd", StringComparison.OrdinalIgnoreCase))
169150
{
170-
className = $"{QUERYVIEWER_NAMESPACE}.{cname}";
151+
className = $"{HttpHelper.QUERYVIEWER_NAMESPACE}.{cname}";
171152
}
172153
else if (Preferences.GxpmEnabled && (cname.StartsWith("awf", StringComparison.OrdinalIgnoreCase) || cname.StartsWith("wf", StringComparison.OrdinalIgnoreCase) || cname.StartsWith("apwf", StringComparison.OrdinalIgnoreCase)))
173154
{
174-
className = $"{GXFLOW_NSPACE}.{cname}";
155+
className = $"{HttpHelper.GXFLOW_NSPACE}.{cname}";
156+
}
157+
else if (HttpHelper.GamServicesInternalName.Contains(cname))
158+
{
159+
className = $"{HttpHelper.GAM_NSPACE}.{cname}";
175160
}
176161
else
177162
{

dotnet/src/dotnetframework/GxClasses/Helpers/HttpHelper.cs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
using Microsoft.Net.Http.Headers;
2828
using System.Net.Http;
2929
using System.Globalization;
30+
using System.Linq;
3031

3132
namespace GeneXus.Http
3233
{
@@ -72,10 +73,32 @@ public class WrappedJsonError
7273
[DataMember(Name = "error")]
7374
public HttpJsonError Error;
7475
}
75-
7676
public class HttpHelper
7777
{
7878
static readonly IGXLogger log = GXLoggerFactory.GetLogger<HttpHelper>();
79+
80+
internal static Dictionary<string, string> GAMServices = new Dictionary<string, string>(){
81+
{"oauth/access_token","gxoauthaccesstoken.aspx"},
82+
{"oauth/logout","gxoauthlogout.aspx"},
83+
{"oauth/userinfo","gxoauthuserinfo.aspx"},
84+
{"oauth/gam/signin","agamextauthinput.aspx"},
85+
{"oauth/gam/callback","agamextauthinput.aspx"},
86+
{"oauth/gam/access_token","agamoauth20getaccesstoken.aspx"},
87+
{"oauth/gam/userinfo","agamoauth20getuserinfo.aspx"},
88+
{"oauth/gam/signout","agamextauthinput.aspx"},
89+
{"saml/gam/signin","Saml2/SignIn"},
90+
{"saml/gam/callback","gamexternalauthenticationinputsaml20_ws.aspx"},
91+
{"saml/gam/signout","Saml2/Logout"},
92+
{"oauth/requesttokenservice","agamstsauthappgetaccesstoken.aspx"},
93+
{"oauth/queryaccesstoken","agamstsauthappvalidaccesstoken.aspx"},
94+
{"oauth/gam/v2.0/access_token","agamoauth20getaccesstoken_v20.aspx"},
95+
{"oauth/gam/v2.0/userinfo","agamoauth20getuserinfo_v20.aspx"},
96+
{"oauth/gam/v2.0/requesttokenanduserinfo","agamssorequesttokenanduserinfo_v20.aspx"}};
97+
internal static HashSet<string> GamServicesInternalName = new HashSet<string>(GAMServices.Values.Select(value => value.Replace(ASPX, string.Empty)));
98+
internal const string QUERYVIEWER_NAMESPACE = "QueryViewer.Services";
99+
internal const string GXFLOW_NSPACE = "GXflow.Programs";
100+
internal const string GAM_NSPACE = "GeneXus.Security.API";
101+
79102
/*
80103
* https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
81104
* Specifying no-cache or max-age=0 indicates that

dotnet/src/dotnetframework/GxClasses/Middleware/HandlerFactory.cs

Lines changed: 60 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -67,88 +67,89 @@ public IHttpHandler GetHandler(HttpContext context, string requestType, string u
6767

6868
string relativeURL = context.Request.AppRelativeCurrentExecutionFilePath;
6969
string fname = relativeURL.Substring(relativeURL.LastIndexOf('~') + 2);
70-
String cname1 = (fname.Contains(".")) ? fname.Substring(0, fname.LastIndexOf('.')) : fname;
70+
string cname1 = (fname.Contains(".")) ? fname.Substring(0, fname.LastIndexOf('.')) : fname;
7171
string cname0 = cname1.ToLower();
72-
string actualPath = "";
73-
72+
string mainNamespace;
73+
string assemblyName, cname;
74+
string actualPath;
7475
if (cname0 == "gxoauthlogout")
7576
{
76-
return new GeneXus.Http.GXOAuthLogout();
77+
return new GXOAuthLogout();
7778
}
7879
else if (cname0 == "gxoauthuserinfo")
7980
{
80-
return new GeneXus.Http.GXOAuthUserInfo();
81+
return new GXOAuthUserInfo();
8182
}
8283
else if (cname0 == "gxoauthaccesstoken")
8384
{
84-
return new GeneXus.Http.GXOAuthAccessToken();
85+
return new GXOAuthAccessToken();
8586
}
8687
else if (cname0 == "gxmulticall")
8788
{
88-
return new GeneXus.Http.GXMultiCall();
89+
return new GXMultiCall();
8990
}
90-
string assemblyName, cname;
91-
if (GXAPIModule.serviceInPath(pathTranslated, actualPath: out actualPath))
91+
else if (HttpHelper.GamServicesInternalName.Contains(cname0))
92+
{
93+
mainNamespace = HttpHelper.GAM_NSPACE;
94+
}
95+
else
9296
{
93-
string nspace;
94-
Config.GetValueOf("AppMainNamespace", out nspace);
95-
String objClass = GXAPIModule.servicesBase[actualPath];
96-
//
97-
String objectName = GetObjFromPath(cname0, actualPath);
98-
String objectNameUp = GetObjFromPath(cname1, actualPath);
99-
//
100-
Dictionary<string, object> routeParms;
101-
if (GXAPIModule.servicesMapData.ContainsKey(actualPath))
97+
if (!Config.GetValueOf("AppMainNamespace", out mainNamespace))
98+
mainNamespace = "GeneXus.Programs.";
99+
100+
if (GXAPIModule.serviceInPath(pathTranslated, actualPath: out actualPath))
102101
{
103-
bool IsServiceCall = GetSMap(actualPath, objectName, objectNameUp, requestType, out string mapName, out string mapRegExp, out routeParms);
104-
if (IsServiceCall)
102+
string nspace;
103+
Config.GetValueOf("AppMainNamespace", out nspace);
104+
string objClass = GXAPIModule.servicesBase[actualPath];
105+
//
106+
string objectName = GetObjFromPath(cname0, actualPath);
107+
string objectNameUp = GetObjFromPath(cname1, actualPath);
108+
//
109+
Dictionary<string, object> routeParms;
110+
if (GXAPIModule.servicesMapData.ContainsKey(actualPath))
105111
{
106-
if (!String.IsNullOrEmpty(mapName) && GXAPIModule.servicesMap[actualPath].TryGetValue(mapName, out SingleMap value))
112+
bool IsServiceCall = GetSMap(actualPath, objectName, objectNameUp, requestType, out string mapName, out string mapRegExp, out routeParms);
113+
if (IsServiceCall)
107114
{
108-
String tmpController = objClass;
109-
String asssemblycontroller = tmpController;
110-
if (objClass.Contains("\\"))
115+
if (!string.IsNullOrEmpty(mapName) && GXAPIModule.servicesMap[actualPath].TryGetValue(mapName, out SingleMap value))
111116
{
112-
tmpController = objClass.Substring(objClass.LastIndexOf("\\") + 1);
113-
String addNspace = objClass.Substring(0, objClass.LastIndexOf("\\")).Replace("\\", ".");
114-
asssemblycontroller = addNspace + "." + tmpController;
115-
nspace += "." + addNspace;
117+
string tmpController = objClass;
118+
string asssemblycontroller = tmpController;
119+
if (objClass.Contains("\\"))
120+
{
121+
tmpController = objClass.Substring(objClass.LastIndexOf("\\") + 1);
122+
string addNspace = objClass.Substring(0, objClass.LastIndexOf("\\")).Replace("\\", ".");
123+
asssemblycontroller = addNspace + "." + tmpController;
124+
nspace += "." + addNspace;
125+
}
126+
GxContext gxContext = GxContext.CreateDefaultInstance();
127+
object handler = ClassLoader.FindInstance(asssemblycontroller, nspace, tmpController, new Object[] { gxContext }, null);
128+
129+
gxContext.HttpContext = context;
130+
GxRestWrapper restWrapper = new Application.GxRestWrapper(handler as GXBaseObject, context, gxContext, value.ServiceMethod, value.VariableAlias, routeParms);
131+
return restWrapper;
116132
}
117-
GxContext gxContext = GxContext.CreateDefaultInstance();
118-
object handler = ClassLoader.FindInstance(asssemblycontroller, nspace, tmpController, new Object[] { gxContext }, null);
119-
120-
gxContext.HttpContext = context;
121-
GxRestWrapper restWrapper = new Application.GxRestWrapper(handler as GXBaseObject, context, gxContext, value.ServiceMethod, value.VariableAlias, routeParms);
122-
return restWrapper;
123133
}
124-
}
125-
else
126-
{
127-
if (requestType.Equals(HttpMethod.Options.Method) && !String.IsNullOrEmpty(actualPath) && GXAPIModule.servicesMapData.ContainsKey(actualPath))
134+
else
128135
{
129-
return new OptionsApiObjectRequestHandler(actualPath, objectName, mapRegExp);
136+
if (requestType.Equals(HttpMethod.Options.Method) && !string.IsNullOrEmpty(actualPath) && GXAPIModule.servicesMapData.ContainsKey(actualPath))
137+
{
138+
return new OptionsApiObjectRequestHandler(actualPath, objectName, mapRegExp);
139+
}
130140
}
131-
}
141+
}
142+
return null;
132143
}
133-
return null;
134144
}
135-
else
145+
assemblyName = cname0;
146+
cname = cname0;
147+
if (cname.EndsWith("_bc_ws"))
136148
{
137-
{
138-
assemblyName = cname0;
139-
cname = cname0;
140-
}
141-
if (cname.EndsWith("_bc_ws"))
142-
{
143-
cname = cname.Substring(0, cname.Length - 3);
144-
assemblyName = cname;
145-
}
149+
cname = cname.Substring(0, cname.Length - 3);
150+
assemblyName = cname;
146151
}
147-
string mainNamespace, className;
148-
if (Config.GetValueOf("AppMainNamespace", out mainNamespace))
149-
className = mainNamespace + "." + cname;
150-
else
151-
className = "GeneXus.Programs." + cname;
152+
string className = mainNamespace + "." + cname;
152153

153154
Type objType = GetHandlerType(assemblyName, className);
154155
if (objType == null)
@@ -190,7 +191,7 @@ public IHttpHandler GetHandler(HttpContext context, string requestType, string u
190191
}
191192
else
192193
{
193-
handlerToReturn = (IHttpHandler)System.Web.UI.PageParser.GetCompiledPageInstance(url, pathTranslated, context);
194+
handlerToReturn = System.Web.UI.PageParser.GetCompiledPageInstance(url, pathTranslated, context);
194195
}
195196
return handlerToReturn;
196197
}
@@ -199,7 +200,7 @@ public string GetObjFromPath(string cname, string apath)
199200
{
200201
if (cname.LastIndexOf("/") == (cname.Length - 1))
201202
cname = cname.Substring(0, cname.Length - 1);
202-
String objectName = cname.Remove(0, apath.Length);
203+
string objectName = cname.Remove(0, apath.Length);
203204
return objectName;
204205
}
205206

@@ -302,7 +303,7 @@ internal static Type GetHandlerType(string assemblyName, string className)
302303
try
303304
{
304305

305-
objType = GeneXus.Metadata.ClassLoader.FindType(assemblyName, className, null);
306+
objType = ClassLoader.FindType(assemblyName, className, null);
306307
if (objType == null)
307308
objType = Assembly.Load(assemblyName).GetType(className);
308309
}

0 commit comments

Comments
 (0)