code.gitea.io/gitea@v1.21.7/web_src/js/modules/fomantic/api.js (about)

     1  import $ from 'jquery';
     2  
     3  export function initFomanticApiPatch() {
     4    //
     5    // Fomantic API module has some very buggy behaviors:
     6    //
     7    // If encodeParameters=true, it calls `urlEncodedValue` to encode the parameter.
     8    // However, `urlEncodedValue` just tries to "guess" whether the parameter is already encoded, by decoding the parameter and encoding it again.
     9    //
    10    // There are 2 problems:
    11    // 1. It may guess wrong, and skip encoding a parameter which looks like encoded.
    12    // 2. If the parameter can't be decoded, `decodeURIComponent` will throw an error, and the whole request will fail.
    13    //
    14    // This patch only fixes the second error behavior at the moment.
    15    //
    16    const patchKey = '_giteaFomanticApiPatch';
    17    const oldApi = $.api;
    18    $.api = $.fn.api = function(...args) {
    19      const apiCall = oldApi.bind(this);
    20      const ret = oldApi.apply(this, args);
    21  
    22      if (typeof args[0] !== 'string') {
    23        const internalGet = apiCall('internal', 'get');
    24        if (!internalGet.urlEncodedValue[patchKey]) {
    25          const oldUrlEncodedValue = internalGet.urlEncodedValue;
    26          internalGet.urlEncodedValue = function (value) {
    27            try {
    28              return oldUrlEncodedValue(value);
    29            } catch {
    30              // if Fomantic API module's `urlEncodedValue` throws an error, we encode it by ourselves.
    31              return encodeURIComponent(value);
    32            }
    33          };
    34          internalGet.urlEncodedValue[patchKey] = true;
    35        }
    36      }
    37      return ret;
    38    };
    39    $.api.settings = oldApi.settings;
    40  }