Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Dans cet article, vous allez apprendre à créer un plug-in personnalisé pour le proxy de développement. En créant des plug-ins pour le proxy de développement, vous pouvez étendre ses fonctionnalités et ajouter des fonctionnalités personnalisées pour répondre à vos besoins.
Prérequis
Avant de commencer à créer un plug-in personnalisé, vérifiez que vous disposez des conditions préalables suivantes :
- Sdk .NET v9 Core
- La dernière version de la DLL d’abstractions de proxy de développement, que vous trouverez sur la page des versions gitHub du proxy de développement
Créer un plug-in
Suivez les étapes suivantes pour créer un projet :
Créez un projet de bibliothèque de classes à l’aide de la
dotnet new classlib
commande.dotnet new classlib -n MyCustomPlugin
Ouvrez le projet nouvellement créé dans Visual Studio Code.
code MyCustomPlugin
Ajoutez la DLL Dev Proxy Abstractions (
DevProxy.Abstractions.dll
) au dossier du projet.Ajoutez la
DevProxy.Abstractions.dll
référence à votre fichier projetDevProxyCustomPlugin.csproj
.<ItemGroup> <Reference Include="DevProxy.Abstractions"> <HintPath>.\DevProxy.Abstractions.dll</HintPath> <Private>false</Private> <ExcludeAssets>runtime</ExcludeAssets> </Reference> </ItemGroup>
Ajoutez les packages NuGet requis pour votre projet.
dotnet add package Microsoft.Extensions.Configuration dotnet add package Microsoft.Extensions.Configuration.Binder dotnet add package Microsoft.Extensions.Logging.Abstractions dotnet add package Unobtanium.Web.Proxy
Excluez les DLL de dépendance de la sortie de build en ajoutant une
ExcludeAssets
balise parPackageReference
dans leDevProxyCustomPlugin.csproj
fichier.<ExcludeAssets>runtime</ExcludeAssets>
Créez une classe qui hérite de la
BaseProxy
classe.using DevProxy.Abstractions.Plugins; using DevProxy.Abstractions.Proxy; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public sealed class CatchApiCallsPlugin( ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch) : BasePlugin(logger, urlsToWatch) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e) { Logger.LogTrace("{Method} called", nameof(BeforeRequestAsync)); ArgumentNullException.ThrowIfNull(e); if (!e.HasRequestUrlMatch(UrlsToWatch)) { Logger.LogRequest("URL not matched", MessageType.Skipped, new(e.Session)); return Task.CompletedTask; } var headers = e.Session.HttpClient.Request.Headers; var header = headers.Where(h => h.Name == "Authorization").FirstOrDefault(); if (header is null) { Logger.LogRequest($"Does not contain the Authorization header", MessageType.Warning, new LoggingContext(e.Session)); return Task.CompletedTask; } Logger.LogTrace("Left {Name}", nameof(BeforeRequestAsync)); return Task.CompletedTask; } }
Générez votre projet.
dotnet build
Utiliser votre plug-in personnalisé
Pour utiliser votre plug-in personnalisé, vous devez l’ajouter au fichier de configuration du proxy de développement :
Ajoutez la nouvelle configuration du plug-in dans le
devproxyrc.json
fichier.{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", }] }
Exécutez le proxy de développement.
devproxy
L’exemple de plug-in vérifie toutes les URL correspondantes pour l’en-tête requis Authorization
. Si l’en-tête n’est pas présent, il affiche un message d’avertissement.
Ajout d’une configuration personnalisée à votre plug-in (facultatif)
Vous pouvez étendre la logique de votre plug-in en ajoutant une configuration personnalisée :
Héritez de la classe
BasePlugin<TConfiguration>
. Le proxy de développement expose au moment de l’exécution la configuration analysée du plug-in via la propriétéConfiguration
.using DevProxy.Abstractions.Plugins; using DevProxy.Abstractions.Proxy; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; namespace MyCustomPlugin; public sealed class CatchApiCallsConfiguration { public string? RequiredHeader { get; set; } } public sealed class CatchApiCallsPlugin( ILogger<CatchApiCallsPlugin> logger, ISet<UrlToWatch> urlsToWatch, IProxyConfiguration proxyConfiguration, IConfigurationSection pluginConfigurationSection) : BasePlugin<CatchApiCallsConfiguration>( logger, urlsToWatch, proxyConfiguration, pluginConfigurationSection) { public override string Name => nameof(CatchApiCallsPlugin); public override Task BeforeRequestAsync(ProxyRequestArgs e) { Logger.LogTrace("{Method} called", nameof(BeforeRequestAsync)); ArgumentNullException.ThrowIfNull(e); if (!e.HasRequestUrlMatch(UrlsToWatch)) { Logger.LogRequest("URL not matched", MessageType.Skipped, new(e.Session)); return Task.CompletedTask; } // Start using your custom configuration var requiredHeader = Configuration.RequiredHeader ?? string.Empty; if (string.IsNullOrEmpty(requiredHeader)) { // Required header is not set, so we don't need to do anything Logger.LogRequest("Required header not set", MessageType.Skipped, new LoggingContext(e.Session)); return Task.CompletedTask; } var headers = e.Session.HttpClient.Request.Headers; var header = headers.Where(h => h.Name == requiredHeader).FirstOrDefault(); if (header is null) { Logger.LogRequest($"Does not contain the {requiredHeader} header", MessageType.Warning, new LoggingContext(e.Session)); return Task.CompletedTask; } Logger.LogTrace("Left {Name}", nameof(BeforeRequestAsync)); return Task.CompletedTask; } }
Générez votre projet.
dotnet build
Mettez à jour votre
devproxyrc.json
fichier pour inclure la nouvelle configuration.{ "plugins": [{ "name": "CatchApiCallsPlugin", "enabled": true, "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll", "configSection": "catchApiCalls" }], "catchApiCalls": { "requiredHeader": "Authorization" // Example configuration } }
Exécutez le proxy de développement.
devproxy