Files
AFFiNE-Mirror/packages/frontend/electron/src/main/utils.ts
2023-10-18 15:30:08 +00:00

111 lines
2.7 KiB
TypeScript

import http from 'node:http';
import https from 'node:https';
import type { CookiesSetDetails } from 'electron';
export function parseCookie(
cookieString: string,
url: string
): CookiesSetDetails {
const [nameValuePair, ...attributes] = cookieString
.split('; ')
.map(part => part.trim());
const [name, value] = nameValuePair.split('=');
const details: CookiesSetDetails = { url, name, value };
attributes.forEach(attribute => {
const [key, val] = attribute.split('=');
switch (key.toLowerCase()) {
case 'domain':
details.domain = val;
break;
case 'path':
details.path = val;
break;
case 'secure':
details.secure = true;
break;
case 'httponly':
details.httpOnly = true;
break;
case 'expires':
details.expirationDate = new Date(val).getTime() / 1000; // Convert to seconds
break;
case 'samesite':
if (
['unspecified', 'no_restriction', 'lax', 'strict'].includes(
val.toLowerCase()
)
) {
details.sameSite = val.toLowerCase() as
| 'unspecified'
| 'no_restriction'
| 'lax'
| 'strict';
}
break;
default:
// Handle other cookie attributes if needed
break;
}
});
return details;
}
/**
* Send a GET request to a specified URL.
* This function uses native http/https modules instead of fetch to
* bypassing set-cookies headers
*/
export async function simpleGet(requestUrl: string): Promise<{
body: string;
headers: [string, string][];
statusCode: number;
}> {
return new Promise((resolve, reject) => {
const parsedUrl = new URL(requestUrl);
const protocol = parsedUrl.protocol === 'https:' ? https : http;
const options = {
hostname: parsedUrl.hostname,
port: parsedUrl.port,
path: parsedUrl.pathname + parsedUrl.search,
method: 'GET',
};
const req = protocol.request(options, res => {
let data = '';
res.on('data', chunk => {
data += chunk;
});
res.on('end', () => {
resolve({
body: data,
headers: toStandardHeaders(res.headers),
statusCode: res.statusCode || 200,
});
});
});
req.on('error', error => {
reject(error);
});
req.end();
});
function toStandardHeaders(headers: http.IncomingHttpHeaders) {
const result: [string, string][] = [];
for (const [key, value] of Object.entries(headers)) {
if (Array.isArray(value)) {
value.forEach(v => {
result.push([key, v]);
});
} else {
result.push([key, value || '']);
}
}
return result;
}
}