begin process at 2013 05 23 13:56:12
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Réseau & Internet

 > [.NET2] CLASSE DE TÉLÉCHARGEMENT HTTP AVEC GESTION DE RESUME, PROGRESSION, AUTHENTIFICATION, PROXY, ÉVENEMENT THREADS-SAFE...

[.NET2] CLASSE DE TÉLÉCHARGEMENT HTTP AVEC GESTION DE RESUME, PROGRESSION, AUTHENTIFICATION, PROXY, ÉVENEMENT THREADS-SAFE...


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Réseau & Internet Source .NET ( DotNet ) Classé sous :télécharger, download, http, telechargement, proxy Niveau :Initié Date de création :14/03/2007 Date de mise à jour :15/03/2007 01:52:56 Vu / téléchargé :10 863 / 798

Auteur : hvb

Ecrire un message privé
Site perso
Ce membre participe au partage de revenus publicitaires
Commentaire sur cette source (10)
Ajouter un commentaire et/ou une note


 Description

Hello le monde.
Voila une évolution de la classe que j'avais ecrit pour vb2002/2003 (présente sur le site).
Celle ci gère (heuresement) tout ce que fesait l'ancienne : resume, progression, proxy
Et les nouveautés :
_C'est maintenant une "vraie" classe
_Gestion de l'authentification type htaccess
_Gestion événement permettant des accés "thread-safe" aux controles des forms (le problème ne se posait pas en 2003, du moins aucunes exception n'était levée)
_Gestion d'erreures (simplistes, mais présente)
_Gestion des fichiers dont la taille n'est pas renvoyé par le header

Pourquoi n'ai je pas simplement fait une mise à jour du code exisant?
_Le sample accompagnant la classe a du être modifié, l'ancien n'est pas compatible avec cette nouvelle classe
_Les backgroundworker utilisé pour les renvoit d'évenement n'existent pas avant .Net 2.0
_La classe a été completement réecrite proprement
_L'ancienne classe marche très bien sous vb2002/2003

Cependant, si un admin juge qu'une simple mise à jour aurait suffit, la suppression de cette source ne me vexera pas ^^

Source

  • Option Strict On
  • Imports System.Net
  • Public Class HBDownloader2005
  • #Region "évenements"
  • Public Event download_Started(ByVal sender As Object, ByVal totalfilelen As Long, ByVal resumepos As Long, ByVal TimeTickStart As Long)
  • Public Event download_Progress(ByVal sender As Object, ByVal CurPosition As Long, ByVal CurPercentage As Integer)
  • Public Event download_Ended(ByVal sender As Object, ByVal EndPosition As Long, ByVal CurPercentage As Integer)
  • Public Event download_Error(ByVal sender As Object, ByVal ex As Exception)
  • #End Region
  • #Region "attributs"
  • Private b As Boolean
  • Private WithEvents bgw As System.ComponentModel.BackgroundWorker
  • Private BufSize As Integer = 32768
  • Private BytesArr(BufSize) As Byte
  • Private CurPos As Long
  • Private FileLength As Long
  • Private Hwebrequest As HttpWebRequest
  • Private IsResume As Boolean
  • Private ReadStream As IO.Stream
  • Private ResumePos As Long
  • Private StartTime As DateTime
  • Private TargetPath As String
  • Private FileUrl As String
  • #End Region
  • #Region "proprietés"
  • Public Property BufferSize() As Integer
  • Get
  • Return BufSize
  • End Get
  • Set(ByVal value As Integer)
  • BufSize = value
  • Array.Resize(BytesArr, BufSize)
  • End Set
  • End Property
  • Public ReadOnly Property Start_Time() As Date
  • Get
  • Return StartTime
  • End Get
  • End Property
  • Public ReadOnly Property Start_Tick() As Long
  • Get
  • Return StartTime.Ticks
  • End Get
  • End Property
  • #End Region
  • #Region "méthodes"
  • Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean)
  • Start(pathstr, strurl, IsResume, "", "", Nothing, Nothing)
  • End Sub
  • Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal login As String, ByVal pass As String)
  • Start(pathstr, strurl, IsResume, login, pass, Nothing, Nothing)
  • End Sub
  • Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal proxy As String, ByVal proxyport As Integer)
  • Start(pathstr, strurl, IsResume, "", "", proxy, proxyport)
  • End Sub
  • Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal login As String, ByVal pass As String, ByVal proxy As String, ByVal proxyport As Integer)
  • b = True
  • IsResume = bresume
  • StartTime = Now
  • TargetPath = pathstr
  • FileUrl = strurl
  • Open_request(strurl, pathstr, login, pass, proxy, proxyport)
  • End Sub
  • Public Sub Stop_Download()
  • b = False
  • End Sub
  • Private Sub Open_request(ByVal fileurl As String, ByVal filepath As String, ByVal login As String, ByVal pass As String, ByVal proxy As String, ByVal proxyport As Integer)
  • Try
  • If proxy <> "" Then
  • Dim hproxy As WebProxy
  • hproxy = New WebProxy(proxy, proxyport)
  • WebRequest.DefaultWebProxy = hproxy
  • End If
  • Hwebrequest = CType(System.Net.HttpWebRequest.Create(fileurl), System.Net.HttpWebRequest)
  • If login <> "" Then
  • Dim hcredential As New System.Net.NetworkCredential(login, pass)
  • Hwebrequest.Credentials = hcredential
  • End If
  • If IsResume = True Then
  • ResumePos = FileLen(filepath)
  • CurPos = ResumePos
  • Hwebrequest.AddRange(CInt(CurPos))
  • End If
  • Dim hwebresponse As System.Net.HttpWebResponse = CType(Hwebrequest.GetResponse, System.Net.HttpWebResponse)
  • ReadStream = hwebresponse.GetResponseStream
  • FileLength = hwebresponse.ContentLength + CurPos
  • StartTime = Now
  • RaiseEvent download_Started(Me, FileLength, ResumePos, StartTime.Ticks)
  • bgw = New System.ComponentModel.BackgroundWorker
  • bgw.WorkerReportsProgress = True
  • bgw.RunWorkerAsync()
  • Catch ex As Exception
  • RaiseEvent download_Error(Me, ex)
  • End Try
  • End Sub
  • Private Function Get_Percentage(ByVal tmppos As Long, ByVal totallen As Long) As Integer
  • Dim tmpres As Long
  • If totallen > 0 Then
  • tmpres = CLng((tmppos / totallen) * 100)
  • Else 'si la taille du fichier n'était pas connue
  • tmpres = -1
  • End If
  • Return CInt(tmpres)
  • End Function
  • Private Sub Get_file(ByVal filepath As String)
  • Try
  • Dim tmplen As Integer
  • b = True
  • Do
  • tmplen = ReadStream.Read(BytesArr, 0, BufSize)
  • CurPos += tmplen
  • Dim filesave As New IO.FileStream(filepath, IO.FileMode.Append, IO.FileAccess.Write)
  • filesave.Write(BytesArr, 0, tmplen)
  • filesave.Close()
  • bgw.ReportProgress(Get_Percentage(CurPos, FileLength))
  • System.Threading.Thread.Sleep(1)
  • Loop While (tmplen > 0 And b = True)
  • b = False
  • ReadStream.Close()
  • Catch ex As Exception
  • RaiseEvent download_Error(Me, ex)
  • End Try
  • End Sub
  • Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
  • Get_file(TargetPath)
  • End Sub
  • Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
  • RaiseEvent download_Progress(Me, CurPos, e.ProgressPercentage)
  • End Sub
  • Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
  • RaiseEvent download_Ended(Me, CurPos, Get_Percentage(CurPos, FileLength))
  • End Sub
  • #End Region
  • End Class
Option Strict On
Imports System.Net

Public Class HBDownloader2005

#Region "évenements"
    Public Event download_Started(ByVal sender As Object, ByVal totalfilelen As Long, ByVal resumepos As Long, ByVal TimeTickStart As Long)
    Public Event download_Progress(ByVal sender As Object, ByVal CurPosition As Long, ByVal CurPercentage As Integer)
    Public Event download_Ended(ByVal sender As Object, ByVal EndPosition As Long, ByVal CurPercentage As Integer)
    Public Event download_Error(ByVal sender As Object, ByVal ex As Exception)
#End Region

#Region "attributs"
    Private b As Boolean
    Private WithEvents bgw As System.ComponentModel.BackgroundWorker
    Private BufSize As Integer = 32768
    Private BytesArr(BufSize) As Byte
    Private CurPos As Long
    Private FileLength As Long
    Private Hwebrequest As HttpWebRequest
    Private IsResume As Boolean
    Private ReadStream As IO.Stream
    Private ResumePos As Long
    Private StartTime As DateTime
    Private TargetPath As String
    Private FileUrl As String
#End Region

#Region "proprietés"
    Public Property BufferSize() As Integer
        Get
            Return BufSize
        End Get
        Set(ByVal value As Integer)
            BufSize = value
            Array.Resize(BytesArr, BufSize)
        End Set
    End Property
    Public ReadOnly Property Start_Time() As Date
        Get
            Return StartTime
        End Get
    End Property

    Public ReadOnly Property Start_Tick() As Long
        Get
            Return StartTime.Ticks
        End Get
    End Property
#End Region

#Region "méthodes"
    Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean)
        Start(pathstr, strurl, IsResume, "", "", Nothing, Nothing)
    End Sub

    Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal login As String, ByVal pass As String)
        Start(pathstr, strurl, IsResume, login, pass, Nothing, Nothing)
    End Sub

    Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal proxy As String, ByVal proxyport As Integer)
        Start(pathstr, strurl, IsResume, "", "", proxy, proxyport)
    End Sub

    Public Sub Start(ByVal pathstr As String, ByVal strurl As String, ByVal bresume As Boolean, ByVal login As String, ByVal pass As String, ByVal proxy As String, ByVal proxyport As Integer)
        b = True
        IsResume = bresume
        StartTime = Now
        TargetPath = pathstr
        FileUrl = strurl
        Open_request(strurl, pathstr, login, pass, proxy, proxyport)
    End Sub

    Public Sub Stop_Download()
        b = False
    End Sub

    Private Sub Open_request(ByVal fileurl As String, ByVal filepath As String, ByVal login As String, ByVal pass As String, ByVal proxy As String, ByVal proxyport As Integer)
        Try
            If proxy <> "" Then
                Dim hproxy As WebProxy
                hproxy = New WebProxy(proxy, proxyport)
                WebRequest.DefaultWebProxy = hproxy
            End If
            Hwebrequest = CType(System.Net.HttpWebRequest.Create(fileurl), System.Net.HttpWebRequest)
            If login <> "" Then
                Dim hcredential As New System.Net.NetworkCredential(login, pass)
                Hwebrequest.Credentials = hcredential
            End If
            If IsResume = True Then
                ResumePos = FileLen(filepath)
                CurPos = ResumePos
                Hwebrequest.AddRange(CInt(CurPos))
            End If
            Dim hwebresponse As System.Net.HttpWebResponse = CType(Hwebrequest.GetResponse, System.Net.HttpWebResponse)
            ReadStream = hwebresponse.GetResponseStream
            FileLength = hwebresponse.ContentLength + CurPos
            StartTime = Now
            RaiseEvent download_Started(Me, FileLength, ResumePos, StartTime.Ticks)
            bgw = New System.ComponentModel.BackgroundWorker
            bgw.WorkerReportsProgress = True
            bgw.RunWorkerAsync()
        Catch ex As Exception
            RaiseEvent download_Error(Me, ex)
        End Try
    End Sub

    Private Function Get_Percentage(ByVal tmppos As Long, ByVal totallen As Long) As Integer
        Dim tmpres As Long
        If totallen > 0 Then
            tmpres = CLng((tmppos / totallen) * 100)
        Else 'si la taille du fichier n'était pas connue
            tmpres = -1
        End If
        Return CInt(tmpres)
    End Function

    Private Sub Get_file(ByVal filepath As String)
        Try
            Dim tmplen As Integer
            b = True
            Do
                tmplen = ReadStream.Read(BytesArr, 0, BufSize)
                CurPos += tmplen
                Dim filesave As New IO.FileStream(filepath, IO.FileMode.Append, IO.FileAccess.Write)
                filesave.Write(BytesArr, 0, tmplen)
                filesave.Close()
                bgw.ReportProgress(Get_Percentage(CurPos, FileLength))
                System.Threading.Thread.Sleep(1)
            Loop While (tmplen > 0 And b = True)
            b = False
            ReadStream.Close()
        Catch ex As Exception
            RaiseEvent download_Error(Me, ex)
        End Try
    End Sub

    Private Sub bgw_DoWork(ByVal sender As Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles bgw.DoWork
        Get_file(TargetPath)
    End Sub

    Private Sub bgw_ProgressChanged(ByVal sender As Object, ByVal e As System.ComponentModel.ProgressChangedEventArgs) Handles bgw.ProgressChanged
        RaiseEvent download_Progress(Me, CurPos, e.ProgressPercentage)
    End Sub

    Private Sub bgw_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles bgw.RunWorkerCompleted
        RaiseEvent download_Ended(Me, CurPos, Get_Percentage(CurPos, FileLength))
    End Sub
#End Region

End Class

 Conclusion

Commentaires? :)

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip


 Historique

14 mars 2007 15:39:48 :
premier bug ^^' ...
15 mars 2007 01:52:56 :
_le fait de telecharger un fichier dont la taille n'est pas connue ne lève plus d'erreur _adaptation du sample à ce genre de cas

 Sources du même auteur

Source avec Zip Source avec une capture Source .NET (Dotnet) FOND DE FEUILLE ANIMÉ : DÉGRADÉ MOUVANT POUR ABOUT OU SPLASH...
Source avec Zip Source avec une capture Source .NET (Dotnet) FONT VIEWER : VISIONNEUSE DE POLICES SYSTEMES.
Source avec Zip Source avec une capture Source .NET (Dotnet) HBSNAPSHOTERV3.0 : GESTIONNAIRE DE CAPTURES D'ÉCRAN
Source avec Zip Source avec une capture Source .NET (Dotnet) JEU : PICROSS OU "PUZZLE JAPONAIS"
Source avec Zip Source .NET (Dotnet) [.NET2] COMPRESSION/DÉCOMPRESSION GZIP DE FICHIER GRÂCE À IO...

 Sources de la même categorie

Source avec Zip Source avec une capture WIFI SIGNAL METER par lluismas
Source avec Zip Source .NET (Dotnet) DISTRIBUTED FILE SYSTEM EXPLORER : PARCOURIR LA CONFIGURATIO... par ShareVB
Source avec Zip Source avec une capture Source .NET (Dotnet) APPLI GOOGLE MAPS par soldier8514
Source avec Zip Source avec une capture Source .NET (Dotnet) TÉLÉCHARGER LES LISTES DE RADIOS SHOUTCAST ET ÉCOUTER LES RA... par soldier8514
Source avec Zip Source .NET (Dotnet) SHARE MONITOR : LISTER LES PARTAGES RÉSEAUX D'UNE MACHINE, L... par ShareVB

 Sources en rapport avec celle ci

Source avec Zip Source avec une capture Source .NET (Dotnet) TÉLÉCHARGER LES LISTES DE RADIOS SHOUTCAST ET ÉCOUTER LES RA... par soldier8514
Source avec Zip Source .NET (Dotnet) UPLOAD/ DOWNLOAD FICHIER XML EN HTTP NET COMPACT FRAMEWORK... par angelus101
Source avec Zip Source avec une capture URL2DOWN ACTIVEX _ COMPOSANT DÉDIÉ AU TELECHARGEMENT HTTP par soldier8514
Source avec Zip Source avec une capture CONNEXION SUR UN SITE TOUTES LES X SECONDES AVEC GET OU POST... par papipsycho
Source avec Zip SERVEUR FTP, HTTP, PROXY, SMTP ET POP par Jhep

Commentaires et avis

Commentaire de hvb le 14/03/2007 17:42:33

Le fait de lever une exception lorsque le content-length est égale à -1 est temporaire, je vais gerer ces cas spéciaux (téléchargement de fichier dynamique type php, asp, etc)

Commentaire de FREMYCOMPANY le 14/03/2007 18:23:24

==> Une fois que l'exception content-length: -1 sera gérée, je crois que ce composant aura un réel interêt ! J'ai d'ailleurs un petit challenge à te proposer, si ca t'intéresse : remplacer l'assistant de téléchargement d'IE ;)

Commentaire de hvb le 15/03/2007 01:57:20

MAJ effectuée
Pour ton idée de remplacer IE, je ne sais pas si c'est fesable et surtout si cela sert à qqc, mais en tout cas j'avais ecrit un petit tutos pour interagir entre ie et une application perso.

http://www.vbfrance.com/tutoriaux/LIER-VOTRE-APPLICATION-INTERNET-EXPLORER-VIA-MENU-CONTEXTUEL_169.aspx

Commentaire de youil le 06/06/2008 20:20:58

Pour le proxy il manque l'authentification.

Comment faire ???

Commentaire de dsigmoun le 31/12/2008 09:33:39

Merci pour ta source  hvb.

Lorsque je mets en téléchargement un fichier cela marche sans problème.

Sauf que dans mon appli. j'ai une liste de fichier pdf à télécharger.
Pour cela j'utilise le code suivant :
For x = 0 To Listbox1.Items.Count - 1
downloadz.Start(Application.StartupPath & nomdudossier & Listbox1.Items(x), "http://.../" & Listbox1.Items(x), isresume, dlLogin, dlPass, dlProxy, dlProxyPort)
Next

Dès que j'ai plus d'un fichier dans la liste à télécharger, j'ai l'erreur suivante qui apparaît.
System.InvalidOperationException: OperationCompleted a déjà été appelé pour cette opération. D'autres tentatives d'appel ne seraient pas conformes.
à System.ComponentModel.AsyncOperation.VerifyNotCompleted()
à System.ComponentModel.Asyncoperation.Post(SendOrPostCallback d, Object arg)
à System.ComponentModel.BackgroundWorker.ReportProgress(Int32 percentProgress, Object userState)
à System.ComponentModel.BackgroundWorker.ReportProgress(Int32 percentProgress)
à Monappli.HBDownloader2005.Get_file(String filepath) dans mon dossier/HbDownloader2005.vb:ligne128

J'ai l'impression que tous les téléchargements se lancent en même temps et que le deuxième se lance avant que le premier soit fini.

Comment peut-on solutionner se problème ?


Merci d'avance pour votre aide.

Commentaire de dsigmoun le 31/12/2008 14:51:42

j'ai résolu mon problème par ceci :
  For x = 0 To Listbox1.Items.Count - 1
            If downloading = 0 Then
                downloading = 1
                downloadz.Start(Application.StartupPath & cour & nomdudossier & Listbox1.Items(t), "http://.../" & Listbox1.Items(t), isresume, dlLogin, dlPass, dlProxy, dlProxyPort)
            
            Else
                t = t - 1
            End If        
   Next

Commentaire de dsigmoun le 31/12/2008 14:53:24

J'ai une nouvelle difficulté qui est la gestion de la barre de progression. Lorsque plusieurs fichiers sont téléchargés à la suite, le pourcentage garde en mémoire ce qui a été téléchargé précédemment, mais pas uniquement les valeurs du fichiers en cours de téléchargement.

Commentaire de PWM63 le 13/02/2009 00:53:06 10/10

Source convertie sans erreur pour VB2008.
Test effectué avec succès !
Toutes les informations sont présentes !
Magnifique !
10/10

Et surtout, merci !

Commentaire de Axen le 09/02/2010 04:06:50

Salut, et merci pour cette source qui me conforte sur le fait d'avoir continué à rechercher plus de 5h
conversion en VB2008 sans souci ou presque, la mise en pause fait augmenter la taille du téléchargement chez moi !

Bon vu l'heure je la mets sous le coude et vais me coucher, merci presque 3 ans après :)

Commentaire de Jielde le 16/07/2010 22:43:05

" J'ai une nouvelle difficulté qui est la gestion de la barre de progression. Lorsque plusieurs fichiers sont téléchargés à la suite, le pourcentage garde en mémoire ce qui a été téléchargé précédemment, mais pas uniquement les valeurs du fichiers en cours de téléchargement."

J'ai le même problème...

Merci pour la source.

 Ajouter un commentaire


Discussions en rapport avec ce code source dans le forum

WESGEN: critiquez-moi SVP [ par coucout ] Bonjour,J'ai réalisé un logiciel sous Access 97 baptisé WESGEN dont le but est de générer des applications de gestion de BDD. Vous pouvez aller le tél Download, téléchargement, HTTP [ par DavidT ] Bien sur que Winsock.ocx peut effectuer ces actions mais je cherche surtout un API qui me permettrait de télécharger de gros fichiers en Web (HTTP) et API => Download HTTP + Proxy + username +Password <CASSE TÊTE !!! [ par DavidT ] Bonjour, Y en a marre du INET qui marche une fois sur deux et du Winsock pas très sur !Bon, j'essaye de m'accrocher aux API, et la c'est le casse tête AIDEZ MOI c simplement un download sur ftp ou http [ par gavirtual ] Si tu li se message je te remecialors que je t'explique mon problèmeje voudrais avoir une source pour télécharger un .exe sur un server ftp ou http et Download avec Inet en http ?? [ par JcDuss ] Peut on recuperer une image avec le controle inet ?Peut etre avec le ByteArray, mais je ne sais pas l'utiliser.Et j'aimerais eviter d'utiliser winsock Télécharger un fichier sur un HTTP/FTP [ par Jielde ] Voilla, comment faire pour trouvé la taille d'un fichier sur un HTTP/FTP (de grosse capacité &gt;2mo) puis de le télécharger avec la progression ? et Télécharger fichier avec progressbar en HTTP [ par z980x ] Salut !Bon, j'ai cherché sur le site, mais soit ca ne marchait pas, soit je ne comprenais rien tellement c'était compliqué...J'ai un fichier sur inter télécharger un fichier exe sur http et/ou sur ftp [ par spliceh ] bonjour, je cherche un code pour télécharger un fichier exe sur internet et le stocker sur ma machine. j'ai cru voir dans le forum winsock et inet mai Télécharger un fichier par http via inet [ par Florian29 ] Salut !J'aimerai pouvoir télécharger un fichier (zip) par inet à partir d'une adresse HTTP (et non FTP)...Quelqun aurait-il une solution ou encore mie download [ par chasseurdedemon ] bonjour je d&#233;bute en vb6 &nbsp;et j'ai r&#233;ussi a cr&#233;er un explorateur (apr&#233;s de dure heur de recherche et de l'abeur ) et il marche


Nos sponsors


Appels d'offres

Sondage...

Comparez les prix

CalendriCode

Mai 2013
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 3,385 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales