mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-10-31 08:01:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package hscontrol
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	_ "embed"
 | |
| 	"html/template"
 | |
| 	"net/http"
 | |
| 
 | |
| 	"github.com/rs/zerolog/log"
 | |
| )
 | |
| 
 | |
| //go:embed gen/openapiv2/headscale/v1/headscale.swagger.json
 | |
| var apiV1JSON []byte
 | |
| 
 | |
| func SwaggerUI(
 | |
| 	writer http.ResponseWriter,
 | |
| 	req *http.Request,
 | |
| ) {
 | |
| 	swaggerTemplate := template.Must(template.New("swagger").Parse(`
 | |
| <html>
 | |
| 	<head>
 | |
| 	<link rel="stylesheet" type="text/css" href="https://unpkg.com/swagger-ui-dist@3/swagger-ui.css">
 | |
| 
 | |
| 	<script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-standalone-preset.js"></script>
 | |
| 	<script src="https://unpkg.com/swagger-ui-dist@3/swagger-ui-bundle.js" charset="UTF-8"></script>
 | |
| 	</head>
 | |
| 	<body>
 | |
| 	<div id="swagger-ui"></div>
 | |
| 	<script>
 | |
| 		window.addEventListener('load', (event) => {
 | |
| 			const ui = SwaggerUIBundle({
 | |
| 			    url: "/swagger/v1/openapiv2.json",
 | |
| 			    dom_id: '#swagger-ui',
 | |
| 			    presets: [
 | |
| 			      SwaggerUIBundle.presets.apis,
 | |
| 			      SwaggerUIBundle.SwaggerUIStandalonePreset
 | |
| 			    ],
 | |
| 				plugins: [
 | |
|                 	SwaggerUIBundle.plugins.DownloadUrl
 | |
|             	],
 | |
| 				deepLinking: true,
 | |
| 				// TODO(kradalby): Figure out why this does not work
 | |
| 				// layout: "StandaloneLayout",
 | |
| 			  })
 | |
| 			window.ui = ui
 | |
| 		});
 | |
| 	</script>
 | |
| 	</body>
 | |
| </html>`))
 | |
| 
 | |
| 	var payload bytes.Buffer
 | |
| 	if err := swaggerTemplate.Execute(&payload, struct{}{}); err != nil {
 | |
| 		log.Error().
 | |
| 			Caller().
 | |
| 			Err(err).
 | |
| 			Msg("Could not render Swagger")
 | |
| 
 | |
| 		writer.Header().Set("Content-Type", "text/plain; charset=utf-8")
 | |
| 		writer.WriteHeader(http.StatusInternalServerError)
 | |
| 		_, err := writer.Write([]byte("Could not render Swagger"))
 | |
| 		if err != nil {
 | |
| 			log.Error().
 | |
| 				Caller().
 | |
| 				Err(err).
 | |
| 				Msg("Failed to write response")
 | |
| 		}
 | |
| 
 | |
| 		return
 | |
| 	}
 | |
| 
 | |
| 	writer.Header().Set("Content-Type", "text/html; charset=utf-8")
 | |
| 	writer.WriteHeader(http.StatusOK)
 | |
| 	_, err := writer.Write(payload.Bytes())
 | |
| 	if err != nil {
 | |
| 		log.Error().
 | |
| 			Caller().
 | |
| 			Err(err).
 | |
| 			Msg("Failed to write response")
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func SwaggerAPIv1(
 | |
| 	writer http.ResponseWriter,
 | |
| 	req *http.Request,
 | |
| ) {
 | |
| 	writer.Header().Set("Content-Type", "application/json; charset=utf-8")
 | |
| 	writer.WriteHeader(http.StatusOK)
 | |
| 	if _, err := writer.Write(apiV1JSON); err != nil {
 | |
| 		log.Error().
 | |
| 			Caller().
 | |
| 			Err(err).
 | |
| 			Msg("Failed to write response")
 | |
| 	}
 | |
| }
 |