• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ThreeMammals / Ocelot / 23302213965

19 Mar 2026 03:19PM UTC coverage: 91.219% (-1.3%) from 92.49%
23302213965

Pull #2369

github

web-flow
Merge 7f6f01146 into 086c7b15c
Pull Request #2369: Pre-Release 25.0 aka Beta 2

8404 of 9213 relevant lines covered (91.22%)

2131.48 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

94.52
src/Ocelot/DependencyInjection/ConfigurationBuilderExtensions.cs
1
using Microsoft.AspNetCore.Hosting;
2
using Microsoft.Extensions.Configuration;
3
using Microsoft.Extensions.Configuration.Memory;
4
using Newtonsoft.Json;
5
using Ocelot.Configuration.File;
6
using Ocelot.Infrastructure;
7

8
namespace Ocelot.DependencyInjection;
9

10
/// <summary>
11
/// Defines extension-methods for the <see cref="IConfigurationBuilder"/> interface.
12
/// </summary>
13
public static partial class ConfigurationBuilderExtensions
14
{
15
    public const string PrimaryConfigFile = "ocelot.json";
16
    public const string GlobalConfigFile = "ocelot.global.json";
17
    public const string EnvironmentConfigFile = "ocelot.{0}.json";
18

19
    [Obsolete("Please set BaseUrl in ocelot.json GlobalConfiguration.BaseUrl")]
20
    public static IConfigurationBuilder AddOcelotBaseUrl(this IConfigurationBuilder builder, string baseUrl)
21
    {
1✔
22
        var memorySource = new MemoryConfigurationSource
1✔
23
        {
1✔
24
            InitialData = new List<KeyValuePair<string, string>>
1✔
25
            {
1✔
26
                new("BaseUrl", baseUrl),
1✔
27
            },
1✔
28
        };
1✔
29

30
        return builder.Add(memorySource);
1✔
31
    }
1✔
32

33
    /// <summary>
34
    /// Adds Ocelot configuration by environment, reading the required files from the default path.
35
    /// </summary>
36
    /// <param name="builder">Configuration builder to extend.</param>
37
    /// <param name="env">Web hosting environment object.</param>
38
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
39
    public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, IWebHostEnvironment env)
40
        => builder.AddOcelot(".", env);
2✔
41

42
    /// <summary>
43
    /// Adds Ocelot configuration by environment, reading the required files from the specified folder.
44
    /// </summary>
45
    /// <param name="builder">Configuration builder to extend.</param>
46
    /// <param name="folder">Folder to read files from.</param>
47
    /// <param name="env">Web hosting environment object.</param>
48
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
49
    public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, string folder, IWebHostEnvironment env)
50
        => builder.AddOcelot(folder, env, MergeOcelotJson.ToFile);
2✔
51

52
    /// <summary>
53
    /// Adds Ocelot configuration by environment and merge option, reading the required files from the current default folder.
54
    /// </summary>
55
    /// <remarks>Use optional arguments for injections and overridings.</remarks>
56
    /// <param name="builder">Configuration builder to extend.</param>
57
    /// <param name="env">Web hosting environment object.</param>
58
    /// <param name="mergeTo">Option to merge files to.</param>
59
    /// <param name="primaryConfigFile">Primary config file.</param>
60
    /// <param name="globalConfigFile">Global config file.</param>
61
    /// <param name="environmentConfigFile">Environment config file.</param>
62
    /// <param name="optional">The 2nd argument of the AddJsonFile.</param>
63
    /// <param name="reloadOnChange">The 3rd argument of the AddJsonFile.</param>
64
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
65
    public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, IWebHostEnvironment env, MergeOcelotJson mergeTo,
66
        string primaryConfigFile = null, string globalConfigFile = null, string environmentConfigFile = null, bool? optional = null, bool? reloadOnChange = null) // optional injections
67
        => builder.AddOcelot(".", env, mergeTo, primaryConfigFile, globalConfigFile, environmentConfigFile, optional, reloadOnChange);
×
68

69
    /// <summary>
70
    /// Adds Ocelot configuration by environment and merge option, reading the required files from the specified folder.
71
    /// </summary>
72
    /// <remarks>Use optional arguments for injections and overridings.</remarks>
73
    /// <param name="builder">Configuration builder to extend.</param>
74
    /// <param name="folder">Folder to read files from.</param>
75
    /// <param name="env">Web hosting environment object.</param>
76
    /// <param name="mergeTo">Option to merge files to.</param>
77
    /// <param name="primaryConfigFile">Primary config file.</param>
78
    /// <param name="globalConfigFile">Global config file.</param>
79
    /// <param name="environmentConfigFile">Environment config file.</param>
80
    /// <param name="optional">The 2nd argument of the AddJsonFile.</param>
81
    /// <param name="reloadOnChange">The 3rd argument of the AddJsonFile.</param>
82
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
83
    public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, string folder, IWebHostEnvironment env, MergeOcelotJson mergeTo,
84
        string primaryConfigFile = null, string globalConfigFile = null, string environmentConfigFile = null, bool? optional = null, bool? reloadOnChange = null) // optional injections
85
    {
8✔
86
        var json = GetMergedOcelotJson(folder, env, null, primaryConfigFile, globalConfigFile, environmentConfigFile);
8✔
87
        primaryConfigFile ??= Path.Join(folder, PrimaryConfigFile); // if not specified, merge & write back to the same folder
8✔
88
        return ApplyMergeOcelotJsonOption(builder, mergeTo, json, primaryConfigFile, optional, reloadOnChange);
8✔
89
    }
8✔
90

91
    private static IConfigurationBuilder ApplyMergeOcelotJsonOption(IConfigurationBuilder builder, MergeOcelotJson mergeTo, string json,
92
        string primaryConfigFile, bool? optional, bool? reloadOnChange)
93
    {
18✔
94
        return mergeTo == MergeOcelotJson.ToMemory ? 
18✔
95
            builder.AddJsonStream(new MemoryStream(Encoding.UTF8.GetBytes(json))) : 
18✔
96
            AddOcelotJsonFile(builder, json, primaryConfigFile, optional, reloadOnChange);
18✔
97
    }
18✔
98

99
    [GeneratedRegex(@"^ocelot\.(.*?)\.json$", RegexOptions.IgnoreCase | RegexOptions.Singleline, RegexGlobal.DefaultMatchTimeoutMilliseconds, "en-US")]
100
    private static partial Regex SubConfigRegex();
101

102
    private static string GetMergedOcelotJson(string folder, IWebHostEnvironment env,
103
        FileConfiguration fileConfiguration = null, string primaryFile = null, string globalFile = null, string environmentFile = null)
104
    {
18✔
105
        // All versions of overloaded AddOcelot methods call this GetMergedOcelotJson one, so we improve Regex performance by cache increasing.
106
        // Developers can adjust the RegexGlobal value BEFORE calling AddOcelot
107
        // Developers can adjust the Regex.CacheSize value AFTER calling AddOcelot
108
        Regex.CacheSize = RegexGlobal.RegexCacheSize;
18✔
109

110
        var envName = string.IsNullOrEmpty(env?.EnvironmentName) ? "Development" : env.EnvironmentName;
18✔
111
        environmentFile ??= Path.Join(folder, string.Format(EnvironmentConfigFile, envName));
18✔
112
        var reg = SubConfigRegex();
18✔
113
        var environmentFileInfo = new FileInfo(environmentFile);
18✔
114
        var files = new DirectoryInfo(folder)
18✔
115
            .EnumerateFiles()
18✔
116
            .Where(fi => reg.IsMatch(fi.Name) &&
1,313✔
117
                !fi.Name.Equals(environmentFileInfo.Name, StringComparison.OrdinalIgnoreCase) &&
1,313✔
118
                !fi.FullName.Equals(environmentFileInfo.FullName, StringComparison.OrdinalIgnoreCase))
1,313✔
119
            .ToArray();
18✔
120

121
        fileConfiguration ??= new FileConfiguration();
18✔
122
        primaryFile ??= Path.Join(folder, PrimaryConfigFile);
18✔
123
        globalFile ??= Path.Join(folder, GlobalConfigFile);
18✔
124
        var primaryFileInfo = new FileInfo(primaryFile);
18✔
125
        var globalFileInfo = new FileInfo(globalFile);
18✔
126
        foreach (var file in files)
150✔
127
        {
48✔
128
            if (files.Length > 1 &&
48✔
129
                file.Name.Equals(primaryFileInfo.Name, StringComparison.OrdinalIgnoreCase) &&
48✔
130
                file.FullName.Equals(primaryFileInfo.FullName, StringComparison.OrdinalIgnoreCase))
48✔
131
            {
×
132
                continue;
×
133
            }
134

135
            var lines = File.ReadAllText(file.FullName);
48✔
136
            var config = JsonConvert.DeserializeObject<FileConfiguration>(lines);
48✔
137
            if (file.Name.Equals(globalFileInfo.Name, StringComparison.OrdinalIgnoreCase) &&
48✔
138
                file.FullName.Equals(globalFileInfo.FullName, StringComparison.OrdinalIgnoreCase))
48✔
139
            {
6✔
140
                fileConfiguration.GlobalConfiguration = config.GlobalConfiguration;
6✔
141
            }
6✔
142

143
            fileConfiguration.Aggregates.AddRange(config.Aggregates);
48✔
144
            fileConfiguration.Routes.AddRange(config.Routes);
48✔
145
        }
48✔
146

147
        return JsonConvert.SerializeObject(fileConfiguration, Formatting.Indented);
18✔
148
    }
18✔
149

150
    /// <summary>
151
    /// Adds Ocelot configuration by ready configuration object and writes JSON to the primary configuration file.<br/>
152
    /// Finally, adds JSON file as configuration provider.
153
    /// </summary>
154
    /// <remarks>Use optional arguments for injections and overridings.</remarks>
155
    /// <param name="builder">Configuration builder to extend.</param>
156
    /// <param name="fileConfiguration">File configuration to add as JSON provider.</param>
157
    /// <param name="primaryConfigFile">Primary config file.</param>
158
    /// <param name="optional">The 2nd argument of the AddJsonFile.</param>
159
    /// <param name="reloadOnChange">The 3rd argument of the AddJsonFile.</param>
160
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
161
    public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, FileConfiguration fileConfiguration,
162
        string primaryConfigFile = null, bool? optional = null, bool? reloadOnChange = null) // optional injections
163
    {
1✔
164
        var json = JsonConvert.SerializeObject(fileConfiguration, Formatting.Indented);
1✔
165
        return AddOcelotJsonFile(builder, json, primaryConfigFile, optional, reloadOnChange);
1✔
166
    }
1✔
167

168
    /// <summary>
169
    /// Adds Ocelot configuration by ready configuration object, environment and merge option, reading the required files from the current default folder.
170
    /// </summary>
171
    /// <param name="builder">Configuration builder to extend.</param>
172
    /// <param name="fileConfiguration">File configuration to add as JSON provider.</param>
173
    /// <param name="env">Web hosting environment object.</param>
174
    /// <param name="mergeTo">Option to merge files to.</param>
175
    /// <param name="primaryConfigFile">Primary config file.</param>
176
    /// <param name="globalConfigFile">Global config file.</param>
177
    /// <param name="environmentConfigFile">Environment config file.</param>
178
    /// <param name="optional">The 2nd argument of the AddJsonFile.</param>
179
    /// <param name="reloadOnChange">The 3rd argument of the AddJsonFile.</param>
180
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
181
    public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder, FileConfiguration fileConfiguration, IWebHostEnvironment env, MergeOcelotJson mergeTo,
182
        string primaryConfigFile = null, string globalConfigFile = null, string environmentConfigFile = null, bool? optional = null, bool? reloadOnChange = null) // optional injections
183
    {
10✔
184
        var json = GetMergedOcelotJson(".", env, fileConfiguration, primaryConfigFile, globalConfigFile, environmentConfigFile);
10✔
185
        return ApplyMergeOcelotJsonOption(builder, mergeTo, json, primaryConfigFile, optional, reloadOnChange);
10✔
186
    }
10✔
187

188
    /// <summary>
189
    /// Adds Ocelot primary configuration file (aka ocelot.json).<br/>
190
    /// Writes JSON to the file.<br/>
191
    /// Adds the file as a JSON configuration provider via the <see cref="JsonConfigurationExtensions.AddJsonFile(IConfigurationBuilder, string, bool, bool)"/> extension.
192
    /// </summary>
193
    /// <remarks>Use optional arguments for injections and overridings.</remarks>
194
    /// <param name="builder">The builder to extend.</param>
195
    /// <param name="json">JSON data of the Ocelot configuration.</param>
196
    /// <param name="primaryFile">Primary config file.</param>
197
    /// <param name="optional">The 2nd argument of the AddJsonFile.</param>
198
    /// <param name="reloadOnChange">The 3rd argument of the AddJsonFile.</param>
199
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
200
    private static IConfigurationBuilder AddOcelotJsonFile(IConfigurationBuilder builder, string json,
201
        string primaryFile = null, bool? optional = null, bool? reloadOnChange = null) // optional injections
202
    {
7✔
203
        var primary = primaryFile ?? PrimaryConfigFile;
7✔
204
        File.WriteAllText(primary, json);
7✔
205
        return builder?.AddJsonFile(primary, optional ?? false, reloadOnChange ?? false);
7✔
206
    }
7✔
207

208
    /// <summary>
209
    /// Adds Ocelot primary configuration file (aka ocelot.json) in read-only mode.
210
    /// <para>Adds the file as a JSON configuration provider via the <see cref="JsonConfigurationExtensions.AddJsonFile(IConfigurationBuilder, string, bool, bool)"/> extension.</para>
211
    /// </summary>
212
    /// <remarks>Use optional arguments for injections and overridings.</remarks>
213
    /// <param name="builder">The builder to extend.</param>
214
    /// <param name="primaryFile">Primary config file path.</param>
215
    /// <param name="optional">The 2nd argument of the AddJsonFile.</param>
216
    /// <param name="reloadOnChange">The 3rd argument of the AddJsonFile.</param>
217
    /// <returns>An <see cref="IConfigurationBuilder"/> object.</returns>
218
    public static IConfigurationBuilder AddOcelot(this IConfigurationBuilder builder,
219
        string primaryFile = null, bool? optional = null, bool? reloadOnChange = null) // optional injections
220
        => builder.AddJsonFile(primaryFile ?? PrimaryConfigFile, optional ?? false, reloadOnChange ?? false);
×
221
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc