anchor.diff:      throw({not_found, json_mismatch}).
   
   send_view_list_response(Lang, ListSrc, ViewName, DesignId, Req, Db) ->
  -    % TODO add etags when we get view etags
       #view_query_args{
           stale = Stale,
           reduce = Reduce
  
positive.code:         couch_httpd_external:send_external_response(Req, JsonResp)
      end);
  
  send_doc_show_response(Lang, ShowSrc, #doc{revs=[DocRev|_]}=Doc, #httpd{mochi_req=MReq}=Req, Db) ->
      % calculate the etag
      Headers = MReq:get(headers),
      Hlist = mochiweb_headers:to_list(Headers),
  
negative.code:     Hlist = mochiweb_headers:to_list(Headers),
      Accept = proplists:get_value('Accept', Hlist),
      CurrentEtag = couch_httpd_view:view_group_etag(Group, {Lang, ListSrc, Accept}),
      couch_httpd:etag_respond(Req, CurrentEtag, fun() ->
          StartListRespFun = fun(Req2, _Etag, _, _) ->
              JsonResp = couch_query_servers:render_reduce_head(QueryServer, 
                  Req2, Db),
              JsonResp2 = apply_etag(JsonResp, CurrentEtag),
              #extern_resp_args{
                  code = Code,
                  data = BeginBody,
                  ctype = CType,
                  headers = ExtHeaders
              } = couch_httpd_external:parse_external_response(JsonResp2),
              JsonHeaders = couch_httpd_external:default_or_content_type(CType, ExtHeaders),
              {ok, Resp} = start_chunked_response(Req, Code, JsonHeaders),
              {ok, Resp, binary_to_list(BeginBody)}
          end,
      
          SendListRowFun = fun(Resp, {Key, Value}, RowFront) ->
              JsonResp = couch_query_servers:render_reduce_row(QueryServer, 
                  Req, Db, {Key, Value}),
              #extern_resp_args{
                  stop = StopIter,
                  data = RowBody
              } = couch_httpd_external:parse_external_response(JsonResp),
              RowFront2 = case RowFront of
              nil -> [];
              _ -> RowFront
              end,
              case StopIter of
              true -> stop;
              _ ->
                  Chunk = RowFront2 ++ binary_to_list(RowBody),
                  case Chunk of
                      [] -> {ok, Resp};
                      _ -> send_chunk(Resp, Chunk)
                  end
              end
          end,
      
          {ok, GroupRowsFun, RespFun} = couch_httpd_view:make_reduce_fold_funs(Req, 
              GroupLevel, QueryArgs, CurrentEtag, 
              #reduce_fold_helper_funs{
                  start_response = StartListRespFun,
                  send_row = SendListRowFun
              }),
          FoldAccInit = {Limit, SkipCount, undefined, []},
          FoldResult = couch_view:fold_reduce(View, Dir, {StartKey, StartDocId},
              {EndKey, EndDocId}, GroupRowsFun, RespFun,
              FoldAccInit),
          finish_list(Req, Db, QueryServer, CurrentEtag, FoldResult, StartListRespFun, null)
      end).
  
  finish_list(Req, Db, QueryServer, Etag, FoldResult, StartListRespFun, TotalRows) ->
      case FoldResult of
  