2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

日本語プログラミング言語 Mind(マインド)Advent Calendar 2024

Day 6

VSCodeでkestrelを起動して日本語プログラミング言語MindのCGIを実行する(ステップ2)

Last updated at Posted at 2024-11-05

はじめに

前回のタイトルは長かったので少しつめてみました。日本語プログラミング言語MindのCGIをkestrelで実行するのステップ2です。

VSCodeや.NETCore、C#とそのVSCodeエクステンションはコンソールアプリケーションがデバッグ実行できる程度には用意されていることを前提とします。

前提条件

Windows11 Pro 22H2 22621.4169
VSCode(Visual Studo Code) 1.95.1
C# 12
dotnet-sdk-8.0.206-win-x64
Mind Version 8.0.08 for Windows

VSCodeの拡張機能

.NET Install Tool 2.0.2 Microsoft
Base language support for C# 2.18.16 Microsoft

ASP.NET Core(空)環境の構成

生成されているフォルダ構成はこちらの記事を参照してください。プロジェクト名がkestrelからkestrelcgiに変わっただけです。

Programs.csには当初下記のコードが記述されています。

Programs.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

前回の状態は前回の記事を参照してください

これをさらに下記のように書き換えます。前回は実行できるcgiファイル名が固定でしたが、今回はリクエストから切り出したファイルがフォルダに存在したら実行するという形に変更されています。

Programs.cs
var builder = WebApplication.CreateBuilder(args);

// Kestrelサーバーの設定
builder.WebHost.UseKestrel(options =>
{
    // localhost(127.0.0.1)からの接続をポート5000で受け入れる 
    options.ListenLocalhost(5000);
});
// ルートディレクトリの設定(CGIスクリプトの配置場所)
builder.WebHost.UseContentRoot(Directory.GetCurrentDirectory());

var app = builder.Build();

// 静的ファイルのサポート
app.UseStaticFiles();

// CGIの設定
app.Use(static async (context, next) =>
{
    if (context.Request.Path.StartsWithSegments("/cgi", out var remainingPath))
    {
        // 残りのパスからスクリプト名を取得 
        var scriptName = remainingPath.Value?.TrimStart('/'); 
        var scriptsDir = Path.Combine(Directory.GetCurrentDirectory(), "cgi"); 
        var scriptFilePath = Path.Combine(scriptsDir, scriptName??"");
        // スクリプトファイルが存在する場合に実行 
        if (File.Exists(scriptFilePath)) {
            var process = new System.Diagnostics.Process
            {
                StartInfo = new System.Diagnostics.ProcessStartInfo
                {
                    FileName = scriptFilePath, // CGIスクリプトのパス
                    Arguments = "", // 必要な引数
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true,
                    UseShellExecute = false,
                    CreateNoWindow = true
                }
            };
            process.Start();
            //レスポンスヘッダにContent-Typeを追加 
            context.Response.ContentType = "text/html";
            await process.StandardOutput.BaseStream.CopyToAsync(context.Response.Body);
            await process.WaitForExitAsync();

        }
        else 
        {   context.Response.StatusCode = 404; 
            await context.Response.WriteAsync("CGI script not found");;
        }
    }
    else
    {
        await next.Invoke();
    }
});

app.Run();

Mind CGIアプリケーションの作成

前回の記事へのMind開発者の@killyさんからのアドバイスによりサンプルコードを下記のように修正します。

hellMind.src
メインは
	ヘッダ出力済み・mimeヘッダを htmlヘッダ出力済みに 入れ
	「MindによるCGIのテスト」で、HTMLヘッダ出力し
	「こんにちは、Mind!」を、大きく表示すること。

VSCodeのターミナルでコマンドプロンプトを開いて、Mindでビルドします。

C:\developments\vscode\kestrelcgi>mind helloMind c:\pmind\lib\cgilib

日本語プログラミング言語 Mind Version 8.07 for Windows
          Copyright(C) 1985 Scripts Lab. Inc.
コンパイル中 .. 終了
Coping.. C:\pmind\bin\mindexcgi.exe --> helloMind.cgi

C:\developments\vscode\kestrelcgi>

生成されたhelloMind.cgiをC:\developments\vscode\kestrelcgi\cgiにコピーします。
C:\pmind\binからmrunt160.exeを前回コピー済みです。

C:.
│  appsettings.Development.json
│  appsettings.json
│  helloMind.cgi
│  helloMind.his
│  helloMind.mco
│  helloMind.src
│  helloMind.sym
│  kestrelcgi.csproj
│  Program.cs
│
├─.vscode
│      launch.json
│      tasks.json
│
├─bin
├─cgi
│      helloMind.cgi
│      mrunt160.exe

実行開始

VSCodeのデバッグ開始で".NET Core Launch (web)"を選択して実行開始します。ブラウザが立ち上がって下図のようになりました。

mindcgi3.png

左上に
Content-type: text/html; charset=shift_jis
と出力されていたのは無事に抑止されました。

おわりに

いかがでしたでしょうか?kestrel serverをC#のコードで構成するのは、本来の目的からはだいぶずれた話となっておりますが、MindCGIが動きはじめたのでだいぶうれしいです。IISでは動かなかったのでその個人的なリベンジの備忘録です。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?