Skip to content

Commit 03c537f

Browse files
committed
formatter changes
1 parent b27ecac commit 03c537f

2 files changed

Lines changed: 42 additions & 62 deletions

File tree

src/PartialResponse.AspNetCore.Mvc.Formatters.Json/Internal/PartialJsonResultExecutor.cs

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -129,45 +129,41 @@ public Task ExecuteAsync(ActionContext context, PartialJsonResult result)
129129
jsonWriter.CloseOutput = false;
130130

131131
var jsonSerializer = JsonSerializer.Create(serializerSettings);
132-
var fields = GetPartialResponseFields(context.HttpContext.Request);
132+
var request = context.HttpContext.Request;
133133

134-
if (fields == null)
134+
if (request.Query.ContainsKey("fields"))
135135
{
136-
jsonSerializer.Serialize(jsonWriter, result.Value);
136+
Fields fields;
137+
138+
if (!this.TryGetFields(request, out fields))
139+
{
140+
response.StatusCode = 400;
141+
142+
return TaskCache.CompletedTask;
143+
}
144+
145+
PartialJsonUtilities.RemovePropertiesAndArrayElements(result.Value, jsonWriter, jsonSerializer, value => fields.Matches(value));
137146
}
138147
else
139148
{
140-
PartialJsonUtilities.RemovePropertiesAndArrayElements(result.Value, jsonWriter, jsonSerializer, value => fields.Matches(value));
149+
jsonSerializer.Serialize(jsonWriter, result.Value);
141150
}
142151
}
143152
}
144153

145154
return TaskCache.CompletedTask;
146155
}
147156

148-
private Fields GetPartialResponseFields(HttpRequest request)
157+
private bool TryGetFields(HttpRequest request, out Fields fields)
149158
{
150-
if (request == null)
151-
{
152-
throw new ArgumentNullException("request");
153-
}
159+
var queryOption = request.Query["fields"].First();
154160

155-
var queryOption = request.Query["fields"].FirstOrDefault();
156-
157-
if (queryOption != null)
161+
if (!Fields.TryParse(queryOption, out fields))
158162
{
159-
Fields fields;
160-
161-
if (!Fields.TryParse(queryOption, out fields))
162-
{
163-
// TODO: No more HttpResponseException in ASP.NET Core.
164-
throw new Exception();
165-
}
166-
167-
return fields;
163+
return false;
168164
}
169165

170-
return null;
166+
return true;
171167
}
172168
}
173169
}

src/PartialResponse.AspNetCore.Mvc.Formatters.Json/PartialJsonOutputFormatter.cs

Lines changed: 24 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -99,37 +99,6 @@ protected virtual JsonSerializer CreateJsonSerializer()
9999
return _serializer;
100100
}
101101

102-
/// <summary>
103-
/// Gets a list of partial response fields for the current request.
104-
/// </summary>
105-
/// <param name="request">The request.</param>
106-
/// <returns>A <see cref="System.Collections.ObjectModel.Collection{string}"/> that contains the specified fields for the
107-
/// current request, or null if all fields should by serialized.</returns>
108-
protected virtual Fields GetPartialResponseFields(HttpRequest request)
109-
{
110-
if (request == null)
111-
{
112-
throw new ArgumentNullException("request");
113-
}
114-
115-
var queryOption = request.Query["fields"].FirstOrDefault();
116-
117-
if (queryOption != null)
118-
{
119-
Fields fields;
120-
121-
if (!Fields.TryParse(queryOption, out fields))
122-
{
123-
// TODO: No more HttpResponseException in ASP.NET Core.
124-
throw new Exception();
125-
}
126-
127-
return fields;
128-
}
129-
130-
return null;
131-
}
132-
133102
/// <summary>
134103
/// Returns a value that indicates whether partial response should be bypassed.
135104
/// </summary>
@@ -174,21 +143,24 @@ public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext co
174143
using (var jsonWriter = CreateJsonWriter(writer))
175144
{
176145
var jsonSerializer = CreateJsonSerializer();
146+
var request = context.HttpContext.Request;
177147

178-
Fields fields = null;
179-
180-
if (!ShouldBypassPartialResponse(context.HttpContext.Request))
148+
if (!ShouldBypassPartialResponse(request) && request.Query.ContainsKey("fields"))
181149
{
182-
fields = GetPartialResponseFields(context.HttpContext.Request);
183-
}
150+
Fields fields;
184151

185-
if (fields == null)
186-
{
187-
jsonSerializer.Serialize(jsonWriter, context.Object);
152+
if (!this.TryGetFields(request, out fields))
153+
{
154+
response.StatusCode = 400;
155+
156+
await writer.FlushAsync();
157+
}
158+
159+
PartialJsonUtilities.RemovePropertiesAndArrayElements(context.Object, jsonWriter, jsonSerializer, value => fields.Matches(value));
188160
}
189161
else
190162
{
191-
PartialJsonUtilities.RemovePropertiesAndArrayElements(context.Object, jsonWriter, jsonSerializer, value => fields.Matches(value));
163+
jsonSerializer.Serialize(jsonWriter, context.Object);
192164
}
193165
}
194166

@@ -198,5 +170,17 @@ public override async Task WriteResponseBodyAsync(OutputFormatterWriteContext co
198170
await writer.FlushAsync();
199171
}
200172
}
173+
174+
private bool TryGetFields(HttpRequest request, out Fields fields)
175+
{
176+
var queryOption = request.Query["fields"].First();
177+
178+
if (!Fields.TryParse(queryOption, out fields))
179+
{
180+
return false;
181+
}
182+
183+
return true;
184+
}
201185
}
202186
}

0 commit comments

Comments
 (0)