http.go 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120
  1. package http
  2. import (
  3. "bytes"
  4. "io"
  5. "v2ray.com/core/common/alloc"
  6. "v2ray.com/core/transport/internet"
  7. )
  8. const (
  9. CRLF = "\r\n"
  10. ENDING = CRLF + CRLF
  11. )
  12. type RequestAuthenticator struct {
  13. config *RequestConfig
  14. }
  15. func (this *RequestAuthenticator) Seal(writer io.Writer) io.Writer {
  16. header := alloc.NewLocalBuffer(2048)
  17. header.AppendString(this.config.Method).AppendString(" ").AppendString(this.config.PickUri()).AppendString(" ").AppendString(this.config.GetVersion()).AppendString(CRLF)
  18. headers := this.config.PickHeaders()
  19. for _, h := range headers {
  20. header.AppendString(h).AppendString(CRLF)
  21. }
  22. header.AppendString(CRLF)
  23. writer.Write(header.Value)
  24. header.Release()
  25. return writer
  26. }
  27. func (this *RequestAuthenticator) Open(reader io.Reader) (io.Reader, error) {
  28. buffer := alloc.NewLocalBuffer(2048)
  29. for {
  30. _, err := buffer.FillFrom(reader)
  31. if err != nil {
  32. return nil, err
  33. }
  34. if n := bytes.Index(buffer.Value, []byte(ENDING)); n != -1 {
  35. buffer.SliceFrom(n + len(ENDING))
  36. return &BufferAndReader{
  37. buffer: buffer,
  38. reader: reader,
  39. }, nil
  40. }
  41. if buffer.Len() >= len(ENDING) {
  42. copy(buffer.Value, buffer.Value[buffer.Len()-len(ENDING):])
  43. buffer.Slice(0, len(ENDING))
  44. }
  45. }
  46. }
  47. type BufferAndReader struct {
  48. buffer *alloc.Buffer
  49. reader io.Reader
  50. }
  51. func (this *BufferAndReader) Read(b []byte) (int, error) {
  52. if this.buffer.Len() == 0 {
  53. return this.reader.Read(b)
  54. }
  55. n, err := this.buffer.Read(b)
  56. if n == this.buffer.Len() {
  57. this.buffer.Release()
  58. this.buffer = nil
  59. }
  60. return n, err
  61. }
  62. type RequestAuthenticatorFactory struct{}
  63. func (RequestAuthenticatorFactory) Create(config interface{}) internet.ConnectionAuthenticator {
  64. return &RequestAuthenticator{
  65. config: config.(*RequestConfig),
  66. }
  67. }
  68. type ResponseAuthenticator struct {
  69. config *ResponseConfig
  70. }
  71. func (this *ResponseAuthenticator) Seal(writer io.Writer) io.Writer {
  72. header := alloc.NewLocalBuffer(2048)
  73. header.AppendString(this.config.GetVersion()).AppendString(" ").AppendString(this.config.Status).AppendString(" ").AppendString(this.config.Reason).AppendString(CRLF)
  74. headers := this.config.PickHeaders()
  75. for _, h := range headers {
  76. header.AppendString(h).AppendString(CRLF)
  77. }
  78. header.AppendString(CRLF)
  79. writer.Write(header.Value)
  80. header.Release()
  81. return writer
  82. }
  83. func (this *ResponseAuthenticator) Open(reader io.Reader) (io.Reader, error) {
  84. buffer := alloc.NewLocalBuffer(2048)
  85. for {
  86. _, err := buffer.FillFrom(reader)
  87. if err != nil {
  88. return nil, err
  89. }
  90. if n := bytes.Index(buffer.Value, []byte(ENDING)); n != -1 {
  91. buffer.SliceFrom(n + len(ENDING))
  92. return &BufferAndReader{
  93. buffer: buffer,
  94. reader: reader,
  95. }, nil
  96. }
  97. if buffer.Len() >= len(ENDING) {
  98. copy(buffer.Value, buffer.Value[buffer.Len()-len(ENDING):])
  99. buffer.Slice(0, len(ENDING))
  100. }
  101. }
  102. }