Skip to content

Commit

Permalink
Merge pull request #196 from mirkogolze/main
Browse files Browse the repository at this point in the history
check response type for ResponsePane CodeEditor
  • Loading branch information
helloanoop authored Sep 18, 2023
2 parents c020cd9 + 7d4d157 commit a103f41
Show file tree
Hide file tree
Showing 5 changed files with 72 additions and 25 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ const EnvironmentSelector = ({ collection }) => {
toast.success(`No Environments are active now`);
}
})
.catch((err) => console.log(err) && toast.error('An error occured while selecting the environment'));
.catch((err) => console.log(err) && toast.error('An error occurred while selecting the environment'));
};

return (
Expand Down Expand Up @@ -64,7 +64,7 @@ const EnvironmentSelector = ({ collection }) => {
}}
>
<IconDatabaseOff size={18} strokeWidth={1.5} />
<span className='ml-2'>No Environment</span>
<span className="ml-2">No Environment</span>
</div>
<div className="dropdown-item border-top" onClick={() => setOpenSettingsModal(true)}>
<div className="pr-2 text-gray-600">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,14 +6,12 @@ import { sendRequest } from 'providers/ReduxStore/slices/collections/actions';

import StyledWrapper from './StyledWrapper';

const QueryResult = ({ item, collection, value, width, disableRunEventListener }) => {
const {
storedTheme
} = useTheme();
const QueryResult = ({ item, collection, value, width, disableRunEventListener, mode }) => {
const { storedTheme } = useTheme();
const dispatch = useDispatch();

const onRun = () => {
if(disableRunEventListener) {
if (disableRunEventListener) {
return;
}
dispatch(sendRequest(item, collection.uid));
Expand All @@ -22,7 +20,7 @@ const QueryResult = ({ item, collection, value, width, disableRunEventListener }
return (
<StyledWrapper className="px-3 w-full" style={{ maxWidth: width }}>
<div className="h-full">
<CodeEditor collection={collection} theme={storedTheme} onRun={onRun} value={value || ''} readOnly />
<CodeEditor collection={collection} theme={storedTheme} onRun={onRun} value={value || ''} mode={mode} readOnly />
</div>
</StyledWrapper>
);
Expand Down
43 changes: 34 additions & 9 deletions packages/bruno-app/src/components/ResponsePane/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import React from 'react';
import find from 'lodash/find';
import classnames from 'classnames';
import { safeStringifyJSON } from 'utils/common';
import { useSelector, useDispatch } from 'react-redux';
import { useDispatch, useSelector } from 'react-redux';
import { updateResponsePaneTab } from 'providers/ReduxStore/slices/tabs';
import QueryResult from './QueryResult';
import Overlay from './Overlay';
Expand Down Expand Up @@ -36,18 +36,21 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => {
const getTabPanel = (tab) => {
switch (tab) {
case 'response': {
return <QueryResult
item={item}
collection={collection}
width={rightPaneWidth}
value={response.data ? safeStringifyJSON(response.data, true) : ''}
/>;
return (
<QueryResult
item={item}
collection={collection}
width={rightPaneWidth}
value={response.data ? (isJson(response.headers) ? safeStringifyJSON(response.data, true) : response.data) : ''}
mode={getContentType(response.headers)}
/>
);
}
case 'headers': {
return <ResponseHeaders headers={response.headers} />;
}
case 'timeline': {
return <Timeline request={item.requestSent} response={item.response}/>;
return <Timeline request={item.requestSent} response={item.response} />;
}
case 'tests': {
return <TestResults results={item.testResults} assertionResults={item.assertionResults} />;
Expand Down Expand Up @@ -81,7 +84,7 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => {

const focusedTab = find(tabs, (t) => t.uid === activeTabUid);
if (!focusedTab || !focusedTab.uid || !focusedTab.responsePaneTab) {
return <div className="pb-4 px-4">An error occured!</div>;
return <div className="pb-4 px-4">An error occurred!</div>;
}

const getTabClassname = (tabName) => {
Expand All @@ -90,6 +93,28 @@ const ResponsePane = ({ rightPaneWidth, item, collection }) => {
});
};

const getContentType = (headers) => {
if (headers && headers.length) {
let contentType = headers
.filter((header) => header[0].toLowerCase() === 'content-type')
.map((header) => {
return header[1];
});
if (contentType && contentType.length) {
if (typeof contentType[0] == 'string' && /^[\w\-]+\/([\w\-]+\+)?json/.test(contentType[0])) {
return 'application/ld+json';
} else if (typeof contentType[0] == 'string' && /^[\w\-]+\/([\w\-]+\+)?xml/.test(contentType[0])) {
return 'application/xml';
}
}
}
return '';
};

const isJson = (headers) => {
return getContentType(headers) === 'application/ld+json';
};

return (
<StyledWrapper className="flex flex-col h-full relative">
<div className="flex items-center px-3 tabs" role="tablist">
Expand Down
20 changes: 16 additions & 4 deletions packages/bruno-cli/src/runner/prepare-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ const { get, each, filter } = require('lodash');

const prepareRequest = (request) => {
const headers = {};
let contentTypeDefined = false;
each(request.headers, (h) => {
if (h.enabled) {
headers[h.name] = h.value;
if (h.name.toLowerCase() === 'content-type') {
contentTypeDefined = true;
}
}
});

Expand All @@ -17,7 +21,9 @@ const prepareRequest = (request) => {
request.body = request.body || {};

if (request.body.mode === 'json') {
axiosRequest.headers['content-type'] = 'application/json';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'application/json';
}
try {
axiosRequest.data = JSON.parse(request.body.json);
} catch (ex) {
Expand All @@ -26,12 +32,16 @@ const prepareRequest = (request) => {
}

if (request.body.mode === 'text') {
axiosRequest.headers['content-type'] = 'text/plain';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'text/plain';
}
axiosRequest.data = request.body.text;
}

if (request.body.mode === 'xml') {
axiosRequest.headers['content-type'] = 'text/xml';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'text/xml';
}
axiosRequest.data = request.body.xml;
}

Expand All @@ -56,7 +66,9 @@ const prepareRequest = (request) => {
query: get(request, 'body.graphql.query'),
variables: JSON.parse(get(request, 'body.graphql.variables') || '{}')
};
axiosRequest.headers['content-type'] = 'application/json';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'application/json';
}
axiosRequest.data = graphqlQuery;
}

Expand Down
20 changes: 16 additions & 4 deletions packages/bruno-electron/src/ipc/network/prepare-request.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,13 @@ const { get, each, filter } = require('lodash');

const prepareRequest = (request) => {
const headers = {};
let contentTypeDefined = false;
each(request.headers, (h) => {
if (h.enabled) {
headers[h.name] = h.value;
if (h.name.toLowerCase() === 'content-type') {
contentTypeDefined = true;
}
}
});

Expand All @@ -15,7 +19,9 @@ const prepareRequest = (request) => {
};

if (request.body.mode === 'json') {
axiosRequest.headers['content-type'] = 'application/json';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'application/json';
}
try {
axiosRequest.data = JSON.parse(request.body.json);
} catch (ex) {
Expand All @@ -24,12 +30,16 @@ const prepareRequest = (request) => {
}

if (request.body.mode === 'text') {
axiosRequest.headers['content-type'] = 'text/plain';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'text/plain';
}
axiosRequest.data = request.body.text;
}

if (request.body.mode === 'xml') {
axiosRequest.headers['content-type'] = 'text/xml';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'text/xml';
}
axiosRequest.data = request.body.xml;
}

Expand All @@ -54,7 +64,9 @@ const prepareRequest = (request) => {
query: get(request, 'body.graphql.query'),
variables: JSON.parse(get(request, 'body.graphql.variables') || '{}')
};
axiosRequest.headers['content-type'] = 'application/json';
if (!contentTypeDefined) {
axiosRequest.headers['content-type'] = 'application/json';
}
axiosRequest.data = graphqlQuery;
}

Expand Down

0 comments on commit a103f41

Please sign in to comment.