Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /* ************************************************************************
  #
  #  DivConq
  #
  #  http://divconq.com/
  #
  #  Copyright:
  #    Copyright 2014 eTimeline, LLC. All rights reserved.
  #
 #  License:
 #    See the license.txt file in the project's top-level directory for details.
 #
 #  Authors:
 #    * Andy White
 #
 ************************************************************************ */
 package divconq.api.internal;
 
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
 
     protected Channel src = null;
     protected WritableByteChannel dest = null;
     protected Map<StringCookiecookies = new HashMap<>();
     protected OperationCallback callback = null;
     protected long size = 0;
     protected long sent = 0;
     
 	public Channel allocateChannel(final HyperSession parentOperationResult or) {
 		final AtomicReference<Future<Channel>> sslready = new AtomicReference<>();
 		
         Bootstrap b = new Bootstrap();
         
         b.group(..getEventLoopGroup())
          .channel(NioSocketChannel.class)
          .handler(new ChannelInitializer<SocketChannel>() {
              @Override
              public void initChannel(SocketChannel chthrows Exception {
 				ChannelPipeline pipeline = ch.pipeline();
 				 
 				if (parent.getInfo().isSecurel()) {
 					SslHandler sh = new SslHandler(parent.getSsl().getClientEngine());
 					sslready.set(sh.handshakeFuture());
 					pipeline.addLast("ssl"sh);
 				}
                  
 				pipeline.addLast("codec"new HttpClientCodec());
 				//pipeline.addLast("decoder", new HttpResponseDecoder());
 				//pipeline.addLast("encoder", new HttpRequestEncoder());
 
 				pipeline.addLast("handler"DownloadHandler.this);
              }
          });
 
         or.info("Web Data Client connecting");
         
         try {
         	// must wait here to make sure we don't release connectLock too soon
         	// we want chanel init (above) to complete before we try connect again
         	ChannelFuture f = b.connect(parent.getInfo().getAddress()).sync();
        	
        	if (!f.isSuccess()) {
            	or.error(1, "Web Data Client unable to successfully connect: " + f.cause());
        	}
        	
        	// it has appeared that sometimes we "overshoot" the ssl handshake in code - to prevent
        	// that lets wait for the handshake to be done for sure
        	if (sslready.get() != null) {
        		Future<Channelsf = sslready.get().sync();
            	
            	if (!sf.isSuccess()) {
                	or.error(1, "Web Data Client unable to securely connect: " + sf.cause());
            	}
        	}
        	
        	return f.channel();
        }
        catch (InterruptedException x) {
        	or.error(1, "Web Data Client interrupted while connecting: " + x);
        }
        catch (Exception x) {
        	or.error(1, "Web Data Client unable to connect: " + x);
        }
        
        return null;
	}
    	
	public void start(final HyperSession parentWritableByteChannel destString chanidMap<StringCookiecookieslong sizelong offsetfinal OperationCallback callback) {
    	this. = dest;
    	this. = cookies;
    	this. = callback;
    	this. = size;
    	this. = offset;
    	this. = this.allocateChannel(parentcallback);
    	
    	if (this..hasErrors()) {
        	callback.complete();
        	return;
    	}
		// send a request to get things going
		HttpRequest req = new DefaultHttpRequest(.."/download/" + chanid);
		req.headers().set(.parent.getInfo().getHost());
		req.headers().set(."DivConq HyperAPI Client 1.0");
        req.headers().set(., ClientCookieEncoder.encode(this..values()));
        
        // send request
        this..writeAndFlush(req);
	}
	public void finish() {
		//System.out.println("client finished with content");
		try {
			this..close();
		catch (IOException x) {
		}
	}
	public void channelRead0(ChannelHandlerContext ctxHttpObject msgthrows Exception {
		//System.out.println("download client got object: " + msg.getClass().getName());
    	if (msg instanceof HttpContent) {
    		HttpContent chunk = (HttpContentmsg;
        	
			try {
				//System.out.println("client offered content");
				int camt = chunk.content().readableBytes();
				for (ByteBuffer bb : chunk.content().nioBuffers())
					this..write(bb);
				this. += camt;
				this..getContext().setAmountCompleted((int)(this. * 100 / this.));
				// final only if not canceled
				if (chunk instanceof LastHttpContent
					this.finish();
			}
			catch (IOException x) {
				this..error(1, "Failed download because of local io error: " + x);
				this.finish();
			}
    		return;
    	}    	
    	if (!(msg instanceof HttpResponse)) {
			..println("Got unknown instead of headers!");	// TODO
            return;
        }
    	HttpResponse resp = (HttpResponsemsg;
    	// keep the cookies - especially Session!
        List<Stringcookies = resp.headers().getAll(.);
        
        for (String cookie : cookies) {
        	Set<Cookiecset = CookieDecoder.decode(cookie);
        	
        	for (Cookie c : cset
        		this..put(c.getName(), c);
        }
		// TODO if error response then cancel otherwise 
		// ignore we don't care 	
		//System.out.println("Got response: " + resp);
	}
    @Override
    public void channelInactive(ChannelHandlerContext ctxthrows Exception {
    	// TODO logging
        ..println("Web Client Download disconnected!");
    }
    @Override
    public void exceptionCaught(ChannelHandlerContext ctxThrowable causethrows Exception {
    	// TODO logging
        cause.printStackTrace();        
        ctx.close();
    }
	public void closeSource() {
		try {
			if (this. != null)
				this..close().await(2000);
		catch (InterruptedException x) {
			// ignore 
		}
	}
New to GrepCode? Check out our FAQ X