}
[Fact]
- public async Task GetStreamAsync_Test()
- {
- using var mockHandler = new HttpMessageHandlerMock();
- using var http = new HttpClient(mockHandler);
- using var apiConnection = new TwitterApiConnection();
- using var image = TestUtils.CreateDummyImage();
- apiConnection.Http = http;
-
- mockHandler.Enqueue(x =>
- {
- Assert.Equal(HttpMethod.Get, x.Method);
- Assert.Equal("https://api.twitter.com/1.1/hoge/tetete.json",
- x.RequestUri.GetLeftPart(UriPartial.Path));
-
- var query = HttpUtility.ParseQueryString(x.RequestUri.Query);
-
- Assert.Equal("1111", query["aaaa"]);
- Assert.Equal("2222", query["bbbb"]);
-
- return new HttpResponseMessage(HttpStatusCode.OK)
- {
- Content = new ByteArrayContent(image.Stream.ToArray()),
- };
- });
-
- var endpoint = new Uri("hoge/tetete.json", UriKind.Relative);
- var param = new Dictionary<string, string>
- {
- ["aaaa"] = "1111",
- ["bbbb"] = "2222",
- };
-
- var stream = await apiConnection.GetStreamAsync(endpoint, param);
-
- using (var memoryStream = new MemoryStream())
- {
- // 内容の比較のために MemoryStream にコピー
- await stream.CopyToAsync(memoryStream);
-
- Assert.Equal(image.Stream.ToArray(), memoryStream.ToArray());
- }
-
- Assert.Equal(0, mockHandler.QueueCount);
- }
-
- [Fact]
public async Task PostLazyAsync_Test()
{
using var mockHandler = new HttpMessageHandlerMock();
{
Task<T> GetAsync<T>(Uri uri, IDictionary<string, string>? param, string? endpointName);
- Task<Stream> GetStreamAsync(Uri uri, IDictionary<string, string>? param);
-
- Task<Stream> GetStreamAsync(Uri uri, IDictionary<string, string>? param, string? endpointName);
-
Task<Stream> GetStreamingStreamAsync(Uri uri, IDictionary<string, string>? param);
Task<LazyJson<T>> PostLazyAsync<T>(Uri uri, IDictionary<string, string>? param);
}
}
- public Task<Stream> GetStreamAsync(Uri uri, IDictionary<string, string>? param)
- => this.GetStreamAsync(uri, param, null);
-
- public async Task<Stream> GetStreamAsync(Uri uri, IDictionary<string, string>? param, string? endpointName)
- {
- // レートリミット規制中はAPIリクエストを送信せずに直ちにエラーを発生させる
- if (endpointName != null)
- this.ThrowIfRateLimitExceeded(endpointName);
-
- var requestUri = new Uri(RestApiBase, uri);
-
- if (param != null)
- requestUri = new Uri(requestUri, "?" + MyCommon.BuildQueryString(param));
-
- try
- {
- var response = await this.Http.GetAsync(requestUri)
- .ConfigureAwait(false);
-
- if (endpointName != null)
- MyCommon.TwitterApiInfo.UpdateFromHeader(response.Headers, endpointName);
-
- await TwitterApiConnection.CheckStatusCode(response)
- .ConfigureAwait(false);
-
- return await response.Content.ReadAsStreamAsync()
- .ConfigureAwait(false);
- }
- catch (HttpRequestException ex)
- {
- throw TwitterApiException.CreateFromException(ex);
- }
- catch (OperationCanceledException ex)
- {
- throw TwitterApiException.CreateFromException(ex);
- }
- }
-
public async Task<Stream> GetStreamingStreamAsync(Uri uri, IDictionary<string, string>? param)
{
var requestUri = new Uri(RestApiBase, uri);
return true;
}
- if (ex is TaskCanceledException cancelEx)
- {
- // ton.twitter.com の画像でタイムアウトした場合、try-catch で例外がキャッチできない
- // https://osdn.net/ticket/browse.php?group_id=6526&tid=37433
- var stackTrace = new StackTrace(cancelEx);
- var lastFrameMethod = stackTrace.GetFrame(stackTrace.FrameCount - 1).GetMethod();
- var matchClass = lastFrameMethod.ReflectedType == typeof(TwitterApiConnection);
- var matchMethod = lastFrameMethod.Name == nameof(TwitterApiConnection.GetStreamAsync);
- if (matchClass && matchMethod)
- return true;
- }
-
return false;
}
}