mirror of
https://github.com/jellyfin/jellyfin.git
synced 2025-12-16 14:03:03 +03:00
Merge branch 'dev' into code-cleanup
This commit is contained in:
@@ -14,7 +14,7 @@ namespace SocketHttpListener.Net
|
||||
// System.Net.ResponseStream
|
||||
//
|
||||
// Author:
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
//
|
||||
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
|
||||
//
|
||||
@@ -25,10 +25,10 @@ namespace SocketHttpListener.Net
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
|
||||
@@ -12,7 +12,7 @@ namespace SocketHttpListener.Net
|
||||
// System.Net.ResponseStream
|
||||
//
|
||||
// Author:
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
//
|
||||
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
|
||||
//
|
||||
@@ -23,10 +23,10 @@ namespace SocketHttpListener.Net
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
|
||||
@@ -178,9 +178,9 @@ namespace SocketHttpListener.Net
|
||||
}
|
||||
}
|
||||
|
||||
// This method is the callback method associated with Socket.AcceptAsync
|
||||
// operations and is invoked when an accept operation is complete
|
||||
//
|
||||
// This method is the callback method associated with Socket.AcceptAsync
|
||||
// operations and is invoked when an accept operation is complete
|
||||
//
|
||||
private static void OnAccept(object sender, SocketAsyncEventArgs e)
|
||||
{
|
||||
ProcessAccept(e);
|
||||
|
||||
@@ -35,7 +35,7 @@ namespace SocketHttpListener.Net
|
||||
bool listening;
|
||||
bool disposed;
|
||||
|
||||
Dictionary<HttpListenerContext, HttpListenerContext> registry; // Dictionary<HttpListenerContext,HttpListenerContext>
|
||||
Dictionary<HttpListenerContext, HttpListenerContext> registry; // Dictionary<HttpListenerContext,HttpListenerContext>
|
||||
Dictionary<HttpConnection, HttpConnection> connections;
|
||||
private ILogger _logger;
|
||||
private X509Certificate _certificate;
|
||||
|
||||
@@ -28,11 +28,11 @@ namespace SocketHttpListener.Net
|
||||
// The raw path is parsed by looping through all characters from left to right. 'rawOctets'
|
||||
// is used to store consecutive percent encoded octets as actual byte values: e.g. for path /pa%C3%84th%2F/
|
||||
// rawOctets will be set to { 0xC3, 0x84 } when we reach character 't' and it will be { 0x2F } when
|
||||
// we reach the final '/'. I.e. after a sequence of percent encoded octets ends, we use rawOctets as
|
||||
// we reach the final '/'. I.e. after a sequence of percent encoded octets ends, we use rawOctets as
|
||||
// input to the encoding and percent encode the resulting string into UTF-8 octets.
|
||||
//
|
||||
// When parsing ANSI (Latin 1) encoded path '/pa%C4th/', %C4 will be added to rawOctets and when
|
||||
// we reach 't', the content of rawOctets { 0xC4 } will be fed into the ANSI encoding. The resulting
|
||||
// we reach 't', the content of rawOctets { 0xC4 } will be fed into the ANSI encoding. The resulting
|
||||
// string 'Ä' will be percent encoded into UTF-8 octets and appended to requestUriString. The final
|
||||
// path will be '/pa%C3%84th/', where '%C3%84' is the UTF-8 percent encoded character 'Ä'.
|
||||
private List<byte> _rawOctets;
|
||||
@@ -146,7 +146,7 @@ namespace SocketHttpListener.Net
|
||||
|
||||
if (!Uri.TryCreate(_requestUriString.ToString(), UriKind.Absolute, out _requestUri))
|
||||
{
|
||||
// If we can't create a Uri from the string, this is an invalid string and it doesn't make
|
||||
// If we can't create a Uri from the string, this is an invalid string and it doesn't make
|
||||
// sense to try another encoding.
|
||||
result = ParsingResult.InvalidString;
|
||||
}
|
||||
@@ -196,7 +196,7 @@ namespace SocketHttpListener.Net
|
||||
}
|
||||
else
|
||||
{
|
||||
// We found '%', but not followed by 'u', i.e. we have a percent encoded octed: %XX
|
||||
// We found '%', but not followed by 'u', i.e. we have a percent encoded octed: %XX
|
||||
if (!AddPercentEncodedOctetToRawOctetsList(encoding, _rawPath.Substring(index, 2)))
|
||||
{
|
||||
return ParsingResult.InvalidString;
|
||||
@@ -207,7 +207,7 @@ namespace SocketHttpListener.Net
|
||||
else
|
||||
{
|
||||
// We found a non-'%' character: decode the content of rawOctets into percent encoded
|
||||
// UTF-8 characters and append it to the result.
|
||||
// UTF-8 characters and append it to the result.
|
||||
if (!EmptyDecodeAndAppendRawOctetsList(encoding))
|
||||
{
|
||||
return ParsingResult.EncodingError;
|
||||
@@ -402,7 +402,7 @@ namespace SocketHttpListener.Net
|
||||
|
||||
// Find end of path: The path is terminated by
|
||||
// - the first '?' character
|
||||
// - the first '#' character: This is never the case here, since http.sys won't accept
|
||||
// - the first '#' character: This is never the case here, since http.sys won't accept
|
||||
// Uris containing fragments. Also, RFC2616 doesn't allow fragments in request Uris.
|
||||
// - end of Uri string
|
||||
int queryIndex = uriString.IndexOf('?');
|
||||
|
||||
@@ -207,13 +207,13 @@ namespace SocketHttpListener.Net
|
||||
}
|
||||
|
||||
/* Apache forces closing the connection for these status codes:
|
||||
* HttpStatusCode.BadRequest 400
|
||||
* HttpStatusCode.RequestTimeout 408
|
||||
* HttpStatusCode.LengthRequired 411
|
||||
* HttpStatusCode.RequestEntityTooLarge 413
|
||||
* HttpStatusCode.RequestUriTooLong 414
|
||||
* HttpStatusCode.InternalServerError 500
|
||||
* HttpStatusCode.ServiceUnavailable 503
|
||||
* HttpStatusCode.BadRequest 400
|
||||
* HttpStatusCode.RequestTimeout 408
|
||||
* HttpStatusCode.LengthRequired 411
|
||||
* HttpStatusCode.RequestEntityTooLarge 413
|
||||
* HttpStatusCode.RequestUriTooLong 414
|
||||
* HttpStatusCode.InternalServerError 500
|
||||
* HttpStatusCode.ServiceUnavailable 503
|
||||
*/
|
||||
bool conn_close = (_statusCode == (int)HttpStatusCode.BadRequest || _statusCode == (int)HttpStatusCode.RequestTimeout
|
||||
|| _statusCode == (int)HttpStatusCode.LengthRequired || _statusCode == (int)HttpStatusCode.RequestEntityTooLarge
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace SocketHttpListener.Net
|
||||
// System.Net.ResponseStream
|
||||
//
|
||||
// Author:
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
//
|
||||
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
|
||||
//
|
||||
@@ -24,10 +24,10 @@ namespace SocketHttpListener.Net
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
|
||||
@@ -13,7 +13,7 @@ namespace SocketHttpListener.Net
|
||||
// System.Net.ResponseStream
|
||||
//
|
||||
// Author:
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
//
|
||||
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
|
||||
//
|
||||
@@ -24,10 +24,10 @@ namespace SocketHttpListener.Net
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
|
||||
@@ -19,7 +19,7 @@ namespace SocketHttpListener.Net
|
||||
// System.Net.ResponseStream
|
||||
//
|
||||
// Author:
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
// Gonzalo Paniagua Javier (gonzalo@novell.com)
|
||||
//
|
||||
// Copyright (c) 2005 Novell, Inc. (http://www.novell.com)
|
||||
//
|
||||
@@ -30,10 +30,10 @@ namespace SocketHttpListener.Net
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
|
||||
@@ -23,69 +23,69 @@ namespace SocketHttpListener.Net
|
||||
}
|
||||
|
||||
static readonly bool[] allowed_chars = {
|
||||
false, false, false, false, false, false, false, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false, false, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, true, false, true, true, true, true, false, false, false, true,
|
||||
true, false, true, true, false, true, true, true, true, true, true, true, true, true, true, false,
|
||||
false, false, false, false, false, false, true, true, true, true, true, true, true, true, true,
|
||||
true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
|
||||
false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true,
|
||||
true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
|
||||
false, true, false
|
||||
};
|
||||
false, false, false, false, false, false, false, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, false, false, false, false, false, false, false, false, false,
|
||||
false, false, false, false, false, true, false, true, true, true, true, false, false, false, true,
|
||||
true, false, true, true, false, true, true, true, true, true, true, true, true, true, true, false,
|
||||
false, false, false, false, false, false, true, true, true, true, true, true, true, true, true,
|
||||
true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
|
||||
false, false, false, true, true, true, true, true, true, true, true, true, true, true, true, true,
|
||||
true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true,
|
||||
false, true, false
|
||||
};
|
||||
|
||||
static readonly Dictionary<string, HeaderInfo> headers;
|
||||
|
||||
static WebHeaderCollection()
|
||||
{
|
||||
headers = new Dictionary<string, HeaderInfo>(StringComparer.OrdinalIgnoreCase) {
|
||||
{ "Allow", HeaderInfo.MultiValue },
|
||||
{ "Accept", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Accept-Charset", HeaderInfo.MultiValue },
|
||||
{ "Accept-Encoding", HeaderInfo.MultiValue },
|
||||
{ "Accept-Language", HeaderInfo.MultiValue },
|
||||
{ "Accept-Ranges", HeaderInfo.MultiValue },
|
||||
{ "Age", HeaderInfo.Response },
|
||||
{ "Authorization", HeaderInfo.MultiValue },
|
||||
{ "Cache-Control", HeaderInfo.MultiValue },
|
||||
{ "Cookie", HeaderInfo.MultiValue },
|
||||
{ "Connection", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Content-Encoding", HeaderInfo.MultiValue },
|
||||
{ "Content-Length", HeaderInfo.Request | HeaderInfo.Response },
|
||||
{ "Content-Type", HeaderInfo.Request },
|
||||
{ "Content-Language", HeaderInfo.MultiValue },
|
||||
{ "Date", HeaderInfo.Request },
|
||||
{ "Expect", HeaderInfo.Request | HeaderInfo.MultiValue},
|
||||
{ "Host", HeaderInfo.Request },
|
||||
{ "If-Match", HeaderInfo.MultiValue },
|
||||
{ "If-Modified-Since", HeaderInfo.Request },
|
||||
{ "If-None-Match", HeaderInfo.MultiValue },
|
||||
{ "Keep-Alive", HeaderInfo.Response },
|
||||
{ "Pragma", HeaderInfo.MultiValue },
|
||||
{ "Proxy-Authenticate", HeaderInfo.MultiValue },
|
||||
{ "Proxy-Authorization", HeaderInfo.MultiValue },
|
||||
{ "Proxy-Connection", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Range", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Referer", HeaderInfo.Request },
|
||||
{ "Set-Cookie", HeaderInfo.MultiValue },
|
||||
{ "Set-Cookie2", HeaderInfo.MultiValue },
|
||||
{ "Server", HeaderInfo.Response },
|
||||
{ "TE", HeaderInfo.MultiValue },
|
||||
{ "Trailer", HeaderInfo.MultiValue },
|
||||
{ "Transfer-Encoding", HeaderInfo.Request | HeaderInfo.Response | HeaderInfo.MultiValue },
|
||||
{ "Translate", HeaderInfo.Request | HeaderInfo.Response },
|
||||
{ "Upgrade", HeaderInfo.MultiValue },
|
||||
{ "User-Agent", HeaderInfo.Request },
|
||||
{ "Vary", HeaderInfo.MultiValue },
|
||||
{ "Via", HeaderInfo.MultiValue },
|
||||
{ "Warning", HeaderInfo.MultiValue },
|
||||
{ "WWW-Authenticate", HeaderInfo.Response | HeaderInfo. MultiValue },
|
||||
{ "SecWebSocketAccept", HeaderInfo.Response },
|
||||
{ "SecWebSocketExtensions", HeaderInfo.Request | HeaderInfo.Response | HeaderInfo. MultiValue },
|
||||
{ "SecWebSocketKey", HeaderInfo.Request },
|
||||
{ "Sec-WebSocket-Protocol", HeaderInfo.Request | HeaderInfo.Response | HeaderInfo. MultiValue },
|
||||
{ "SecWebSocketVersion", HeaderInfo.Response | HeaderInfo. MultiValue }
|
||||
};
|
||||
{ "Allow", HeaderInfo.MultiValue },
|
||||
{ "Accept", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Accept-Charset", HeaderInfo.MultiValue },
|
||||
{ "Accept-Encoding", HeaderInfo.MultiValue },
|
||||
{ "Accept-Language", HeaderInfo.MultiValue },
|
||||
{ "Accept-Ranges", HeaderInfo.MultiValue },
|
||||
{ "Age", HeaderInfo.Response },
|
||||
{ "Authorization", HeaderInfo.MultiValue },
|
||||
{ "Cache-Control", HeaderInfo.MultiValue },
|
||||
{ "Cookie", HeaderInfo.MultiValue },
|
||||
{ "Connection", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Content-Encoding", HeaderInfo.MultiValue },
|
||||
{ "Content-Length", HeaderInfo.Request | HeaderInfo.Response },
|
||||
{ "Content-Type", HeaderInfo.Request },
|
||||
{ "Content-Language", HeaderInfo.MultiValue },
|
||||
{ "Date", HeaderInfo.Request },
|
||||
{ "Expect", HeaderInfo.Request | HeaderInfo.MultiValue},
|
||||
{ "Host", HeaderInfo.Request },
|
||||
{ "If-Match", HeaderInfo.MultiValue },
|
||||
{ "If-Modified-Since", HeaderInfo.Request },
|
||||
{ "If-None-Match", HeaderInfo.MultiValue },
|
||||
{ "Keep-Alive", HeaderInfo.Response },
|
||||
{ "Pragma", HeaderInfo.MultiValue },
|
||||
{ "Proxy-Authenticate", HeaderInfo.MultiValue },
|
||||
{ "Proxy-Authorization", HeaderInfo.MultiValue },
|
||||
{ "Proxy-Connection", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Range", HeaderInfo.Request | HeaderInfo.MultiValue },
|
||||
{ "Referer", HeaderInfo.Request },
|
||||
{ "Set-Cookie", HeaderInfo.MultiValue },
|
||||
{ "Set-Cookie2", HeaderInfo.MultiValue },
|
||||
{ "Server", HeaderInfo.Response },
|
||||
{ "TE", HeaderInfo.MultiValue },
|
||||
{ "Trailer", HeaderInfo.MultiValue },
|
||||
{ "Transfer-Encoding", HeaderInfo.Request | HeaderInfo.Response | HeaderInfo.MultiValue },
|
||||
{ "Translate", HeaderInfo.Request | HeaderInfo.Response },
|
||||
{ "Upgrade", HeaderInfo.MultiValue },
|
||||
{ "User-Agent", HeaderInfo.Request },
|
||||
{ "Vary", HeaderInfo.MultiValue },
|
||||
{ "Via", HeaderInfo.MultiValue },
|
||||
{ "Warning", HeaderInfo.MultiValue },
|
||||
{ "WWW-Authenticate", HeaderInfo.Response | HeaderInfo. MultiValue },
|
||||
{ "SecWebSocketAccept", HeaderInfo.Response },
|
||||
{ "SecWebSocketExtensions", HeaderInfo.Request | HeaderInfo.Response | HeaderInfo. MultiValue },
|
||||
{ "SecWebSocketKey", HeaderInfo.Request },
|
||||
{ "Sec-WebSocket-Protocol", HeaderInfo.Request | HeaderInfo.Response | HeaderInfo. MultiValue },
|
||||
{ "SecWebSocketVersion", HeaderInfo.Response | HeaderInfo. MultiValue }
|
||||
};
|
||||
}
|
||||
|
||||
// Methods
|
||||
|
||||
@@ -30,7 +30,7 @@ namespace SocketHttpListener.Net.WebSockets
|
||||
return retVal;
|
||||
}
|
||||
|
||||
// return value here signifies if a Sec-WebSocket-Protocol header should be returned by the server.
|
||||
// return value here signifies if a Sec-WebSocket-Protocol header should be returned by the server.
|
||||
internal static bool ProcessWebSocketProtocolHeader(string clientSecWebSocketProtocol,
|
||||
string subProtocol,
|
||||
out string acceptProtocol)
|
||||
@@ -44,7 +44,7 @@ namespace SocketHttpListener.Net.WebSockets
|
||||
// If the server specified _anything_ this isn't valid.
|
||||
throw new WebSocketException("UnsupportedProtocol");
|
||||
}
|
||||
// Treat empty and null from the server as the same thing here, server should not send headers.
|
||||
// Treat empty and null from the server as the same thing here, server should not send headers.
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -52,7 +52,7 @@ namespace SocketHttpListener.Net.WebSockets
|
||||
|
||||
if (subProtocol == null)
|
||||
{
|
||||
// client specified some protocols, server specified 'null'. So server should send headers.
|
||||
// client specified some protocols, server specified 'null'. So server should send headers.
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -63,8 +63,8 @@ namespace SocketHttpListener.Net.WebSockets
|
||||
StringSplitOptions.RemoveEmptyEntries);
|
||||
acceptProtocol = subProtocol;
|
||||
|
||||
// client specified protocols, serverOptions has exactly 1 non-empty entry. Check that
|
||||
// this exists in the list the client specified.
|
||||
// client specified protocols, serverOptions has exactly 1 non-empty entry. Check that
|
||||
// this exists in the list the client specified.
|
||||
for (int i = 0; i < requestProtocols.Length; i++)
|
||||
{
|
||||
string currentRequestProtocol = requestProtocols[i].Trim();
|
||||
|
||||
@@ -22,9 +22,9 @@ namespace SocketHttpListener.Net.WebSockets
|
||||
// 0 - 999 Status codes in the range 0-999 are not used.
|
||||
// 1000 - 1999 Status codes in the range 1000-1999 are reserved for definition by this protocol.
|
||||
// 2000 - 2999 Status codes in the range 2000-2999 are reserved for use by extensions.
|
||||
// 3000 - 3999 Status codes in the range 3000-3999 MAY be used by libraries and frameworks. The
|
||||
// interpretation of these codes is undefined by this protocol. End applications MUST
|
||||
// NOT use status codes in this range.
|
||||
// 3000 - 3999 Status codes in the range 3000-3999 MAY be used by libraries and frameworks. The
|
||||
// interpretation of these codes is undefined by this protocol. End applications MUST
|
||||
// NOT use status codes in this range.
|
||||
// 4000 - 4999 Status codes in the range 4000-4999 MAY be used by application code. The interpretation
|
||||
// of these codes is undefined by this protocol.
|
||||
}
|
||||
|
||||
@@ -2,7 +2,7 @@ using System.Reflection;
|
||||
using System.Resources;
|
||||
using System.Runtime.InteropServices;
|
||||
|
||||
// General Information about an assembly is controlled through the following
|
||||
// General Information about an assembly is controlled through the following
|
||||
// set of attributes. Change these attribute values to modify the information
|
||||
// associated with an assembly.
|
||||
[assembly: AssemblyTitle("SocketHttpListener")]
|
||||
|
||||
Reference in New Issue
Block a user