open-consul/ui-v2/app/utils/http/create-url.js
John Cowen f50438e76f
ui: Remove jQuery from the production build (#8088)
* ui: Split up client/http and replace $.ajax

This splits the client/http service more in the following ways:

1. Connections are now split out into its own service
2. The transport is now split out into its own service that returns a
listener based http transport
3. Various string parsing/stringifying functions are now split out into
utils

* Remove jQuery from our production build

* Move the coverage serving to the server.js file

* Self review amends

* Add X-Requested-With header

* Move some files around, externalize some functions

* Move connection tracking to use native Set

* Ensure HTTP parsing doesn't encode headers

In the future this will change to deal with all HTTP parsing in one
place, hence the commented out METHOD_PARSING etc

* Start to fix up integration tests to use requestParams
2020-07-07 19:58:46 +01:00

73 lines
2.3 KiB
JavaScript

// const METHOD_PARSING = 0;
const PATH_PARSING = 1;
const QUERY_PARSING = 2;
const HEADER_PARSING = 3;
const BODY_PARSING = 4;
export default function(encode, queryParams) {
return function(strs, ...values) {
// TODO: Potentially url should check if any of the params
// passed to it are undefined (null is fine). We could then get rid of the
// multitude of checks we do throughout the adapters
// right now create-url converts undefined to '' so we need to check thats not needed
// anywhere
let state = PATH_PARSING;
return strs
.map(function(item, i, arr) {
if (i === 0) {
item = item.trimStart();
}
// if(item.indexOf(' ') !== -1 && state === METHOD_PARSING) {
// state = PATH_PARSING;
// }
if (item.indexOf('?') !== -1 && state === PATH_PARSING) {
state = QUERY_PARSING;
}
if (item.indexOf('\n\n') !== -1) {
state = BODY_PARSING;
}
if (item.indexOf('\n') !== -1 && state !== BODY_PARSING) {
state = HEADER_PARSING;
}
let val = typeof values[i] !== 'undefined' ? values[i] : '';
switch (state) {
case PATH_PARSING:
switch (true) {
// encode strings
case typeof val === 'string':
val = encode(val);
break;
// split encode and join arrays by `/`
case Array.isArray(val):
val = val
.map(function(item) {
return `${encode(item)}`;
}, '')
.join('/');
break;
}
break;
case QUERY_PARSING:
switch (true) {
case typeof val === 'string':
val = encode(val);
break;
// objects offload to queryParams for encoding
case typeof val === 'object':
val = queryParams(val);
break;
}
break;
case BODY_PARSING:
// ignore body until we parse it here
return item.split('\n\n')[0];
// case METHOD_PARSING:
case HEADER_PARSING:
// passthrough/ignore method and headers until we parse them here
}
return `${item}${val}`;
})
.join('')
.trim();
};
}