Эмулятор Android не может подключиться к локальному серверу разработки: HttpException: соединение закрыто до получения пAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Эмулятор Android не может подключиться к локальному серверу разработки: HttpException: соединение закрыто до получения п

Сообщение Anonymous »

В настоящее время мы разрабатываем небольшое приложение с помощью платформы Flutter и столкнулись с проблемой https-запросов к нашему локальному серверу разработки.
В качестве сервера мы используем сервер Python Django, который мы работают как Docker-контейнер в Docker Compose. Мы используем прокси-сервер Nginx для обработки запросов http и https.
Файл конфигурации Nginx выглядит следующим образом:

Код: Выделить всё

upstream randomName.moreRandomName {
server moreRandomName:8000;
}

server {
listen 80;
listen [::]:80;

server_name localhost 0.0.0.0 127.0.0.1 ;
return 301 https://$host$request_uri;
}

server {
listen 443 ssl;
listen [::]:443;

server_name localhost 0.0.0.0 127.0.0.1 ;
ssl_certificate     /etc/nginx/certs/fullchain.pem;
ssl_certificate_key /etc/nginx/certs/privkey.pem;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;

location / {
proxy_pass http://moreRandomName:8000/;
}
}
Возможно, стоит упомянуть, что серверная часть Django использует Gunicorn перед своей службой, которая привязана к порту 8000 в Docker.
Ssl-сертификаты создаются с помощью локального сертификата. Авторизация с использованием mkcert.

Код: Выделить всё

mkcert --install
и

Код: Выделить всё

mkcert localhost 127.0.0.1 0.0.0.0
Для доступа к локальному бэкэнду мы создаем HttpClient во флаттере для передачи SecurityContext. Этот контекст безопасности получает файл .pem из mkcert следующим образом:

Код: Выделить всё

ByteData certs = await rootBundle.load('assets/certificates/fullchain.pem');
securityContext.setTrustedCertificatesBytes(certs.buffer.asUint8List());
Очень упрощенный https-запрос выглядит так:

Код: Выделить всё

// For Android
const String backendURL = "10.0.2.2";
// For IOS
//const String backendURL = "127.0.0.1";
final endpointPath = "/auth/";

final securityContext = SecurityContext.defaultContext;
ByteData certs = await rootBundle.load('assets/certificates/fullchain.pem');
securityContext.setTrustedCertificatesBytes(certs.buffer.asUint8List());

final client = HttpClient(context: securityContext);
request = await client.getUrl(
Uri.https(
backendURL,
endpointPath,
),
);
final response = await request.close();
if (response != null) {
if (response.statusCode == HttpStatus.ok) {
var responseBodyAsJson =
jsonDecode(await response.transform(utf8.decoder).join());
Это работает с симулятором iOS в 100% всех случаев. Эмулятор Android также работает с этими настройками для доступа к реальному серверу, на котором размещен наш бэкэнд, с помощью

Код: Выделить всё

const String backendURL = "realbackendurl.com";
Наши физические устройства, подключающиеся к реальному серверу, также работают с этим параметром.
Но использование нашего локального сервера разработки в Docker работает только с IOS Simulator. Для эмулятора Android с 10.0.2.2 в качестве внутреннего адреса мы получаем следующую ошибку:
HttpException: соединение закрыто до получения полного заголовка
Единственный ответ, который мы получаем в журналах от контейнера nginx, следующий:
рабочий процесс 24 завершился по сигналу 4Мы не можем просто использовать простой подход, используя import 'package:http/http.dart' как http;, потому что мы не можем получить доступ к контексту безопасности для сертификатов.
Если у вас есть вопросы, дайте мне знать. Любая помощь приветствуется!
Мы изменили все возможные внутренние адреса и проверили различные настройки, как описано выше.
Мы использовали разные устройства и эмуляторы. Как описано выше, ошибка остается для каждого эмулятора Android. Если у вас есть какие-либо предложения, дайте нам знать! Большое спасибо.
Изменить: мы используем уровень API 35. Мы уже пытались перейти на более низкие уровни API, такие как Pie или Q. Не сработало.

Подробнее здесь: https://stackoverflow.com/questions/786 ... connection
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»