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 :(

  • Funny, I just noticed the same thing, but I'm writing a websocket client for node.js. – ralphtheninja Apr 30 '13 at 18:37
  • 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: github.com/Worlize/WebSocket-Node ) – digitalPhonix May 1 '13 at 13:54
  • Can i try to do it with other channel? ticker.BTCEUR,ticker.BTCAUD...etc Best Regards. – user4903 May 8 '13 at 16:07
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?

  • I just tried this and WebsocketSharp reports the connection to be closed: (added the code to the question) – digitalPhonix May 12 '13 at 2:22
  • This using wss:// works! – digitalPhonix Nov 21 '13 at 3:07
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.

  • 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 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 May 1 '13 at 4:38
  • Glad it helped. You can except an answer as correct however ;-) – Loourr May 1 '13 at 15:37
  • I'd like to use the raw websocket api. Socket.io creates bad abstractions. – ralphtheninja May 2 '13 at 11:30

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.