fix: `/share` with unicode characters in the URL (#13846)

* fix: `/share` with unicode characters in the URL

* docs(changelog): `/share` で日本語等を含むurlがurlエンコードされない問題を修正
This commit is contained in:
anatawa12 2024-05-20 23:21:11 +09:00 committed by GitHub
parent 5836bd85df
commit 367bf0c8fc
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 29 additions and 1 deletions

View File

@ -60,6 +60,7 @@
- Fix: リバーシの対局を正しく共有できないことがある問題を修正
- Fix: 通知をグループ化している際に、人数が正常に表示されないことがある問題を修正
- Fix: 連合なしの状態の読み書きができない問題を修正
- Fix: `/share` で日本語等を含むurlがurlエンコードされない問題を修正
### Server
- Enhance: エンドポイント`antennas/update`の必須項目を`antennaId`のみに

View File

@ -64,7 +64,34 @@ async function init() {
// Google
if (text?.startsWith(`${title.value}.\n`)) noteText += text.replace(`${title.value}.\n`, '');
else if (text && title.value !== text) noteText += `${text}\n`;
if (url) noteText += `${url}`;
if (url) {
try {
// Normalize the URL to URL-encoded and puny-coded from with the URL constructor.
//
// It's common to use unicode characters in the URL for better visibility of URL
// like: https://ja.wikipedia.org/wiki/
// or like: https://.moe/
// However, in the MFM, the unicode characters must be URL-encoded to be parsed as `url` node
// like: https://ja.wikipedia.org/wiki/%E3%83%9F%E3%82%B9%E3%82%AD%E3%83%BC
// or like: https://xn--931a.moe/
// Therefore, we need to normalize the URL to URL-encoded form.
//
// The URL constructor will parse the URL and normalize unicode characters
// in the host to punycode and in the path component to URL-encoded form.
// (see url.spec.whatwg.org)
//
// In addition, the current MFM renderer decodes the URL-encoded path and / punycode encoded host name so
// this normalization doesn't make the visible URL ugly.
// (see MkUrl.vue)
noteText += new URL(url).href;
} catch {
// fallback to original URL if the URL is invalid.
// note that this is extremely rare since the `url` parameter is designed to share a URL and
// the URL constructor will throw TypeError only if failure, which means the URL is not valid.
noteText += url;
}
}
initialText.value = noteText.trim();
if (visibility.value === 'specified') {