mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-02-13 04:48:53 +00:00
111 lines
2.7 KiB
TypeScript
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;
|
|
}
|
|
}
|