renatoathaydes / rawhttp

HTTP library to make it easy to deal with raw HTTP.
Apache License 2.0
201 stars 29 forks source link

Just a question #58

Closed phedroreis closed 2 years ago

phedroreis commented 2 years ago

HI! It´s seem a great Java work on HTTPs requests.

I´m stucked on a very simple problem (i wish), trying to get image files by a kind of URL like this:

https://clubeceticismo.com.br/download/file.php?avatar=147_1649299329.jpg

I am using the code below, which usually works to download any file pointed by the url parameter to the specified pathname parameter. But, in this case, this php script (file.php) just returns an empty file.

I don't know why, but I suppose it´s because the method don´t identify the user-agent and the php script send files only to browsers connections.

Could you help me? Any tip?

    public static void downloadUrl2Pathname(
        final String url, 
        final String pathname
    ) throws MalformedURLException, FileNotFoundException, IOException {

        URL theFile = new URL(url);

        try (

            FileOutputStream fos = new FileOutputStream(pathname);

            ReadableByteChannel rbc = Channels.newChannel(theFile.openStream());

        ) {

            fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE);
        }           

    }//downloadUrl2Pathname() 

Thanks a lot in advance.

By the way... Do You speak Portuguese? Renato Athaydes sounds like brazilian name...

renatoathaydes commented 2 years ago

How is this question related to RawHTTP? If you have Java questions, you can ask them at stackoverflow.com.

Renato Athaydes sounds like brazilian name...

Yes, I am brazilian.

phedroreis commented 2 years ago

Renato, você tem razão. Vou postar no StackOverflow. Me desculpe por qualquer inconveniência.

Mas RawHTTP poderia ser usado para criar um socket para minha aplicação java para conexão com o servidor https:\clubeceticismo.com.br, com um HTTP request que a identificasse como um browser (como o firefox, por exemplo), para que em seguida esta aplicação solicitasse o arquivo https://clubeceticismo.com.br/download/file.php?avatar=147_1649299329.jpg a este servidor?

Eu sei como baixar qualquer arquivo em um servidor web tendo a URL deste arquivo. Mas não sei como identificar a minha aplicação como sendo um browser. Ou seja, como configurar o HEADER de um HTTP request.

Entenda que não estou pedindo que mostre como fazer, apenas pergunto se posso fazer isso com RawHTTP.

Escrevi um programa que faz a cópia estática, incremental, desse fórum. Simplesmente o programa "solicita" aos scripts em PHP criados pelo PhpBB (um sistema de criação de fóruns) que envie todas as páginas HTML do fórum que podem ser geradas e então coleta os dados nestes arquivos para obter a estrutura do sistema de arquivos no servidor, montar uma estrutura análoga na máquina local, e baixar os arquivos do servdior para seus respectivos diretórios na máquina cliente onde estiver rodando esta minha aplicação.

Em seguida edita todos os links que apontam para o servidor (nos arquivos HTMLs obtidos), redirecionando-os para a máquina local.

Ok, funciona perfeitamente e cria na máquina local um simulacro do fórum que pode ser acessado como se fosse o próprio fórum on line.

Fiz em resposta a uma solicitação dos usuários deste fórum e funciona perfeitamente exceto quando o arquivo precisa ser obtido por meio deste script: o file.php

Porque provavelmente este script detecta que a requisição não partiu de um browser e envia um arquivo "vazio".

Portanto gostaria de saber se é possível usar RawHTTP para fazer este request me identificando como um navegador web.

renatoathaydes commented 2 years ago

O browser é identificato pelo user-agent. Portanto, uma request como esta deve ser o que você precisa:

GET https://clubeceticismo.com.br/download/file.php?avatar=147_1649299329.jpg
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:104.0) Gecko/20100101 Firefox/104.0