prow/cmd/deck/main.go
func handleArtifactView(o options, sg *spyglass.Spyglass, cfg config.Getter) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		setHeadersNoCaching(w)
		pathSegments := strings.Split(r.URL.Path, "/")
		if len(pathSegments) != 2 {
			http.NotFound(w, r)
			return
		}
		lensName := pathSegments[0]
		resource := pathSegments[1]

		lens, err := lenses.GetLens(lensName)
		if err != nil {
			http.Error(w, fmt.Sprintf("No such template: %s (%v)", lensName, err), http.StatusNotFound)
			return
		}

		lensConfig := lens.Config()
		lensResourcesDir := lenses.ResourceDirForLens(o.spyglassFilesLocation, lensConfig.Name)

		reqString := r.URL.Query().Get("req")
		var request spyglass.LensRequest
		err = json.Unmarshal([]byte(reqString), &request)
		if err != nil {
			http.Error(w, fmt.Sprintf("Failed to parse request: %v", err), http.StatusBadRequest)
			return
		}

		artifacts, err := sg.FetchArtifacts(request.Source, "", cfg().Deck.Spyglass.SizeLimit, request.Artifacts)
		if err != nil {
			http.Error(w, fmt.Sprintf("Failed to retrieve expected artifacts: %v", err), http.StatusInternalServerError)
			return
		}

		switch resource {
		case "iframe":
			t, err := template.ParseFiles(path.Join(o.templateFilesLocation, "spyglass-lens.html"))
			if err != nil {
				http.Error(w, fmt.Sprintf("Failed to load template: %v", err), http.StatusInternalServerError)
				return
			}

			w.Header().Set("Content-Type", "text/html; encoding=utf-8")
			t.Execute(w, struct {
				Title   string
				BaseURL string
				Head    template.HTML
				Body    template.HTML
			}{
				lensConfig.Title,
				"/spyglass/static/" + lensName + "/",
				template.HTML(lens.Header(artifacts, lensResourcesDir)),
				template.HTML(lens.Body(artifacts, lensResourcesDir, "")),
			})
		case "rerender":
			data, err := ioutil.ReadAll(r.Body)
			if err != nil {
				http.Error(w, fmt.Sprintf("Failed to read body: %v", err), http.StatusInternalServerError)
				return
			}
			w.Header().Set("Content-Type", "text/html; encoding=utf-8")
			w.Write([]byte(lens.Body(artifacts, lensResourcesDir, string(data))))
		case "callback":
			data, err := ioutil.ReadAll(r.Body)
			if err != nil {
				http.Error(w, fmt.Sprintf("Failed to read body: %v", err), http.StatusInternalServerError)
				return
			}
			w.Write([]byte(lens.Callback(artifacts, lensResourcesDir, string(data))))
		default:
			http.NotFound(w, r)
		}
	}
}
func handleArtifactView(o options, sg *spyglass.Spyglass, cfg config.Getter) http.HandlerFunc {
	return func(w http.ResponseWriter, r *http.Request) {
		setHeadersNoCaching(w)
		pathSegments := strings.Split(r.URL.Path, "/")
		if len(pathSegments) != 2 {
			http.NotFound(w, r)
			return
		}
		lensName := pathSegments[0]
		resource := pathSegments[1]

		lens, err := lenses.GetLens(lensName)
		if err != nil {
			http.Error(w, fmt.Sprintf("No such template: %s (%v)", lensName, err), http.StatusNotFound)
			return
		}

		lensConfig := lens.Config()
		lensResourcesDir := lenses.ResourceDirForLens(o.spyglassFilesLocation, lensConfig.Name)

		reqString := r.URL.Query().Get("req")
		var request spyglass.LensRequest
		err = json.Unmarshal([]byte(reqString), &request)
		if err != nil {
			http.Error(w, fmt.Sprintf("Failed to parse request: %v", err), http.StatusBadRequest)
			return
		}

		artifacts, err := sg.FetchArtifacts(request.Source, "", cfg().Deck.Spyglass.SizeLimit, request.Artifacts)
		if err != nil {
			http.Error(w, fmt.Sprintf("Failed to retrieve expected artifacts: %v", err), http.StatusInternalServerError)
			return
		}

		switch resource {
		case "iframe":
			t, err := template.ParseFiles(path.Join(o.templateFilesLocation, "spyglass-lens.html"))
			if err != nil {
				http.Error(w, fmt.Sprintf("Failed to load template: %v", err), http.StatusInternalServerError)
				return
			}

			w.Header().Set("Content-Type", "text/html; encoding=utf-8")
			t.Execute(w, struct {
				Title   string
				BaseURL string
				Head    template.HTML
				Body    template.HTML
			}{
				lensConfig.Title,
				"/spyglass/static/" + lensName + "/",
				template.HTML(lens.Header(artifacts, lensResourcesDir)),
				template.HTML(lens.Body(artifacts, lensResourcesDir, "")),
			})
		case "rerender":
			data, err := ioutil.ReadAll(r.Body)
			if err != nil {
				http.Error(w, fmt.Sprintf("Failed to read body: %v", err), http.StatusInternalServerError)
				return
			}
			w.Header().Set("Content-Type", "text/html; encoding=utf-8")
			w.Write([]byte(lens.Body(artifacts, lensResourcesDir, string(data))))
		case "callback":
			data, err := ioutil.ReadAll(r.Body)
			if err != nil {
				http.Error(w, fmt.Sprintf("Failed to read body: %v", err), http.StatusInternalServerError)
				return
			}
			w.Write([]byte(lens.Callback(artifacts, lensResourcesDir, string(data))))
		default:
			http.NotFound(w, r)
		}
	}
}
func handleArtifactView ( o options , sg * spyglass . Spyglass , cfg config . Getter ) http . HandlerFunc { return func ( w http . ResponseWriter , r * http . Request ) { setHeadersNoCaching ( w ) pathSegments := strings . Split ( r . URL . Path , " " ) if len ( pathSegments ) != 2 { http . NotFound ( w , r ) return } lensName := pathSegments [ 0 ] resource := pathSegments [ 1 ] lens , err := lenses . GetLens ( lensName ) if err != nil { http . Error ( w , fmt . Sprintf ( " " , lensName , err ) , http . StatusNotFound ) return } lensConfig := lens . Config ( ) lensResourcesDir := lenses . ResourceDirForLens ( o . spyglassFilesLocation , lensConfig . Name ) reqString := r . URL . Query ( ) . Get ( " " ) var request spyglass . LensRequest err = json . Unmarshal ( [ ] byte ( reqString ) , & request ) if err != nil { http . Error ( w , fmt . Sprintf ( " " , err ) , http . StatusBadRequest ) return } artifacts , err := sg . FetchArtifacts ( request . Source , " " , cfg ( ) . Deck . Spyglass . SizeLimit , request . Artifacts ) if err != nil { http . Error ( w , fmt . Sprintf ( " " , err ) , http . StatusInternalServerError ) return } switch resource { case " " : t , err := template . ParseFiles ( path . Join ( o . templateFilesLocation , " " ) ) if err != nil { http . Error ( w , fmt . Sprintf ( " " , err ) , http . StatusInternalServerError ) return } w . Header ( ) . Set ( " " , " " ) t . Execute ( w , struct { Title string BaseURL string Head template . HTML Body template . HTML } { lensConfig . Title , " " + lensName + " " , template . HTML ( lens . Header ( artifacts , lensResourcesDir ) ) , template . HTML ( lens . Body ( artifacts , lensResourcesDir , " " ) ) , } ) case " " : data , err := ioutil . ReadAll ( r . Body ) if err != nil { http . Error ( w , fmt . Sprintf ( " " , err ) , http . StatusInternalServerError ) return } w . Header ( ) . Set ( " " , " " ) w . Write ( [ ] byte ( lens . Body ( artifacts , lensResourcesDir , string ( data ) ) ) ) case " " : data , err := ioutil . ReadAll ( r . Body ) if err != nil { http . Error ( w , fmt . Sprintf ( " " , err ) , http . StatusInternalServerError ) return } w . Write ( [ ] byte ( lens . Callback ( artifacts , lensResourcesDir , string ( data ) ) ) ) default : http . NotFound ( w , r ) } } }
// handleArtifactView handles requests to load a single view for a job. This is what viewers
// will use to call back to themselves.
// Query params:
// - name: required, specifies the name of the viewer to load
// - src: required, specifies the job source from which to fetch artifacts
handleArtifactView handles requests to load a single view for a job . This is what viewers will use to call back to themselves . Query params : - name : required specifies the name of the viewer to load - src : required specifies the job source from which to fetch artifacts