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;
 
 
 public class ClientHandler extends SimpleChannelInboundHandler<Object> {
     //protected WebSocketClientHandshaker handshaker = null;
     protected ClientInfo info = null;
     protected Channel chan = null;
     protected ApiSession session = null;
     protected Map<StringCookiecookies = new HashMap<>();
     protected IContentDecoder decoder = null;
     protected Semaphore wsready = new Semaphore(0);
 
     public void setChannel(Channel v) {
 		this. = v;
 	}
     
     public Map<StringCookiegetCookies() {
 		return this.;
 	}
     
     public ClientHandler(ApiSession sessionClientInfo info) {
     	this. = session;
     	this. = info;
     }
     
 	public void send(Message msg) {
 		Logger.debug("Sending message: " + msg);
 		
 		try {
 			if (this. != null) {
 				if (this..getKind() == .)
 				else {
 					
 					req.headers().set(.this..getHost());
 					req.headers().set(."DivConq HyperAPI Client 1.0");
 					req.headers().set(."UTF-8");
 					req.headers().set(."application/json; charset=utf-8");
 		            req.headers().set(., ClientCookieEncoder.encode(this..values()));
 				    
 		            // TODO make more efficient - UTF8 encode directly to buffer
		            ByteBuf buf = Unpooled.copiedBuffer(msg.toString(), .);
		            int clen = buf.readableBytes();
		            req.content().writeBytes(buf);
		            buf.release();
		            
		            // Add 'Content-Length' header only for a keep-alive connection.
		            req.headers().set(.clen);
				}
			}
		}
		catch (Exception x) {
			Logger.error("Send HTTP Message error: " + x);
		}
	}
	public void channelActive(ChannelHandlerContext ctxthrows Exception {
		this. = ctx.channel();
		Logger.debug("ca");
		/*
		if (this.info.getKind() == ConnectorKind.WebSocket) {
	        HttpHeaders customHeaders = new DefaultHttpHeaders();
	        customHeaders.add("x-DivConq-Mode", Hub.instance.getResources().getMode());
	        
	        this.handshaker = WebSocketClientHandshakerFactory.newHandshaker(this.info.getUri(), WebSocketVersion.V13, null, false, customHeaders);
	        
			this.handshaker.handshake(this.chan);
	    }
	    */
	}
	public void channelRead0(ChannelHandlerContext ctxObject msgthrows Exception {
    	Logger.debug("Got object: " + msg);            
    	/*
    	if ((this.handshaker != null) && !this.handshaker.isHandshakeComplete()) {
    		HttpResponse httpres = (HttpResponse) msg;	    		
    		
        	DefaultFullHttpResponse freq = new DefaultFullHttpResponse(httpres.getProtocolVersion(), httpres.getStatus());
        	
        	freq.headers().add(httpres.headers());
        	
        	this.handshaker.finishHandshake(ctx.channel(), freq);
    		
        	Logger.info("Web Client connected!");            
        	
        	return;
    	}
    	*/
    	
	    if (msg instanceof HttpObject
	        this.handleHttpRequest(ctx, (HttpObjectmsg);
	    else if (msg instanceof WebSocketFrame
	    	this.handleWebSocketFrame(ctx, (WebSocketFramemsg);        
	}
    @Override
    public void channelInactive(ChannelHandlerContext ctxthrows Exception {
        Logger.info("Web Client disconnected!");
        
        this..stopped();
    }
    public void handleHttpRequest(ChannelHandlerContext ctxHttpObject objthrows Exception {
    	Logger.debug("got http message " + obj);
    	
    	if (obj instanceof HttpContent) {
    		if (this. == null) {
    			Logger.error("Got chunk before getting headers!");	
    			return;
    		}
    		
    		this..offer((HttpContent)obj);
    		return;
    	}    	
    	if (!(obj instanceof HttpResponse)) {
			Logger.error("Got unknown instead of headers!");	
            return;
        }
    	HttpResponse resp = (HttpResponseobj;
    	// 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);
        }
        
        this. = new HttpBodyRequestDecoder(4096 * 1024, new IBodyCallback() {			
			public void ready(Memory mem) {
				// if response is empty ignore
				if (mem.getLength() == 0)
					return;
				FuncResult<CompositeStructpres = CompositeParser.parseJson(mem);
				if (pres.hasErrors()) {
					Logger.error("Error parsing response JSON!");  
					return;
				}
				CompositeStruct croot = pres.getResult();
				if ((croot == null) || !(croot instanceof RecordStruct)) {
					Logger.error("Error parsing response JSON!");  
					return;
				}
		        ClientHandler.this..receiveMessage(MessageUtil.fromRecord((RecordStructcroot));
			}
			public void fail() {
				Logger.error("Failure processing http response");
			}
		});
    }
    public void handleWebSocketFrame(ChannelHandlerContext ctxWebSocketFrame frame) {
        Channel ch = ctx.channel();
        
        Logger.debug("ws1: " + frame);
        
        if (frame instanceof TextWebSocketFrame) {
        	String data = ((TextWebSocketFrameframe).text();
        	
        	Logger.debug("Web client received message: " + data);
            
            FuncResult<CompositeStructres = CompositeParser.parseJson(data);
            
            if (res.hasErrors()) {
            	Logger.error("Web client got a bad message: " + res.getMessage());
            	ch.close();		// don't stay with bad messages
            	return;
            }
            this..receiveMessage(MessageUtil.fromRecord((RecordStruct)res.getResult()));      
            return;
        }
        
        Logger.error("unhandled frame type");
        // unhandled frame type drop connection
        ch.close();
    }
    @Override
    public void userEventTriggered(ChannelHandlerContext ctxObject evtthrows Exception {
    	super.userEventTriggered(ctxevt);
    	
    	Logger.debug("ue: " + evt);
    	
    		Logger.debug("handshake done");
            //this.handshaker = null;
            this..release();
    	}
    }
    
    @Override
    public void exceptionCaught(ChannelHandlerContext ctxThrowable causethrows Exception {
    	Logger.error("Error with api session channel: " + cause);
        ctx.close();
    }
	public void close() {
		try {
			if (this. != null)
				this..close().await(2000);
		catch (InterruptedException x) {
			// ignore 
		}
	}
	public void waitConnect() {
    	if (this..getKind() == .)
			try {
    		catch (InterruptedException x) {
			}
	}
New to GrepCode? Check out our FAQ X