/* * Copyright 2013 Guidewire Software, Inc. */ package gw.internal.xml.ws.server; import java.io.InputStream; import java.io.IOException; import java.io.ByteArrayInputStream; /** * This will extract the header from the input stream */ public class ExtractHeaderFromIS extends InputStream { final private InputStream _wrapped; final private byte[] _buf = new byte[1024]; private int _len; private int _pos; public ExtractHeaderFromIS(InputStream inputStream) throws IOException { _wrapped = inputStream; _len = _wrapped.read(_buf); } public InputStream getHeader() { int len = 0; while (len != _buf.length) { if (_buf[len] == '>' && _buf[len -1] != '?' ) { break; } len++; } _buf[len++] = '/'; _buf[len++] = '>'; return new ByteArrayInputStream(_buf, 0, len); } @Override public int available() throws IOException { return _wrapped.available() + (_len - _pos); } @Override public void close() throws IOException { _wrapped.close(); } @Override public void mark(int readAheadLimit) { throw new UnsupportedOperationException(); } @Override public boolean markSupported() { throw new UnsupportedOperationException(); } @Override public int read() throws IOException { if (_pos < _len) { return _buf[_pos++]; } return _wrapped.read(); } @Override public int read(byte[] b, int off, int len) throws IOException { if (_pos < _len) { return move(b, off, len); } return _wrapped.read(b, off, len); } @Override public void reset() { throw new UnsupportedOperationException(); } @Override public long skip(long n) throws IOException { throw new UnsupportedOperationException(); } @Override public int read(byte[] b) throws IOException { if (_pos < _len) { return move(b, 0, b.length); } return _wrapped.read(b); } private int move(byte[] b, int off, int len) { int cnt = (_len - _pos); len = len < cnt ? len : cnt; System.arraycopy(_buf, _pos, b, off, len); _pos += len; return len; } }