CSAPP/src/IpcMainHandler.ts

102 lines
3.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { ipcMain, screen, session } from "electron";
import http from 'http';
import https from 'https';
import { URL } from 'url';
export function initialize(): void {
// Get primary display需要注意size 是逻辑像素尺寸logical screen size已被 DPI 缩放影响,需要除以 DPI 缩放比例才是物理像素尺寸physical screen size
ipcMain.handle('get-primary-display', () => screen.getPrimaryDisplay());
// Check if the URL is available
ipcMain.handle('check-url-available', async (event, rawUrl: string) => {
try {
const url: URL = new URL(rawUrl);
const lib = url.protocol === 'https:' ? https : http;
return await new Promise((resolve) => {
// 先用HEAD请求如果遇到403则再用GET请求再试一次部分服务器可能禁止HEAD请求
const requestOptions: http.RequestOptions | https.RequestOptions = {
hostname: url.hostname,
port: url.port || undefined,
path: url.pathname + url.search,
headers: {
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, br',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36'
}
};
const headReq = lib.request(
{
method: 'HEAD',
timeout: 3000,
...requestOptions
},
(res) => {
console.log('check-url-available HEAD', url.toString(), res.statusCode, res.statusMessage);
if (res.statusCode === 403) {
headReq.destroy()
const getReq = lib.get({
method: 'GET',
...requestOptions
}, (res) => {
console.log('check-url-available GET', url.toString(), res.statusCode, res.statusMessage);
resolve({ ok: true, status: res.statusCode, message: res.statusMessage });
getReq.destroy()
});
getReq.on('error', (err) => {
resolve({ ok: false, status: -1, message: err.message });
});
getReq.on('timeout', () => {
resolve({ ok: false, status: -1, message: 'GET Timeout' });
getReq.destroy();
});
} else {
resolve({ ok: true, status: res.statusCode, message: res.statusMessage });
headReq.destroy();
}
}
);
headReq.on('error', (err) => {
resolve({ ok: false, status: -1, message: err.message });
});
headReq.on('timeout', () => {
resolve({ ok: false, status: -1, message: 'HEAD Timeout' });
headReq.destroy();
});
headReq.end();
})
} catch (e) {
return { ok: false, status: -1, message: 'Invalid URL' };
}
});
// Set webviews cookie
ipcMain.handle('set-webview-cookie', async (event, url: string, cookie: string) => {
try {
const parsedUrl = new URL(url);
const cookies: Array<{ Key: string, Value: string }> = JSON.parse(cookie);
for (const cookieItem of cookies) {
await session.defaultSession.cookies.set({
url: url,
name: cookieItem.Key.trim(),
value: cookieItem.Value.trim(),
domain: parsedUrl.hostname,
path: '/',
secure: parsedUrl.protocol === 'https:',
httpOnly: true
});
}
return true;
} catch (error) {
console.error('设置cookie失败:', error);
return false;
}
});
}