Condividi tramite


Creare un plug-in personalizzato

Questo articolo illustra come creare un plug-in personalizzato per il proxy di sviluppo. Creando plug-in per Dev Proxy, è possibile estenderne le funzionalità e aggiungere funzionalità personalizzate in base alle proprie esigenze.

Prerequisiti

Prima di iniziare a creare un plug-in personalizzato, assicurarsi di avere i prerequisiti seguenti:

Creare un nuovo plug-in

Seguire i passaggi successivi per creare un nuovo progetto:

  1. Creare un nuovo progetto di libreria di classi usando il dotnet new classlib comando .

    dotnet new classlib -n MyCustomPlugin
    
  2. Aprire il progetto appena creato in Visual Studio Code.

    code MyCustomPlugin
    
  3. Aggiungere la DLL Dev Proxy Abstractions (DevProxy.Abstractions.dll) alla cartella del progetto.

  4. Aggiungi DevProxy.Abstractions.dll come un riferimento al file di progetto DevProxyCustomPlugin.csproj.

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.Abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. Aggiungere i pacchetti NuGet necessari per il progetto.

    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. Escludere le DLL di dipendenza dall'output di compilazione aggiungendo un ExcludeAssets tag per PackageReference nel DevProxyCustomPlugin.csproj file.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Creare una nuova classe che eredita dalla 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. Crea il progetto.

    dotnet build
    

Usare il plug-in personalizzato

Per usare il plug-in personalizzato, è necessario aggiungerlo al file di configurazione di Dev Proxy:

  1. Aggiungere la nuova configurazione del plug-in nel devproxyrc.json file.

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
      }]
    }
    
  2. Eseguire il proxy di sviluppo.

    devproxy
    

Il plug-in di esempio controlla tutti gli URL corrispondenti per l'intestazione richiesta Authorization . Se l'intestazione non è presente, viene visualizzato un messaggio di avviso.

Aggiunta di una configurazione personalizzata al plug-in (facoltativo)

È possibile estendere la logica del plug-in aggiungendo una configurazione personalizzata:

  1. Ereditare dalla BasePlugin<TConfiguration> classe . Dev Proxy espone la configurazione del plug-in analizzato in fase di esecuzione tramite la Configuration proprietà .

    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. Crea il progetto.

    dotnet build
    
  3. Aggiornare il devproxyrc.json file in modo da includere la nuova configurazione.

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
        "configSection": "catchApiCalls"
      }],
      "catchApiCalls": {
        "requiredHeader": "Authorization" // Example configuration
      }
    }
    
  4. Eseguire il proxy di sviluppo.

    devproxy