mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-01-15 05:33:29 +01:00
- Add getCookieCounts function to parse cookie headers and count individual cookies (not just headers) - Deduplicates by cookie name using Sets - Display as sent/received format like Headers tab - Add showZero to CountBadge so 0/3 displays properly - Add tests for getCookieCounts
95 lines
3.0 KiB
TypeScript
95 lines
3.0 KiB
TypeScript
import type {
|
|
AnyModel,
|
|
Cookie,
|
|
Environment,
|
|
HttpResponseEvent,
|
|
HttpResponseHeader,
|
|
} from '@yaakapp-internal/models';
|
|
import { getMimeTypeFromContentType } from './contentType';
|
|
|
|
export const BODY_TYPE_NONE = null;
|
|
export const BODY_TYPE_GRAPHQL = 'graphql';
|
|
export const BODY_TYPE_JSON = 'application/json';
|
|
export const BODY_TYPE_BINARY = 'binary';
|
|
export const BODY_TYPE_OTHER = 'other';
|
|
export const BODY_TYPE_FORM_URLENCODED = 'application/x-www-form-urlencoded';
|
|
export const BODY_TYPE_FORM_MULTIPART = 'multipart/form-data';
|
|
export const BODY_TYPE_XML = 'text/xml';
|
|
|
|
export function cookieDomain(cookie: Cookie): string {
|
|
if (cookie.domain === 'NotPresent' || cookie.domain === 'Empty') {
|
|
return 'n/a';
|
|
}
|
|
if ('HostOnly' in cookie.domain) {
|
|
return cookie.domain.HostOnly;
|
|
}
|
|
if ('Suffix' in cookie.domain) {
|
|
return cookie.domain.Suffix;
|
|
}
|
|
return 'unknown';
|
|
}
|
|
|
|
export function modelsEq(a: AnyModel, b: AnyModel) {
|
|
if (a.model !== b.model) {
|
|
return false;
|
|
}
|
|
if (a.model === 'key_value' && b.model === 'key_value') {
|
|
return a.key === b.key && a.namespace === b.namespace;
|
|
}
|
|
if ('id' in a && 'id' in b) {
|
|
return a.id === b.id;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
export function getContentTypeFromHeaders(headers: HttpResponseHeader[] | null): string | null {
|
|
return headers?.find((h) => h.name.toLowerCase() === 'content-type')?.value ?? null;
|
|
}
|
|
|
|
export function getCharsetFromContentType(headers: HttpResponseHeader[]): string | null {
|
|
const contentType = getContentTypeFromHeaders(headers);
|
|
if (contentType == null) return null;
|
|
|
|
const mimeType = getMimeTypeFromContentType(contentType);
|
|
return mimeType.parameters.get('charset') ?? null;
|
|
}
|
|
|
|
export function isBaseEnvironment(environment: Environment): boolean {
|
|
return environment.parentModel === 'workspace';
|
|
}
|
|
|
|
export function isSubEnvironment(environment: Environment): boolean {
|
|
return environment.parentModel === 'environment';
|
|
}
|
|
|
|
export function isFolderEnvironment(environment: Environment): boolean {
|
|
return environment.parentModel === 'folder';
|
|
}
|
|
|
|
export function getCookieCounts(
|
|
events: HttpResponseEvent[] | undefined,
|
|
): { sent: number; received: number } {
|
|
if (!events) return { sent: 0, received: 0 };
|
|
|
|
// Use Sets to deduplicate by cookie name
|
|
const sentNames = new Set<string>();
|
|
const receivedNames = new Set<string>();
|
|
|
|
for (const event of events) {
|
|
const e = event.event;
|
|
if (e.type === 'header_up' && e.name.toLowerCase() === 'cookie') {
|
|
// Parse "Cookie: name=value; name2=value2" format
|
|
for (const pair of e.value.split(';')) {
|
|
const name = pair.split('=')[0]?.trim();
|
|
if (name) sentNames.add(name);
|
|
}
|
|
} else if (e.type === 'header_down' && e.name.toLowerCase() === 'set-cookie') {
|
|
// Parse "Set-Cookie: name=value; ..." - first part before ; is name=value
|
|
const name = e.value.split(';')[0]?.split('=')[0]?.trim();
|
|
if (name) receivedNames.add(name);
|
|
}
|
|
}
|
|
|
|
return { sent: sentNames.size, received: receivedNames.size };
|
|
}
|