public void MakeRequest(MvxRestRequest restRequest, Action<MvxRestResponse> successAction, Action<Exception> errorAction) { TryCatch(() => { var httpRequest = BuildHttpRequest(restRequest); Action processResponse = () => ProcessResponse(restRequest, httpRequest, successAction, errorAction); if (restRequest.NeedsRequestStream) { ProcessRequestThen(restRequest, httpRequest, processResponse, errorAction); } else { processResponse(); } }, errorAction); }
protected virtual void ProcessRequestThen( MvxRestRequest restRequest, HttpWebRequest httpRequest, Action continueAction, Action<Exception> errorAction) { httpRequest.BeginGetRequestStream(result => TryCatch(() => { using (var stream = httpRequest.EndGetRequestStream(result)) { restRequest.ProcessRequestStream(stream); stream.Flush(); } continueAction(); }, errorAction) , null); }
protected virtual void ProcessResponse( MvxRestRequest restRequest, HttpWebRequest httpRequest, Action<MvxStreamRestResponse> successAction, Action<Exception> errorAction) { httpRequest.BeginGetResponse(result => TryCatch(() => { var response = (HttpWebResponse) httpRequest.EndGetResponse(result); var code = response.StatusCode; using (var responseStream = response.GetResponseStream()) { var restResponse = new MvxStreamRestResponse { CookieCollection = response.Cookies, Stream = responseStream, Tag = restRequest.Tag, StatusCode = code }; successAction(restResponse); } }, errorAction) , null); }
protected virtual async Task<MvxTextRestResponse> ProcessResponseTextAsync(MvxRestRequest restRequest, HttpWebRequest httpRequest, CancellationToken ct) { var task = Task.Factory.FromAsync( (cb, o) => ((HttpWebRequest)o).BeginGetResponse(cb, o), res => (HttpWebResponse)((HttpWebRequest)res.AsyncState).EndGetResponse(res), httpRequest, hr => hr.Abort(), ct); try { var response = await task.ConfigureAwait(false); var code = response.StatusCode; using (var responseStream = response.GetResponseStream()) using (var textReader = new StreamReader(responseStream)) { var restResponse = new MvxTextRestResponse { CookieCollection = response.Cookies, Tag = restRequest.Tag, StatusCode = code, Text = textReader.ReadToEnd() }; return restResponse; }; } catch (Exception ex) { Mvx.Trace(Cirrious.CrossCore.Platform.MvxTraceLevel.Error, ex.Message); throw; } }
protected virtual async Task<MvxRestResponse> ProcessResponseAsync(MvxRestRequest restRequest, HttpWebRequest httpRequest, CancellationToken ct) { var task = Task.Factory.FromAsync( (cb, o) => ((HttpWebRequest)o).BeginGetResponse(cb, o), res => (HttpWebResponse)((HttpWebRequest)res.AsyncState).EndGetResponse(res), httpRequest, hr => hr.Abort(), ct); var response = await task.ConfigureAwait(false); var code = response.StatusCode; var restResponse = new MvxRestResponse { CookieCollection = response.Cookies, Tag = restRequest.Tag, StatusCode = code }; return restResponse; }
protected virtual void SetPlatformSpecificProperties(MvxRestRequest restRequest, HttpWebRequest httpRequest) { // do nothing by default }
protected virtual HttpWebRequest CreateHttpWebRequest(MvxRestRequest restRequest) { return (HttpWebRequest) WebRequest.Create(restRequest.Uri); }
private async Task AddContentIfNeededAsync(HttpWebRequest httpRequest, MvxRestRequest restRequest, CancellationToken ct) { if (restRequest.NeedsRequestStream) { var task = Task.Factory.FromAsync( (cb, o) => ((HttpWebRequest)o).BeginGetRequestStream(cb, o), res => (Stream)((HttpWebRequest)res.AsyncState).EndGetRequestStream(res), httpRequest, hr => hr.Abort(), ct); using (Stream stream = await task.ConfigureAwait(false)) { restRequest.ProcessRequestStream(stream); stream.Flush(); } } }
protected virtual void SetContentType(MvxRestRequest restRequest, HttpWebRequest httpRequest) { if (!string.IsNullOrEmpty(restRequest.ContentType)) { httpRequest.ContentType = restRequest.ContentType; } }
protected virtual void SetUserAgent(MvxRestRequest restRequest, HttpWebRequest httpRequest) { if (!string.IsNullOrEmpty(restRequest.UserAgent)) { httpRequest.Headers["user-agent"] = restRequest.UserAgent; } }
protected virtual void SetAccept(MvxRestRequest restRequest, HttpWebRequest httpRequest) { if (!string.IsNullOrEmpty(restRequest.Accept)) { httpRequest.Accept = restRequest.Accept; } }
protected virtual void SetCookieContainer(MvxRestRequest restRequest, HttpWebRequest httpRequest) { // note that we don't call // httpRequest.SupportsCookieContainer // here - this is because Android complained about this... try { if (restRequest.CookieContainer != null) { httpRequest.CookieContainer = restRequest.CookieContainer; } } catch (Exception exception) { Mvx.Warning("Error masked during Rest call - cookie creation - {0}", exception.ToLongString()); } }
protected virtual void SetCredentials(MvxRestRequest restRequest, HttpWebRequest httpRequest) { if (restRequest.Credentials != null) { httpRequest.Credentials = restRequest.Credentials; } }
private static void SetCustomHeaders(MvxRestRequest restRequest, HttpWebRequest httpRequest) { if (restRequest.Headers != null) { foreach (var kvp in restRequest.Headers) { httpRequest.Headers[kvp.Key] = kvp.Value; } } }
protected virtual HttpWebRequest BuildHttpRequest(MvxRestRequest restRequest) { var httpRequest = CreateHttpWebRequest(restRequest); SetMethod(restRequest, httpRequest); SetContentType(restRequest, httpRequest); SetUserAgent(restRequest, httpRequest); SetAccept(restRequest, httpRequest); SetCookieContainer(restRequest, httpRequest); SetCredentials(restRequest, httpRequest); SetCustomHeaders(restRequest, httpRequest); SetPlatformSpecificProperties(restRequest, httpRequest); return httpRequest; }
protected virtual void SetMethod(MvxRestRequest restRequest, HttpWebRequest httpRequest) { httpRequest.Method = restRequest.Verb; }
public async Task<MvxRestResponse> MakeRequestAsync(MvxRestRequest restRequest, CancellationToken ct) { var httpRequest = BuildHttpRequest(restRequest); await AddContentIfNeededAsync(httpRequest, restRequest, ct); return await ProcessResponseAsync(restRequest, httpRequest, ct); }
public async Task<MvxTextRestResponse> MakeRequestTextAsync(MvxRestRequest restRequest, CancellationToken ct) { HttpWebRequest httpRequest = BuildHttpRequest(restRequest); await AddContentIfNeededAsync(httpRequest, restRequest, ct); return await ProcessResponseTextAsync(restRequest, httpRequest, ct).ConfigureAwait(false); }