WebView2の時、createHttpServerのreq.urlNo.10537
こみやんま さん 25/02/05 01:24
 
jsmode "WebView2\\" + currentmacrofilename;
js {
if (typeof(server) != "undefined") {
    server.close();
}

debuginfo(2);
var server = hidemaru.createHttpServer(function(req, res){
    console.log("★" + req.url);
    if(req.url=="/text"){
      res.writeHead(200);//OK
      res.write("あん♪" );
      res.end("requested url:"+req.url );
    } else {
      res.writeHead(404);//Not found
      res.end("");
    }
  });
  server.listen(0);
  console.log(server.port);

  browserpanecommand
  (
    {
        target:"_each",
        url:"http://localhost:" + server.port + "/text",
        show: 1
    }
  );

};





[ ]
RE:10537 WebView2の時、createHttpServerNo.10538
こみやんま さん 25/02/05 01:26
 
あれ、文字列どこにったんだ...

上のWebView2とJScriptを書き換えると挙動が全然違うことがわかります。
req.url 自体が netive code function になっていて値が返ってきていません。

[ ]
RE:10538 WebView2の時、createHttpServerNo.10540
秀丸担当 さん 25/02/05 10:39
 
ご指摘ありがとうございます。
WebView2だとそうなることが確認できました。
req.urlのプロパティとしては普通に文字列を返していました。
なぜかわからないですが、WebView2がそう判断しているようです。

ChatGPTに聞いてみたら、
async function getReqUrl(req) {
  return await req.url;
}
みたいにラップして、
  getReqUrl(req).then(url => {
    //...
  });
にすればいいというので、そうしたみたらできました。

ラップせず、あてずっぽで適当に、
  req.url.then(url => {
    //...
  });
こんな感じに書いたらできてしまいましたが、この書き方が合っているのかは知らな
いです。


なんとなくWebView2が意図的にしているような気もしますが、ラップしてもしなくて
も呼ばれてはいるし、シングルスレッドなのは変わらないので、意味は無いと思いま
す。
意図的でないとしたらWebView2の不具合かもしれません。
秀丸エディタではどうしようもなく、上記のような書き方をすのは難解なので、これ
をWebView2で使うのは非推奨にしようと思います。

[ ]
RE:10540 WebView2の時、createHttpServerNo.10541
こみやんま さん 25/02/05 20:25
 
うーん、なるほど、Promise 的なオブジェクトが評価時に返っくる感じなんですねぇ。

引数の関数自体に「async」を加えて、 「string でなかったら、await して」みた
いなのが「傷が浅い」でしょうか。

var server = hidemaru.createHttpServer(async (req, res) => {
    let url = req.url;
    if (typeof(url) != "string") {
        url = await req.url;
    }
    console.log("★" + typeof(url));
    if(url=="/text"){
      res.writeHead(200);//OK
      res.write("あん2♪" );
      res.end("requested url:"+url );
    } else {
      res.writeHead(404);//Not found
      res.end("");
    }
  });
  server.listen(0);

  console.log(server.port);

ただ、いずれにしても将来不具合が治ったり仕様がJScriptと統一になることで、
逆に動作しなくなる危険性があるので、WebView2側の使用はためらわれますね。

[ ]