Skip to content

Commit

Permalink
Merge pull request #359 from multiversx/handle-swagger-ui
Browse files Browse the repository at this point in the history
handle swagger ui if CLI flag is set
  • Loading branch information
bogdan-rosianu authored Feb 13, 2023
2 parents 8eb68f9 + ef51603 commit defb4ba
Show file tree
Hide file tree
Showing 19 changed files with 3,240 additions and 4 deletions.
9 changes: 8 additions & 1 deletion api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import (

"github.com/gin-contrib/cors"
"github.com/gin-contrib/pprof"
"github.com/gin-contrib/static"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/multiversx/mx-chain-core-go/hashing"
Expand Down Expand Up @@ -37,6 +38,7 @@ func CreateServer(
statusMetricsExtractor middleware.StatusMetricsExtractor,
rateLimitTimeWindowInSeconds int,
isProfileModeActivated bool,
shouldStartSwaggerUI bool,
) (*http.Server, error) {
ws := gin.Default()
ws.Use(cors.Default())
Expand All @@ -46,7 +48,7 @@ func CreateServer(
return nil, err
}

err = registerRoutes(ws, versionsRegistry, apiLoggingConfig, credentialsConfig, statusMetricsExtractor, rateLimitTimeWindowInSeconds, isProfileModeActivated)
err = registerRoutes(ws, versionsRegistry, apiLoggingConfig, credentialsConfig, statusMetricsExtractor, rateLimitTimeWindowInSeconds, isProfileModeActivated, shouldStartSwaggerUI)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -82,12 +84,17 @@ func registerRoutes(
statusMetricsExtractor middleware.StatusMetricsExtractor,
rateLimitTimeWindowInSeconds int,
isProfileModeActivated bool,
shouldStartSwaggerUI bool,
) error {
versionsMap, err := versionsRegistry.GetAllVersions()
if err != nil {
return err
}

if shouldStartSwaggerUI {
ws.Use(static.ServeRoot("/", "config/swagger"))
}

if apiLoggingConfig.LoggingEnabled {
responseLoggerMiddleware := middleware.NewResponseLoggerMiddleware(time.Duration(apiLoggingConfig.ThresholdInMicroSeconds) * time.Microsecond)
ws.Use(responseLoggerMiddleware.MiddlewareHandlerFunc())
Expand Down
2 changes: 1 addition & 1 deletion cmd/proxy/config/apiConfig/v1_0.toml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Routes = [
{ Name = "/ratings", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/genesis-nodes", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/gas-configs", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/trie-statistics", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/trie-statistics/:shard", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/epoch-start/:shard/by-epoch/:epoch", Open = true, Secured = false, RateLimit = 0 }
]

Expand Down
2 changes: 1 addition & 1 deletion cmd/proxy/config/apiConfig/v_next.toml
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Routes = [
{ Name = "/ratings", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/genesis-nodes", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/gas-configs", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/trie-statistics", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/trie-statistics/:shard", Open = true, Secured = false, RateLimit = 0 },
{ Name = "/epoch-start/:shard/by-epoch/:epoch", Open = true, Secured = false, RateLimit = 0 }
]

Expand Down
Binary file added cmd/proxy/config/swagger/favicon-16x16.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added cmd/proxy/config/swagger/favicon-32x32.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
16 changes: 16 additions & 0 deletions cmd/proxy/config/swagger/index.css
Original file line number Diff line number Diff line change
@@ -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 changes: 19 additions & 0 deletions cmd/proxy/config/swagger/index.html
Original file line number Diff line number Diff line change
@@ -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 changes: 79 additions & 0 deletions cmd/proxy/config/swagger/oauth2-redirect.html
Original file line number Diff line number Diff line change
@@ -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>
Loading

0 comments on commit defb4ba

Please sign in to comment.