MtGox websockets api returning "400 Bad Request"

2

I want to get started with the Mt. Gox websockets API, but I can't seem to get a good response from the server.

I'm sending the following (captured with Wireshark):

GET /mtgox HTTP/1.1
User-Agent: websocket-sharp/1.0
Upgrade: websocket
Connection: Upgrade
Host: websocket.mtgox.com
Sec-WebSocket-Key: LtH+YFgnW1N8KDLDbocsUQ==
Sec-WebSocket-Version: 13

and the server responds:

HTTP/1.1 400 Bad Request

I've tried sending the handshake via telnet and with this C# code and I still get a 400 Bad Request error:

class Program
{
    static void Main(string[] args)
    {
        ClientWebSocket ws = new ClientWebSocket();
        Task connectionTask = ws.ConnectAsync(new Uri("ws://websocket.mtgox.com/mtgox"), CancellationToken.None);
        Console.Write("Connecting");
        while (!connectionTask.IsCompleted)
        {
            Console.Write(".");
            Thread.Sleep(100);
        }
        Console.WriteLine(ws.State);
    }
}

(The last line printed is "Closed" and when I inspect the handshake with Wireshark I see the same 400 Bad Request)

Any ideas what I'm doing wrong? I can't see much documentation or samples using the websockets API so I don't really have anything to compare to :(

In response to sta's suggestion, I tried this (using WebsocketSharp):

static void Main(string[] args)
{
    WebSocket ws = new WebSocket("ws://websocket.mtgox.com/mtgox");
    ws.Origin = "http://websocket.mtgox.com";
    ws.Connect();
    ws.OnMessage += (sender, e) =>
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    Console.WriteLine("{0}", ws.IsAlive);
    Console.ReadLine();
}

This displays FALSE so there's still something I'm doing wrong :/ I haven't had a chance to dig into WebSocketSharp yet though

Update: With WebsocketSharp setting the Origin header correctly, Wireshark shows the mtgox server accepting the websocket upgrade:

HTTP/1.1 101 Switching Protocols\r\n
Upgrade: websocket\r\n
Connection: Upgrade\r\n
Sec-WebSocket-Accept: 2+1ghzJ/Itt6w1aBdUteghcsJHk=\r\n
\r\n

But WebSocketSharp still reports the connection as closed :(

digitalPhonix

Posted 2013-04-30T14:29:51.637

Reputation: 23

Funny, I just noticed the same thing, but I'm writing a websocket client for node.js.ralphtheninja 2013-04-30T18:37:53.330

There seems to be a big difference between websocket.mtgox.com/mtgox server and the socketio.mtgox.com/mtgox... The sample Loourr posted below works for socketio (slightly different handshake) but I'm still not sure why I can't connect to the websocket one (with C# WebSockets or this websockets implementation for node: https://github.com/Worlize/WebSocket-Node )

digitalPhonix 2013-05-01T13:54:59.773

Can i try to do it with other channel? ticker.BTCEUR,ticker.BTCAUD...etc Best Regards. – None – 2013-05-08T16:07:09.577

Answers

1

It seems that the client should send the Origin header in opening handshake to the MtGox server.

If you use current websocket-sharp, you should do like the following before connecting.

ws.Origin = "http://websocket.mtgox.com";

Could you try?

Update:

Could you try again the following code?

static void Main(string[] args)
{
    var ws = new WebSocket("ws://websocket.mtgox.com/mtgox?Currency=USD");
    ws.Origin = "http://websocket.mtgox.com";
    ws.OnOpen += (sender, e) =>
    {
      ws.Send(
@"{
    ""op"": ""unsubscribe"",
    ""channel"": ""d5f06780-30a8-4a48-a2f8-7ed181b4a13f""
}"
      );
    };
    ws.OnMessage += (sender, e) =>
    {
        if (!String.IsNullOrEmpty(e.Data))
        {
            Console.WriteLine("{0}", e.Data);
        }
    };
    ws.Connect();
    Console.ReadLine();
    ws.Close();
}

It seems that an exception has occurred when the client is receiving ticker type data in a while.

I'll investigate a little further.

Update:

I've found out the cause of the exception, and fixed websocket-sharp.

Could you try your code with current websocket-sharp?

sta

Posted 2013-04-30T14:29:51.637

Reputation: 26

I just tried this and WebsocketSharp reports the connection to be closed: (added the code to the question)digitalPhonix 2013-05-12T02:22:28.550

This using wss:// works!digitalPhonix 2013-11-21T03:07:13.077

0

For one the url should be websocket.mtgox.com/mtgox. Here is a sample project which uses the node.js socket.io library.

I dont have much experience in C#, but here is an implementation in node.js

var io = require('socket.io-client');
var socket = io.connect( 'https://socketio.mtgox.com/mtgox' );

var message = {
  "op": "subscribe",
  "channel": "24e67e0d-1cad-4cc0-9e7a-f8523ef460fe" // this is the market depth channel
};

socket.send(JSON.stringify(message));

socket.on('message', function(message) { console.log(message); });

This will log market depth changes to the console.

Loourr

Posted 2013-04-30T14:29:51.637

Reputation: 3 022

Don't have reputation to vote up :( Thanks though! I'm going to try and figure out how the Node.JS example handshakes differently... Changing my code to connect to https://socketio.mtgox.com/mtgox instead of what I had results in the server immediately closing the connection (doesn't even send a bad request response)

digitalPhonix 2013-05-01T04:38:45.977

Glad it helped. You can except an answer as correct however ;-)Loourr 2013-05-01T15:37:17.533

I'd like to use the raw websocket api. Socket.io creates bad abstractions.ralphtheninja 2013-05-02T11:30:25.153