Java seで完全に記述され、Androidに移植された小規模だが強力なマルチスレッドWebサーバー。
サーバーは、HTTP 1.1仕様のほとんどを実装し、動的ページを処理するために使用できるカスタムサーブレットAPIを提供します。サーブレットAPIは、公式のjavax.servlet APIの後に設計されていますが、互換性がありません。ダイナミックページは、Cookie、セッション、ファイルのアップロードなどをサポートして、共通のWebアプリケーションを構築します。
提供されたGradleラッパーは、アプリケーションの構築に使用する必要があります。
./gradlew clean build初めてフルビルドを実行するときは、最初にAndroid SDKをインストールする必要があります。手動でインストールするか、必要なすべての依存関係を~/android-sdkにダウンロードしてインストールするスクリプトを使用する場合があります。
./installsdk.shログアウトしてログインした後に物事を機能させるには、 ANDROID_HOME環境変数を構成します。
echo " export ANDROID_HOME=~/android-sdk " >> ~ /.bashrc && source ~ /.bashrcHTTPサブプロジェクトはアプリケーションの中心であり、Androidプラットフォームで独立しています。
実際、Androidアプリは、実験的なHTTPプロトコルの実装のより実用的な使用を見つけるための単なる試みでした。
設計目標の1つは、他のライブラリへの依存の観点から、結果として得られるアーティファクトを小さく、ミニマリックに保つことでした。サードパーティのコンポーネントは必要ありません。すべてのHTTPプロトコルの実装は、RAW TCPソケットから読み取られた解析データに基づいています。
ro.polak.httpパッケージが十分に成熟すると、独立したアーティファクトとしてリリースされます。
サブプロジェクトは、次の方法でテストできます。
./gradlew :http:clean :http:check -PskipAndroidBuild元のパッケージコードはリファクタリングされ、ユニットおよび統合テストでカバーされています。コードカバレッジは90%を超えて保持する必要があります。
すべてのアプリケーションコードはJava 7を対象としています。また、Android SDKバージョン<19のコンパイルもコンパイルされます(リソースではサポートされていません。ioutitiess.closeSively(closeable)は、ストリームを閉じる際にfinallyブロックとして使用します)。
別の互換性の制約は、 ThreadLocalRandomの代わりにRandomランダムシーケンスをstringutitivityで生成するために使用されることです
突然変異テストは、次のコマンドを実行することで実行できます。
./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また、1つの「uber-jar」を構築し、スタンドアロンアプリケーションとして使用することも可能です。
./gradlew :cli:fatJar -PskipAndroidBuild結果のアーティファクトは./cli/build/libs/cli-all.jar /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/exampleにあります。
securityfilter.javaおよびlogoutfilter.javaで、フィルターの実際の使用を確認できます。
DeploymentDescriptorBuilderは、サーブレットマッピングの構築とフィルター登録を簡単にすることを目的とした従来のweb.xmlアプローチに代わるAPIの代替品です。以下のコードの例を参照してください。
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を使用して実装されます
実際のリソースの読み込みは、サーバー構成にインスタンスResourceProviderを登録することにより実装されます。
現在、2つのリソースプロバイダーが実装されています
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テンプレートエンジンを統合する方法を示しています。
まず、Gradleファイルにjtwig依存関係を追加する必要があります。
// ...
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を送信する場合は、Post Paramsから「&Test = 1」を削除してください。
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サーバーは、Fatcow Webホスティングによる美しく設計された「Farm-Fresh Webアイコン」パックのアイコンを使用します!これらのアイコンセットは、Creative Commons Attribution 3.0ライセンスの下でライセンスされています。
このプロジェクトは、GNU GPLV3ライセンスで共有されます。
専用の商業ライセンスに興味がある場合はpiotr [at] polak [dot] roで私にラインをドロップしてください