Partilhar via


Criar um plugin personalizado

Neste artigo, você aprenderá a criar um plug-in personalizado para o Dev Proxy. Ao criar plugins para o Dev Proxy, você pode estender sua funcionalidade e adicionar recursos personalizados para atender às suas necessidades.

Pré-requisitos

Antes de começar a criar um plug-in personalizado, certifique-se de ter os seguintes pré-requisitos:

Criar um novo plugin

Siga as próximas etapas para criar um novo projeto:

  1. Crie um novo projeto de biblioteca de classes usando o dotnet new classlib comando.

    dotnet new classlib -n MyCustomPlugin
    
  2. Abra o projeto recém-criado no Visual Studio Code.

    code MyCustomPlugin
    
  3. Adicione a DLL Dev Proxy Abstractions (DevProxy.Abstractions.dll) à pasta do projeto.

  4. Adicione o DevProxy.Abstractions.dll como uma referência ao seu arquivo de projeto DevProxyCustomPlugin.csproj .

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.Abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. Adicione os pacotes NuGet necessários para o seu projeto.

    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. Exclua as DLLs de dependência da saída da compilação adicionando uma tag ExcludeAssets para cada PackageReference no arquivo DevProxyCustomPlugin.csproj.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Crie uma nova classe que herda da 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. Construa o seu projeto.

    dotnet build
    

Utilize o seu plugin personalizado

Para usar seu plug-in personalizado, você precisa adicioná-lo ao arquivo de configuração do Dev Proxy:

  1. Adicione a nova configuração do devproxyrc.json plugin no arquivo.

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
      }]
    }
    
  2. Execute o proxy de desenvolvimento.

    devproxy
    

O plugin de exemplo verifica todos os URLs correspondentes em busca do cabeçalho necessário Authorization. Se o cabeçalho não estiver presente, ele mostrará uma mensagem de aviso.

Adicionar configuração personalizada ao seu plugin (opcional)

Você pode estender a lógica do seu plug-in adicionando configuração personalizada:

  1. Herda da classe BasePlugin<TConfiguration>. O Dev Proxy expõe, em tempo de execução, a configuração do plug-in analisada através da propriedade 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. Construa o seu projeto.

    dotnet build
    
  3. Atualize o devproxyrc.json arquivo para incluir a nova configuração.

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
        "configSection": "catchApiCalls"
      }],
      "catchApiCalls": {
        "requiredHeader": "Authorization" // Example configuration
      }
    }
    
  4. Execute o proxy de desenvolvimento.

    devproxy