Должен ли я кодировать параметры URL в URI Camel Enpoint

#multithreading #apache-camel

#многопоточность #apache-camel

Вопрос:

В моем текущем проекте все URI конечных точек camel передаются через org.apache.commons.codec.net.URLCodec.encode() Первоначальные разработчики больше не работают в компании, и я понятия не имею, почему они это сделали.

Есть ли какая-либо веская причина для этого? Я нигде раньше этого не видел.

Теперь настоящая причина, почему я спрашиваю об этом. У нас есть маршрут, который (после упрощения) выглядит следующим образом:

     from("direct:start")
      .split(getFilesToProcess()).parallelProcessing().threads(3, 3)
          .pollEnrich("file:///data/inbox?fileName=" encode("${body.fileName}") "amp;move=" encode("../.done/${in.header.CamelFileName.substring(0,6)}/${date:now:yyyyMM}/${file:onlyname}"))
          .to("direct:processFile");
  

Этот код ведет себя очень странно при кодировании параметров в URI файла. Когда несколько файлов обрабатываются параллельно: pollEnrich компонент начинает смешивать файлы, которые передаются через ${body.fileName} , или даже извлекать один и тот же файл несколько раз.

Когда я удаляю кодировку URL для параметров, я никогда не вижу, чтобы pollEnricher подбирал неправильные файлы. Таким образом, похоже, что комбинация использования pollEnrich() в parallelProcessing() блоке с URLCodec.encode() вызывает какую-то небезопасную проблему с потоками в исходном коде camel.

Мы используем camel версии 2.21.5

Комментарии:

1. Оказывается, проблемы с параллелизмом были вызваны классом URLCodec, который не является потокобезопасным (по крайней мере, не в версии 1.9, которую я использовал). Однако, даже с commons-codec-1.14 (проблема с потоками исправлена в 1.11), у меня все еще возникают неправильные файлы, если я кодирую параметр fileName =${body.fileName}

2. encode метод вызывается только один раз на этапе настройки. Он просто создает строку один раз, и Camel использует эту строку, поэтому нет места для небезопасных операций. Я думаю, что ваш коллега каким-то образом нашел с помощью двойного кодирования хакерский способ суперперехода опции безопасности jailStartingDirectory 🙂 . По умолчанию Apache Camel запрещает перемещение файла за пределы начального каталога. Попробуйте удалить всю двойную кодировку и добавить jailStartingDirectory=false

Ответ №1:

Смотрите здесь, в документах Camel

При настройке параметров конечной точки с использованием синтаксиса URI, значения по умолчанию кодируются в URI

Когда вы их тоже кодируете, они кодируются дважды. Я думаю, что это может быть проблемой, когда закодированный символ содержит символы, которые кодируются повторно. Я весьма удивлен, что у вас нет никаких проблем из-за этого.

Кодировка Camel по умолчанию также является причиной того, что существует необработанная функция для передачи значений в исходной форме, потому что кодировка уничтожила бы их (например, пароли).

Комментарии:

1. Оказывается, что выражение ${в.header. CamelFileName.substring(0,6)} в опции перемещения не работает без (двойного) кодирования.