mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-11-15 09:19:21 +02:00
SplitHTTP: Remove `ok` compatibility logic (#3753)
Remove some code that was added to maintain compatibility with older Xray versions. This breaks compatibility with Xray-core v1.8.23 or older.
This commit is contained in:
parent
f1c439c2aa
commit
ab3c00e96b
|
@ -285,13 +285,11 @@ func Dial(ctx context.Context, dest net.Destination, streamSettings *internet.Me
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
lazyRawDownload, remoteAddr, localAddr, err := httpClient.OpenDownload(context.WithoutCancel(ctx), requestURL.String())
|
reader, remoteAddr, localAddr, err := httpClient.OpenDownload(context.WithoutCancel(ctx), requestURL.String())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
reader := &stripOkReader{ReadCloser: lazyRawDownload}
|
|
||||||
|
|
||||||
writer := uploadWriter{
|
writer := uploadWriter{
|
||||||
uploadPipeWriter,
|
uploadPipeWriter,
|
||||||
maxUploadSize,
|
maxUploadSize,
|
||||||
|
|
|
@ -196,14 +196,6 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
|
||||||
h.config.WriteResponseHeader(writer)
|
h.config.WriteResponseHeader(writer)
|
||||||
|
|
||||||
writer.WriteHeader(http.StatusOK)
|
writer.WriteHeader(http.StatusOK)
|
||||||
if _, ok := request.URL.Query()["x_padding"]; !ok {
|
|
||||||
// in earlier versions, this initial body data was used to immediately
|
|
||||||
// start a 200 OK on all CDN. but xray client since 1.8.16 does not
|
|
||||||
// actually require an immediate 200 OK, but now requires these
|
|
||||||
// additional bytes "ok". xray client 1.8.24+ doesn't require "ok"
|
|
||||||
// anymore, and so this line should be removed in later versions.
|
|
||||||
writer.Write([]byte("ok"))
|
|
||||||
}
|
|
||||||
|
|
||||||
responseFlusher.Flush()
|
responseFlusher.Flush()
|
||||||
|
|
||||||
|
|
|
@ -1,48 +0,0 @@
|
||||||
package splithttp
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"io"
|
|
||||||
|
|
||||||
"github.com/xtls/xray-core/common/errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
// in older versions of splithttp, the server would respond with `ok` to flush
|
|
||||||
// out HTTP response headers early. Response headers and a 200 OK were required
|
|
||||||
// to initiate the connection. Later versions of splithttp dropped this
|
|
||||||
// requirement, and in xray 1.8.24 the server stopped sending "ok" if it sees
|
|
||||||
// x_padding. For compatibility, we need to remove "ok" from the underlying
|
|
||||||
// reader if it exists, and otherwise forward the stream as-is.
|
|
||||||
type stripOkReader struct {
|
|
||||||
io.ReadCloser
|
|
||||||
firstDone bool
|
|
||||||
prefixRead []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *stripOkReader) Read(b []byte) (int, error) {
|
|
||||||
if !r.firstDone {
|
|
||||||
r.firstDone = true
|
|
||||||
|
|
||||||
// skip "ok" response
|
|
||||||
prefixRead := []byte{0, 0}
|
|
||||||
_, err := io.ReadFull(r.ReadCloser, prefixRead)
|
|
||||||
if err != nil {
|
|
||||||
return 0, errors.New("failed to read initial response").Base(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
if !bytes.Equal(prefixRead, []byte("ok")) {
|
|
||||||
// we read some garbage byte that may not have been "ok" at
|
|
||||||
// all. return a reader that replays what we have read so far
|
|
||||||
r.prefixRead = prefixRead
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(r.prefixRead) > 0 {
|
|
||||||
n := copy(b, r.prefixRead)
|
|
||||||
r.prefixRead = r.prefixRead[n:]
|
|
||||||
return n, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
n, err := r.ReadCloser.Read(b)
|
|
||||||
return n, err
|
|
||||||
}
|
|
Loading…
Reference in New Issue