github.com/cloud-foundations/dominator@v0.0.0-20221004181915-6e4fee580046/imageserver/httpd/listPackages.go (about) 1 package httpd 2 3 import ( 4 "bufio" 5 "fmt" 6 "net/http" 7 8 "github.com/Cloud-Foundations/Dominator/lib/format" 9 "github.com/Cloud-Foundations/Dominator/lib/html" 10 "github.com/Cloud-Foundations/Dominator/lib/json" 11 "github.com/Cloud-Foundations/Dominator/lib/url" 12 ) 13 14 func (s state) listPackagesHandler(w http.ResponseWriter, req *http.Request) { 15 parsedQuery := url.ParseQuery(req.URL) 16 if len(parsedQuery.Flags) != 1 { 17 w.Header().Set("Content-Type", "text/plain; charset=utf-8") 18 w.WriteHeader(http.StatusBadRequest) 19 return 20 } 21 var imageName string 22 for name := range parsedQuery.Flags { 23 imageName = name 24 } 25 image := s.imageDataBase.GetImage(imageName) 26 if image == nil { 27 w.Header().Set("Content-Type", "text/plain; charset=utf-8") 28 w.WriteHeader(http.StatusNotFound) 29 return 30 } 31 writer := bufio.NewWriter(w) 32 defer writer.Flush() 33 switch parsedQuery.OutputType() { 34 case url.OutputTypeText: 35 for _, pkg := range image.Packages { 36 fmt.Fprintln(writer, pkg.Name, pkg.Version, pkg.Size) 37 } 38 return 39 case url.OutputTypeJson: 40 err := json.WriteWithIndent(writer, " ", image.Packages) 41 if err != nil { 42 fmt.Fprintln(writer, err) 43 } 44 return 45 case url.OutputTypeHtml: 46 break 47 default: 48 w.Header().Set("Content-Type", "text/plain; charset=utf-8") 49 w.WriteHeader(http.StatusBadRequest) 50 return 51 } 52 fmt.Fprintf(writer, "<title>image %s packages</title>\n", imageName) 53 fmt.Fprintln(writer, `<style> 54 table, th, td { 55 border-collapse: collapse; 56 } 57 </style>`) 58 fmt.Fprintln(writer, "<body>") 59 fmt.Fprintln(writer, "<h3>") 60 fmt.Fprintf(writer, "Packages in image: %s", imageName) 61 fmt.Fprintf(writer, " <a href=\"listPackages?%s&output=text\">text</a>", 62 imageName) 63 fmt.Fprintf(writer, " <a href=\"listPackages?%s&output=json\">json</a>", 64 imageName) 65 fmt.Fprintln(writer, "</h3>") 66 fmt.Fprintln(writer, `<table border="1" style="width:100%">`) 67 tw, _ := html.NewTableWriter(writer, true, "Name", "Version", "Size") 68 for _, pkg := range image.Packages { 69 tw.WriteRow("", "", 70 pkg.Name, 71 pkg.Version, 72 format.FormatBytes(pkg.Size), 73 ) 74 } 75 fmt.Fprintln(writer, "</table>") 76 fmt.Fprintln(writer, "</body>") 77 }