Skip to content

Commit 3e47df3

Browse files
authored
Merge pull request #252 from meztez/patch-1
Dual purpose download/show button
2 parents bf3ece0 + 652ccd3 commit 3e47df3

File tree

4 files changed

+114
-5
lines changed

4 files changed

+114
-5
lines changed

docs/examples/binary-response.html

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<!doctype html>
2+
<head>
3+
<!-- Global site tag (gtag.js) - Google Analytics -->
4+
<script async src="https://www.googletagmanager.com/gtag/js?id=UA-132775238-1"></script>
5+
<script>
6+
window.dataLayer = window.dataLayer || [];
7+
function gtag(){dataLayer.push(arguments);}
8+
gtag('js', new Date());
9+
10+
gtag('config', 'UA-132775238-1');
11+
</script>
12+
13+
<meta charset="utf-8">
14+
<meta name="viewport" content="width=device-width, minimum-scale=1, initial-scale=1, user-scalable=yes">
15+
<script type="text/javascript" src="../rapidoc-min.js"></script>
16+
<link href="https://fonts.googleapis.com/css2?family=Open+Sans:wght@300;600&family=Roboto+Mono&display=swap" rel="stylesheet">
17+
<style>
18+
rapi-doc{
19+
width:100%;
20+
}
21+
</style>
22+
</head>
23+
<body>
24+
<rapi-doc spec-url="../specs/binary-response.json"
25+
show-info = "false"
26+
allow-server-selection = "false"
27+
allow-authentication = "false"
28+
show-header = "false"
29+
render-style = "read"
30+
regular-font = 'Open Sans'
31+
mono-font = "Roboto Mono"
32+
> </rapi-doc>
33+
</body>
34+
</html>

docs/list.html

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,13 @@ <h2 style="font-weight:700"> Branding Ideas </h2>
278278
</div>
279279
</div>
280280

281+
<div class = "container">
282+
<a href="./examples/binary-response.html"> Binary Response </a>
283+
<div class = "c-description" >
284+
Download or view binary response
285+
</div>
286+
</div>
287+
281288
<div class = "container">
282289
<a href="./examples/multipart-formdata.html"> Multipart Formdata </a>
283290
<div class = "c-description" >

docs/specs/binary-response.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"openapi" : "3.0.0",
3+
"info" : {
4+
"title" : "photos API",
5+
"description" : "picsum",
6+
"version" : "1.0.0"
7+
},
8+
"servers" : [ {
9+
"url" : "https://picsum.photos/",
10+
"description" : "picsum photos"
11+
} ],
12+
"paths" : {
13+
"/{width}/{height}" : {
14+
"get" : {
15+
"description" : "Return a photo",
16+
"parameters" : [ {
17+
"name" : "width",
18+
"in" : "path",
19+
"description" : "photo width",
20+
"required" : true,
21+
"schema" : {
22+
"minimum" : 100,
23+
"type" : "integer",
24+
"format" : "int32"
25+
}
26+
}, {
27+
"name" : "height",
28+
"in" : "path",
29+
"description" : "photo height",
30+
"required" : true,
31+
"schema" : {
32+
"minimum" : 100,
33+
"type" : "integer",
34+
"format" : "int32"
35+
}
36+
} ],
37+
"responses" : {
38+
"200" : {
39+
"description" : "Default response"
40+
}
41+
}
42+
}
43+
}
44+
}
45+
}

src/components/api-request.js

Lines changed: 28 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -678,6 +678,10 @@ export default class ApiRequest extends LitElement {
678678
? html`
679679
<div class="tab-content col" style="flex:1; display:${this.activeResponseTab === 'response' ? 'flex' : 'none'};">
680680
<button class="m-btn" @click="${this.downloadResponseBlob}">DOWNLOAD</button>
681+
${this.responseBlobType === 'view'
682+
? html`<button class="m-btn" @click="${this.viewResponseBlob}">VIEW (NEW TAB)</button>`
683+
: ''
684+
}
681685
</div>`
682686
: html`
683687
<div class="tab-content col m-markdown" style="flex:1;display:${this.activeResponseTab === 'response' ? 'flex' : 'none'};" >
@@ -1003,17 +1007,23 @@ export default class ApiRequest extends LitElement {
10031007
resp.json().then((respObj) => {
10041008
me.responseText = JSON.stringify(respObj, null, 2);
10051009
});
1006-
} else if (contentType.includes('octet-stream')) {
1010+
} else if (RegExp('7z|octet-stream|tar|zip').test(contentType)) {
1011+
me.responseIsBlob = true;
1012+
me.responseBlobType = 'download';
1013+
} else if (RegExp('^audio|^image|pdf|^video').test(contentType)) {
10071014
me.responseIsBlob = true;
1015+
me.responseBlobType = 'view';
1016+
} else {
1017+
resp.text().then((respText) => {
1018+
me.responseText = respText;
1019+
});
1020+
}
1021+
if (me.responseIsBlob) {
10081022
const contentDisposition = resp.headers.get('content-disposition');
10091023
me.respContentDisposition = contentDisposition ? contentDisposition.split('filename=')[1] : 'filename';
10101024
resp.blob().then((respBlob) => {
10111025
me.responseBlobUrl = URL.createObjectURL(respBlob);
10121026
});
1013-
} else {
1014-
resp.text().then((respText) => {
1015-
me.responseText = respText;
1016-
});
10171027
}
10181028
} else {
10191029
resp.text().then((respText) => {
@@ -1077,13 +1087,26 @@ export default class ApiRequest extends LitElement {
10771087
}
10781088
}
10791089

1090+
viewResponseBlob() {
1091+
if (this.responseBlobUrl) {
1092+
const a = document.createElement('a');
1093+
document.body.appendChild(a);
1094+
a.style = 'display: none';
1095+
a.href = this.responseBlobUrl;
1096+
a.target = '_blank';
1097+
a.click();
1098+
a.remove();
1099+
}
1100+
}
1101+
10801102
clearResponseData() {
10811103
this.responseUrl = '';
10821104
this.responseHeaders = '';
10831105
this.responseText = '';
10841106
this.responseStatus = 'success';
10851107
this.responseMessage = '';
10861108
this.responseIsBlob = false;
1109+
this.responseBlobType = '';
10871110
this.respContentDisposition = '';
10881111
if (this.responseBlobUrl) {
10891112
URL.revokeObjectURL(this.responseBlobUrl);

0 commit comments

Comments
 (0)