issue-155: add swagger-ui handler
Signed-off-by: Vasiliy Tolstov <v.tolstov@unistack.org>
This commit is contained in:
		
							
								
								
									
										
											BIN
										
									
								
								handler/swagger-ui/favicon-16x16.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								handler/swagger-ui/favicon-16x16.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 665 B | 
							
								
								
									
										
											BIN
										
									
								
								handler/swagger-ui/favicon-32x32.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								handler/swagger-ui/favicon-32x32.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 628 B | 
							
								
								
									
										16
									
								
								handler/swagger-ui/index.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								handler/swagger-ui/index.css
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,16 @@ | ||||
| html { | ||||
|     box-sizing: border-box; | ||||
|     overflow: -moz-scrollbars-vertical; | ||||
|     overflow-y: scroll; | ||||
| } | ||||
|  | ||||
| *, | ||||
| *:before, | ||||
| *:after { | ||||
|     box-sizing: inherit; | ||||
| } | ||||
|  | ||||
| body { | ||||
|     margin: 0; | ||||
|     background: #fafafa; | ||||
| } | ||||
							
								
								
									
										19
									
								
								handler/swagger-ui/index.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								handler/swagger-ui/index.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| <!-- HTML for static distribution bundle build --> | ||||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
|   <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <title>Swagger UI</title> | ||||
|     <link rel="stylesheet" type="text/css" href="./swagger-ui.css" /> | ||||
|     <link rel="stylesheet" type="text/css" href="index.css" /> | ||||
|     <link rel="icon" type="image/png" href="./favicon-32x32.png" sizes="32x32" /> | ||||
|     <link rel="icon" type="image/png" href="./favicon-16x16.png" sizes="16x16" /> | ||||
|   </head> | ||||
|  | ||||
|   <body> | ||||
|     <div id="swagger-ui"></div> | ||||
|     <script src="./swagger-ui-bundle.js" charset="UTF-8"> </script> | ||||
|     <script src="./swagger-ui-standalone-preset.js" charset="UTF-8"> </script> | ||||
|     <script src="./swagger-initializer.js" charset="UTF-8"> </script> | ||||
|   </body> | ||||
| </html> | ||||
							
								
								
									
										79
									
								
								handler/swagger-ui/oauth2-redirect.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										79
									
								
								handler/swagger-ui/oauth2-redirect.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,79 @@ | ||||
| <!doctype html> | ||||
| <html lang="en-US"> | ||||
| <head> | ||||
|     <title>Swagger UI: OAuth2 Redirect</title> | ||||
| </head> | ||||
| <body> | ||||
| <script> | ||||
|     'use strict'; | ||||
|     function run () { | ||||
|         var oauth2 = window.opener.swaggerUIRedirectOauth2; | ||||
|         var sentState = oauth2.state; | ||||
|         var redirectUrl = oauth2.redirectUrl; | ||||
|         var isValid, qp, arr; | ||||
|  | ||||
|         if (/code|token|error/.test(window.location.hash)) { | ||||
|             qp = window.location.hash.substring(1).replace('?', '&'); | ||||
|         } else { | ||||
|             qp = location.search.substring(1); | ||||
|         } | ||||
|  | ||||
|         arr = qp.split("&"); | ||||
|         arr.forEach(function (v,i,_arr) { _arr[i] = '"' + v.replace('=', '":"') + '"';}); | ||||
|         qp = qp ? JSON.parse('{' + arr.join() + '}', | ||||
|                 function (key, value) { | ||||
|                     return key === "" ? value : decodeURIComponent(value); | ||||
|                 } | ||||
|         ) : {}; | ||||
|  | ||||
|         isValid = qp.state === sentState; | ||||
|  | ||||
|         if (( | ||||
|           oauth2.auth.schema.get("flow") === "accessCode" || | ||||
|           oauth2.auth.schema.get("flow") === "authorizationCode" || | ||||
|           oauth2.auth.schema.get("flow") === "authorization_code" | ||||
|         ) && !oauth2.auth.code) { | ||||
|             if (!isValid) { | ||||
|                 oauth2.errCb({ | ||||
|                     authId: oauth2.auth.name, | ||||
|                     source: "auth", | ||||
|                     level: "warning", | ||||
|                     message: "Authorization may be unsafe, passed state was changed in server. The passed state wasn't returned from auth server." | ||||
|                 }); | ||||
|             } | ||||
|  | ||||
|             if (qp.code) { | ||||
|                 delete oauth2.state; | ||||
|                 oauth2.auth.code = qp.code; | ||||
|                 oauth2.callback({auth: oauth2.auth, redirectUrl: redirectUrl}); | ||||
|             } else { | ||||
|                 let oauthErrorMsg; | ||||
|                 if (qp.error) { | ||||
|                     oauthErrorMsg = "["+qp.error+"]: " + | ||||
|                         (qp.error_description ? qp.error_description+ ". " : "no accessCode received from the server. ") + | ||||
|                         (qp.error_uri ? "More info: "+qp.error_uri : ""); | ||||
|                 } | ||||
|  | ||||
|                 oauth2.errCb({ | ||||
|                     authId: oauth2.auth.name, | ||||
|                     source: "auth", | ||||
|                     level: "error", | ||||
|                     message: oauthErrorMsg || "[Authorization failed]: no accessCode received from the server." | ||||
|                 }); | ||||
|             } | ||||
|         } else { | ||||
|             oauth2.callback({auth: oauth2.auth, token: qp, isValid: isValid, redirectUrl: redirectUrl}); | ||||
|         } | ||||
|         window.close(); | ||||
|     } | ||||
|  | ||||
|     if (document.readyState !== 'loading') { | ||||
|         run(); | ||||
|     } else { | ||||
|         document.addEventListener('DOMContentLoaded', function () { | ||||
|             run(); | ||||
|         }); | ||||
|     } | ||||
| </script> | ||||
| </body> | ||||
| </html> | ||||
							
								
								
									
										20
									
								
								handler/swagger-ui/swagger-initializer.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								handler/swagger-ui/swagger-initializer.js
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,20 @@ | ||||
| window.onload = function() { | ||||
|   //<editor-fold desc="Changeable Configuration Block"> | ||||
|  | ||||
|   // the following lines will be replaced by docker/configurator, when it runs in a docker-container | ||||
|   window.ui = SwaggerUIBundle({ | ||||
|     url: "{{ .SWAGGER }}", | ||||
|     dom_id: '#swagger-ui', | ||||
|     deepLinking: true, | ||||
|     presets: [ | ||||
|       SwaggerUIBundle.presets.apis, | ||||
|       SwaggerUIStandalonePreset | ||||
|     ], | ||||
|     plugins: [ | ||||
|       SwaggerUIBundle.plugins.DownloadUrl | ||||
|     ], | ||||
|     layout: "StandaloneLayout" | ||||
|   }); | ||||
|  | ||||
|   //</editor-fold> | ||||
| }; | ||||
							
								
								
									
										3
									
								
								handler/swagger-ui/swagger-ui-bundle.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								handler/swagger-ui/swagger-ui-bundle.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										3
									
								
								handler/swagger-ui/swagger-ui-standalone-preset.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								handler/swagger-ui/swagger-ui-standalone-preset.js
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										3
									
								
								handler/swagger-ui/swagger-ui.css
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								handler/swagger-ui/swagger-ui.css
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										142
									
								
								handler/swagger-ui/swaggerui.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								handler/swagger-ui/swaggerui.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| package swaggerui // import "go.unistack.org/micro-server-http/v3/handler/swagger-ui" | ||||
|  | ||||
| import ( | ||||
| 	"embed" | ||||
| 	"html/template" | ||||
| 	"net/http" | ||||
| 	"path" | ||||
| 	"reflect" | ||||
| ) | ||||
|  | ||||
| //go:embed *.js *.css *.html *.png | ||||
| var assets embed.FS | ||||
|  | ||||
| var ( | ||||
| 	Handler = func(prefix string) http.HandlerFunc { | ||||
| 		return func(w http.ResponseWriter, r *http.Request) { | ||||
| 			if r.Method != http.MethodGet || path.Base(r.URL.Path) != "swagger-initializer.js" { | ||||
| 				http.StripPrefix(prefix, http.FileServer(http.FS(assets))).ServeHTTP(w, r) | ||||
| 				return | ||||
| 			} | ||||
| 			tpl := template.New("swagger-initializer.js").Funcs(TemplateFuncs) | ||||
| 			ptpl, err := tpl.Parse(Template) | ||||
| 			if err != nil { | ||||
| 				w.WriteHeader(http.StatusInternalServerError) | ||||
| 				_, _ = w.Write([]byte(err.Error())) | ||||
| 				return | ||||
| 			} | ||||
| 			if err := ptpl.Execute(w, Config); err != nil { | ||||
| 				w.WriteHeader(http.StatusInternalServerError) | ||||
| 				_, _ = w.Write([]byte(err.Error())) | ||||
| 				return | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	TemplateFuncs = template.FuncMap{ | ||||
| 		"isInt": func(i interface{}) bool { | ||||
| 			v := reflect.ValueOf(i) | ||||
| 			switch v.Kind() { | ||||
| 			case reflect.Int, reflect.Int8, reflect.Int32, reflect.Int64, reflect.Uint, reflect.Uint8, reflect.Uint32, reflect.Uint64, reflect.Float32, reflect.Float64: | ||||
| 				return true | ||||
| 			default: | ||||
| 				return false | ||||
| 			} | ||||
| 		}, | ||||
| 		"isBool": func(i interface{}) bool { | ||||
| 			v := reflect.ValueOf(i) | ||||
| 			switch v.Kind() { | ||||
| 			case reflect.Bool: | ||||
| 				return true | ||||
| 			default: | ||||
| 				return false | ||||
| 			} | ||||
| 		}, | ||||
| 		"isString": func(i interface{}) bool { | ||||
| 			v := reflect.ValueOf(i) | ||||
| 			switch v.Kind() { | ||||
| 			case reflect.String: | ||||
| 				return true | ||||
| 			default: | ||||
| 				return false | ||||
| 			} | ||||
| 		}, | ||||
| 		"isSlice": func(i interface{}) bool { | ||||
| 			v := reflect.ValueOf(i) | ||||
| 			switch v.Kind() { | ||||
| 			case reflect.Slice: | ||||
| 				return true | ||||
| 			default: | ||||
| 				return false | ||||
| 			} | ||||
| 		}, | ||||
| 		"isMap": func(i interface{}) bool { | ||||
| 			v := reflect.ValueOf(i) | ||||
| 			switch v.Kind() { | ||||
| 			case reflect.Map: | ||||
| 				return true | ||||
| 			default: | ||||
| 				return false | ||||
| 			} | ||||
| 		}, | ||||
| 	} | ||||
| 	Template = ` | ||||
| 	window.onload = function() { | ||||
| 		//<editor-fold desc="Changeable Configuration Block"> | ||||
| 	 | ||||
| 		window.ui = SwaggerUIBundle({ | ||||
| 			{{- range $k, $v := . }} | ||||
| 			{{- if (eq (printf "%s" $v) "") -}} | ||||
| 			{{- continue -}} | ||||
| 			{{ end }} | ||||
| 			{{ $k }}: {{ if isBool $v -}} | ||||
| 			{{- $v -}}, | ||||
| 			{{- else if isInt $v -}} | ||||
|       {{- $v -}}, | ||||
| 			{{- else if isString $v -}} | ||||
| 			"{{- $v -}}", | ||||
| 			{{- else if and (isSlice $v) (or (eq (printf "%s" $k) "presets") (eq (printf "%s" $k) "plugins")) -}} | ||||
| 			[ | ||||
| 			{{- range $v }} | ||||
| 				{{ . }}, | ||||
| 			{{- end }} | ||||
| 			], | ||||
| 			{{- end -}}  | ||||
| 			{{ end }} | ||||
| 		}); | ||||
| 	 | ||||
| 		//</editor-fold> | ||||
| 	};` | ||||
| 	Config = map[string]interface{}{ | ||||
| 		"configUrl": "", | ||||
| 		"dom_id":    "#swagger-ui", | ||||
| 		/* | ||||
| 				"domNode":     "", | ||||
| 			  "spec":        "", | ||||
| 				"urls": []interface{}{ | ||||
| 					map[string]interface{}{ | ||||
| 							"url":  "", | ||||
| 							"name": "", | ||||
| 						}, | ||||
| 					}, | ||||
| 				}, | ||||
| 		*/ | ||||
| 		"url":                      "https://petstore.swagger.io/v2/swagger.json", | ||||
| 		"deepLinking":              true, | ||||
| 		"displayOperationId":       false, | ||||
| 		"defaultModelsExpandDepth": 1, | ||||
| 		"defaultModelExpandDepth":  1, | ||||
| 		"displayRequestDuration":   true, | ||||
| 		"filter":                   true, | ||||
| 		"operationsSorter":         "alpha", | ||||
| 		"showExtensions":           true, | ||||
| 		"tryItOutEnabled":          true, | ||||
| 		"presets": []string{ | ||||
| 			"SwaggerUIBundle.presets.apis", | ||||
| 			"SwaggerUIStandalonePreset", | ||||
| 		}, | ||||
| 		"plugins": []string{ | ||||
| 			"SwaggerUIBundle.plugins.DownloadUrl", | ||||
| 		}, | ||||
| 		"layout": "StandaloneLayout", | ||||
| 	} | ||||
| ) | ||||
							
								
								
									
										15
									
								
								handler/swagger-ui/swaggerui_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								handler/swagger-ui/swaggerui_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| package swaggerui | ||||
|  | ||||
| import ( | ||||
| 	"net/http" | ||||
| 	"testing" | ||||
| ) | ||||
|  | ||||
| func TestTemplate(t *testing.T) { | ||||
| 	t.Skip() | ||||
| 	h := http.NewServeMux() | ||||
| 	h.HandleFunc("/", Handler("")) | ||||
| 	if err := http.ListenAndServe(":8080", h); err != nil { | ||||
| 		t.Fatal(err) | ||||
| 	} | ||||
| } | ||||
		Reference in New Issue
	
	Block a user