Skip to content

Commit 1044221

Browse files
Clear up error cases
1 parent 96eb306 commit 1044221

File tree

4 files changed

+26
-30
lines changed

4 files changed

+26
-30
lines changed

src/Components/Endpoints/src/RazorComponentEndpointInvoker.cs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@
33

44
using System.Buffers;
55
using System.Diagnostics;
6-
using System.Diagnostics.CodeAnalysis;
76
using System.Text;
87
using System.Text.Encodings.Web;
98
using Microsoft.AspNetCore.Antiforgery;
109
using Microsoft.AspNetCore.Antiforgery.Infrastructure;
1110
using Microsoft.AspNetCore.Http;
1211
using Microsoft.AspNetCore.WebUtilities;
1312
using Microsoft.Extensions.DependencyInjection;
13+
using Microsoft.Extensions.Hosting;
1414

1515
namespace Microsoft.AspNetCore.Components.Endpoints;
1616

@@ -110,32 +110,38 @@ private async Task<RequestValidationState> ValidateRequestAsync(IAntiforgery? an
110110
if (!valid)
111111
{
112112
_context.Response.StatusCode = StatusCodes.Status400BadRequest;
113+
114+
if (_context.RequestServices.GetService<IHostEnvironment>()?.IsDevelopment() == true)
115+
{
116+
await _context.Response.WriteAsync("A valid antiforgery token was not provided with the request. Add an antiforgery token, or disable antiforgery validation for this endpoint.");
117+
}
113118
}
114-
var formValid = TryGetFormHandler(out var handler);
115-
return new(valid && formValid, isPost, handler);
119+
120+
var handler = GetFormHandler(out var isBadRequest);
121+
return new(valid && !isBadRequest, isPost, handler);
116122
}
117123

118124
return new(true, false, null);
119125
}
120126

121-
private bool TryGetFormHandler([NotNullWhen(true)] out string? handler)
127+
private string? GetFormHandler(out bool isBadRequest)
122128
{
123-
handler = "";
129+
isBadRequest = false;
130+
124131
if (_context.Request.Form.TryGetValue("handler", out var value))
125132
{
126133
if (value.Count != 1)
127134
{
128135
_context.Response.StatusCode = StatusCodes.Status400BadRequest;
129-
handler = null;
130-
return false;
136+
isBadRequest = true;
131137
}
132138
else
133139
{
134-
handler = value[0]!;
140+
return value[0]!;
135141
}
136142
}
137143

138-
return true;
144+
return null;
139145
}
140146

141147
private static TextWriter CreateResponseWriter(Stream bodyStream)

src/Components/Endpoints/src/Rendering/EndpointHtmlRenderer.EventDispatch.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,9 @@ internal Task DispatchSubmitEventAsync(string? handlerName)
3030
}
3131

3232
var eventHandlerId = FindEventHandlerIdForNamedEvent("onsubmit", frameLocation.ComponentId, frameLocation.FrameIndex);
33-
return DispatchEventAsync(eventHandlerId, null, EventArgs.Empty, quiesce: true);
33+
return eventHandlerId.HasValue
34+
? DispatchEventAsync(eventHandlerId.Value, null, EventArgs.Empty, quiesce: true)
35+
: Task.CompletedTask;
3436
}
3537

3638
private void UpdateNamedEvents(in RenderBatch renderBatch)
@@ -81,7 +83,7 @@ private void UpdateNamedEvents(in RenderBatch renderBatch)
8183
}
8284
}
8385

84-
private ulong FindEventHandlerIdForNamedEvent(string eventType, int componentId, int frameIndex)
86+
private ulong? FindEventHandlerIdForNamedEvent(string eventType, int componentId, int frameIndex)
8587
{
8688
var frames = GetCurrentRenderTreeFrames(componentId);
8789
ref var frame = ref frames.Array[frameIndex];
@@ -114,8 +116,8 @@ private ulong FindEventHandlerIdForNamedEvent(string eventType, int componentId,
114116
}
115117
}
116118

117-
// This won't be possible if the Razor compiler requires @onsubmit:name to be used only when there's an @onsubmit.
118-
throw new InvalidOperationException($"The event named '{frame.NamedEventAssignedName}' in component {componentId} at index {frameIndex} does not match a preceding event handler.");
119+
// No match found
120+
return default;
119121
}
120122

121123
private string GenerateComponentPath(int componentId)

src/Components/Web/src/Forms/EditForm.cs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
144144
{
145145
var combinedFormName = MappingContext.GetCombinedFormName(FormHandlerName) ?? string.Empty;
146146
builder.AddNamedEvent(5, "onsubmit", combinedFormName);
147-
RenderSSRFormHandlingChildren(builder, 6, combinedFormName);
147+
RenderSSRFormHandlingChildren(builder, 6);
148148
}
149149

150150
builder.OpenComponent<CascadingValue<EditContext>>(7);
@@ -158,7 +158,7 @@ protected override void BuildRenderTree(RenderTreeBuilder builder)
158158
builder.CloseRegion();
159159
}
160160

161-
private void RenderSSRFormHandlingChildren(RenderTreeBuilder builder, int sequence, string submitEventName)
161+
private void RenderSSRFormHandlingChildren(RenderTreeBuilder builder, int sequence)
162162
{
163163
builder.OpenRegion(sequence);
164164

@@ -169,12 +169,6 @@ private void RenderSSRFormHandlingChildren(RenderTreeBuilder builder, int sequen
169169
builder.OpenComponent<AntiforgeryToken>(3);
170170
builder.CloseComponent();
171171

172-
builder.OpenElement(4, "input");
173-
builder.AddAttribute(5, "type", "hidden");
174-
builder.AddAttribute(6, "name", "handler");
175-
builder.AddAttribute(7, "value", submitEventName);
176-
builder.CloseElement();
177-
178172
builder.CloseRegion();
179173
}
180174

src/Components/Web/test/Forms/EditFormTest.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ public async Task AddSSRContentWhenMappingContextPresent()
147147

148148
// Assert
149149
Assert.Collection(editFormFrames.AsEnumerable(),
150-
frame => AssertFrame.Region(frame, 17),
151-
frame => AssertFrame.Element(frame, "form", 16),
150+
frame => AssertFrame.Region(frame, 13),
151+
frame => AssertFrame.Element(frame, "form", 12),
152152

153153
// Sets "method" to "post" by default
154154
frame => AssertFrame.Attribute(frame, "method", "post"),
@@ -157,7 +157,7 @@ public async Task AddSSRContentWhenMappingContextPresent()
157157
frame => AssertFrame.Attribute(frame, "onsubmit"),
158158
frame => AssertFrame.NamedEvent(frame, "onsubmit", "mapping-context-name.my-form"),
159159

160-
frame => AssertFrame.Region(frame, 8),
160+
frame => AssertFrame.Region(frame, 4),
161161

162162
// Adds FormMappingValidator child
163163
frame => AssertFrame.Component<FormMappingValidator>(frame, 2),
@@ -166,12 +166,6 @@ public async Task AddSSRContentWhenMappingContextPresent()
166166
// Adds AntiforgeryToken child
167167
frame => AssertFrame.Component<AntiforgeryToken>(frame, 1),
168168

169-
// Adds hidden input specifying handler name
170-
frame => AssertFrame.Element(frame, "input", 4),
171-
frame => AssertFrame.Attribute(frame, "type", "hidden"),
172-
frame => AssertFrame.Attribute(frame, "name", "handler"),
173-
frame => AssertFrame.Attribute(frame, "value", "mapping-context-name.my-form"),
174-
175169
frame => AssertFrame.Component<CascadingValue<EditContext>>(frame, 4),
176170
frame => AssertFrame.Attribute(frame, "IsFixed", true),
177171
frame => AssertFrame.Attribute(frame, "Value"),

0 commit comments

Comments
 (0)