( rawBody: unknown, root: UnknownRecord, source: string, warnings: HttpImportWarning[], )
| 299 | } |
| 300 | |
| 301 | function parseRequestBody( |
| 302 | rawBody: unknown, |
| 303 | root: UnknownRecord, |
| 304 | source: string, |
| 305 | warnings: HttpImportWarning[], |
| 306 | ): Pick<HttpImportRequest, 'body' | 'bodyType' | 'formData'> { |
| 307 | const body = resolveRef(root, rawBody) |
| 308 | if (!isRecord(body) || !isRecord(body.content)) { |
| 309 | return { body: null, bodyType: 'none', formData: [] } |
| 310 | } |
| 311 | |
| 312 | const pickedMedia = pickMediaEntry(body.content) |
| 313 | if (!pickedMedia) { |
| 314 | addWarning(warnings, source, 'Request body content skipped') |
| 315 | return { body: null, bodyType: 'none', formData: [] } |
| 316 | } |
| 317 | |
| 318 | const example = pickedMedia.media.example |
| 319 | const value |
| 320 | = example !== undefined |
| 321 | ? example |
| 322 | : sampleFromSchema(resolveRef(root, pickedMedia.media.schema)) |
| 323 | |
| 324 | if (pickedMedia.mediaType === 'application/json') { |
| 325 | return { |
| 326 | body: typeof value === 'string' ? value : JSON.stringify(value, null, 2), |
| 327 | bodyType: 'json', |
| 328 | formData: [], |
| 329 | } |
| 330 | } |
| 331 | |
| 332 | if (pickedMedia.mediaType === 'application/x-www-form-urlencoded') { |
| 333 | const formValue = isRecord(value) ? value : {} |
| 334 | return { |
| 335 | body: Object.entries(formValue) |
| 336 | .map(([key, entryValue]) => `${key}=${asString(entryValue)}`) |
| 337 | .join('&'), |
| 338 | bodyType: 'form-urlencoded', |
| 339 | formData: [], |
| 340 | } |
| 341 | } |
| 342 | |
| 343 | if (pickedMedia.mediaType === 'multipart/form-data') { |
| 344 | const formValue = isRecord(value) ? value : {} |
| 345 | return { |
| 346 | body: null, |
| 347 | bodyType: 'multipart', |
| 348 | formData: Object.entries(formValue).map(([key, entryValue]) => ({ |
| 349 | key, |
| 350 | type: 'text' as const, |
| 351 | value: asString(entryValue), |
| 352 | })), |
| 353 | } |
| 354 | } |
| 355 | |
| 356 | if (pickedMedia.mediaType.startsWith('text/')) { |
| 357 | return { body: asString(value), bodyType: 'text', formData: [] } |
| 358 | } |
no test coverage detected