Skip to content

Commit

Permalink
Reject unexpected SSE types.
Browse files Browse the repository at this point in the history
  • Loading branch information
ejball committed Jul 3, 2024
1 parent 097836d commit 678e75b
Showing 1 changed file with 25 additions and 17 deletions.
42 changes: 25 additions & 17 deletions src/Facility.Core/Http/HttpClientService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -267,33 +267,41 @@ private async IAsyncEnumerable<ServiceResult<TResponse>> CreateAsyncEnumerable<T
if (!await enumerator.MoveNextAsync().ConfigureAwait(false))
break;

var sseEvent = enumerator.Current;
var isError = sseEvent.EventType == "error";
var type = isError ? typeof(ServiceErrorDto) : responseMapping.ResponseBodyType!;
using var content = new StringContent(sseEvent.Data, Encoding.UTF8, HttpServiceUtility.JsonMediaType);
var responseResult = await contentSerializer.ReadHttpContentAsync(type, content, cancellationToken).ConfigureAwait(false);
if (responseResult.IsFailure)
var sseItem = enumerator.Current;
var isError = sseItem.EventType == "error";
if (!isError && sseItem.EventType != SseParser.EventTypeDefault)
{
var error = responseResult.Error!;
error.Code = ServiceErrors.InvalidResponse;
nextResult = ServiceResult.Failure(error);
nextResult = ServiceResult.Failure(ServiceErrors.CreateInternalError("Unexpected event type: " + sseItem.EventType));
stopStream = true;
}
else if (isError)
{
nextResult = ServiceResult.Failure((ServiceErrorDto) responseResult.Value);
}
else
{
var response = responseMapping.CreateResponse(responseResult.Value);
if (!skipResponseValidation && !response.Validate(out var responseErrorMessage))
var type = isError ? typeof(ServiceErrorDto) : responseMapping.ResponseBodyType!;
using var content = new StringContent(sseItem.Data, Encoding.UTF8, HttpServiceUtility.JsonMediaType);
var responseResult = await contentSerializer.ReadHttpContentAsync(type, content, cancellationToken).ConfigureAwait(false);
if (responseResult.IsFailure)
{
nextResult = ServiceResult.Failure(ServiceErrors.CreateInvalidResponse(responseErrorMessage));
var error = responseResult.Error!;
error.Code = ServiceErrors.InvalidResponse;
nextResult = ServiceResult.Failure(error);
stopStream = true;
}
else if (isError)
{
nextResult = ServiceResult.Failure((ServiceErrorDto) responseResult.Value);
}
else
{
nextResult = ServiceResult.Success((TResponse) responseResult.Value);
var response = responseMapping.CreateResponse(responseResult.Value);
if (!skipResponseValidation && !response.Validate(out var responseErrorMessage))
{
nextResult = ServiceResult.Failure(ServiceErrors.CreateInvalidResponse(responseErrorMessage));
stopStream = true;
}
else
{
nextResult = ServiceResult.Success((TResponse) responseResult.Value);
}
}
}
}
Expand Down

0 comments on commit 678e75b

Please sign in to comment.