media_proxy_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582
  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. "net/http"
  6. "os"
  7. "testing"
  8. "github.com/gorilla/mux"
  9. "miniflux.app/v2/internal/config"
  10. )
  11. func TestProxyFilterWithHttpDefault(t *testing.T) {
  12. os.Clearenv()
  13. os.Setenv("PROXY_OPTION", "http-only")
  14. os.Setenv("PROXY_MEDIA_TYPES", "image")
  15. os.Setenv("PROXY_PRIVATE_KEY", "test")
  16. var err error
  17. parser := config.NewParser()
  18. config.Opts, err = parser.ParseEnvironmentVariables()
  19. if err != nil {
  20. t.Fatalf(`Parsing failure: %v`, err)
  21. }
  22. r := mux.NewRouter()
  23. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  24. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  25. output := RewriteDocumentWithRelativeProxyURL(r, input)
  26. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  27. if expected != output {
  28. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  29. }
  30. }
  31. func TestProxyFilterWithHttpsDefault(t *testing.T) {
  32. os.Clearenv()
  33. os.Setenv("PROXY_OPTION", "http-only")
  34. os.Setenv("PROXY_MEDIA_TYPES", "image")
  35. var err error
  36. parser := config.NewParser()
  37. config.Opts, err = parser.ParseEnvironmentVariables()
  38. if err != nil {
  39. t.Fatalf(`Parsing failure: %v`, err)
  40. }
  41. r := mux.NewRouter()
  42. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  43. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  44. output := RewriteDocumentWithRelativeProxyURL(r, input)
  45. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  46. if expected != output {
  47. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  48. }
  49. }
  50. func TestProxyFilterWithHttpNever(t *testing.T) {
  51. os.Clearenv()
  52. os.Setenv("PROXY_OPTION", "none")
  53. var err error
  54. parser := config.NewParser()
  55. config.Opts, err = parser.ParseEnvironmentVariables()
  56. if err != nil {
  57. t.Fatalf(`Parsing failure: %v`, err)
  58. }
  59. r := mux.NewRouter()
  60. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  61. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  62. output := RewriteDocumentWithRelativeProxyURL(r, input)
  63. expected := input
  64. if expected != output {
  65. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  66. }
  67. }
  68. func TestProxyFilterWithHttpsNever(t *testing.T) {
  69. os.Clearenv()
  70. os.Setenv("PROXY_OPTION", "none")
  71. var err error
  72. parser := config.NewParser()
  73. config.Opts, err = parser.ParseEnvironmentVariables()
  74. if err != nil {
  75. t.Fatalf(`Parsing failure: %v`, err)
  76. }
  77. r := mux.NewRouter()
  78. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  79. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  80. output := RewriteDocumentWithRelativeProxyURL(r, input)
  81. expected := input
  82. if expected != output {
  83. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  84. }
  85. }
  86. func TestProxyFilterWithHttpAlways(t *testing.T) {
  87. os.Clearenv()
  88. os.Setenv("PROXY_OPTION", "all")
  89. os.Setenv("PROXY_MEDIA_TYPES", "image")
  90. os.Setenv("PROXY_PRIVATE_KEY", "test")
  91. var err error
  92. parser := config.NewParser()
  93. config.Opts, err = parser.ParseEnvironmentVariables()
  94. if err != nil {
  95. t.Fatalf(`Parsing failure: %v`, err)
  96. }
  97. r := mux.NewRouter()
  98. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  99. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  100. output := RewriteDocumentWithRelativeProxyURL(r, input)
  101. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  102. if expected != output {
  103. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  104. }
  105. }
  106. func TestProxyFilterWithHttpsAlways(t *testing.T) {
  107. os.Clearenv()
  108. os.Setenv("PROXY_OPTION", "all")
  109. os.Setenv("PROXY_MEDIA_TYPES", "image")
  110. os.Setenv("PROXY_PRIVATE_KEY", "test")
  111. var err error
  112. parser := config.NewParser()
  113. config.Opts, err = parser.ParseEnvironmentVariables()
  114. if err != nil {
  115. t.Fatalf(`Parsing failure: %v`, err)
  116. }
  117. r := mux.NewRouter()
  118. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  119. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  120. output := RewriteDocumentWithRelativeProxyURL(r, input)
  121. expected := `<p><img src="/proxy/LdPNR1GBDigeeNp2ArUQRyZsVqT_PWLfHGjYFrrWWIY=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  122. if expected != output {
  123. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  124. }
  125. }
  126. func TestAbsoluteProxyFilterWithHttpsAlways(t *testing.T) {
  127. os.Clearenv()
  128. os.Setenv("PROXY_OPTION", "all")
  129. os.Setenv("PROXY_MEDIA_TYPES", "image")
  130. os.Setenv("PROXY_PRIVATE_KEY", "test")
  131. var err error
  132. parser := config.NewParser()
  133. config.Opts, err = parser.ParseEnvironmentVariables()
  134. if err != nil {
  135. t.Fatalf(`Parsing failure: %v`, err)
  136. }
  137. r := mux.NewRouter()
  138. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  139. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  140. output := RewriteDocumentWithAbsoluteProxyURL(r, input)
  141. expected := `<p><img src="http://localhost/proxy/LdPNR1GBDigeeNp2ArUQRyZsVqT_PWLfHGjYFrrWWIY=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  142. if expected != output {
  143. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  144. }
  145. }
  146. func TestAbsoluteProxyFilterWithCustomPortInBaseURL(t *testing.T) {
  147. os.Clearenv()
  148. os.Setenv("BASE_URL", "http://example.org:88/folder/")
  149. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  150. var err error
  151. parser := config.NewParser()
  152. config.Opts, err = parser.ParseEnvironmentVariables()
  153. if err != nil {
  154. t.Fatalf(`Parsing failure: %v`, err)
  155. }
  156. if config.Opts.BaseURL() != "http://example.org:88/folder" {
  157. t.Fatalf(`Unexpected base URL, got "%s"`, config.Opts.BaseURL())
  158. }
  159. r := mux.NewRouter()
  160. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  161. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  162. output := RewriteDocumentWithAbsoluteProxyURL(r, input)
  163. expected := `<p><img src="http://example.org:88/folder/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  164. if expected != output {
  165. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  166. }
  167. }
  168. func TestAbsoluteProxyFilterWithHttpsAlwaysAndAudioTag(t *testing.T) {
  169. os.Clearenv()
  170. os.Setenv("PROXY_OPTION", "all")
  171. os.Setenv("PROXY_MEDIA_TYPES", "audio")
  172. os.Setenv("PROXY_PRIVATE_KEY", "test")
  173. var err error
  174. parser := config.NewParser()
  175. config.Opts, err = parser.ParseEnvironmentVariables()
  176. if err != nil {
  177. t.Fatalf(`Parsing failure: %v`, err)
  178. }
  179. r := mux.NewRouter()
  180. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  181. input := `<audio src="https://website/folder/audio.mp3"></audio>`
  182. output := RewriteDocumentWithAbsoluteProxyURL(r, input)
  183. expected := `<audio src="http://localhost/proxy/EmBTvmU5B17wGuONkeknkptYopW_Tl6Y6_W8oYbN_Xs=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9hdWRpby5tcDM="></audio>`
  184. if expected != output {
  185. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  186. }
  187. }
  188. func TestProxyFilterWithHttpsAlwaysAndCustomProxyServer(t *testing.T) {
  189. os.Clearenv()
  190. os.Setenv("PROXY_OPTION", "all")
  191. os.Setenv("PROXY_MEDIA_TYPES", "image")
  192. os.Setenv("PROXY_URL", "https://proxy-example/proxy")
  193. var err error
  194. parser := config.NewParser()
  195. config.Opts, err = parser.ParseEnvironmentVariables()
  196. if err != nil {
  197. t.Fatalf(`Parsing failure: %v`, err)
  198. }
  199. r := mux.NewRouter()
  200. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  201. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  202. output := RewriteDocumentWithRelativeProxyURL(r, input)
  203. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  204. if expected != output {
  205. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  206. }
  207. }
  208. func TestProxyFilterWithHttpsAlwaysAndIncorrectCustomProxyServer(t *testing.T) {
  209. os.Clearenv()
  210. os.Setenv("PROXY_OPTION", "all")
  211. os.Setenv("PROXY_MEDIA_TYPES", "image")
  212. os.Setenv("PROXY_URL", "http://:8080example.com")
  213. var err error
  214. parser := config.NewParser()
  215. config.Opts, err = parser.ParseEnvironmentVariables()
  216. if err != nil {
  217. t.Fatalf(`Parsing failure: %v`, err)
  218. }
  219. r := mux.NewRouter()
  220. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  221. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  222. output := RewriteDocumentWithRelativeProxyURL(r, input)
  223. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  224. if expected != output {
  225. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  226. }
  227. }
  228. func TestAbsoluteProxyFilterWithHttpsAlwaysAndCustomProxyServer(t *testing.T) {
  229. os.Clearenv()
  230. os.Setenv("MEDIA_PROXY_MODE", "all")
  231. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  232. os.Setenv("MEDIA_PROXY_CUSTOM_URL", "https://proxy-example/proxy")
  233. var err error
  234. parser := config.NewParser()
  235. config.Opts, err = parser.ParseEnvironmentVariables()
  236. if err != nil {
  237. t.Fatalf(`Parsing failure: %v`, err)
  238. }
  239. r := mux.NewRouter()
  240. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  241. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  242. output := RewriteDocumentWithAbsoluteProxyURL(r, input)
  243. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  244. if expected != output {
  245. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  246. }
  247. }
  248. func TestProxyFilterWithHttpInvalid(t *testing.T) {
  249. os.Clearenv()
  250. os.Setenv("PROXY_OPTION", "invalid")
  251. os.Setenv("PROXY_PRIVATE_KEY", "test")
  252. var err error
  253. parser := config.NewParser()
  254. config.Opts, err = parser.ParseEnvironmentVariables()
  255. if err != nil {
  256. t.Fatalf(`Parsing failure: %v`, err)
  257. }
  258. r := mux.NewRouter()
  259. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  260. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  261. output := RewriteDocumentWithRelativeProxyURL(r, input)
  262. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  263. if expected != output {
  264. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  265. }
  266. }
  267. func TestProxyFilterWithHttpsInvalid(t *testing.T) {
  268. os.Clearenv()
  269. os.Setenv("PROXY_OPTION", "invalid")
  270. os.Setenv("PROXY_PRIVATE_KEY", "test")
  271. var err error
  272. parser := config.NewParser()
  273. config.Opts, err = parser.ParseEnvironmentVariables()
  274. if err != nil {
  275. t.Fatalf(`Parsing failure: %v`, err)
  276. }
  277. r := mux.NewRouter()
  278. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  279. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  280. output := RewriteDocumentWithRelativeProxyURL(r, input)
  281. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  282. if expected != output {
  283. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  284. }
  285. }
  286. func TestProxyFilterWithSrcset(t *testing.T) {
  287. os.Clearenv()
  288. os.Setenv("PROXY_OPTION", "all")
  289. os.Setenv("PROXY_MEDIA_TYPES", "image")
  290. os.Setenv("PROXY_PRIVATE_KEY", "test")
  291. var err error
  292. parser := config.NewParser()
  293. config.Opts, err = parser.ParseEnvironmentVariables()
  294. if err != nil {
  295. t.Fatalf(`Parsing failure: %v`, err)
  296. }
  297. r := mux.NewRouter()
  298. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  299. 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>`
  300. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w" alt="test"/></p>`
  301. output := RewriteDocumentWithRelativeProxyURL(r, input)
  302. if expected != output {
  303. t.Errorf(`Not expected output: got %s`, output)
  304. }
  305. }
  306. func TestProxyFilterWithEmptySrcset(t *testing.T) {
  307. os.Clearenv()
  308. os.Setenv("PROXY_OPTION", "all")
  309. os.Setenv("PROXY_MEDIA_TYPES", "image")
  310. os.Setenv("PROXY_PRIVATE_KEY", "test")
  311. var err error
  312. parser := config.NewParser()
  313. config.Opts, err = parser.ParseEnvironmentVariables()
  314. if err != nil {
  315. t.Fatalf(`Parsing failure: %v`, err)
  316. }
  317. r := mux.NewRouter()
  318. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  319. input := `<p><img src="http://website/folder/image.png" srcset="" alt="test"></p>`
  320. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="" alt="test"/></p>`
  321. output := RewriteDocumentWithRelativeProxyURL(r, input)
  322. if expected != output {
  323. t.Errorf(`Not expected output: got %s`, output)
  324. }
  325. }
  326. func TestProxyFilterWithPictureSource(t *testing.T) {
  327. os.Clearenv()
  328. os.Setenv("PROXY_OPTION", "all")
  329. os.Setenv("PROXY_MEDIA_TYPES", "image")
  330. os.Setenv("PROXY_PRIVATE_KEY", "test")
  331. var err error
  332. parser := config.NewParser()
  333. config.Opts, err = parser.ParseEnvironmentVariables()
  334. if err != nil {
  335. t.Fatalf(`Parsing failure: %v`, err)
  336. }
  337. r := mux.NewRouter()
  338. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  339. input := `<picture><source srcset="http://website/folder/image2.png 656w, http://website/folder/image3.png 360w, https://website/some,image.png 2x"></picture>`
  340. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w, /proxy/ZIw0hv8WhSTls5aSqhnFaCXlUrKIqTnBRaY0-NaLnds=/aHR0cHM6Ly93ZWJzaXRlL3NvbWUsaW1hZ2UucG5n 2x"/></picture>`
  341. output := RewriteDocumentWithRelativeProxyURL(r, input)
  342. if expected != output {
  343. t.Errorf(`Not expected output: got %s`, output)
  344. }
  345. }
  346. func TestProxyFilterOnlyNonHTTPWithPictureSource(t *testing.T) {
  347. os.Clearenv()
  348. os.Setenv("PROXY_OPTION", "https")
  349. os.Setenv("PROXY_MEDIA_TYPES", "image")
  350. os.Setenv("PROXY_PRIVATE_KEY", "test")
  351. var err error
  352. parser := config.NewParser()
  353. config.Opts, err = parser.ParseEnvironmentVariables()
  354. if err != nil {
  355. t.Fatalf(`Parsing failure: %v`, err)
  356. }
  357. r := mux.NewRouter()
  358. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  359. input := `<picture><source srcset="http://website/folder/image2.png 656w, https://website/some,image.png 2x"></picture>`
  360. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, https://website/some,image.png 2x"/></picture>`
  361. output := RewriteDocumentWithRelativeProxyURL(r, input)
  362. if expected != output {
  363. t.Errorf(`Not expected output: got %s`, output)
  364. }
  365. }
  366. func TestProxyWithImageDataURL(t *testing.T) {
  367. os.Clearenv()
  368. os.Setenv("PROXY_OPTION", "all")
  369. os.Setenv("PROXY_MEDIA_TYPES", "image")
  370. var err error
  371. parser := config.NewParser()
  372. config.Opts, err = parser.ParseEnvironmentVariables()
  373. if err != nil {
  374. t.Fatalf(`Parsing failure: %v`, err)
  375. }
  376. r := mux.NewRouter()
  377. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  378. input := `<img src="data:image/gif;base64,test">`
  379. expected := `<img src="data:image/gif;base64,test"/>`
  380. output := RewriteDocumentWithRelativeProxyURL(r, input)
  381. if expected != output {
  382. t.Errorf(`Not expected output: got %s`, output)
  383. }
  384. }
  385. func TestProxyWithImageSourceDataURL(t *testing.T) {
  386. os.Clearenv()
  387. os.Setenv("PROXY_OPTION", "all")
  388. os.Setenv("PROXY_MEDIA_TYPES", "image")
  389. var err error
  390. parser := config.NewParser()
  391. config.Opts, err = parser.ParseEnvironmentVariables()
  392. if err != nil {
  393. t.Fatalf(`Parsing failure: %v`, err)
  394. }
  395. r := mux.NewRouter()
  396. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  397. input := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  398. expected := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  399. output := RewriteDocumentWithRelativeProxyURL(r, input)
  400. if expected != output {
  401. t.Errorf(`Not expected output: got %s`, output)
  402. }
  403. }
  404. func TestProxyFilterWithVideo(t *testing.T) {
  405. os.Clearenv()
  406. os.Setenv("PROXY_OPTION", "all")
  407. os.Setenv("PROXY_MEDIA_TYPES", "video")
  408. os.Setenv("PROXY_PRIVATE_KEY", "test")
  409. var err error
  410. parser := config.NewParser()
  411. config.Opts, err = parser.ParseEnvironmentVariables()
  412. if err != nil {
  413. t.Fatalf(`Parsing failure: %v`, err)
  414. }
  415. r := mux.NewRouter()
  416. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  417. input := `<video poster="https://example.com/img.png" src="https://example.com/video.mp4"></video>`
  418. expected := `<video poster="/proxy/aDFfroYL57q5XsojIzATT6OYUCkuVSPXYJQAVrotnLw=/aHR0cHM6Ly9leGFtcGxlLmNvbS9pbWcucG5n" src="/proxy/0y3LR8zlx8S8qJkj1qWFOO6x3a-5yf2gLWjGIJV5yyc=/aHR0cHM6Ly9leGFtcGxlLmNvbS92aWRlby5tcDQ="></video>`
  419. output := RewriteDocumentWithRelativeProxyURL(r, input)
  420. if expected != output {
  421. t.Errorf(`Not expected output: got %s`, output)
  422. }
  423. }
  424. func TestProxyFilterVideoPoster(t *testing.T) {
  425. os.Clearenv()
  426. os.Setenv("PROXY_OPTION", "all")
  427. os.Setenv("PROXY_MEDIA_TYPES", "image")
  428. os.Setenv("PROXY_PRIVATE_KEY", "test")
  429. var err error
  430. parser := config.NewParser()
  431. config.Opts, err = parser.ParseEnvironmentVariables()
  432. if err != nil {
  433. t.Fatalf(`Parsing failure: %v`, err)
  434. }
  435. r := mux.NewRouter()
  436. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  437. input := `<video poster="https://example.com/img.png" src="https://example.com/video.mp4"></video>`
  438. expected := `<video poster="/proxy/aDFfroYL57q5XsojIzATT6OYUCkuVSPXYJQAVrotnLw=/aHR0cHM6Ly9leGFtcGxlLmNvbS9pbWcucG5n" src="https://example.com/video.mp4"></video>`
  439. output := RewriteDocumentWithRelativeProxyURL(r, input)
  440. if expected != output {
  441. t.Errorf(`Not expected output: got %s`, output)
  442. }
  443. }
  444. func TestProxyFilterVideoPosterOnce(t *testing.T) {
  445. os.Clearenv()
  446. os.Setenv("PROXY_OPTION", "all")
  447. os.Setenv("PROXY_MEDIA_TYPES", "image,video")
  448. os.Setenv("PROXY_PRIVATE_KEY", "test")
  449. var err error
  450. parser := config.NewParser()
  451. config.Opts, err = parser.ParseEnvironmentVariables()
  452. if err != nil {
  453. t.Fatalf(`Parsing failure: %v`, err)
  454. }
  455. r := mux.NewRouter()
  456. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  457. input := `<video poster="https://example.com/img.png" src="https://example.com/video.mp4"></video>`
  458. expected := `<video poster="/proxy/aDFfroYL57q5XsojIzATT6OYUCkuVSPXYJQAVrotnLw=/aHR0cHM6Ly9leGFtcGxlLmNvbS9pbWcucG5n" src="/proxy/0y3LR8zlx8S8qJkj1qWFOO6x3a-5yf2gLWjGIJV5yyc=/aHR0cHM6Ly9leGFtcGxlLmNvbS92aWRlby5tcDQ="></video>`
  459. output := RewriteDocumentWithRelativeProxyURL(r, input)
  460. if expected != output {
  461. t.Errorf(`Not expected output: got %s`, output)
  462. }
  463. }