[ 新規に投稿する ]

WebView2の時、createHttpServerのreq.urlが不正No.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の時、createHttpServerのreq.urlが不正No.10538
こみやんま さん 25/02/05 01:26 [ コメントを投稿する ]
  あれ、文字列どこにったんだ...

上のWebView2とJScriptを書き換えると挙動が全然違うことがわかります。
req.url 自体が netive code function になっていて値が返ってきていません。
[ ]
RE:10538 WebView2の時、createHttpServerのreq.urlが不正No.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の時、createHttpServerのreq.urlが不正No.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側の使用はためらわれますね。
[ ]

[ 新規に投稿する ]