media_proxy_test.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591
  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("MEDIA_PROXY_MODE", "http-only")
  14. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  15. os.Setenv("MEDIA_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("MEDIA_PROXY_MODE", "http-only")
  34. os.Setenv("MEDIA_PROXY_RESOURCE_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("MEDIA_PROXY_MODE", "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("MEDIA_PROXY_MODE", "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("MEDIA_PROXY_MODE", "all")
  89. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  90. os.Setenv("MEDIA_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("MEDIA_PROXY_MODE", "all")
  109. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  110. os.Setenv("MEDIA_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("MEDIA_PROXY_MODE", "all")
  129. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  130. os.Setenv("MEDIA_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 TestAbsoluteProxyFilterWithCustomPortAndSubfolderInBaseURL(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. if config.Opts.RootURL() != "http://example.org:88" {
  160. t.Fatalf(`Unexpected root URL, got "%s"`, config.Opts.RootURL())
  161. }
  162. router := mux.NewRouter()
  163. if config.Opts.BasePath() != "" {
  164. router = router.PathPrefix(config.Opts.BasePath()).Subrouter()
  165. }
  166. router.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  167. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  168. output := RewriteDocumentWithAbsoluteProxyURL(router, input)
  169. expected := `<p><img src="http://example.org:88/folder/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  170. if expected != output {
  171. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  172. }
  173. }
  174. func TestAbsoluteProxyFilterWithHttpsAlwaysAndAudioTag(t *testing.T) {
  175. os.Clearenv()
  176. os.Setenv("MEDIA_PROXY_MODE", "all")
  177. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "audio")
  178. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  179. var err error
  180. parser := config.NewParser()
  181. config.Opts, err = parser.ParseEnvironmentVariables()
  182. if err != nil {
  183. t.Fatalf(`Parsing failure: %v`, err)
  184. }
  185. r := mux.NewRouter()
  186. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  187. input := `<audio src="https://website/folder/audio.mp3"></audio>`
  188. output := RewriteDocumentWithAbsoluteProxyURL(r, input)
  189. expected := `<audio src="http://localhost/proxy/EmBTvmU5B17wGuONkeknkptYopW_Tl6Y6_W8oYbN_Xs=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9hdWRpby5tcDM="></audio>`
  190. if expected != output {
  191. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  192. }
  193. }
  194. func TestProxyFilterWithHttpsAlwaysAndCustomProxyServer(t *testing.T) {
  195. os.Clearenv()
  196. os.Setenv("MEDIA_PROXY_MODE", "all")
  197. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  198. os.Setenv("MEDIA_PROXY_CUSTOM_URL", "https://proxy-example/proxy")
  199. var err error
  200. parser := config.NewParser()
  201. config.Opts, err = parser.ParseEnvironmentVariables()
  202. if err != nil {
  203. t.Fatalf(`Parsing failure: %v`, err)
  204. }
  205. r := mux.NewRouter()
  206. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  207. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  208. output := RewriteDocumentWithRelativeProxyURL(r, input)
  209. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  210. if expected != output {
  211. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  212. }
  213. }
  214. func TestProxyFilterWithHttpsAlwaysAndIncorrectCustomProxyServer(t *testing.T) {
  215. os.Clearenv()
  216. os.Setenv("MEDIA_PROXY_MODE", "all")
  217. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  218. os.Setenv("MEDIA_PROXY_CUSTOM_URL", "http://:8080example.com")
  219. var err error
  220. parser := config.NewParser()
  221. config.Opts, err = parser.ParseEnvironmentVariables()
  222. if err != nil {
  223. t.Fatalf(`Parsing failure: %v`, err)
  224. }
  225. r := mux.NewRouter()
  226. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  227. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  228. output := RewriteDocumentWithRelativeProxyURL(r, input)
  229. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  230. if expected != output {
  231. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  232. }
  233. }
  234. func TestAbsoluteProxyFilterWithHttpsAlwaysAndCustomProxyServer(t *testing.T) {
  235. os.Clearenv()
  236. os.Setenv("MEDIA_PROXY_MODE", "all")
  237. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  238. os.Setenv("MEDIA_PROXY_CUSTOM_URL", "https://proxy-example/proxy")
  239. var err error
  240. parser := config.NewParser()
  241. config.Opts, err = parser.ParseEnvironmentVariables()
  242. if err != nil {
  243. t.Fatalf(`Parsing failure: %v`, err)
  244. }
  245. r := mux.NewRouter()
  246. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  247. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  248. output := RewriteDocumentWithAbsoluteProxyURL(r, input)
  249. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  250. if expected != output {
  251. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  252. }
  253. }
  254. func TestProxyFilterWithHttpInvalid(t *testing.T) {
  255. os.Clearenv()
  256. os.Setenv("MEDIA_PROXY_MODE", "invalid")
  257. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  258. var err error
  259. parser := config.NewParser()
  260. config.Opts, err = parser.ParseEnvironmentVariables()
  261. if err != nil {
  262. t.Fatalf(`Parsing failure: %v`, err)
  263. }
  264. r := mux.NewRouter()
  265. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  266. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  267. output := RewriteDocumentWithRelativeProxyURL(r, input)
  268. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  269. if expected != output {
  270. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  271. }
  272. }
  273. func TestProxyFilterWithHttpsInvalid(t *testing.T) {
  274. os.Clearenv()
  275. os.Setenv("MEDIA_PROXY_MODE", "invalid")
  276. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  277. var err error
  278. parser := config.NewParser()
  279. config.Opts, err = parser.ParseEnvironmentVariables()
  280. if err != nil {
  281. t.Fatalf(`Parsing failure: %v`, err)
  282. }
  283. r := mux.NewRouter()
  284. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  285. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  286. output := RewriteDocumentWithRelativeProxyURL(r, input)
  287. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  288. if expected != output {
  289. t.Errorf(`Not expected output: got %q instead of %q`, output, expected)
  290. }
  291. }
  292. func TestProxyFilterWithSrcset(t *testing.T) {
  293. os.Clearenv()
  294. os.Setenv("MEDIA_PROXY_MODE", "all")
  295. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  296. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  297. var err error
  298. parser := config.NewParser()
  299. config.Opts, err = parser.ParseEnvironmentVariables()
  300. if err != nil {
  301. t.Fatalf(`Parsing failure: %v`, err)
  302. }
  303. r := mux.NewRouter()
  304. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  305. 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>`
  306. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w" alt="test"/></p>`
  307. output := RewriteDocumentWithRelativeProxyURL(r, input)
  308. if expected != output {
  309. t.Errorf(`Not expected output: got %s`, output)
  310. }
  311. }
  312. func TestProxyFilterWithEmptySrcset(t *testing.T) {
  313. os.Clearenv()
  314. os.Setenv("MEDIA_PROXY_MODE", "all")
  315. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  316. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  317. var err error
  318. parser := config.NewParser()
  319. config.Opts, err = parser.ParseEnvironmentVariables()
  320. if err != nil {
  321. t.Fatalf(`Parsing failure: %v`, err)
  322. }
  323. r := mux.NewRouter()
  324. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  325. input := `<p><img src="http://website/folder/image.png" srcset="" alt="test"></p>`
  326. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="" alt="test"/></p>`
  327. output := RewriteDocumentWithRelativeProxyURL(r, input)
  328. if expected != output {
  329. t.Errorf(`Not expected output: got %s`, output)
  330. }
  331. }
  332. func TestProxyFilterWithPictureSource(t *testing.T) {
  333. os.Clearenv()
  334. os.Setenv("MEDIA_PROXY_MODE", "all")
  335. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  336. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  337. var err error
  338. parser := config.NewParser()
  339. config.Opts, err = parser.ParseEnvironmentVariables()
  340. if err != nil {
  341. t.Fatalf(`Parsing failure: %v`, err)
  342. }
  343. r := mux.NewRouter()
  344. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  345. input := `<picture><source srcset="http://website/folder/image2.png 656w, http://website/folder/image3.png 360w, https://website/some,image.png 2x"></picture>`
  346. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w, /proxy/ZIw0hv8WhSTls5aSqhnFaCXlUrKIqTnBRaY0-NaLnds=/aHR0cHM6Ly93ZWJzaXRlL3NvbWUsaW1hZ2UucG5n 2x"/></picture>`
  347. output := RewriteDocumentWithRelativeProxyURL(r, input)
  348. if expected != output {
  349. t.Errorf(`Not expected output: got %s`, output)
  350. }
  351. }
  352. func TestProxyFilterOnlyNonHTTPWithPictureSource(t *testing.T) {
  353. os.Clearenv()
  354. os.Setenv("MEDIA_PROXY_MODE", "https")
  355. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  356. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  357. var err error
  358. parser := config.NewParser()
  359. config.Opts, err = parser.ParseEnvironmentVariables()
  360. if err != nil {
  361. t.Fatalf(`Parsing failure: %v`, err)
  362. }
  363. r := mux.NewRouter()
  364. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  365. input := `<picture><source srcset="http://website/folder/image2.png 656w, https://website/some,image.png 2x"></picture>`
  366. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, https://website/some,image.png 2x"/></picture>`
  367. output := RewriteDocumentWithRelativeProxyURL(r, input)
  368. if expected != output {
  369. t.Errorf(`Not expected output: got %s`, output)
  370. }
  371. }
  372. func TestProxyWithImageDataURL(t *testing.T) {
  373. os.Clearenv()
  374. os.Setenv("MEDIA_PROXY_MODE", "all")
  375. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  376. var err error
  377. parser := config.NewParser()
  378. config.Opts, err = parser.ParseEnvironmentVariables()
  379. if err != nil {
  380. t.Fatalf(`Parsing failure: %v`, err)
  381. }
  382. r := mux.NewRouter()
  383. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  384. input := `<img src="data:image/gif;base64,test">`
  385. expected := `<img src="data:image/gif;base64,test"/>`
  386. output := RewriteDocumentWithRelativeProxyURL(r, input)
  387. if expected != output {
  388. t.Errorf(`Not expected output: got %s`, output)
  389. }
  390. }
  391. func TestProxyWithImageSourceDataURL(t *testing.T) {
  392. os.Clearenv()
  393. os.Setenv("MEDIA_PROXY_MODE", "all")
  394. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  395. var err error
  396. parser := config.NewParser()
  397. config.Opts, err = parser.ParseEnvironmentVariables()
  398. if err != nil {
  399. t.Fatalf(`Parsing failure: %v`, err)
  400. }
  401. r := mux.NewRouter()
  402. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  403. input := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  404. expected := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  405. output := RewriteDocumentWithRelativeProxyURL(r, input)
  406. if expected != output {
  407. t.Errorf(`Not expected output: got %s`, output)
  408. }
  409. }
  410. func TestProxyFilterWithVideo(t *testing.T) {
  411. os.Clearenv()
  412. os.Setenv("MEDIA_PROXY_MODE", "all")
  413. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "video")
  414. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  415. var err error
  416. parser := config.NewParser()
  417. config.Opts, err = parser.ParseEnvironmentVariables()
  418. if err != nil {
  419. t.Fatalf(`Parsing failure: %v`, err)
  420. }
  421. r := mux.NewRouter()
  422. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  423. input := `<video poster="https://example.com/img.png" src="https://example.com/video.mp4"></video>`
  424. expected := `<video poster="/proxy/aDFfroYL57q5XsojIzATT6OYUCkuVSPXYJQAVrotnLw=/aHR0cHM6Ly9leGFtcGxlLmNvbS9pbWcucG5n" src="/proxy/0y3LR8zlx8S8qJkj1qWFOO6x3a-5yf2gLWjGIJV5yyc=/aHR0cHM6Ly9leGFtcGxlLmNvbS92aWRlby5tcDQ="></video>`
  425. output := RewriteDocumentWithRelativeProxyURL(r, input)
  426. if expected != output {
  427. t.Errorf(`Not expected output: got %s`, output)
  428. }
  429. }
  430. func TestProxyFilterVideoPoster(t *testing.T) {
  431. os.Clearenv()
  432. os.Setenv("MEDIA_PROXY_MODE", "all")
  433. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image")
  434. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  435. var err error
  436. parser := config.NewParser()
  437. config.Opts, err = parser.ParseEnvironmentVariables()
  438. if err != nil {
  439. t.Fatalf(`Parsing failure: %v`, err)
  440. }
  441. r := mux.NewRouter()
  442. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  443. input := `<video poster="https://example.com/img.png" src="https://example.com/video.mp4"></video>`
  444. expected := `<video poster="/proxy/aDFfroYL57q5XsojIzATT6OYUCkuVSPXYJQAVrotnLw=/aHR0cHM6Ly9leGFtcGxlLmNvbS9pbWcucG5n" src="https://example.com/video.mp4"></video>`
  445. output := RewriteDocumentWithRelativeProxyURL(r, input)
  446. if expected != output {
  447. t.Errorf(`Not expected output: got %s`, output)
  448. }
  449. }
  450. func TestProxyFilterVideoPosterOnce(t *testing.T) {
  451. os.Clearenv()
  452. os.Setenv("MEDIA_PROXY_MODE", "all")
  453. os.Setenv("MEDIA_PROXY_RESOURCE_TYPES", "image,video")
  454. os.Setenv("MEDIA_PROXY_PRIVATE_KEY", "test")
  455. var err error
  456. parser := config.NewParser()
  457. config.Opts, err = parser.ParseEnvironmentVariables()
  458. if err != nil {
  459. t.Fatalf(`Parsing failure: %v`, err)
  460. }
  461. r := mux.NewRouter()
  462. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  463. input := `<video poster="https://example.com/img.png" src="https://example.com/video.mp4"></video>`
  464. expected := `<video poster="/proxy/aDFfroYL57q5XsojIzATT6OYUCkuVSPXYJQAVrotnLw=/aHR0cHM6Ly9leGFtcGxlLmNvbS9pbWcucG5n" src="/proxy/0y3LR8zlx8S8qJkj1qWFOO6x3a-5yf2gLWjGIJV5yyc=/aHR0cHM6Ly9leGFtcGxlLmNvbS92aWRlby5tcDQ="></video>`
  465. output := RewriteDocumentWithRelativeProxyURL(r, input)
  466. if expected != output {
  467. t.Errorf(`Not expected output: got %s`, output)
  468. }
  469. }