Skip to content

Commit 64377fe

Browse files
Injecting CSS and JS into HTML
1 parent 8a97520 commit 64377fe

File tree

4 files changed

+18
-53
lines changed

4 files changed

+18
-53
lines changed

aws_lambda_powertools/event_handler/api_gateway.py

+6-23
Original file line numberDiff line numberDiff line change
@@ -1594,26 +1594,6 @@ def enable_swagger(
15941594
"""
15951595
from aws_lambda_powertools.event_handler.openapi.models import Server
15961596

1597-
if not swagger_base_url:
1598-
1599-
@self.get("/swagger.js", include_in_schema=False)
1600-
def swagger_js():
1601-
body = Path.open(Path(__file__).parent / "openapi" / "swagger_ui" / "swagger-ui-bundle.min.js").read()
1602-
return Response(
1603-
status_code=200,
1604-
content_type="text/javascript",
1605-
body=body,
1606-
)
1607-
1608-
@self.get("/swagger.css", include_in_schema=False)
1609-
def swagger_css():
1610-
body = Path.open(Path(__file__).parent / "openapi" / "swagger_ui" / "swagger-ui.min.css").read()
1611-
return Response(
1612-
status_code=200,
1613-
content_type="text/css",
1614-
body=body,
1615-
)
1616-
16171597
@self.get(path, middlewares=middlewares, include_in_schema=False)
16181598
def swagger_handler():
16191599
base_path = self._get_base_path()
@@ -1622,8 +1602,11 @@ def swagger_handler():
16221602
swagger_js = f"{swagger_base_url}/swagger-ui-bundle.min.js"
16231603
swagger_css = f"{swagger_base_url}/swagger-ui.min.css"
16241604
else:
1625-
swagger_js = f"{base_path}/swagger.js"
1626-
swagger_css = f"{base_path}/swagger.css"
1605+
# We now inject CSS and JS into the SwaggerUI file
1606+
swagger_js = Path.open(
1607+
Path(__file__).parent / "openapi" / "swagger_ui" / "swagger-ui-bundle.min.js",
1608+
).read()
1609+
swagger_css = Path.open(Path(__file__).parent / "openapi" / "swagger_ui" / "swagger-ui.min.css").read()
16271610

16281611
openapi_servers = servers or [Server(url=(base_path or "/"))]
16291612

@@ -1640,7 +1623,7 @@ def swagger_handler():
16401623
license_info=license_info,
16411624
)
16421625

1643-
body = generate_swagger_html(spec, swagger_js, swagger_css)
1626+
body = generate_swagger_html(spec, swagger_js, swagger_css, swagger_base_url)
16441627

16451628
return Response(
16461629
status_code=200,

aws_lambda_powertools/event_handler/openapi/swagger_ui/html.py

+12-3
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from aws_lambda_powertools.event_handler.openapi.models import OpenAPI
55

66

7-
def generate_swagger_html(spec: "OpenAPI", js_url: str, css_url: str) -> str:
7+
def generate_swagger_html(spec: "OpenAPI", swagger_js: str, swagger_css: str, swagger_base_url: str) -> str:
88
"""
99
Generate Swagger UI HTML page
1010
@@ -30,6 +30,15 @@ def generate_swagger_html(spec: "OpenAPI", js_url: str, css_url: str) -> str:
3030
indent=2,
3131
).replace("</", "<\\/")
3232

33+
# If Swagger base URL is present, generate HTML content with linked CSS and JavaScript files
34+
# If no Swagger base URL is provided, include CSS and JavaScript directly in the HTML
35+
if swagger_base_url:
36+
swagger_css_content = f"<link rel='stylesheet' type='text/css' href='{swagger_css}'>"
37+
swagger_js_content = f"<script src='{swagger_js}'></script>"
38+
else:
39+
swagger_css_content = f"<style>{swagger_css}</style>"
40+
swagger_js_content = f"<script>{swagger_js}</script>"
41+
3342
return f"""
3443
<!DOCTYPE html>
3544
<html>
@@ -40,7 +49,7 @@ def generate_swagger_html(spec: "OpenAPI", js_url: str, css_url: str) -> str:
4049
http-equiv="Cache-control"
4150
content="no-cache, no-store, must-revalidate"
4251
/>
43-
<link rel="stylesheet" type="text/css" href="{css_url}">
52+
{swagger_css_content}
4453
</head>
4554
4655
<body>
@@ -49,7 +58,7 @@ def generate_swagger_html(spec: "OpenAPI", js_url: str, css_url: str) -> str:
4958
</div>
5059
</body>
5160
52-
<script src="{js_url}"></script>
61+
{swagger_js_content}
5362
5463
<script>
5564
var swaggerUIOptions = {{

docs/core/event_handler/api_gateway.md

-1
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,6 @@ There are some important **caveats** that you should know before enabling it:
485485
| Swagger UI is **publicly accessible by default** | When using `enable_swagger` method, you can [protect sensitive API endpoints by implementing a custom middleware](#customizing-swagger-ui) using your preferred authorization mechanism. |
486486
| **No micro-functions support** yet | Swagger UI is enabled on a per resolver instance which will limit its accuracy here. |
487487
| You need to expose **new routes** | You'll need to expose the following paths to Lambda: `/swagger`, `/swagger.css`, `/swagger.js`; ignore if you're routing all paths already. |
488-
| Problems with **{proxy+}** resource and cache | If you're not using an external CDN for SwaggerUI assets and relying on **Amazon API Gateway cache**, you must specify dedicated paths for `/swagger.js` and `/swagger.css` rather than utilizing `{proxy+}`. |
489488

490489
```python hl_lines="12-13" title="enabling_swagger.py"
491490
--8<-- "examples/event_handler_rest/src/enabling_swagger.py"

tests/functional/event_handler/test_openapi_swagger.py

-26
Original file line numberDiff line numberDiff line change
@@ -14,32 +14,6 @@ def test_openapi_swagger():
1414
assert result["statusCode"] == 200
1515
assert result["multiValueHeaders"]["Content-Type"] == ["text/html"]
1616

17-
# Using our embedded assets
18-
assert "/swagger.css" in result["body"]
19-
assert "/swagger.js" in result["body"]
20-
21-
22-
def test_openapi_embedded_js():
23-
app = APIGatewayRestResolver(enable_validation=True)
24-
app.enable_swagger()
25-
26-
LOAD_GW_EVENT["path"] = "/swagger.js"
27-
28-
result = app(LOAD_GW_EVENT, {})
29-
assert result["statusCode"] == 200
30-
assert result["multiValueHeaders"]["Content-Type"] == ["text/javascript"]
31-
32-
33-
def test_openapi_embedded_css():
34-
app = APIGatewayRestResolver(enable_validation=True)
35-
app.enable_swagger()
36-
37-
LOAD_GW_EVENT["path"] = "/swagger.css"
38-
39-
result = app(LOAD_GW_EVENT, {})
40-
assert result["statusCode"] == 200
41-
assert result["multiValueHeaders"]["Content-Type"] == ["text/css"]
42-
4317

4418
def test_openapi_swagger_with_custom_base_url():
4519
app = APIGatewayRestResolver(enable_validation=True)

0 commit comments

Comments
 (0)