diff --git a/docker/postgres-techempower/create-postgres.sql b/docker/postgres-techempower/create-postgres.sql
index ab71ea75e..aedc047bf 100644
--- a/docker/postgres-techempower/create-postgres.sql
+++ b/docker/postgres-techempower/create-postgres.sql
@@ -60,4 +60,50 @@ INSERT INTO "Fortune" (id, message) VALUES (10, 'Computers make very fast, very
INSERT INTO "Fortune" (id, message) VALUES (11, '');
INSERT INTO "Fortune" (id, message) VALUES (12, 'フレームワークのベンチマーク');
+
+CREATE TABLE "RewriteRule" (
+ id integer NOT NULL,
+ regex varchar(2048) NOT NULL,
+ replacement varchar(2048) NOT NULL,
+ PRIMARY KEY (id)
+);
+
+GRANT SELECT ON "RewriteRule" to benchmarkdbuser;
+
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (1, 'rewrite1' ,'replacement1');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (2, 'rewrite1' ,'replacement2');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (3, 'rewrite1' ,'replacement3');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (4, 'rewrite1' ,'replacement4');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (5, 'rewrite1' ,'replacement5');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (6, 'rewrite1' ,'replacement6');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (7, 'rewrite1' ,'replacement7');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (8, 'rewrite1' ,'replacement8');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (9, 'rewrite1' ,'replacement9');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (10,'rewrite1' ,'replacement10');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (11,'rewrite1' ,'replacement11');
+INSERT INTO "RewriteRule" (id, regex,replacement) VALUES (12,'rewrite1' ,'replacement12');
+
+
+
+CREATE TABLE RewriteRule (
+ id integer NOT NULL,
+ regex varchar(2048) NOT NULL,
+ replacement varchar(2048) NOT NULL,
+ PRIMARY KEY (id)
+);
+GRANT SELECT ON RewriteRule to benchmarkdbuser;
+
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (1, 'rewrite1' ,'replacement1');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (2, 'rewrite1' ,'replacement2');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (3, 'rewrite1' ,'replacement3');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (4, 'rewrite1' ,'replacement4');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (5, 'rewrite1' ,'replacement5');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (6, 'rewrite1' ,'replacement6');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (7, 'rewrite1' ,'replacement7');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (8, 'rewrite1' ,'replacement8');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (9, 'rewrite1' ,'replacement9');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (10,'rewrite1' ,'replacement10');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (11,'rewrite1' ,'replacement11');
+INSERT INTO RewriteRule (id, regex,replacement) VALUES (12,'rewrite1' ,'replacement12');
+
COMMIT;
\ No newline at end of file
diff --git a/docker/postgres-techempower/run.sh b/docker/postgres-techempower/run.sh
index 9c87df650..04d29eb5d 100755
--- a/docker/postgres-techempower/run.sh
+++ b/docker/postgres-techempower/run.sh
@@ -8,6 +8,6 @@ docker run \
--log-opt max-size=10m \
--log-opt max-file=3 \
--name postgres-techempower \
- --network host \
+ -p 5432:5432 \
--restart always \
postgres-techempower
diff --git a/scenarios/rewrite.benchmarks.yml b/scenarios/rewrite.benchmarks.yml
new file mode 100644
index 000000000..fb7862734
--- /dev/null
+++ b/scenarios/rewrite.benchmarks.yml
@@ -0,0 +1,39 @@
+imports:
+ - https://raw.githubusercontent.com/dotnet/crank/main/src/Microsoft.Crank.Jobs.Wrk/wrk.yml
+ - https://raw.githubusercontent.com/aspnet/Benchmarks/main/scenarios/aspnet.profiles.yml
+
+variables:
+ serverPort: 5000
+ serverScheme: http
+ scenario: antiforgery
+ debug: false
+
+jobs:
+ rewritebenchmarks:
+ source:
+ #repository: https://github.com/cdincer/Benchmarks.git
+ localFolder: ../src/BenchmarksApps
+ branchOrCommit: main
+ project: Rewrite/Rewrite.csproj
+ readyStateText: Application started.
+ arguments: "--urls {{serverScheme}}://{{serverAddress}}:{{serverPort}} --scenario {{scenario}} --debug {{debug}}"
+ environmentVariables:
+ connectionString: Server={{databaseServer}};Database=hello_world;User Id=benchmarkdbuser;Password=benchmarkdbpass;Maximum Pool Size=256;NoResetOnClose=true;Enlist=false;Max Auto Prepare=4
+
+scenarios:
+
+ rewrite1:
+ application:
+ job: rewritebenchmarks
+ load:
+ job: wrk
+ variables:
+ path: /rewrite1
+
+ rewrite2:
+ application:
+ job: rewritebenchmarks
+ load:
+ job: wrk
+ variables:
+ path: /rewrite2
\ No newline at end of file
diff --git a/src/BenchmarksApps.sln b/src/BenchmarksApps.sln
index c10baaabc..91251d250 100644
--- a/src/BenchmarksApps.sln
+++ b/src/BenchmarksApps.sln
@@ -1,7 +1,7 @@
Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.6.33416.333
+# Visual Studio Version 18
+VisualStudioVersion = 18.10.12120.281 insiders
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "BasicMinimalApi", "BenchmarksApps\BasicMinimalApi\BasicMinimalApi.csproj", "{D13E5EF8-8DA6-4904-891D-1A8D8AAC04DD}"
EndProject
@@ -72,6 +72,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "HttpSys", "BenchmarksApps\T
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Kestrel", "BenchmarksApps\TLS\Kestrel\Kestrel.csproj", "{291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}"
EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rewrite", "BenchmarksApps\Rewrite\Rewrite.csproj", "{DDCACECC-62BD-4DE3-AB17-E0A66B25F591}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug_Database|Any CPU = Debug_Database|Any CPU
@@ -280,6 +282,14 @@ Global
{291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}.Release_Database|Any CPU.Build.0 = Release_Database|Any CPU
{291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}.Release|Any CPU.ActiveCfg = Release|Any CPU
{291DCDF7-4B7C-D687-A62B-9DF7DF50F2F2}.Release|Any CPU.Build.0 = Release|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug_Database|Any CPU.ActiveCfg = Debug_Database|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug_Database|Any CPU.Build.0 = Debug_Database|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release_Database|Any CPU.ActiveCfg = Release_Database|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release_Database|Any CPU.Build.0 = Release_Database|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {DDCACECC-62BD-4DE3-AB17-E0A66B25F591}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
diff --git a/src/BenchmarksApps/Rewrite/Configuration/AppSettings.cs b/src/BenchmarksApps/Rewrite/Configuration/AppSettings.cs
new file mode 100644
index 000000000..e5452bd6e
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/Configuration/AppSettings.cs
@@ -0,0 +1,8 @@
+namespace Rewrite.Configuration
+{
+ public class AppSettings
+ {
+ public string ConnectionString { get; set; }
+
+ }
+}
diff --git a/src/BenchmarksApps/Rewrite/Configuration/ConsoleArgs.cs b/src/BenchmarksApps/Rewrite/Configuration/ConsoleArgs.cs
new file mode 100644
index 000000000..00e72b86c
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/Configuration/ConsoleArgs.cs
@@ -0,0 +1,12 @@
+namespace Rewrite.Configuration
+{
+ public class ConsoleArgs
+ {
+ public ConsoleArgs(string[] args)
+ {
+ Args = args;
+ }
+
+ public string[] Args { get; }
+ }
+}
diff --git a/src/BenchmarksApps/Rewrite/Data/RewriteRule.cs b/src/BenchmarksApps/Rewrite/Data/RewriteRule.cs
new file mode 100644
index 000000000..86092fcbc
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/Data/RewriteRule.cs
@@ -0,0 +1,22 @@
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Runtime.Serialization;
+
+namespace Rewrite.Data
+{
+ [Table("RewriteRule")]
+ public class RewriteRule
+ {
+ [Column("id")]
+ public int Id { get; set; }
+
+
+ [Column("regex")]
+ [MaxLength(2048)]
+ public string? Regex { get; set; }
+
+ [Column("replacement")]
+ [MaxLength(2048)]
+ public string? Replacement { get; set; }
+ }
+}
diff --git a/src/BenchmarksApps/Rewrite/Program.cs b/src/BenchmarksApps/Rewrite/Program.cs
new file mode 100644
index 000000000..4c13bcf5c
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/Program.cs
@@ -0,0 +1,89 @@
+using System.Data.Common;
+using Microsoft.AspNetCore.Rewrite;
+using Microsoft.Data.SqlClient;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Storage;
+using Npgsql;
+using Rewrite.Configuration;
+using Rewrite.Data;
+
+WebApplicationBuilder builder = WebApplication.CreateBuilder(args);
+
+var hostingConfig = new ConfigurationBuilder()
+ .AddJsonFile("hosting.json", optional: true)
+ .AddEnvironmentVariables()
+ .AddCommandLine(args)
+ .Build();
+
+string connectionString = hostingConfig["ConnectionString"] ?? "no Connectionstring found";
+
+
+await using var dataSource = NpgsqlDataSource.Create(connectionString);
+
+await using var command = dataSource.CreateCommand("SELECT id,regex,replacement FROM \"RewriteRule\"");
+await using var reader = await command.ExecuteReaderAsync();
+
+List rewriteRules = new();
+
+while (await reader.ReadAsync())
+{
+ RewriteRule rule = new RewriteRule
+ {
+ Id = reader.GetFieldValue(0),
+ Regex = reader.GetFieldValue(1),
+ Replacement = reader.GetFieldValue(2)
+ };
+ rewriteRules.Add(rule);
+};
+var options = new RewriteOptions();
+
+foreach(RewriteRule rewriteRule in rewriteRules)
+{
+ options.AddRewrite(rewriteRule.Regex, rewriteRule.Replacement,skipRemainingRules: false);
+}
+
+
+WebApplication app = builder.Build();
+
+app.UseRewriter(options);
+
+
+
+string[] summaries = new[]
+{
+ "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+};
+
+app.MapGet("/rewrite1", () =>
+{
+ var forecast = Enumerable.Range(1, 5).Select(index =>
+ new WeatherForecast
+ (
+ DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+ Random.Shared.Next(-20, 55),
+ summaries[Random.Shared.Next(summaries.Length)]
+ ))
+ .ToArray();
+ return forecast;
+});
+
+
+app.MapGet("/rewrite2", () =>
+{
+ var forecast = Enumerable.Range(1, 5).Select(index =>
+ new WeatherForecast
+ (
+ DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+ Random.Shared.Next(-20, 55),
+ summaries[Random.Shared.Next(summaries.Length)]
+ ))
+ .ToArray();
+ return forecast;
+});
+
+app.Run();
+
+internal record WeatherForecast(DateOnly Date, int TemperatureC, string? Summary)
+{
+ public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+}
diff --git a/src/BenchmarksApps/Rewrite/Properties/launchSettings.json b/src/BenchmarksApps/Rewrite/Properties/launchSettings.json
new file mode 100644
index 000000000..3b2a373ae
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/Properties/launchSettings.json
@@ -0,0 +1,12 @@
+{
+ "profiles": {
+ "Rewrite": {
+ "commandName": "Project",
+ "launchBrowser": true,
+ "environmentVariables": {
+ "ASPNETCORE_ENVIRONMENT": "Development"
+ },
+ "applicationUrl": "https://localhost:55471;http://localhost:55472"
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/BenchmarksApps/Rewrite/Rewrite.csproj b/src/BenchmarksApps/Rewrite/Rewrite.csproj
new file mode 100644
index 000000000..81a2bba23
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/Rewrite.csproj
@@ -0,0 +1,16 @@
+
+
+
+ net9.0
+ enable
+ enable
+
+
+
+
+
+
+
+
+
+
diff --git a/src/BenchmarksApps/Rewrite/appsettings.Development.json b/src/BenchmarksApps/Rewrite/appsettings.Development.json
new file mode 100644
index 000000000..0c208ae91
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/appsettings.Development.json
@@ -0,0 +1,8 @@
+{
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning"
+ }
+ }
+}
diff --git a/src/BenchmarksApps/Rewrite/appsettings.json b/src/BenchmarksApps/Rewrite/appsettings.json
new file mode 100644
index 000000000..88b2787fa
--- /dev/null
+++ b/src/BenchmarksApps/Rewrite/appsettings.json
@@ -0,0 +1,18 @@
+{
+ "ConnectionString": "",
+ "DatabaseServer": "SqlServer",
+ "Logging": {
+ "LogLevel": {
+ "Default": "Information",
+ "Microsoft.AspNetCore": "Warning",
+ "Microsoft.AspNetCore.HttpLogging.HttpLoggingMiddleware": "Information"
+ },
+ "Console": {
+ "FormatterOptions": {
+ "TimestampFormat": "HH:mm:ss "
+
+ }
+ }
+ },
+ "AllowedHosts": "*"
+}
\ No newline at end of file