Browse Source

Apewer-6.0.3:修正 GetParameter 问题。

dev
Elivo 5 years ago
parent
commit
20281f62da
  1. 2
      Apewer.Run/Apewer.Run.csproj
  2. 2
      Apewer.Run/ApiClient.cs
  3. 2
      Apewer.Run/Methods.cs
  4. 81
      Apewer.Run/Web.cs
  5. 2
      Apewer/Apewer.csproj
  6. 23
      Apewer/NetworkUtility.cs
  7. 84
      Apewer/Web/WebUtility.cs
  8. 3
      Apewer/_ChangeLog.md

2
Apewer.Run/Apewer.Run.csproj

@ -9,7 +9,7 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Apewer.Library\Apewer.csproj" /> <ProjectReference Include="..\Apewer\Apewer.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>

2
Apewer.Run/ApiClient.cs

@ -15,7 +15,7 @@ namespace Apewer.Run
public ApiClient() public ApiClient()
{ {
var client = new Web.ApiClient(); var client = new Apewer.Web.ApiClient();
client.ApiUrl = "http://agent.niutax.com/"; client.ApiUrl = "http://agent.niutax.com/";
client.UserAgent = Assembly.GetExecutingAssembly().FullName; client.UserAgent = Assembly.GetExecutingAssembly().FullName;

2
Apewer.Run/Methods.cs

@ -12,7 +12,7 @@ namespace Apewer.Run
public Methods() public Methods()
{ {
FormatMinutes(); // FormatMinutes();
} }
void FormatMinutes() void FormatMinutes()

81
Apewer.Run/Web.cs

@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace Apewer.Run
{
public class Web
{
public Web()
{
// GetParameter(Json.Parse("{\"status\":2,\"after\":0,\"before\":0}"), "status");
}
string GetParameter(Json data, params string[] names)
{
if (names == null || names.Length < 1) return null;
var sameNames = new List<string>();
var lowerNames = new List<string>();
foreach (var name in names)
{
if (string.IsNullOrEmpty(name)) continue;
sameNames.Add(name);
var lower = TextUtility.ToLower(name);
if (string.IsNullOrEmpty(lower)) continue;
lowerNames.Add(lower);
}
// POST 优先。
if (data != null && data.IsObject)
{
var properties = data.GetProperties();
if (properties != null)
{
// Json 区分大小写,先全字匹配。
foreach (var property in properties)
{
if (!property.IsProperty) continue;
if (sameNames.Contains(property.Name) && property.Value != null)
{
var value = property.Value;
if (value == null) continue;
var text = value.ToString();
if (!string.IsNullOrEmpty(text)) return text;
}
}
// 以小写模糊匹配。
foreach (var property in properties)
{
if (!property.IsProperty) continue;
var lowerName = TextUtility.ToLower(property.Name);
if (lowerNames.Contains(lowerName) && property.Value != null)
{
var value = property.Value;
if (value == null) continue;
var text = value.ToString();
if (!string.IsNullOrEmpty(text)) return text;
}
}
}
}
#if NETFX
// NETFX 最后搜索 GET 参数。
if (request.Url != null)
{
var value = GetParameter(request.Url, names);
if (!string.IsNullOrEmpty(value)) return value;
}
#endif
return null;
}
}
}

2
Apewer/Apewer.csproj

@ -14,7 +14,7 @@
<TargetFrameworks>netstandard2.1;net20;net40;net461;netcoreapp3.1</TargetFrameworks> <TargetFrameworks>netstandard2.1;net20;net40;net461;netcoreapp3.1</TargetFrameworks>
<Title>Apewer</Title> <Title>Apewer</Title>
<Product>Apewer Libraries</Product> <Product>Apewer Libraries</Product>
<Version>6.0.2</Version> <Version>6.0.3</Version>
</PropertyGroup> </PropertyGroup>
<!-- Info --> <!-- Info -->

23
Apewer/NetworkUtility.cs

@ -182,24 +182,23 @@ namespace Apewer
/// <summary>判断 IPv4 地址格式是否正确。</summary> /// <summary>判断 IPv4 地址格式是否正确。</summary>
public static bool IsIP(string ipv4) public static bool IsIP(string ipv4)
{ {
int r = 0;
try try
{ {
if (!string.IsNullOrEmpty(ipv4)) if (string.IsNullOrEmpty(ipv4)) return false;
var split = ipv4.Split('.');
if (split.Length != 4) return false;
for (int i = 0; i < 4; i++)
{ {
var a = ipv4.Split('.'); var n = Convert.ToInt32(split[i]);
if (a.Length == 4) if (n < 0 || n > 255) return false;
{ if (n.ToString() != split[i]) return false;
for (int i = 0; i < 4; i++)
{
int n = Convert.ToInt32(a[i]);
if ((n >= 0) && (n <= 255)) r += 1;
}
}
} }
return true;
} }
catch { } catch { }
return (r == 4) ? true : false; return false;
} }
/// <summary>对目标地址进行解析。</summary> /// <summary>对目标地址进行解析。</summary>

84
Apewer/Web/WebUtility.cs

@ -111,7 +111,15 @@ namespace Apewer.Web
#if NETFX || NETCORE #if NETFX || NETCORE
#region http #region http
/// <summary>获取直连端的 IP。</summary>
public static string GetDirectIP(ApiRequest request)
{
if (request == null) return null;
if (request.Context == null) return null;
return GetDirectIP(request.Context.Request);
}
/// <summary>获取直连端的 IP。</summary> /// <summary>获取直连端的 IP。</summary>
public static string GetDirectIP(HttpRequest request) public static string GetDirectIP(HttpRequest request)
@ -125,6 +133,14 @@ namespace Apewer.Web
#endif #endif
} }
/// <summary>获取客户端 IP。</summary>
public static string GetClientIP(ApiRequest request, bool withProxy = false)
{
if (request == null) return null;
if (request.Context == null) return null;
return GetClientIP(request.Context.Request, withProxy);
}
/// <summary>获取客户端 IP。</summary> /// <summary>获取客户端 IP。</summary>
#if NETFX #if NETFX
public static string GetClientIP(System.Web.HttpRequest request, bool withProxy = false) public static string GetClientIP(System.Web.HttpRequest request, bool withProxy = false)
@ -147,7 +163,7 @@ namespace Apewer.Web
} }
/// <summary>请求来自于可信客户端。</summary> /// <summary>请求来自于可信客户端。</summary>
public static bool FromTrusted(HttpRequest request, params string[] domains) public static bool FromTrusted(HttpRequest request, params string[] addresses)
{ {
if (request == null) return false; if (request == null) return false;
@ -158,17 +174,26 @@ namespace Apewer.Web
if (NetworkUtility.FromLAN(direct)) return true; if (NetworkUtility.FromLAN(direct)) return true;
} }
if (domains != null && domains.Length > 0) // 遍历传入的地址。
if (addresses != null && addresses.Length > 0)
{ {
// 读取 HTTP 头。
var forwarded = GetForwardedIP(request); var forwarded = GetForwardedIP(request);
if (!string.IsNullOrEmpty(forwarded)) if (!NetworkUtility.IsIP(forwarded)) return false;
foreach (var address in addresses)
{ {
foreach (var domain in domains) if (NetworkUtility.IsIP(address))
{ {
if (string.IsNullOrEmpty(domain)) continue; if (forwarded == address) return true;
if (domain == forwarded) return true; }
var ip = NetworkUtility.Resolve(domain); else
if (NetworkUtility.IsIP(ip) && ip == forwarded) return true; {
var ip = NetworkUtility.Resolve(address);
if (NetworkUtility.IsIP(ip))
{
if (forwarded == ip) return true;
}
} }
} }
} }
@ -177,17 +202,17 @@ namespace Apewer.Web
} }
/// <summary>请求来自于可信客户端。</summary> /// <summary>请求来自于可信客户端。</summary>
public static bool FromTrusted(HttpContext context, params string[] domains) public static bool FromTrusted(HttpContext context, params string[] addresses)
{ {
if (context == null) return false; if (context == null) return false;
return FromTrusted(context.Request, domains); return FromTrusted(context.Request, addresses);
} }
/// <summary>请求来自于可信客户端。</summary> /// <summary>请求来自于可信客户端。</summary>
public static bool FromTrusted(ApiRequest request, params string[] domains) public static bool FromTrusted(ApiRequest request, params string[] addresses)
{ {
if (request == null) return false; if (request == null) return false;
return FromTrusted(request.Context, domains); return FromTrusted(request.Context, addresses);
} }
/// <summary>获取 HTTP 方法。</summary> /// <summary>获取 HTTP 方法。</summary>
@ -287,6 +312,13 @@ namespace Apewer.Web
return value; return value;
} }
/// <summary>获取 X-Forwarded-For。</summary>
public static string GetForwardedIP(ApiRequest request)
{
if (request == null) return null;
return GetForwardedIP(request.Headers);
}
/// <summary>获取 X-Forwarded-For。</summary> /// <summary>获取 X-Forwarded-For。</summary>
public static string GetForwardedIP(HttpRequest request) => GetForwardedIP(GetHeaders(request)); public static string GetForwardedIP(HttpRequest request) => GetForwardedIP(GetHeaders(request));
@ -373,11 +405,11 @@ namespace Apewer.Web
foreach (var name in names) foreach (var name in names)
{ {
if (string.IsNullOrEmpty(name)) continue; if (string.IsNullOrEmpty(name)) continue;
sameNames.Add(name); if (!sameNames.Contains(name)) sameNames.Add(name);
var lower = TextUtility.ToLower(name); var lower = TextUtility.ToLower(name);
if (string.IsNullOrEmpty(lower)) continue; if (string.IsNullOrEmpty(lower)) continue;
lowerNames.Add(lower); if (!lowerNames.Contains(lower)) lowerNames.Add(lower);
} }
// POST 优先。 // POST 优先。
@ -423,14 +455,24 @@ namespace Apewer.Web
if (!string.IsNullOrEmpty(value)) return value; if (!string.IsNullOrEmpty(value)) return value;
} }
#if NETFX // GET 参数。
// NETFX 最后搜索 GET 参数。 if (request.Parameters != null)
if (request.Url != null)
{ {
var value = GetParameter(request.Url, names); // 全字匹配。
if (!string.IsNullOrEmpty(value)) return value; foreach (var kvp in request.Parameters)
{
if (string.IsNullOrEmpty(kvp.Key) || string.IsNullOrEmpty(kvp.Value)) continue;
if (sameNames.Contains(kvp.Key)) return kvp.Value;
}
// 以小写模糊匹配。
foreach (var kvp in request.Parameters)
{
var lowerKey = TextUtility.ToLower(kvp.Key);
if (string.IsNullOrEmpty(lowerKey) || string.IsNullOrEmpty(kvp.Value)) continue;
if (lowerNames.Contains(lowerKey)) return kvp.Value;
}
} }
#endif
return null; return null;
} }

3
Apewer/_ChangeLog.md

@ -5,6 +5,9 @@
### 最新提交 ### 最新提交
### 6.0.3
- 修正 GetParameter 获取不到 GET 参数的问题。
### 6.0.2 ### 6.0.2
- 修正 GetParameter 匹配 Json 的问题。 - 修正 GetParameter 匹配 Json 的问题。

Loading…
Cancel
Save