NoGoth - Serveur Web
Publié : sam. 11/mars/2006 15:02
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 ?
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