Hi Bjorn,

This should indeed work out of the box. Which HTTP connectors are you using?
If using the internal/default ones, try adding Jetty/Simple
extensions/Apache HTTP client to see if it helps.

Best regards,
Jerome
--
http://www.restlet.com
http://twitter.com/#!/jlouvel


-----Message d'origine-----
De : Bjorn Roche [mailto:[email protected]] 
Envoyé : mardi 10 avril 2012 02:55
À : [email protected]
Objet : Content Range with Output Representation

Hey there,

        I am trying to output large files and with support for Content-Range
header. It seems like I need to use
org.restlet.representation.OutputRepresentation. From what I've read online
and in the book, I expect this to work, however inefficiently, "out of the
box", but I did this:

this.getRangeService().setEnabled(true);

in my top-level restlet, just to be sure. Unfortunately, I've found the
server hangs after serving the required amount of data. I have experimented
with just supplying the amount of data actually requested, but that causes
problems as well.

My code looks something like this the code below. Any help appreciated, as
I'm a bit baffled  and not really sure how to proceed. So far most of my
data has been automagically converted to XML without much thought, and I'm
not really sure how this part of the process actually works.

                        List<Range> ranges = getRequest().getRanges();
                        
                        Range ranget;
                        if( ranges.size() == 0 )
                                ranget = null;
                        else if( ranges.size() == 1 )
                                ranget = ranges.get(0);
                        else
                                return // error not supported!!!
                        final Range range = ranget;
                        if( range != null && range.getSize() +
range.getIndex() > ms.getTotalSize() )
                                return // error: requested out of range

                        //Note: I'm not actually using the range found
above, but I've been playing with it, so I thought I'd include it.
                        OutputRepresentation os = new OutputRepresentation(
new MediaType(m.getMimeType()), ms.getTotalSize()) {
                                @Override
                                public void write(OutputStream outputStream)
throws IOException {
                                        Iterator<MediaChunk> curChunk =
ms.getChunks().iterator();
                                        byte[] b = new byte[10240];
                                        long cur = 0;
                                        long amt = 0;
                                        try {
                                                while( curChunk.hasNext() )
{
                                                        MediaChunk mc =
curChunk.next();
                                                        InputStream is =
mc.openStream();
                                                        try {
                                                                while( true
) {
                                                                        int
r;
        
r=is.read(b);
                                                                        if(
r == -1 )
        
break;
                                                                        cur
+= r;
                                                                        amt
+= r;
        
outputStream.write(b, 0, r); //HANGS HERE!
                                                                }
                                                        } finally {
                                                                is.close();
                                                        }
                                                }
                                        } finally {
                                                outputStream.close();
                                                long s = ms.getTotalSize() ;
                                                if( amt != s )
                                                        throw new
IOException( "Error reading requested data: " + amt + " : " + s );
                                        }
                                }
                     }

-----------------------------
Bjorn Roche
http://www.xonami.com
Audio Collaboration
http://blog.bjornroche.com

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=29466
26

------------------------------------------------------
http://restlet.tigris.org/ds/viewMessage.do?dsForumId=4447&dsMessageId=2949452

Reply via email to