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