Content-Length + HttpConnection

Pessoal,

Depois de fazer funcionar o VRaptor usando HttpConnection http://www.guj.com.br/posts/list/214608.java, estou enfrentando uma dificuldade que com certeza deve ser ou uma ebsteira ou então novamente um erro na implementação do VRaptor.

Tenho o seguinte código em um método via @Get

 @Path("/service/metodo")
  public void metodo() {
                String msg = "Message";

		ByteArrayInputStream ba = new ByteArrayInputStream(msg.getBytes());
		
                // Tanto usando desta forma
		result.use(Results.http()).addHeader("Content-Type", "text/plain");
		result.use(Results.http()).addIntHeader("Content-Length", 1000);
		
                // Quanto usando o response injetado pelo construtor (HttpServletResponse)
                // response.setContentType("Contetext/plain");
		//response.setHeader("Content-Length", Long.toString(ba.available()));  
		
		result.use(Results.nothing());

Usando qualquer browser (I.E., Firefox, Chrome, etc…), normalmente recebo as seguintes informações no response:

Response Headers Value
(Status-Line) HTTP/1.0 200 OK
Expires Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie JSESSIONID=PLe0ItKeRvRuBTxqf4agmw;Path=/
Content-Type text/html
Content-Encoding gzip
Date Mon, 09 Aug 2010 16:14:06 GMT
Server Google Frontend
Cache-Control private, x-gzip-ok=""
Content-Length 130
X-Cache MISS from local firewall
X-Cache-Lookup MISS from local firewall
Via 1.0 local firewall (squid/2.6.STABLE18)
Connection keep-alive

Agora chamando este mesmo método usando HttpConnection (J2ME), não recebo o atributo Content-Length, mesmo setando no código, como mostra acima a implementação.

Response Headers Value
(Status-Line) HTTP/1.0 200 OK
Expires Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie JSESSIONID=aLipUInJd77qzHt8yp5UMA;Path=/
Content-Type text/html
Date Mon, 09 Aug 2010 16:09:45 GMT
Server Google Frontend
Cache-Control private, x-gzip-ok=""
X-Cache MISS from local firewall
X-Cache-Lookup MISS from local firewall
Via 1.0 local firewall
Connection close

Estou usando o VRaptor 3.1.0 devido a dificuldade relatada aqui http://www.guj.com.br/posts/list/214608.java

Alguma dica, truque???

Guilherme Elias.

Só para não confundir!
O tamando do Content-length mostrado (130) é baseado na mensagem original enviada e não da palavra usado no códgo de exemplo “Mensagem”

se você recebe no construtor um HttpServletResponse e chama:

response.setContentLength(1000);

funciona?

usar o VRaptor 3.1.3 setando o request header Accept não funcionou pra você?

[]'s

Oi Lucas, é que na verdade para que eu consiga adicionar o accept, teria que mexer em uma lib J2ME que muitos outros sistemas usam. Não sei o impacto que teria nisso. Então risco por risco preferi usar a versão 3.1.0 do VRaptor.

Sobre a tua pergunta sobre o valor 1000, meu exemplo foi infeliz. O correto seria:

String msg = "Message";  
  
ByteArrayInputStream ba = new ByteArrayInputStream(msg.getBytes());  
// Nenhum funciona. Nem este
//response.setHeader("Content-Length", Long.toString(ba.available()));
// nem este
response.setContentLength(String.valueOf(ba.available()));  
response.setContentType("text/plain");  

or

String msg = "Message";  
  
ByteArrayInputStream ba = new ByteArrayInputStream(msg.getBytes());  
result.use(Results.http()).addHeader("Content-Type", "text/plain");  
result.use(Results.http()).addIntHeader("Content-Length", Long.valueOf(ba.available()).intValue());  

A dificuldade é que simplesmente usando HttpConnection o atributo Content-Length não vai no response!

Dependo apenas desta informação (Content-length) para que a parte J2ME identifique que existe algum conteúdo e consiga a ler.

Guilherme Elias.

bom, fazendo um request simples pra um jetty normal ele retorna o content-lenght:

HTTP/1.1 200 OK
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Set-Cookie: JSESSIONID=ife80enj3xkj;Path=/
Content-Type: text/plain
Content-Length: 7
Server: Jetty(6.1.6)

mas acessando o site da caelum, por exemplo, que está no GAE, não retorna esse header por padrão:

HTTP/1.1 200 OK
Expires: Mon, 09 Aug 2010 18:27:50 GMT
Content-Type: text/html; charset=utf-8
Date: Mon, 09 Aug 2010 20:22:00 GMT
Server: Google Frontend
Cache-Control: public, max-age=900
Age: 26
X-XSS-Protection: 0
Transfer-Encoding: chunked

o servidor do google deve estar controlando/sobrescrevendo esse header…

tenta fazer pelo response.setContentLength() e ver se funciona…

Realmente,

Tinha feito já aqui já alguns testes chamando aplicações que conheço no GAE e realmente este atributo usando uma HttpConnection, também não era setado.

Você usou HttpConnection, algo similar ou usou um browser normalmente?

usei o curl, que é de linha de comando… os únicos headers que ele seta são o User-agent e o Accept: .

A documentação do GAE é bem clara sobre os atributos de response.

[quote]For security reasons, the following headers cannot be modified by the application:
Content-Length
Host
Vary
Via
X-Forwarded-For[/quote]

Obrigado pelo feedback,

Mas cuidado, está documentação é clara para Python apenas, não é? http://code.google.com/appengine/docs/python/tools/webapp/responseclass.html
Para o suporte a Java na verdade não temos nada falando sobre isso.

Guilherme Elias.

O font-end é o mesmo para ambas linguagens.

Há uma issue pedindo para incluir o content-length: http://code.google.com/p/googleappengine/issues/detail?id=2719

Justamente, dei uma olhada nesta issue também, ontem a noite!

Contudo, enviei um e-mail para um dos onwers do grupo, pois o grupo não é aberto, sendo necessária a aprovação de algum dos owners para posts.
Vamos ver se ele nos responde. Mantenho a thread atualizada em caso positivo.

Obrigado!

Há uma séries de coisas que vejo no GAE que é de se entender por ser um ambiente em cluster. Todas as limitações deles são bem aceitáveis, exceto algumas poucas como essa aí. Não vejo razão alguma para impedir de que seja “setado” manualmente o content-length. Sem ele o browser não exibe o tempo de download.

Tem mais essa. Bom ponto!

Um workaround seria setar uma propriedade no response ( response.setIntHeader(“Content_Length_GAE”, mensagem.getBytes.length) ) e manipular isso em quem vai receber, no meu caso no lado do mobile!

Não obtive resposta nenhuma do contato que informei acima.

Abraço,
Guilherme Elias