docs: @Override
    public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp) throws IOException {
      String action;
      if ((action = req.getParams().get(PARAM_ACTION)) != null) {
        // generate list of files
        if (action.equals(ACTION_CONFIG_FILES)) {
          String configDir = req.getCore().getResourceLoader().getConfigDir();
          rsp.add(ACTION_CONFIG_FILES, getFiles(configDir, null));
          // get file
        } else if (action.equals(ACTION_CONFIG_FILE)) {
          String file = req.getParams().get(PARAM_CONFIG_FILE, null);
          if (file != null && !file.contains("..") && !file.startsWith("/")) {
            InputStream is;
            try {
              is = req.getCore().getResourceLoader().openResource(file);
              rsp.add(ACTION_CONFIG_FILE, IOUtils.toString(is, StandardCharsets.UTF_8));
            } catch (IOException e) {
              log.debug(e);
              rsp.add(MESSAGE_ERROR, e.getMessage());
            }
          }
          // test mapping
        } else if (action.equals(ACTION_MAPPING)) {
          String configuration = null;
          String document = null;
          String documentUrl = null;
          if (req.getContentStreams() != null) {
            Iterator<ContentStream> it = req.getContentStreams().iterator();
            if (it.hasNext()) {
              ContentStream cs = it.next();
              Map<String, String> params = new HashMap<>();
              getParamsFromJSON(params, IOUtils.toString(cs.getReader()));
              configuration = params.get(PARAM_MAPPING_CONFIGURATION);
              document = params.get(PARAM_MAPPING_DOCUMENT);
              documentUrl = params.get(PARAM_MAPPING_DOCUMENT_URL);
            }
          } else {
            configuration = req.getParams().get(PARAM_MAPPING_CONFIGURATION);
            document = req.getParams().get(PARAM_MAPPING_DOCUMENT);
            documentUrl = req.getParams().get(PARAM_MAPPING_DOCUMENT_URL);
          }
          if (configuration != null && documentUrl != null) {
            InputStream stream = IOUtils.toInputStream(configuration, StandardCharsets.UTF_8);
            try (MtasTokenizer tokenizer = new MtasTokenizer(stream);) {
              MtasFetchData fetchData = new MtasFetchData(new StringReader(documentUrl));
              rsp.add(ACTION_MAPPING, tokenizer.getList(fetchData.getUrl(null, null)));
              tokenizer.close();
            } catch (IOException | MtasParserException e) {
              log.debug(e);
              rsp.add(MESSAGE_ERROR, e.getMessage());
            } finally {
              stream.close();
            }
          } else if (configuration != null && document != null) {
            InputStream stream = IOUtils.toInputStream(configuration, StandardCharsets.UTF_8);
            try (MtasTokenizer tokenizer = new MtasTokenizer(stream);) {
              rsp.add(ACTION_MAPPING, tokenizer.getList(new StringReader(document)));
              tokenizer.close();
            } catch (IOException e) {
              log.debug(e);
              rsp.add(MESSAGE_ERROR, e.getMessage());
            } finally {
              stream.close();
            }
          }
        } else if (action.equals(ACTION_RUNNING) || action.equals(ACTION_HISTORY) || action.equals(ACTION_ERROR)) {
          boolean shardRequests = req.getParams().getBool(PARAM_SHARDREQUESTS, false);
          int number;
          try {
            number = Integer.parseInt(req.getParams().get(PARAM_NUMBER));
          } catch (NumberFormatException e) {
            number = defaultNumber;
          }
          if (action.equals(ACTION_RUNNING)) {
            rsp.add(ACTION_RUNNING, running.createListOutput(shardRequests, number));
          } else if (action.equals(ACTION_HISTORY)) {
            rsp.add(ACTION_HISTORY, history.createListOutput(shardRequests, number));
          } else if (action.equals(ACTION_ERROR)) {
            rsp.add(ACTION_ERROR, error.createListOutput(shardRequests, number));
          }
        } else if (action.equals(ACTION_STATUS)) {
          String key = req.getParams().get(PARAM_KEY, null);
          String abort = req.getParams().get(PARAM_ABORT, null);
          MtasSolrStatus solrStatus = null;
          if ((solrStatus = history.get(key)) != null || (solrStatus = running.get(key)) != null
              || (solrStatus = error.get(key)) != null) {
            if (abort != null && !solrStatus.finished()) {
              solrStatus.setError(abort);
            }
            rsp.add(ACTION_STATUS, solrStatus.createItemOutput());
          } else {
            rsp.add(ACTION_STATUS, null);
          }
        }
      }
    }