func NewReverseProxy(ds *m.DataSource, proxyPath string) *httputil.ReverseProxy { target, _ := url.Parse(ds.Url) director := func(req *http.Request) { req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.Host = target.Host reqQueryVals := req.URL.Query() if ds.Type == m.DS_INFLUXDB_08 { req.URL.Path = util.JoinUrlFragments(target.Path, "db/"+ds.Database+"/"+proxyPath) reqQueryVals.Add("u", ds.User) reqQueryVals.Add("p", ds.Password) req.URL.RawQuery = reqQueryVals.Encode() } else if ds.Type == m.DS_INFLUXDB { req.URL.Path = util.JoinUrlFragments(target.Path, proxyPath) reqQueryVals.Add("db", ds.Database) req.URL.RawQuery = reqQueryVals.Encode() if !ds.BasicAuth { req.Header.Add("Authorization", util.GetBasicAuthHeader(ds.User, ds.Password)) } } else { req.URL.Path = util.JoinUrlFragments(target.Path, proxyPath) } if ds.BasicAuth { req.Header.Add("Authorization", util.GetBasicAuthHeader(ds.BasicAuthUser, ds.BasicAuthPassword)) } } return &httputil.ReverseProxy{Director: director} }
func (fp *FrontendPluginBase) setPathsBasedOnApp(app *AppPlugin) { appSubPath := strings.Replace(fp.PluginDir, app.PluginDir, "", 1) fp.IncludedInAppId = app.Id fp.BaseUrl = app.BaseUrl if isExternalPlugin(app.PluginDir) { fp.Module = util.JoinUrlFragments("plugins/"+app.Id, appSubPath) + "/module" } else { fp.Module = util.JoinUrlFragments("app/plugins/app/"+app.Id, appSubPath) + "/module" } }
func InitApiPluginRoutes(r *macaron.Macaron) { for _, plugin := range plugins.ApiPlugins { log.Info("Plugin: Adding proxy routes for api plugin") for _, route := range plugin.Routes { url := util.JoinUrlFragments("/api/plugin-proxy/", route.Path) handlers := make([]macaron.Handler, 0) if route.ReqSignedIn { handlers = append(handlers, middleware.Auth(&middleware.AuthOptions{ReqSignedIn: true})) } if route.ReqGrafanaAdmin { handlers = append(handlers, middleware.Auth(&middleware.AuthOptions{ReqSignedIn: true, ReqGrafanaAdmin: true})) } if route.ReqSignedIn && route.ReqRole != "" { if route.ReqRole == m.ROLE_ADMIN { handlers = append(handlers, middleware.RoleAuth(m.ROLE_ADMIN)) } else if route.ReqRole == m.ROLE_EDITOR { handlers = append(handlers, middleware.RoleAuth(m.ROLE_EDITOR, m.ROLE_ADMIN)) } } handlers = append(handlers, ApiPlugin(route.Url)) r.Route(url, route.Method, handlers...) log.Info("Plugin: Adding route %s", url) } } }
func GraphiteProxy(c *middleware.Context) { proxyPath := c.Params("*") target, _ := url.Parse(setting.GraphiteUrl) // check if this is a special raintank_db requests if proxyPath == "metrics/find" { query := c.Query("query") if strings.HasPrefix(query, "raintank_db") { response, err := executeRaintankDbQuery(query, c.OrgId) if err != nil { c.JsonApiErr(500, "Failed to execute raintank_db query", err) return } c.JSON(200, response) return } } director := func(req *http.Request) { req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.Header.Add("X-Org-Id", strconv.FormatInt(c.OrgId, 10)) req.URL.Path = util.JoinUrlFragments(target.Path, proxyPath) } proxy := &httputil.ReverseProxy{Director: director} proxy.ServeHTTP(c.RW(), c.Req.Request) }
func NewApiPluginProxy(ctx *middleware.Context, proxyPath string, route *plugins.AppPluginRoute, appId string) *httputil.ReverseProxy { targetUrl, _ := url.Parse(route.Url) director := func(req *http.Request) { req.URL.Scheme = targetUrl.Scheme req.URL.Host = targetUrl.Host req.Host = targetUrl.Host req.URL.Path = util.JoinUrlFragments(targetUrl.Path, proxyPath) // clear cookie headers req.Header.Del("Cookie") req.Header.Del("Set-Cookie") //Create a HTTP header with the context in it. ctxJson, err := json.Marshal(ctx.SignedInUser) if err != nil { ctx.JsonApiErr(500, "failed to marshal context to json.", err) return } req.Header.Add("Grafana-Context", string(ctxJson)) // add custom headers defined in the plugin config. for _, header := range route.Headers { var contentBuf bytes.Buffer t, err := template.New("content").Parse(header.Content) if err != nil { ctx.JsonApiErr(500, fmt.Sprintf("could not parse header content template for header %s.", header.Name), err) return } //lookup appSettings query := m.GetAppSettingByAppIdQuery{OrgId: ctx.OrgId, AppId: appId} if err := bus.Dispatch(&query); err != nil { ctx.JsonApiErr(500, "failed to get AppSettings.", err) return } type templateData struct { JsonData map[string]interface{} SecureJsonData map[string]string } data := templateData{ JsonData: query.Result.JsonData, SecureJsonData: query.Result.SecureJsonData.Decrypt(), } err = t.Execute(&contentBuf, data) if err != nil { ctx.JsonApiErr(500, fmt.Sprintf("failed to execute header content template for header %s.", header.Name), err) return } log.Debug("Adding header to proxy request. %s: %s", header.Name, contentBuf.String()) req.Header.Add(header.Name, contentBuf.String()) } } return &httputil.ReverseProxy{Director: director} }
func NewReverseProxy(ds *m.DataSource, proxyPath string, targetUrl *url.URL) *httputil.ReverseProxy { director := func(req *http.Request) { req.URL.Scheme = targetUrl.Scheme req.URL.Host = targetUrl.Host req.Host = targetUrl.Host reqQueryVals := req.URL.Query() if ds.Type == m.DS_INFLUXDB_08 { req.URL.Path = util.JoinUrlFragments(targetUrl.Path, "db/"+ds.Database+"/"+proxyPath) reqQueryVals.Add("u", ds.User) reqQueryVals.Add("p", ds.Password) req.URL.RawQuery = reqQueryVals.Encode() } else if ds.Type == m.DS_INFLUXDB { req.URL.Path = util.JoinUrlFragments(targetUrl.Path, proxyPath) req.URL.RawQuery = reqQueryVals.Encode() if !ds.BasicAuth { req.Header.Del("Authorization") req.Header.Add("Authorization", util.GetBasicAuthHeader(ds.User, ds.Password)) } } else { req.URL.Path = util.JoinUrlFragments(targetUrl.Path, proxyPath) } if ds.BasicAuth { req.Header.Del("Authorization") req.Header.Add("Authorization", util.GetBasicAuthHeader(ds.BasicAuthUser, ds.BasicAuthPassword)) } dsAuth := req.Header.Get("X-DS-Authorization") if len(dsAuth) > 0 { req.Header.Del("X-DS-Authorization") req.Header.Del("Authorization") req.Header.Add("Authorization", dsAuth) } time.Sleep(time.Second * 5) // clear cookie headers req.Header.Del("Cookie") req.Header.Del("Set-Cookie") } return &httputil.ReverseProxy{Director: director, FlushInterval: time.Millisecond * 200} }
/** * @function: func NewReverseProxy(ds *m.DataSource, proxyPath string) *httputil.ReverseProxy * @description: This function initializes a reverse proxy. * @related issues: OWL-028, OWL-017, OWL-002 * @param: *m.DataSource ds * @param: string proxyPath * @return: *httputil.ReverseProxy * @author: Don Hsieh * @since: 07/17/2015 * @last modified: 08/04/2015 * @called by: func ProxyDataSourceRequest(c *middleware.Context) * in pkg/api/dataproxy.go */ func NewReverseProxy(ds *m.DataSource, proxyPath string) *httputil.ReverseProxy { target, _ := url.Parse(ds.Url) director := func(req *http.Request) { req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.Host = target.Host reqQueryVals := req.URL.Query() if ds.Type == m.DS_INFLUXDB_08 { req.URL.Path = util.JoinUrlFragments(target.Path, "db/"+ds.Database+"/"+proxyPath) reqQueryVals.Add("u", ds.User) reqQueryVals.Add("p", ds.Password) req.URL.RawQuery = reqQueryVals.Encode() } else if ds.Type == m.DS_INFLUXDB { req.URL.Path = util.JoinUrlFragments(target.Path, proxyPath) reqQueryVals.Add("db", ds.Database) reqQueryVals.Add("u", ds.User) reqQueryVals.Add("p", ds.Password) req.URL.RawQuery = reqQueryVals.Encode() } else if ds.Type == "openfalcon" { // fmt.Printf("Welcome to %v!\n", ds.Type) // fmt.Printf("NewReverseProxy req.URL = %v\n", req.URL) reqQueryVals.Add("target", ds.Url) req.URL.RawQuery = reqQueryVals.Encode() ds.Url = "http://localhost" var port = "4001" ds.Url += ":" + port // fmt.Printf("NewReverseProxy ds.Url = %v\n", ds.Url) proxyPath = "/" target, _ := url.Parse(ds.Url) req.URL.Scheme = target.Scheme req.URL.Host = target.Host req.Host = target.Host req.URL.Path = util.JoinUrlFragments(target.Path, proxyPath) } else { req.URL.Path = util.JoinUrlFragments(target.Path, proxyPath) } if ds.BasicAuth { req.Header.Add("Authorization", util.GetBasicAuthHeader(ds.BasicAuthUser, ds.BasicAuthPassword)) } } return &httputil.ReverseProxy{Director: director} }
func ReverseProxyGnetReq(proxyPath string) *httputil.ReverseProxy { director := func(req *http.Request) { req.URL.Scheme = "https" req.URL.Host = "grafana.net" req.Host = "grafana.net" req.URL.Path = util.JoinUrlFragments("https://grafana.net/api", proxyPath) // clear cookie headers req.Header.Del("Cookie") req.Header.Del("Set-Cookie") } return &httputil.ReverseProxy{Director: director} }
func NewApiPluginProxy(ctx string, proxyPath string, targetUrl *url.URL) *httputil.ReverseProxy { director := func(req *http.Request) { req.URL.Scheme = targetUrl.Scheme req.URL.Host = targetUrl.Host req.Host = targetUrl.Host req.URL.Path = util.JoinUrlFragments(targetUrl.Path, proxyPath) // clear cookie headers req.Header.Del("Cookie") req.Header.Del("Set-Cookie") req.Header.Add("Grafana-Context", ctx) } return &httputil.ReverseProxy{Director: director} }
func ReverseProxyGnetReq(proxyPath string) *httputil.ReverseProxy { url, _ := url.Parse(setting.GrafanaNetUrl) director := func(req *http.Request) { req.URL.Scheme = url.Scheme req.URL.Host = url.Host req.Host = url.Host req.URL.Path = util.JoinUrlFragments(url.Path+"/api", proxyPath) // clear cookie headers req.Header.Del("Cookie") req.Header.Del("Set-Cookie") } return &httputil.ReverseProxy{Director: director} }
func NewApiPluginProxy(ctx *middleware.Context, proxyPath string, route *plugins.AppPluginRoute, appId string) *httputil.ReverseProxy { targetUrl, _ := url.Parse(route.Url) director := func(req *http.Request) { req.URL.Scheme = targetUrl.Scheme req.URL.Host = targetUrl.Host req.Host = targetUrl.Host req.URL.Path = util.JoinUrlFragments(targetUrl.Path, proxyPath) // clear cookie headers req.Header.Del("Cookie") req.Header.Del("Set-Cookie") //Create a HTTP header with the context in it. ctxJson, err := json.Marshal(ctx.SignedInUser) if err != nil { ctx.JsonApiErr(500, "failed to marshal context to json.", err) return } req.Header.Add("X-Grafana-Context", string(ctxJson)) if len(route.Headers) > 0 { headers, err := getHeaders(route, ctx.OrgId, appId) if err != nil { ctx.JsonApiErr(500, "Could not generate plugin route header", err) return } for key, value := range headers { log.Info("setting key %v value %v", key, value[0]) req.Header.Set(key, value[0]) } } } return &httputil.ReverseProxy{Director: director} }