62 lines
2.9 KiB
JavaScript
62 lines
2.9 KiB
JavaScript
import { URI } from 'vscode-uri';
|
|
import { xhr, getErrorStatusDescription } from 'request-light';
|
|
import * as URL from 'url';
|
|
import { CustomSchemaContentRequest, VSCodeContentRequest } from '../../requestTypes';
|
|
import { isRelativePath, relativeToAbsolutePath } from '../utils/paths';
|
|
/**
|
|
* Handles schema content requests given the schema URI
|
|
* @param uri can be a local file, vscode request, http(s) request or a custom request
|
|
*/
|
|
export const schemaRequestHandler = (connection, uri, workspaceFolders, workspaceRoot, useVSCodeContentRequest, fs) => {
|
|
if (!uri) {
|
|
return Promise.reject('No schema specified');
|
|
}
|
|
// If the requested schema URI is a relative file path
|
|
// Convert it into a proper absolute path URI
|
|
if (isRelativePath(uri)) {
|
|
uri = relativeToAbsolutePath(workspaceFolders, workspaceRoot, uri);
|
|
}
|
|
let scheme = URI.parse(uri).scheme.toLowerCase();
|
|
// test if uri is windows path, ie starts with 'c:\'
|
|
if (/^[a-z]:[\\/]/i.test(uri)) {
|
|
const winUri = URI.file(uri);
|
|
scheme = winUri.scheme.toLowerCase();
|
|
uri = winUri.toString();
|
|
}
|
|
// If the requested schema is a local file, read and return the file contents
|
|
if (scheme === 'file') {
|
|
const fsPath = URI.parse(uri).fsPath;
|
|
return fs.readFile(fsPath, 'UTF-8').catch(() => {
|
|
// If there was an error reading the file, return empty error message
|
|
// Otherwise return the file contents as a string
|
|
return '';
|
|
});
|
|
}
|
|
// HTTP(S) requests are sent and the response result is either the schema content or an error
|
|
if (scheme === 'http' || scheme === 'https') {
|
|
// If we are running inside of VSCode we need to make a content request. This content request
|
|
// will make it so that schemas behind VPN's will resolve correctly
|
|
if (useVSCodeContentRequest) {
|
|
return connection.sendRequest(VSCodeContentRequest.type, uri).then((responseText) => {
|
|
return responseText;
|
|
}, (error) => {
|
|
return Promise.reject(error.message);
|
|
});
|
|
}
|
|
// Send the HTTP(S) schema content request and return the result
|
|
const headers = { 'Accept-Encoding': 'gzip, deflate' };
|
|
return xhr({ url: uri, followRedirects: 5, headers }).then((response) => {
|
|
return response.responseText;
|
|
}, (error) => {
|
|
return Promise.reject(error.responseText || getErrorStatusDescription(error.status) || error.toString());
|
|
});
|
|
}
|
|
// Neither local file nor vscode, nor HTTP(S) schema request, so send it off as a custom request
|
|
return connection.sendRequest(CustomSchemaContentRequest.type, uri);
|
|
};
|
|
export const workspaceContext = {
|
|
resolveRelativePath: (relativePath, resource) => {
|
|
return URL.resolve(resource, relativePath);
|
|
},
|
|
};
|
|
//# sourceMappingURL=schemaRequestHandler.js.map
|