Sdílet prostřednictvím


Vytvořte vlastní plugin

Na první pohled
Cílem: Vytvoření vlastního pluginu Dev Proxy
Čas: 30 minut
Pluginy: Vlastní modul plug-in
Prerequisites:Set up Dev Proxy, technologie .NET 10 SDK

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.

Pluginy HTTP vs. pluginy stdio

Dev Proxy podporuje dva typy modulů plug-in v závislosti na provozu, který chcete zachytit:

  • Pluginy HTTP zachycují HTTP(S) požadavky a odpovědi mezi vaší aplikací a rozhraními API. Dědí ze tříd a přepisují metody, jako jsou a . Moduly plug-in HTTP použijte, pokud chcete simulovat chyby rozhraní API, přidávat napodobení odpovědí, ověřovat hlavičky požadavků nebo jinak kontrolovat a upravovat provoz HTTP.

  • Moduly plug-in Stdio zachycují zprávy odeslané přes standardní vstup/výstup (stdin, stdout, stderr) mezi nadřazeným procesem a podřízeným procesem. Implementují rozhraní (které také implementuje) a přepisují metody jako , a . Moduly plug-in stdio používejte při práci s nástroji, které komunikují přes stdio, jako jsou servery MCP (Model Context Protocol).

Jedna třída modulu plug-in dokáže zpracovat provoz HTTP i stdio přepsáním metod z obou sad.

Požadavky

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

Vytvořte nový plugin

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

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

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

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

  4. Přidejte jako odkaz do souboru projektu .

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.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 dynamické knihovny (DLL) závislostí z výstupu sestavení přidáním jedné značky na každý v souboru.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Vytvořte novou třídu, která dědí z třídy.

    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, CancellationToken cancellationToken)
        {
            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. Sestavte svůj projekt.

    dotnet build
    

Použijte svůj vlastní plugin

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 modulu plug-in.

    Soubor: devproxyrc.json

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

    devproxy
    

Ukázkový plugin zkontroluje všechny odpovídající adresy URL na přítomnost požadované 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. Dědí z třídy. Dev Proxy za běhu zveřejňuje konfiguraci pluginu prostřednictvím vlastnosti .

    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(
        HttpClient httpClient,
        ILogger<CatchApiCallsPlugin> logger,
        ISet<UrlToWatch> urlsToWatch,
        IProxyConfiguration proxyConfiguration,
        IConfigurationSection pluginConfigurationSection) :
        BasePlugin<CatchApiCallsConfiguration>(
            httpClient,
            logger,
            urlsToWatch,
            proxyConfiguration,
            pluginConfigurationSection)
    {
        public override string Name => nameof(CatchApiCallsPlugin);
    
        public override Task BeforeRequestAsync(ProxyRequestArgs e, CancellationToken cancellationToken)
        {
            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. Sestavte svůj projekt.

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

    Soubor: devproxyrc.json

    {
      "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.2.0/rc.schema.json",
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net10.0/MyCustomPlugin.dll",
        "configSection": "catchApiCalls"
      }],
      "catchApiCalls": {
        "requiredHeader": "Authorization"
      }
    }
    
  4. Spusťte dev proxy server.

    devproxy
    

Viz také

  • Architektura modulů plug-in
  • Použití přednastavených konfigurací
  • Konfigurace dev proxy serveru