media_proxy_test.go 41 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package mediaproxy // import "miniflux.app/v2/internal/mediaproxy"
  4. import (
  5. "os"
  6. "testing"
  7. "miniflux.app/v2/internal/config"
  8. )
  9. func TestRewriteDocumentWithRelativeProxyURL_None_Image(t *testing.T) {
  10. os.Clearenv()
  11. os.Setenv("MEDIA_PROXY_MODE", "none")
  12. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  13. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  14. var err error
  15. parser := config.NewConfigParser()
  16. config.Opts, err = parser.ParseEnvironmentVariables()
  17. if err != nil {
  18. t.Fatalf(`Config parsing failure: %v`, err)
  19. }
  20. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  21. output := RewriteDocumentWithRelativeProxyURL(input)
  22. expected := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  23. if expected != output {
  24. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  25. }
  26. }
  27. func TestRewriteDocumentWithRelativeProxyURL_None_Audio(t *testing.T) {
  28. os.Clearenv()
  29. os.Setenv("MEDIA_PROXY_MODE", "none")
  30. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  31. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  32. var err error
  33. parser := config.NewConfigParser()
  34. config.Opts, err = parser.ParseEnvironmentVariables()
  35. if err != nil {
  36. t.Fatalf(`Config parsing failure: %v`, err)
  37. }
  38. input := `<p><audio src="http://website/folder/audio.mp3"></audio></p>`
  39. output := RewriteDocumentWithRelativeProxyURL(input)
  40. expected := `<p><audio src="http://website/folder/audio.mp3"></audio></p>`
  41. if expected != output {
  42. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  43. }
  44. }
  45. func TestRewriteDocumentWithRelativeProxyURL_None_Video(t *testing.T) {
  46. os.Clearenv()
  47. os.Setenv("MEDIA_PROXY_MODE", "none")
  48. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  49. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  50. var err error
  51. parser := config.NewConfigParser()
  52. config.Opts, err = parser.ParseEnvironmentVariables()
  53. if err != nil {
  54. t.Fatalf(`Config parsing failure: %v`, err)
  55. }
  56. input := `<p><video src="http://website/folder/video.mp4"></video></p>`
  57. output := RewriteDocumentWithRelativeProxyURL(input)
  58. expected := `<p><video src="http://website/folder/video.mp4"></video></p>`
  59. if expected != output {
  60. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  61. }
  62. }
  63. func TestRewriteDocumentWithRelativeProxyURL_None_VideoPoster(t *testing.T) {
  64. os.Clearenv()
  65. os.Setenv("MEDIA_PROXY_MODE", "none")
  66. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  67. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  68. var err error
  69. parser := config.NewConfigParser()
  70. config.Opts, err = parser.ParseEnvironmentVariables()
  71. if err != nil {
  72. t.Fatalf(`Config parsing failure: %v`, err)
  73. }
  74. input := `<p><video src="http://website/folder/video.mp4" poster="http://website/folder/poster.png"></video></p>`
  75. output := RewriteDocumentWithRelativeProxyURL(input)
  76. expected := `<p><video src="http://website/folder/video.mp4" poster="http://website/folder/poster.png"></video></p>`
  77. if expected != output {
  78. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  79. }
  80. }
  81. func TestRewriteDocumentWithAbsoluteProxyURL_None_Image(t *testing.T) {
  82. os.Clearenv()
  83. os.Setenv("MEDIA_PROXY_MODE", "none")
  84. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  85. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  86. var err error
  87. parser := config.NewConfigParser()
  88. config.Opts, err = parser.ParseEnvironmentVariables()
  89. if err != nil {
  90. t.Fatalf(`Config parsing failure: %v`, err)
  91. }
  92. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  93. output := RewriteDocumentWithAbsoluteProxyURL(input)
  94. expected := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  95. if expected != output {
  96. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  97. }
  98. }
  99. func TestRewriteDocumentWithAbsoluteProxyURL_None_Audio(t *testing.T) {
  100. os.Clearenv()
  101. os.Setenv("MEDIA_PROXY_MODE", "none")
  102. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  103. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  104. var err error
  105. parser := config.NewConfigParser()
  106. config.Opts, err = parser.ParseEnvironmentVariables()
  107. if err != nil {
  108. t.Fatalf(`Config parsing failure: %v`, err)
  109. }
  110. input := `<p><audio src="http://website/folder/audio.mp3"></audio></p>`
  111. output := RewriteDocumentWithAbsoluteProxyURL(input)
  112. expected := `<p><audio src="http://website/folder/audio.mp3"></audio></p>`
  113. if expected != output {
  114. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  115. }
  116. }
  117. func TestRewriteDocumentWithAbsoluteProxyURL_None_Video(t *testing.T) {
  118. os.Clearenv()
  119. os.Setenv("MEDIA_PROXY_MODE", "none")
  120. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  121. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  122. var err error
  123. parser := config.NewConfigParser()
  124. config.Opts, err = parser.ParseEnvironmentVariables()
  125. if err != nil {
  126. t.Fatalf(`Config parsing failure: %v`, err)
  127. }
  128. input := `<p><video src="http://website/folder/video.mp4"></video></p>`
  129. output := RewriteDocumentWithAbsoluteProxyURL(input)
  130. expected := `<p><video src="http://website/folder/video.mp4"></video></p>`
  131. if expected != output {
  132. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  133. }
  134. }
  135. func TestRewriteDocumentWithAbsoluteProxyURL_None_VideoPoster(t *testing.T) {
  136. os.Clearenv()
  137. os.Setenv("MEDIA_PROXY_MODE", "none")
  138. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  139. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  140. var err error
  141. parser := config.NewConfigParser()
  142. config.Opts, err = parser.ParseEnvironmentVariables()
  143. if err != nil {
  144. t.Fatalf(`Config parsing failure: %v`, err)
  145. }
  146. input := `<p><video src="http://website/folder/video.mp4" poster="http://website/folder/poster.png"></video></p>`
  147. output := RewriteDocumentWithAbsoluteProxyURL(input)
  148. expected := `<p><video src="http://website/folder/video.mp4" poster="http://website/folder/poster.png"></video></p>`
  149. if expected != output {
  150. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  151. }
  152. }
  153. func TestRewriteDocumentWithRelativeProxyURL_HttpOnly_Image(t *testing.T) {
  154. os.Clearenv()
  155. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  156. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  157. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  158. var err error
  159. parser := config.NewConfigParser()
  160. config.Opts, err = parser.ParseEnvironmentVariables()
  161. if err != nil {
  162. t.Fatalf(`Config parsing failure: %v`, err)
  163. }
  164. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  165. output := RewriteDocumentWithRelativeProxyURL(input)
  166. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  167. if expected != output {
  168. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  169. }
  170. }
  171. func TestRewriteDocumentWithRelativeProxyURL_HttpOnly_Audio(t *testing.T) {
  172. os.Clearenv()
  173. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  174. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  175. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  176. var err error
  177. parser := config.NewConfigParser()
  178. config.Opts, err = parser.ParseEnvironmentVariables()
  179. if err != nil {
  180. t.Fatalf(`Config parsing failure: %v`, err)
  181. }
  182. input := `<p><audio src="http://website/folder/audio.mp3"></audio></p>`
  183. output := RewriteDocumentWithRelativeProxyURL(input)
  184. expected := `<p><audio src="/proxy/t5HoIOMfOlUs1_lCnhvaMI0sUz2_-gqWs_DyRevKIG0=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2F1ZGlvLm1wMw=="></audio></p>`
  185. if expected != output {
  186. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  187. }
  188. }
  189. func TestRewriteDocumentWithRelativeProxyURL_HttpOnly_Video(t *testing.T) {
  190. os.Clearenv()
  191. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  192. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  193. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  194. var err error
  195. parser := config.NewConfigParser()
  196. config.Opts, err = parser.ParseEnvironmentVariables()
  197. if err != nil {
  198. t.Fatalf(`Config parsing failure: %v`, err)
  199. }
  200. input := `<p><video src="http://website/folder/video.mp4"></video></p>`
  201. output := RewriteDocumentWithRelativeProxyURL(input)
  202. expected := `<p><video src="/proxy/lKmvyYMkjI4iV7yxQqcYwJHWzMvJmjJZKl7VASyxEZ8=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL3ZpZGVvLm1wNA=="></video></p>`
  203. if expected != output {
  204. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  205. }
  206. }
  207. func TestRewriteDocumentWithRelativeProxyURL_HttpOnly_VideoPoster(t *testing.T) {
  208. os.Clearenv()
  209. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  210. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  211. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  212. var err error
  213. parser := config.NewConfigParser()
  214. config.Opts, err = parser.ParseEnvironmentVariables()
  215. if err != nil {
  216. t.Fatalf(`Config parsing failure: %v`, err)
  217. }
  218. input := `<p><video src="http://website/folder/video.mp4" poster="http://website/folder/poster.png"></video></p>`
  219. output := RewriteDocumentWithRelativeProxyURL(input)
  220. expected := `<p><video src="/proxy/lKmvyYMkjI4iV7yxQqcYwJHWzMvJmjJZKl7VASyxEZ8=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL3ZpZGVvLm1wNA==" poster="/proxy/YEEe0bAqTYpNrLijb25xYUNRFQsTPv5LlBikuDScPuo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL3Bvc3Rlci5wbmc="></video></p>`
  221. if expected != output {
  222. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  223. }
  224. }
  225. func TestRewriteDocumentWithRelativeProxyURL_HttpOnly_Image_Poster(t *testing.T) {
  226. os.Clearenv()
  227. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  228. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  229. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  230. var err error
  231. parser := config.NewConfigParser()
  232. config.Opts, err = parser.ParseEnvironmentVariables()
  233. if err != nil {
  234. t.Fatalf(`Config parsing failure: %v`, err)
  235. }
  236. input := `<p><video src="http://website/folder/video.mp4" poster="http://website/folder/poster.png"></video></p>`
  237. output := RewriteDocumentWithRelativeProxyURL(input)
  238. expected := `<p><video src="http://website/folder/video.mp4" poster="/proxy/YEEe0bAqTYpNrLijb25xYUNRFQsTPv5LlBikuDScPuo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL3Bvc3Rlci5wbmc="></video></p>`
  239. if expected != output {
  240. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  241. }
  242. }
  243. func TestRewriteDocumentWithAbsoluteProxyURL_HttpOnly_Image(t *testing.T) {
  244. os.Clearenv()
  245. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  246. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  247. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  248. var err error
  249. parser := config.NewConfigParser()
  250. config.Opts, err = parser.ParseEnvironmentVariables()
  251. if err != nil {
  252. t.Fatalf(`Config parsing failure: %v`, err)
  253. }
  254. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  255. output := RewriteDocumentWithAbsoluteProxyURL(input)
  256. expected := `<p><img src="http://localhost/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  257. if expected != output {
  258. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  259. }
  260. }
  261. func TestRewriteDocumentWithAbsoluteProxyURL_HttpOnly_Audio(t *testing.T) {
  262. os.Clearenv()
  263. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  264. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  265. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  266. var err error
  267. parser := config.NewConfigParser()
  268. config.Opts, err = parser.ParseEnvironmentVariables()
  269. if err != nil {
  270. t.Fatalf(`Config parsing failure: %v`, err)
  271. }
  272. input := `<p><audio src="http://website/folder/audio.mp3"></audio></p>`
  273. output := RewriteDocumentWithAbsoluteProxyURL(input)
  274. expected := `<p><audio src="http://localhost/proxy/t5HoIOMfOlUs1_lCnhvaMI0sUz2_-gqWs_DyRevKIG0=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2F1ZGlvLm1wMw=="></audio></p>`
  275. if expected != output {
  276. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  277. }
  278. }
  279. func TestRewriteDocumentWithAbsoluteProxyURL_HttpOnly_Video(t *testing.T) {
  280. os.Clearenv()
  281. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  282. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  283. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  284. var err error
  285. parser := config.NewConfigParser()
  286. config.Opts, err = parser.ParseEnvironmentVariables()
  287. if err != nil {
  288. t.Fatalf(`Config parsing failure: %v`, err)
  289. }
  290. input := `<p><video src="http://website/folder/video.mp4"></video></p>`
  291. output := RewriteDocumentWithAbsoluteProxyURL(input)
  292. expected := `<p><video src="http://localhost/proxy/lKmvyYMkjI4iV7yxQqcYwJHWzMvJmjJZKl7VASyxEZ8=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL3ZpZGVvLm1wNA=="></video></p>`
  293. if expected != output {
  294. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  295. }
  296. }
  297. func TestRewriteDocumentWithAbsoluteProxyURL_HttpOnly_VideoPoster(t *testing.T) {
  298. os.Clearenv()
  299. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  300. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  301. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  302. var err error
  303. parser := config.NewConfigParser()
  304. config.Opts, err = parser.ParseEnvironmentVariables()
  305. if err != nil {
  306. t.Fatalf(`Config parsing failure: %v`, err)
  307. }
  308. input := `<p><video src="http://website/folder/video.mp4" poster="http://website/folder/poster.png"></video></p>`
  309. output := RewriteDocumentWithAbsoluteProxyURL(input)
  310. expected := `<p><video src="http://localhost/proxy/lKmvyYMkjI4iV7yxQqcYwJHWzMvJmjJZKl7VASyxEZ8=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL3ZpZGVvLm1wNA==" poster="http://localhost/proxy/YEEe0bAqTYpNrLijb25xYUNRFQsTPv5LlBikuDScPuo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL3Bvc3Rlci5wbmc="></video></p>`
  311. if expected != output {
  312. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  313. }
  314. }
  315. func TestRewriteDocumentWithRelativeProxyURL_All_Image(t *testing.T) {
  316. os.Clearenv()
  317. os.Setenv("MEDIA_PROXY_MODE", "all")
  318. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  319. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  320. var err error
  321. parser := config.NewConfigParser()
  322. config.Opts, err = parser.ParseEnvironmentVariables()
  323. if err != nil {
  324. t.Fatalf(`Config parsing failure: %v`, err)
  325. }
  326. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  327. output := RewriteDocumentWithRelativeProxyURL(input)
  328. expected := `<p><img src="/proxy/LdPNR1GBDigeeNp2ArUQRyZsVqT_PWLfHGjYFrrWWIY=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  329. if expected != output {
  330. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  331. }
  332. }
  333. func TestRewriteDocumentWithRelativeProxyURL_All_Audio(t *testing.T) {
  334. os.Clearenv()
  335. os.Setenv("MEDIA_PROXY_MODE", "all")
  336. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  337. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  338. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  339. var err error
  340. parser := config.NewConfigParser()
  341. config.Opts, err = parser.ParseEnvironmentVariables()
  342. if err != nil {
  343. t.Fatalf(`Config parsing failure: %v`, err)
  344. }
  345. input := `<p><audio src="https://website/folder/audio.mp3"></audio></p>`
  346. output := RewriteDocumentWithRelativeProxyURL(input)
  347. expected := `<p><audio src="/folder/proxy/EmBTvmU5B17wGuONkeknkptYopW_Tl6Y6_W8oYbN_Xs=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9hdWRpby5tcDM="></audio></p>`
  348. if expected != output {
  349. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  350. }
  351. }
  352. func TestRewriteDocumentWithRelativeProxyURL_All_Video(t *testing.T) {
  353. os.Clearenv()
  354. os.Setenv("MEDIA_PROXY_MODE", "all")
  355. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  356. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  357. var err error
  358. parser := config.NewConfigParser()
  359. config.Opts, err = parser.ParseEnvironmentVariables()
  360. if err != nil {
  361. t.Fatalf(`Config parsing failure: %v`, err)
  362. }
  363. input := `<p><video src="https://website/folder/video.mp4"></video></p>`
  364. output := RewriteDocumentWithRelativeProxyURL(input)
  365. expected := `<p><video src="/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ="></video></p>`
  366. if expected != output {
  367. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  368. }
  369. }
  370. func TestRewriteDocumentWithRelativeProxyURL_All_VideoPoster(t *testing.T) {
  371. os.Clearenv()
  372. os.Setenv("MEDIA_PROXY_MODE", "all")
  373. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  374. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  375. var err error
  376. parser := config.NewConfigParser()
  377. config.Opts, err = parser.ParseEnvironmentVariables()
  378. if err != nil {
  379. t.Fatalf(`Config parsing failure: %v`, err)
  380. }
  381. input := `<p><video src="https://website/folder/video.mp4" poster="https://website/folder/poster.png"></video></p>`
  382. output := RewriteDocumentWithRelativeProxyURL(input)
  383. expected := `<p><video src="/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ=" poster="/proxy/u-yLZEYDELx9OlU9to8bt13iysttOWfYpqRfmQYkm3U=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9wb3N0ZXIucG5n"></video></p>`
  384. if expected != output {
  385. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  386. }
  387. }
  388. func TestRewriteDocumentWithAbsoluteProxyURL_All_Image(t *testing.T) {
  389. os.Clearenv()
  390. os.Setenv("MEDIA_PROXY_MODE", "all")
  391. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  392. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  393. var err error
  394. parser := config.NewConfigParser()
  395. config.Opts, err = parser.ParseEnvironmentVariables()
  396. if err != nil {
  397. t.Fatalf(`Config parsing failure: %v`, err)
  398. }
  399. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  400. output := RewriteDocumentWithAbsoluteProxyURL(input)
  401. expected := `<p><img src="http://localhost/proxy/LdPNR1GBDigeeNp2ArUQRyZsVqT_PWLfHGjYFrrWWIY=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  402. if expected != output {
  403. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  404. }
  405. }
  406. func TestRewriteDocumentWithAbsoluteProxyURL_All_Audio(t *testing.T) {
  407. os.Clearenv()
  408. os.Setenv("MEDIA_PROXY_MODE", "all")
  409. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  410. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  411. var err error
  412. parser := config.NewConfigParser()
  413. config.Opts, err = parser.ParseEnvironmentVariables()
  414. if err != nil {
  415. t.Fatalf(`Config parsing failure: %v`, err)
  416. }
  417. input := `<p><audio src="https://website/folder/audio.mp3"></audio></p>`
  418. output := RewriteDocumentWithAbsoluteProxyURL(input)
  419. expected := `<p><audio src="http://localhost/proxy/EmBTvmU5B17wGuONkeknkptYopW_Tl6Y6_W8oYbN_Xs=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9hdWRpby5tcDM="></audio></p>`
  420. if expected != output {
  421. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  422. }
  423. }
  424. func TestRewriteDocumentWithAbsoluteProxyURL_All_Video(t *testing.T) {
  425. os.Clearenv()
  426. os.Setenv("MEDIA_PROXY_MODE", "all")
  427. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  428. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  429. var err error
  430. parser := config.NewConfigParser()
  431. config.Opts, err = parser.ParseEnvironmentVariables()
  432. if err != nil {
  433. t.Fatalf(`Config parsing failure: %v`, err)
  434. }
  435. input := `<p><video src="https://website/folder/video.mp4"></video></p>`
  436. output := RewriteDocumentWithAbsoluteProxyURL(input)
  437. expected := `<p><video src="http://localhost/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ="></video></p>`
  438. if expected != output {
  439. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  440. }
  441. }
  442. func TestRewriteDocumentWithAbsoluteProxyURL_All_VideoPoster(t *testing.T) {
  443. os.Clearenv()
  444. os.Setenv("MEDIA_PROXY_MODE", "all")
  445. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  446. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  447. var err error
  448. parser := config.NewConfigParser()
  449. config.Opts, err = parser.ParseEnvironmentVariables()
  450. if err != nil {
  451. t.Fatalf(`Config parsing failure: %v`, err)
  452. }
  453. input := `<p><video src="https://website/folder/video.mp4" poster="https://website/folder/poster.png"></video></p>`
  454. output := RewriteDocumentWithAbsoluteProxyURL(input)
  455. expected := `<p><video src="http://localhost/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ=" poster="http://localhost/proxy/u-yLZEYDELx9OlU9to8bt13iysttOWfYpqRfmQYkm3U=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9wb3N0ZXIucG5n"></video></p>`
  456. if expected != output {
  457. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  458. }
  459. }
  460. func TestRewriteDocumentWithRelativeProxyURL_BasePath_All_Image(t *testing.T) {
  461. os.Clearenv()
  462. os.Setenv("MEDIA_PROXY_MODE", "all")
  463. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  464. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  465. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  466. var err error
  467. parser := config.NewConfigParser()
  468. config.Opts, err = parser.ParseEnvironmentVariables()
  469. if err != nil {
  470. t.Fatalf(`Config parsing failure: %v`, err)
  471. }
  472. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  473. output := RewriteDocumentWithRelativeProxyURL(input)
  474. expected := `<p><img src="/folder/proxy/LdPNR1GBDigeeNp2ArUQRyZsVqT_PWLfHGjYFrrWWIY=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  475. if expected != output {
  476. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  477. }
  478. }
  479. func TestRewriteDocumentWithRelativeProxyURL_BasePath_All_Audio(t *testing.T) {
  480. os.Clearenv()
  481. os.Setenv("MEDIA_PROXY_MODE", "all")
  482. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  483. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  484. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  485. var err error
  486. parser := config.NewConfigParser()
  487. config.Opts, err = parser.ParseEnvironmentVariables()
  488. if err != nil {
  489. t.Fatalf(`Config parsing failure: %v`, err)
  490. }
  491. input := `<p><audio src="https://website/folder/audio.mp3"></audio></p>`
  492. output := RewriteDocumentWithRelativeProxyURL(input)
  493. expected := `<p><audio src="/folder/proxy/EmBTvmU5B17wGuONkeknkptYopW_Tl6Y6_W8oYbN_Xs=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9hdWRpby5tcDM="></audio></p>`
  494. if expected != output {
  495. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  496. }
  497. }
  498. func TestRewriteDocumentWithRelativeProxyURL_BasePath_All_Video(t *testing.T) {
  499. os.Clearenv()
  500. os.Setenv("MEDIA_PROXY_MODE", "all")
  501. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  502. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  503. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  504. var err error
  505. parser := config.NewConfigParser()
  506. config.Opts, err = parser.ParseEnvironmentVariables()
  507. if err != nil {
  508. t.Fatalf(`Config parsing failure: %v`, err)
  509. }
  510. input := `<p><video src="https://website/folder/video.mp4"></video></p>`
  511. output := RewriteDocumentWithRelativeProxyURL(input)
  512. expected := `<p><video src="/folder/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ="></video></p>`
  513. if expected != output {
  514. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  515. }
  516. }
  517. func TestRewriteDocumentWithRelativeProxyURL_BasePath_All_VideoPoster(t *testing.T) {
  518. os.Clearenv()
  519. os.Setenv("MEDIA_PROXY_MODE", "all")
  520. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  521. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  522. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  523. var err error
  524. parser := config.NewConfigParser()
  525. config.Opts, err = parser.ParseEnvironmentVariables()
  526. if err != nil {
  527. t.Fatalf(`Config parsing failure: %v`, err)
  528. }
  529. input := `<p><video src="https://website/folder/video.mp4" poster="https://website/folder/poster.png"></video></p>`
  530. output := RewriteDocumentWithRelativeProxyURL(input)
  531. expected := `<p><video src="/folder/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ=" poster="/folder/proxy/u-yLZEYDELx9OlU9to8bt13iysttOWfYpqRfmQYkm3U=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9wb3N0ZXIucG5n"></video></p>`
  532. if expected != output {
  533. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  534. }
  535. }
  536. func TestRewriteDocumentWithAbsoluteProxyURL_BasePath_All_Image(t *testing.T) {
  537. os.Clearenv()
  538. os.Setenv("MEDIA_PROXY_MODE", "all")
  539. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  540. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  541. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  542. var err error
  543. parser := config.NewConfigParser()
  544. config.Opts, err = parser.ParseEnvironmentVariables()
  545. if err != nil {
  546. t.Fatalf(`Config parsing failure: %v`, err)
  547. }
  548. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  549. output := RewriteDocumentWithAbsoluteProxyURL(input)
  550. expected := `<p><img src="http://example.org:88/folder/proxy/LdPNR1GBDigeeNp2ArUQRyZsVqT_PWLfHGjYFrrWWIY=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  551. if expected != output {
  552. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  553. }
  554. }
  555. func TestRewriteDocumentWithAbsoluteProxyURL_BasePath_All_Audio(t *testing.T) {
  556. os.Clearenv()
  557. os.Setenv("MEDIA_PROXY_MODE", "all")
  558. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  559. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  560. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  561. var err error
  562. parser := config.NewConfigParser()
  563. config.Opts, err = parser.ParseEnvironmentVariables()
  564. if err != nil {
  565. t.Fatalf(`Config parsing failure: %v`, err)
  566. }
  567. input := `<p><audio src="https://website/folder/audio.mp3"></audio></p>`
  568. output := RewriteDocumentWithAbsoluteProxyURL(input)
  569. expected := `<p><audio src="http://example.org:88/folder/proxy/EmBTvmU5B17wGuONkeknkptYopW_Tl6Y6_W8oYbN_Xs=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9hdWRpby5tcDM="></audio></p>`
  570. if expected != output {
  571. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  572. }
  573. }
  574. func TestRewriteDocumentWithAbsoluteProxyURL_BasePath_All_Video(t *testing.T) {
  575. os.Clearenv()
  576. os.Setenv("MEDIA_PROXY_MODE", "all")
  577. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  578. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  579. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  580. var err error
  581. parser := config.NewConfigParser()
  582. config.Opts, err = parser.ParseEnvironmentVariables()
  583. if err != nil {
  584. t.Fatalf(`Config parsing failure: %v`, err)
  585. }
  586. input := `<p><video src="https://website/folder/video.mp4"></video></p>`
  587. output := RewriteDocumentWithAbsoluteProxyURL(input)
  588. expected := `<p><video src="http://example.org:88/folder/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ="></video></p>`
  589. if expected != output {
  590. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  591. }
  592. }
  593. func TestRewriteDocumentWithAbsoluteProxyURL_BasePath_All_VideoPoster(t *testing.T) {
  594. os.Clearenv()
  595. os.Setenv("MEDIA_PROXY_MODE", "all")
  596. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  597. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  598. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  599. var err error
  600. parser := config.NewConfigParser()
  601. config.Opts, err = parser.ParseEnvironmentVariables()
  602. if err != nil {
  603. t.Fatalf(`Config parsing failure: %v`, err)
  604. }
  605. input := `<p><video src="https://website/folder/video.mp4" poster="https://website/folder/poster.png"></video></p>`
  606. output := RewriteDocumentWithAbsoluteProxyURL(input)
  607. expected := `<p><video src="http://example.org:88/folder/proxy/rg7VlAFvCFDe4kxg3YJRgtty6AblMwBVGXsn0WWl89k=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci92aWRlby5tcDQ=" poster="http://example.org:88/folder/proxy/u-yLZEYDELx9OlU9to8bt13iysttOWfYpqRfmQYkm3U=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9wb3N0ZXIucG5n"></video></p>`
  608. if expected != output {
  609. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  610. }
  611. }
  612. func TestRewriteDocumentWithRelativeProxyURL_CustomMediaProxy_All_Image(t *testing.T) {
  613. os.Clearenv()
  614. os.Setenv("MEDIA_PROXY_MODE", "all")
  615. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  616. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  617. os.Setenv("MEDIA_PROXY_CUSTOM_URL", "https://proxy-example/proxy")
  618. var err error
  619. parser := config.NewConfigParser()
  620. config.Opts, err = parser.ParseEnvironmentVariables()
  621. if err != nil {
  622. t.Fatalf(`Config parsing failure: %v`, err)
  623. }
  624. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  625. output := RewriteDocumentWithRelativeProxyURL(input)
  626. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  627. if expected != output {
  628. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  629. }
  630. }
  631. func TestRewriteDocumentWithAbsoluteProxyURL_CustomMediaProxy_All_Image(t *testing.T) {
  632. os.Clearenv()
  633. os.Setenv("MEDIA_PROXY_MODE", "all")
  634. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  635. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  636. os.Setenv("MEDIA_PROXY_CUSTOM_URL", "https://proxy-example/proxy")
  637. var err error
  638. parser := config.NewConfigParser()
  639. config.Opts, err = parser.ParseEnvironmentVariables()
  640. if err != nil {
  641. t.Fatalf(`Config parsing failure: %v`, err)
  642. }
  643. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  644. output := RewriteDocumentWithAbsoluteProxyURL(input)
  645. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  646. if expected != output {
  647. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  648. }
  649. }
  650. func TestMediaProxyWithIncorrectCustomMediaProxy(t *testing.T) {
  651. os.Clearenv()
  652. os.Setenv("MEDIA_PROXY_MODE", "all")
  653. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  654. os.Setenv("MEDIA_PROXY_CUSTOM_URL", "http://:8080example.com")
  655. var err error
  656. parser := config.NewConfigParser()
  657. config.Opts, err = parser.ParseEnvironmentVariables()
  658. if err == nil {
  659. t.Fatalf(`Incorrect proxy URL silently accepted (MEDIA_PROXY_CUSTOM_URL=%q): %q`, os.Getenv("MEDIA_PROXY_CUSTOM_URL"), config.Opts.MediaCustomProxyURL())
  660. }
  661. }
  662. func TestMediaProxyFilterWithImageSrcset(t *testing.T) {
  663. os.Clearenv()
  664. os.Setenv("MEDIA_PROXY_MODE", "all")
  665. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  666. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  667. var err error
  668. parser := config.NewConfigParser()
  669. config.Opts, err = parser.ParseEnvironmentVariables()
  670. if err != nil {
  671. t.Fatalf(`Parsing failure: %v`, err)
  672. }
  673. input := `<p><img src="http://website/folder/image.png" srcset="http://website/folder/image2.png 656w, http://website/folder/image3.png 360w" alt="test"></p>`
  674. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w" alt="test"/></p>`
  675. output := RewriteDocumentWithRelativeProxyURL(input)
  676. if expected != output {
  677. t.Errorf(`Not expected output: got %s`, output)
  678. }
  679. }
  680. func TestMediaProxyFilterWithEmptySrcset(t *testing.T) {
  681. os.Clearenv()
  682. os.Setenv("MEDIA_PROXY_MODE", "all")
  683. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  684. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  685. var err error
  686. parser := config.NewConfigParser()
  687. config.Opts, err = parser.ParseEnvironmentVariables()
  688. if err != nil {
  689. t.Fatalf(`Parsing failure: %v`, err)
  690. }
  691. input := `<p><img src="http://website/folder/image.png" srcset="" alt="test"></p>`
  692. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="" alt="test"/></p>`
  693. output := RewriteDocumentWithRelativeProxyURL(input)
  694. if expected != output {
  695. t.Errorf(`Not expected output: got %s`, output)
  696. }
  697. }
  698. func TestProxyFilterWithPictureSource(t *testing.T) {
  699. os.Clearenv()
  700. os.Setenv("MEDIA_PROXY_MODE", "all")
  701. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  702. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  703. var err error
  704. parser := config.NewConfigParser()
  705. config.Opts, err = parser.ParseEnvironmentVariables()
  706. if err != nil {
  707. t.Fatalf(`Parsing failure: %v`, err)
  708. }
  709. input := `<picture><source srcset="http://website/folder/image2.png 656w, http://website/folder/image3.png 360w, https://website/some,image.png 2x"></picture>`
  710. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w, /proxy/ZIw0hv8WhSTls5aSqhnFaCXlUrKIqTnBRaY0-NaLnds=/aHR0cHM6Ly93ZWJzaXRlL3NvbWUsaW1hZ2UucG5n 2x"/></picture>`
  711. output := RewriteDocumentWithRelativeProxyURL(input)
  712. if expected != output {
  713. t.Errorf(`Not expected output: got %s`, output)
  714. }
  715. }
  716. func TestProxyFilterOnlyNonHTTPWithPictureSource(t *testing.T) {
  717. os.Clearenv()
  718. os.Setenv("MEDIA_PROXY_MODE", "http-only")
  719. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  720. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  721. var err error
  722. parser := config.NewConfigParser()
  723. config.Opts, err = parser.ParseEnvironmentVariables()
  724. if err != nil {
  725. t.Fatalf(`Parsing failure: %v`, err)
  726. }
  727. input := `<picture><source srcset="http://website/folder/image2.png 656w, https://website/some,image.png 2x"></picture>`
  728. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, https://website/some,image.png 2x"/></picture>`
  729. output := RewriteDocumentWithRelativeProxyURL(input)
  730. if expected != output {
  731. t.Errorf(`Not expected output: got %s`, output)
  732. }
  733. }
  734. func TestMediaProxyWithImageDataURL(t *testing.T) {
  735. os.Clearenv()
  736. os.Setenv("MEDIA_PROXY_MODE", "all")
  737. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  738. var err error
  739. parser := config.NewConfigParser()
  740. config.Opts, err = parser.ParseEnvironmentVariables()
  741. if err != nil {
  742. t.Fatalf(`Parsing failure: %v`, err)
  743. }
  744. input := `<img src="data:image/gif;base64,test">`
  745. expected := `<img src="data:image/gif;base64,test"/>`
  746. output := RewriteDocumentWithRelativeProxyURL(input)
  747. if expected != output {
  748. t.Errorf(`Not expected output: got %s`, output)
  749. }
  750. }
  751. func TestMediaProxyWithImageSourceDataURL(t *testing.T) {
  752. os.Clearenv()
  753. os.Setenv("MEDIA_PROXY_MODE", "all")
  754. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  755. var err error
  756. parser := config.NewConfigParser()
  757. config.Opts, err = parser.ParseEnvironmentVariables()
  758. if err != nil {
  759. t.Fatalf(`Parsing failure: %v`, err)
  760. }
  761. input := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  762. expected := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  763. output := RewriteDocumentWithRelativeProxyURL(input)
  764. if expected != output {
  765. t.Errorf(`Not expected output: got %s`, output)
  766. }
  767. }
  768. func TestShouldProxifyURLWithMimeType(t *testing.T) {
  769. testCases := []struct {
  770. name string
  771. mediaURL string
  772. mediaMimeType string
  773. mediaProxyOption string
  774. mediaProxyResourceTypes []string
  775. expected bool
  776. }{
  777. {
  778. name: "Empty URL should not be proxified",
  779. mediaURL: "",
  780. mediaMimeType: "image/jpeg",
  781. mediaProxyOption: "all",
  782. mediaProxyResourceTypes: []string{"image"},
  783. expected: false,
  784. },
  785. {
  786. name: "Data URL should not be proxified",
  787. mediaURL: "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==",
  788. mediaMimeType: "image/png",
  789. mediaProxyOption: "all",
  790. mediaProxyResourceTypes: []string{"image"},
  791. expected: false,
  792. },
  793. {
  794. name: "HTTP URL with all mode and matching MIME type should be proxified",
  795. mediaURL: "http://example.com/image.jpg",
  796. mediaMimeType: "image/jpeg",
  797. mediaProxyOption: "all",
  798. mediaProxyResourceTypes: []string{"image"},
  799. expected: true,
  800. },
  801. {
  802. name: "HTTPS URL with all mode and matching MIME type should be proxified",
  803. mediaURL: "https://example.com/image.jpg",
  804. mediaMimeType: "image/jpeg",
  805. mediaProxyOption: "all",
  806. mediaProxyResourceTypes: []string{"image"},
  807. expected: true,
  808. },
  809. {
  810. name: "HTTP URL with http-only mode and matching MIME type should be proxified",
  811. mediaURL: "http://example.com/image.jpg",
  812. mediaMimeType: "image/jpeg",
  813. mediaProxyOption: "http-only",
  814. mediaProxyResourceTypes: []string{"image"},
  815. expected: true,
  816. },
  817. {
  818. name: "HTTPS URL with http-only mode should not be proxified",
  819. mediaURL: "https://example.com/image.jpg",
  820. mediaMimeType: "image/jpeg",
  821. mediaProxyOption: "http-only",
  822. mediaProxyResourceTypes: []string{"image"},
  823. expected: false,
  824. },
  825. {
  826. name: "URL with none mode should not be proxified",
  827. mediaURL: "http://example.com/image.jpg",
  828. mediaMimeType: "image/jpeg",
  829. mediaProxyOption: "none",
  830. mediaProxyResourceTypes: []string{"image"},
  831. expected: false,
  832. },
  833. {
  834. name: "URL with matching MIME type should be proxified",
  835. mediaURL: "http://example.com/video.mp4",
  836. mediaMimeType: "video/mp4",
  837. mediaProxyOption: "all",
  838. mediaProxyResourceTypes: []string{"video"},
  839. expected: true,
  840. },
  841. {
  842. name: "URL with non-matching MIME type should not be proxified",
  843. mediaURL: "http://example.com/video.mp4",
  844. mediaMimeType: "video/mp4",
  845. mediaProxyOption: "all",
  846. mediaProxyResourceTypes: []string{"image"},
  847. expected: false,
  848. },
  849. {
  850. name: "URL with multiple resource types and matching MIME type should be proxified",
  851. mediaURL: "http://example.com/audio.mp3",
  852. mediaMimeType: "audio/mp3",
  853. mediaProxyOption: "all",
  854. mediaProxyResourceTypes: []string{"image", "audio", "video"},
  855. expected: true,
  856. },
  857. {
  858. name: "URL with multiple resource types but non-matching MIME type should not be proxified",
  859. mediaURL: "http://example.com/document.pdf",
  860. mediaMimeType: "application/pdf",
  861. mediaProxyOption: "all",
  862. mediaProxyResourceTypes: []string{"image", "audio", "video"},
  863. expected: false,
  864. },
  865. {
  866. name: "URL with empty resource types should not be proxified",
  867. mediaURL: "http://example.com/image.jpg",
  868. mediaMimeType: "image/jpeg",
  869. mediaProxyOption: "all",
  870. mediaProxyResourceTypes: []string{},
  871. expected: false,
  872. },
  873. {
  874. name: "Relative URL should not be proxified",
  875. mediaURL: "/image.jpg",
  876. mediaMimeType: "image/jpeg",
  877. mediaProxyOption: "all",
  878. mediaProxyResourceTypes: []string{"image"},
  879. expected: false,
  880. },
  881. {
  882. name: "Protocol-relative URL should not be proxified",
  883. mediaURL: "//cdn.example.com/image.jpg",
  884. mediaMimeType: "image/jpeg",
  885. mediaProxyOption: "all",
  886. mediaProxyResourceTypes: []string{"image"},
  887. expected: false,
  888. },
  889. {
  890. name: "Unsupported scheme should not be proxified",
  891. mediaURL: "ftp://example.com/image.jpg",
  892. mediaMimeType: "image/jpeg",
  893. mediaProxyOption: "all",
  894. mediaProxyResourceTypes: []string{"image"},
  895. expected: false,
  896. },
  897. {
  898. name: "Blob URL should not be proxified",
  899. mediaURL: "blob:https://example.com/123",
  900. mediaMimeType: "image/jpeg",
  901. mediaProxyOption: "all",
  902. mediaProxyResourceTypes: []string{"image"},
  903. expected: false,
  904. },
  905. {
  906. name: "URL with partial MIME type match should be proxified",
  907. mediaURL: "http://example.com/image.jpg",
  908. mediaMimeType: "image/jpeg",
  909. mediaProxyOption: "all",
  910. mediaProxyResourceTypes: []string{"image"},
  911. expected: true,
  912. },
  913. {
  914. name: "URL with uppercase MIME type should be proxified",
  915. mediaURL: "http://example.com/image.jpg",
  916. mediaMimeType: "Image/JPEG",
  917. mediaProxyOption: "all",
  918. mediaProxyResourceTypes: []string{"image"},
  919. expected: true,
  920. },
  921. {
  922. name: "URL with audio MIME type and audio resource type should be proxified",
  923. mediaURL: "http://example.com/song.ogg",
  924. mediaMimeType: "audio/ogg",
  925. mediaProxyOption: "all",
  926. mediaProxyResourceTypes: []string{"audio"},
  927. expected: true,
  928. },
  929. {
  930. name: "URL with mixed-case audio MIME type should be proxified",
  931. mediaURL: "http://example.com/song.ogg",
  932. mediaMimeType: "AuDiO/Ogg",
  933. mediaProxyOption: "all",
  934. mediaProxyResourceTypes: []string{"audio"},
  935. expected: true,
  936. },
  937. {
  938. name: "URL with video MIME type and video resource type should be proxified",
  939. mediaURL: "http://example.com/movie.webm",
  940. mediaMimeType: "video/webm",
  941. mediaProxyOption: "all",
  942. mediaProxyResourceTypes: []string{"video"},
  943. expected: true,
  944. },
  945. }
  946. for _, tc := range testCases {
  947. t.Run(tc.name, func(t *testing.T) {
  948. result := ShouldProxifyURLWithMimeType(tc.mediaURL, tc.mediaMimeType, tc.mediaProxyOption, tc.mediaProxyResourceTypes)
  949. if result != tc.expected {
  950. t.Errorf("Expected %v, got %v for URL: %s, MIME type: %s, proxy option: %s, resource types: %v",
  951. tc.expected, result, tc.mediaURL, tc.mediaMimeType, tc.mediaProxyOption, tc.mediaProxyResourceTypes)
  952. }
  953. })
  954. }
  955. }