Sdílet prostřednictvím


Vytvoření vlastního modulu plug-in

V tomto článku se dozvíte, jak vytvořit vlastní modul plug-in pro vývojový proxy server. Vytvořením modulů plug-in pro Dev Proxy můžete rozšířit jeho funkce a přidat vlastní funkce tak, aby vyhovovaly vašim potřebám.

Požadavky

Než začnete vytvářet vlastní modul plug-in, ujistěte se, že máte následující požadavky:

  • Sada .NET Core SDK
  • Nejnovější verze knihovny DLL pro abstrakce dev proxy serveru, kterou najdete na stránce verzí GitHubu pro vývoj proxy

Vytvoření nového modulu plug-in

Pokud chcete vytvořit nový projekt, postupujte podle dalších kroků:

  1. Pomocí příkazu vytvořte nový projekt dotnet new classlib knihovny tříd.

    dotnet new classlib -n MyCustomPlugin
    
  2. Otevřete nově vytvořený projekt v editoru Visual Studio Code.

    code MyCustomPlugin
    
  3. Přidejte knihovnu DLL pro abstrakce dev proxy (dev-proxy-abstractions.dll) do složky projektu.

  4. Přidejte ho dev-proxy-abstractions.dll jako odkaz na soubor projektu DevProxyCustomPlugin.csproj .

    <ItemGroup>
      <Reference Include="dev-proxy-abstractions">
        <HintPath>.\dev-proxy-abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. Přidejte balíčky NuGet vyžadované pro váš projekt.

    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. Vylučte knihovny DLL závislostí z výstupu sestavení přidáním ExcludeAssets značky pro každý PackageReference v DevProxyCustomPlugin.csproj souboru.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Vytvořte novou třídu, která implementuje BaseProxyPlugin rozhraní.

    using Microsoft.DevProxy.Abstractions;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Logging;
    
    namespace MyCustomPlugin;
    
    public class CatchApiCalls(IPluginEvents pluginEvents, IProxyContext context, ILogger logger, ISet<UrlToWatch> UrlsToWatch, IConfigurationSection? configSection = null) : BaseProxyPlugin(pluginEvents, context, logger, UrlsToWatch, configSection)
    {
      public override string Name => nameof(CatchApiCalls);
    
      public override async Task RegisterAsync()
      {
        await base.RegisterAsync();
    
        PluginEvents.BeforeRequest += BeforeRequestAsync;
      }
    
      private Task BeforeRequestAsync(object sender, ProxyRequestArgs e)
      {
        if (UrlsToWatch is null ||
          !e.HasRequestUrlMatch(UrlsToWatch))
        {
          // No match for the URL, so we don't need to do anything
          Logger.LogRequest("URL not matched", MessageType.Skipped, new LoggingContext(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;
        }
    
        return Task.CompletedTask;
      }
    }
    
  8. Sestavte svůj projekt.

    dotnet build
    

Použití vlastního modulu plug-in

Pokud chcete použít vlastní modul plug-in, musíte ho přidat do konfiguračního souboru dev proxy serveru:

  1. Do souboru přidejte novou konfiguraci devproxyrc.json modulu plug-in.

    {
      "plugins": [{
        "name": "CatchApiCalls",
        "enabled": true,
        "pluginPath": "./bin/Debug/net8.0/MyCustomPlugin.dll",
      }]
    }
    
  2. Spusťte dev proxy server.

    devproxy
    

Ukázkový modul plug-in zkontroluje všechny odpovídající adresy URL požadované autorizační hlavičky. Pokud záhlaví není k dispozici, zobrazí se zpráva s upozorněním.

Přidání vlastní konfigurace do modulu plug-in (volitelné)

Logiku modulu plug-in můžete rozšířit přidáním vlastní konfigurace:

  1. Přidejte nový _configuration objekt a vytvořte vazbu v Register metodě.

    using Microsoft.DevProxy.Abstractions;
    using Microsoft.Extensions.Configuration;
    using Microsoft.Extensions.Logging;
    
    namespace MyCustomPlugin;
    
    public class CatchApiCallsConfiguration
    {
      public string? RequiredHeader { get; set; }
    }
    
    public class CatchApiCalls(IPluginEvents pluginEvents, IProxyContext context, ILogger logger, ISet<UrlToWatch> UrlsToWatch, IConfigurationSection? configSection = null) : BaseProxyPlugin(pluginEvents, context, logger, UrlsToWatch, configSection)
    {
      public override string Name => nameof(CatchApiCalls);
    
      // Define you custom configuration
      private readonly CatchApiCallsConfiguration _configuration = new();
    
      public override async Task RegisterAsync()
      {
        await base.RegisterAsync();
    
        // Bind your plugin configuration
        configSection?.Bind(_configuration);
    
        // Register your event handlers
        PluginEvents.BeforeRequest += BeforeRequestAsync;
      }
    
      private Task BeforeRequestAsync(object sender, ProxyRequestArgs e)
      {
        if (UrlsToWatch is null ||
          !e.HasRequestUrlMatch(UrlsToWatch))
        {
          // No match for the URL, so we don't need to do anything
          Logger.LogRequest("URL not matched", MessageType.Skipped, new LoggingContext(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;
        }
    
        return Task.CompletedTask;
      }
    }
    
  2. Sestavte svůj projekt.

    dotnet build
    
  3. Aktualizujte devproxyrc.json soubor tak, aby zahrnoval novou konfiguraci.

    {
      "plugins": [{
        "name": "CatchApiCalls",
        "enabled": true,
        "pluginPath": "./bin/Debug/net8.0/MyCustomPlugin.dll",
        "configSection": "catchApiCalls"
      }],
      "catchApiCalls": {
        "requiredHeader": "Authorization" // Example configuration
      }
    }
    
  4. Spusťte dev proxy server.

    devproxy