/** The real "store file" method. */ private CmdResult putFile( String url, // Only one of these two should be given: int nBytes, ReadableByteChannel contents, boolean calcHash, NVPair[] extraHeaders) throws HoneycombTestException, IOException, ModuleException { NVPair[] headers = null; MessageDigest sha = null; if (calcHash) try { sha = MessageDigest.getInstance(HC_HASH); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } CmdResult cr = new CmdResult(); cr.filename = url; byte[] byte_buffer = new byte[BUFSIZE]; ByteBuffer buff = ByteBuffer.wrap(byte_buffer); int toWrite, written = 0; long startTime = System.currentTimeMillis(); if (contents != null) // If we're not writing from our buffer, don't set Content-type headers = extraHeaders; else if (extraHeaders == null) headers = putHeaders; else { // Need to combine the two arrays NVPair[] newHeaders = new NVPair[putHeaders.length + extraHeaders.length]; int i = 0; for (int j = 0; j < putHeaders.length; j++) newHeaders[i++] = putHeaders[j]; for (int j = 0; j < extraHeaders.length; j++) newHeaders[i++] = extraHeaders[j]; headers = newHeaders; } HttpOutputStream out = new HttpOutputStream(); HTTPResponse response = conn.Put(url, out, headers); // Write into the HTTP stream for (; ; ) { if (contents != null) { // Read from the "contents" channel and write it out if ((toWrite = contents.read(buff)) < 0) break; byte[] data = buff.array(); if (sha != null) sha.update(data); out.write(data, 0, toWrite); buff.clear(); } else { // Write from the buffer writeBuf if (written >= nBytes) break; toWrite = nBytes - written; if (toWrite > BUFSIZE) { out.write(writeBuf); written += BUFSIZE; if (sha != null) sha.update(writeBuf); } else { out.write(writeBuf, 0, toWrite); if (sha != null) sha.update(writeBuf, 0, toWrite); break; } } } out.close(); if (response.getStatusCode() >= 300) throw makeTestException("putFile", url, response); cr.mdoid = response.getHeader("ETag"); cr.time = System.currentTimeMillis() - startTime; cr.pass = true; if (sha != null) cr.datasha1 = HCUtil.convertHashBytesToString(sha.digest()); return cr; }
/** * Writes a single byte on the stream. It is subject to the same rules as <code> * write(byte[], int, int)</code>. * * @param b the byte to write * @exception IOException if any exception is thrown by the socket * @see #write(byte[], int, int) */ public void write(int b) throws IOException, IllegalAccessError { byte[] tmp = {(byte) b}; write(tmp, 0, 1); }