static GError * _client_manage_reply(struct gridd_client_s *client, MESSAGE reply) { GError *err; gint status = 0; gchar *message = NULL; if (!metaXClient_reply_simple(reply, &status, &message, NULL)) return NEWERROR(500, "Invalid reply"); switch (status / 100) { case 0: err = NEWERROR(status, "net error: %s", message); g_free(message); metautils_pclose(&(client->fd)); client->step = STATUS_FAILED; return err; case 1: /* Informational reply : */ g_get_current_time(&(client->tv_step)); client->step = REP_READING_SIZE; g_free(message); return NULL; case 2: g_get_current_time(&(client->tv_step)); client->step = (status==200) ? STATUS_OK : REP_READING_SIZE; if (client->step == STATUS_OK) { if (!client->keepalive) metautils_pclose(&(client->fd)); } g_free(message); if (client->on_reply) { if (!client->on_reply(client->ctx, reply)) return NEWERROR(500, "Handler error"); } return NULL; case 3: /* redirection */ if (status == CODE_REDIRECT) { /* Reset the context */ _client_reset_reply(client); _client_reset_cnx(client); client->sent_bytes = 0; if ((++ client->nb_redirects) > 7) { g_free(message); return NEWERROR(CODE_TOOMANY_REDIRECT, "Too many redirections"); } /* Save the current URL to avoid looping, and check * for a potential loop */ g_string_append_c(client->past_url, '|'); g_string_append(client->past_url, client->url); if (_client_looped(client, message)) { g_free(message); return NEWERROR(CODE_LOOP_REDIRECT, "Looping on redirections"); } /* Replace the URL */ memset(client->url, 0, sizeof(client->url)); g_strlcpy(client->url, message, sizeof(client->url)-1); if (NULL != (err = _client_connect(client))) { g_free(message); g_prefix_error(&err, "Redirection error: Connect error: "); return err; } g_free(message); return NULL; } /* FALLTHROUGH */ default: /* all other are considered errors */ err = NEWERROR(status, "Request error: %s", message); g_free(message); if (!client->keepalive) _client_reset_cnx(client); _client_reset_reply(client); return err; } }
static GError * _client_manage_reply(struct gridd_client_s *client, MESSAGE reply) { GError *err; guint status = 0; gchar *message = NULL; if (NULL != (err = metaXClient_reply_simple(reply, &status, &message))) { g_prefix_error (&err, "reply: "); return err; } if (CODE_IS_NETWORK_ERROR(status)) { err = NEWERROR(status, "net error: %s", message); g_free(message); metautils_pclose(&(client->fd)); client->step = STATUS_FAILED; return err; } if (status == CODE_TEMPORARY) { g_get_current_time(&(client->tv_step)); client->step = REP_READING_SIZE; g_free(message); return NULL; } if (CODE_IS_OK(status)) { g_get_current_time(&(client->tv_step)); client->step = (status==CODE_FINAL_OK) ? STATUS_OK : REP_READING_SIZE; if (client->step == STATUS_OK) { if (!client->keepalive) metautils_pclose(&(client->fd)); } g_free(message); if (client->on_reply) { if (!client->on_reply(client->ctx, reply)) return NEWERROR(CODE_INTERNAL_ERROR, "Handler error"); } return NULL; } if (status == CODE_REDIRECT) { /* Reset the context */ _client_reset_reply(client); _client_reset_cnx(client); client->sent_bytes = 0; if ((++ client->nb_redirects) > 7) { g_free(message); return NEWERROR(CODE_TOOMANY_REDIRECT, "Too many redirections"); } /* Save the current URL to avoid looping, and check * for a potential loop */ g_string_append_c(client->past_url, '|'); g_string_append(client->past_url, client->url); if (_client_looped(client, message)) { g_free(message); return NEWERROR(CODE_LOOP_REDIRECT, "Looping on redirections"); } /* Replace the URL */ memset(client->url, 0, sizeof(client->url)); g_strlcpy(client->url, message, sizeof(client->url)-1); if (NULL != (err = _client_connect(client))) { g_free(message); g_prefix_error(&err, "Redirection error: Connect error: "); return err; } g_free(message); return NULL; } /* all other are considered errors */ err = NEWERROR(status, "Request error: %s", message); g_free(message); if (!client->keepalive) _client_reset_cnx(client); _client_reset_reply(client); return err; }