diff --git a/src/measurement/handler/result.ts b/src/measurement/handler/result.ts index 41d0a34d..dc289697 100644 --- a/src/measurement/handler/result.ts +++ b/src/measurement/handler/result.ts @@ -1,6 +1,6 @@ import Joi from 'joi'; import type { Probe } from '../../probe/types.js'; -import type { DnsRegularResult, DnsTraceResult, MeasurementResultMessage, MtrResult, PingResult, TestResult, TracerouteResult } from '../types.js'; +import type { DnsRegularResult, DnsTraceResult, HttpResult, MeasurementResultMessage, MtrResult, PingResult, TestResult, TracerouteResult } from '../types.js'; import { getMeasurementRunner } from '../runner.js'; import { getProbeValidator } from '../../lib/probe-validator.js'; @@ -110,6 +110,38 @@ const mtrResultSchema = Joi.object({ })), }); +const httpResultSchema = Joi.object({ + status: Joi.string().valid('finished', 'failed').required(), + rawOutput: Joi.string().allow(null).required(), + resolvedAddress: Joi.string().allow(null), + headers: Joi.object().pattern(Joi.string(), Joi.string()), + rawHeaders: Joi.string().allow(null), + rawBody: Joi.string().allow(null), + truncated: Joi.boolean(), + statusCode: Joi.number().allow(null), + statusCodeName: Joi.string().allow(null), + timings: Joi.object().pattern(Joi.string(), Joi.number().allow(null)), + tls: Joi.object({ + authorized: Joi.boolean().required(), + createdAt: Joi.string(), + expiresAt: Joi.string(), + subject: Joi.object({ + CN: Joi.string().required(), + alt: Joi.string().allow(null).required(), + }).required(), + issuer: Joi.object({ + C: Joi.string().required(), + O: Joi.string().required(), + CN: Joi.string().required(), + }).required(), + keyType: Joi.string().valid('RSA', 'EC').allow(null).required(), + keyBits: Joi.number().allow(null).required(), + serialNumber: Joi.string().required(), + fingerprint256: Joi.string().required(), + publicKey: Joi.string().allow(null).required(), + }).allow(null), +}); + const schema = Joi.object({ testId: Joi.string().required(), measurementId: Joi.string().required(), @@ -119,6 +151,7 @@ const schema = Joi.object({ tracerouteResultSchema, dnsResultSchema, mtrResultSchema, + httpResultSchema, ]).required(), }).required(); diff --git a/src/measurement/types.ts b/src/measurement/types.ts index 3e69aa63..0f8f5eca 100644 --- a/src/measurement/types.ts +++ b/src/measurement/types.ts @@ -20,17 +20,17 @@ type PingTiming = { }; export type PingResult = TestResult & { - resolvedAddress: string | null, - resolvedHostname: string | null, + resolvedAddress: string | null; + resolvedHostname: string | null; timings: PingTiming[]; stats: { - min: number | null, - max: number | null, - avg: number | null, - total: number | null, - loss: number | null, - rcv: number | null, - drop: number | null, + min: number | null; + max: number | null; + avg: number | null; + total: number | null; + loss: number | null; + rcv: number | null; + drop: number | null; }; }; @@ -150,21 +150,33 @@ export type HttpProgress = TestProgress & { }; export type HttpResult = TestResult & { - resolvedAddress: string; + resolvedAddress: string | null; headers: Record; - rawHeaders: string; - rawBody: string; + rawHeaders: string | null; + rawBody: string | null; truncated: boolean; - statusCode: number; + statusCode: number | null; + statusCodeName: string | null; timings: Record; tls: { - [key: string]: any; // eslint-disable-line @typescript-eslint/no-explicit-any authorized: boolean; - authorizationError?: string; createdAt: string; expiresAt: string; - issuer: Record; - subject: Record; + authorizationError?: string; + subject: { + CN: string; + alt: string | null; + }; + issuer: { + C: string; + O: string; + CN: string; + }; + keyType: 'RSA' | 'EC' | null; + keyBits: number | null; + serialNumber: string; + fingerprint256: string; + publicKey: string | null; }; };