Skip to content
This repository was archived by the owner on Apr 12, 2024. It is now read-only.
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit a26c1a1

Browse files
andrewaustinAndrew Austin
authored and
Andrew Austin
committedOct 13, 2015
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
1 parent bea99e3 commit a26c1a1

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*)))\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
@@ -2387,8 +2387,18 @@ describe('input', function() {
23872387
describe('URL_REGEXP', function() {
23882388
/* global URL_REGEXP: false */
23892389
it('should validate url', function() {
2390+
// See valid URLs in RFC3987 (http://tools.ietf.org/html/rfc3987)
23902391
expect(URL_REGEXP.test('http://server:123/path')).toBe(true);
2392+
expect(URL_REGEXP.test('https://server:123/path')).toBe(true);
2393+
expect(URL_REGEXP.test('file:///home/user')).toBe(true);
2394+
expect(URL_REGEXP.test('mailto:user@example.com?subject=Foo')).toBe(true);
2395+
expect(URL_REGEXP.test('r2-d2.c3-p0://localhost/foo')).toBe(true);
2396+
expect(URL_REGEXP.test('abc:/foo')).toBe(true);
2397+
expect(URL_REGEXP.test('http:')).toBe(false);
23912398
expect(URL_REGEXP.test('a@B.c')).toBe(false);
2399+
expect(URL_REGEXP.test('a_B.c')).toBe(false);
2400+
expect(URL_REGEXP.test('0scheme://example.com')).toBe(false);
2401+
expect(URL_REGEXP.test('http://example.com:9999/~~``')).toBe(false);
23922402
});
23932403
});
23942404
});

0 commit comments

Comments
 (0)
This repository has been archived.