feat: format JSON responses having text/plain content type (#4916)
Co-authored-by: jamesgeorge007 <25279263+jamesgeorge007@users.noreply.github.com>
This commit is contained in:
parent
4e29810f69
commit
9e541a8a4b
2 changed files with 37 additions and 2 deletions
|
|
@ -1,6 +1,31 @@
|
||||||
import { defineAsyncComponent } from "vue"
|
import { defineAsyncComponent } from "vue"
|
||||||
import { isJSONContentType } from "../utils/contenttypes"
|
|
||||||
import { Lens } from "./lenses"
|
import { Lens } from "./lenses"
|
||||||
|
import { isJSONContentType } from "../utils/contenttypes"
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if response body contents can be parsed as valid JSON
|
||||||
|
*/
|
||||||
|
export function isValidJSONResponse(contents: string | ArrayBuffer): boolean {
|
||||||
|
if (!contents) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
const resolvedStr =
|
||||||
|
contents instanceof ArrayBuffer
|
||||||
|
? new TextDecoder("utf-8").decode(contents)
|
||||||
|
: contents
|
||||||
|
|
||||||
|
if (!resolvedStr.trim()) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
JSON.parse(resolvedStr)
|
||||||
|
return true
|
||||||
|
} catch (e) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const jsonLens: Lens = {
|
const jsonLens: Lens = {
|
||||||
lensName: "response.json",
|
lensName: "response.json",
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
||||||
import { HoppRESTResponse } from "../types/HoppRESTResponse"
|
import { HoppRESTResponse } from "../types/HoppRESTResponse"
|
||||||
import jsonLens from "./jsonLens"
|
import jsonLens, { isValidJSONResponse } from "./jsonLens"
|
||||||
import rawLens from "./rawLens"
|
import rawLens from "./rawLens"
|
||||||
import imageLens from "./imageLens"
|
import imageLens from "./imageLens"
|
||||||
import htmlLens from "./htmlLens"
|
import htmlLens from "./htmlLens"
|
||||||
|
|
@ -45,6 +45,16 @@ export function getSuitableLenses(response: HoppRESTResponse): Lens[] {
|
||||||
|
|
||||||
if (!contentType) return [rawLens]
|
if (!contentType) return [rawLens]
|
||||||
|
|
||||||
|
// Check if the response content type includes `text/plain` and the body contains valid JSON
|
||||||
|
if (
|
||||||
|
contentType.value.includes("text/plain") &&
|
||||||
|
response.type === "success" &&
|
||||||
|
isValidJSONResponse(response.body)
|
||||||
|
) {
|
||||||
|
// Append JSON lens to the list of lenses
|
||||||
|
return [rawLens, jsonLens]
|
||||||
|
}
|
||||||
|
|
||||||
const result = []
|
const result = []
|
||||||
for (const lens of lenses) {
|
for (const lens of lenses) {
|
||||||
if (lens.isSupportedContentType(contentType.value)) result.push(lens)
|
if (lens.isSupportedContentType(contentType.value)) result.push(lens)
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue