Skip to content

Commit f17ef9f

Browse files
Fixes after refactoring (#1244)
1 parent e71a9e2 commit f17ef9f

File tree

10 files changed

+49
-16
lines changed

10 files changed

+49
-16
lines changed

DevProxy.Abstractions/LanguageModel/LanguageModelClientFactory.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,14 +14,14 @@ public static ILanguageModelClient Create(IServiceProvider serviceProvider, ICon
1414
ArgumentNullException.ThrowIfNull(serviceProvider);
1515
ArgumentNullException.ThrowIfNull(configuration);
1616

17-
var lmSection = configuration.GetSection("LanguageModelClient");
18-
var config = lmSection?.Get<LanguageModelConfiguration>();
17+
var lmSection = configuration.GetSection("LanguageModel");
18+
var config = lmSection?.Get<LanguageModelConfiguration>() ?? new();
1919

20-
return config?.Client switch
20+
return config.Client switch
2121
{
22-
LanguageModelClient.Ollama => ActivatorUtilities.CreateInstance<OllamaLanguageModelClient>(serviceProvider),
23-
LanguageModelClient.OpenAI => ActivatorUtilities.CreateInstance<OpenAILanguageModelClient>(serviceProvider),
24-
_ => ActivatorUtilities.CreateInstance<OpenAILanguageModelClient>(serviceProvider)
22+
LanguageModelClient.Ollama => ActivatorUtilities.CreateInstance<OllamaLanguageModelClient>(serviceProvider, config),
23+
LanguageModelClient.OpenAI => ActivatorUtilities.CreateInstance<OpenAILanguageModelClient>(serviceProvider, config),
24+
_ => ActivatorUtilities.CreateInstance<OpenAILanguageModelClient>(serviceProvider, config)
2525
};
2626
}
2727
}

DevProxy.Abstractions/LanguageModel/OllamaLanguageModelClient.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ private async Task<bool> IsEnabledInternalAsync()
170170

171171
try
172172
{
173-
var url = $"{_configuration.Url}/api/generate";
173+
var url = $"{_configuration.Url?.TrimEnd('/')}/api/generate";
174174
_logger.LogDebug("Requesting completion. Prompt: {Prompt}", prompt);
175175

176176
var response = await _httpClient.PostAsJsonAsync(url,
@@ -216,7 +216,7 @@ private async Task<bool> IsEnabledInternalAsync()
216216

217217
try
218218
{
219-
var url = $"{_configuration.Url}/api/chat";
219+
var url = $"{_configuration.Url?.TrimEnd('/')}/api/chat";
220220
_logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content);
221221

222222
var response = await _httpClient.PostAsJsonAsync(url,

DevProxy.Abstractions/LanguageModel/OpenAILanguageModelClient.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ private async Task<bool> IsEnabledInternalAsync()
163163

164164
try
165165
{
166-
var url = $"{_configuration.Url}/chat/completions";
166+
var url = $"{_configuration.Url?.TrimEnd('/')}/chat/completions";
167167
_logger.LogDebug("Requesting chat completion. Message: {LastMessage}", messages.Last().Content);
168168

169169
var payload = new OpenAIChatCompletionRequest

DevProxy.Plugins/Generation/OpenApiSpecGeneratorPlugin.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ request.Context.Session is null ||
106106
continue;
107107
}
108108

109-
var methodAndUrlString = request.Message.First();
109+
var methodAndUrlString = request.Message;
110110
Logger.LogDebug("Processing request {MethodAndUrlString}...", methodAndUrlString);
111111

112112
try

DevProxy.Plugins/Mocking/MockResponsePlugin.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ public override Task BeforeRequestAsync(ProxyRequestArgs e)
148148
var clonedResponse = (MockResponse)matchingResponse.Clone();
149149
ProcessMockResponseInternal(e, clonedResponse);
150150
state.HasBeenSet = true;
151+
return Task.CompletedTask;
151152
}
152153
else if (Configuration.BlockUnmockedRequests)
153154
{
@@ -169,6 +170,7 @@ public override Task BeforeRequestAsync(ProxyRequestArgs e)
169170
}
170171
});
171172
state.HasBeenSet = true;
173+
return Task.CompletedTask;
172174
}
173175

174176
Logger.LogRequest("No matching mock response found", MessageType.Skipped, new(e.Session));

DevProxy/Commands/DevProxyCommand.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,8 @@ private void ConfigureCommand()
419419
_recordOption,
420420
_watchPidsOption,
421421
_watchProcessNamesOption,
422+
// _configFileOption is set during DI, so it's always set here
423+
_configFileOption!,
422424
_noFirstRunOption,
423425
_asSystemProxyOption,
424426
_installCertOption,

DevProxy/Extensions/ILoggingBuilderExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ static class ILoggingBuilderExtensions
1313
{
1414
public static ILoggingBuilder AddRequestLogger(this ILoggingBuilder builder)
1515
{
16-
_ = builder.Services.AddSingleton<ILogger, RequestLogger>();
16+
_ = builder.Services.AddSingleton<ILoggerProvider, RequestLoggerProvider>();
1717

1818
return builder;
1919
}

DevProxy/Logging/RequestLogger.cs

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,10 @@
99

1010
namespace DevProxy.Logging;
1111

12-
sealed class RequestLogger(IEnumerable<IPlugin> plugins, IProxyState proxyState) : ILogger
12+
sealed class RequestLogger(IServiceProvider serviceProvider, IProxyState proxyState) : ILogger
1313
{
14-
private readonly IEnumerable<IPlugin> _plugins = plugins;
1514
private readonly IProxyState _proxyState = proxyState;
15+
private readonly IServiceProvider _serviceProvider = serviceProvider;
1616

1717
public bool IsEnabled(LogLevel logLevel) => true;
1818

@@ -32,7 +32,10 @@ public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Except
3232
using var joinableTaskContext = new JoinableTaskContext();
3333
var joinableTaskFactory = new JoinableTaskFactory(joinableTaskContext);
3434

35-
foreach (var plugin in _plugins.Where(p => p.Enabled))
35+
// Lazily resolve plugins to avoid circular dependency
36+
var plugins = _serviceProvider.GetRequiredService<IEnumerable<IPlugin>>();
37+
38+
foreach (var plugin in plugins.Where(p => p.Enabled))
3639
{
3740
joinableTaskFactory.Run(async () => await plugin.AfterRequestLogAsync(requestLogArgs));
3841
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
// See the LICENSE file in the project root for more information.
4+
5+
using DevProxy.Proxy;
6+
using System.Collections.Concurrent;
7+
8+
namespace DevProxy.Logging;
9+
10+
sealed class RequestLoggerProvider(IServiceProvider serviceProvider) : ILoggerProvider
11+
{
12+
private readonly ConcurrentDictionary<string, RequestLogger> _loggers = new();
13+
private readonly IServiceProvider _serviceProvider = serviceProvider;
14+
15+
public ILogger CreateLogger(string categoryName)
16+
{
17+
return _loggers.GetOrAdd(categoryName, name =>
18+
{
19+
var proxyState = _serviceProvider.GetRequiredService<IProxyState>();
20+
return new RequestLogger(_serviceProvider, proxyState);
21+
});
22+
}
23+
24+
public void Dispose()
25+
{
26+
_loggers.Clear();
27+
}
28+
}

DevProxy/Proxy/ProxyConfiguration.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
// The .NET Foundation licenses this file to you under the MIT license.
33
// See the LICENSE file in the project root for more information.
44

5-
using DevProxy.Abstractions.LanguageModel;
65
using DevProxy.Abstractions.Models;
76
using DevProxy.Abstractions.Proxy;
87
using System.Text.Json.Serialization;
@@ -34,7 +33,6 @@ public string ConfigFile
3433
public IEnumerable<MockRequestHeader>? FilterByHeaders { get; set; }
3534
public string? IPAddress { get; set; } = "127.0.0.1";
3635
public bool InstallCert { get; set; } = true;
37-
public LanguageModelConfiguration? LanguageModel { get; set; }
3836
[JsonConverter(typeof(JsonStringEnumConverter))]
3937
public LogLevel LogLevel { get; set; } = LogLevel.Information;
4038
public bool NoFirstRun { get; set; }

0 commit comments

Comments
 (0)