Basic Univers

Procedure URLDownloadToFile(URL$, FilePath$)
  If InitNetwork() = 0
    MessageRequester("Impossible d'innitialiser le réseau", "Il est impossible d'innitialiser le réseau.", 0)
    ProcedureReturn 0
  EndIf
  EOL$ = Chr(13)+ Chr(10)
  Position = FindString(URL$, "http://", 1)
  If Position = 1
    Position = FindString(URL$, "/", 8)
    URLL$ = Right(URL$, Len(URL$)- 7)
    HOST$ = Left(URLL$, Position - 8)
    PosiPort = FindString(HOST$, ":", 1)
    If PosiPort = 0
      PORT = 80
    Else
      LNGPort = Len(HOST$)- PosiPort
      Port$ = Right(HOST$, LNGPort)
      PORT = Val(Port$)
      HOST$ = Left(HOST$, Len(HOST$)- LNGPort - 1)
    EndIf
    GET$ = Right(URLL$, Len(URLL$)- Position + 8)
    GET$ = ReplaceString(GET$, " ", "%20")
    s = FindString(GET$, "?", 1)
    If s <> 0
      Method$ = "POST"
      GET$ = Left(GET$, s)
      Param$ = Right(GET$, Len(GET$)-(s + 1))
    Else
      Method$ = "GET"
      Param$ = ""
    EndIf
  Else
    MessageRequester("URL format incorrect", "L'URL doit-être du type http://HOST/Fichier", 0)
    ProcedureReturn 0
  EndIf

  ClientID = OpenNetworkConnection(HOST$, PORT)
  
  If ClientID
    SendNetworkString(ClientID, Method$ +" " + GET$ +" HTTP/1.1" + EOL$)
    SendNetworkString(ClientID, "HOST: " + HOST$ + EOL$)
    SendNetworkString(ClientID, "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.12) Gecko/20050915 Firefox/1.0.7" + EOL$)
    If Param$ <> ""
      SendNetworkString(ClientID, "Connection: close" + EOL$)
      SendNetworkString(ClientID, "Content-Type: text/html" + EOL$)
      SendNetworkString(ClientID, "Content: " + Param$ + EOL$ + EOL$)
    Else
      SendNetworkString(ClientID, "Connection: close" + EOL$ + EOL$)
    EndIf
    While NetworkClientEvent(ClientID) <> 2
      Delay(10)
    Wend
    
    Taille = 32000
    *Buffer = AllocateMemory(Taille)
    Restant = ReceiveNetworkData(ClientID, *Buffer, Taille)
    
    Text$ = PeekS(*Buffer, Restant)
    Entete$ = Left(Text$, FindString(Text$, EOL$ + EOL$, 1))
    Count = CountString(Entete$, "HTTP/1.1 200 OK")
    If Count = 0
      MessageRequester("Fichier introuvable sur le serveur.", "Le fichier " + GET$ +" est introuvable sur " + HOST$ +".", 0)
      FreeMemory(*Buffer)
      ProcedureReturn 0
      
    ElseIf Count = 1
      If CreateFile(0, FilePath$)
      
        Structure Corespondance
        AdresseMemoire.l
        Taille.l
        EndStructure
        
        NewList Memoire.Corespondance()
        
        AddElement(Memoire())
        
        Memoire()\AdresseMemoire = *Buffer + Len(Entete$)+ 3
        Memoire()\Taille = Restant - Len(Entete$)- 3
        
        ; Delay(1500)
        
        Repeat
          If restant <= 0
          ElseIf Restant > 0
             *Buffer = AllocateMemory(Taille)
            Restant = ReceiveNetworkData(ClientID, *Buffer, Taille)
            AddElement(Memoire())
            Memoire()\AdresseMemoire = *Buffer
            Memoire()\Taille = Restant
            ; Delay(1500)
          EndIf
        Until Restant = 0
    
        ResetList(Memoire())
        NextElement(Memoire())
        
        Repeat
          WriteData(0, Memoire()\AdresseMemoire, Memoire()\Taille)
          ; Delay(10)
          FreeMemory(Memoire()\AdresseMemoire)
        Until NextElement(Memoire()) = 0
        
        ClearList(Memoire())
        CloseNetworkConnection(ClientID)
        CloseFile(0)
    
        ProcedureReturn 1
      Else
        MessageRequester("Impossible de créer le fichier", "Il est impossible de créer le fichier " + FilePath$ +".", 0)
        FreeMemory(*Buffer)
        ProcedureReturn 0
      EndIf
    Else
      MessageRequester("Vous n'êtes pas connecté à un serveur http.", "Vous n'êtes pas connecté sur un serveur http.", 0)
      FreeMemory(*Buffer)
      ProcedureReturn 0
    EndIf
  Else
    MessageRequester("Impossible de ce connecter", "Il est impossible de ce connecter à l'adresse: " + HOST$ +".", 0)
    ProcedureReturn 0
  EndIf
EndProcedure

URL$ = InputRequester("Veuillez entrer l'URL du fichier que vous voulez télécharger.", "URL:", "http://")
FileName$ = GetFilePart(URL$)
FileExtension$ = GetExtensionPart(URL$)
If FileExtension$ = ""
  Extension$ = "*"
Else
  Extension$ = FileExtension$
EndIf

If FileName$ = ""
  DefaultFileName$ = "Default"
Else
  DefaultFileName$ = Left(FileName$, Len(FileName$)- Len(Extension$)- 1)
EndIf

If Extension$ <> "*"
  File$ = SaveFileRequester("Où voulez-vous enregistrer le fichier téléchargé?", GetCurrentDirectory()+ DefaultFileName$, "*." + Extension$ +"|*." + Extension$ +"|*.*|*.*", 0)
ElseIf Extension$ = "*"
  File$ = SaveFileRequester("Où voulez-vous enregistrer le fichier téléchargé?", GetCurrentDirectory()+ DefaultFileName$, "*." + Extension$ +"|*." + Extension$, 0)
EndIf

If SelectedFilePattern() = 0
  If GetExtensionPart(File$) <> Extension$
    If Extension$ = "*"
    Else
      File$ = File$ +"." + Extension$
    EndIf
  EndIf
EndIf

Resultat = URLDownloadToFile(URL$, File$)

If resultat = 0
  End
ElseIf resultat = 1
  MessageRequester("Le fichier à bien été téléchargé.", "Le fichier vien d'être téléchargé avec succès. Il a été sauvegardé dans: " + File$ +".", 0)
  End
EndIf