OSDN Git Service

/direct_messages/events/destroy.json によるDMの削除に対応
[opentween/open-tween.git] / OpenTween / Connection / TwitterApiConnection.cs
index b8dc482..b8b015f 100644 (file)
@@ -153,7 +153,14 @@ namespace OpenTween.Connection
 
             try
             {
-                return await this.httpStreaming.GetStreamAsync(requestUri)
+                var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
+                var response = await this.httpStreaming.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
+                    .ConfigureAwait(false);
+
+                await this.CheckStatusCode(response)
+                    .ConfigureAwait(false);
+
+                return await response.Content.ReadAsStreamAsync()
                     .ConfigureAwait(false);
             }
             catch (HttpRequestException ex)
@@ -253,6 +260,46 @@ namespace OpenTween.Connection
             }
         }
 
+        public async Task PostAsync(Uri uri, IDictionary<string, string> param, IDictionary<string, IMediaItem> media)
+        {
+            var requestUri = new Uri(RestApiBase, uri);
+            var request = new HttpRequestMessage(HttpMethod.Post, requestUri);
+
+            using (var postContent = new MultipartFormDataContent())
+            {
+                if (param != null)
+                {
+                    foreach (var (key, value) in param)
+                        postContent.Add(new StringContent(value), key);
+                }
+                if (media != null)
+                {
+                    foreach (var (key, value) in media)
+                        postContent.Add(new StreamContent(value.OpenRead()), key, value.Name);
+                }
+
+                request.Content = postContent;
+
+                try
+                {
+                    using (var response = await this.httpUpload.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
+                        .ConfigureAwait(false))
+                    {
+                        await this.CheckStatusCode(response)
+                            .ConfigureAwait(false);
+                    }
+                }
+                catch (HttpRequestException ex)
+                {
+                    throw TwitterApiException.CreateFromException(ex);
+                }
+                catch (OperationCanceledException ex)
+                {
+                    throw TwitterApiException.CreateFromException(ex);
+                }
+            }
+        }
+
         public async Task PostJsonAsync(Uri uri, string json)
         {
             var requestUri = new Uri(RestApiBase, uri);
@@ -282,10 +329,40 @@ namespace OpenTween.Connection
             }
         }
 
+        public async Task DeleteAsync(Uri uri, IDictionary<string, string> param)
+        {
+            var requestUri = new Uri(RestApiBase, uri);
+            var request = new HttpRequestMessage(HttpMethod.Delete, requestUri);
+
+            using (var postContent = new FormUrlEncodedContent(param))
+            {
+                request.Content = postContent;
+
+                try
+                {
+                    using (var response = await this.http.SendAsync(request, HttpCompletionOption.ResponseHeadersRead)
+                        .ConfigureAwait(false))
+                    {
+                        await this.CheckStatusCode(response)
+                            .ConfigureAwait(false);
+                    }
+                }
+                catch (HttpRequestException ex)
+                {
+                    throw TwitterApiException.CreateFromException(ex);
+                }
+                catch (OperationCanceledException ex)
+                {
+                    throw TwitterApiException.CreateFromException(ex);
+                }
+            }
+        }
+
         protected async Task CheckStatusCode(HttpResponseMessage response)
         {
             var statusCode = response.StatusCode;
-            if (statusCode == HttpStatusCode.OK)
+
+            if ((int)statusCode >= 200 && (int)statusCode <= 299)
             {
                 Twitter.AccountState = MyCommon.ACCOUNT_STATE.Valid;
                 return;
@@ -319,7 +396,7 @@ namespace OpenTween.Connection
                     Twitter.AccountState = MyCommon.ACCOUNT_STATE.Invalid;
                 }
 
-                throw new TwitterApiException(error, responseText);
+                throw new TwitterApiException(statusCode, error, responseText);
             }
             catch (SerializationException)
             {