/ / La semplice richiesta TCP di ruby ​​non raggiunge il server: ruby-on-rails, ruby, sockets, tcp, websocket

La semplice richiesta TCP ruby ​​non colpisce il server: ruby-on-rails, ruby, socket, tcp, websocket

Ho un semplice script ruby ​​per caricare il file inserver / web app tramite connessione TCP ma non funziona. Quando eseguo lo script non succede nulla sull'app web / lato server. Il server funziona bene perché ho provato a caricare il file con CURL e lo ha caricato. al mio codice qui sotto e fammi sapere cosa sto facendo di sbagliato. Sto usando ruby ​​1.9.2-p290. Grazie in anticipo.

require "socket"

host = "myapp.herokuapp.com"
port = 80

client = TCPSocket.open(host, port)

client.print("POST /api/binary HTTP/1.1rn")
client.print("Host: myapp.herokuapp.comrn")
client.print ("Accept: */* rn")
client.print ("Content-Type: multipart/form-data;boundary=AaB03x rn")


client.print("n" + "AaB03x"+ "n" "Content-Disposition: form-data; name="datafile"; filename="cam.jpg" n Content-Type: image/jpeg rn")
client.print ("rn")
data = File.open("./pic.jpg", "rb") {|io| io.read}
client.print (data)
client.print ("rn")
client.print("boundary=AaB03xrn")

client.close

Console IRB

>require "socket"
=> true
>  client = TCPSocket.open("myapp.herokuapp.com", 80)
=> #<TCPSocket:fd 3>
> client.print("GET /api/users HTTP/1.1")
=> nil
> client.print("POST /api/binary HTTP/1.1")
=> nil

risposte:

1 per risposta № 1

Devi assicurarti di inviare una richiesta HTTP valida.

  1. Avete bisogno di un Content-Length intestazione.Ciò significa che è necessario assemblare il corpo in anticipo in modo da poter determinare la sua lunghezza per l'intestazione, quindi inviare il corpo. Se sbagli, il server potrebbe finire per bloccare il tentativo di leggere più input che non arrivano.

  2. I tuoi confini multiparte devono essere risolti. Dovrebbero iniziare con --, quindi il token dall'intestazione: --AaB03x. L'ultima dovrebbe finire con -- pure: --AaB03x--. Assicurati che non ci siano spazi vuoti finali anche nell'intestazione, che possono causare problemi.

Alcune altre cose che probabilmente non impediranno l'analisi della richiesta, ma dovresti riordinare:

  1. Le nuove righe nelle intestazioni dovrebbero essere rn non solo n.

  2. Le righe di intestazione non dovrebbero contenere spazi bianchi prima di esse.

require "socket"

host = "myapp.herokuapp.com"
port = 80

client = TCPSocket.open(host, port)

# Write out the headers.
client.print("POST /api/binary HTTP/1.1rn")
client.print("Host: myapp.herokuapp.comrn")
client.print ("Accept: */* rn")
# Note: no trailing whitespace.
client.print ("Content-Type: multipart/form-data;boundary=AaB03xrn")

# Assemble the body.
# Note rn for all line endings, body doesn"t start with newline.
# Boundary marker starts with "--".
body = "--AaB03xrn"
body << "Content-Disposition: form-data; name="datafile"; filename="cam.jpg"rn"
# Header starts at left of line, no leading whitespace.
body << "Content-Type: image/jpegrn"
body << "rn"
data = File.open("./pic.jpg", "rb") {|io| io.read}
body << data
body << "rn"
# Final boundary marker has trailing "--"
body << "--AaB03x--rn"

# Now we can write the Content-Length header, since
# we now know the size of the body.
client.print "Content-Length: #{body.bytesize}rn"
# Blank line.
client.print "rn"
# Finally write out the body.
client.print body

# In reality you would want to parse the response from
# the server before closing the socket.
client.close