NoGoth - Serveur Web

Vous avez développé un logiciel en PureBasic et vous souhaitez le faire connaitre ?
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

NoGoth - Serveur Web

Message par Progi1984 »

Voilà, un serveur web que je suis en train d'écrire en open source.

Actuellement en version 0.1 :
Il gère :
- le message HTTP 1.1 Get
- le protocole MIME

Il a l'avantage par rapport à Atomic Web Server, de n'etre basé que sur du code, alors que Atomic Web Server est basé sur le serveur HTTP + des fichiers HTML !

J'aurais aussi besoin de vous pour un truc, voilà, j'arrives à envoyer tout ce qui est texte, mais je voudrais envoyer un fichier image comment pourrais je faire ?

Code : Tout sélectionner

;-Déclaration des globales
Global port.l
Global nameserver.s
Global version.s

;-Déclaration des fonctions
Declare NoGoth_Receive(*RBuffer,ClientID)
Declare.s NoGoth_BuildMessage(message.s,type.s)
Declare.s NoGoth_GetContent(page.s)
Declare.s NoGoth_GetType(page.s)
Declare.s NoGoth_GetErrorPage(error.s)

;-Initialisation des globales
port=80
nameserver.s="Server"
version.s="0.1"


If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

*Buffer = AllocateMemory(10000)
If CreateNetworkServer(0,port)
  Repeat
    Repeat
      WEvent = WindowEvent()
      If WEvent = #PB_Event_CloseWindow
        Quit = 1
      EndIf
    Until WEvent = 0
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID.l = EventClient()
      Select SEvent
        Case #PB_NetworkEvent_Connect
        Case #PB_NetworkEvent_Data
          ReceiveNetworkData(ClientID.l, *Buffer, 2000)
          NoGoth_Receive(*Buffer,ClientID)         
        Case #PB_NetworkEvent_Disconnect
        Case #PB_NetworkEvent_File
        Default
      EndSelect
    Else
      Delay(1)  ; Don't comment out this, your app will use 100% CPU if you do!!!!!!!
    EndIf
  Until Quit = 1
  CloseNetworkServer(0)
Else
  MessageRequester(nameserver, "Erreur : impossible de créer le serveur (port en utilisation ?).", 0)
EndIf

Procedure NoGoth_Receive(*receive,clientid)
  receive.s= PeekS(*receive)
  Debug receive
  type.s=Left(receive.s,3)
  If type="GET"
    page.s=Trim(Mid(receive,4,Len(receive)-4-(Len(receive)-FindString(receive,"HTTP",1))))
    content.s=NoGoth_GetContent(page.s)
    type.s=NoGoth_GetType(page.s)
    message.s=NoGoth_BuildMessage(content,type)
        
    *Buffer=AllocateMemory(Len(message.s)+1)
    PokeS(*Buffer,message.s)
   
    SendNetworkData(ClientID, *Buffer,Len(message.s))
    FreeMemory(*Buffer)
  ElseIf type="POS"
    Debug "pos"
  ElseIf type="HEA"
    Debug "hea"
  Else
    content.s=NoGoth_GetErrorPage("400")
    message.s=NoGoth_BuildMessage(content,type)
        
    *Buffer=AllocateMemory(Len(message.s)+1)
    PokeS(*Buffer,message.s)
   
    SendNetworkData(ClientID, *Buffer,Len(message.s))
    FreeMemory(*Buffer)    
  EndIf
EndProcedure

Procedure.s NoGoth_BuildMessage(message.s,type.s)
  If Left(message,2)="Er"
    type="text/html"
    message=NoGoth_GetErrorPage(Right(message,3))
  EndIf
  headerd.s = "HTTP/1.1 200 OK"+Chr(13)+Chr(10)
  headerd = headerd+ "Date: "+FormatDate("%dd %mm %yyyy %hh:%ii:%ss", Date())+" GMT"+Chr(13)+Chr(10)
  headerd = headerd+ "Server: NoGoth Web Server 0.2b"+Chr(13)+Chr(10)
  headerd = headerd+ "Content-Length: "

  headerf.s = Chr(13)+Chr(10)+ "Content-Type: "+type+Chr(13)+Chr(10)
  headerf = headerf+ Chr(13)+Chr(10) 
  
  content.s=headerd+Str(Len(message))+headerf+message
  ProcedureReturn  content
EndProcedure

Procedure.s NoGoth_GetContent(page.s)
  If Left(page,1)="/"
    page=Right(page, Len(page)-1)
  EndIf
  Select GetExtensionPart(page)
    Case "htm","html"
      Select Left(page,Len(page)-Len(GetExtensionPart(page))-1)
        Case "index", ""
          content.s = "<html><head><title>test</title></head><body>Youpi<img src=test.bmp></body></html>"
      EndSelect
    Case "bmp"

    Case ""
      content.s="test"
    Default
      content.s="Er404"
  EndSelect
  ProcedureReturn content
EndProcedure
Procedure.s NoGoth_GetType(page.s)
  Select GetExtensionPart(page)
    Case "dwg" 	;Fichiers AutoCAD (d'après NCSA)
      type.s="application/acad"
    Case "asd","asn" ;Fichiers Astound
      type.s="application/astound"
    Case "tsp";Fichiers TSP
      type.s="application/dsptype"
    Case "dxf"	;Fichiers AutoCAD (d'après CERN)
      type.s="application/dxf"
    Case "spl"; 	Fichiers Flash Futuresplash
      type.s="application/futuresplash"
    Case "gz";Fichiers GNU Zip
      type.s="application/gzip"
    Case "ptlk";Fichiers Listenup
      type.s="application/listenup"
    Case "hqx";Fichiers binaires Macintosh
      type.s="application/mac-binhex40"
    Case "mbd";Fichiers Mbedlet
      type.s="application/mbedlet"
    Case "mif";Fichiers FrameMaker Interchange Format
      type.s="application/mif"
    Case "xls","xla";Fichiers Microsoft Excel
      type.s="application/msexcel"
    Case "hlp","chm"     ; 	Fichiers d'aide Microsoft Windows
      type.s="application/mshelp"
    Case "ppt","ppz","pps","pot"     ; 	Fichiers Microsoft Powerpoint
      type.s="application/mspowerpoint"
    Case "doc","dot"     ;Fichiers Microsoft Word
      type.s="application/msword"
    Case "bin","exe","com","dll","class"     ;Fichiers exécutables
      type.s="application/octet-stream"
    Case "oda"     ;Fichiers Oda
      type.s="application/oda"
    Case "pdf"     ;Fichiers Adobe PDF
      type.s="application/pdf"
    Case "ai","ps","eps"     ;Fichiers Adobe Postscript
      type.s="application/postscript"
    Case "rtc"     ;Fichiers RTC
      type.s="application/rtc"
    Case "rtf"     ;Fichiers Microsoft RTF
      type.s="application/rtf"
    Case "smp"     ;Fichiers Studiom
      type.s="application/studiom"
    Case "tbk"     ;Fichiers Toolbook
      type.s="application/toolbook"
    Case "vmd"     ;Fichiers Vocaltec Mediadesc
      type.s="application/vocaltec-media-desc"
    Case "vmf"     ;Fichiers Vocaltec Media
      type.s="application/vocaltec-media-file"
    Case "bcpio"     ;Fichiers BCPIO
      type.s="application/x-bcpio"
    Case "z"     ;Fichiers -
      type.s="application/x-compress"
    Case "cpio"     ;Fichiers CPIO
      type.s="application/x-cpio"
    Case "csh"     ;Fichiers C-Shellscript
      type.s="application/x-csh"
    Case "dcr","dir","dxr"     ;Fichiers -
      type.s="application/x-director"
    Case "dvi"     ;Fichiers DVI
      type.s="application/x-dvi"
    Case "evy"     ;Fichiers Envoy
      type.s="application/x-envoy"
    Case "gtar"     ;Fichiers archives GNU tar
      type.s="application/x-gtar"
    Case "hdf"     ;Fichiers HDF
      type.s="application/x-hdf"
    Case "php","phtml"     ;Fichiers PHP
      type.s="application/x-httpd-php"
    Case "js"     ;Fichiers JavaScript côté serveur
      type.s="application/x-javascript"
    Case "latex"     ;Fichiers source Latex
      type.s="application/x-latex"
    Case "bin"     ;Fichiers binaires Macintosh
      type.s="application/x-macbinary"
    Case "mif"     ;Fichiers FrameMaker Interchange Format
      type.s="application/x-mif"
    Case "nc","cdf"     ;Fichiers Unidata CDF
      type.s="application/x-netcdf"
    Case "nsc"     ;Fichiers NS Chat
      type.s="application/x-nschat"
    Case "sh"     ;Fichiers Bourne Shellscript
      type.s="application/x-sh"
    Case "shar"     ;Fichiers atchives Shell
      type.s="application/x-shar"
    Case "swf","cab"     ;Fichiers Flash Shockwave
      type.s="application/x-shockwave-flash"
    Case "spr","sprite"     ;Fichiers Sprite
      type.s="application/x-sprite"
    Case "sit"     ;Fichiers Stuffit
      type.s="application/x-stuffit"
    Case "sca"     ;Fichiers Supercard
      type.s="application/x-supercard"
    Case "sv4cpio"     ;Fichiers CPIO
      type.s="application/x-sv4cpio"
    Case "sv4crc"     ;Fichiers CPIO avec CRC
      type.s="application/x-sv4crc"
    Case "tar"     ;Fichiers archives tar
      type.s="application/x-tar"
    Case "tcl"     ;Fichiers script TCL
      type.s="application/x-tcl"
    Case "tex"     ;Fichiers TEX
      type.s="application/x-tex"
    Case "texinfo","texi"     ;Fichiers TEXinfo
      type.s="application/x-texinfo"
    Case "t","tr","roff"     ;Fichiers TROFF (Unix)
      type.s="application/x-troff"
    Case "man","troff"     ;Fichiers TROFF avec macros MAN (Unix)
      type.s="application/x-troff-man"
    Case "me"     ;Fichiers TROFF avec macros ME (Unix)
      type.s="application/x-troff-me"
    Case "ms"     ;Fichiers TROFF avec macros MS (Unix)
      type.s="application/x-troff-ms"
    Case "ustar"     ;Fichiers archives tar (Posix)
      type.s="application/x-ustar"
    Case "src"     ;Fichiers source WAIS
      type.s="application/x-wais-source"
    Case "zip"     ;Fichiers archives ZIP
      type.s="application/zip"
    Case "au","snd"     ;Fichiers son
      type.s="audio/basic"
    Case "es"     ;Fichiers Echospeed
      type.s="audio/echospeech"
    Case "tsi"     ;Fichiers TS-Player
      type.s="audio/tsplayer"
    Case "vox"     ;Fichiers Vox
      type.s="audio/voxware"
    Case "aif","aiff","aifc"     ;Fichiers son AIFF
      type.s="audio/x-aiff"
    Case "dus","cht"     ;Fichiers parole
      type.s="audio/x-dspeeh"
    Case "mid","midi"     ;Fichiers MIDI
      type.s="audio/x-midi"
    Case "mp2"     ;Fichiers MPEG
      type.s="audio/x-mpeg"
    Case "ram","ra"     ;Fichiers RealAudio
      type.s="audio/x-pn-realaudio"
    Case "rpm"     ;Fichiers plugin RealAudio
      type.s="audio/x-pn-realaudio-plugin"
    Case "stream"     ;Fichiers -
      type.s="audio/x-qt-stream"
    Case "wav"     ;Fichiers Wav
      type.s="audio/x-wav"
    Case "dwf"     ;Fichiers Drawing
      type.s="drawing/x-dwf"
    Case "cod"     ;Fichiers CIS-Cod
      type.s="image/cis-cod"
    Case "ras"     ;Fichiers CMU-Raster
      type.s="image/cmu-raster"
    Case "fif"     ;Fichiers FIF
      type.s="image/fif"
    Case "gif"     ;Fichiers GIF
      type.s="image/gif"
    Case "ief"     ;Fichiers IEF
      type.s="image/ief"
    Case "jpeg","jpg","jpe"     ;Fichiers JPEG
      type.s="image/jpeg"
    Case "tiff","tif"     ;Fichiers TIFF
      type.s="image/tiff"
    Case "mcf"     ;Fichiers Vasa
      type.s="image/vasa"
    Case "wbmp"     ;Fichiers Bitmap (WAP)
      type.s="image/vnd.wap.wbmp"
    Case "fh4","fh5","fhc"     ;Fichiers Freehand
      type.s="image/x-freehand"
    Case "pnm"     ;Fichiers PBM Anymap
      type.s="image/x-portable-anymap"
    Case "pbm"     ;Fichiers Bitmap PBM
      type.s="image/x-portable-bitmap"
    Case "pgm"     ;Fichiers PBM Graymap
      type.s="image/x-portable-graymap"
    Case "ppm"     ;Fichiers PBM Pixmap
      type.s="image/x-portable-pixmap"
    Case "rgb"     ;Fichiers RGB
      type.s="image/x-rgb"
    Case "xwd"     ;X-Windows Dump
      type.s="image/x-windowdump"
    Case "xbm"     ;Fichiers XBM
      type.s="image/x-xbitmap"
    Case "xpm"     ;Fichiers XPM
      type.s="image/x-xpixmap"
    Case "wrl"     ;Visualisation de mondes virtuels
      type.s="model/vrml"
    Case "csv"     ;Fichiers de données séparées par des virgules
      type.s="text/comma-separated-values"
    Case "css"     ;Fichiers de feuilles de style CSS
      type.s="text/css"
    Case "htm","html","shtml"     ;Fichiers -
      type.s="text/html"
    Case "js"     ;Fichiers JavaScript
      type.s="text/javascript"
    Case "txt"     ;Fichiers pur texte
      type.s="text/plain"
    Case "rtx"     ;Fichiers texte enrichi (Richtext)
      type.s="text/richtext"
    Case "rtf"     ;Fichiers Microsoft RTF
      type.s="text/rtf"
    Case "tsv"     ;Fichiers de données séparées par des tabulations
      type.s="text/tab-separated-values"
    Case "wml"     ;Fichiers WML (WAP)
      type.s="text/vnd.wap.wml"
    Case "wmlc"     ;Fichiers WMLC (WAP)
      type.s="application/vnd.wap.wmlc"
    Case "wmls"     ;Fichiers script WML (WAP)
      type.s="text/vnd.wap.wmlscript"
    Case "wmlsc"     ;Fichiers script C WML (WAP)
      type.s="application/vnd.wap.wmlscriptc"
    Case "etx"     ;Fichiers SeText
      type.s="text/x-setext"
    Case "sgm","sgml"     ;Fichiers SGML
      type.s="text/x-sgml"
    Case "talk","spc"     ;Fichiers Speech
      type.s="text/x-speech"
    Case "mpeg","mpg","mpe"     ;Fichiers MPEG
      type.s="video/mpeg"
    Case "qt","mov"     ;Fichiers Quicktime
      type.s="video/quicktime"
    Case "viv","vivo"     ;Fichiers Vivo
      type.s="video/vnd.vivo"
    Case "avi"     ;Fichiers Microsoft AVI
      type.s="video/x-msvideo"
    Case "movie"     ;Fichiers Movie
      type.s="video/x-sgi-movie"
    Case "vts","vtts"     ;Fichiers FormulaOne
      type.s="workbook/formulaone"
    Case "3dmf","3dm","qd3d","qd3"     ;3Fichiers DMF
      type.s="x-world/x-3dmf"
    Default
      type.s="text/plain"
  EndSelect
  ProcedureReturn type
EndProcedure
Procedure.s NoGoth_GetErrorPage(error.s)
  Select Val(error)
    Case 400 ; La syntaxe de la requête est mal formulée ou est impossible à satisfaire
      contenu.s="La syntaxe de la requête est mal formulée ou est impossible à satisfaire."
    Case 404 ;Le serveur n'a rien trouvé à l'adresse spécifiée.
      contenu.s="Page d'erreur 404, personnalisable"
  EndSelect
  ProcedureReturn contenu
EndProcedure
Avatar de l’utilisateur
Droopy
Messages : 1151
Inscription : lun. 19/juil./2004 22:31

Message par Droopy »

ça peut être très utile 8)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Avec l'API Win32 tu peux connaitre le mime d'un fichier selon son extension. Si tu veux envoyer une image il suffit de spécifier le type "image/xxxx" et d'envoyer le contenu du fichier (tout betement).

J'avais codé un petit serveur http en partant justement de l'exemple d'atomic mais comme j'arrivais pas a faire du multithreading (un thread par client...) j'ai laissé de côté. Je te filerai volontier les sources mais je ne les ai plus depuis le crash de mon dur.

Dri
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Merci Dri, je pensais exactement à envoyer le contenu du fichier image, mais là, je recherche le moyen de le stocker en dur dans le programme (data ?), puis d'intégrer au programme (fonction NoGoth_GetContent(page.s))
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

En fait ta requete http c'est de la donnée brute. D'abord tu crée l'entete (ca c'est du texte ^^) ensuite tu prend le contenu du fichier (quelque soit le type, tu t'en fiches) et tu alloue une zone de mémoire dans laquelle tu copie les deux (entete & data). De mémoire c'est comme ca que j'ai fait et ca fonctionne parfaitement (avec tous les navigateurs testés ^^)

Après y'a d'autres choses à mettre en oeuvre, y faut pas oublier de vérifier si le fichier existe, si c'est pas le cas tu envoie l'erreur 404 à la place (une page générée par ton serveur par exemple). Ca implique l'en-tete, donc faut pas oublier de la créer en conséquence.

Je te passe le reste des cas particuliers (lister un dossier, page par défaut genre index.html etc)

Dri ;)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

En fait pour NoGoth_GetContent, au lieu de retourner une chaine, je devrais retourner un buffer ?
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

T'as tout compris ^^

Dri ;)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Grace à Dri, j'ai découvert les buffers (merci :))

Donc, je vous redonne la dernière version de mon serveur web.
Il gère :
- le message HTTP 1.1 Get
+ avec un fichier html
+ mais aussi une image bmp
- le protocole MIME
- les paramètres de fichiers
-les pages d'erreur 404 !

Code : Tout sélectionner

;-Declaration procédure
Declare NG_SetPort(port.l)
Declare NG_ReceiveData(ClientID.l, *Buffer)
Declare NG_ActionGet(msg_get.s)
Declare NG_GetContent(page.s,param.s)
Declare.s NG_GetType(fichier.s)
Declare NG_CreateHeader(*Buffer, type.s)
Declare NG_SetNameServer(nameserver.s)

;-Déclaration globales
Global NG_Port.l
Global NG_NameServer.s

If InitNetwork() = 0
  MessageRequester("Error", "Can't initialize the network !", 0)
  End
EndIf

NG_SetPort(80)
NG_SetNameServer("ProgiSoft WebServer v0.1")

*Buffer = AllocateMemory(10000)
If CreateNetworkServer(0,NG_Port)
  Repeat
    Repeat
      WEvent = WindowEvent()
      If WEvent = #PB_Event_CloseWindow
        Quit = 1
      EndIf
    Until WEvent = 0
    SEvent = NetworkServerEvent()
    If SEvent
      ClientID.l = EventClient()
      Select SEvent
        Case #PB_NetworkEvent_Connect
          Debug "=====Connecté====="
        Case #PB_NetworkEvent_Data
          Debug "=====Envoi de données====="
          ReceiveNetworkData(ClientID.l, *Buffer, 2000)
          NG_ReceiveData(ClientID.l, *Buffer)    
        Case #PB_NetworkEvent_Disconnect
          Debug "=====Déconnecté====="
        Case #PB_NetworkEvent_File
          Debug "=====Envoi de fichier====="
        Default
      EndSelect
    Else
      Delay(1)  ; Don't comment out this, your app will use 100% CPU if you do!!!!!!!
    EndIf
  Until Quit = 1
  CloseNetworkServer(0)
Else
  MessageRequester("", "Erreur : impossible de créer le serveur (port en utilisation ?).", 0)
EndIf

Procedure NG_SetPort(port.l)
  NG_Port=port
  ProcedureReturn 
EndProcedure
Procedure NG_SetNameServer(nameserver.s)
  NG_NameServer=nameserver.s
  ProcedureReturn 
EndProcedure
Procedure NG_ReceiveData(ClientID.l, *Buffer)
  messagedata.s=PeekS(*Buffer)
  ;Debug messagedata
  If LCase(Left(messagedata.s, 3)) = "get"
    *buffer_rep=NG_ActionGet(messagedata)
    SendNetworkData(ClientID,*buffer_rep,MemorySize(*buffer_rep))
    FreeMemory(*buffer_rep)    
  Else
  EndIf
  ProcedureReturn 
EndProcedure
Procedure NG_ActionGet(msg_get.s)

    Debut = FindString(msg_get.s, Chr(13), 5)
    Pos = FindString(msg_get.s, " ", 5)
    If Pos < Debut
      RequestedFile.s = Mid(msg_get.s, 6, Pos-5)
      RequestedFile.s = RTrim(RequestedFile.s)
    Else
      RequestedFile.s = Mid(msg_get.s, 6, Debut-5)
    EndIf
    paramquest=FindString(requestedfile,"?",1)
    If paramquest<>0
      param.s=Mid(requestedfile,paramquest+1,Len(requestedfile)-paramquest)
      requestedfile=Left(requestedfile,paramquest-1)
    Else
      param.s=""
    EndIf
    Debug "Fichier demande=>"+requestedfile
    Debug "Paramètres=>"+param
    *buffer_rep=NG_GetContent(requestedfile,param)
  ProcedureReturn *buffer_rep
EndProcedure
Procedure NG_GetContent(page.s,param.s)
  Select page.s
    Case "index.htm"
      result.s="<html><head><title>test</title></head><body>Youpi<img src=test.bmp></body></html>"
      type.s=NG_GetType(page)
      *FileBuf=AllocateMemory(Len(result))
      PokeS(*FileBuf, result)
    Case "test.bmp"
      If ReadFile(0,"test.bmp")
        FileLen=Lof(0)
        *FileBuf=AllocateMemory(FileLen)
        ReadData(0,*FileBuf,FileLen)
        CloseFile(0)
        type.s=NG_GetType(page)
      EndIf
  Default ; erreur 404
      result.s="<html><head><title>erruer404</title></head><body>Error 404</body></html>"
      *FileBuf=AllocateMemory(Len(result))
      PokeS(*FileBuf, result)
      type.s="text\html"
  EndSelect
  *NG_Buf=NG_CreateHeader(*FileBuf,type.s)
  ProcedureReturn *NG_Buf
EndProcedure
Procedure.s NG_GetType(fichier.s)
  Select GetExtensionPart(fichier)
    Case "dwg" 	;Fichiers AutoCAD (d'après NCSA)
      type.s="application/acad"
    Case "asd","asn" ;Fichiers Astound
      type.s="application/astound"
    Case "tsp";Fichiers TSP
      type.s="application/dsptype"
    Case "dxf"	;Fichiers AutoCAD (d'après CERN)
      type.s="application/dxf"
    Case "spl"; 	Fichiers Flash Futuresplash
      type.s="application/futuresplash"
    Case "gz";Fichiers GNU Zip
      type.s="application/gzip"
    Case "ptlk";Fichiers Listenup
      type.s="application/listenup"
    Case "hqx";Fichiers binaires Macintosh
      type.s="application/mac-binhex40"
    Case "mbd";Fichiers Mbedlet
      type.s="application/mbedlet"
    Case "mif";Fichiers FrameMaker Interchange Format
      type.s="application/mif"
    Case "xls","xla";Fichiers Microsoft Excel
      type.s="application/msexcel"
    Case "hlp","chm"     ; 	Fichiers d'aide Microsoft Windows
      type.s="application/mshelp"
    Case "ppt","ppz","pps","pot"     ; 	Fichiers Microsoft Powerpoint
      type.s="application/mspowerpoint"
    Case "doc","dot"     ;Fichiers Microsoft Word
      type.s="application/msword"
    Case "bin","exe","com","dll","class"     ;Fichiers exécutables
      type.s="application/octet-stream"
    Case "oda"     ;Fichiers Oda
      type.s="application/oda"
    Case "pdf"     ;Fichiers Adobe PDF
      type.s="application/pdf"
    Case "ai","ps","eps"     ;Fichiers Adobe Postscript
      type.s="application/postscript"
    Case "rtc"     ;Fichiers RTC
      type.s="application/rtc"
    Case "rtf"     ;Fichiers Microsoft RTF
      type.s="application/rtf"
    Case "smp"     ;Fichiers Studiom
      type.s="application/studiom"
    Case "tbk"     ;Fichiers Toolbook
      type.s="application/toolbook"
    Case "vmd"     ;Fichiers Vocaltec Mediadesc
      type.s="application/vocaltec-media-desc"
    Case "vmf"     ;Fichiers Vocaltec Media
      type.s="application/vocaltec-media-file"
    Case "bcpio"     ;Fichiers BCPIO
      type.s="application/x-bcpio"
    Case "z"     ;Fichiers -
      type.s="application/x-compress"
    Case "cpio"     ;Fichiers CPIO
      type.s="application/x-cpio"
    Case "csh"     ;Fichiers C-Shellscript
      type.s="application/x-csh"
    Case "dcr","dir","dxr"     ;Fichiers -
      type.s="application/x-director"
    Case "dvi"     ;Fichiers DVI
      type.s="application/x-dvi"
    Case "evy"     ;Fichiers Envoy
      type.s="application/x-envoy"
    Case "gtar"     ;Fichiers archives GNU tar
      type.s="application/x-gtar"
    Case "hdf"     ;Fichiers HDF
      type.s="application/x-hdf"
    Case "php","phtml"     ;Fichiers PHP
      type.s="application/x-httpd-php"
    Case "js"     ;Fichiers JavaScript côté serveur
      type.s="application/x-javascript"
    Case "latex"     ;Fichiers source Latex
      type.s="application/x-latex"
    Case "bin"     ;Fichiers binaires Macintosh
      type.s="application/x-macbinary"
    Case "mif"     ;Fichiers FrameMaker Interchange Format
      type.s="application/x-mif"
    Case "nc","cdf"     ;Fichiers Unidata CDF
      type.s="application/x-netcdf"
    Case "nsc"     ;Fichiers NS Chat
      type.s="application/x-nschat"
    Case "sh"     ;Fichiers Bourne Shellscript
      type.s="application/x-sh"
    Case "shar"     ;Fichiers atchives Shell
      type.s="application/x-shar"
    Case "swf","cab"     ;Fichiers Flash Shockwave
      type.s="application/x-shockwave-flash"
    Case "spr","sprite"     ;Fichiers Sprite
      type.s="application/x-sprite"
    Case "sit"     ;Fichiers Stuffit
      type.s="application/x-stuffit"
    Case "sca"     ;Fichiers Supercard
      type.s="application/x-supercard"
    Case "sv4cpio"     ;Fichiers CPIO
      type.s="application/x-sv4cpio"
    Case "sv4crc"     ;Fichiers CPIO avec CRC
      type.s="application/x-sv4crc"
    Case "tar"     ;Fichiers archives tar
      type.s="application/x-tar"
    Case "tcl"     ;Fichiers script TCL
      type.s="application/x-tcl"
    Case "tex"     ;Fichiers TEX
      type.s="application/x-tex"
    Case "texinfo","texi"     ;Fichiers TEXinfo
      type.s="application/x-texinfo"
    Case "t","tr","roff"     ;Fichiers TROFF (Unix)
      type.s="application/x-troff"
    Case "man","troff"     ;Fichiers TROFF avec macros MAN (Unix)
      type.s="application/x-troff-man"
    Case "me"     ;Fichiers TROFF avec macros ME (Unix)
      type.s="application/x-troff-me"
    Case "ms"     ;Fichiers TROFF avec macros MS (Unix)
      type.s="application/x-troff-ms"
    Case "ustar"     ;Fichiers archives tar (Posix)
      type.s="application/x-ustar"
    Case "src"     ;Fichiers source WAIS
      type.s="application/x-wais-source"
    Case "zip"     ;Fichiers archives ZIP
      type.s="application/zip"
    Case "au","snd"     ;Fichiers son
      type.s="audio/basic"
    Case "es"     ;Fichiers Echospeed
      type.s="audio/echospeech"
    Case "tsi"     ;Fichiers TS-Player
      type.s="audio/tsplayer"
    Case "vox"     ;Fichiers Vox
      type.s="audio/voxware"
    Case "aif","aiff","aifc"     ;Fichiers son AIFF
      type.s="audio/x-aiff"
    Case "dus","cht"     ;Fichiers parole
      type.s="audio/x-dspeeh"
    Case "mid","midi"     ;Fichiers MIDI
      type.s="audio/x-midi"
    Case "mp2"     ;Fichiers MPEG
      type.s="audio/x-mpeg"
    Case "ram","ra"     ;Fichiers RealAudio
      type.s="audio/x-pn-realaudio"
    Case "rpm"     ;Fichiers plugin RealAudio
      type.s="audio/x-pn-realaudio-plugin"
    Case "stream"     ;Fichiers -
      type.s="audio/x-qt-stream"
    Case "wav"     ;Fichiers Wav
      type.s="audio/x-wav"
    Case "dwf"     ;Fichiers Drawing
      type.s="drawing/x-dwf"
    Case "cod"     ;Fichiers CIS-Cod
      type.s="image/cis-cod"
    Case "ras"     ;Fichiers CMU-Raster
      type.s="image/cmu-raster"
    Case "fif"     ;Fichiers FIF
      type.s="image/fif"
    Case "gif"     ;Fichiers GIF
      type.s="image/gif"
    Case "ief"     ;Fichiers IEF
      type.s="image/ief"
    Case "jpeg","jpg","jpe"     ;Fichiers JPEG
      type.s="image/jpeg"
    Case "tiff","tif"     ;Fichiers TIFF
      type.s="image/tiff"
    Case "mcf"     ;Fichiers Vasa
      type.s="image/vasa"
    Case "wbmp"     ;Fichiers Bitmap (WAP)
      type.s="image/vnd.wap.wbmp"
    Case "fh4","fh5","fhc"     ;Fichiers Freehand
      type.s="image/x-freehand"
    Case "pnm"     ;Fichiers PBM Anymap
      type.s="image/x-portable-anymap"
    Case "pbm"     ;Fichiers Bitmap PBM
      type.s="image/x-portable-bitmap"
    Case "pgm"     ;Fichiers PBM Graymap
      type.s="image/x-portable-graymap"
    Case "ppm"     ;Fichiers PBM Pixmap
      type.s="image/x-portable-pixmap"
    Case "rgb"     ;Fichiers RGB
      type.s="image/x-rgb"
    Case "xwd"     ;X-Windows Dump
      type.s="image/x-windowdump"
    Case "xbm"     ;Fichiers XBM
      type.s="image/x-xbitmap"
    Case "xpm"     ;Fichiers XPM
      type.s="image/x-xpixmap"
    Case "wrl"     ;Visualisation de mondes virtuels
      type.s="model/vrml"
    Case "csv"     ;Fichiers de données séparées par des virgules
      type.s="text/comma-separated-values"
    Case "css"     ;Fichiers de feuilles de style CSS
      type.s="text/css"
    Case "htm","html","shtml"     ;Fichiers -
      type.s="text/html"
    Case "js"     ;Fichiers JavaScript
      type.s="text/javascript"
    Case "txt"     ;Fichiers pur texte
      type.s="text/plain"
    Case "rtx"     ;Fichiers texte enrichi (Richtext)
      type.s="text/richtext"
    Case "rtf"     ;Fichiers Microsoft RTF
      type.s="text/rtf"
    Case "tsv"     ;Fichiers de données séparées par des tabulations
      type.s="text/tab-separated-values"
    Case "wml"     ;Fichiers WML (WAP)
      type.s="text/vnd.wap.wml"
    Case "wmlc"     ;Fichiers WMLC (WAP)
      type.s="application/vnd.wap.wmlc"
    Case "wmls"     ;Fichiers script WML (WAP)
      type.s="text/vnd.wap.wmlscript"
    Case "wmlsc"     ;Fichiers script C WML (WAP)
      type.s="application/vnd.wap.wmlscriptc"
    Case "etx"     ;Fichiers SeText
      type.s="text/x-setext"
    Case "sgm","sgml"     ;Fichiers SGML
      type.s="text/x-sgml"
    Case "talk","spc"     ;Fichiers Speech
      type.s="text/x-speech"
    Case "mpeg","mpg","mpe"     ;Fichiers MPEG
      type.s="video/mpeg"
    Case "qt","mov"     ;Fichiers Quicktime
      type.s="video/quicktime"
    Case "viv","vivo"     ;Fichiers Vivo
      type.s="video/vnd.vivo"
    Case "avi"     ;Fichiers Microsoft AVI
      type.s="video/x-msvideo"
    Case "movie"     ;Fichiers Movie
      type.s="video/x-sgi-movie"
    Case "vts","vtts"     ;Fichiers FormulaOne
      type.s="workbook/formulaone"
    Case "3dmf","3dm","qd3d","qd3"     ;3Fichiers DMF
      type.s="x-world/x-3dmf"
    Default
      type.s="text/plain"
  EndSelect
  ProcedureReturn type
EndProcedure

Procedure NG_CreateHeader(*BMessage, type.s)
  header.s="HTTP/1.1 200 OK"+Chr(13)+Chr(10)
  header=header+"Date: "+FormatDate("%dd %mm %yyyy %hh:%ii:%ss", Date())+" GMT"+Chr(13)+Chr(10)
  header=header+"Server: "+NG_NameServer+Chr(13)+Chr(10)
  header=header+"Content-Length: "+Str(MemorySize(*BMessage))+Chr(13)+Chr(10)
  header=header+"Content-Type: "+type+Chr(13)+Chr(10)
  header=header+Chr(13)+Chr(10)
  
  *Bheader=AllocateMemory(Len(header))
  PokeS(*Bheader,header)
  
  *BAll=AllocateMemory(Len(header)+MemorySize(*BMessage))
  CopyMemory(*Bheader,*ball,Len(header))
  *BAll_=*BAll+Len(header)
  CopyMemory(*BMessage,*BAll_,MemorySize(*BMessage))
  
  FreeMemory(*Bheader)
  FreeMemory(*BAll_)
  ProcedureReturn *BAll
EndProcedure
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

je l'avais évoqué, je l'ai recodé (avec PB 4 ^^)

Code : Tout sélectionner

Procedure.s GetFileContentType(FileName.s)
  Protected Type.s, Extension.s, KeyID.l, Len.l
  
  FileName = GetFilePart(FileName)
  
  If CheckFilename(FileName)
    Extension = GetExtensionPart(FileName)
  EndIf
  
  If Extension
    Extension = "." + Extension
    
    Debug Extension
    
    Open = RegOpenKeyEx_(#HKEY_CLASSES_ROOT, Extension, 0, #KEY_ALL_ACCESS, @KeyID)
    
    If Open = #ERROR_SUCCESS
      Type = Space($FF)
      Len  = $FF
      
      RegQueryValueEx_(KeyID, @"Content Type", #Null, #Null, @Type, @Len)
      RegCloseKey_(KeyID)
    EndIf
    
  EndIf
  
  ProcedureReturn Type
EndProcedure

Repeat
  file.s = OpenFileRequester("Type", "", "Tous les fichiers|*.*", 0) 
  Debug GetFileContentType(file)
Until Not file
Dri
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Le problème est que ton code n'est pas portable (utilisation de l'api win32) donc je garde le mien :) Merci quand meme ! Maintenant, je travaille sur le POST !
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Bah le code reste de toute facon à disposition ^^
A ta place je gèrerai les mimes de la facon suivante:

Code : Tout sélectionner

#default_mime$ = "text/plain"

If OpenPreferences("mimes.ini")
  Repeat
    file.s = OpenFileRequester("Type", "", "Tous les fichiers|*.*", 0)
    ext.s  = GetExtensionPart(file)
    Debug ReadPreferenceString(ext, #default_mime$)
  Until Not file
EndIf
sans oublier le fichier mimes.ini

Code : Tout sélectionner

txt = text/plain
htm = text/html
html = text/html
css = text/css
bmp = image/bitmap
gif = image/gif
jpg = image/jpeg
jpeg = image/jpeg
png = image/png
d'une manière générale vaut mieux éviter de mettre ce genre d'informations directement dans le code source. c'est pas pratique, compliqué à modifier (faut recompiler l'exe pour ajouter des mimes)

Dri ;)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Exact, et ca va raccourcir un peu le code source :)

Merci Dri :)
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Tant que j'y pense, dans l'hypothèse où tu voudrais rendre ton serveur customisable via un fichier ini, autant tout y regrouper (meme les mimes).
exemple:

Code : Tout sélectionner

#default_mime$ = "text/plain"

If OpenPreferences("mimes.ini")
  Repeat
    file.s = OpenFileRequester("Type", "", "Tous les fichiers|*.*", 0)
    ext.s  = GetExtensionPart(file)
    PreferenceGroup("MIME")
    Debug ReadPreferenceString(ext, #default_mime$)
  Until Not file
EndIf

Code : Tout sélectionner

[PATH]
root = c:\www\
default_page = index.html;index.htm

[USER]
admin = Mot De Passe MD5
anonymous = MD5 De Chaine Vide

[MIME]
txt = text/plain
htm = text/html
html = text/html
css = text/css
bmp = image/bitmap
gif = image/gif
jpg = image/jpeg
jpeg = image/jpeg
png = image/png
Dri ;)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

j'ai crée ce serveur pour qu'il ait l'avantage de ne pas avoir de besoins de fichiers externes (sf un ini pour les prefs).

Mais au pire, pour celui qui voudrait le modifier, et l'utiliser avec des fichiers externes, il faut modifier cette fonction : NG_GetContent(page.s,param.s)
Avatar de l’utilisateur
Progi1984
Messages : 2659
Inscription : mar. 14/déc./2004 13:56
Localisation : France > Rennes
Contact :

Message par Progi1984 »

Mais suis je bete ? Pourquoi ne pas par une préférence, laisser l'utilisateur choisir quel type il veut utiliiser : soit le serveur web par fichiers (normal, quoi !) soit le serveur web par ligne de code (comme je le souhaitais à l'origine :))
Répondre