Partager via


Créer un plug-in personnalisé

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 :

  1. Créez un projet de bibliothèque de classes à l’aide de la dotnet new classlib commande.

    dotnet new classlib -n MyCustomPlugin
    
  2. Ouvrez le projet nouvellement créé dans Visual Studio Code.

    code MyCustomPlugin
    
  3. Ajoutez la DLL Dev Proxy Abstractions (DevProxy.Abstractions.dll) au dossier du projet.

  4. Ajoutez la DevProxy.Abstractions.dll référence à votre fichier projet DevProxyCustomPlugin.csproj .

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.Abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. 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
    
  6. Excluez les DLL de dépendance de la sortie de build en ajoutant une ExcludeAssets balise par PackageReference dans le DevProxyCustomPlugin.csproj fichier.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. 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;
        }
    }
    
  8. 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 :

  1. Ajoutez la nouvelle configuration du plug-in dans le devproxyrc.json fichier.

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
      }]
    }
    
  2. 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 :

  1. 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;
        }
    }
    
  2. Générez votre projet.

    dotnet build
    
  3. 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
      }
    }
    
  4. Exécutez le proxy de développement.

    devproxy