IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

Buffer d'erreur trop petit lors affichage mauvaise URL ?


Sujet :

PyQt Python

  1. #1
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut Buffer d'erreur trop petit lors affichage mauvaise URL ?
    Bonjour,

    Voici un code minimaliste qui reproduit mon problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from PyQt4 import QtCore, QtGui, QtWebKit
    import sys
     
    app = QtGui.QApplication(sys.argv)
     
     
    url = QtCore.QUrl( "lk" )
     
    if url.isValid() == True :
        print "URL Valide"
        page = QtWebKit.QWebView()
        page.load(url)
     
    else:
        print "URL Invalide"
     
    app.exec_()
    La sortie en console est :
    URL Valide

    QIODevice::read: maxSize argument exceeds QByteArray size limit
    Qt has caught an exception thrown from an event handler. Throwing
    exceptions from an event handler is not supported in Qt. You must
    reimplement QApplication::notify() and catch all exceptions there.


    This application has requested the Runtime to terminate it in an unusual way.
    Please contact the application's support team for more information.
    L'URL n'est pas valide, quoi qu'en dise la méthode isValid() et je présume que QtWebKit renvoie une erreur énorme qui ne rentre pas dans le buffer, mais j'aimerais comprendre un peu mieux ce qui se passe et comme je peux m'en prémunir.

    Merci d'avance pour vos réponses ^^

  2. #2
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Effectivement, avec ton code j'obtiens le même plantage, et même méchant puisqu'il plante l'interpréteur Python et pas seulement le programme.

    J'ai essayé ton url "hk" dans mon propre navigateur, et il se contente de ne rien en faire. J'ai donc regardé ce que je faisais: je corrige les adresses saisies comme suit ("churl" était ici une chaine unicode issue, par exemple, d'un lineEdit):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if os.path.exists(churl):
        # cas d'un fichier disque html:  met "file:///" si nécessaire
        url = QtCore.QUrl.fromLocalFile(churl)
    else:
        # cas d'une adresse web:  met "http://" si nécessaire
        url = QtCore.QUrl.fromUserInput(churl)
    J'ai essayé et il n'y a plus d'erreur.

    Pour l'essai, j'ai un peu modifié ton code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    from PyQt4 import QtCore, QtGui, QtWebKit
    import sys
     
    app = QtGui.QApplication(sys.argv)
     
    url = QtCore.QUrl.fromUserInput(u"hk")
     
    page = QtWebKit.QWebView()
    page.show()
     
    if url.isValid():
        print "URL Valide"
        page.load(url)
    else:
        print "URL Invalide"
     
    sys.exit(app.exec_())
    Et si, dans ce petit code, tu remplaces "hk" par "www.google.fr", tu verras s'afficher la page de google!

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Salut tyrtamos,

    Merci pour tes réponses !

    En effet, le plantage est méchant. Mon objectif ici est d'abord de comprendre ce qui se passe en interne pour en arriver à une telle erreur. Le sais-tu ?

    je corrige les adresses saisies comme suit
    Intéressante la méthode QUrl.fromUserInput() ! Si j'ai bien compris la documentation, tu n'as pas besoin de faire appel à QUrl.fromLocalFile(churl) : l'appel est implicitement fait par QUrl.fromUserInput().

    Déjà, ça régle mon problème en rajoutant http:// devant la chaine, comme dans ton dernier code. Dans mon code "entier", je récupère la chaine à partir d'un QInputDialog pour ajouter de nouveaux onglets à une page et planter l'application si on ajoute une mauvaise adresse, ce n'est pas génial.

    En fait, c'est l'absence de protocole utilisé dans l'URL qui semble faire planter la méthode QWebView.load(). Mais j'aimerai bien savoir pourquoi il le faut et surtout pourquoi ça plante l'interpréteur au lieu de simplement écrire la trace de l'exception dans ma console, ça m'intrigue ^^

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Je suis dans l'incapacité de te dire quel est le soucis, pourtant j'en ai lu des docs, mais il y a une option intéressante qui permet déjà de parser ton url et d'accepter que les URLS valides c'est l'argument mode.

    __init__ (self, QString url, ParsingMode mode)

    Bon courage dans ta quête de savoir

  5. #5
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Je ne comprends pas non plus pourquoi une mauvaise adresse sans protocole se traduit par un aussi grave plantage.

    Par ailleurs, il n'y a pas beaucoup d'infos sur les vérifications faites par "isValid", mais on peut au moins déclencher le "False" en utilisant un caractère interdit comme une apostrophe ou un espace (par exemple, "n'importequoi" ou "nim portequoi" sont refusés, mais "nimportequoi" est accepté) ou une chaine vide. En fait, il s'agit seulement d'une vérification syntaxique, et il faut donc se référer à la norme qui décrit le format URL. A noter qu'en utilisant la correction d'url avec fromUserInput, un url invalide renvoie une chaine vide.

    Bon. En attendant une éventuelle élimination du plantage dans une prochaine version, il faut utiliser la correction d'url systématiquement.


    [edit] merci fred1599, j'avais essayé et ça ne marche pas mieux. Le mode en question pourrait être en effet "QUrl.StrictMode" qui fait que la vérification syntaxique est faite, mais n'empêche pas une adresse syntaxiquement correcte mais sans protocole de provoquer le plantage.

  6. #6
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Salut Tyrtamos,

    Pour vérifier le request d'une URL, il y a la classe QNetworkReply et QNetworkAccessManager, où il est possible de gérer soit les redirections, soit les URL invalides (dans le sens non syntaxique), soit toutes les erreurs possibles d'ailleurs.

    Il y a même la gestion du Timeout en cas de dépassement du temps de connection.

  7. #7
    Expert confirmé
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 486
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 486
    Billets dans le blog
    6
    Par défaut
    Merci fred1599: intéressant! Je vais creuser un peu dans cette direction.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    J'ai envoyé un message sur la mailing PyQt à propos de ce plantage, je verrai si j'ai une réponse. Si oui, vous en serez bien sûr informés ^^

Discussions similaires

  1. [AC-2007] Erreur 3163 "Champ trop petit"
    Par Nephyline dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/03/2012, 12h33
  2. [AC-2007] Erreur Champ trop petit
    Par Aladin_23 dans le forum VBA Access
    Réponses: 6
    Dernier message: 31/10/2010, 10h14
  3. Réponses: 4
    Dernier message: 20/03/2009, 11h15
  4. Buffer trop petit pour afficher une JSP
    Par neowind dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 06/07/2007, 17h44
  5. erreur urgente: le champ est trop petit
    Par Paul Van Walleghem dans le forum ASP.NET
    Réponses: 3
    Dernier message: 18/06/2007, 08h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo