function send(bIsFreshToken) {
				const oAjaxSettings = {
						contentType : mHeaders && mHeaders["Content-Type"],
						data : sPayload,
						headers : Object.assign({},
							that.mPredefinedRequestHeaders,
							that.mHeaders,
							_Helper.resolveIfMatchHeader(mHeaders,
								that.oModelInterface.isIgnoreETag())),
						method : sMethod
					};
				var sOldCsrfToken = that.mHeaders["X-CSRF-Token"];

				if (that.bWithCredentials) {
					oAjaxSettings.xhrFields = {withCredentials : true};
				}
				jQuery.ajax(sRequestUrl, oAjaxSettings)
				.then(function (/*{object|string}*/vResponse, _sTextStatus, jqXHR) {
					var sETag = jqXHR.getResponseHeader("ETag"),
						sCsrfToken = jqXHR.getResponseHeader("X-CSRF-Token");

					that.oModelInterface.onHttpResponse(
						_Helper.parseRawHeaders(jqXHR.getAllResponseHeaders()));

					try {
						that.doCheckVersionHeader(jqXHR.getResponseHeader, sResourcePath,
							!vResponse);
					} catch (oError) {
						fnReject(oError);
						return;
					}
					if (sCsrfToken) {
						that.mHeaders["X-CSRF-Token"] = sCsrfToken;
					}
					that.setSessionContext(jqXHR.getResponseHeader("SAP-ContextId"),
						jqXHR.getResponseHeader("SAP-Http-Session-Timeout"));

					// Note: string response appears only for $batch and thus cannot be empty;
					// for 204 "No Content", vResponse === undefined
					// With GET it must be visible that there is no content, with the other
					// methods it must be possible to insert the ETag from the header
					vResponse ||= sMethod === "GET" ? null : {};
					if (sETag && typeof vResponse === "object") {
						vResponse["@odata.etag"] = sETag;
					}

					fnResolve({
						body : vResponse,
						contentType : jqXHR.getResponseHeader("Content-Type"),
						messages : jqXHR.getResponseHeader("sap-messages"),
						resourcePath : sResourcePath
					});
				}, function (jqXHR) {
					var sContextId = jqXHR.getResponseHeader("SAP-ContextId"),
						sCsrfToken = jqXHR.getResponseHeader("X-CSRF-Token"),
						sMessage;

					if (!bIsFreshToken && jqXHR.status === 403
							&& sCsrfToken && sCsrfToken.toLowerCase() === "required") {
						// refresh CSRF token and repeat original request
						that.refreshSecurityToken(sOldCsrfToken).then(function () {
							send(true);
						}, fnReject);
					} else if (jqXHR.status === 503 && jqXHR.getResponseHeader("Retry-After")
							&& that.oModelInterface.getOrCreateRetryAfterPromise(
								_Helper.createError(jqXHR, ""))) {
						that.oModelInterface.getOrCreateRetryAfterPromise().then(send, fnReject);
					} else {
						sMessage = "Communication error";
						if (sContextId) {
							// an error response within the session (e.g. a failed save) refreshes
							// the session
							that.setSessionContext(sContextId,
								jqXHR.getResponseHeader("SAP-Http-Session-Timeout"));
						} else if (that.mHeaders["SAP-ContextId"]) {
							// There was a session, but now it's gone
							sMessage = "Session not found on server";
							Log.error(sMessage, undefined, sClassName);
							that.clearSessionContext(/*bTimeout*/true);
						}
						fnReject(_Helper.createError(jqXHR, sMessage, sRequestUrl,
							sOriginalResourcePath));
					}
				});
			}
Sends the request. Fetches a new security token and resends the request once when the
security token is missing or rejected.

@param {string} sMethod
  HTTP method, e.g. "GET"
@param {string} sResourcePath
  A resource path relative to the service URL for which this requestor has been created
@param {object} [mHeaders]
  Map of request-specific headers, overriding both the mandatory OData V4 headers and the
  default headers given to the factory.
@param {string} [sPayload]
  Data to be sent to the server
@param {string} [sOriginalResourcePath]
 The path by which the resource has originally been requested; MUST NOT be "R#V#C"!
@returns {Promise}
  A promise that is resolved with an object having the properties body, contentType, messages
  and resourcePath. The body is already an object if the contentType is "application/json".
  The messages are retrieved from the "sap-messages" response header. The promise is rejected
  with an error if the request failed.

@private