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);
    
}
Example #2
0
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);
            
        }
        
    }
    
}