Files
doris/ui/src/utils/request.tsx
Mingyu Chen c934cf93e1 [UI Part 5] Enable HTTP Server 2 by FE config (#4684)
This is the last PR of proposal #4308

1. Add a new FE config `enable_http_server_v2` to enable new HTTP Server implementation. The default value is false.
2. Add a new FE config `http_api_extra_base_path` so that we can set base path for Frontend UI.
3. Refactor the new HTTP API response body. The return http status code is always 200, and using internal code in response body to indicate the certain error.
2020-10-13 10:07:50 +08:00

169 lines
5.9 KiB
TypeScript

/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
/**
* @file test cron
* @author lpx
* @since 2020/08/19
*/
import React from 'react';
import {notification, Modal} from 'antd';
import {ExclamationCircleOutlined} from '@ant-design/icons';
import {Trans} from 'react-i18next';
import {getBasePath} from 'Src/utils/utils';
import SyntaxHighlighter from 'react-syntax-highlighter';
import {docco} from 'react-syntax-highlighter/dist/esm/styles/hljs';
function checkStatus(response) {
if (response.status >= 200 && response.status < 300) {
return response;
}
if (response.status === 401) {
Modal.confirm({
title: <Trans>tips</Trans>,
icon: <ExclamationCircleOutlined/>,
content: <Trans>loginExpirtMsg</Trans>,
onOk() {
window.location.href = window.location.origin +getBasePath()+ '/login';
},
onCancel() {
//
}
});
return;
}
const error = new Error(response.statusText);
error.response = response;
notification.error(response.statusText);
throw error;
}
/**
* Requests a URL, returning a promise.
*
* @param {string} url The URL we want to request
* @param {Object} options The parameters to be passed; options may not be passed when GET, the default is {}
* @param {string} options POST, DELETE, GET, PUT
* @param {Object} options Parameters that need to be passed to the backend, such as {id: 1}
* @param {boolean} options Whether to upload a file, if you upload a file, you do not need the default headers and convert the body to a string
* @param {boolean} tipSuccess false: Do not show successful update true: show successful update
* @param {boolean} tipError false: Don't prompt error true: display error message
* @param {boolean} fullResponse false: Whether to return all requested information
* @return {Object}
*/
export default async function request(url, options = {}, tipSuccess = false, tipError = true, fullResponse = false) {
if(!localStorage.getItem('username') && url.includes('login') === false){
clearAllCookie();
Modal.confirm({
title: <Trans>tips</Trans>,
icon: <ExclamationCircleOutlined/>,
content: <Trans>loginExpirtMsg</Trans>,
onOk() {
window.location.href = window.location.origin +getBasePath()+ '/login';
},
onCancel() {
//
}
});
return;
}
const basePath = getBasePath();
const newOptions = {credentials: 'include', ...options};
if (newOptions.method === 'POST' || newOptions.method === 'PUT') {
newOptions.headers = newOptions.isUpload
? {
...newOptions.headers
}
: {
'Content-Type': 'application/json; charset=utf-8',
...newOptions.headers
};
}
if (typeof newOptions.body === 'object' && !newOptions.isUpload) {
newOptions.body = JSON.stringify(newOptions.body);
}
if (basePath && basePath!=='/') {
url = basePath + url
}
const response = await fetch(url, newOptions);
if (
response.url.includes('dataIntegrationApi')
&& (
newOptions.method === 'PUT'
|| newOptions.method === 'POST'
|| newOptions.method === 'DELETE'
)
) {
return response;
}
checkStatus(response);
if (options && options.download) {
return response.blob();
}
const data = await response.json();
if ('code' in data || 'msg' in data) {
const {code, msg} = data;
if (code === 401 && data.data === 'Cookie is invalid') {
Modal.confirm({
title: <Trans>tips</Trans>,
icon: <ExclamationCircleOutlined/>,
content: <Trans>loginExpirtMsg</Trans>,
onOk() {
window.location.href = window.location.origin +getBasePath()+ '/login';
},
onCancel() {
//
}
});
} else if (code === 401 && data.data !== 'Cookie is invalid') {
notification.error({
message:<Trans>loginWarning</Trans>
});
}else if (msg === 'success' || code === 0 || code === 200) {
if (tipSuccess) {
notification.success({
message:<Trans>successfulOperation</Trans>,
description: msg
});
}
} else if (tipError && code !== 0 && msg !== '') {
let item = (
<SyntaxHighlighter language="sql" style={{...docco, width:'300px'}}>
{data.data}
</SyntaxHighlighter>
)
notification.error({
message: msg,
description: item
});
}
}
if (fullResponse) {
return {data, response};
}
return data;
}
function clearAllCookie() {
var keys = document.cookie.match(/[^ =;]+(?=\=)/g);
if(keys) {
for(var i = keys.length; i--;)
document.cookie = keys[i] + '=0;expires=' + new Date(0).toUTCString()
}
}