@@ -12,6 +12,7 @@ public sealed class HtmxResponse(HttpContext context)
12
12
{
13
13
private const string ItemsKeyPrefix = "02E0A668-6E6B-4C53-83A6-17E576073E96" ;
14
14
private readonly IHeaderDictionary headers = context . Response . Headers ;
15
+ private readonly bool isHtmxRequest = context . Request . Headers . ContainsKey ( HtmxRequestHeaderNames . HtmxRequest ) ;
15
16
16
17
internal bool EmptyResponseBodyRequested { get ; private set ; }
17
18
@@ -21,6 +22,7 @@ public sealed class HtmxResponse(HttpContext context)
21
22
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
22
23
public HtmxResponse StatusCode ( HttpStatusCode statusCode )
23
24
{
25
+ AssertIsHtmxRequest ( ) ;
24
26
context . Response . StatusCode = ( int ) statusCode ;
25
27
return this ;
26
28
}
@@ -32,6 +34,7 @@ public HtmxResponse StatusCode(HttpStatusCode statusCode)
32
34
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
33
35
public HtmxResponse EmptyBody ( )
34
36
{
37
+ AssertIsHtmxRequest ( ) ;
35
38
EmptyResponseBodyRequested = true ;
36
39
return this ;
37
40
}
@@ -43,6 +46,7 @@ public HtmxResponse EmptyBody()
43
46
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
44
47
public HtmxResponse Location ( string path )
45
48
{
49
+ AssertIsHtmxRequest ( ) ;
46
50
headers [ HtmxResponseHeaderNames . Location ] = path ;
47
51
return this ;
48
52
}
@@ -54,6 +58,7 @@ public HtmxResponse Location(string path)
54
58
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
55
59
public HtmxResponse Location ( LocationTarget locationTarget )
56
60
{
61
+ AssertIsHtmxRequest ( ) ;
57
62
var json = JsonSerializer . Serialize ( locationTarget , HtmxJsonSerializerContext . Default . LocationTarget ) ;
58
63
headers [ HtmxResponseHeaderNames . Location ] = json ;
59
64
return this ;
@@ -66,6 +71,7 @@ public HtmxResponse Location(LocationTarget locationTarget)
66
71
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
67
72
public HtmxResponse PushUrl ( string url )
68
73
{
74
+ AssertIsHtmxRequest ( ) ;
69
75
headers [ HtmxResponseHeaderNames . PushUrl ] = url ;
70
76
return this ;
71
77
}
@@ -77,8 +83,8 @@ public HtmxResponse PushUrl(string url)
77
83
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
78
84
public HtmxResponse PreventBrowserHistoryUpdate ( )
79
85
{
86
+ AssertIsHtmxRequest ( ) ;
80
87
headers [ HtmxResponseHeaderNames . PushUrl ] = "false" ;
81
-
82
88
return this ;
83
89
}
84
90
@@ -89,8 +95,8 @@ public HtmxResponse PreventBrowserHistoryUpdate()
89
95
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
90
96
public HtmxResponse PreventBrowserCurrentUrlUpdate ( )
91
97
{
98
+ AssertIsHtmxRequest ( ) ;
92
99
headers [ HtmxResponseHeaderNames . ReplaceUrl ] = "false" ;
93
-
94
100
return this ;
95
101
}
96
102
@@ -101,6 +107,7 @@ public HtmxResponse PreventBrowserCurrentUrlUpdate()
101
107
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
102
108
public HtmxResponse Redirect ( string url )
103
109
{
110
+ AssertIsHtmxRequest ( ) ;
104
111
headers [ HtmxResponseHeaderNames . Redirect ] = url ;
105
112
EmptyResponseBodyRequested = true ;
106
113
return this ;
@@ -112,6 +119,7 @@ public HtmxResponse Redirect(string url)
112
119
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
113
120
public HtmxResponse Refresh ( )
114
121
{
122
+ AssertIsHtmxRequest ( ) ;
115
123
headers [ HtmxResponseHeaderNames . Refresh ] = "true" ;
116
124
EmptyResponseBodyRequested = true ;
117
125
return this ;
@@ -124,6 +132,7 @@ public HtmxResponse Refresh()
124
132
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
125
133
public HtmxResponse ReplaceUrl ( string url )
126
134
{
135
+ AssertIsHtmxRequest ( ) ;
127
136
headers [ HtmxResponseHeaderNames . ReplaceUrl ] = url ;
128
137
return this ;
129
138
}
@@ -135,11 +144,12 @@ public HtmxResponse ReplaceUrl(string url)
135
144
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
136
145
public HtmxResponse Reswap ( SwapStyle swapStyle )
137
146
{
147
+ AssertIsHtmxRequest ( ) ;
148
+
138
149
var style = swapStyle switch
139
150
{
140
151
SwapStyle . InnerHTML => "innerHTML" ,
141
152
SwapStyle . OuterHTML => "outerHTML" ,
142
- //SwapStyle.TextContent => "textContent",
143
153
SwapStyle . BeforeBegin => "beforebegin" ,
144
154
SwapStyle . AfterBegin => "afterbegin" ,
145
155
SwapStyle . BeforeEnd => "beforeend" ,
@@ -161,6 +171,8 @@ public HtmxResponse Reswap(SwapStyle swapStyle)
161
171
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
162
172
public HtmxResponse Retarget ( string selector )
163
173
{
174
+ AssertIsHtmxRequest ( ) ;
175
+
164
176
headers [ HtmxResponseHeaderNames . Retarget ] = selector ;
165
177
166
178
return this ;
@@ -173,6 +185,8 @@ public HtmxResponse Retarget(string selector)
173
185
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
174
186
public HtmxResponse Reselect ( string selector )
175
187
{
188
+ AssertIsHtmxRequest ( ) ;
189
+
176
190
headers [ HtmxResponseHeaderNames . Reselect ] = selector ;
177
191
178
192
return this ;
@@ -186,6 +200,8 @@ public HtmxResponse Reselect(string selector)
186
200
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
187
201
public HtmxResponse Trigger ( string eventName , TriggerTiming timing = TriggerTiming . Default )
188
202
{
203
+ AssertIsHtmxRequest ( ) ;
204
+
189
205
var headerKey = timing switch
190
206
{
191
207
TriggerTiming . AfterSwap => HtmxResponseHeaderNames . TriggerAfterSwap ,
@@ -209,6 +225,8 @@ public HtmxResponse Trigger(string eventName, TriggerTiming timing = TriggerTimi
209
225
/// <returns>This <see cref="HtmxResponse"/> object instance.</returns>
210
226
public HtmxResponse Trigger < TEventDetail > ( string eventName , TEventDetail detail , TriggerTiming timing = TriggerTiming . Default , JsonSerializerOptions ? jsonSerializerOptions = null )
211
227
{
228
+ AssertIsHtmxRequest ( ) ;
229
+
212
230
var headerKey = timing switch
213
231
{
214
232
TriggerTiming . AfterSwap => HtmxResponseHeaderNames . TriggerAfterSwap ,
@@ -254,4 +272,14 @@ public override string ToString()
254
272
? $ "\" { EventName } \" :null"
255
273
: $ "\" { EventName } \" :{ Detail } ";
256
274
}
275
+
276
+ private void AssertIsHtmxRequest ( )
277
+ {
278
+ if ( ! isHtmxRequest )
279
+ {
280
+ throw new InvalidOperationException (
281
+ "The active request is not an htmx request. " +
282
+ "Setting response headers during request has no effect." ) ;
283
+ }
284
+ }
257
285
}
0 commit comments