Go to file
Alex Rickabaugh 7ae7a8440c fix(http): introduce encodingHint for text() for better ArrayBuffer support
Currently, if a Response has an ArrayBuffer body and text() is called, Angular
attempts to convert the ArrayBuffer to a string. Doing this requires knowing
the encoding of the bytes in the buffer, which is context that we don't have.

Instead, we assume that the buffer is encoded in UTF-16, and attempt to process
it that way. Unfortunately the approach chosen (interpret buffer as Uint16Array and
create a Javascript string from each entry using String.fromCharCode) is incorrect
as it does not handle UTF-16 surrogate pairs. What Angular actually implements, then,
is UCS-2 decoding, which is equivalent to UTF-16 with characters restricted to the
base plane.

No standard way of decoding UTF-8 or UTF-16 exists in the browser today. APIs like
TextDecoder are only supported in a few browsers, and although hacks like using the
FileReader API with a Blob to force browsers to do content encoding detection and
decoding exist, they're slow and not compatible with the synchronous text() API.

Thus, this bug is fixed by introducing an encodingHint parameter to text(). The
default value of this parameter is 'legacy', indicating that the existing broken
behavior should be used - this prevents breaking existing apps. The only other
possible value of the hint is 'iso-8859' which interprets each byte of the buffer
with String.fromCharCode. UTF-8 and UTF-16 are not supported - it is up to the
consumer to get the ArrayBuffer and decode it themselves.

The parameter is a hint, as it's not always used (for example, if the conversion
to text doesn't involve an ArrayBuffer source). Additionally, this leaves the door
open for future implementations to perform more sophisticated encoding detection
and ignore the user-provided value if it can be proven to be incorrect.

Fixes #15932.

PR Close #16420
2017-05-05 14:20:36 -04:00
.github docs(gh): try to improve the issue template (#11891) 2016-09-30 16:40:56 -07:00
aio docs(aio): fix broken links discovered May 4th 2017-05-05 11:05:22 +01:00
docs docs: revert the move of CONTRIBUTING.md to docs/CONTRIBUTING.md 2017-03-23 20:57:49 -07:00
integration test: cleanup rxjs custom build 2017-05-04 15:07:27 -04:00
modules fix(core): don’t stop change detection because of errors 2017-05-01 18:56:25 -04:00
packages fix(http): introduce encodingHint for text() for better ArrayBuffer support 2017-05-05 14:20:36 -04:00
scripts test: cleanup rxjs custom build 2017-05-04 15:07:27 -04:00
tools feat: add .ngsummary.ts files to support AOT unit tests 2017-05-05 13:23:53 -04:00
.bowerrc chore(dgeni): clean up legacy typings bundle creation 2015-10-29 21:19:59 +00:00
.clang-format feat(tooling): Add a .clang-format for automated JavaScript formatting. 2015-04-02 08:44:34 -07:00
.editorconfig chore(.editorconfig): include markdown config 2015-01-27 00:14:48 -08:00
.gitattributes chore: force lf EOL for ts files (#11143) 2016-08-29 12:41:58 -07:00
.gitignore build(aio): use own `.gitignore` file 2017-03-17 15:31:22 -05:00
.nvmrc ci: bump node version to 6.9.5 and npm to 3.10.7 2017-02-02 23:28:00 -08:00
.pullapprove.yml ci: add jasonaden to the router 2017-04-11 11:16:02 -07:00
.travis.yml feat(aio): add e2e (#15976) 2017-04-19 22:36:23 -05:00
CHANGELOG.md docs: add changelog for 4.2.0-beta.0 2017-05-04 14:41:39 -07:00
CONTRIBUTING.md docs: fixed broken links (#15455) 2017-03-24 08:14:23 -07:00
LICENSE style(docs): update copyright years (#13736) 2017-01-27 20:47:14 -08:00
README.md docs: revert the move of CONTRIBUTING.md to docs/CONTRIBUTING.md 2017-03-23 20:57:49 -07:00
bower.json docs: branding fixes (#14132) 2017-01-27 15:03:11 -06:00
browser-providers.conf.js ci: disable Android 4.1, 4.2 and 4.3 in SauceLabs (#14461) 2017-03-16 09:13:07 -07:00
build.sh fix(core): distribute externs for testability API (#16179) 2017-04-19 22:46:11 -05:00
circle.yml build: update to yarn 0.21.3 (#14805) 2017-03-01 23:58:05 -08:00
gulpfile.js build: check yarn version in `check-environment` (#14499) 2017-02-22 20:55:25 -08:00
karma-js.conf.js fix: fix path locally to empty.js (#15073) 2017-03-15 13:40:24 -07:00
npm-shrinkwrap.clean.json feat(core): upgrade dep on zone.js to 0.8.9 (#16401) 2017-04-28 22:50:48 -05:00
npm-shrinkwrap.json feat(core): upgrade dep on zone.js to 0.8.9 (#16401) 2017-04-28 22:50:48 -05:00
npm-shrinkwrap.readme.md chore(lint): replace gulp check-task with tslint no-jasmine-focus rule 2016-10-28 15:53:15 -07:00
package.json release: cut the 4.2.0-beta.0 version 2017-05-04 14:37:20 -07:00
protractor-e2e.conf.js refactor: add license header to JS files & format files (#12081) 2016-10-04 20:39:20 -07:00
protractor-examples-e2e.conf.js refactor: format and lint code 2016-12-12 11:30:25 -08:00
protractor-perf.conf.js refactor: add license header to JS files & format files (#12081) 2016-10-04 20:39:20 -07:00
shims_for_IE.js Revert "refactor: add license header to JS files & format files (#12035)" 2016-10-04 14:06:41 -07:00
test-main.js fix: fix path locally to empty.js (#15073) 2017-03-15 13:40:24 -07:00
test.sh build: build modules and examples for karma 2017-03-08 17:35:20 -08:00
tslint.json build(tslint): enable no-inner-declarations (#13316) 2016-12-08 13:46:08 -08:00

README.md

Build Status CircleCI Join the chat at https://gitter.im/angular/angular Issue Stats Issue Stats npm version

Sauce Test Status Safari (7+), iOS (7+), Edge (14) and IE mobile (11) are tested on BrowserStack.

Angular

Angular is a development platform for building mobile and desktop web applications using Typescript/JavaScript (JS) and other languages.

Quickstart

Get started in 5 minutes.

Want to help?

Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for contributing and then check out one of our issues in the hotlist: community-help.