Super idée, j'utilisais déjà un petit proxy Ruby écrit par Torsten Becker https://gist.github.com/74107 pour de sombres histoires d'ouvertures de flux qui ne passaient pas derrière un VPN … j'y ai donc ajouté la possibilité de remplacer un fichier "serveur" par un fichier local au proxy.
L'utilisation est simple, il suffit de préciser le répertoire où sont stockés les fichiers à remplacer à la volée (par défaut /tmp). Dès que le client fait une demande (par exemple /styles/mon_style.css), si un fichier portant le même nom existe dans le répertoire local (exemple /tmp/mon_style.css) c'est ce dernier qui sera renvoyé. Du coup c'est un peu moins modulable que ton code, mais c'est facilement adaptable pour des besoins plus pointus.
Le code fonctionne sur une installation "minimale" (pas de gems à installer) de Ruby (1.9 testé, mais doit fonctionner en 1.8).
Le code :
#!/usr/bin/env ruby# Proxy with local file replacement based on Torsten Becker <torsten.becker@gmail.com> ruby proxy https://gist.github.com/74107require'socket'require'uri'classProxydefrunport,local_path@local_path=local_pathputs"Start proxy on port #{port}. Local file must be stored in #{local_path}."begin# Start our server to handle connections (will raise things on errors)@socket=TCPServer.newport# Handle every request in another threadloopdos=@socket.acceptThread.news,&method(:handle_request)end# CTRL-CrescueInterruptputs'Got Interrupt..'# Ensure that we release the socket on errorsensureif@socket@socket.closeputs'Socked closed..'endputs'Quitting.'endenddefhandle_requestto_clientrequest_line=to_client.readlineverb=request_line[/^\w+/]url=request_line[/^\w+\s+(\S+)/,1]version=request_line[/HTTP\/(1\.\d)\s*$/,1]uri=URI::parseurl# Show what got requestedputs((" %4s "%verb)+url)filename=uri.path.split('/')[-1];to_server=TCPSocket.new(uri.host,(uri.port.nil??80:uri.port))to_server.write("#{verb}#{uri.path}?#{uri.query} HTTP/#{version}\r\n")content_len=0loopdoline=to_client.readlineifline=~/^Content-Length:\s+(\d+)\s*$/content_len=1ドル.to_iend# Strip proxy headersifline=~/^proxy/inextelsifline.strip.empty?to_server.write("Connection: close\r\n\r\n")ifcontent_len>=0to_server.write(to_client.read(content_len))endbreakelseto_server.write(line)endendifFileTest.exists?(@local_path+filename)to_server.closeputs"Get file #{filename} from local directory #{@local_path}"to_server=File.new(@local_path+filename,"r")endbuff=""loopdoto_server.read(4048,buff)to_client.write(buff)breakifbuff.size<4048end# Close the socketsto_client.closeto_server.closeendenddefusageputs'Usage: proxy.rb [port] [directory with local files]'exit1end# Get parameters and start the serverport=8008path="/tmp";ARGV.eachdo|arg|ifFileTest.directory?(arg)thenpath=argelsifarg="-h"thenusageelsifarg=~/^\d+/thenport=arg.to_ielseusageendendProxy.new.runport,path
# Dans le même style en Ruby
Posté par pifou . En réponse au journal Sleipnir : proxy quick & dirty pour bien coder. Évalué à 4.
Super idée, j'utilisais déjà un petit proxy Ruby écrit par Torsten Becker https://gist.github.com/74107 pour de sombres histoires d'ouvertures de flux qui ne passaient pas derrière un VPN … j'y ai donc ajouté la possibilité de remplacer un fichier "serveur" par un fichier local au proxy.
L'utilisation est simple, il suffit de préciser le répertoire où sont stockés les fichiers à remplacer à la volée (par défaut /tmp). Dès que le client fait une demande (par exemple /styles/mon_style.css), si un fichier portant le même nom existe dans le répertoire local (exemple /tmp/mon_style.css) c'est ce dernier qui sera renvoyé. Du coup c'est un peu moins modulable que ton code, mais c'est facilement adaptable pour des besoins plus pointus.
Le code fonctionne sur une installation "minimale" (pas de gems à installer) de Ruby (1.9 testé, mais doit fonctionner en 1.8).
Le code :