Jump to content


Photo

Uso de Curl - Como leer mensajes de error


  • Please log in to reply
5 replies to this topic

#1 DIEGO.CHAVEZ

DIEGO.CHAVEZ

    Member

  • Miembros
  • PipPip
  • 15 posts

Posted 01 October 2014 - 12:15 PM

Hola que tal estoy haciendo uso de la libreria de curl, pero no tengo idea de como detectar los mensajes de error esta linea dice que muestra mensajes

[nobbc] // Indicamos que muestre mensajes de todo lo que va haciendo
    if curl_easy_setopt(Curl, CURLOPT_VERBOSE, TRUE) <> CURLE_OK then
      Exit;[/nobbc]

pero donde se guardan o como puedo recibirlos alguien tiene alguna idea me base en los post de Seoane y Egostar, ojala pudiera alguien orientarme .

por ejemplo que  pasa si el archivo que quiero subir ya existe o como saber si existe?
o si se perdio la conexion a internet deberia arrojarme un error pero como detecto ese tipo de errores

Espero alguien pueda ayudarme





delphi
  1. function TTressShell.Subir(Usuario, Clave, URL, Archivo,llave,llaveprivate: AnsiString): Boolean;
  2. var
  3.   Curl: TCURL;
  4.   Stream: TFileStream;
  5. begin
  6.   Result:= FALSE;
  7.   Curl:= curl_easy_init;
  8.   if Curl <> nil then
  9.   try
  10.     // Indicamos que muestre mensajes de todo lo que va haciendo
  11.     if curl_easy_setopt(Curl, CURLOPT_VERBOSE, TRUE) <> CURLE_OK then
  12.       Exit;
  13.     // Le decimos que uses SSL
  14.     if curl_easy_setopt(Curl, CURLOPT_USE_SSL, CURLUSESSL_ALL) <> CURLE_OK then
  15.       Exit;
  16.     // No verificamos la identidad del servidor, suponemos que es quien dice ser.
  17.     if curl_easy_setopt(Curl, CURLOPT_SSL_VERIFYPEER, FALSE) <> CURLE_OK then
  18.       Exit;
  19.   // Indicamos el usuario
  20.     if curl_easy_setopt(Curl, CURLOPT_USERNAME, PAnsiChar(Usuario)) <> CURLE_OK then
  21.       Exit;
  22.     // El password
  23.     if curl_easy_setopt(Curl, CURLOPT_PASSWORD, PAnsiChar(Clave)) <> CURLE_OK then
  24.       Exit;
  25.     // La URL del tipo: sftp://servidor/rutadelfichero
  26.     if curl_easy_setopt(Curl, CURLOPT_URL, PAnsiChar(URL)) <> CURLE_OK then
  27.       Exit;
  28.       //decimos que utilize la llave publica para conectarse
  29.  
  30.     if curl_easy_setopt(Curl, CURLOPT_SSH_PUBLIC_KEYFILE, PAnsiChar(llave)) <> CURLE_OK then
  31.       Exit;
  32.     if curl_easy_setopt(Curl, CURLOPT_SSH_PRIVATE_KEYFILE, PAnsiChar(llaveprivate)) <> CURLE_OK  then
  33.     Exit;
  34.     // Le indicamos que funcion debe usar para leer el stream
  35.     if curl_easy_setopt(Curl, CURLOPT_READFUNCTION, @ReadFromStream) <> CURLE_OK then
  36.       Exit;
  37.     // Creamos un stream a partir de un archivo
  38.     Stream:= TFileStream.Create(Archivo,fmOpenRead);
  39.     try
  40.       // Aqui le indicamos el stream que debe subir
  41.       if curl_easy_setopt(Curl, CURLOPT_INFILE, Stream) <> CURLE_OK then
  42.         Exit;
  43.       // Aqui le indicamos que la operacion es de subida
  44.       if curl_easy_setopt(Curl, CURLOPT_UPLOAD, TRUE) <> CURLE_OK then
  45.         Exit;
  46.       // Ejecutamos el comando
  47.       Result:= curl_easy_perform(Curl) = CURLE_OK;
  48.     finally
  49.       Stream.Free;
  50.     end;
  51.   finally
  52.     curl_easy_cleanup(Curl);
  53.   end;
  54. end;




  • 0

#2 seoane

seoane

    Advanced Member

  • Administrador
  • 1259 posts
  • LocationEspaña

Posted 02 October 2014 - 04:46 AM

La opcion CURLOPT_VERBOSE le indica a Curl que, en los programas de consola,  muestre paso a paso todo lo que esta haciendo. En principio solo tiene sentido tener activa esta opcion cuando estas haciendo el "debug" de tu aplicacion, nunca en la version final.

Por otro lado, la funcion curl_easy_perform devuleve CURLE_OK si todo fue bien, pero si algo falla devuelve el error correspondiente.

Lista de errores:


delphi
  1.     CURLE_UNSUPPORTED_PROTOCOL,
  2.     CURLE_FAILED_INIT,
  3.     CURLE_URL_MALFORMAT,
  4.     CURLE_OBSOLETE4,
  5.     CURLE_COULDNT_RESOLVE_PROXY,
  6.     CURLE_COULDNT_RESOLVE_HOST,
  7.     CURLE_COULDNT_CONNECT,
  8.     CURLE_FTP_WEIRD_SERVER_REPLY,
  9.     CURLE_REMOTE_ACCESS_DENIED,
  10.     CURLE_OBSOLETE10,
  11.     CURLE_FTP_WEIRD_PASS_REPLY,
  12.     CURLE_OBSOLETE12,
  13.     CURLE_FTP_WEIRD_PASV_REPLY,
  14.     CURLE_FTP_WEIRD_227_FORMAT,
  15.     CURLE_FTP_CANT_GET_HOST,
  16.     CURLE_OBSOLETE16,
  17.     CURLE_FTP_COULDNT_SET_TYPE,
  18.     CURLE_PARTIAL_FILE,
  19.     CURLE_FTP_COULDNT_RETR_FILE,
  20.     CURLE_OBSOLETE20,
  21.     CURLE_QUOTE_ERROR,
  22.     CURLE_HTTP_RETURNED_ERROR,
  23.     CURLE_WRITE_ERROR,
  24.     CURLE_OBSOLETE24,
  25.     CURLE_UPLOAD_FAILED,
  26.     CURLE_READ_ERROR,
  27.     CURLE_OUT_OF_MEMORY,
  28.     CURLE_OPERATION_TIMEDOUT,
  29.     CURLE_OBSOLETE29,
  30.     CURLE_FTP_PORT_FAILED,
  31.     CURLE_FTP_COULDNT_USE_REST,
  32.     CURLE_OBSOLETE32,
  33.     CURLE_RANGE_ERROR,
  34.     CURLE_HTTP_POST_ERROR,
  35.     CURLE_SSL_CONNECT_ERROR,
  36.     CURLE_BAD_DOWNLOAD_RESUME,
  37.     CURLE_FILE_COULDNT_READ_FILE,
  38.     CURLE_LDAP_CANNOT_BIND,
  39.     CURLE_LDAP_SEARCH_FAILED,
  40.     CURLE_OBSOLETE40,
  41.     CURLE_FUNCTION_NOT_FOUND,
  42.     CURLE_ABORTED_BY_CALLBACK,
  43.     CURLE_BAD_FUNCTION_ARGUMENT,
  44.     CURLE_OBSOLETE44,
  45.     CURLE_INTERFACE_FAILED,
  46.     CURLE_OBSOLETE46,
  47.     CURLE_TOO_MANY_REDIRECTS ,
  48.     CURLE_UNKNOWN_TELNET_OPTION,
  49.     CURLE_TELNET_OPTION_SYNTAX ,
  50.     CURLE_OBSOLETE50,
  51.     CURLE_PEER_FAILED_VERIFICATION,
  52.     CURLE_GOT_NOTHING,
  53.     CURLE_SSL_ENGINE_NOTFOUND,
  54.     CURLE_SSL_ENGINE_SETFAILED,
  55.     CURLE_SEND_ERROR,
  56.     CURLE_RECV_ERROR,
  57.     CURLE_OBSOLETE57,
  58.     CURLE_SSL_CERTPROBLEM,
  59.     CURLE_SSL_CIPHER,
  60.     CURLE_SSL_CACERT,
  61.     CURLE_BAD_CONTENT_ENCODING,
  62.     CURLE_LDAP_INVALID_URL,
  63.     CURLE_FILESIZE_EXCEEDED,
  64.     CURLE_USE_SSL_FAILED,
  65.     CURLE_SEND_FAIL_REWIND,
  66.     CURLE_SSL_ENGINE_INITFAILED,
  67.     CURLE_LOGIN_DENIED,
  68.     CURLE_TFTP_NOTFOUND,
  69.     CURLE_TFTP_PERM,
  70.     CURLE_REMOTE_DISK_FULL,
  71.     CURLE_TFTP_ILLEGAL,
  72.     CURLE_TFTP_UNKNOWNID,
  73.     CURLE_REMOTE_FILE_EXISTS,
  74.     CURLE_TFTP_NOSUCHUSER,
  75.     CURLE_CONV_FAILED,
  76.     CURLE_CONV_REQD,
  77.     CURLE_SSL_CACERT_BADFILE,
  78.     CURLE_REMOTE_FILE_NOT_FOUND,
  79.     CURLE_SSH,
  80.     CURLE_SSL_SHUTDOWN_FAILED,
  81.     CURLE_AGAIN,
  82.     CURLE_SSL_CRL_BADFILE,
  83.     CURLE_SSL_ISSUER_ERROR,
  84.     CURLE_FTP_PRET_FAILED,
  85.     CURLE_RTSP_CSEQ_ERROR,
  86.     CURLE_RTSP_SESSION_ERROR,
  87.     CURLE_FTP_BAD_FILE_LIST,
  88.     CURLE_CHUNK_FAILED,
  89.     CURL_LAST



Consulta la ayuda de libCurl para ver que significa cada una
  • 0

#3 DIEGO.CHAVEZ

DIEGO.CHAVEZ

    Member

  • Miembros
  • PipPip
  • 15 posts

Posted 02 October 2014 - 10:12 AM

Muchas gracias!!  Seoane y los de egostar  me han ayudado demasiado! Y navengado en el foro llegue a este  post donde viene un ejemplo de como  se manejan los errores me base en eso y logre realizar lo que necesitaba  ya funciona al 100.

Dejo el link por si a alguien le puede servir

http://www.delphiacc...-return-nothing

  • 0

#4 DIEGO.CHAVEZ

DIEGO.CHAVEZ

    Member

  • Miembros
  • PipPip
  • 15 posts

Posted 02 October 2014 - 10:14 AM

Muchas gracias!!
  • 0

#5 DIEGO.CHAVEZ

DIEGO.CHAVEZ

    Member

  • Miembros
  • PipPip
  • 15 posts

Posted 02 October 2014 - 04:39 PM

Perdon por el triple post pero creo que esto pudiera servirle a alguien ,Me  he creado esta funcion que añadí a la libreria curl que encontre aquí en el foro, la uso para obtener mensajes de error mas detallados
la funcion devuelve un string y recibe un  CURLcode, dejo esto por si a alguien le sirve ya que me tomo algo de tiempo  investigar como mostrar errores mas detallados con curl

Esta es  la llamada normal y en caso de algun erro solo ejecuta el exit


delphi
  1. if curl_easy_setopt(Curl, CURLOPT_VERBOSE, TRUE) <> CURLE_OK then
  2.     Exit;


Y asi es con la funcion que obtiene el error



delphi
  1.   ShowMessage(  GetCurlError(curl_easy_setopt(Curl, CURLOPT_VERBOSE, TRUE)) )


En caso de error muestra el error y en caso de exito solo muestra "Proceso Exitoso", creo que existe otra manera de obtener los errores pero no logre hacerla funcionar creo que
la libreria curl.pas no tiene esa opcion o el dll que utilizo la opcion esta documentada como algo asi en la pagina de curl  "curl_easy_strerror(CURLcode errornum);"







delphi
  1. //Se utiliza para obtener el error de la libreria Curl y obtener el mensaje
  2. function GetCurlError(Codigo:CURLcode): String;
  3. begin
  4.   Case Codigo of
  5.     CURLE_OK                      : Result:=('Proceso Exitoso');
  6.     CURLE_UNSUPPORTED_PROTOCOL    : Result:=('La URL que se recibe no es soportada, o puede estar mal escrita  verifique por favor');
  7.     CURLE_FAILED_INIT            : Result:=('Fallo en la inicialización del objeto de conexion curl');
  8.     CURLE_URL_MALFORMAT          : Result:=('El URL no se ha formateado correctamente  ');
  9.     CURLE_OBSOLETE4              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  10.     CURLE_COULDNT_RESOLVE_PROXY  : Result:=('No se pudo resolver proxy. El host proxy dado no se pudo resolver .');
  11.     CURLE_COULDNT_RESOLVE_HOST    : Result:=('No se pudo resolver host. El host dado no se pudo resolver .');
  12.     CURLE_COULDNT_CONNECT        : Result:=('Error al conectar al host o al proxy');
  13.     CURLE_FTP_WEIRD_SERVER_REPLY  : Result:=('Respuesta inesperada del servidor FTP');
  14.     CURLE_REMOTE_ACCESS_DENIED    : Result:=('Acceso remoto denegado al recurso declarado en la url');
  15.     CURLE_OBSOLETE10              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  16.     CURLE_FTP_WEIRD_PASS_REPLY    : Result:=('Respuesta inesperada del servidor FTP');
  17.     CURLE_OBSOLETE12              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  18.     CURLE_FTP_WEIRD_PASV_REPLY    : Result:=('No se pudo obtener un resultado razonable desde el servidor como respuesta a un comando o bien un EPSV o PASV. La respuesta del servidor es errónea.');
  19.     CURLE_FTP_WEIRD_227_FORMAT    : Result:=('El Servidor FTP regreso una línea 227 como  respuesta a un comando PASV.');
  20.     CURLE_FTP_CANT_GET_HOST        : Result:=('Error interno al realizar la busqueda del host usado para la nueva conexion');
  21.     CURLE_OBSOLETE16              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  22.     CURLE_FTP_COULDNT_SET_TYPE    : Result:=('Se recibió un error al intentar establecer el modo de transferencia a binario o ASCII');
  23.     CURLE_PARTIAL_FILE            : Result:=('Un Archivo transferido fue mas corto o mas largo de lo esperado ');
  24.     CURLE_FTP_COULDNT_RETR_FILE    : Result:=('Se encontro una respuesta inesperada a un comando RETR o o Una Transferencia Completa de cero bytes.');
  25.     CURLE_OBSOLETE20              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  26.     CURLE_QUOTE_ERROR              : Result:=('Uno de los comandos enviados al servidor devuelve un Codigo 400 o mas');
  27.     CURLE_HTTP_RETURNED_ERROR      : Result:=('Error CURLE_HTTP_RETURNED_ERROR');
  28.     CURLE_WRITE_ERROR              : Result:=('Error al intentar escrbir los datos recibidos en un archivo local');
  29.     CURLE_OBSOLETE24              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  30.     CURLE_UPLOAD_FAILED            : Result:=('Error al Subir el archivo al servidor');
  31.     CURLE_READ_ERROR              : Result:=('Error al leer un archivo local');
  32.     CURLE_OUT_OF_MEMORY            : Result:=('Error de solicitud de asignacion de memoria');
  33.     CURLE_OPERATION_TIMEDOUT      : Result:=('Operation timeout,El perido especificado de espera fue alcanzado ');
  34.     CURLE_OBSOLETE29              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  35.     CURLE_FTP_PORT_FAILED          : Result:=('El comando FTP PORT regreso un error');
  36.     CURLE_FTP_COULDNT_USE_REST    : Result:=('El comando FTP REST regreso un error');
  37.     CURLE_OBSOLETE32              : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  38.     CURLE_RANGE_ERROR            : Result:=('El servidor no soporta ni acepta peticiones de rango');
  39.     CURLE_HTTP_POST_ERROR        : Result:=('CURLE_HTTP_POST_ERROR, Error Interno');
  40.     CURLE_SSL_CONNECT_ERROR      : Result:=('Se produjo un problema en alguna parte del SSL / TLS, Verifica los certificados,rutas, contraseñas o formato de los archivos ');
  41.     CURLE_BAD_DOWNLOAD_RESUME    : Result:=('La descarga no podría reanudarse debido a que el desplazamiento especificado estaba fuera de los límites del archivo');
  42.     CURLE_FILE_COULDNT_READ_FILE  : Result:=('El archivo no puede ser leido');
  43.     CURLE_LDAP_CANNOT_BIND      : Result:=('Operación de enlace LDAP falló');
  44.     CURLE_LDAP_SEARCH_FAILED    : Result:=('Búsqueda LDAP falló');
  45.     CURLE_OBSOLETE40            : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  46.     CURLE_FUNCTION_NOT_FOUND    : Result:=('función no encontrada');
  47.     CURLE_ABORTED_BY_CALLBACK  : Result:=('Anulada por CallBack. Un callback devuelve "abortar" a curl.');
  48.     CURLE_BAD_FUNCTION_ARGUMENT : Result:=('Error Interno. Una funcion fue invocada con los parametros invalidos');
  49.     CURLE_OBSOLETE44            : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  50.     CURLE_INTERFACE_FAILED    : Result:=('Error de Interface, Uso especifico de una interfaz de salida podria no ser declarado.');
  51.     CURLE_OBSOLETE46          : Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  52.     CURLE_TOO_MANY_REDIRECTS  : Result:=('Demasiados redireccionamientos. Al seguir redirecciones, se llega a la cantidad máxima.');
  53.     CURLE_UNKNOWN_TELNET_OPTION: Result:=('Opcion de telnet desconosida');
  54.     CURLE_TELNET_OPTION_SYNTAX : Result:=('Una opcion de telnet no esta correctamente formada');
  55.     CURLE_OBSOLETE50: Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl');
  56.     CURLE_PEER_FAILED_VERIFICATION: Result:=('Certificado SSL o SSH md5 huella digital del servidor remoto se consideró invalida.');
  57.     CURLE_GOT_NOTHING: Result:=('El servidor regreso una respuesta nula o vacia');
  58.     CURLE_SSL_ENGINE_NOTFOUND: Result:=('No se encontró el motor de cifrado especificado.');
  59.     CURLE_SSL_ENGINE_SETFAILED: Result:=('No se pudo establecer el motor de cifrado SSL seleccionada por defecto');
  60.     CURLE_SEND_ERROR: Result:=('Falló de envio de datos a la red');
  61.     CURLE_RECV_ERROR: Result:=('Error al recibir datos de la red');
  62.     CURLE_OBSOLETE57: Result:=('Una característica , el protocolo o la función solicitada no se encontró integrado en esta version de la libreria Curl.');
  63.     CURLE_SSL_CERTPROBLEM: Result:=('Problema con el certificado del cliente local.');
  64.     CURLE_SSL_CIPHER: Result:=('No se puede usar el cifrado especificado.');
  65.     CURLE_SSL_CACERT: Result:=('Peer certificate, no se puede autenticar con certificados de CA conocidos.');
  66.     CURLE_BAD_CONTENT_ENCODING: Result:=('Codificación de transferencia no reconocida.');
  67.     CURLE_LDAP_INVALID_URL: Result:=('URL LDAP Inválida.');
  68.     CURLE_FILESIZE_EXCEEDED: Result:=('Tamaño máximo de archivo excedido.');
  69.     CURLE_USE_SSL_FAILED: Result:=('El Nivel FTP SSL solicitado es inválido.');
  70.     CURLE_SEND_FAIL_REWIND: Result:=('Operacion de retroceso errónea.');
  71.     CURLE_SSL_ENGINE_INITFAILED: Result:=('Inicializacion del motor SSL Errónea.');
  72.     CURLE_LOGIN_DENIED: Result:=('El servidor remoto denegó  el acceso, Error de autentificación. ');
  73.     CURLE_TFTP_NOTFOUND: Result:=('Archivo no encontrado en el servidor.');
  74.     CURLE_TFTP_PERM: Result:=('Problema de permisos en el servidor TFTP.');
  75.     CURLE_REMOTE_DISK_FULL: Result:=('No hay espacio libre en el servidor');
  76.     CURLE_TFTP_ILLEGAL: Result:=('Operación TFTP no válida.');
  77.     CURLE_TFTP_UNKNOWNID: Result:=('FTP TransferID desconocida. ');
  78.     CURLE_REMOTE_FILE_EXISTS: Result:=('El archivo ya existe y no puede ser sobreescrito.');
  79.     CURLE_TFTP_NOSUCHUSER: Result:=('Error Desconocido TFTP, CURLE_TFTP_NOSUCHUSER');
  80.     CURLE_CONV_FAILED: Result:=('Error en el proceso de conversión de caracteres .');
  81.     CURLE_CONV_REQD: Result:=('La llamada debe registrar las devoluciones de la llamada(Conversion callbacks)');
  82.     CURLE_SSL_CACERT_BADFILE: Result:=('Error leyendo el certificado SSL CA');
  83.     CURLE_REMOTE_FILE_NOT_FOUND: Result:=('Archivo remoto no encontrado');
  84.     CURLE_SSH: Result:=('Error inesperado durante la sesion SSH');
  85.     CURLE_SSL_SHUTDOWN_FAILED: Result:=('Error al  apagar la conexión SSL');
  86.     CURLE_AGAIN: Result:=('El socket no esta listo para enviar datos esperar y reintentar');
  87.     CURLE_SSL_CRL_BADFILE: Result:=('Error al cargar el archivo CRL file.');
  88.     CURLE_SSL_ISSUER_ERROR: Result:=('The colour is Red');
  89.     CURLE_FTP_PRET_FAILED: Result:=('El servidor FTP no soporta el comando PRET o no soporta el argumento enviado.');
  90.     CURLE_RTSP_CSEQ_ERROR: Result:=('Discrepancia de los números CSeq RTSP(Real Time Streaming Protocol)');
  91.     CURLE_RTSP_SESSION_ERROR: Result:=('Error en los identificadores de sesión del RTSP(Real Time Streaming Protocol)');
  92.     CURLE_FTP_BAD_FILE_LIST: Result:=('No se puede convertir la lista de archivos FTP');
  93.     CURLE_CHUNK_FAILED: Result:=('Callback Chunk informó error.');
  94.     CURL_LAST : Result:=('Error No especificado, CURL_LAST')
  95.  
  96.   else  Result :=('Error  Desconocido, Verifique su conexion a Internet');
  97.         end;


  • 0

#6 poliburro

poliburro

    Advanced Member

  • Administrador
  • 4945 posts
  • LocationMéxico

Posted 03 October 2014 - 07:36 AM

Perdon por el triple post pero creo que esto pudiera servirle a alguien ,Me  he creado esta funcion que añadí a la libreria curl que encontre aquí en el foro, la uso para obtener mensajes de error mas detallados


Al contrario amigo, gracias por compartir el código. Saludos
  • 0




IP.Board spam blocked by CleanTalk.