Bagikan melalui


Membuat plugin kustom

Sekilas
Tujuan: Membangun plugin Dev Proxy kustom
Waktu: 30 menit
Plugin: Plugin kustom
Prasyarat:Menyiapkan Dev Proxy, .NET 9 SDK

Dalam artikel ini, Anda mempelajari cara membuat plugin kustom untuk Dev Proxy. Dengan membuat plugin untuk Dev Proxy, Anda dapat memperluas fungsionalitasnya dan menambahkan fitur kustom agar sesuai dengan kebutuhan Anda.

Prasyarat

Sebelum Anda mulai membuat plugin kustom, pastikan Anda memiliki prasyarat berikut:

Membuat plugin baru

Ikuti langkah-langkah berikutnya untuk membuat proyek baru:

  1. Buat proyek pustaka kelas baru menggunakan dotnet new classlib perintah .

    dotnet new classlib -n MyCustomPlugin
    
  2. Buka proyek yang baru dibuat di Visual Studio Code.

    code MyCustomPlugin
    
  3. Tambahkan DEV Proxy Abstractions DLL (DevProxy.Abstractions.dll) ke folder proyek.

  4. DevProxy.Abstractions.dll Tambahkan sebagai referensi ke file proyek DevProxyCustomPlugin.csproj Anda.

    <ItemGroup>
      <Reference Include="DevProxy.Abstractions">
        <HintPath>.\DevProxy.Abstractions.dll</HintPath>
        <Private>false</Private>
        <ExcludeAssets>runtime</ExcludeAssets>
      </Reference>
    </ItemGroup>
    
  5. Tambahkan paket NuGet yang diperlukan untuk proyek Anda.

    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. Keluarkan DLL dependensi dengan menambahkan tag ExcludeAssets setiap PackageReference dalam file DevProxyCustomPlugin.csproj dari output build.

    <ExcludeAssets>runtime</ExcludeAssets>
    
  7. Buat kelas baru yang mewarisi dari BaseProxy kelas .

    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. Bangun proyek Anda.

    dotnet build
    

Gunakan plugin kustom Anda

Untuk menggunakan plugin kustom, Anda perlu menambahkannya ke file konfigurasi Dev Proxy:

  1. Tambahkan konfigurasi plugin baru dalam devproxyrc.json file.

    File: devproxyrc.json

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
      }]
    }
    
  2. Jalankan Proksi Dev.

    devproxy
    

Contoh plugin memeriksa semua URL yang cocok untuk header yang diperlukan Authorization . Jika header tidak ada, akan muncul pesan peringatan.

Menambahkan konfigurasi kustom ke plugin Anda (opsional)

Anda dapat memperluas logika plugin Anda dengan menambahkan konfigurasi kustom:

  1. Menginherit dari kelas BasePlugin<TConfiguration>. Dev Proxy mengekspos konfigurasi plugin yang diurai selama runtime melalui properti 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. Bangun proyek Anda.

    dotnet build
    
  3. Perbarui file Anda devproxyrc.json untuk menyertakan konfigurasi baru.

    File: devproxyrc.json

    {
      "plugins": [{
        "name": "CatchApiCallsPlugin",
        "enabled": true,
        "pluginPath": "./bin/Debug/net9.0/MyCustomPlugin.dll",
        "configSection": "catchApiCalls"
      }],
      "catchApiCalls": {
        "requiredHeader": "Authorization" // Example configuration
      }
    }
    
  4. Jalankan Proksi Dev.

    devproxy
    

Lihat juga