0

I'm using Ruby 1.8.7 which does not allow me to use the newest HipChat gem (due to httparty incompatibility) and an older version does not work. It seems though that even a simple script like this cannot accomplish the task. I cannot figure out what is wrong with it

require 'uri'
require 'net/http'
require 'net/https'
require 'json'

data = {
    'color' => 'green',
    'message' => 'Yaba-daba-doo!',
    'notify' => false
}.to_json

uri = URI.parse('https://api.hipchat.com/v2/room/ROOM_ID/notification?auth_token=MY_TOKEN')

https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

req = Net::HTTP::Post.new(uri.path, initheader = {'Content-Type' =>'application/json'})

req.body = "[ #{data} ]"

res = https.request(req)
puts "Response #{res.code} #{res.message}: #{res.body}"

yields

Response 401 Unauthorized: {
  "error": {
    "code": 401,
    "message": "Authenticated requests only. See https://www.hipchat.com/docs/apiv2/auth for more information.",
    "type": "Unauthorized"
  }
}

while this works

curl -d '{"color": "green", "message": "Foobar, damn it!", "notify": false, "message_format": "text"}' -H 'Content-Type: application/json' https://api.hipchat.com/v2/room/ROOM_ID/notification?auth_token=MY_TOKEN

I've tried it every way I can imagine and it just seems that HipChat API does not see my token. I also tried sending it via Authorization header, but to no success..

EDIT: I tried to see what Ruby is actually sending and it got rid of the auth_token parameter altogether. So I sent it as a header

headers = {
  'Content-Type' =>'application/json',
  'Authorization:' => "Bearer #{auth_token}"
}

req = Net::HTTP::Post.new(uri.path, initheader = headers)

Still no luck. Here are two Wireshark frames captured. The CURL one passed, the Ruby one didn't.

Curl (successful):

Frame 458912: 356 bytes on wire (2848 bits), 356 bytes captured (2848 bits) on interface 0
Ethernet II, Src: Apple_09:01:72 (80:e6:50:09:01:72), Dst: Routerbo_fa:1e:71 (d4:ca:6d:fa:1e:71)
Internet Protocol Version 4, Src: 192.168.1.138 (192.168.1.138), Dst: 107.21.219.105 (107.21.219.105)
Transmission Control Protocol, Src Port: 65126 (65126), Dst Port: 80 (80), Seq: 1, Ack: 1, Len: 290
Hypertext Transfer Protocol
    POST /v2/room/ROOM_ID/notification HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): POST /v2/room/ROOM_ID/notification HTTP/1.1\r\n]
            [POST /v2/room/ROOM_ID/notification HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: POST
        Request URI: /v2/room/ROOM_ID/notification
        Request Version: HTTP/1.1
    Host: api.hipchat.com\r\n
    User-Agent: curl/7.43.0\r\n
    Accept: */*\r\n
    Content-Type: application/json\r\n
    Authorization: Bearer AUTH_TOKEN\r\n
    Content-Length: 66\r\n
        [Content length: 66]
    \r\n
    [Full request URI: http://api.hipchat.com/v2/room/ROOM_ID/notification]
    [HTTP request 1/1]
    [Response in frame: 458920]
JavaScript Object Notation: application/json
    Object
        Member Key: "color"
            String value: green
        Member Key: "message"
            String value: Foobar, damn it!
        Member Key: "notify"
            False value

** Ruby (unsuccessful) **

Frame 453567: 127 bytes on wire (1016 bits), 127 bytes captured (1016 bits) on interface 0
Ethernet II, Src: Apple_09:01:72 (80:e6:50:09:01:72), Dst: Routerbo_fa:1e:71 (d4:ca:6d:fa:1e:71)
Internet Protocol Version 4, Src: 192.168.1.138 (192.168.1.138), Dst: 107.21.219.105 (107.21.219.105)
Transmission Control Protocol, Src Port: 65124 (65124), Dst Port: 80 (80), Seq: 220, Ack: 1, Len: 61
[2 Reassembled TCP Segments (280 bytes): #453562(219), #453567(61)]
Hypertext Transfer Protocol
    POST /v2/room/ROOM_ID/notification HTTP/1.1\r\n
        [Expert Info (Chat/Sequence): POST /v2/room/ROOM_ID/notification HTTP/1.1\r\n]
            [POST /v2/room/ROOM_ID/notification HTTP/1.1\r\n]
            [Severity level: Chat]
            [Group: Sequence]
        Request Method: POST
        Request URI: /v2/room/ROOM_ID/notification
        Request Version: HTTP/1.1
    Content-Type: application/json\r\n
    Connection: close\r\n
    Accept: */*\r\n
    Content-Length: 61\r\n
        [Content length: 61]
    Authorization:: Bearer AUTH_TOKEN\r\n
    Host: api.hipchat.com\r\n
    \r\n
    [Full request URI: http://api.hipchat.com/v2/room/ROOM_ID/notification]
    [HTTP request 1/1]
    [Response in frame: 453576]
JavaScript Object Notation: application/json
    Object
        Member Key: "message"
            String value: Foobar, damn it!
        Member Key: "color"
            String value: green
        Member Key: "notify"
            False value
General Grievance
  • 4,555
  • 31
  • 31
  • 45
Lightheaded
  • 644
  • 8
  • 23
  • Have you tried using something like Wireshark in order to determine whether you are actually accessing the url that you think you are? The only thing I can think of is that the URL used in Net::HTTP::Post is discarding the parameter after the `?`. – mcfinnigan Aug 25 '15 at 08:00
  • Thanks for the suggestion. I tried, but am unable to catch any traffic, cURL or Ruby with Wireshark. I'm not entirely sure which filter to use. – Lightheaded Aug 25 '15 at 09:42
  • It should be standard TCP traffic; see if you can find a filter that will filter TCP by destination IP address and then add the hipchat API host ip address to that filter. – mcfinnigan Aug 25 '15 at 09:45
  • I switched to http and added the Wireshark frames to the original post. It turns out ruby cuts parameters added with the url. I switched to header auth, but still can't figure out what's wrong. – Lightheaded Aug 26 '15 at 07:56

0 Answers0