forked from Ponysearch/Ponysearch
Merge pull request #1706 from dalf/fix-autocomplete-post
Fix: autocomplete with the POST method: url encode the user query
This commit is contained in:
commit
8bdc6986a1
3 changed files with 40 additions and 3 deletions
4
searx/static/themes/simple/js/searxng.min.js
vendored
4
searx/static/themes/simple/js/searxng.min.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -68,6 +68,43 @@
|
||||||
}, "#" + qinput_id);
|
}, "#" + qinput_id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
Monkey patch autocomplete.js to fix a bug
|
||||||
|
With the POST method, the values are not URL encoded: query like "1 + 1" are sent as "1 1" since space are URL encoded as plus.
|
||||||
|
See HTML specifications:
|
||||||
|
* HTML5: https://url.spec.whatwg.org/#concept-urlencoded-serializer
|
||||||
|
* HTML4: https://www.w3.org/TR/html401/interact/forms.html#h-17.13.4.1
|
||||||
|
|
||||||
|
autocomplete.js does not URL encode the name and values:
|
||||||
|
https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/src/autocomplete.ts#L665
|
||||||
|
|
||||||
|
The monkey patch overrides the compiled version of the ajax function.
|
||||||
|
See https://github.com/autocompletejs/autocomplete.js/blob/87069524f3b95e68f1b54d8976868e0eac1b2c83/dist/autocomplete.js#L143-L158
|
||||||
|
The patch changes only the line 156 from
|
||||||
|
params.Request.send(params._QueryArg() + "=" + params._Pre());
|
||||||
|
to
|
||||||
|
params.Request.send(encodeURIComponent(params._QueryArg()) + "=" + encodeURIComponent(params._Pre()));
|
||||||
|
|
||||||
|
Related to:
|
||||||
|
* https://github.com/autocompletejs/autocomplete.js/issues/78
|
||||||
|
* https://github.com/searxng/searxng/issues/1695
|
||||||
|
*/
|
||||||
|
AutoComplete.prototype.ajax = function (params, request, timeout) {
|
||||||
|
if (timeout === void 0) { timeout = true; }
|
||||||
|
if (params.$AjaxTimer) {
|
||||||
|
window.clearTimeout(params.$AjaxTimer);
|
||||||
|
}
|
||||||
|
if (timeout === true) {
|
||||||
|
params.$AjaxTimer = window.setTimeout(AutoComplete.prototype.ajax.bind(null, params, request, false), params.Delay);
|
||||||
|
} else {
|
||||||
|
if (params.Request) {
|
||||||
|
params.Request.abort();
|
||||||
|
}
|
||||||
|
params.Request = request;
|
||||||
|
params.Request.send(encodeURIComponent(params._QueryArg()) + "=" + encodeURIComponent(params._Pre()));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
if (!isMobile && document.querySelector('.index_endpoint')) {
|
if (!isMobile && document.querySelector('.index_endpoint')) {
|
||||||
qinput.focus();
|
qinput.focus();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue