Небольшой, но мощный многопоточный веб -сервер, написанный полностью в Java SE, а затем перенесен на Android.
Сервер реализует большую часть спецификации HTTP 1.1 и предоставляет пользовательские API сервлета, который можно использовать для обработки динамических страниц. API Servlet разработан после официального API javax.servlet , но он не совместим. Динамические страницы поддерживают файлы cookie, сеансы, загрузки файлов и все остальное для создания общего веб -приложения.
Предоставленная обертка Gradle должна использоваться для построения приложения:
./gradlew clean build При запуске полной сборки в первый раз вы должны сначала установить Android SDK. Вы можете либо установить его вручную, либо использовать следующий скрипт, который загружает и устанавливает все необходимые зависимости в ~/android-sdk .
./installsdk.sh Чтобы все было работать после выхода и входа в систему, настройте переменную среды ANDROID_HOME :
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcПодпроект HTTP является сердцем приложения и не зависит от Android Platform.
На самом деле приложение Android было просто попыткой найти более практичное использование экспериментальной реализации протокола HTTP.
Одна из целей дизайна состояла в том, чтобы сохранить результирующий артефакт по размеру и минималистичный с точки зрения зависимости от других библиотек - он не требует какого -либо стороннего компонента , вся реализация протокола HTTP основана на данных, прочитавших данные из необработанных TCP.
Как только пакет ro.polak.http достаточно зречен, он будет выпущен в качестве независимого артефакта.
Подпроект может быть проверен следующим образом:
./gradlew :http:clean :http:check -PskipAndroidBuildОригинальный код пакета был рефактор и покрыт модуль и интеграционными тестами. Покрытие кода должно быть сохранено выше 90%.
Весь код приложения предназначен для Java 7. Он также компилируется для версий Android SDK <19 (попробуйте с ресурсами не поддерживается, используйте ioutilities.closeillivilit (Closable) в finally в качестве альтернативы при закрытии потоков).
Другое ограничение совместимости состоит в том, что Random вместо ThreadLocalRandom используется для генерации случайных последовательностей в строк.
Мутационные тесты могут быть запускаются путем выполнения следующей команды:
./gradlew :http:clean :http:pitest -PskipAndroidBuild Затем результаты можно найти в http/build/reports/pitest/ro.polak.http/index.html и http/build/reports/pitest/ro.polak.http/mutation.xml .
Стандартный сервер может использоваться для объединения подпроекта http в реализацию запускаемого сервера. Подпроект CLI также не зависит от платформы Android, он не связан с основным APK.
./gradlew :cli:bootRun -PskipAndroidBuildТакже возможно построить один «Uber-Jar» и использовать его в качестве автономного приложения:
./gradlew :cli:fatJar -PskipAndroidBuild Полученный артефакт можно затем захватить с ./cli/build/libs/cli-all.jar .
Авторская банка сервера может быть запущена на любой машине со следующей командой:
java -jar ./cli/build/libs/cli-all.jarjava -jar ./cli/build/libs/cli-all.jar
-Dserver.port=8888
-Dserver.static.path=/www/public_htmlДля полного списка доступных параметров см. Httpd.properties.

Демо -приложение автоматически развернуто в Heroku и может быть достигнуто по адресу:
Обратите внимание, что развернутое приложение не содержит приложения администратора , так как это доступно только для Android. См. Procfile для описания развертывания.
package example ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
import ro . polak . http . servlet . HttpServlet ;
public class HelloWorld extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response ) {
response . getWriter (). print ( "Hello World!" );
}
} package example ;
import java . io . IOException ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . Filter ;
import ro . polak . http . servlet . FilterChain ;
import ro . polak . http . servlet . FilterConfig ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class RequestLoggingFilter implements Filter {
private static final Logger LOGGER = Logger . getLogger ( RequestLoggingFilter . class . getName ());
@ Override
public void init ( FilterConfig filterConfig ) throws ServletException {
// Do nothing
}
@ Override
public void doFilter ( HttpServletRequest request , HttpServletResponse response ,
FilterChain filterChain ) throws IOException , ServletException {
LOGGER . fine ( "Handling incoming request " + request . getRequestURL ());
filterChain . doFilter ( request , response );
}
}Пример сервлетов можно найти в HTTP/SRC/Main/Java/Пример.
Практическое использование фильтров может быть проверено на SecurityFilter.java и LogoutFilter.java приложения администратора.
DeploymentDescriptorBuilder - это альтернатива API традиционному подходу web.xml , целью которого является облегчение регистрации здания и регистрации фильтра. См. Пример кода ниже.
package example ;
import java . util . List ;
import java . util . regex . Pattern ;
import ro . polak . http . configuration . DeploymentDescriptorBuilder ;
import ro . polak . http . configuration . ServerConfig ;
import ro . polak . http . session . storage . SessionStorage ;
class DeploymentDescriptorFactory {
public List < ServletContextWrapper > buildDeploymentDescriptor ( SessionStorage sessionStorage ,
ServerConfig serverConfig ) {
return DeploymentDescriptorBuilder . create ()
. withSessionStorage ( sessionStorage )
. withServerConfig ( serverConfig )
. addServletContext ()
. withContextPath ( "/example" )
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^.*$" ))
. withUrlExcludedPattern ( Pattern . compile ( "^/(?:Login|Logout)" ))
. withFilterClass ( SecurityFilter . class )
. end ()
. addFilter ()
. withUrlPattern ( Pattern . compile ( "^/Logout$" ))
. withFilterClass ( LogoutFilter . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/Index$" ))
. withServletClass ( Index . class )
. end ()
. addServlet ()
. withUrlPattern ( Pattern . compile ( "^/$" ))
. withServletClass ( Index . class )
. end ()
. end ()
. build ();
}
}Служба статических ресурсов реализуется с использованием Defaultservlet
Фактическая загрузка ресурса реализуется путем регистрации ресурса экземпляра в конфигурации сервера.
В настоящее время внедрены два поставщика ресурсов
package ro . polak . http . resource . provider ;
import ro . polak . http . servlet . impl . HttpServletRequestImpl ;
import ro . polak . http . servlet . impl . HttpServletResponseImpl ;
import java . io . IOException ;
public class DummyResourceProvider implements ResourceProvider {
/**
* Tells whether this resource provider can load resource for given path.
*/
@ Override
public boolean canLoad ( final String path ) {
return false ; // TODO Add some logic
}
/**
* Loads the resource for the given path by copying the stream to the response.getOutputStream().
*/
@ Override
public void load ( final String path ,
final HttpServletRequestImpl request ,
final HttpServletResponseImpl response ) throws IOException {
// TODO Load the stream to response.getOutputStream();
}
/**
* Shuts down the resource provider if necessary, usually closes all open resources.
*/
@ Override
public void shutdown () {
}
}В следующем примере представлено, как интегрировать шаблон JTWIG.
Сначала вам нужно добавить зависимость jtwig в свой файл Gradle:
// ...
dependencies {
// ...
compile ' org.jtwig:jtwig-core:5.87.0.RELEASE '
}
// ...Тогда это работает из коробки:
package example ;
import org . jtwig . JtwigModel ;
import org . jtwig . JtwigTemplate ;
import ro . polak . http . exception . ServletException ;
import ro . polak . http . servlet . HttpServlet ;
import ro . polak . http . servlet . HttpServletRequest ;
import ro . polak . http . servlet . HttpServletResponse ;
public class Templating extends HttpServlet {
@ Override
public void service ( HttpServletRequest request , HttpServletResponse response )
throws ServletException {
JtwigTemplate template = JtwigTemplate . inlineTemplate ( "Hello {{ var }}" );
JtwigModel model = JtwigModel . newModel (). with ( "var" , "World" );
template . render ( model , response . getOutputStream ());
}
}






Если вы хотите отправить настоящие SMS, пожалуйста, удалите "& test = 1" из Post Params.
SERVER_IP=192.168.1.1 ; SERVER_PORT=8080 ;
echo " Phone number: " ; read TO ; echo " Message: " ; read MESSAGE ;
wget -qO- --post-data " to= $TO &message= $MESSAGE &test=1 "
http:// $SERVER_IP : $SERVER_PORT /api/1.0/sms/sendAndroid Http Server использует значки из красиво разработанного пакета «Farm-Fresh Web Icons» от Fatcow Web Hosting! Эти наборы значков лицензированы по лицензии Creative Commons Attribution 3.0.
Проект распространяется на лицензию GNU GPLV3.
Если вы заинтересованы в специальной коммерческой лицензии, пожалуйста, бросьте мне линию в piotr [at] polak [dot] ro