Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.

Commit ffb6b2f

Browse files
andrewaustinpetebacondarwin
authored andcommitted
fix(ngInput): change URL_REGEXP to better match RFC3987
The URL_REGEXP in use to perform validation in ngInput is too restrictive and fails to follow RFC3987. In particular, it only accepts ftp, http, and https scheme components and rejects perfectly valid schemes such as "file", "mailto", "chrome-extension", etc. The regex also requires the scheme to be followed by two "/" but the RFC says 0 to n are acceptable. This change fixes both of these issues to better align to the standard. Closes #11341 Closes #11381
1 parent 941c1c3 commit ffb6b2f

File tree

2 files changed

+12
-1
lines changed

2 files changed

+12
-1
lines changed

src/ng/directive/input.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,8 @@
1111

1212
// Regex code is obtained from SO: https://stackoverflow.com/questions/3143070/javascript-regex-iso-datetime#answer-3143231
1313
var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/;
14-
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
14+
// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987)
15+
var URL_REGEXP = /^[A-Za-z][A-Za-z\d.+-]*:\/*(?:\w+(?::\w+)?@)?[^\s/]+(?::\d+)?(?:\/[\w#!:.?+=&%@\-/]*)?$/;
1516
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
1617
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/;
1718
var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/;

test/ng/directive/inputSpec.js

+10
Original file line numberDiff line numberDiff line change
@@ -2537,8 +2537,18 @@ describe('input', function() {
25372537
describe('URL_REGEXP', function() {
25382538
/* global URL_REGEXP: false */
25392539
it('should validate url', function() {
2540+
// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987)
25402541
expect(URL_REGEXP.test('http://server:123/path')).toBe(true);
2542+
expect(URL_REGEXP.test('https://server:123/path')).toBe(true);
2543+
expect(URL_REGEXP.test('file:///home/user')).toBe(true);
2544+
expect(URL_REGEXP.test('mailto:user@example.com?subject=Foo')).toBe(true);
2545+
expect(URL_REGEXP.test('r2-d2.c3-p0://localhost/foo')).toBe(true);
2546+
expect(URL_REGEXP.test('abc:/foo')).toBe(true);
2547+
expect(URL_REGEXP.test('http:')).toBe(false);
25412548
expect(URL_REGEXP.test('a@B.c')).toBe(false);
2549+
expect(URL_REGEXP.test('a_B.c')).toBe(false);
2550+
expect(URL_REGEXP.test('0scheme://example.com')).toBe(false);
2551+
expect(URL_REGEXP.test('http://example.com:9999/~~``')).toBe(false);
25422552
});
25432553
});
25442554
});

0 commit comments

Comments
 (0)