github.com/xzl8028/xenia-server@v0.0.0-20190809101854-18450a97da63/api4/image_test.go (about)

     1  // Copyright (c) 2017-present Xenia, Inc. All Rights Reserved.
     2  // See License.txt for license information.
     3  
     4  package api4
     5  
     6  import (
     7  	"io/ioutil"
     8  	"net/http"
     9  	"net/http/httptest"
    10  	"net/url"
    11  	"testing"
    12  
    13  	"github.com/stretchr/testify/assert"
    14  	"github.com/stretchr/testify/require"
    15  
    16  	"github.com/xzl8028/xenia-server/model"
    17  )
    18  
    19  func TestGetImage(t *testing.T) {
    20  	th := Setup().InitBasic()
    21  	defer th.TearDown()
    22  
    23  	// Prevent the test client from following a redirect
    24  	th.Client.HttpClient.CheckRedirect = func(*http.Request, []*http.Request) error {
    25  		return http.ErrUseLastResponse
    26  	}
    27  
    28  	t.Run("proxy disabled", func(t *testing.T) {
    29  		imageURL := "http://foo.bar/baz.gif"
    30  
    31  		th.App.UpdateConfig(func(cfg *model.Config) {
    32  			cfg.ImageProxySettings.Enable = model.NewBool(false)
    33  		})
    34  
    35  		r, err := http.NewRequest("GET", th.Client.ApiUrl+"/image?url="+url.QueryEscape(imageURL), nil)
    36  		require.NoError(t, err)
    37  		r.Header.Set(model.HEADER_AUTH, th.Client.AuthType+" "+th.Client.AuthToken)
    38  
    39  		resp, err := th.Client.HttpClient.Do(r)
    40  		require.NoError(t, err)
    41  		assert.Equal(t, http.StatusFound, resp.StatusCode)
    42  		assert.Equal(t, imageURL, resp.Header.Get("Location"))
    43  	})
    44  
    45  	t.Run("atmos/camo", func(t *testing.T) {
    46  		imageURL := "http://foo.bar/baz.gif"
    47  		proxiedURL := "https://proxy.foo.bar/004afe2ef382eb5f30c4490f793f8a8c5b33d8a2/687474703a2f2f666f6f2e6261722f62617a2e676966"
    48  
    49  		th.App.UpdateConfig(func(cfg *model.Config) {
    50  			cfg.ImageProxySettings.Enable = model.NewBool(true)
    51  			cfg.ImageProxySettings.ImageProxyType = model.NewString("atmos/camo")
    52  			cfg.ImageProxySettings.RemoteImageProxyOptions = model.NewString("foo")
    53  			cfg.ImageProxySettings.RemoteImageProxyURL = model.NewString("https://proxy.foo.bar")
    54  		})
    55  
    56  		r, err := http.NewRequest("GET", th.Client.ApiUrl+"/image?url="+url.QueryEscape(imageURL), nil)
    57  		require.NoError(t, err)
    58  		r.Header.Set(model.HEADER_AUTH, th.Client.AuthType+" "+th.Client.AuthToken)
    59  
    60  		resp, err := th.Client.HttpClient.Do(r)
    61  		require.NoError(t, err)
    62  		assert.Equal(t, http.StatusFound, resp.StatusCode)
    63  		assert.Equal(t, proxiedURL, resp.Header.Get("Location"))
    64  	})
    65  
    66  	t.Run("local", func(t *testing.T) {
    67  		th.App.UpdateConfig(func(cfg *model.Config) {
    68  			cfg.ImageProxySettings.Enable = model.NewBool(true)
    69  			cfg.ImageProxySettings.ImageProxyType = model.NewString("local")
    70  
    71  			// Allow requests to the "remote" image
    72  			cfg.ServiceSettings.AllowedUntrustedInternalConnections = model.NewString("127.0.0.1")
    73  		})
    74  
    75  		handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    76  			w.Header().Set("Content-Type", "image/png")
    77  			w.Write([]byte("success"))
    78  		})
    79  
    80  		imageServer := httptest.NewServer(handler)
    81  		defer imageServer.Close()
    82  
    83  		r, err := http.NewRequest("GET", th.Client.ApiUrl+"/image?url="+url.QueryEscape(imageServer.URL+"/image.png"), nil)
    84  		require.NoError(t, err)
    85  		r.Header.Set(model.HEADER_AUTH, th.Client.AuthType+" "+th.Client.AuthToken)
    86  
    87  		resp, err := th.Client.HttpClient.Do(r)
    88  		require.NoError(t, err)
    89  		assert.Equal(t, http.StatusOK, resp.StatusCode)
    90  
    91  		respBody, err := ioutil.ReadAll(resp.Body)
    92  		require.NoError(t, err)
    93  		assert.Equal(t, "success", string(respBody))
    94  	})
    95  }