Skip to content

Commit 892bacf

Browse files
authored
Simple implementation for web socket (alibaba#1109)
Simple implementation for web socket
1 parent 04cd53e commit 892bacf

8 files changed

Lines changed: 1252 additions & 0 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -220,6 +220,7 @@ file(GLOB PHOTON_SRC RELATIVE "${PROJECT_SOURCE_DIR}"
220220
io/reset_handle.cpp
221221
net/*.cpp
222222
net/http/*.cpp
223+
net/http/websocket.cpp
223224
net/security-context/tls-stream.cpp
224225
net/vdma/*.cpp
225226
rpc/*.cpp
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
../../../../net/http/websocket.h

net/http/client.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ namespace net {
3232
class TLSContext;
3333
namespace http {
3434

35+
class IWebSocketStream; // Forward declaration for websocket_connect
36+
3537
class ICookieJar : public Object {
3638
public:
3739
virtual int get_cookies_from_headers(std::string_view host, Message* message) = 0;
@@ -166,6 +168,16 @@ class Client : public Object {
166168

167169
virtual ISocketStream* native_connect(std::string_view host, uint16_t port,
168170
bool secure = false, uint64_t timeout = -1UL) = 0;
171+
172+
/**
173+
* @brief Connect to a WebSocket server
174+
*
175+
* @param url Full URL for the WebSocket endpoint (e.g., "http://example.com/ws")
176+
* @param timeout Timeout in microseconds (-1 for infinite)
177+
* @return Pointer to IWebSocketStream on success, nullptr on failure
178+
*/
179+
IWebSocketStream* websocket_connect(std::string_view url, uint64_t timeout = -1UL);
180+
169181
protected:
170182
StoredURL m_proxy_url;
171183
std::string m_user_agent;

net/http/message.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,15 @@ class Message : public IStream {
9292
ssize_t write_stream(IStream *stream, size_t size_limit = -1);
9393
int close() override { return 0; }
9494

95+
// Release ownership of socket stream and return it (like unique_ptr::release)
96+
// After this call, the Message no longer owns or references the socket
97+
net::ISocketStream* steal_socket_stream() {
98+
auto* s = m_stream;
99+
m_stream = nullptr;
100+
m_stream_ownership = false;
101+
return s;
102+
}
103+
95104
// size of body: infer from Content-Range/Content-Length in response header
96105
size_t body_size() const;
97106
// size of origin resource: infer from Content-Range/Content-Length in response header

net/http/test/CMakeLists.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,7 @@ add_executable(client_tls_test client_tls_test.cpp)
1818
target_include_directories(client_tls_test PRIVATE ${OPENSSL_INCLUDE_DIRS})
1919
target_link_libraries(client_tls_test PRIVATE photon_shared ${testing_libs})
2020
add_test(NAME client_tls_test COMMAND $<TARGET_FILE:client_tls_test>)
21+
22+
add_executable(websocket_test websocket_test.cpp)
23+
target_link_libraries(websocket_test PRIVATE photon_shared ${testing_libs})
24+
add_test(NAME websocket_test COMMAND $<TARGET_FILE:websocket_test>)

0 commit comments

Comments
 (0)