mirror of
https://github.com/XTLS/Xray-core.git
synced 2024-12-23 22:19:49 +00: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 {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
reader := &stripOkReader{ReadCloser: lazyRawDownload}
|
||||
|
||||
writer := uploadWriter{
|
||||
uploadPipeWriter,
|
||||
maxUploadSize,
|
||||
|
@ -196,14 +196,6 @@ func (h *requestHandler) ServeHTTP(writer http.ResponseWriter, request *http.Req
|
||||
h.config.WriteResponseHeader(writer)
|
||||
|
||||
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()
|
||||
|
||||
|
@ -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
Block a user