network_utils_spec.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2018 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. "use strict";
  23. var _network_utils = require("../../display/network_utils");
  24. var _util = require("../../shared/util");
  25. describe('network_utils', function () {
  26. describe('validateRangeRequestCapabilities', function () {
  27. it('rejects range chunk sizes that are not larger than zero', function () {
  28. expect(function () {
  29. (0, _network_utils.validateRangeRequestCapabilities)({
  30. rangeChunkSize: 0
  31. });
  32. }).toThrow(new Error('Range chunk size must be larger than zero'));
  33. });
  34. it('rejects disabled or non-HTTP range requests', function () {
  35. expect((0, _network_utils.validateRangeRequestCapabilities)({
  36. disableRange: true,
  37. isHttp: true,
  38. getResponseHeader: function getResponseHeader(headerName) {
  39. if (headerName === 'Content-Length') {
  40. return 8;
  41. }
  42. },
  43. rangeChunkSize: 64
  44. })).toEqual({
  45. allowRangeRequests: false,
  46. suggestedLength: 8
  47. });
  48. expect((0, _network_utils.validateRangeRequestCapabilities)({
  49. disableRange: false,
  50. isHttp: false,
  51. getResponseHeader: function getResponseHeader(headerName) {
  52. if (headerName === 'Content-Length') {
  53. return 8;
  54. }
  55. },
  56. rangeChunkSize: 64
  57. })).toEqual({
  58. allowRangeRequests: false,
  59. suggestedLength: 8
  60. });
  61. });
  62. it('rejects invalid Accept-Ranges header values', function () {
  63. expect((0, _network_utils.validateRangeRequestCapabilities)({
  64. disableRange: false,
  65. isHttp: true,
  66. getResponseHeader: function getResponseHeader(headerName) {
  67. if (headerName === 'Accept-Ranges') {
  68. return 'none';
  69. } else if (headerName === 'Content-Length') {
  70. return 8;
  71. }
  72. },
  73. rangeChunkSize: 64
  74. })).toEqual({
  75. allowRangeRequests: false,
  76. suggestedLength: 8
  77. });
  78. });
  79. it('rejects invalid Content-Encoding header values', function () {
  80. expect((0, _network_utils.validateRangeRequestCapabilities)({
  81. disableRange: false,
  82. isHttp: true,
  83. getResponseHeader: function getResponseHeader(headerName) {
  84. if (headerName === 'Accept-Ranges') {
  85. return 'bytes';
  86. } else if (headerName === 'Content-Encoding') {
  87. return 'gzip';
  88. } else if (headerName === 'Content-Length') {
  89. return 8;
  90. }
  91. },
  92. rangeChunkSize: 64
  93. })).toEqual({
  94. allowRangeRequests: false,
  95. suggestedLength: 8
  96. });
  97. });
  98. it('rejects invalid Content-Length header values', function () {
  99. expect((0, _network_utils.validateRangeRequestCapabilities)({
  100. disableRange: false,
  101. isHttp: true,
  102. getResponseHeader: function getResponseHeader(headerName) {
  103. if (headerName === 'Accept-Ranges') {
  104. return 'bytes';
  105. } else if (headerName === 'Content-Encoding') {
  106. return null;
  107. } else if (headerName === 'Content-Length') {
  108. return 'eight';
  109. }
  110. },
  111. rangeChunkSize: 64
  112. })).toEqual({
  113. allowRangeRequests: false,
  114. suggestedLength: undefined
  115. });
  116. });
  117. it('rejects file sizes that are too small for range requests', function () {
  118. expect((0, _network_utils.validateRangeRequestCapabilities)({
  119. disableRange: false,
  120. isHttp: true,
  121. getResponseHeader: function getResponseHeader(headerName) {
  122. if (headerName === 'Accept-Ranges') {
  123. return 'bytes';
  124. } else if (headerName === 'Content-Encoding') {
  125. return null;
  126. } else if (headerName === 'Content-Length') {
  127. return 8;
  128. }
  129. },
  130. rangeChunkSize: 64
  131. })).toEqual({
  132. allowRangeRequests: false,
  133. suggestedLength: 8
  134. });
  135. });
  136. it('accepts file sizes large enough for range requests', function () {
  137. expect((0, _network_utils.validateRangeRequestCapabilities)({
  138. disableRange: false,
  139. isHttp: true,
  140. getResponseHeader: function getResponseHeader(headerName) {
  141. if (headerName === 'Accept-Ranges') {
  142. return 'bytes';
  143. } else if (headerName === 'Content-Encoding') {
  144. return null;
  145. } else if (headerName === 'Content-Length') {
  146. return 8192;
  147. }
  148. },
  149. rangeChunkSize: 64
  150. })).toEqual({
  151. allowRangeRequests: true,
  152. suggestedLength: 8192
  153. });
  154. });
  155. });
  156. describe('extractFilenameFromHeader', function () {
  157. it('returns null when content disposition header is blank', function () {
  158. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  159. if (headerName === 'Content-Disposition') {
  160. return null;
  161. }
  162. })).toBeNull();
  163. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  164. if (headerName === 'Content-Disposition') {
  165. return undefined;
  166. }
  167. })).toBeNull();
  168. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  169. if (headerName === 'Content-Disposition') {
  170. return '';
  171. }
  172. })).toBeNull();
  173. });
  174. it('gets the filename from the response header', function () {
  175. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  176. if (headerName === 'Content-Disposition') {
  177. return 'inline';
  178. }
  179. })).toBeNull();
  180. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  181. if (headerName === 'Content-Disposition') {
  182. return 'attachment';
  183. }
  184. })).toBeNull();
  185. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  186. if (headerName === 'Content-Disposition') {
  187. return 'attachment; filename="filename.pdf"';
  188. }
  189. })).toEqual('filename.pdf');
  190. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  191. if (headerName === 'Content-Disposition') {
  192. return 'attachment; filename="filename.pdf and spaces.pdf"';
  193. }
  194. })).toEqual('filename.pdf and spaces.pdf');
  195. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  196. if (headerName === 'Content-Disposition') {
  197. return 'attachment; filename="tl;dr.pdf"';
  198. }
  199. })).toEqual('tl;dr.pdf');
  200. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  201. if (headerName === 'Content-Disposition') {
  202. return 'attachment; filename=filename.pdf';
  203. }
  204. })).toEqual('filename.pdf');
  205. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  206. if (headerName === 'Content-Disposition') {
  207. return 'attachment; filename=filename.pdf someotherparam';
  208. }
  209. })).toEqual('filename.pdf');
  210. });
  211. it('gets the filename from the response header (RFC 6266)', function () {
  212. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  213. if (headerName === 'Content-Disposition') {
  214. return 'attachment; filename*=filename.pdf';
  215. }
  216. })).toEqual('filename.pdf');
  217. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  218. if (headerName === 'Content-Disposition') {
  219. return 'attachment; filename*=\'\'filename.pdf';
  220. }
  221. })).toEqual('filename.pdf');
  222. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  223. if (headerName === 'Content-Disposition') {
  224. return 'attachment; filename*=utf-8\'\'filename.pdf';
  225. }
  226. })).toEqual('filename.pdf');
  227. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  228. if (headerName === 'Content-Disposition') {
  229. return 'attachment; filename=no.pdf; filename*=utf-8\'\'filename.pdf';
  230. }
  231. })).toEqual('filename.pdf');
  232. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  233. if (headerName === 'Content-Disposition') {
  234. return 'attachment; filename*=utf-8\'\'filename.pdf; filename=no.pdf';
  235. }
  236. })).toEqual('filename.pdf');
  237. });
  238. it('gets the filename from the response header (RFC 2231)', function () {
  239. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  240. if (headerName === 'Content-Disposition') {
  241. return 'attachment; filename*0=filename; filename*1=.pdf';
  242. }
  243. })).toEqual('filename.pdf');
  244. });
  245. it('only extracts filename with pdf extension', function () {
  246. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  247. if (headerName === 'Content-Disposition') {
  248. return 'attachment; filename="filename.png"';
  249. }
  250. })).toBeNull();
  251. });
  252. it('extension validation is case insensitive', function () {
  253. expect((0, _network_utils.extractFilenameFromHeader)(function (headerName) {
  254. if (headerName === 'Content-Disposition') {
  255. return 'form-data; name="fieldName"; filename="file.PdF"';
  256. }
  257. })).toEqual('file.PdF');
  258. });
  259. });
  260. describe('createResponseStatusError', function () {
  261. it('handles missing PDF file responses', function () {
  262. expect((0, _network_utils.createResponseStatusError)(404, 'https://foo.com/bar.pdf')).toEqual(new _util.MissingPDFException('Missing PDF "https://foo.com/bar.pdf".'));
  263. expect((0, _network_utils.createResponseStatusError)(0, 'file://foo.pdf')).toEqual(new _util.MissingPDFException('Missing PDF "file://foo.pdf".'));
  264. });
  265. it('handles unexpected responses', function () {
  266. expect((0, _network_utils.createResponseStatusError)(302, 'https://foo.com/bar.pdf')).toEqual(new _util.UnexpectedResponseException('Unexpected server response (302) while retrieving PDF ' + '"https://foo.com/bar.pdf".'));
  267. expect((0, _network_utils.createResponseStatusError)(0, 'https://foo.com/bar.pdf')).toEqual(new _util.UnexpectedResponseException('Unexpected server response (0) while retrieving PDF ' + '"https://foo.com/bar.pdf".'));
  268. });
  269. });
  270. describe('validateResponseStatus', function () {
  271. it('accepts valid response statuses', function () {
  272. expect((0, _network_utils.validateResponseStatus)(200)).toEqual(true);
  273. expect((0, _network_utils.validateResponseStatus)(206)).toEqual(true);
  274. });
  275. it('rejects invalid response statuses', function () {
  276. expect((0, _network_utils.validateResponseStatus)(302)).toEqual(false);
  277. expect((0, _network_utils.validateResponseStatus)(404)).toEqual(false);
  278. expect((0, _network_utils.validateResponseStatus)(null)).toEqual(false);
  279. expect((0, _network_utils.validateResponseStatus)(undefined)).toEqual(false);
  280. });
  281. });
  282. });