def json_comet_wrapper(request, user_view, fifo_name, time_delta, *args, **kwargs): response_prev = request.META.get('response_prev', None) event_flags = request.META.get('event_flags', None) event_type = request.META.get('event_type', None) if not response_prev: transport = request.GET.get('transport', None) callback = request.GET.get('callback', 'c').replace("'", "").replace('"', '') domain = request.GET.get('domain', request.META['SERVER_NAME']).replace("'", "").replace('"', '') view_data = {} first_request = True else: transport = response_prev.transport callback = response_prev.callback view_data = response_prev.view_data first_request = False # run callback if first request or event (not on timeout) if event_flags != 1: keepalive = False else: # keepalive keepalive = True #kwargs.setdefault('response_prev', response_prev) #kwargs.setdefault('event_flags', event_flags) kwargs.setdefault('view_data', view_data) # that's going to be changed by callback kwargs.setdefault('keepalive', keepalive) kwargs.setdefault('event_type', event_type) payload = user_view(request, *args, **kwargs) if not keepalive or payload: # not keepalive or something returned payload = json.write(payload) else: #keepalive and empty response payload = ' ' # produce Response object, for comet application # first request, not continuation if event_type == EVENT_CLOSED: return HttpResponse() elif first_request: content, mimetype = comet_start(transport, callback, domain) response = HttpResponse(content, mimetype=mimetype) response['Cache-Control'] = 'no-cache' # append user data content = comet_continue(transport, payload, callback) response.write(content) # if not first_request: -> continue previous request else: content = comet_continue(transport, payload, callback) response = HttpResponse(content) response.transport = transport response.callback = callback response.view_data = view_data return defer_for_fifo( response, fifo_name, time_delta, request.META['PATH_INFO'])