mirror of
				https://github.com/juanfont/headscale.git
				synced 2025-11-04 06:52:39 +09:00 
			
		
		
		
	
		
			
				
	
	
		
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package headscale
 | 
						|
 | 
						|
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")
 | 
						|
	}
 | 
						|
}
 |