media_proxy_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379
  1. // SPDX-FileCopyrightText: Copyright The Miniflux Authors. All rights reserved.
  2. // SPDX-License-Identifier: Apache-2.0
  3. package proxy // import "miniflux.app/v2/internal/proxy"
  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 := ProxyRewriter(r, input)
  26. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  27. if expected != output {
  28. t.Errorf(`Not expected output: got "%s" instead of "%s"`, 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 := ProxyRewriter(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 "%s" instead of "%s"`, 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 := ProxyRewriter(r, input)
  63. expected := input
  64. if expected != output {
  65. t.Errorf(`Not expected output: got "%s" instead of "%s"`, 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 := ProxyRewriter(r, input)
  81. expected := input
  82. if expected != output {
  83. t.Errorf(`Not expected output: got "%s" instead of "%s"`, 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 := ProxyRewriter(r, input)
  101. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  102. if expected != output {
  103. t.Errorf(`Not expected output: got "%s" instead of "%s"`, 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 := ProxyRewriter(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 "%s" instead of "%s"`, output, expected)
  124. }
  125. }
  126. func TestProxyFilterWithHttpsAlwaysAndCustomProxyServer(t *testing.T) {
  127. os.Clearenv()
  128. os.Setenv("PROXY_OPTION", "all")
  129. os.Setenv("PROXY_MEDIA_TYPES", "image")
  130. os.Setenv("PROXY_URL", "https://proxy-example/proxy")
  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 := ProxyRewriter(r, input)
  141. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  142. if expected != output {
  143. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  144. }
  145. }
  146. func TestProxyFilterWithHttpInvalid(t *testing.T) {
  147. os.Clearenv()
  148. os.Setenv("PROXY_OPTION", "invalid")
  149. os.Setenv("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. r := mux.NewRouter()
  157. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  158. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  159. output := ProxyRewriter(r, input)
  160. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  161. if expected != output {
  162. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  163. }
  164. }
  165. func TestProxyFilterWithHttpsInvalid(t *testing.T) {
  166. os.Clearenv()
  167. os.Setenv("PROXY_OPTION", "invalid")
  168. os.Setenv("PROXY_PRIVATE_KEY", "test")
  169. var err error
  170. parser := config.NewParser()
  171. config.Opts, err = parser.ParseEnvironmentVariables()
  172. if err != nil {
  173. t.Fatalf(`Parsing failure: %v`, err)
  174. }
  175. r := mux.NewRouter()
  176. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  177. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  178. output := ProxyRewriter(r, input)
  179. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  180. if expected != output {
  181. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  182. }
  183. }
  184. func TestProxyFilterWithSrcset(t *testing.T) {
  185. os.Clearenv()
  186. os.Setenv("PROXY_OPTION", "all")
  187. os.Setenv("PROXY_MEDIA_TYPES", "image")
  188. os.Setenv("PROXY_PRIVATE_KEY", "test")
  189. var err error
  190. parser := config.NewParser()
  191. config.Opts, err = parser.ParseEnvironmentVariables()
  192. if err != nil {
  193. t.Fatalf(`Parsing failure: %v`, err)
  194. }
  195. r := mux.NewRouter()
  196. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  197. 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>`
  198. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w" alt="test"/></p>`
  199. output := ProxyRewriter(r, input)
  200. if expected != output {
  201. t.Errorf(`Not expected output: got %s`, output)
  202. }
  203. }
  204. func TestProxyFilterWithEmptySrcset(t *testing.T) {
  205. os.Clearenv()
  206. os.Setenv("PROXY_OPTION", "all")
  207. os.Setenv("PROXY_MEDIA_TYPES", "image")
  208. os.Setenv("PROXY_PRIVATE_KEY", "test")
  209. var err error
  210. parser := config.NewParser()
  211. config.Opts, err = parser.ParseEnvironmentVariables()
  212. if err != nil {
  213. t.Fatalf(`Parsing failure: %v`, err)
  214. }
  215. r := mux.NewRouter()
  216. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  217. input := `<p><img src="http://website/folder/image.png" srcset="" alt="test"></p>`
  218. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="" alt="test"/></p>`
  219. output := ProxyRewriter(r, input)
  220. if expected != output {
  221. t.Errorf(`Not expected output: got %s`, output)
  222. }
  223. }
  224. func TestProxyFilterWithPictureSource(t *testing.T) {
  225. os.Clearenv()
  226. os.Setenv("PROXY_OPTION", "all")
  227. os.Setenv("PROXY_MEDIA_TYPES", "image")
  228. os.Setenv("PROXY_PRIVATE_KEY", "test")
  229. var err error
  230. parser := config.NewParser()
  231. config.Opts, err = parser.ParseEnvironmentVariables()
  232. if err != nil {
  233. t.Fatalf(`Parsing failure: %v`, err)
  234. }
  235. r := mux.NewRouter()
  236. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  237. input := `<picture><source srcset="http://website/folder/image2.png 656w, http://website/folder/image3.png 360w, https://website/some,image.png 2x"></picture>`
  238. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w, /proxy/ZIw0hv8WhSTls5aSqhnFaCXlUrKIqTnBRaY0-NaLnds=/aHR0cHM6Ly93ZWJzaXRlL3NvbWUsaW1hZ2UucG5n 2x"/></picture>`
  239. output := ProxyRewriter(r, input)
  240. if expected != output {
  241. t.Errorf(`Not expected output: got %s`, output)
  242. }
  243. }
  244. func TestProxyFilterOnlyNonHTTPWithPictureSource(t *testing.T) {
  245. os.Clearenv()
  246. os.Setenv("PROXY_OPTION", "https")
  247. os.Setenv("PROXY_MEDIA_TYPES", "image")
  248. os.Setenv("PROXY_PRIVATE_KEY", "test")
  249. var err error
  250. parser := config.NewParser()
  251. config.Opts, err = parser.ParseEnvironmentVariables()
  252. if err != nil {
  253. t.Fatalf(`Parsing failure: %v`, err)
  254. }
  255. r := mux.NewRouter()
  256. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  257. input := `<picture><source srcset="http://website/folder/image2.png 656w, https://website/some,image.png 2x"></picture>`
  258. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, https://website/some,image.png 2x"/></picture>`
  259. output := ProxyRewriter(r, input)
  260. if expected != output {
  261. t.Errorf(`Not expected output: got %s`, output)
  262. }
  263. }
  264. func TestProxyWithImageDataURL(t *testing.T) {
  265. os.Clearenv()
  266. os.Setenv("PROXY_OPTION", "all")
  267. os.Setenv("PROXY_MEDIA_TYPES", "image")
  268. var err error
  269. parser := config.NewParser()
  270. config.Opts, err = parser.ParseEnvironmentVariables()
  271. if err != nil {
  272. t.Fatalf(`Parsing failure: %v`, err)
  273. }
  274. r := mux.NewRouter()
  275. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  276. input := `<img src="data:image/gif;base64,test">`
  277. expected := `<img src="data:image/gif;base64,test"/>`
  278. output := ProxyRewriter(r, input)
  279. if expected != output {
  280. t.Errorf(`Not expected output: got %s`, output)
  281. }
  282. }
  283. func TestProxyWithImageSourceDataURL(t *testing.T) {
  284. os.Clearenv()
  285. os.Setenv("PROXY_OPTION", "all")
  286. os.Setenv("PROXY_MEDIA_TYPES", "image")
  287. var err error
  288. parser := config.NewParser()
  289. config.Opts, err = parser.ParseEnvironmentVariables()
  290. if err != nil {
  291. t.Fatalf(`Parsing failure: %v`, err)
  292. }
  293. r := mux.NewRouter()
  294. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  295. input := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  296. expected := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  297. output := ProxyRewriter(r, input)
  298. if expected != output {
  299. t.Errorf(`Not expected output: got %s`, output)
  300. }
  301. }