bool CheckAuthorization (WebResponse response, HttpStatusCode code) { authCompleted = false; if (code == HttpStatusCode.Unauthorized && credentials == null) return false; bool isProxy = (code == HttpStatusCode.ProxyAuthenticationRequired); if (isProxy && (proxy == null || proxy.Credentials == null)) return false; string [] authHeaders = response.Headers.GetValues ( (isProxy) ? "Proxy-Authenticate" : "WWW-Authenticate"); if (authHeaders == null || authHeaders.Length == 0) return false; ICredentials creds = (!isProxy) ? credentials : proxy.Credentials; Authorization auth = null; foreach (string authHeader in authHeaders) { auth = AuthenticationManager.Authenticate (authHeader, this, creds); if (auth != null) break; } if (auth == null) return false; webHeaders [(isProxy) ? "Proxy-Authorization" : "Authorization"] = auth.Message; authCompleted = auth.Complete; bool is_ntlm = (auth.Module.AuthenticationType == "NTLM"); if (is_ntlm) ntlm_auth_state = (NtlmAuthState)((int) ntlm_auth_state + 1); return true; }
internal void Close(bool sendNext) { lock (this) { if (Data != null && Data.request != null && Data.request.ReuseConnection) { Data.request.ReuseConnection = false; return; } if (nstream != null) { try { nstream.Close(); } catch {} nstream = null; } if (socket != null) { try { socket.Close(); } catch {} socket = null; } if (ntlm_authenticated) { ResetNtlm(); } if (Data != null) { lock (Data) { Data.ReadState = ReadState.Aborted; } } state.SetIdle(); Data = new WebConnectionData(); if (sendNext) { SendNext(); } connect_request = null; connect_ntlm_auth_state = NtlmAuthState.None; } }
internal void Close (bool sendNext) { lock (this) { if (Data != null && Data.request != null && Data.request.ReuseConnection) { Data.request.ReuseConnection = false; return; } if (nstream != null) { try { nstream.Close (); } catch {} nstream = null; } if (socket != null) { try { socket.Close (); } catch {} socket = null; } if (ntlm_authenticated) ResetNtlm (); if (Data != null) { lock (Data) { Data.ReadState = ReadState.Aborted; } } state.SetIdle (); Data = new WebConnectionData (); if (sendNext) SendNext (); connect_request = null; connect_ntlm_auth_state = NtlmAuthState.None; } }
internal bool Write (HttpWebRequest request, byte [] buffer, int offset, int size, ref string err_msg) { err_msg = null; Stream s = null; lock (this) { if (Data.request != request) throw new ObjectDisposedException (typeof (NetworkStream).FullName); s = nstream; if (s == null) return false; } try { s.Write (buffer, offset, size); // here SSL handshake should have been done if (ssl && !certsAvailable) GetCertificates (s); } catch (Exception e) { err_msg = e.Message; WebExceptionStatus wes = WebExceptionStatus.SendFailure; string msg = "Write: " + err_msg; if (e is WebException) { HandleError (wes, e, msg); return false; } // if SSL is in use then check for TrustFailure if (ssl) { #if SECURITY_DEP && (MONOTOUCH || MONODROID) HttpsClientStream https = (s as HttpsClientStream); if (https.TrustFailure) { #else if ((bool) piTrustFailure.GetValue (s , null)) { #endif wes = WebExceptionStatus.TrustFailure; msg = "Trust failure"; } } HandleError (wes, e, msg); return false; } return true; } internal void Close (bool sendNext) { lock (this) { if (Data != null && Data.request != null && Data.request.ReuseConnection) { Data.request.ReuseConnection = false; return; } if (nstream != null) { try { nstream.Close (); } catch {} nstream = null; } if (socket != null) { try { socket.Close (); } catch {} socket = null; } if (ntlm_authenticated) ResetNtlm (); if (Data != null) { lock (Data) { Data.ReadState = ReadState.Aborted; } } state.SetIdle (); Data = new WebConnectionData (); if (sendNext) SendNext (); connect_request = null; connect_ntlm_auth_state = NtlmAuthState.None; } } void Abort (object sender, EventArgs args) { lock (this) { lock (queue) { HttpWebRequest req = (HttpWebRequest) sender; if (Data.request == req || Data.request == null) { if (!req.FinishedReading) { status = WebExceptionStatus.RequestCanceled; Close (false); if (queue.Count > 0) { Data.request = (HttpWebRequest) queue.Dequeue (); SendRequest (Data.request); } } return; } req.FinishedReading = true; req.SetResponseError (WebExceptionStatus.RequestCanceled, null, "User aborted"); if (queue.Count > 0 && queue.Peek () == sender) { queue.Dequeue (); } else if (queue.Count > 0) { object [] old = queue.ToArray (); queue.Clear (); for (int i = old.Length - 1; i >= 0; i--) { if (old [i] != sender) queue.Enqueue (old [i]); } } } } }
// Returns true if redirected bool CheckFinalStatus (WebAsyncResult result) { if (result.GotException) { bodyBuffer = null; throw result.Exception; } Exception throwMe = result.Exception; HttpWebResponse resp = result.Response; WebExceptionStatus protoError = WebExceptionStatus.ProtocolError; HttpStatusCode code = 0; if (throwMe == null && webResponse != null) { code = webResponse.StatusCode; if (!authCompleted && ((code == HttpStatusCode.Unauthorized && credentials != null) || (ProxyQuery && code == HttpStatusCode.ProxyAuthenticationRequired))) { if (!usedPreAuth && CheckAuthorization (webResponse, code)) { // Keep the written body, so it can be rewritten in the retry if (InternalAllowBuffering) { // NTLM: This is to avoid sending data in the 'challenge' request // We save it in the first request (first 401), don't send anything // in the challenge request and send it in the response request along // with the buffers kept form the first request. if (ntlm_auth_state != NtlmAuthState.Response) { bodyBuffer = writeStream.WriteBuffer; bodyBufferLength = writeStream.WriteBufferLength; } return true; } else if (method != "PUT" && method != "POST") { bodyBuffer = null; return true; } if (!ThrowOnError) return false; writeStream.InternalClose (); writeStream = null; webResponse.Close (); webResponse = null; bodyBuffer = null; throw new WebException ("This request requires buffering " + "of data for authentication or " + "redirection to be sucessful."); } } bodyBuffer = null; if ((int) code >= 400) { string err = String.Format ("The remote server returned an error: ({0}) {1}.", (int) code, webResponse.StatusDescription); throwMe = new WebException (err, null, protoError, webResponse); webResponse.ReadAll (); } else if ((int) code == 304 && allowAutoRedirect) { string err = String.Format ("The remote server returned an error: ({0}) {1}.", (int) code, webResponse.StatusDescription); throwMe = new WebException (err, null, protoError, webResponse); } else if ((int) code >= 300 && allowAutoRedirect && redirects >= maxAutoRedirect) { throwMe = new WebException ("Max. redirections exceeded.", null, protoError, webResponse); webResponse.ReadAll (); } } bodyBuffer = null; if (throwMe == null) { bool b = false; int c = (int) code; if (allowAutoRedirect && c >= 300) { if (InternalAllowBuffering && writeStream.WriteBufferLength > 0) { bodyBuffer = writeStream.WriteBuffer; bodyBufferLength = writeStream.WriteBufferLength; } b = Redirect (result, code); if (b && ntlm_auth_state != 0) ntlm_auth_state = 0; } if (resp != null && c >= 300 && c != 304) resp.ReadAll (); return b; } if (!ThrowOnError) return false; if (writeStream != null) { writeStream.InternalClose (); writeStream = null; } webResponse = null; throw throwMe; }
bool CheckAuthorization (WebResponse response, HttpStatusCode code) { authCompleted = false; if (code == HttpStatusCode.Unauthorized && credentials == null) return false; bool isProxy = (code == HttpStatusCode.ProxyAuthenticationRequired); if (isProxy && (proxy == null || proxy.Credentials == null)) return false; string [] authHeaders = response.Headers.GetValues_internal ( (isProxy) ? "Proxy-Authenticate" : "WWW-Authenticate", false); if (authHeaders == null || authHeaders.Length == 0) return false; ICredentials creds = (!isProxy) ? credentials : proxy.Credentials; Authorization auth = null; foreach (string authHeader in authHeaders) { auth = AuthenticationManager.Authenticate (authHeader, this, creds); if (auth != null) break; } if (auth == null) return false; webHeaders [(isProxy) ? "Proxy-Authorization" : "Authorization"] = auth.Message; authCompleted = auth.Complete; bool is_ntlm = (auth.Module.AuthenticationType == "NTLM"); if (is_ntlm) ntlm_auth_state = (NtlmAuthState)((int) ntlm_auth_state + 1); return true; }
public void Reset () { isCompleted = false; ntlm_auth_state = NtlmAuthState.None; request.webHeaders.RemoveInternal (isProxy ? "Proxy-Authorization" : "Authorization"); }
public bool CheckAuthorization (WebResponse response, HttpStatusCode code) { isCompleted = false; if (code == HttpStatusCode.Unauthorized && request.credentials == null) return false; // FIXME: This should never happen! if (isProxy != (code == HttpStatusCode.ProxyAuthenticationRequired)) return false; if (isProxy && (request.proxy == null || request.proxy.Credentials == null)) return false; string [] authHeaders = response.Headers.GetValues_internal (isProxy ? "Proxy-Authenticate" : "WWW-Authenticate", false); if (authHeaders == null || authHeaders.Length == 0) return false; ICredentials creds = (!isProxy) ? request.credentials : request.proxy.Credentials; Authorization auth = null; foreach (string authHeader in authHeaders) { auth = AuthenticationManager.Authenticate (authHeader, request, creds); if (auth != null) break; } if (auth == null) return false; request.webHeaders [isProxy ? "Proxy-Authorization" : "Authorization"] = auth.Message; isCompleted = auth.Complete; bool is_ntlm = (auth.Module.AuthenticationType == "NTLM"); if (is_ntlm) ntlm_auth_state = (NtlmAuthState)((int) ntlm_auth_state + 1); return true; }
public AuthorizationState (HttpWebRequest request, bool isProxy) { this.request = request; this.isProxy = isProxy; isCompleted = false; ntlm_auth_state = NtlmAuthState.None; }
internal void Close (bool sendNext) { lock (this) { if (nstream != null) { try { nstream.Close (); } catch {} nstream = null; } if (socket != null) { try { socket.Close (); } catch {} socket = null; } if (ntlm_authenticated) ResetNtlm (); busy = false; Data = new WebConnectionData (); if (sendNext) SendNext (); connect_request = null; connect_ntlm_auth_state = NtlmAuthState.None; } }