|  | @@ -192,25 +192,25 @@ func (m *Client) Dispatch(ctx context.Context, outboundRay ray.OutboundRay) bool
 | 
											
												
													
														|  |  	return true
 |  |  	return true
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func drain(reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func drain(reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	return buf.Copy(NewStreamReader(reader), buf.Discard)
 |  |  	return buf.Copy(NewStreamReader(reader), buf.Discard)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (m *Client) handleStatueKeepAlive(meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (m *Client) handleStatueKeepAlive(meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	if meta.Option.Has(OptionData) {
 |  |  	if meta.Option.Has(OptionData) {
 | 
											
												
													
														|  |  		return drain(reader)
 |  |  		return drain(reader)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	return nil
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (m *Client) handleStatusNew(meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (m *Client) handleStatusNew(meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	if meta.Option.Has(OptionData) {
 |  |  	if meta.Option.Has(OptionData) {
 | 
											
												
													
														|  |  		return drain(reader)
 |  |  		return drain(reader)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	return nil
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (m *Client) handleStatusKeep(meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (m *Client) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	if !meta.Option.Has(OptionData) {
 |  |  	if !meta.Option.Has(OptionData) {
 | 
											
												
													
														|  |  		return nil
 |  |  		return nil
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
										
											
												
													
														|  | @@ -221,7 +221,7 @@ func (m *Client) handleStatusKeep(meta *FrameMetadata, reader io.Reader) error {
 | 
											
												
													
														|  |  	return drain(reader)
 |  |  	return drain(reader)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (m *Client) handleStatusEnd(meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (m *Client) handleStatusEnd(meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	if s, found := m.sessionManager.Get(meta.SessionID); found {
 |  |  	if s, found := m.sessionManager.Get(meta.SessionID); found {
 | 
											
												
													
														|  |  		s.Close()
 |  |  		s.Close()
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
										
											
												
													
														|  | @@ -315,14 +315,14 @@ func handle(ctx context.Context, s *Session, output buf.Writer) {
 | 
											
												
													
														|  |  	s.Close()
 |  |  	s.Close()
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (w *ServerWorker) handleStatusKeepAlive(meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (w *ServerWorker) handleStatusKeepAlive(meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	if meta.Option.Has(OptionData) {
 |  |  	if meta.Option.Has(OptionData) {
 | 
											
												
													
														|  |  		return drain(reader)
 |  |  		return drain(reader)
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
												
													
														|  |  	return nil
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	log.Trace(newError("received request for ", meta.Target))
 |  |  	log.Trace(newError("received request for ", meta.Target))
 | 
											
												
													
														|  |  	inboundRay, err := w.dispatcher.Dispatch(ctx, meta.Target)
 |  |  	inboundRay, err := w.dispatcher.Dispatch(ctx, meta.Target)
 | 
											
												
													
														|  |  	if err != nil {
 |  |  	if err != nil {
 | 
											
										
											
												
													
														|  | @@ -349,7 +349,7 @@ func (w *ServerWorker) handleStatusNew(ctx context.Context, meta *FrameMetadata,
 | 
											
												
													
														|  |  	return nil
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	if !meta.Option.Has(OptionData) {
 |  |  	if !meta.Option.Has(OptionData) {
 | 
											
												
													
														|  |  		return nil
 |  |  		return nil
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
										
											
												
													
														|  | @@ -359,7 +359,7 @@ func (w *ServerWorker) handleStatusKeep(meta *FrameMetadata, reader io.Reader) e
 | 
											
												
													
														|  |  	return drain(reader)
 |  |  	return drain(reader)
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	if s, found := w.sessionManager.Get(meta.SessionID); found {
 |  |  	if s, found := w.sessionManager.Get(meta.SessionID); found {
 | 
											
												
													
														|  |  		s.Close()
 |  |  		s.Close()
 | 
											
												
													
														|  |  	}
 |  |  	}
 | 
											
										
											
												
													
														|  | @@ -369,7 +369,7 @@ func (w *ServerWorker) handleStatusEnd(meta *FrameMetadata, reader io.Reader) er
 | 
											
												
													
														|  |  	return nil
 |  |  	return nil
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -func (w *ServerWorker) handleFrame(ctx context.Context, reader io.Reader) error {
 |  | 
 | 
											
												
													
														|  | 
 |  | +func (w *ServerWorker) handleFrame(ctx context.Context, reader *buf.BufferedReader) error {
 | 
											
												
													
														|  |  	meta, err := ReadMetadata(reader)
 |  |  	meta, err := ReadMetadata(reader)
 | 
											
												
													
														|  |  	if err != nil {
 |  |  	if err != nil {
 | 
											
												
													
														|  |  		return newError("failed to read metadata").Base(err)
 |  |  		return newError("failed to read metadata").Base(err)
 |