2
0
mirror of https://github.com/tenrok/axios.git synced 2026-06-17 19:21:29 +03:00
Files
axios/tests/unit/fromDataURI.test.js
T
Abhishek Chauhan 5061879649 fix: update fromDataURI regex to match RFC 2397 (#10829)
* fix: update fromDataURI regex to match RFC 2397

Update the DATA_URL_PATTERN regex to correctly match all valid RFC 2397
data URIs. The previous regex required a semicolon-terminated media type
segment, which rejected valid data URIs like `data:;base64,MTIz` and
`data:application/octet-stream,123`.

Fixes #10808

* fix: normalize omitted mediatype to text/plain per RFC 2397

When a data URI has parameters but no mediatype (e.g. data:;charset=UTF-8,...),
prepend text/plain as the default per RFC 2397 section 3.

* fix: use stricter RFC 2397 regex and expand test matrix

- Switch to type/subtype-aware regex from #10808
- Require name=value parameters, separate ;base64 group
- Add tests: charset param, URL-encoded body, Blob type
  preservation, datax: rejection, missing comma rejection
- Normalize omitted mediatype to text/plain per RFC 2397 §3

* chore: apply small nits

---------

Co-authored-by: Abhishek Chauhan <abhishek-chauhan@outlook.com>
Co-authored-by: Jay <jasonsaayman@gmail.com>
2026-05-05 19:23:16 +02:00

89 lines
3.0 KiB
JavaScript

import { describe, it } from 'vitest';
import assert from 'assert';
import fromDataURI from '../../lib/helpers/fromDataURI.js';
describe('helpers::fromDataURI', () => {
it('should return buffer from data uri', () => {
const buffer = Buffer.from('123');
const dataURI = 'data:application/octet-stream;base64,' + buffer.toString('base64');
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should parse data URI with no mediatype and base64', () => {
const buffer = Buffer.from('123');
const dataURI = 'data:;base64,' + buffer.toString('base64');
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should parse data URI with mediatype and no base64', () => {
const buffer = Buffer.from('123');
const dataURI = 'data:application/octet-stream,123';
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should parse full form data URI with text/plain and base64', () => {
const buffer = Buffer.from('hello');
const dataURI = 'data:text/plain;base64,' + buffer.toString('base64');
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should parse minimal valid data URI', () => {
const buffer = Buffer.from('');
const dataURI = 'data:,';
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should parse data URI with spaces in data', () => {
const buffer = Buffer.from('hello world');
const dataURI = 'data:text/plain,hello world';
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should parse canonical RFC example with charset parameter', () => {
const buffer = Buffer.from('123');
const dataURI = 'data:text/plain;charset=US-ASCII,123';
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should decode URL-encoded body', () => {
const buffer = Buffer.from('hello world');
const dataURI = 'data:text/plain,hello%20world';
assert.deepStrictEqual(fromDataURI(dataURI, false), buffer);
});
it('should preserve full content type with parameters in Blob', () => {
const dataURI = 'data:text/plain;charset=utf-8;base64,' + Buffer.from('hello').toString('base64');
const blob = fromDataURI(dataURI, true, { Blob });
assert.strictEqual(blob.type, 'text/plain;charset=utf-8');
});
it('should normalize omitted mediatype to text/plain per RFC 2397', () => {
const dataURI = 'data:;charset=UTF-8,hello';
const blob = fromDataURI(dataURI, true, { Blob });
assert.strictEqual(blob.type, 'text/plain;charset=utf-8');
});
it('should reject data URI with unsupported protocol prefix', () => {
assert.throws(() => {
fromDataURI('datax:,hi', false);
}, (err) => err.code === 'ERR_NOT_SUPPORT' && err.message.includes('Unsupported protocol'));
});
it('should reject data URI without comma separator', () => {
assert.throws(() => {
fromDataURI('data:hi', false);
}, (err) => err.code === 'ERR_INVALID_URL');
});
});