Autor Tema: Socks  (Leído 1160 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Ara

  • Novato
  • *
  • Mensajes: 9
  • Karma: +0/-1
Socks
« en: Enero 02, 2010, 10:38:01 am »
Hola,

Cómo puedo saber si el estado de una conexión http es 200?

Código: [Seleccionar]
on 1:sockopen:conex: {
  if ($sock(conex).status != 200) {
    echo -a Error de conexión
halt
  }

  ;...
}

Qué tipo de errores da $sockerr?

Muchas gracias  :-*

Desconectado Red_Erik

  • Moderador Global
  • Miembro Senior
  • ****
  • Mensajes: 347
  • Karma: +10/-0
  • Sexo: Masculino
Re: Socks
« Respuesta #1 en: Enero 02, 2010, 11:53:48 am »
La propiedad .status del identificador $sock($sockname) no es un valor numérico sino que adquiere valores como connecting, active, etc.
Si lo que quieres comprobar es si la conexión HTTP ha sido exitosa, es decir, recibes un código 200 tras enviar el GET, debes utilizar el identificador $sockerr. Cualquier valor mayor de cero que recibas será un indicador de error en la operación.

on 1:sockopen:conex: {
   if ( $sockerr > 0 ) { echo ERROR | return }

  ;...
}


Aquí una lista de los valores para $sockerr.


SOCKOPEN
0: Correcto
3: Error en el establecimiento de conexión
4: Error resolviendo el host
SOCKLISTEN
0: Correcto
1: Error ocurrido al escuchar sockets
2: Error al aceptar un nuevo socket
4: No hay memoria para un socket nuevo
SOCKREAD
0: Datos recibidos correctamente
3: Error al conectar
SOCKWRITE
0: Todos los datos escritos correctamente
3: Error de escritura
SOCKCLOSE
0: EOF recibido correctamente
3: Error recibiendo DATA, o error SSL
5: error SSL durante el sockopen

Como ves, cualquier valor distinto (mayor) de cero es una señal de que algo ha ido mal.

Recuerda finalizar cualquier script que use sockets con un sockclose.
« última modificación: Enero 02, 2010, 12:26:03 pm por Red_Erik »

Desconectado Ara

  • Novato
  • *
  • Mensajes: 9
  • Karma: +0/-1
Re: Socks
« Respuesta #2 en: Enero 02, 2010, 07:36:22 pm »
Gracias por la respuesta,

Verifico que $sockerr sea 0 para continuar, pero por ejemplo si hay un error 404 o 301 el archivo se descarga y sale el html, por ejemplo:

Código: [Seleccionar]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL /prueba.txt was not found on this server.</p>
<p>Additionally, a 404 Not Found
error was encountered while trying to use an ErrorDocument to handle the request.</p>
<hr>
<address>Apache/2.2.14 (Unix) mod_ssl/2.2.14 OpenSSL/0.9.8l DAV/2 mod_auth_passthrough/2.1 FrontPage/5.0.2.2635 Server at XXX Port 80</address>
</body></html>

Entonces cómo sé si la conexión fue 200? Quizá tengo algo mal y el $sockerr debería tener un valor mayor que cero por el 404?

Muchas gracias :)

Desconectado Red_Erik

  • Moderador Global
  • Miembro Senior
  • ****
  • Mensajes: 347
  • Karma: +10/-0
  • Sexo: Masculino
Re: Socks
« Respuesta #3 en: Enero 02, 2010, 10:13:40 pm »
Los sockets en mIRC es un recurso limitado, sobre todo si se quieren usar para abrir sitios web. Con ingenio se puede solucionar, pero a veces requiere complicados usos de $replace que no siempre funcionan. Yo tengo por ahí varios add-ons que hacen uso de sockets y no son estables porque los códigos html varían.

Creo que lo que debes chequear es que tras el sockwrite recibas una línea con el 200 OK. Si esto no es así cancela el resto del script. Por ejemplo, usando de forma esquemática mi add-on del IRCpalm. En la sección del traductor, abrimos el sock Trad para la url babylon. Así:

  sockopen Trad online.babylon.com 80


A continuación se dispara el evento sockopen, y enviamos todos los datos al servidor:

on 1:sockopen:Trad: {
  if ( $sockerr > 0 ) { ERROR | return }
  sockwrite -n Trad GET %url.Trad HTTP/1.1
  sockwrite -n Trad Accept: text/html ; CHARSET=UTF-8
  sockwrite -n Trad Range: bytes=0-
  sockwrite -n Trad Host: http://online.babylon.com
  sockwrite -n Trad User-Agent: traductor
  sockwrite -n Trad $crlf
}



La respuesta, si la url es correcta debe ser un 200 OK en el header del código. Es decir, antes de las llaves <html>



HTTP/1.0 200 OK
Date: Sat, 02 Jan 2010 20:42:15 GMT
Server: Apache
Connection: close
Content-Type: text/html
<html>
<title>Translators - Babylon, The Single-Click-Translator and English on-line dictionary</title>
<body>Sorry, No translation found.Please Check your spelling.</body>
</html>



A ver si así te sirve, sino chequea el add-on y cge el código que quieras.
Saludos.
« última modificación: Enero 02, 2010, 10:19:14 pm por Red_Erik »

Desconectado Ara

  • Novato
  • *
  • Mensajes: 9
  • Karma: +0/-1
Re: Socks
« Respuesta #4 en: Enero 03, 2010, 07:57:38 am »
No tenía lo de HTTP/1.1 en el GET, por eso no veía las cabeceras xD

Ahora las veo, el archivo se descarga con ellas, puedo comprobar si es status 200, pero se siguen quedando ahí. Y no hay un comando para borrar una línea de un archivo, no? También podría copiar de un archivo dejando las cabeceras...

Lo que he hecho es que en el sockread he leído la 1º línea, si era "HTTP/1.1 200 OK" es que iba bien. Luego iba leyendo líneas hasta encontrar una vacía. A partir de ahí empiezan los datos así que he usado &cache. El problema es que tarda un montón con eso de leer líneas, además si el GET no es un archivo, sólo es texto, se añaden caracteres extra al principio y al final (por ejemplo me salía e0 al principio y 0 al final)

Entonces la pregunta es qué es lo que haces con $replace, sobre qué lo aplicas? Sobre &cache (se puede?)? sobre una variable temporal? Sobre un archivo?

Al final descargaré el archivo y copiaré línea por línea sin las cabs ^^

Saludos y gracias :P


Edito --------------

Descargo el archivo con &cache y cabeceras, compruebo que la primera línea sea status 200 y luego:

while ($read(%file,1)) write -dl1 %file
write -dl1 %file

Mientras que exista la línea 1 bórrala, luego bórrala otra vez

Es decir, en el archivo están las cabs, salto de línea y datos. Pues borra las cabs y el salto :D

(Me queda solucionar los caracteres extras que salen cuando el GET no es un archivo)

Saludos!
« última modificación: Enero 03, 2010, 08:44:33 am por Ara »