Нестандартные методы HTTP и компоненты Apache Http

Я пишу HTTP-сервер, используя библиотеку HttpCore из Apache HTTPComponents 4.3 (Java). Мой сервер должен иметь возможность получать запросы с нестандартными методами HTTP (методы, отличные от GET, POST, DELETE и т. д.).

Но когда мой сервер получает такой запрос, он возвращает ответ «метод не поддерживается». Есть ли способ заставить HTTPComponents принимать нестандартные методы HTTP?

Предыстория: я работаю над реализацией сервера WebDAV, который использует нестандартные методы (например, MKCOL и PROPFIND).


person Michael    schedule 08.12.2013    source источник
comment
Какую версию библиотеки HTTPComponents вы используете? v4+ намного лучше справляется с пользовательскими реализациями, такими как WebDAV.   -  person brandonscript    schedule 09.12.2013
comment
Похоже, apache вас прикрыл, нашел проект jackrabbit jackrabbit.apache.org. Я не использовал его, но он похоже хорошее начало   -  person ug_    schedule 09.12.2013
comment
@r3mus К сожалению, извините, забыл указать версию. Я использую версию 4.3 HttpCore. И я не ищу реализацию WebDAV. Я пишу свой собственный как личный проект.   -  person Michael    schedule 09.12.2013
comment
Я могу ошибаться. Вы используете HttpComponents как клиент или как сервер?   -  person Sotirios Delimanolis    schedule 09.12.2013
comment
Нет, я понял - видимо, 4+ справится. Но этот Заяц тоже выглядит довольно симпатично, он избавит вас от некоторых проблем.   -  person brandonscript    schedule 09.12.2013
comment
@SotiriosDelimanolis В качестве сервера. Я использую HttpComponents для создания HTTP-сервера.   -  person Michael    schedule 09.12.2013


Ответы (1)


Я нашел решение, поэтому я отвечу на свой вопрос. хD

Вы должны создать свою собственную реализацию HttpRequestFactory и передать ее по цепочке.

HttpRequestFactory reqFact = new HttpRequestFactory() {
  public HttpRequest newHttpRequest(final RequestLine requestline) throws MethodNotSupportedException {
    return new BasicHttpEntityEnclosingRequest(requestline);
  }

  public HttpRequest newHttpRequest(final String method, final String uri) throws MethodNotSupportedException {
    return new BasicHttpEntityEnclosingRequest(method, uri);
  }
};
HttpMessageParserFactory<HttpRequest> parserFact = new DefaultHttpRequestParserFactory(null, reqFact);
HttpConnectionFactory<DefaultBHttpServerConnection> connFact = new DefaultBHttpServerConnectionFactory(null, parserFact, null)

Реализация, которую HttpComponents использует по умолчанию, выдает MethodNotSupportedException, если найден нестандартный метод HTTP. Исходный код для реализации по умолчанию можно найти здесь:

http://hc.apache.org/httpcomponents-core-4.3.x/httpcore/xref/org/apache/http/impl/DefaultHttpRequestFactory.html

person Michael    schedule 08.12.2013