void service::add_http_head(int status, char *s_status, char *filetype) { add_status_line(status, s_status); add_date(); add_content_length(m_file_stat.st_size); add_blank_line(); }
static void on_transaction_progress (GDBusProxy *proxy, gchar *sender_name, gchar *signal_name, GVariant *parameters, gpointer user_data) { TransactionProgress *tp = user_data; if (g_strcmp0 (signal_name, "SignatureProgress") == 0) { /* We used to print the signature here, but doing so interferes with the * libostree HTTP progress, and it gets really, really verbose when doing * a deploy. Let's follow the Unix philosophy here: silence is success. */ } else if (g_strcmp0 (signal_name, "Message") == 0) { const gchar *message = NULL; g_variant_get_child (parameters, 0, "&s", &message); if (tp->in_status_line) add_status_line (tp, message, -1); else g_print ("%s\n", message); } else if (g_strcmp0 (signal_name, "TaskBegin") == 0) { /* XXX: whenever libglnx implements a spinner, this would be appropriate * here. */ const gchar *message = NULL; g_variant_get_child (parameters, 0, "&s", &message); g_print ("%s... ", message); } else if (g_strcmp0 (signal_name, "TaskEnd") == 0) { const gchar *message = NULL; g_variant_get_child (parameters, 0, "&s", &message); g_print ("%s\n", message); } else if (g_strcmp0 (signal_name, "PercentProgress") == 0) { const gchar *message = NULL; guint32 percentage; g_variant_get_child (parameters, 0, "&s", &message); g_variant_get_child (parameters, 1, "u", &percentage); add_status_line (tp, message, percentage); } else if (g_strcmp0 (signal_name, "DownloadProgress") == 0) { g_autofree gchar *line = NULL; guint64 start_time; guint64 elapsed_secs; guint outstanding_fetches; guint outstanding_writes; guint n_scanned_metadata; guint metadata_fetched; guint outstanding_metadata_fetches; guint total_delta_parts; guint fetched_delta_parts; guint total_delta_superblocks; guint64 total_delta_part_size; guint fetched; guint requested; guint64 bytes_transferred; guint64 bytes_sec; g_variant_get (parameters, "((tt)(uu)(uuu)(uuut)(uu)(tt))", &start_time, &elapsed_secs, &outstanding_fetches, &outstanding_writes, &n_scanned_metadata, &metadata_fetched, &outstanding_metadata_fetches, &total_delta_parts, &fetched_delta_parts, &total_delta_superblocks, &total_delta_part_size, &fetched, &requested, &bytes_transferred, &bytes_sec); line = transaction_get_progress_line (start_time, elapsed_secs, outstanding_fetches, outstanding_writes, n_scanned_metadata, metadata_fetched, outstanding_metadata_fetches, total_delta_parts, fetched_delta_parts, total_delta_superblocks, total_delta_part_size, fetched, requested, bytes_transferred, bytes_sec); add_status_line (tp, line, -1); } else if (g_strcmp0 (signal_name, "ProgressEnd") == 0) { end_status_line (tp); } else if (g_strcmp0 (signal_name, "Finished") == 0) { if (tp->error == NULL) { g_autofree char *error_message = NULL; gboolean success = FALSE; g_variant_get (parameters, "(bs)", &success, &error_message); if (!success) { tp->error = g_dbus_error_new_for_dbus_error ("org.projectatomic.rpmostreed.Error.Failed", error_message); } } transaction_progress_end (tp); } }
static response_status write_headers(client_t *client, char *data, size_t datalen, char is_file) { write_bucket *bucket; uint32_t hlen = 0; PyObject *headers = NULL, *templist = NULL; response_status ret; DEBUG("header write? %d", client->header_done); if(client->header_done){ return STATUS_OK; } //TODO ERROR CHECK headers = PySequence_Fast(client->headers, "header must be list"); hlen = PySequence_Fast_GET_SIZE(headers); bucket = new_write_bucket(client->fd, (hlen * 4) + 42 ); if(bucket == NULL){ goto error; } templist = PyList_New(hlen * 4); bucket->temp1 = templist; if(add_status_line(bucket, client) == -1){ goto error; } //write header if(add_all_headers(bucket, headers, hlen, client) == -1){ //Error goto error; } // check content_length_set if(data && !client->content_length_set && client->http_parser->http_minor == 1){ //Transfer-Encoding chunked add_header(bucket, "Transfer-Encoding", 17, "chunked", 7); client->chunked_response = 1; } if (is_file && !client->content_length_set){ if (set_file_content_length(client, bucket) == -1) { goto error; } } if(client->keep_alive == 1){ //Keep-Alive add_header(bucket, "Connection", 10, "Keep-Alive", 10); }else{ add_header(bucket, "Connection", 10, "close", 5); } set2bucket(bucket, CRLF, 2); //write body client->bucket = bucket; set_first_body_data(client, data, datalen); ret = writev_bucket(bucket); if(ret != STATUS_SUSPEND){ client->header_done = 1; if(ret == STATUS_OK && data){ client->write_bytes += datalen; } // clear free_write_bucket(bucket); client->bucket = NULL; } Py_DECREF(headers); return ret; error: if (PyErr_Occurred()){ /* write_error_log(__FILE__, __LINE__); */ call_error_logger(); } Py_XDECREF(headers); if(bucket){ free_write_bucket(bucket); client->bucket = NULL; } return STATUS_ERROR; }