xmpp/layer1.go
changeset 153 bbd4166df95d
parent 148 b1b4900eee5b
child 163 3f891f7fe817
equal deleted inserted replaced
152:69c5b4382e39 153:bbd4166df95d
    17 	recvSocks chan<- net.Conn
    17 	recvSocks chan<- net.Conn
    18 	sendSocks chan net.Conn
    18 	sendSocks chan net.Conn
    19 }
    19 }
    20 
    20 
    21 func startLayer1(sock net.Conn, recvWriter io.WriteCloser,
    21 func startLayer1(sock net.Conn, recvWriter io.WriteCloser,
    22 	sendReader io.ReadCloser) *layer1 {
    22 	sendReader io.ReadCloser, status <-chan Status) *layer1 {
    23 	l1 := layer1{sock: sock}
    23 	l1 := layer1{sock: sock}
    24 	recvSocks := make(chan net.Conn)
    24 	recvSocks := make(chan net.Conn)
    25 	l1.recvSocks = recvSocks
    25 	l1.recvSocks = recvSocks
    26 	sendSocks := make(chan net.Conn, 1)
    26 	sendSocks := make(chan net.Conn, 1)
    27 	l1.sendSocks = sendSocks
    27 	l1.sendSocks = sendSocks
    28 	go recvTransport(recvSocks, recvWriter)
    28 	go recvTransport(recvSocks, recvWriter, status)
    29 	go sendTransport(sendSocks, sendReader)
    29 	go sendTransport(sendSocks, sendReader)
    30 	recvSocks <- sock
    30 	recvSocks <- sock
    31 	sendSocks <- sock
    31 	sendSocks <- sock
    32 	return &l1
    32 	return &l1
    33 }
    33 }
    48 	l1.sock = tls.Client(l1.sock, conf)
    48 	l1.sock = tls.Client(l1.sock, conf)
    49 	sendSockToSender(l1.sock)
    49 	sendSockToSender(l1.sock)
    50 	l1.recvSocks <- l1.sock
    50 	l1.recvSocks <- l1.sock
    51 }
    51 }
    52 
    52 
    53 func recvTransport(socks <-chan net.Conn, w io.WriteCloser) {
    53 func recvTransport(socks <-chan net.Conn, w io.WriteCloser,
       
    54 	status <-chan Status) {
       
    55 
    54 	defer w.Close()
    56 	defer w.Close()
    55 	var sock net.Conn
    57 	var sock net.Conn
    56 	p := make([]byte, 1024)
    58 	p := make([]byte, 1024)
    57 	for {
    59 	for {
    58 		select {
    60 		select {
       
    61 		case stat := <-status:
       
    62 			if stat == StatusShutdown {
       
    63 				return
       
    64 			}
       
    65 
    59 		case sock = <-socks:
    66 		case sock = <-socks:
    60 		default:
    67 		default:
    61 		}
    68 		}
    62 
    69 
    63 		if sock == nil {
    70 		if sock == nil {
    70 					if errno.Timeout() {
    77 					if errno.Timeout() {
    71 						continue
    78 						continue
    72 					}
    79 					}
    73 				}
    80 				}
    74 				Warn.Logf("recvTransport: %s", err)
    81 				Warn.Logf("recvTransport: %s", err)
    75 				break
    82 				return
    76 			}
    83 			}
    77 			nw, err := w.Write(p[:nr])
    84 			nw, err := w.Write(p[:nr])
    78 			if nw < nr {
    85 			if nw < nr {
    79 				Warn.Logf("recvTransport: %s", err)
    86 				Warn.Logf("recvTransport: %s", err)
    80 				break
    87 				return
    81 			}
    88 			}
    82 		}
    89 		}
    83 	}
    90 	}
    84 }
    91 }
    85 
    92