Home | History | Annotate | Download | only in http
      1 //
      2 //  ========================================================================
      3 //  Copyright (c) 1995-2014 Mort Bay Consulting Pty. Ltd.
      4 //  ------------------------------------------------------------------------
      5 //  All rights reserved. This program and the accompanying materials
      6 //  are made available under the terms of the Eclipse Public License v1.0
      7 //  and Apache License v2.0 which accompanies this distribution.
      8 //
      9 //      The Eclipse Public License is available at
     10 //      http://www.eclipse.org/legal/epl-v10.html
     11 //
     12 //      The Apache License v2.0 is available at
     13 //      http://www.opensource.org/licenses/apache2.0.php
     14 //
     15 //  You may elect to redistribute this code under either of these licenses.
     16 //  ========================================================================
     17 //
     18 
     19 package org.eclipse.jetty.http;
     20 
     21 import java.io.IOException;
     22 import java.io.InputStream;
     23 
     24 import org.eclipse.jetty.io.Buffer;
     25 import org.eclipse.jetty.io.ByteArrayBuffer;
     26 import org.eclipse.jetty.util.log.Log;
     27 import org.eclipse.jetty.util.log.Logger;
     28 import org.eclipse.jetty.util.resource.Resource;
     29 
     30 /* ------------------------------------------------------------ */
     31 /** HttpContent.
     32  *
     33  *
     34  */
     35 public interface HttpContent
     36 {
     37     Buffer getContentType();
     38     Buffer getLastModified();
     39     Buffer getIndirectBuffer();
     40     Buffer getDirectBuffer();
     41     Buffer getETag();
     42     Resource getResource();
     43     long getContentLength();
     44     InputStream getInputStream() throws IOException;
     45     void release();
     46 
     47     /* ------------------------------------------------------------ */
     48     /* ------------------------------------------------------------ */
     49     /* ------------------------------------------------------------ */
     50     public class ResourceAsHttpContent implements HttpContent
     51     {
     52         private static final Logger LOG = Log.getLogger(ResourceAsHttpContent.class);
     53 
     54         final Resource _resource;
     55         final Buffer _mimeType;
     56         final int _maxBuffer;
     57         final Buffer _etag;
     58 
     59         /* ------------------------------------------------------------ */
     60         public ResourceAsHttpContent(final Resource resource, final Buffer mimeType)
     61         {
     62             this(resource,mimeType,-1,false);
     63         }
     64 
     65         /* ------------------------------------------------------------ */
     66         public ResourceAsHttpContent(final Resource resource, final Buffer mimeType, int maxBuffer)
     67         {
     68             this(resource,mimeType,maxBuffer,false);
     69         }
     70 
     71         /* ------------------------------------------------------------ */
     72         public ResourceAsHttpContent(final Resource resource, final Buffer mimeType, boolean etag)
     73         {
     74             this(resource,mimeType,-1,etag);
     75         }
     76 
     77         /* ------------------------------------------------------------ */
     78         public ResourceAsHttpContent(final Resource resource, final Buffer mimeType, int maxBuffer, boolean etag)
     79         {
     80             _resource=resource;
     81             _mimeType=mimeType;
     82             _maxBuffer=maxBuffer;
     83             _etag=etag?new ByteArrayBuffer(resource.getWeakETag()):null;
     84         }
     85 
     86         /* ------------------------------------------------------------ */
     87         public Buffer getContentType()
     88         {
     89             return _mimeType;
     90         }
     91 
     92         /* ------------------------------------------------------------ */
     93         public Buffer getLastModified()
     94         {
     95             return null;
     96         }
     97 
     98         /* ------------------------------------------------------------ */
     99         public Buffer getDirectBuffer()
    100         {
    101             return null;
    102         }
    103 
    104         /* ------------------------------------------------------------ */
    105         public Buffer getETag()
    106         {
    107             return _etag;
    108         }
    109 
    110         /* ------------------------------------------------------------ */
    111         public Buffer getIndirectBuffer()
    112         {
    113             InputStream inputStream = null;
    114             try
    115             {
    116                 if (_resource.length() <= 0 || _maxBuffer < _resource.length())
    117                     return null;
    118                 ByteArrayBuffer buffer = new ByteArrayBuffer((int)_resource.length());
    119                 inputStream = _resource.getInputStream();
    120                 buffer.readFrom(inputStream,(int)_resource.length());
    121                 return buffer;
    122             }
    123             catch (IOException e)
    124             {
    125                 throw new RuntimeException(e);
    126             }
    127             finally
    128             {
    129                 if (inputStream != null)
    130                 {
    131                     try
    132                     {
    133                         inputStream.close();
    134                     }
    135                     catch (IOException e)
    136                     {
    137                         LOG.warn("Couldn't close inputStream. Possible file handle leak",e);
    138                     }
    139                 }
    140             }
    141         }
    142 
    143         /* ------------------------------------------------------------ */
    144         public long getContentLength()
    145         {
    146             return _resource.length();
    147         }
    148 
    149         /* ------------------------------------------------------------ */
    150         public InputStream getInputStream() throws IOException
    151         {
    152             return _resource.getInputStream();
    153         }
    154 
    155         /* ------------------------------------------------------------ */
    156         public Resource getResource()
    157         {
    158             return _resource;
    159         }
    160 
    161         /* ------------------------------------------------------------ */
    162         public void release()
    163         {
    164             _resource.release();
    165         }
    166     }
    167 }
    168