===== LaundryShowcase (the solution)
    0 Warning(s)
    0 Error(s)
== /_routes
{**path:file}                            Fallback {**path:file}
/                                        HTTP: GET /
/_routes                                 HTTP: GET /_routes
laundry                                  ShowcaseController.Home
laundry/collaboration                    ShowcaseController.Collaboration
laundry/company                          ShowcaseController.Company
laundry/error/{status:int}               ShowcaseController.Error
laundry/profile                          ShowcaseController.Profile
laundry/services                         ShowcaseController.Services
laundry/track                            ShowcaseController.TrackForm
laundry/track/{code:regex(^B\d{{4}}$)}   ShowcaseController.Track
== status codes
302  /
200  /laundry
200  /laundry/profile
200  /laundry/company
200  /laundry/services
200  /laundry/collaboration
200  /laundry/track
302  /laundry/track?code=b0072
200  /laundry/track/B0072
200  /laundry/track/b0001
200  /laundry/track/B2953
404  /laundry/track/B9999
404  /laundry/track/X12
404  /laundry/track/B00721
200  /laundry/Profile
404  /profile
404  /Showcase/Profile
200  /css/site.css
== redirects
HTTP/1.1 302 Found
Location: /laundry
HTTP/1.1 302 Found
Location: /laundry/track/b0072
== headers of /laundry
HTTP/1.1 200 OK
Content-Type: text/html; charset=utf-8
Server: Kestrel
Transfer-Encoding: chunked
X-Response-Time: 2 ms

== text of /laundry/company
The company
Give every household a few hours back each week, at a fair price.
In numbers
Orders from 1 Oct 2025
to 30 Sep 2026
2,953
Average order
Rp 48.836
Orders at Profitina Laundry Rungkut
1,312
Orders at Profitina Laundry Keputih
996
Orders at Profitina Laundry Wiyung
645
The team: 14 people
Counter and transactions: 5
Washing and drying: 5
Ironing and folding: 3
Owner and supervision: 1
== text of /laundry/track/B0072
Order B0072
Ready: collect it from rack A01.
Service
Wash, dry &amp; fold, 7 kg
OutletProfitina Laundry Rungkut
ReceivedTue 14 Oct 2025, 12:11
FinishedThu 16 Oct 2025, 07:45
Collected-
AmountRp 56.000
Track another order
== text of /laundry/track/B2953
Order B2953
Received and waiting to be washed.
Service
Dry cleaning - dress/kebaya, 1 item
OutletProfitina Laundry Rungkut
ReceivedWed 30 Sep 2026, 20:49
Finished-
Collected-
AmountRp 45.000
Track another order
== text of /laundry/track/B0001
Order B0001
Collected. Thank you!
Service
Bed cover, any size, 1 item
OutletProfitina Laundry Rungkut
ReceivedWed 1 Oct 2025, 09:46
FinishedSat 4 Oct 2025, 07:16
CollectedSun 5 Oct 2025, 07:24
AmountRp 35.000
Track another order
== text of /laundry/track/B9999
Not found
There is no page or order at
/laundry/track/B9999.
Back to the home page
== maintenance mode (Showcase__Maintenance=true)
503  /laundry
503  /laundry/profile
200  /css/site.css
HTTP/1.1 503 Service Unavailable
Retry-After: 3600
<body><main><h1>Back soon</h1>
===== Tempting/AbsoluteRoute
    0 Warning(s)
200  /laundry  home
404  /laundry/profile  
200  /profile  profile
-- log
      Request starting HTTP/1.1 GET http://127.0.0.1:4041/laundry - - -
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'ShowcaseController.Home (AbsoluteRoute)'
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[102]
      Route matched with {action = "Home", controller = "Showcase"}. Executing controller action with signature System.String Home() on controller ShowcaseController (AbsoluteRoute).
info: Microsoft.AspNetCore.Mvc.Infrastructure.ObjectResultExecutor[1]
      Executing ObjectResult, writing value of type 'System.String'.
info: Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker[105]
      Executed action ShowcaseController.Home (AbsoluteRoute) in 12.2598ms
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'ShowcaseController.Home (AbsoluteRoute)'
      Request finished HTTP/1.1 GET http://127.0.0.1:4041/laundry - 200 - text/plain;+charset=utf-8 78.4974ms
===== Tempting/RegexBraces
    2 Warning(s)
Program.cs(14,28): warning ASP0017: Route issue: In a route parameter, '{' and '}' must be escaped with '{{' and '}}'. (https://aka.ms/aspnet/analyzers)
Program.cs(14,41): warning ASP0017: Route issue: There is an incomplete parameter in the route template. Check that each '{' character has a matching '}' character. (https://aka.ms/aspnet/analyzers)
000  /laundry/track/B0072  
-- log
      Application startup exception
      Microsoft.AspNetCore.Routing.Patterns.RoutePatternException: In a route parameter, '{' and '}' must be escaped with '{{' and '}}'.
         at Microsoft.AspNetCore.Routing.Patterns.RoutePatternParser.Parse(String pattern)
         at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointFactory.AddEndpoints(List`1 endpoints, HashSet`1 routeNames, ActionDescriptor action, IReadOnlyList`1 routes, IReadOnlyList`1 conventions, IReadOnlyList`1 groupConventions, IReadOnlyList`1 finallyConventions, IReadOnlyList`1 groupFinallyConventions, Boolean createInertEndpoints, RoutePattern groupPrefix)
         at Microsoft.AspNetCore.Mvc.Routing.ControllerActionEndpointDataSource.CreateEndpoints(RoutePattern groupPrefix, IReadOnlyList`1 actions, IReadOnlyList`1 conventions, IReadOnlyList`1 groupConventions, IReadOnlyList`1 finallyConventions, IReadOnlyList`1 groupFinallyConventions)
         at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.UpdateEndpoints()
         at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.Initialize()
         at Microsoft.AspNetCore.Mvc.Routing.ActionEndpointDataSourceBase.GetChangeToken()
         at Microsoft.Extensions.Primitives.ChangeToken.ChangeTokenRegistration`1..ctor(Func`1 changeTokenProducer, Action`1 changeTokenConsumer, TState state)
         at Microsoft.Extensions.Primitives.ChangeToken.OnChange(Func`1 changeTokenProducer, Action changeTokenConsumer)
         at Microsoft.AspNetCore.Routing.CompositeEndpointDataSource.CreateChangeTokenUnsynchronized(Boolean collectionChanged)
         at Microsoft.AspNetCore.Routing.CompositeEndpointDataSource.EnsureChangeTokenInitialized()
===== Tempting/Ambiguous
    2 Warning(s)
Program.cs(14,14): warning ASP0023: Route 'track/{code}' conflicts with another action route. An HTTP request that matches multiple routes results in an ambiguous match error. Fix the conflict by changing the route's pattern, HTTP method, or route constraints. (https://aka.ms/aspnet/analyzers)
Program.cs(17,14): warning ASP0023: Route 'track/{outlet}' conflicts with another action route. An HTTP request that matches multiple routes results in an ambiguous match error. Fix the conflict by changing the route's pattern, HTTP method, or route constraints. (https://aka.ms/aspnet/analyzers)
500  /laundry/track/B0072  
-- log
      Request starting HTTP/1.1 GET http://127.0.0.1:4041/laundry/track/B0072 - - -
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HNOQS8967PII", Request id "0HNOQS8967PII:00000001": An unhandled exception was thrown by the application.
      Microsoft.AspNetCore.Routing.Matching.AmbiguousMatchException: The request matched multiple endpoints. Matches: 
      
      ShowcaseController.Track (Ambiguous)
      ShowcaseController.Outlet (Ambiguous)
         at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ReportAmbiguity(Span`1 candidateState)
         at Microsoft.AspNetCore.Routing.Matching.DefaultEndpointSelector.ProcessFinalCandidates(HttpContext httpContext, Span`1 candidateState)
         at Microsoft.AspNetCore.Routing.Matching.DfaMatcher.MatchAsync(HttpContext httpContext)
         at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.Invoke(HttpContext httpContext)
         at Microsoft.AspNetCore.HostFiltering.HostFilteringMiddleware.Invoke(HttpContext context)
===== Tempting/LateHeader
    0 Warning(s)
200  /laundry  Clean clothes, honest prices.
-- log
      Request starting HTTP/1.1 GET http://127.0.0.1:4041/laundry - - -
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[0]
      Executing endpoint 'HTTP: GET /laundry'
info: Microsoft.AspNetCore.Routing.EndpointMiddleware[1]
      Executed endpoint 'HTTP: GET /laundry'
fail: Microsoft.AspNetCore.Server.Kestrel[13]
      Connection id "0HNOQS8B4VLIV", Request id "0HNOQS8B4VLIV:00000001": An unhandled exception was thrown by the application.
      System.InvalidOperationException: Headers are read-only, response has already started.
         at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.ThrowHeadersReadOnlyException()
         at Microsoft.AspNetCore.Server.Kestrel.Core.Internal.Http.HttpHeaders.Microsoft.AspNetCore.Http.IHeaderDictionary.set_Item(String key, StringValues value)
         at Program.<>c.<<<Main>$>b__0_0>d.MoveNext() in /home/claude/kit/FBP/Code_new/Chapter04/aspnet/Tempting/LateHeader/Program.cs:line 11
      --- End of stack trace from previous location ---
===== Tempting/MaintenanceFirst
    0 Warning(s)
503  /laundry  Back soon
503  /css/site.css  Back soon
-- log
      Request starting HTTP/1.1 GET http://127.0.0.1:4041/laundry - - -
      Request finished HTTP/1.1 GET http://127.0.0.1:4041/laundry - 503 - - 5.0709ms
      Request starting HTTP/1.1 GET http://127.0.0.1:4041/css/site.css - - -
      Request finished HTTP/1.1 GET http://127.0.0.1:4041/css/site.css - 503 - - 0.2707ms
      Application is shutting down...
