void web_server_connection_send_response(web_server_connection_p wc, web_response_p response, const char* protocol, bool close_after_send) { size_t content_length = web_response_get_content(response, NULL, 0); if (content_length > 0) web_headers_set_value(web_response_get_headers(response), "Content-Length", "%d", content_length); size_t response_length = web_response_write(response, protocol, NULL, 0); char buffer[content_length + response_length]; web_response_write(response, protocol, buffer, response_length); web_response_get_content(response, buffer + response_length, content_length); socket_send(wc->socket, buffer, content_length + response_length); log_data(LOG_COMMUNICATION, buffer, content_length + response_length); if (close_after_send) socket_close(wc->socket); }
void _dacp_client_web_connection_response_received_callback(web_client_connection_p connection, web_request_p request, web_response_p response, void* ctx) { struct dacp_client_t* dc = (struct dacp_client_t*)ctx; if (web_response_get_status(response) == 200 && dc->callbacks.playback_state_changed != NULL) { web_headers_p headers = web_response_get_headers(response); size_t content_length; const char* s_content_type = web_headers_value(headers, "Content-Type"); if (s_content_type != NULL && strcmp(s_content_type, "application/x-dmap-tagged") == 0 && (content_length = web_response_get_content(response, NULL, 0)) > 0) { char data[content_length]; web_response_get_content(response, data, content_length); dmap_p dmap = dmap_create(); dmap_parse(dmap, data, content_length); dmap_p container = dmap_container_for_atom_identifer(dmap, "com.airfloat.nowplayingcontainer"); if (container != NULL) { char now_playing = dmap_char_for_atom_identifer(container, "com.airfloat.nowplayingstatus"); dc->playback_state = now_playing; dc->callbacks.playback_state_changed(dc, dc->playback_state, dc->callbacks.ctx.playback_state_changed); } object_release(dmap); } } }