#==========================================# #¤Script de communication minimal avec # # les serveurs Apache. (v 1.9) # #------------------------------------------# #©Mangeuse de cannes - Modifié pour PSP v2 # #==========================================# class Web_File S_Nil="" S_Et="&" S_Eq="=" S_RNRN="\r\n\r\n" S_RN="\r\n" S_dp=": " S_St="Status" S_sp=" " Err_OD="Erreur : Online désativé" Err_ITS="Erreur : impossible de trouver le Serveur !" Err_ICS="Erreur : impossible de se connecter au Serveur !" Err_NDT="Erreur : Aucune réponse..." H_Connection="Connection" H_XConnection="X-Cnection" H_size="Content-Length" V_Close="close" RE_Size=2048 attr_accessor :url, :host, :data, :variables,:socket,:size,:dlsize,:closed,:header #=== #§ Initialize #--- #host : DNS du serveur #url : url de l'objet ex : "index.php", "/images/pic.png" #variables : Toutes les variables envoyé lors de la co # ex : {"nombre" => "6", "string" => "chaine", "fichier" => "/index.php" ...} #=== def initialize(host1,url1,variables={}) @url=url1.to_s @host=host1.to_s @data=S_Nil @variables=variables @header={} @socket=false @size=0 @dlsize=0 @closed=true #Si ça été fermé. end #=== #§ Lancement #=== def run(post=true) unless $online print(Err_OD) return -1 end #Ouverture de la soccket... @socket=TCPSocket.new(@host,80) #Création du data de réception @data="" #Création du buffer d'envois unless post send_buf="GET /#{@url}#{make_var(true)} HTTP/1.1\r\nHost: #{@host}\r\nConnection: Close\r\n\r\n" else post=make_var send_buf="POST /#{@url} HTTP/1.1\r\nHost: #{@host}\r\nConnection: Close\r\nContent-type: application/x-www-form-urlencoded; charset=utf-8\r\nContent-Length: #{post.size}\r\n\r\n#{post}" end @closed=false #Envois de la requette. @socket.send(send_buf) #Récupération des infos... tmp_data=@socket.recv(RE_Size*2) if tmp_data==S_Nil or !tmp_data print(Err_NDT) return 3 end end_header=tmp_data.index(S_RNRN)+4 get_header(tmp_data[0,end_header-4]) @data << tmp_data[end_header,tmp_data.size-end_header] #Verification de la taille unless @header[H_size] @size=@data.size+1 @dlsize=@size else @size=@header[H_size].to_i @header[H_size]=@size #Conversion @dlsize=@data.size end if @dlsize >= @size @closed=true @socket.close return 4 end return 0 end #=== #§ Mise à jour du DL #=== def update(autoclose=true) #Reception tmp_data=@socket.recv(RE_Size) #Si data vide (considéré comme socket fermé) if tmp_data==S_Nil or !tmp_data if autoclose @closed=true @socket.close end return 3 end @dlsize+=tmp_data.size #Mise à jour de la taille DL @data << tmp_data #Ajout du data #Verification de la taille si >= fermeture if @dlsize >= @size @closed=true @socket.close return 2 end return 0 end #=== #§ Get header #% Capture toute les données envoyé dans les header. #=== def get_header(header_str) @header.clear header_arr=header_str.split(S_RN) #Verification de la première requette st=header_arr[0].split(S_sp) @header[S_St]=st[2].to_s @header[0]=st[1].to_i #Traitement du reste for i in 1...header_arr.length arr=header_arr[i].split(S_dp) @header[arr[0].to_s]=arr[1].to_s end end #=== #§Encodage des données pour le serveur #% L'encodage est peut être incomplet #=== def get_to_httpget(var) var.gsub("%","%25").gsub("$","%24").gsub("+","%2B").gsub(",","%2C").gsub("\"","%22").gsub("<","%3C").gsub(">","%3E").gsub("{","%7B").gsub("}","%7D").gsub("|","%7C").gsub("\\","%5C").gsub("^","%5E").gsub("~","%7E").gsub("[","%5B").gsub("]","%5D").gsub("`","%60").gsub(" ","%20") end def post_to_httppost(var) var.gsub!("%","%25") var.gsub!("+","%2B") var.gsub!(" ", "+") var.gsub!("!", "%21") var.gsub!("\"", "%22") var.gsub!("#", "%23") var.gsub!("$", "%24") var.gsub!("&", "%26") var.gsub!("'", "%27") var.gsub!("(", "%28") var.gsub!(")", "%29") var.gsub!("*", "%2A") var.gsub!(",", "%2C") var.gsub!("/", "%2F") var.gsub!(":", "%3A") var.gsub!(";", "%3B") var.gsub!("<", "%3C") var.gsub!("=", "%3D") var.gsub!(">", "%3E") var.gsub!("?", "%3F") var.gsub!("@", "%40") var.gsub!("[", "%5B") var.gsub!("\\", "%5C") var.gsub!("]", "%5D") var.gsub!("^", "%5E") var.gsub!("`", "%60") var.gsub!("{", "%7B") var.gsub!("|", "%7C") var.gsub!("}", "%7D") var.gsub!("~", "%7E") var.gsub!("€", "%80") var.gsub!("", "%81") var.gsub!("‚", "%82") var.gsub!("„", "%84") var.gsub!("…", "%85") var.gsub!("†", "%86") var.gsub!("‡", "%87") var.gsub!("ˆ", "%88") var.gsub!("‰", "%89") var.gsub!("Š", "%8A") var.gsub!("‹", "%8B") var.gsub!("Œ", "%8C") var.gsub!("Ž", "%8E") var.gsub!("‘", "%91") var.gsub!("’", "%92") var.gsub!("“", "%93") var.gsub!("”", "%94") var.gsub!("•", "%95") var.gsub!("–", "%96") var.gsub!("—", "%97") var.gsub!("˜", "%98") var.gsub!("™", "%99") var.gsub!("š", "%9A") var.gsub!("›", "%9B") var.gsub!("œ", "%9C") var.gsub!("ž", "%9E") var.gsub!("Ÿ", "%9F") var.gsub!("¡", "%A1") var.gsub!("¢", "%A2") var.gsub!("£", "%A3") var.gsub!("¤", "%A4") var.gsub!("¥", "%A5") var.gsub!("¦", "%A6") var.gsub!("§", "%A7") var.gsub!("¨", "%A8") var.gsub!("©", "%A9") var.gsub!("ª", "%AA") var.gsub!("«", "%AB") var.gsub!("¬", "%AC") var.gsub!("", "%AD") var.gsub!("®", "%AE") var.gsub!("¯", "%AF") var.gsub!("°", "%B0") var.gsub!("±", "%B1") var.gsub!("²", "%B2") var.gsub!("³", "%B3") var.gsub!("´", "%B4") var.gsub!("µ", "%B5") var.gsub!("¶", "%B6") var.gsub!("·", "%B7") var.gsub!("¸", "%B8") var.gsub!("¹", "%B9") var.gsub!("º", "%BA") var.gsub!("»", "%BB") var.gsub!("¼", "%BC") var.gsub!("½", "%BD") var.gsub!("¾", "%BE") var.gsub!("¿", "%BF") var.gsub!("À", "%C0") var.gsub!("Á", "%C1") var.gsub!("Â", "%C2") var.gsub!("Ã", "%C3") var.gsub!("Ä", "%C4") var.gsub!("Å", "%C5") var.gsub!("Æ", "%C6") var.gsub!("Ç", "%C7") var.gsub!("È", "%C8") var.gsub!("É", "%C9") var.gsub!("Ê", "%CA") var.gsub!("Ë", "%CB") var.gsub!("Ì", "%CC") var.gsub!("Í", "%CD") var.gsub!("Î", "%CE") var.gsub!("Ï", "%CF") var.gsub!("Ð", "%D0") var.gsub!("Ñ", "%D1") var.gsub!("Ò", "%D2") var.gsub!("Ó", "%D3") var.gsub!("Ô", "%D4") var.gsub!("Õ", "%D5") var.gsub!("Ö", "%D6") var.gsub!("×", "%D7") var.gsub!("Ø", "%D8") var.gsub!("Ù", "%D9") var.gsub!("Ú", "%DA") var.gsub!("Û", "%DB") var.gsub!("Ü", "%DC") var.gsub!("Ý", "%DD") var.gsub!("Þ", "%DE") var.gsub!("ß", "%DF") var.gsub!("à", "%E0") var.gsub!("á", "%E1") var.gsub!("â", "%E2") var.gsub!("ã", "%E3") var.gsub!("ä", "%E4") var.gsub!("å", "%E5") var.gsub!("æ", "%E6") var.gsub!("ç", "%E7") var.gsub!("è", "%E8") var.gsub!("ê", "%EA") var.gsub!("ë", "%EB") var.gsub!("ì", "%EC") var.gsub!("í", "%ED") var.gsub!("î", "%EE") var.gsub!("ï", "%EF") var.gsub!("ð", "%F0") var.gsub!("ñ", "%F1") var.gsub!("ò", "%F2") var.gsub!("ó", "%F3") var.gsub!("ô", "%F4") var.gsub!("õ", "%F5") var.gsub!("ö", "%F6") var.gsub!("÷", "%F7") var.gsub!("ø", "%F8") var.gsub!("ù", "%F9") var.gsub!("ú", "%FA") var.gsub!("û", "%FB") var.gsub!("ü", "%FC") var.gsub!("ý", "%FD") var.gsub!("þ", "%FE") var end #=== #§création de la requete contenant les variables #=== def make_var(get=false) return S_Nil if @variables.keys.size==0 #Création du data if get data="?" else data="" end #Si c'est la première variable first=true #Ajout des variables dans le data. for i in @variables.keys unless first data << S_Et else first=false end data << i.to_s << S_Eq << (get ? get_to_httpget(@variables[i].to_s) : post_to_httppost(@variables[i].to_s)) end return data end end |