Renamed HandshakeResponse.cs to HttpResponse.cs, and refactored

This commit is contained in:
sta 2014-07-15 16:39:38 +09:00
parent 4427838632
commit e45e51e1ef
5 changed files with 74 additions and 51 deletions

View File

@ -1,6 +1,6 @@
#region License #region License
/* /*
* HandshakeResponse.cs * HttpResponse.cs
* *
* The MIT License * The MIT License
* *
@ -33,7 +33,7 @@ using WebSocketSharp.Net;
namespace WebSocketSharp namespace WebSocketSharp
{ {
internal class HandshakeResponse : HttpBase internal class HttpResponse : HttpBase
{ {
#region Private Fields #region Private Fields
@ -44,38 +44,37 @@ namespace WebSocketSharp
#region Private Constructors #region Private Constructors
private HandshakeResponse (Version version, NameValueCollection headers) private HttpResponse (string code, string reason, Version version, NameValueCollection headers)
: base (version, headers) : base (version, headers)
{ {
_code = code;
_reason = reason;
} }
#endregion #endregion
#region Internal Constructors #region Internal Constructors
internal HandshakeResponse (HttpStatusCode code) internal HttpResponse (HttpStatusCode code)
: base (HttpVersion.Version11, new NameValueCollection ()) : this (code, code.GetDescription ())
{ {
_code = ((int) code).ToString (); }
_reason = code.GetDescription ();
var headers = Headers; internal HttpResponse (HttpStatusCode code, string reason)
headers["Server"] = "websocket-sharp/1.0"; : this (((int) code).ToString (), reason, HttpVersion.Version11, new NameValueCollection ())
if (code == HttpStatusCode.SwitchingProtocols) { {
headers["Upgrade"] = "websocket"; Headers["Server"] = "websocket-sharp/1.0";
headers["Connection"] = "Upgrade";
}
} }
#endregion #endregion
#region Public Properties #region Public Properties
public AuthenticationChallenge AuthChallenge { public AuthenticationChallenge AuthenticationChallenge {
get { get {
var auth = Headers["WWW-Authenticate"]; var chal = Headers["WWW-Authenticate"];
return auth != null && auth.Length > 0 return chal != null && chal.Length > 0
? AuthenticationChallenge.Parse (auth) ? AuthenticationChallenge.Parse (chal)
: null; : null;
} }
} }
@ -86,6 +85,12 @@ namespace WebSocketSharp
} }
} }
public bool IsProxyAuthenticationRequired {
get {
return _code == "407";
}
}
public bool IsUnauthorized { public bool IsUnauthorized {
get { get {
return _code == "401"; return _code == "401";
@ -102,6 +107,15 @@ namespace WebSocketSharp
} }
} }
public AuthenticationChallenge ProxyAuthenticationChallenge {
get {
var chal = Headers["Proxy-Authenticate"];
return chal != null && chal.Length > 0
? AuthenticationChallenge.Parse (chal)
: null;
}
}
public string Reason { public string Reason {
get { get {
return _reason; return _reason;
@ -118,15 +132,26 @@ namespace WebSocketSharp
#region Internal Methods #region Internal Methods
internal static HandshakeResponse CreateCloseResponse (HttpStatusCode code) internal static HttpResponse CreateCloseResponse (HttpStatusCode code)
{ {
var res = new HandshakeResponse (code); var res = new HttpResponse (code);
res.Headers["Connection"] = "close"; res.Headers["Connection"] = "close";
return res; return res;
} }
internal static HandshakeResponse Parse (string[] headerParts) internal static HttpResponse CreateWebSocketResponse ()
{
var res = new HttpResponse (HttpStatusCode.SwitchingProtocols);
var headers = res.Headers;
headers["Upgrade"] = "websocket";
headers["Connection"] = "Upgrade";
return res;
}
internal static HttpResponse Parse (string[] headerParts)
{ {
var statusLine = headerParts[0].Split (new[] { ' ' }, 3); var statusLine = headerParts[0].Split (new[] { ' ' }, 3);
if (statusLine.Length != 3) if (statusLine.Length != 3)
@ -136,11 +161,8 @@ namespace WebSocketSharp
for (int i = 1; i < headerParts.Length; i++) for (int i = 1; i < headerParts.Length; i++)
headers.SetInternally (headerParts[i], true); headers.SetInternally (headerParts[i], true);
var res = new HandshakeResponse (new Version (statusLine[0].Substring (5)), headers); return new HttpResponse (
res._code = statusLine[1]; statusLine[1], statusLine[2], new Version (statusLine[0].Substring (5)), headers);
res._reason = statusLine[2];
return res;
} }
#endregion #endregion

View File

@ -321,12 +321,12 @@ namespace WebSocketSharp.Net.WebSockets
internal void Close (HttpStatusCode code) internal void Close (HttpStatusCode code)
{ {
_websocket.Close (HandshakeResponse.CreateCloseResponse (code)); _websocket.Close (HttpResponse.CreateCloseResponse (code));
} }
internal void SendAuthChallenge (string challenge) internal void SendAuthChallenge (string challenge)
{ {
var res = new HandshakeResponse (HttpStatusCode.Unauthorized); var res = new HttpResponse (HttpStatusCode.Unauthorized);
res.Headers ["WWW-Authenticate"] = challenge; res.Headers ["WWW-Authenticate"] = challenge;
_stream.WriteHandshake (res); _stream.WriteHandshake (res);
_request = _stream.ReadHttp<HttpRequest> (HttpRequest.Parse, 15000); _request = _stream.ReadHttp<HttpRequest> (HttpRequest.Parse, 15000);

View File

@ -693,11 +693,12 @@ namespace WebSocketSharp
} }
// As client // As client
private string checkIfValidHandshakeResponse (HandshakeResponse response) private string checkIfValidHandshakeResponse (HttpResponse response)
{ {
var headers = response.Headers; var headers = response.Headers;
return response.IsUnauthorized return response.IsUnauthorized
? String.Format ("HTTP {0} authorization is required.", response.AuthChallenge.Scheme) ? String.Format (
"HTTP {0} authorization is required.", response.AuthenticationChallenge.Scheme)
: !response.IsWebSocketResponse : !response.IsWebSocketResponse
? "Not WebSocket connection response." ? "Not WebSocket connection response."
: !validateSecWebSocketAcceptHeader (headers ["Sec-WebSocket-Accept"]) : !validateSecWebSocketAcceptHeader (headers ["Sec-WebSocket-Accept"])
@ -897,6 +898,15 @@ namespace WebSocketSharp
: null; : null;
} }
// As server
private HttpResponse createHandshakeCloseResponse (HttpStatusCode code)
{
var res = HttpResponse.CreateCloseResponse (code);
res.Headers ["Sec-WebSocket-Version"] = _version;
return res;
}
// As client // As client
private HttpRequest createHandshakeRequest () private HttpRequest createHandshakeRequest ()
{ {
@ -936,11 +946,11 @@ namespace WebSocketSharp
} }
// As server // As server
private HandshakeResponse createHandshakeResponse () private HttpResponse createHandshakeResponse ()
{ {
var res = new HandshakeResponse (HttpStatusCode.SwitchingProtocols); var res = HttpResponse.CreateWebSocketResponse ();
var headers = res.Headers;
var headers = res.Headers;
headers ["Sec-WebSocket-Accept"] = CreateResponseKey (_base64Key); headers ["Sec-WebSocket-Accept"] = CreateResponseKey (_base64Key);
if (_protocol != null) if (_protocol != null)
@ -955,15 +965,6 @@ namespace WebSocketSharp
return res; return res;
} }
// As server
private HandshakeResponse createHandshakeResponse (HttpStatusCode code)
{
var res = HandshakeResponse.CreateCloseResponse (code);
res.Headers ["Sec-WebSocket-Version"] = _version;
return res;
}
private MessageEventArgs dequeueFromMessageEventQueue () private MessageEventArgs dequeueFromMessageEventQueue ()
{ {
lock (_forMessageEventQueue) lock (_forMessageEventQueue)
@ -1043,7 +1044,7 @@ namespace WebSocketSharp
} }
// As client // As client
private HandshakeResponse receiveHandshakeResponse () private HttpResponse receiveHandshakeResponse ()
{ {
var res = _stream.ReadHandshakeResponse (); var res = _stream.ReadHandshakeResponse ();
_logger.Debug ("A response to this WebSocket connection request:\n" + res.ToString ()); _logger.Debug ("A response to this WebSocket connection request:\n" + res.ToString ());
@ -1073,7 +1074,7 @@ namespace WebSocketSharp
} }
// As server // As server
private bool send (HandshakeResponse response) private bool send (HttpResponse response)
{ {
_logger.Debug ( _logger.Debug (
"A response to the WebSocket connection request:\n" + response.ToString ()); "A response to the WebSocket connection request:\n" + response.ToString ());
@ -1226,12 +1227,12 @@ namespace WebSocketSharp
} }
// As client // As client
private HandshakeResponse sendHandshakeRequest () private HttpResponse sendHandshakeRequest ()
{ {
var req = createHandshakeRequest (); var req = createHandshakeRequest ();
var res = sendHandshakeRequest (req); var res = sendHandshakeRequest (req);
if (res.IsUnauthorized) { if (res.IsUnauthorized) {
_authChallenge = res.AuthChallenge; _authChallenge = res.AuthenticationChallenge;
if (_credentials != null && if (_credentials != null &&
(!_preAuth || _authChallenge.Scheme == AuthenticationSchemes.Digest)) { (!_preAuth || _authChallenge.Scheme == AuthenticationSchemes.Digest)) {
if (res.Headers.Contains ("Connection", "close")) { if (res.Headers.Contains ("Connection", "close")) {
@ -1250,7 +1251,7 @@ namespace WebSocketSharp
} }
// As client // As client
private HandshakeResponse sendHandshakeRequest (HttpRequest request) private HttpResponse sendHandshakeRequest (HttpRequest request)
{ {
send (request); send (request);
return receiveHandshakeResponse (); return receiveHandshakeResponse ();
@ -1373,7 +1374,7 @@ namespace WebSocketSharp
#region Internal Methods #region Internal Methods
// As server // As server
internal void Close (HandshakeResponse response) internal void Close (HttpResponse response)
{ {
_readyState = WebSocketState.Closing; _readyState = WebSocketState.Closing;
@ -1386,7 +1387,7 @@ namespace WebSocketSharp
// As server // As server
internal void Close (HttpStatusCode code) internal void Close (HttpStatusCode code)
{ {
Close (createHandshakeResponse (code)); Close (createHandshakeCloseResponse (code));
} }
// As server // As server

View File

@ -267,9 +267,9 @@ namespace WebSocketSharp
return ReadHttp<HttpRequest> (HttpRequest.Parse, 90000); return ReadHttp<HttpRequest> (HttpRequest.Parse, 90000);
} }
public HandshakeResponse ReadHandshakeResponse () public HttpResponse ReadHandshakeResponse ()
{ {
return ReadHttp<HandshakeResponse> (HandshakeResponse.Parse, 90000); return ReadHttp<HttpResponse> (HttpResponse.Parse, 90000);
} }
public bool WriteFrame (WebSocketFrame frame) public bool WriteFrame (WebSocketFrame frame)

View File

@ -113,7 +113,6 @@
<Compile Include="LogData.cs" /> <Compile Include="LogData.cs" />
<Compile Include="LogLevel.cs" /> <Compile Include="LogLevel.cs" />
<Compile Include="Logger.cs" /> <Compile Include="Logger.cs" />
<Compile Include="HandshakeResponse.cs" />
<Compile Include="WebSocketState.cs" /> <Compile Include="WebSocketState.cs" />
<Compile Include="Server\IWebSocketSession.cs" /> <Compile Include="Server\IWebSocketSession.cs" />
<Compile Include="Server\WebSocketSessionManager.cs" /> <Compile Include="Server\WebSocketSessionManager.cs" />
@ -136,6 +135,7 @@
<Compile Include="Net\AuthenticationBase.cs" /> <Compile Include="Net\AuthenticationBase.cs" />
<Compile Include="HttpBase.cs" /> <Compile Include="HttpBase.cs" />
<Compile Include="HttpRequest.cs" /> <Compile Include="HttpRequest.cs" />
<Compile Include="HttpResponse.cs" />
</ItemGroup> </ItemGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<ItemGroup> <ItemGroup>