All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.king.platform.net.http.netty.request.FileHttpBody Maven / Gradle / Ivy

There is a newer version: 3.0.26
Show newest version
// Copyright (C) king.com Ltd 2015
// https://github.com/king/king-http-client
// Author: Magnus Gustafsson
// License: Apache 2.0, https://raw.github.com/king/king-http-client/LICENSE-APACHE

package com.king.platform.net.http.netty.request;

import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.DefaultFileRegion;
import io.netty.handler.stream.ChunkedNioFile;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;

public class FileHttpBody implements HttpBody {
	private final File file;
	private final String contentType;
	private final long contentLength;
	private Charset characterEncoding;

	public FileHttpBody(File file, String contentType, Charset characterEncoding) {
		this.file = file;
		this.contentType = contentType;
		this.contentLength = file.length();
		this.characterEncoding = characterEncoding;
	}


	@Override
	public long getContentLength() {
		return contentLength;
	}

	@Override
	public String getContentType() {
		if (contentType != null) {
			return contentType;
		}
		return "application/binary";
	}

	@Override
	public Charset getCharacterEncoding() {
		return characterEncoding;
	}

	@Override
	public ChannelFuture writeContent(ChannelHandlerContext ctx, boolean isSecure) throws IOException {
		if (isSecure) {
			return writeChunkedContent(ctx);
		} else {
			return writeStreamedContent(ctx);
		}
	}

	private ChannelFuture writeStreamedContent(ChannelHandlerContext ctx) {
		Channel channel = ctx.channel();
		return channel.write(new DefaultFileRegion(file, 0, file.length()), channel.newProgressivePromise());
	}

	private ChannelFuture writeChunkedContent(ChannelHandlerContext ctx) throws IOException {
		Channel channel = ctx.channel();
		FileChannel fileChannel = new FileInputStream(file).getChannel();
		long length = file.length();
		return channel.write(new ChunkedNioFile(fileChannel, 0, length, 1024 * 8), channel.newProgressivePromise());
	}

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy