media_proxy_test.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. // Copyright 2020 Frédéric Guillot. All rights reserved.
  2. // Use of this source code is governed by the Apache 2.0
  3. // license that can be found in the LICENSE file.
  4. package proxy // import "miniflux.app/proxy"
  5. import (
  6. "net/http"
  7. "os"
  8. "testing"
  9. "github.com/gorilla/mux"
  10. "miniflux.app/config"
  11. )
  12. func TestProxyFilterWithHttpDefault(t *testing.T) {
  13. os.Clearenv()
  14. os.Setenv("PROXY_OPTION", "http-only")
  15. os.Setenv("PROXY_MEDIA_TYPES", "image")
  16. os.Setenv("PROXY_PRIVATE_KEY", "test")
  17. var err error
  18. parser := config.NewParser()
  19. config.Opts, err = parser.ParseEnvironmentVariables()
  20. if err != nil {
  21. t.Fatalf(`Parsing failure: %v`, err)
  22. }
  23. r := mux.NewRouter()
  24. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  25. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  26. output := ProxyRewriter(r, input)
  27. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  28. if expected != output {
  29. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  30. }
  31. }
  32. func TestProxyFilterWithHttpsDefault(t *testing.T) {
  33. os.Clearenv()
  34. os.Setenv("PROXY_OPTION", "http-only")
  35. os.Setenv("PROXY_MEDIA_TYPES", "image")
  36. var err error
  37. parser := config.NewParser()
  38. config.Opts, err = parser.ParseEnvironmentVariables()
  39. if err != nil {
  40. t.Fatalf(`Parsing failure: %v`, err)
  41. }
  42. r := mux.NewRouter()
  43. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  44. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  45. output := ProxyRewriter(r, input)
  46. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  47. if expected != output {
  48. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  49. }
  50. }
  51. func TestProxyFilterWithHttpNever(t *testing.T) {
  52. os.Clearenv()
  53. os.Setenv("PROXY_OPTION", "none")
  54. var err error
  55. parser := config.NewParser()
  56. config.Opts, err = parser.ParseEnvironmentVariables()
  57. if err != nil {
  58. t.Fatalf(`Parsing failure: %v`, err)
  59. }
  60. r := mux.NewRouter()
  61. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  62. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  63. output := ProxyRewriter(r, input)
  64. expected := input
  65. if expected != output {
  66. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  67. }
  68. }
  69. func TestProxyFilterWithHttpsNever(t *testing.T) {
  70. os.Clearenv()
  71. os.Setenv("PROXY_OPTION", "none")
  72. var err error
  73. parser := config.NewParser()
  74. config.Opts, err = parser.ParseEnvironmentVariables()
  75. if err != nil {
  76. t.Fatalf(`Parsing failure: %v`, err)
  77. }
  78. r := mux.NewRouter()
  79. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  80. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  81. output := ProxyRewriter(r, input)
  82. expected := input
  83. if expected != output {
  84. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  85. }
  86. }
  87. func TestProxyFilterWithHttpAlways(t *testing.T) {
  88. os.Clearenv()
  89. os.Setenv("PROXY_OPTION", "all")
  90. os.Setenv("PROXY_MEDIA_TYPES", "image")
  91. os.Setenv("PROXY_PRIVATE_KEY", "test")
  92. var err error
  93. parser := config.NewParser()
  94. config.Opts, err = parser.ParseEnvironmentVariables()
  95. if err != nil {
  96. t.Fatalf(`Parsing failure: %v`, err)
  97. }
  98. r := mux.NewRouter()
  99. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  100. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  101. output := ProxyRewriter(r, input)
  102. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  103. if expected != output {
  104. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  105. }
  106. }
  107. func TestProxyFilterWithHttpsAlways(t *testing.T) {
  108. os.Clearenv()
  109. os.Setenv("PROXY_OPTION", "all")
  110. os.Setenv("PROXY_MEDIA_TYPES", "image")
  111. os.Setenv("PROXY_PRIVATE_KEY", "test")
  112. var err error
  113. parser := config.NewParser()
  114. config.Opts, err = parser.ParseEnvironmentVariables()
  115. if err != nil {
  116. t.Fatalf(`Parsing failure: %v`, err)
  117. }
  118. r := mux.NewRouter()
  119. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  120. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  121. output := ProxyRewriter(r, input)
  122. expected := `<p><img src="/proxy/LdPNR1GBDigeeNp2ArUQRyZsVqT_PWLfHGjYFrrWWIY=/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  123. if expected != output {
  124. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  125. }
  126. }
  127. func TestProxyFilterWithHttpsAlwaysAndCustomProxyServer(t *testing.T) {
  128. os.Clearenv()
  129. os.Setenv("PROXY_OPTION", "all")
  130. os.Setenv("PROXY_MEDIA_TYPES", "image")
  131. os.Setenv("PROXY_URL", "https://proxy-example/proxy")
  132. var err error
  133. parser := config.NewParser()
  134. config.Opts, err = parser.ParseEnvironmentVariables()
  135. if err != nil {
  136. t.Fatalf(`Parsing failure: %v`, err)
  137. }
  138. r := mux.NewRouter()
  139. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  140. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  141. output := ProxyRewriter(r, input)
  142. expected := `<p><img src="https://proxy-example/proxy/aHR0cHM6Ly93ZWJzaXRlL2ZvbGRlci9pbWFnZS5wbmc=" alt="Test"/></p>`
  143. if expected != output {
  144. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  145. }
  146. }
  147. func TestProxyFilterWithHttpInvalid(t *testing.T) {
  148. os.Clearenv()
  149. os.Setenv("PROXY_OPTION", "invalid")
  150. os.Setenv("PROXY_PRIVATE_KEY", "test")
  151. var err error
  152. parser := config.NewParser()
  153. config.Opts, err = parser.ParseEnvironmentVariables()
  154. if err != nil {
  155. t.Fatalf(`Parsing failure: %v`, err)
  156. }
  157. r := mux.NewRouter()
  158. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  159. input := `<p><img src="http://website/folder/image.png" alt="Test"/></p>`
  160. output := ProxyRewriter(r, input)
  161. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" alt="Test"/></p>`
  162. if expected != output {
  163. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  164. }
  165. }
  166. func TestProxyFilterWithHttpsInvalid(t *testing.T) {
  167. os.Clearenv()
  168. os.Setenv("PROXY_OPTION", "invalid")
  169. os.Setenv("PROXY_PRIVATE_KEY", "test")
  170. var err error
  171. parser := config.NewParser()
  172. config.Opts, err = parser.ParseEnvironmentVariables()
  173. if err != nil {
  174. t.Fatalf(`Parsing failure: %v`, err)
  175. }
  176. r := mux.NewRouter()
  177. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  178. input := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  179. output := ProxyRewriter(r, input)
  180. expected := `<p><img src="https://website/folder/image.png" alt="Test"/></p>`
  181. if expected != output {
  182. t.Errorf(`Not expected output: got "%s" instead of "%s"`, output, expected)
  183. }
  184. }
  185. func TestProxyFilterWithSrcset(t *testing.T) {
  186. os.Clearenv()
  187. os.Setenv("PROXY_OPTION", "all")
  188. os.Setenv("PROXY_MEDIA_TYPES", "image")
  189. os.Setenv("PROXY_PRIVATE_KEY", "test")
  190. var err error
  191. parser := config.NewParser()
  192. config.Opts, err = parser.ParseEnvironmentVariables()
  193. if err != nil {
  194. t.Fatalf(`Parsing failure: %v`, err)
  195. }
  196. r := mux.NewRouter()
  197. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  198. 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>`
  199. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w" alt="test"/></p>`
  200. output := ProxyRewriter(r, input)
  201. if expected != output {
  202. t.Errorf(`Not expected output: got %s`, output)
  203. }
  204. }
  205. func TestProxyFilterWithEmptySrcset(t *testing.T) {
  206. os.Clearenv()
  207. os.Setenv("PROXY_OPTION", "all")
  208. os.Setenv("PROXY_MEDIA_TYPES", "image")
  209. os.Setenv("PROXY_PRIVATE_KEY", "test")
  210. var err error
  211. parser := config.NewParser()
  212. config.Opts, err = parser.ParseEnvironmentVariables()
  213. if err != nil {
  214. t.Fatalf(`Parsing failure: %v`, err)
  215. }
  216. r := mux.NewRouter()
  217. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  218. input := `<p><img src="http://website/folder/image.png" srcset="" alt="test"></p>`
  219. expected := `<p><img src="/proxy/okK5PsdNY8F082UMQEAbLPeUFfbe2WnNfInNmR9T4WA=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlLnBuZw==" srcset="" alt="test"/></p>`
  220. output := ProxyRewriter(r, input)
  221. if expected != output {
  222. t.Errorf(`Not expected output: got %s`, output)
  223. }
  224. }
  225. func TestProxyFilterWithPictureSource(t *testing.T) {
  226. os.Clearenv()
  227. os.Setenv("PROXY_OPTION", "all")
  228. os.Setenv("PROXY_MEDIA_TYPES", "image")
  229. os.Setenv("PROXY_PRIVATE_KEY", "test")
  230. var err error
  231. parser := config.NewParser()
  232. config.Opts, err = parser.ParseEnvironmentVariables()
  233. if err != nil {
  234. t.Fatalf(`Parsing failure: %v`, err)
  235. }
  236. r := mux.NewRouter()
  237. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  238. input := `<picture><source srcset="http://website/folder/image2.png 656w, http://website/folder/image3.png 360w, https://website/some,image.png 2x"></picture>`
  239. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, /proxy/QgAmrJWiAud_nNAsz3F8OTxaIofwAiO36EDzH_YfMzo=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMy5wbmc= 360w, /proxy/ZIw0hv8WhSTls5aSqhnFaCXlUrKIqTnBRaY0-NaLnds=/aHR0cHM6Ly93ZWJzaXRlL3NvbWUsaW1hZ2UucG5n 2x"/></picture>`
  240. output := ProxyRewriter(r, input)
  241. if expected != output {
  242. t.Errorf(`Not expected output: got %s`, output)
  243. }
  244. }
  245. func TestProxyFilterOnlyNonHTTPWithPictureSource(t *testing.T) {
  246. os.Clearenv()
  247. os.Setenv("PROXY_OPTION", "https")
  248. os.Setenv("PROXY_MEDIA_TYPES", "image")
  249. os.Setenv("PROXY_PRIVATE_KEY", "test")
  250. var err error
  251. parser := config.NewParser()
  252. config.Opts, err = parser.ParseEnvironmentVariables()
  253. if err != nil {
  254. t.Fatalf(`Parsing failure: %v`, err)
  255. }
  256. r := mux.NewRouter()
  257. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  258. input := `<picture><source srcset="http://website/folder/image2.png 656w, https://website/some,image.png 2x"></picture>`
  259. expected := `<picture><source srcset="/proxy/aY5Hb4urDnUCly2vTJ7ExQeeaVS-52O7kjUr2v9VrAs=/aHR0cDovL3dlYnNpdGUvZm9sZGVyL2ltYWdlMi5wbmc= 656w, https://website/some,image.png 2x"/></picture>`
  260. output := ProxyRewriter(r, input)
  261. if expected != output {
  262. t.Errorf(`Not expected output: got %s`, output)
  263. }
  264. }
  265. func TestProxyWithImageDataURL(t *testing.T) {
  266. os.Clearenv()
  267. os.Setenv("PROXY_OPTION", "all")
  268. os.Setenv("PROXY_MEDIA_TYPES", "image")
  269. var err error
  270. parser := config.NewParser()
  271. config.Opts, err = parser.ParseEnvironmentVariables()
  272. if err != nil {
  273. t.Fatalf(`Parsing failure: %v`, err)
  274. }
  275. r := mux.NewRouter()
  276. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  277. input := `<img src="data:image/gif;base64,test">`
  278. expected := `<img src="data:image/gif;base64,test"/>`
  279. output := ProxyRewriter(r, input)
  280. if expected != output {
  281. t.Errorf(`Not expected output: got %s`, output)
  282. }
  283. }
  284. func TestProxyWithImageSourceDataURL(t *testing.T) {
  285. os.Clearenv()
  286. os.Setenv("PROXY_OPTION", "all")
  287. os.Setenv("PROXY_MEDIA_TYPES", "image")
  288. var err error
  289. parser := config.NewParser()
  290. config.Opts, err = parser.ParseEnvironmentVariables()
  291. if err != nil {
  292. t.Fatalf(`Parsing failure: %v`, err)
  293. }
  294. r := mux.NewRouter()
  295. r.HandleFunc("/proxy/{encodedDigest}/{encodedURL}", func(w http.ResponseWriter, r *http.Request) {}).Name("proxy")
  296. input := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  297. expected := `<picture><source srcset="data:image/gif;base64,test"/></picture>`
  298. output := ProxyRewriter(r, input)
  299. if expected != output {
  300. t.Errorf(`Not expected output: got %s`, output)
  301. }
  302. }