summaryrefslogtreecommitdiff
path: root/Runtime/Export/WWW.cs
diff options
context:
space:
mode:
authorchai <chaifix@163.com>2019-08-14 22:50:43 +0800
committerchai <chaifix@163.com>2019-08-14 22:50:43 +0800
commit15740faf9fe9fe4be08965098bbf2947e096aeeb (patch)
treea730ec236656cc8cab5b13f088adfaed6bb218fb /Runtime/Export/WWW.cs
+Unity Runtime codeHEADmaster
Diffstat (limited to 'Runtime/Export/WWW.cs')
-rw-r--r--Runtime/Export/WWW.cs168
1 files changed, 168 insertions, 0 deletions
diff --git a/Runtime/Export/WWW.cs b/Runtime/Export/WWW.cs
new file mode 100644
index 0000000..37652bc
--- /dev/null
+++ b/Runtime/Export/WWW.cs
@@ -0,0 +1,168 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.IO;
+
+namespace UnityEngine
+{
+#if ENABLE_WWW
+ partial class WWW
+ {
+#if UNITY_WEBPLAYER || UNITY_EDITOR
+ static readonly char[] forbiddenCharacters = {
+ (char)0, (char)1, (char)2, (char)3, (char)4, (char)5,
+ (char)6, (char)7, (char)8, (char)9, (char)10,
+ (char)11, (char)12, (char)13, (char)14, (char)15,
+ (char)16, (char)17, (char)18, (char)19, (char)20,
+ (char)21, (char)22, (char)23, (char)24, (char)25,
+ (char)26, (char)27, (char)28, (char)29, (char)30,
+ (char)31, (char)127
+ };
+
+ // From http://www.w3.org/TR/XMLHttpRequest/#the-setrequestheader()-method
+ static readonly string[] forbiddenHeaderKeys =
+ {
+ "Accept-Charset",
+ "Accept-Encoding",
+ "Access-Control-Request-Headers",
+ "Access-Control-Request-Method",
+ "Connection",
+ "Content-Length",
+ "Cookie",
+ "Cookie2",
+ "Date",
+ "DNT",
+ "Expect",
+ "Host",
+ "Keep-Alive",
+ "Origin",
+ "Referer",
+ "TE",
+ "Trailer",
+ "Transfer-Encoding",
+ "Upgrade",
+ "User-Agent",
+ "Via",
+ "X-Unity-Version",
+ };
+
+ // Ensure headers do not contain invalid characters (ASCII 0-31, 127)
+ // This prevents XSS and header-spoofing vulnerabilities.
+ private static void CheckSecurityOnHeaders(string[] headers)
+ {
+ bool failNoisy = Application.GetBuildUnityVersion() >= Application.GetNumericUnityVersion("4.3.0b1");
+
+ // On non-webplayer platforms, we permit the platform itself to define the restrictions.
+ for(int i = 0; i < headers.Length; i+=2)
+ {
+ // headers[i] is the header name
+ // headers[i+1] is the header body
+
+ foreach(string forbiddenHeaderKey in forbiddenHeaderKeys)
+ {
+ if(string.Equals(headers[i], forbiddenHeaderKey, StringComparison.CurrentCultureIgnoreCase))
+ {
+ if(failNoisy)
+ {
+ throw new ArgumentException("Cannot overwrite header: " + headers[i]);
+ }
+ else
+ {
+ Debug.LogError("Illegal header overwrite, this will fail in 4.3 and above: " + headers[i]);
+ }
+ }
+ }
+
+ if(headers[i].StartsWith("Sec-") || headers[i].StartsWith("Proxy-"))
+ {
+ if(failNoisy)
+ {
+ throw new ArgumentException("Cannot overwrite header: " + headers[i]);
+ }
+ else
+ {
+ Debug.LogError("Illegal header overwrite, this will fail in 4.3 and above: " + headers[i]);
+ }
+ }
+
+ if(headers[i].IndexOfAny(forbiddenCharacters) > -1 ||
+ headers[i+1].IndexOfAny(forbiddenCharacters) > -1)
+ {
+ if(failNoisy)
+ {
+ throw new ArgumentException("Cannot include control characters " +
+ "in a HTTP header, either as key or value.");
+ }
+ else
+ {
+ Debug.LogError("Illegal control characters in header, this will fail in 4.3 and above");
+ }
+ }
+ }
+ }
+#endif
+
+#if !UNITY_METRO_API && !UNITY_WP8_API
+ private static string[] FlattenedHeadersFrom(Hashtable headers)
+ {
+ if (headers == null) return null;
+
+ var flattenedHeaders = new string[headers.Count * 2];
+ var i = 0;
+ foreach (DictionaryEntry entry in headers)
+ {
+ flattenedHeaders[i++] = entry.Key.ToString();
+ flattenedHeaders[i++] = entry.Value.ToString();
+ }
+
+ return flattenedHeaders;
+ }
+#else
+ private static string[] FlattenedHeadersFrom(Dictionary<string, string> headers)
+ {
+ if (headers == null) return null;
+
+ var flattenedHeaders = new string[headers.Count * 2];
+ var i = 0;
+ foreach (KeyValuePair<string, string> entry in headers)
+ {
+ flattenedHeaders[i++] = entry.Key.ToString();
+ flattenedHeaders[i++] = entry.Value.ToString();
+ }
+
+ return flattenedHeaders;
+ }
+#endif
+#if ENABLE_GENERICS && !UNITY_WEBGL
+ internal static Dictionary<string, string> ParseHTTPHeaderString(string input)
+ {
+ if (input == null) throw new ArgumentException("input was null to ParseHTTPHeaderString");
+ var result = new Dictionary<string, string>();
+ var reader = new StringReader(input);
+
+ int count = 0;
+ while (true)
+ {
+ var line = reader.ReadLine();
+ if (line == null) break;
+
+ // The first line in the response header is the HTTP status line, according to the
+ // HTTP 1.1 specification (http://tools.ietf.org/html/rfc2616#section-6). Lets save it.
+ if (count++ == 0 && line.StartsWith("HTTP"))
+ {
+ result["STATUS"] = line;
+ continue;
+ }
+
+ var index = line.IndexOf(": ");
+ if (index == -1) continue;
+ var key = line.Substring(0, index).ToUpper();
+ var value = line.Substring(index + 2);
+ result[key] = value;
+ }
+ return result;
+ }
+#endif
+ }
+#endif
+} \ No newline at end of file