From d2aa7364928da59f8f00c294354079d14d8c33cb Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Sun, 8 Nov 2015 03:55:30 +0000 Subject: [PATCH] fix master server communication --- src/network/http.cpp | 4 ++++ src/network/network.cpp | 7 +++---- src/windows/server_list.c | 25 ++++++++++++++++--------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/network/http.cpp b/src/network/http.cpp index 3711694acb..ba6557578c 100644 --- a/src/network/http.cpp +++ b/src/network/http.cpp @@ -69,6 +69,10 @@ http_json_response *http_request_json(const char *url) writeBuffer.length = 0; writeBuffer.capacity = 0; + curl_slist *headers = NULL; + headers = curl_slist_append(headers, "Accept: application/json"); + + curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, true); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, true); curl_easy_setopt(curl, CURLOPT_CAINFO, "curl-ca-bundle.crt"); diff --git a/src/network/network.cpp b/src/network/network.cpp index 4084075d1c..eef553901a 100644 --- a/src/network/network.cpp +++ b/src/network/network.cpp @@ -615,7 +615,7 @@ void Network::UpdateServer() switch (advertise_status) { case ADVERTISE_STATUS_UNREGISTERED: - if (SDL_TICKS_PASSED(SDL_GetTicks(), last_advertise_time + MASTER_SERVER_REGISTER_TIME)) { + if (last_advertise_time == 0 || SDL_TICKS_PASSED(SDL_GetTicks(), last_advertise_time + MASTER_SERVER_REGISTER_TIME)) { AdvertiseRegister(); } break; @@ -856,7 +856,7 @@ void Network::AdvertiseRegister() // Send the registration request std::string url = GetMasterServerUrl() + std::string("?command=register&port=") + std::to_string(listening_port) - + std::string("key=") + advertise_key; + + std::string("&key=") + advertise_key; http_request_json_async(url.c_str(), [](http_json_response *response) -> void { if (response == NULL) { log_warning("Unable to connect to master server"); @@ -892,8 +892,7 @@ void Network::AdvertiseHeartbeat() // Send the heartbeat request std::string url = GetMasterServerUrl() + std::string("?command=heartbeat&token=") + advertise_token - + std::string("key=") + advertise_key - + std::string("players=") + std::to_string(network_get_num_players()); + + std::string("&players=") + std::to_string(network_get_num_players()); // TODO send status data (e.g. players) via JSON body diff --git a/src/windows/server_list.c b/src/windows/server_list.c index 4201f2eef8..5bbb4bfbff 100644 --- a/src/windows/server_list.c +++ b/src/windows/server_list.c @@ -684,32 +684,39 @@ static void fetch_servers_callback(http_json_response* response) return; } - int count = json_array_size(response->root); + int count = json_array_size(jsonServers); for (int i = 0; i < count; i++) { - json_t *server = json_array_get(response->root, i); + json_t *server = json_array_get(jsonServers, i); if (!json_is_object(server)) { continue; } - json_t *address = json_object_get(server, "address"); + json_t *port = json_object_get(server, "port"); json_t *name = json_object_get(server, "name"); + json_t *description = json_object_get(server, "description"); json_t *requiresPassword = json_object_get(server, "requiresPassword"); json_t *version = json_object_get(server, "version"); json_t *players = json_object_get(server, "players"); - json_t *maxplayers = json_object_get(server, "maxPlayers"); - json_t *description = json_object_get(server, "description"); + json_t *maxPlayers = json_object_get(server, "maxPlayers"); + json_t *ip = json_object_get(server, "ip"); + json_t *ip4 = json_object_get(ip, "v4"); + json_t *ip6 = json_object_get(ip, "v6"); + json_t *addressIp = json_array_get(ip4, 0); + + char address[256]; + snprintf(address, sizeof(address), "%s:%d", json_string_value(addressIp), (int)json_integer_value(port)); SDL_LockMutex(_mutex); - saved_server* newserver = add_saved_server((char*)json_string_value(address)); + saved_server* newserver = add_saved_server(address); SafeFree(newserver->name); + SafeFree(newserver->description); + SafeFree(newserver->version); newserver->name = _strdup(json_string_value(name)); newserver->requiresPassword = json_boolean_value(requiresPassword); - SafeFree(newserver->description); newserver->description = _strdup(json_string_value(description)); - SafeFree(newserver->version); newserver->version = _strdup(json_string_value(version)); newserver->players = (uint8)json_integer_value(players); - newserver->maxplayers = (uint8)json_integer_value(maxplayers); + newserver->maxplayers = (uint8)json_integer_value(maxPlayers); SDL_UnlockMutex(_mutex); } http_request_json_dispose(response);