Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

socket.go 1.7KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package irc
  2. import (
  3. "bufio"
  4. "io"
  5. "net"
  6. "strings"
  7. )
  8. const (
  9. R = '→'
  10. W = '←'
  11. EOF = ""
  12. )
  13. type Socket struct {
  14. conn net.Conn
  15. reader *bufio.Reader
  16. writer *bufio.Writer
  17. }
  18. func NewSocket(conn net.Conn, commands chan<- Command) *Socket {
  19. socket := &Socket{
  20. conn: conn,
  21. reader: bufio.NewReader(conn),
  22. writer: bufio.NewWriter(conn),
  23. }
  24. go socket.readLines(commands)
  25. return socket
  26. }
  27. func (socket *Socket) String() string {
  28. return socket.conn.RemoteAddr().String()
  29. }
  30. func (socket *Socket) Close() {
  31. socket.conn.Close()
  32. Log.debug.Printf("%s closed", socket)
  33. }
  34. func (socket *Socket) readLines(commands chan<- Command) {
  35. commands <- &ProxyCommand{
  36. hostname: AddrLookupHostname(socket.conn.RemoteAddr()),
  37. }
  38. for {
  39. line, err := socket.reader.ReadString('\n')
  40. if socket.isError(err, R) {
  41. break
  42. }
  43. line = strings.TrimRight(line, CRLF)
  44. if len(line) == 0 {
  45. continue
  46. }
  47. Log.debug.Printf("%s → %s", socket, line)
  48. msg, err := ParseCommand(line)
  49. if err != nil {
  50. // TODO error messaging to client
  51. continue
  52. }
  53. commands <- msg
  54. }
  55. commands <- &QuitCommand{
  56. message: "connection closed",
  57. }
  58. }
  59. func (socket *Socket) Write(line string) (err error) {
  60. if _, err = socket.writer.WriteString(line); socket.isError(err, W) {
  61. return
  62. }
  63. if _, err = socket.writer.WriteString(CRLF); socket.isError(err, W) {
  64. return
  65. }
  66. if err = socket.writer.Flush(); socket.isError(err, W) {
  67. return
  68. }
  69. Log.debug.Printf("%s ← %s", socket, line)
  70. return
  71. }
  72. func (socket *Socket) isError(err error, dir rune) bool {
  73. if err != nil {
  74. if err != io.EOF {
  75. Log.debug.Printf("%s %c error: %s", socket, dir, err)
  76. }
  77. return true
  78. }
  79. return false
  80. }