Example #1
0
        public string GetResponse(string uri, string data = "", RequestMethods method = RequestMethods.GET)
        {
            System.Diagnostics.Trace.WriteLine(uri);

            // create request
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.PreAuthenticate = true;
            request.Method = method.ToString().ToUpper();
            request.ContentType = "application/x-www-form-urlencoded";

            // log in
            string authInfo = API_KEY + ":" + ""; // blank password
            authInfo = Convert.ToBase64String(Encoding.Default.GetBytes(authInfo));
            request.Headers["Authorization"] = "Basic " + authInfo;

            // send data
            if (data != "")
            {
                byte[] paramBytes = Encoding.ASCII.GetBytes(data);
                request.ContentLength = paramBytes.Length;
                Stream reqStream = request.GetRequestStream();
                reqStream.Write(paramBytes, 0, paramBytes.Length);
                reqStream.Close();
            }

            // get response
            try
            {
                HttpWebResponse response = (HttpWebResponse)request.GetResponse();
                return new StreamReader(response.GetResponseStream()).ReadToEnd();
            }
            catch (WebException ex)
            {
                HttpWebResponse response = ((HttpWebResponse)ex.Response);
                throw new Exception(uri + " caused a " + (int)response.StatusCode + " error.\n" + response.StatusDescription);
            }
        }
        /// <summary>
        /// Perform generic API calling
        /// </summary>
        /// <param name="methodURL">IssueTracker method URL</param>
        /// <param name="data">Generic data</param>
        /// <param name="attachments">List of file paths (optional)</param>
        /// <param name="update">flag to indicate if this is a  PUT operation</param>
        /// <returns>the JSON string returned from server</returns>
        private string api(string methodURL, RequestMethods request_method,
            List<KeyValuePair<string, string>> data = null, List<string> attachments = null)
        {
            string url = baseURL + methodURL;
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Headers.Add("Authorization: Basic " + auth);
            request.Method = request_method.ToString();

            if (data != null || attachments != null)
            {
                byte[] formData = null;

                if (attachments == null)
                {
                    request.ContentType = "application/x-www-form-urlencoded";

                    var postParams = new List<string>();

                    foreach (KeyValuePair<string, string> item in data)
                    {
                        postParams.Add(String.Format("{0}={1}", item.Key, Uri.EscapeUriString(item.Value)));
                    }

                    string postQuery = String.Join("&", postParams.ToArray());
                    formData = Encoding.UTF8.GetBytes(postQuery);
                    request.ContentLength = formData.Length;

                    using (var requestStream = request.GetRequestStream())
                    {
                        requestStream.Write(formData, 0, formData.Length);
                        requestStream.Flush();
                    }
                }
                else
                {
                    var boundary = "------------------------" + DateTime.Now.Ticks;
                    var newLine = Environment.NewLine;

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

                    using (var requestStream = request.GetRequestStream())
                    {
                        #region Stream data to request

                        var fieldTemplate = newLine + "--" + boundary + newLine + "Content-Type: text/plain" +
                            newLine + "Content-Disposition: form-data;name=\"{0}\"" + newLine + newLine + "{1}";

                        var fieldData = "";

                        foreach (KeyValuePair<string, string> item in data)
                        {
                            fieldData += String.Format(fieldTemplate, item.Key, item.Value);
                        }

                        var fieldBytes = Encoding.UTF8.GetBytes(fieldData);
                        requestStream.Write(fieldBytes, 0, fieldBytes.Length);

                        #endregion

                        #region Stream files to request

                        var fileInfoTemplate = newLine + "--" + boundary + newLine + "Content-Disposition: filename=\"{0}\"" +
                            newLine + "Content-Type: {1}" + newLine + newLine;

                        foreach (var path in attachments)
                        {
                            using (var reader = new BinaryReader(File.OpenRead(path)))
                            {
                                #region Stream file info

                                var fileName = Path.GetFileName(path);
                                var fileInfoData = String.Format(fileInfoTemplate, fileName, getMimeType(fileName));
                                var fileInfoBytes = Encoding.UTF8.GetBytes(fileInfoData);

                                requestStream.Write(fileInfoBytes, 0, fileInfoBytes.Length);

                                #endregion

                                #region Stream file

                                using (var fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
                                {
                                    byte[] buffer = new byte[4096];
                                    var fileBytesRead = 0;

                                    while ((fileBytesRead = fileStream.Read(buffer, 0, buffer.Length)) != 0)
                                    {
                                        requestStream.Write(buffer, 0, fileBytesRead);
                                    }
                                }

                                #endregion
                            }
                        }

                        var trailer = Encoding.ASCII.GetBytes(newLine + "--" + boundary + "--");
                        requestStream.Write(trailer, 0, trailer.Length);

                        #endregion
                    }
                }
            }

            try
            {
                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                {
                    using (Stream responseStream = response.GetResponseStream())
                    {
                        using (StreamReader reader = new StreamReader(responseStream))
                        {
                            return reader.ReadToEnd();
                        }
                    }
                }
            }
            catch (WebException wex)
            {
                var response = (HttpWebResponse)wex.Response;

                string message = "An API error occurred.";

                if (response == null)
                {
                    throw new APIException(message, null);
                }

                var code = response.StatusCode;

                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader reader = new StreamReader(responseStream))
                    {
                        message = reader.ReadToEnd();
                    }
                }

                throw new APIException(message, response);
            }
            catch (Exception e)
            {
                return e.Message;
            }
        }