| // Copyright 2015 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "net/test/embedded_test_server/android/embedded_test_server_android.h" | |
| #include "base/android/jni_array.h" | |
| #include "base/android/jni_string.h" | |
| #include "base/android/scoped_java_ref.h" | |
| #include "base/bind.h" | |
| #include "base/files/file_path.h" | |
| #include "base/test/test_support_android.h" | |
| #include "base/trace_event/trace_event.h" | |
| #include "net/test/jni/EmbeddedTestServerImpl_jni.h" | |
| using base::android::JavaParamRef; | |
| using base::android::JavaRef; | |
| using base::android::ScopedJavaLocalRef; | |
| namespace net { | |
| namespace test_server { | |
| EmbeddedTestServerAndroid::ConnectionListener::ConnectionListener( | |
| EmbeddedTestServerAndroid* test_server_android) | |
| : test_server_android_(test_server_android) {} | |
| EmbeddedTestServerAndroid::ConnectionListener::~ConnectionListener() = default; | |
| void EmbeddedTestServerAndroid::ConnectionListener::AcceptedSocket( | |
| const StreamSocket& socket) { | |
| test_server_android_->AcceptedSocket(static_cast<const void*>(&socket)); | |
| } | |
| void EmbeddedTestServerAndroid::ConnectionListener::ReadFromSocket( | |
| const StreamSocket& socket, | |
| int rv) { | |
| test_server_android_->ReadFromSocket(static_cast<const void*>(&socket)); | |
| } | |
| EmbeddedTestServerAndroid::EmbeddedTestServerAndroid( | |
| JNIEnv* env, | |
| const JavaRef<jobject>& jobj, | |
| jboolean jhttps) | |
| : weak_java_server_(env, jobj), | |
| test_server_(jhttps ? EmbeddedTestServer::TYPE_HTTPS | |
| : EmbeddedTestServer::TYPE_HTTP), | |
| connection_listener_(this) { | |
| test_server_.SetConnectionListener(&connection_listener_); | |
| Java_EmbeddedTestServerImpl_setNativePtr(env, jobj, | |
| reinterpret_cast<intptr_t>(this)); | |
| } | |
| EmbeddedTestServerAndroid::~EmbeddedTestServerAndroid() { | |
| JNIEnv* env = base::android::AttachCurrentThread(); | |
| Java_EmbeddedTestServerImpl_clearNativePtr(env, weak_java_server_.get(env)); | |
| } | |
| jboolean EmbeddedTestServerAndroid::Start(JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj, | |
| jint port) { | |
| return test_server_.Start(static_cast<int>(port)); | |
| } | |
| ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetRootCertPemPath( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj) const { | |
| return base::android::ConvertUTF8ToJavaString( | |
| env, test_server_.GetRootCertPemPath().value()); | |
| } | |
| jboolean EmbeddedTestServerAndroid::ShutdownAndWaitUntilComplete( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj) { | |
| return test_server_.ShutdownAndWaitUntilComplete(); | |
| } | |
| ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURL( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj, | |
| const JavaParamRef<jstring>& jrelative_url) const { | |
| const GURL gurl(test_server_.GetURL( | |
| base::android::ConvertJavaStringToUTF8(env, jrelative_url))); | |
| return base::android::ConvertUTF8ToJavaString(env, gurl.spec()); | |
| } | |
| ScopedJavaLocalRef<jstring> EmbeddedTestServerAndroid::GetURLWithHostName( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj, | |
| const JavaParamRef<jstring>& jhostname, | |
| const JavaParamRef<jstring>& jrelative_url) const { | |
| const GURL gurl(test_server_.GetURL( | |
| base::android::ConvertJavaStringToUTF8(env, jhostname), | |
| base::android::ConvertJavaStringToUTF8(env, jrelative_url))); | |
| return base::android::ConvertUTF8ToJavaString(env, gurl.spec()); | |
| } | |
| void EmbeddedTestServerAndroid::AddDefaultHandlers( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj, | |
| const JavaParamRef<jstring>& jdirectory_path) { | |
| const base::FilePath directory( | |
| base::android::ConvertJavaStringToUTF8(env, jdirectory_path)); | |
| test_server_.AddDefaultHandlers(directory); | |
| } | |
| void EmbeddedTestServerAndroid::SetSSLConfig(JNIEnv* jenv, | |
| const JavaParamRef<jobject>& jobj, | |
| jint jserver_certificate) { | |
| test_server_.SetSSLConfig( | |
| static_cast<EmbeddedTestServer::ServerCertificate>(jserver_certificate)); | |
| } | |
| typedef std::unique_ptr<HttpResponse> (*HandleRequestPtr)( | |
| const HttpRequest& request); | |
| void EmbeddedTestServerAndroid::RegisterRequestHandler( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj, | |
| jlong handler) { | |
| HandleRequestPtr handler_ptr = reinterpret_cast<HandleRequestPtr>(handler); | |
| test_server_.RegisterRequestHandler(base::Bind(handler_ptr)); | |
| } | |
| void EmbeddedTestServerAndroid::ServeFilesFromDirectory( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj, | |
| const JavaParamRef<jstring>& jdirectory_path) { | |
| const base::FilePath directory( | |
| base::android::ConvertJavaStringToUTF8(env, jdirectory_path)); | |
| test_server_.ServeFilesFromDirectory(directory); | |
| } | |
| void EmbeddedTestServerAndroid::AcceptedSocket(const void* socket_id) { | |
| JNIEnv* env = base::android::AttachCurrentThread(); | |
| Java_EmbeddedTestServerImpl_acceptedSocket( | |
| env, weak_java_server_.get(env), reinterpret_cast<intptr_t>(socket_id)); | |
| } | |
| void EmbeddedTestServerAndroid::ReadFromSocket(const void* socket_id) { | |
| JNIEnv* env = base::android::AttachCurrentThread(); | |
| Java_EmbeddedTestServerImpl_readFromSocket( | |
| env, weak_java_server_.get(env), reinterpret_cast<intptr_t>(socket_id)); | |
| } | |
| void EmbeddedTestServerAndroid::Destroy(JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj) { | |
| delete this; | |
| } | |
| static void JNI_EmbeddedTestServerImpl_Init( | |
| JNIEnv* env, | |
| const JavaParamRef<jobject>& jobj, | |
| const JavaParamRef<jstring>& jtest_data_dir, | |
| jboolean jhttps) { | |
| TRACE_EVENT0("native", "EmbeddedTestServerAndroid::Init"); | |
| base::FilePath test_data_dir( | |
| base::android::ConvertJavaStringToUTF8(env, jtest_data_dir)); | |
| base::InitAndroidTestPaths(test_data_dir); | |
| new EmbeddedTestServerAndroid(env, jobj, jhttps); | |
| } | |
| } // namespace test_server | |
| } // namespace net |