Curb Post LengthRequired occured

Chcę przesłać POSTem utworzenie nowego wpisu na blogu, korzystam z Curb.

auth_str = Base64.encode64("test:test") req_body = Curl::PostField.content("body", "hello_world") curl = Curl::Easy.new("localhost:3001/posts") curl.headers["Authorization"] = "Basic #{auth_str}" curl.post_body = req_body curl.http_post
Na serwerze, który odpytuję dostaję błąd:

[2011-02-24 13:07:16] ERROR WEBrick::HTTPStatus::LengthRequired [2011-02-24 13:07:16] ERROR HTTPRequest#fixup: WEBrick::HTTPStatus::LengthRequired occured. [2011-02-24 13:07:16] ERROR NoMethodError: private method `gsub!' called for #<Class:0x102b0bca8>
Wygląda to tak, jakby ten post był przekazywany bez zawartości. Pewnie robię jakiś podstawowy błąd. Jaki?

Ustaw mu verbose, zobaczymy co tam takiego wysyła do serwera:

curl.verbose = true

[code]* About to connect() to localhost port 3001 (#0)

  • Trying ::1… * Connection failed
  • Trying fe80::1… * Connection refused
  • Trying 127.0.0.1… * connected
  • Connected to localhost (127.0.0.1) port 3001 (#0)

POST /posts HTTP/1.1
Host: localhost:3001
Accept: /
Authorization: Basic dGVzdDp0ZXN0

Content-Length: 4302656432
Content-Type: application/x-www-form-urlencoded
Expect: 100-continue

< HTTP/1.1 411 Length Required
< Connection: close
< Content-Type: text/html
< Date: Thu, 24 Feb 2011 12:17:18 GMT
< Server: WEBrick/1.3.1 (Ruby/1.8.7/2010-04-19)
< Content-Length: 0
<

  • Closing connection #0[/code]

A, wiem. To bardzo ciekawy błąd. Nie wiem z jakiego powodu, ale Base64.encode64(“test:test”) zwraca string ze znakiem nowej linii na końcu, przez co nagłówki są przedzielone pustą linią, za którą są spodziewane dane POST. Stąd server nie widzi już nagłówka Content-Length i na to narzeka.

auth_str = Base64.encode64("test:test").chomp

Dzięki, pomogło. To nie był ciekawy błąd, tylko irytujący. :slight_smile: