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  }