Example #1
0
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'])