Posts etiquetados ‘http’

Una herramienta que debería conocer todo programador/administrador de sistemas en cURL, utilizada para automatizar por línea de comandos transferencias de datos los distintos protocolos soportados. Además de este programa por línea de comandos, existe libcURL para poder ser usada desde C/C++ y existen versiones de esta biblitoteca según wikipedia en más de 50 lenguajes, en los que yo destaco C#,PERL,Python y PHP.

Definición Según wikipedia:

[…] cURL es una herramienta para usar en un intérprete de comandos para transferir archivos con sintaxis URL, soporta FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP. cURL soporta certificados HTTPS, HTTP POST, HTTP PUT  […]

Algunos usos frecuentes de cURL.

  • Transferencias de datos en multitud de protocolos
  • Web Testing
  • Testing de servidores FTP.

Instalación de cURL/LibcURL

Para instalar cURL en ubuntu solo hace falta abrir una consola y escribir sudo apt-get install curl, pero yo quiero construir mi propia versión de cURL para que me soporte protocolos con ssl, ssh o rtmp, para ello previamente hay que instalar los siguientes paquetes en Ubuntu:

  • libssl-dev
  • libssh2-1.dev
  • librtmp-dev

Hay que descargar la última versión del código fuente en:  http://curl.haxx.se/, desde donde se puede encontrar la última versión de cURL que hoy es la 7.31.0, una vez se descargue  y se descomprima el tar.gz, se abre una consola dentro de la carpeta de instalación que en mi caso es /home/erjaimer/curl-7.31.0 y se procede a configurar la compilación para que soporte más protocolos:

$>./configure --with-ssl --with-ssh --with-rtmps

La Salida de esta orden es la siguiente, en donde se puede observar en rojo los protocolos soportados:

configure: Configured to build curl/libcurl:

  curl version:     7.31.0
  Host setup:       i386-pc-linux-gnu
  Install prefix:   /usr/local
  Compiler:         gcc
  SSL support:      enabled (OpenSSL)
  SSH support:      enabled (libSSH2)
  zlib support:     enabled
  krb4 support:     no      (--with-krb4*)
  GSSAPI support:   no      (--with-gssapi)
  SPNEGO support:   no      (--with-spnego)
  TLS-SRP support:  enabled
  resolver:         default (--enable-ares / --enable-threaded-resolver)
  ipv6 support:     enabled
  IDN support:      no      (--with-{libidn,winidn})
  Build libcurl:    Shared=yes, Static=yes
  Built-in manual:  enabled
  --libcurl option: enabled (--disable-libcurl-option)
  Verbose errors:   enabled (--disable-verbose)
  SSPI support:     no      (--enable-sspi)
  ca cert bundle:   /etc/ssl/certs/ca-certificates.crt
  ca cert path:     no
  LDAP support:     no      (--enable-ldap / --with-ldap-lib / --with-lber-lib)
  LDAPS support:    no      (--enable-ldaps)
  RTSP support:     enabled
  RTMP support:     enabled (librtmp)
  metalink support: no      (--with-libmetalink)
  Protocols:        DICT FILE FTP FTPS GOPHER HTTP 
  HTTPS IMAP IMAPS POP3 POP3S RTMP RTSP SCP SFTP SMTP SMTPS TELNET TFTP

Faltaría compilar e instalar:

$> sudo make
$> sudo make install

Ahora quedaría testear si tenemos cURL correctamente instalado

$> curl
curl: try 'curl --help' or 'curl --manual' for more information

Ya se podría ejecutar cURL con los siguientes protocolos:

  • DICT
  • FILE
  • FTP
  • FTPS
  • GOPHER
  • HTTP
  • HTTPS
  • IMAP
  • IMAPS
  • POP3
  • POP3S
  • RTMP
  • RTSP
  • SCP
  • SFTP
  • SMTP
  • SMTPS
  • TELNET
  • TFTP

Probando y compilando un ejemplo con libcURL:

Para este post voy a compilar el ejemplo más sencillo un get HTTP, este ejemplo se puede descargar desde https://raw.github.com/bagder/curl/master/docs/examples/simple.c  pero voy a poner su código fuente, el fichero se llamaría http.c si se descarga a nuestro ordenador:

#include <stdio.h>
#include <curl/curl.h>

int main(void)
{
  CURL *curl;
  CURLcode res;

  curl = curl_easy_init();
  if(curl) {
    curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
    /* example.com is redirected, so we tell libcurl to follow redirection */
    curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

    /* Perform the request, res will get the return code */
    res = curl_easy_perform(curl);
    /* Check for errors */
    if(res != CURLE_OK)
      fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

    /* always cleanup */
    curl_easy_cleanup(curl);
  }
  return 0;
}

Para compilar y ejecutar:

$> gcc -o http http.c -lcurl && ./http

La salida sería el código HTML de http://www.example.com, para obtener más información sobre ejemplos y documentación visitar: http://curl.haxx.se/libcurl/c/example.html

Utilizando la ordén cURL

Para obtener el mismo resultado que el programa http compilado anteriormente hay que utilizar la orden de la siguiente manera:

$> curl http://www.example.com

Espero que os sirva.

Un saludo

Una página de referencia para ver que nota tiene tu película favorita es IMDB, este site publica todo tipo de datos de un film incluida su nota en una estrella, si nos fijamos en el código HTML de la estrella:


 

<div class="titlePageSprite star-box-giga-star">8.1</div>



Bastante fácil automatizar un script, en este caso hago un poco de trampa y para simplificar llamare a la shell para usar la orden GET de manera que la función queda así:

sub getIMDBNote
{
    $url = $_[0];
    $html = `GET $url`;
    if( $html !~ m/star-box-giga-star.*/ )
    {
        return -1;
    }    
    @aux = split /star-box-giga-star/,$html;
    return -1  unless @aux;
    @aux2 = split /<\/div>/,$aux[1];
    $num = $aux2[0];
    return ( $num =~ /(\d+\.\d+).*/ )?$1:-1;
}



En el caso que no se encuentre la peli o la URL que se le pasa no encuentra el div con la estrella devuelve un -1, de manera que solo nos quedamos con la nota.

El main de la función quedaría de la siguiente manera:

$sum= 0;
foreach( @ARGV)
{
    my $x = getIMDBNote($_);
    next if( $x == -1);
    print "Note for $_ is $x\n";
    $sum += $x;
}
$num = @ARGV;
print "nota media es ".($sum/$num)."\n";



Por ejemplo si queremos ver la nota media que le proporciona IMDB a las 3 películas de Conan, habría que llamar al script de esta manera:

$>perl imdb.pl http://www.imdb.com/title/tt0087078/ http://www.imdb.com/title/tt0816462/ http://www.imdb.com/title/tt0082198/
Note for http://www.imdb.com/title/tt0087078/ is 5.6
Note for http://www.imdb.com/title/tt0816462/ is 5.2
Note for http://www.imdb.com/title/tt0082198/ is 6.8
nota media es 5.86666666666667



Sobre este método:

  • Es mucho más fácil y limpio acceder si tiene el site una API pública .
  • El script es dependiente del diseño de la página, como se cambie el div adiós al invento.
  • No comprueba si es un film es de IMDB.



En la entrega 2 intentaré mejorar la búsqueda y el cálculo de esta tarea.


Espero que os sirva


Un saludo.

Mandar una petición GET en CakePHP

Publicado: 15 julio, 2012 en cakePHP
Etiquetas:, , , ,

Es bastante fácil ralizar una llamada get usando cakePHP, en concreto la clase HttpSocket, aquí un ejemplo:

            $url= 'http://www.google.es';
	    App::import('Core', 'HttpSocket');
            $HttpSocket = new HttpSocket();
	    $results = $HttpSocket->get($url);
            debug( $HttpSocket->response)



Lo que más me gusta, es la estructuración de la respuesta, si observamos el debug:

   [raw] => Array
        (
            [status-line] => HTTP/1.1 200 OK

            [header] => 
Set-Cookie: NID=61=eDphnIVq941SpaH1ZF8ytEW6lbp1792LW4pfMvMsfy8icehX92LTDNvqaD218yb2t7sY4Mnq6cJhkNpbjJsMu3yrjWBfDD4RVPCodd2oOkM3nAX5NLxP8xNaMsi__N3C; expires=Fri, 11-Jan-2013 10:11:56 GMT; path=/; domain=.google.es; HttpOnly
Date: Thu, 12 Jul 2012 10:11:56 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=ISO-8859-1
Set-Cookie: PREF=ID=721e8af33b9e4e46:FF=0:TM=1342087916:LM=1342087916:S=6wZAQPrxNEY_Vc72; expires=Sat, 12-Jul-2014 10:11:56 GMT; path=/; domain=.google.es
Set-Cookie: NID=61=eDphnIVq941SpaH1ZF8ytEW6lbp1792LW4pfMvMsfy8icehX92LTDNvqaD218yb2t7sY4Mnq6cJhkNpbjJsMu3yrjWBfDD4RVPCodd2oOkM3nAX5NLxP8xNaMsi__N3C; expires=Fri, 11-Jan-2013 10:11:56 GMT; path=/; domain=.google.es; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Connection: close

            [body] => [  ... html quitado para no alagar el post ... ]

[status] => Array
        (
            [http-version] => HTTP/1.1

 => 200
            [reason-phrase] => OK
        )

    [header] => Array
        (
            [Set-Cookie] => Array
                (
                    [0] => NID=61=eDphnIVq941SpaH1ZF8ytEW6lbp1792LW4pfMvMsfy8icehX92LTDNvqaD218yb2t7sY4Mnq6cJhkNpbjJsMu3yrjWBfDD4RVPCodd2oOkM3nAX5NLxP8xNaMsi__N3C; expires=Fri, 11-Jan-2013 10:11:56 GMT; path=/; domain=.google.es; HttpOnly
                    [1] => PREF=ID=721e8af33b9e4e46:FF=0:TM=1342087916:LM=1342087916:S=6wZAQPrxNEY_Vc72; expires=Sat, 12-Jul-2014 10:11:56 GMT; path=/; domain=.google.es
                    [2] => NID=61=eDphnIVq941SpaH1ZF8ytEW6lbp1792LW4pfMvMsfy8icehX92LTDNvqaD218yb2t7sY4Mnq6cJhkNpbjJsMu3yrjWBfDD4RVPCodd2oOkM3nAX5NLxP8xNaMsi__N3C; expires=Fri, 11-Jan-2013 10:11:56 GMT; path=/; domain=.google.es; HttpOnly
                )

            [Date] => Thu, 12 Jul 2012 10:11:56 GMT
            [Expires] => -1
            [Cache-Control] => private, max-age=0
            [Content-Type] => text/html; charset=ISO-8859-1
            [P3p] => CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
            [Server] => gws
            [X-Xss-Protection] => 1; mode=block
            [X-Frame-Options] => SAMEORIGIN
            [Connection] => close
        )
    [ ...... ]
)

 

Además de la forma de estructurar la respuesta, mediante arrays PHP, es bastante efectivo, si por ejemplo solo queremos el código html sería :

  debug($HttpSocket->response['body']);

Si queremos ver las cookies:

  debug($HttpSocket->response['header']['Set-Cookies']);



Fuentes:

Espero que os sirva.

Un saludo.

Mandar una petición GET en C#

Publicado: 5 julio, 2012 en C#, programación
Etiquetas:, , ,

Un lenguaje que siempre me ha gustado es C# y como ahora estoy investigando sobre todo en el protocolo HTTP, me he puesto a ver como trabaja este lenguaje, el código es  bastante simple:

 class Program
    {
        public static string HttpGet(string URI) 
        {
           System.Net.WebRequest req = System.Net.WebRequest.Create(URI);
           System.Net.WebResponse resp = req.GetResponse();
           System.IO.StreamReader sr = new System.IO.StreamReader(resp.GetResponseStream());
           return sr.ReadToEnd().Trim();
        }
        static void Main(string[] args)
        {
            string url = "http://www.google.es";
            System.Console.Write(HttpGet(url));
            System.Console.Read();
        }
    }

Fuente:

Espero que os sirva.

Un saludo.