Exemple #1
0
 private void HandleNoConnectivity()
 {
     //If there's no internet connection
     ErrorHandler?.Invoke(new WebException("No internet connection"));
     NoInternetConnectionHandler?.Invoke();
     RequestCompletedHandler?.Invoke();
 }
Exemple #2
0
        private void HandleWebExceptionError(WebException e)
        {
            var response = (HttpWebResponse)e.Response;

            if (!response.StatusCode.Equals(HttpStatusCode.OK))
            {
                ErrorHandler?.Invoke(e);
                HttpErrorHandler?.Invoke(response.StatusCode);
                switch (response.StatusCode)
                {
                case HttpStatusCode.BadRequest:
                    BadRequestErrorHandler?.Invoke();
                    break;

                case HttpStatusCode.InternalServerError:
                    InternalServerErrorHandler?.Invoke();
                    break;

                case HttpStatusCode.RequestTimeout:
                    TimeOutHandler?.Invoke();
                    break;

                case HttpStatusCode.NotFound:
                    NotFoundHandler?.Invoke();
                    break;

                case HttpStatusCode.Unauthorized:
                    UnauthorizeHandler?.Invoke();
                    break;
                }
            }

            RequestCompletedHandler?.Invoke();
        }
        /// <summary>
        /// Create a new request parser
        /// </summary>
        /// <param name="requestCompleted">delegate called when a complete request have been generated</param>
        /// <param name="logWriter">delegate receiving log entries.</param>
        public HttpRequestParser(RequestCompletedHandler requestCompleted, ILogWriter logWriter)
        {
            if (requestCompleted == null)
                throw new ArgumentNullException("requestCompleted");

            _log = logWriter ?? NullLogWriter.Instance;
            RequestCompleted = requestCompleted;
        }
Exemple #4
0
        /// <summary>
        ///     Makes a request and deserializes the result JSON as T class objects.
        ///     Check https://forums.xamarin.com/discussion/22732/3-pcl-rest-functions-post-get-multipart
        /// </summary>
        /// <param name="method">The http method can be "GET", "POST", "PUT" or "DELETE"</param>
        /// <param name="endpoint">The endpoint name i.e. "/api/v1/feed"</param>
        /// <param name="body">If the method is GET, the query string URI to set in the URL. Otherwise the json body.</param>
        /// <param name="authToken">The AUTH_TOKEN cookie.</param>
        private async Task MakeRequest(string method, string endpoint, string body, string authToken = null)
        {
#if DEBUG
            Debug.WriteLine("Hitting: " + endpoint);
            Debug.WriteLine("Body payload: " + body);
#endif

            RequestStartedHandler?.Invoke();
            if (!CrossConnectivity.Current.IsConnected)
            {
                HandleNoConnectivity();
                return;
            }

            try
            {
                //If the method is GET we've to concat the query string uri, i.e. "/feeds" + "?id=something"
                if (method.Equals(HttpMethod.Get.Method) && !string.IsNullOrEmpty(body))
                {
                    endpoint += body;
                }
                var request = (HttpWebRequest)WebRequest.Create(new Uri(endpoint));
                SetHeaders(request);
                request.Method = method;
                if (!string.IsNullOrEmpty(authToken))
                {
                    request.Headers["Cookie"] = authToken;
                }

                if (method.Equals(HttpMethod.Post.Method) || method.Equals(HttpMethod.Put.Method))
                {
                    if (!string.IsNullOrEmpty(body))
                    {
                        var requestStream = await request.GetRequestStreamAsync();

                        using (var writer = new StreamWriter(requestStream))
                        {
                            writer.Write(body);
                            writer.Flush();
                            writer.Dispose();
                        }
                    }

                    if (string.IsNullOrWhiteSpace(_filePath) == false && File.Exists(_filePath))
                    {
                        //  Post Multi-part data
                        var fileStream = File.Open(_filePath, FileMode.Open, FileAccess.Read);
                        //  Expected
                        //  Header
                        //  Content-Length: 18101
                        //  Content-Type: multipart/form-data; boundary = ---------------------------13455211745882
                        //  Cookie: AUTH-TOKEN=eyJhbGciOiJIUz
                        //  Body
                        //  -----------------------------13455211745882
                        //  Content-Disposition: form-data; name="file"; filename="Feed List View.png"
                        //  Content-Type: image/png
                        //  Byte body
                        //  -----------------------------13455211745882--

                        var boundary = "---------------------------" + DateTime.Now.Ticks.ToString("x");

                        request.ContentType = "multipart/form-data; boundary=" + boundary;

                        request.Credentials = CredentialCache.DefaultCredentials;

                        var requestStream = await request.GetRequestStreamAsync();

                        var headerTemplate =
                            "--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}\"\r\nContent-Type: {3}\r\n\r\n";

                        var header = string.Format(headerTemplate, boundary, _fileParameterName, _fileName,
                                                   _fileContentType);

                        Debug.WriteLine(header);

                        var headerbytes = Encoding.UTF8.GetBytes(header);

                        using (var requestStreamWriter = new BinaryWriter(requestStream))
                        {
                            requestStreamWriter.Write(headerbytes, 0, headerbytes.Length);

                            var fileByteStream = ReadFully(fileStream);
                            Debug.WriteLine("Bytes read:" + fileByteStream.Length);
                            requestStreamWriter.Write(fileByteStream, 0, fileByteStream.Length);

                            var trailer = Encoding.UTF8.GetBytes("\r\n--" + boundary + "--");
                            requestStreamWriter.Write(trailer, 0, trailer.Length);

                            Debug.WriteLine("(Using) Request ContentType: " + request.ContentType);
                        }
                    }
                }

                Debug.WriteLine("Request ContentType: " + request.ContentType);

                var response = (HttpWebResponse)await request.GetResponseAsync();

                Debug.WriteLine("Response Content-Lenght: " + response.ContentLength);

                HeaderResultHandler?.Invoke(response.Headers);
                var respStream = response.GetResponseStream();

                using (var sr = new StreamReader(respStream))
                {
                    //Need to return this response
                    var stringResponse = sr.ReadToEnd();
                    Debug.WriteLine("Json response: " + stringResponse);
                    var result = JsonConvert.DeserializeObject <T>(stringResponse);
                    SuccessHandler?.Invoke(result);
                    RequestCompletedHandler?.Invoke();
                }
            }
            catch (WebException e)
            {
                if (e.Response == null)
                {
                    HandleUnknownError(new Exception("Null response"));
                    return;
                }

#if DEBUG
                using (var stream = e.Response.GetResponseStream())
                    using (var reader = new StreamReader(stream))
                    {
                        Debug.WriteLine("Server-side error:" + reader.ReadToEnd());
                    }
#endif
                HandleWebExceptionError(e);
            }
            catch (JsonSerializationException e)
            {
                HandleJsonError(e);
            }
            catch (Exception e)
            {
                HandleUnknownError(e);
            }
        }
Exemple #5
0
 private void HandleUnknownError(Exception e)
 {
     UnknownErrorHandler?.Invoke(e);
     ErrorHandler?.Invoke(e);
     RequestCompletedHandler?.Invoke();
 }