📄 request.cs
字号:
namespace Microsoft.VisualStudio.WebHost
{
using Microsoft.Win32.SafeHandles;
using System;
using System.Collections;
using System.Globalization;
using System.IO;
using System.Security;
using System.Security.Permissions;
using System.Text;
using System.Web;
using System.Web.Hosting;
internal sealed class Request : SimpleWorkerRequest
{
private string _allRawHeaders;
private Connection _connection;
private IStackWalk _connectionPermission;
private int _contentLength;
private int _endHeadersOffset;
private string _filePath;
private byte[] _headerBytes;
private ArrayList _headerByteStrings;
private bool _headersSent;
private Host _host;
private bool _isClientScriptPath;
private string[] _knownRequestHeaders;
private string _path;
private string _pathInfo;
private string _pathTranslated;
private byte[] _preloadedContent;
private int _preloadedContentLength;
private string _prot;
private string _queryString;
private byte[] _queryStringBytes;
private ArrayList _responseBodyBytes;
private StringBuilder _responseHeadersBuilder;
private int _responseStatus;
private bool _specialCaseStaticFileHeaders;
private int _startHeadersOffset;
private string[][] _unknownRequestHeaders;
private string _url;
private string _verb;
private static char[] badPathChars = new char[] { '%', '>', '<', ':', '\\' };
private static string[] defaultFileNames = new string[] { "default.aspx", "default.htm", "default.html" };
private static char[] IntToHex = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
private const int MaxChunkLength = 0x10000;
private const int maxHeaderBytes = 0x8000;
private static string[] restrictedDirs = new string[] { "/bin", "/app_browsers", "/app_code", "/app_data", "/app_localresources", "/app_globalresources", "/app_webreferences" };
public Request(Host host, Connection connection) : base(string.Empty, string.Empty, null)
{
this._connectionPermission = new PermissionSet(PermissionState.Unrestricted);
this._host = host;
this._connection = connection;
}
public override void CloseConnection()
{
this._connectionPermission.Assert();
this._connection.Close();
}
public override void EndOfRequest()
{
}
public override void FlushResponse(bool finalFlush)
{
this._connectionPermission.Assert();
if (!this._headersSent)
{
this._connection.WriteHeaders(this._responseStatus, this._responseHeadersBuilder.ToString());
this._headersSent = true;
}
for (int i = 0; i < this._responseBodyBytes.Count; i++)
{
byte[] data = (byte[]) this._responseBodyBytes[i];
this._connection.WriteBody(data, 0, data.Length);
}
this._responseBodyBytes = new ArrayList();
if (finalFlush)
{
this._connection.Close();
}
}
public override string GetAppPath()
{
return this._host.VirtualPath;
}
public override string GetAppPathTranslated()
{
return this._host.PhysicalPath;
}
public override string GetFilePath()
{
return this._filePath;
}
public override string GetFilePathTranslated()
{
return this._pathTranslated;
}
public override string GetHttpVerbName()
{
return this._verb;
}
public override string GetHttpVersion()
{
return this._prot;
}
public override string GetKnownRequestHeader(int index)
{
return this._knownRequestHeaders[index];
}
public override string GetLocalAddress()
{
this._connectionPermission.Assert();
return this._connection.LocalIP;
}
public override int GetLocalPort()
{
return this._host.Port;
}
public override string GetPathInfo()
{
return this._pathInfo;
}
public override byte[] GetPreloadedEntityBody()
{
return this._preloadedContent;
}
public override string GetQueryString()
{
return this._queryString;
}
public override byte[] GetQueryStringRawBytes()
{
return this._queryStringBytes;
}
public override string GetRawUrl()
{
return this._url;
}
public override string GetRemoteAddress()
{
this._connectionPermission.Assert();
return this._connection.RemoteIP;
}
public override int GetRemotePort()
{
return 0;
}
public override string GetServerName()
{
string localAddress = this.GetLocalAddress();
if (localAddress.Equals("127.0.0.1"))
{
return "localhost";
}
return localAddress;
}
public override string GetServerVariable(string name)
{
string processUser = string.Empty;
string str2 = name;
if (str2 == null)
{
return processUser;
}
if (!(str2 == "ALL_RAW"))
{
if (str2 != "SERVER_PROTOCOL")
{
if (str2 == "LOGON_USER")
{
if (this.GetUserToken() != IntPtr.Zero)
{
processUser = this._host.GetProcessUser();
}
return processUser;
}
if ((str2 == "AUTH_TYPE") && (this.GetUserToken() != IntPtr.Zero))
{
processUser = "NTLM";
}
return processUser;
}
}
else
{
return this._allRawHeaders;
}
return this._prot;
}
public override string GetUnknownRequestHeader(string name)
{
int length = this._unknownRequestHeaders.Length;
for (int i = 0; i < length; i++)
{
if (string.Compare(name, this._unknownRequestHeaders[i][0], StringComparison.OrdinalIgnoreCase) == 0)
{
return this._unknownRequestHeaders[i][1];
}
}
return null;
}
public override string[][] GetUnknownRequestHeaders()
{
return this._unknownRequestHeaders;
}
public override string GetUriPath()
{
return this._path;
}
public override IntPtr GetUserToken()
{
return this._host.GetProcessToken();
}
public override bool HeadersSent()
{
return this._headersSent;
}
private bool IsBadPath()
{
return ((this._path.IndexOfAny(badPathChars) >= 0) || ((CultureInfo.InvariantCulture.CompareInfo.IndexOf(this._path, "..", CompareOptions.Ordinal) >= 0) || (CultureInfo.InvariantCulture.CompareInfo.IndexOf(this._path, "//", CompareOptions.Ordinal) >= 0)));
}
public override bool IsClientConnected()
{
this._connectionPermission.Assert();
return this._connection.Connected;
}
public override bool IsEntireEntityBodyIsPreloaded()
{
return (this._contentLength == this._preloadedContentLength);
}
private bool IsRequestForRestrictedDirectory()
{
string str = CultureInfo.InvariantCulture.TextInfo.ToLower(this._path);
if (this._host.VirtualPath != "/")
{
str = str.Substring(this._host.VirtualPath.Length);
}
foreach (string str2 in restrictedDirs)
{
if (str.StartsWith(str2, StringComparison.Ordinal) && ((str.Length == str2.Length) || (str[str2.Length] == '/')))
{
return true;
}
}
return false;
}
public override string MapPath(string path)
{
string physicalPath = string.Empty;
bool isClientScriptPath = false;
if (((path == null) || (path.Length == 0)) || path.Equals("/"))
{
if (this._host.VirtualPath == "/")
{
physicalPath = this._host.PhysicalPath;
}
else
{
physicalPath = Environment.SystemDirectory;
}
}
else if (this._host.IsVirtualPathAppPath(path))
{
physicalPath = this._host.PhysicalPath;
}
else if (this._host.IsVirtualPathInApp(path, out isClientScriptPath))
{
if (isClientScriptPath)
{
physicalPath = this._host.PhysicalClientScriptPath + path.Substring(this._host.NormalizedClientScriptPath.Length);
}
else
{
physicalPath = this._host.PhysicalPath + path.Substring(this._host.NormalizedVirtualPath.Length);
}
}
else if (path.StartsWith("/", StringComparison.Ordinal))
{
physicalPath = this._host.PhysicalPath + path.Substring(1);
}
else
{
physicalPath = this._host.PhysicalPath + path;
}
physicalPath = physicalPath.Replace('/', '\\');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -