Files
bun.sh/packages/bun-uws/src/AsyncSocketData.h
Ciro Spaciari 625e537f5d fix(NodeHTTP) remove unneeded code add more safety measures agains raw_response after upgrade/close (#23348)
### What does this PR do?
BeforeOpen code is not necessary since we have `setOnSocketUpgraded`
callback now,and we should NOT convert websocket to a response, make
sure that no closed socket is passed to `JSNodeHTTPServerSocket`, change
isIdle to be inside AsyncSocketData to be more reliable (works for
websocket and normal sockets)

### How did you verify your code works?
CI

---------

Co-authored-by: autofix-ci[bot] <114827586+autofix-ci[bot]@users.noreply.github.com>
2025-10-07 22:35:08 -07:00

92 lines
2.4 KiB
C++

#pragma once
/*
* Authored by Alex Hultman, 2018-2021.
* Intellectual property of third-party.
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef UWS_ASYNCSOCKETDATA_H
#define UWS_ASYNCSOCKETDATA_H
#include <string>
namespace uWS {
struct BackPressure {
std::string buffer;
unsigned int pendingRemoval = 0;
BackPressure(BackPressure &&other) {
buffer = std::move(other.buffer);
pendingRemoval = other.pendingRemoval;
}
BackPressure() = default;
void append(const char *data, size_t length) {
buffer.append(data, length);
}
void erase(unsigned int length) {
pendingRemoval += length;
/* Always erase a minimum of 1/32th the current backpressure */
if (pendingRemoval > (buffer.length() >> 5)) {
buffer.erase(0, pendingRemoval);
buffer.shrink_to_fit();
pendingRemoval = 0;
}
}
size_t length() {
return buffer.length() - pendingRemoval;
}
void clear() {
pendingRemoval = 0;
buffer.clear();
buffer.shrink_to_fit();
}
void reserve(size_t length) {
buffer.reserve(length + pendingRemoval);
}
void resize(size_t length) {
buffer.resize(length + pendingRemoval);
}
const char *data() {
return buffer.data() + pendingRemoval;
}
size_t size() {
return length();
}
/* The total length, incuding pending removal */
size_t totalLength() {
return buffer.length();
}
};
/* Depending on how we want AsyncSocket to function, this will need to change */
template <bool SSL>
struct AsyncSocketData {
/* This will do for now */
BackPressure buffer;
/* Allow move constructing us */
AsyncSocketData(BackPressure &&backpressure) : buffer(std::move(backpressure)) {
}
/* Or empty */
AsyncSocketData() = default;
bool isIdle = false;
};
}
#endif // UWS_ASYNCSOCKETDATA_H