Descrição do problema
No ambiente Windows, o SPS Validator apresenta problemas no gerenciamento do servidor HTTP local nos modos desktop e browser. No modo desktop, iniciado ao clicar no executável, a aplicação escolhe uma porta local livre e abre a interface pelo pywebview. Entretanto, ao clicar nas ações Relatório, HTML ou PDF, o link é aberto no navegador externo, mas a página fica carregando indefinidamente.
A requisição foi testada diretamente com:
curl.exe --noproxy 127.0.0.1 --max-time 5 -v "http://127.0.0.1:PORTA/CAMINHO"
Resultado:
Request completely sent off
Operation timed out after 5002 milliseconds with 0 bytes received
Closing connection
Isso demonstra que:
- A conexão TCP com o servidor local é estabelecida;
- A requisição HTTP é enviada completamente;
- O servidor não retorna sequer os cabeçalhos HTTP.
O modo desktop inicia o servidor com wsgiref.simple_server.make_server(), que processa conexões de forma síncrona. Uma conexão ociosa ou especulativa aberta pelo WebView2, Edge ou outro navegador pode ocupar o único atendimento disponível e impedir que as requisições seguintes sejam processadas. Os links das ações usam target="_blank". O comportamento padrão do pywebview no Windows é abrir esses links no navegador externo, aumentando a possibilidade de múltiplas conexões simultâneas ao servidor local.
No modo browser existe outro problema de usabilidade e ciclo de vida:
-
Sem --port, a aplicação tenta usar a porta 5000;
-
Neste ambiente, a porta 5000 já estava ocupada por outro serviço gRPC;
-
Ao acessar essa porta, o navegador apresentou a mensagem:
Communication with gRPC endpoints must be made through a gRPC client
-
Ao executar o SPS Validator em outra porta, o funcionamento foi normal:
.\spsvalidator.exe --browser --port 50005
Além disso, como o executável Windows é gerado com --windowed, não existe um console visível para usar Ctrl+C. Fechar a aba do navegador não deixa claro se o processo foi encerrado e pode manter o servidor executando em segundo plano.
Passos para reproduzir o problema
Modo desktop
- Execute o SPS Validator no Windows clicando no arquivo
.exe;
- Valide um pacote SPS que gere relatório e prévias;
- Na coluna Ações, clique em Relatório, HTML ou PDF;
- Observe que o navegador externo é aberto;
- Observe que a página permanece carregando sem apresentar resposta;
- Execute
curl.exe para a mesma URL;
- Observe que a conexão é estabelecida, mas nenhum byte é recebido antes do timeout.
Modo browser com a porta padrão ocupada
-
Certifique-se de que outro serviço esteja usando a porta 5000;
-
Execute:
.\spsvalidator.exe --browser
-
Acesse http://127.0.0.1:5000;
-
Observe que a resposta pertence ao outro serviço ou que o SPS Validator não inicia corretamente;
-
Execute novamente usando uma porta livre:
.\spsvalidator.exe --browser --port 50005
-
Acesse http://127.0.0.1:50005;
-
Observe que o SPS Validator funciona normalmente.
Comportamento esperado
Modo desktop
- O servidor HTTP local deve processar múltiplas conexões simultaneamente;
- Relatórios e prévias não devem ficar bloqueados por uma conexão ociosa;
- As ações Relatório, HTML e PDF devem abrir na própria janela do aplicativo;
- Deve existir uma ação clara para voltar ao histórico;
- A porta pode continuar sendo selecionada automaticamente, pois é um detalhe interno;
- Ao fechar a janela nativa, o servidor HTTP e o processo devem ser encerrados;
- O encerramento deve chamar explicitamente
server.shutdown() e aguardar o término do servidor.
Modo browser
- O servidor também deve aceitar múltiplas conexões;
- Quando
--port não for informado, a aplicação deve selecionar uma porta livre e abrir automaticamente a URL correta no navegador;
- Quando uma porta for informada explicitamente e estiver ocupada, a aplicação deve apresentar uma mensagem clara, sem direcionar o usuário para outro serviço;
- A interface deve mostrar a URL/porta utilizada;
- Deve existir uma ação clara, como Encerrar SPS Validator, para finalizar o servidor;
- Fechar somente a aba do navegador não deve ser usado como mecanismo de encerramento, pois esse evento não é confiável;
- O servidor deve continuar restrito a
127.0.0.1.
Sugestão técnica
Utilizar um servidor WSGI com suporte a threads nos dois modos, mantendo uma referência ao objeto do servidor para permitir encerramento explícito.
Uma possibilidade é usar werkzeug.serving.make_server() com threaded=True.
Fluxo sugerido:
Servidor Werkzeug threaded
|
+-- modo desktop
| porta livre automática
| janela pywebview
| ações abertas na própria janela
| fechamento da janela → server.shutdown()
|
+-- modo browser
porta livre ou --port
abertura automática do navegador
ação Encerrar → server.shutdown()
A ação de encerramento pelo navegador deve usar um POST protegido por um token local ou outro mecanismo que impeça uma página externa de finalizar o aplicativo indevidamente.
Critérios de aceitação
Screenshots ou vídeos
N/A
Anexos
N/A
Ambiente utilizado
-
Sistema operacional: Windows 11;
-
Aplicação: SPS Validator executável;
-
Interface desktop: pywebview com WebView2;
-
Navegador externo: Edge e Chrome;
-
Modo desktop: porta local automática;
-
Modo browser funcional:
.\spsvalidator.exe --browser --port 50005
Arquivos relacionados
spsvalidator/src/spsvalidator/main.py
spsvalidator/src/spsvalidator/web/templates/_history_list.html
spsvalidator/src/spsvalidator/web/templates/report.html
spsvalidator/src/spsvalidator/web/routes.py
spsvalidator/packaging/build_windows.ps1
Referências
Descrição do problema
No ambiente Windows, o SPS Validator apresenta problemas no gerenciamento do servidor HTTP local nos modos desktop e browser. No modo desktop, iniciado ao clicar no executável, a aplicação escolhe uma porta local livre e abre a interface pelo
pywebview. Entretanto, ao clicar nas ações Relatório, HTML ou PDF, o link é aberto no navegador externo, mas a página fica carregando indefinidamente.A requisição foi testada diretamente com:
Resultado:
Isso demonstra que:
O modo desktop inicia o servidor com
wsgiref.simple_server.make_server(), que processa conexões de forma síncrona. Uma conexão ociosa ou especulativa aberta pelo WebView2, Edge ou outro navegador pode ocupar o único atendimento disponível e impedir que as requisições seguintes sejam processadas. Os links das ações usamtarget="_blank". O comportamento padrão dopywebviewno Windows é abrir esses links no navegador externo, aumentando a possibilidade de múltiplas conexões simultâneas ao servidor local.No modo browser existe outro problema de usabilidade e ciclo de vida:
Sem
--port, a aplicação tenta usar a porta5000;Neste ambiente, a porta
5000já estava ocupada por outro serviço gRPC;Ao acessar essa porta, o navegador apresentou a mensagem:
Ao executar o SPS Validator em outra porta, o funcionamento foi normal:
Além disso, como o executável Windows é gerado com
--windowed, não existe um console visível para usarCtrl+C. Fechar a aba do navegador não deixa claro se o processo foi encerrado e pode manter o servidor executando em segundo plano.Passos para reproduzir o problema
Modo desktop
.exe;curl.exepara a mesma URL;Modo browser com a porta padrão ocupada
Certifique-se de que outro serviço esteja usando a porta
5000;Execute:
Acesse
http://127.0.0.1:5000;Observe que a resposta pertence ao outro serviço ou que o SPS Validator não inicia corretamente;
Execute novamente usando uma porta livre:
Acesse
http://127.0.0.1:50005;Observe que o SPS Validator funciona normalmente.
Comportamento esperado
Modo desktop
server.shutdown()e aguardar o término do servidor.Modo browser
--portnão for informado, a aplicação deve selecionar uma porta livre e abrir automaticamente a URL correta no navegador;127.0.0.1.Sugestão técnica
Utilizar um servidor WSGI com suporte a threads nos dois modos, mantendo uma referência ao objeto do servidor para permitir encerramento explícito.
Uma possibilidade é usar
werkzeug.serving.make_server()comthreaded=True.Fluxo sugerido:
A ação de encerramento pelo navegador deve usar um
POSTprotegido por um token local ou outro mecanismo que impeça uma página externa de finalizar o aplicativo indevidamente.Critérios de aceitação
pywebview;--portnão é informado;127.0.0.1;Screenshots ou vídeos
N/A
Anexos
N/A
Ambiente utilizado
Sistema operacional: Windows 11;
Aplicação: SPS Validator executável;
Interface desktop:
pywebviewcom WebView2;Navegador externo: Edge e Chrome;
Modo desktop: porta local automática;
Modo browser funcional:
Arquivos relacionados
spsvalidator/src/spsvalidator/main.pyspsvalidator/src/spsvalidator/web/templates/_history_list.htmlspsvalidator/src/spsvalidator/web/templates/report.htmlspsvalidator/src/spsvalidator/web/routes.pyspsvalidator/packaging/build_windows.ps1Referências
wsgiref.simple_server.WSGIServeré baseado no servidor HTTP síncrono do Python:https://docs.python.org/3/library/wsgiref.html
ThreadingMixInpermite atendimento concorrente:https://docs.python.org/3/library/socketserver.html
pywebviewabre links comtarget="_blank"no navegador externo por padrão:https://pywebview.flowrl.com/api/