解決方法
応急処置的だが、
UnrealEngine\Engine\Source\Runtime\Online\WebSockets\Private\Lws\LwsWebSocket.cpp
のConnectInternal
内の該当箇所(722行付近)を以下のように置き換えることで解決できる。
/*
int32 UrlPathLength = FCStringAnsi::Strlen(TmpUrlPath) + 2;
TArray<ANSICHAR> UrlPath;
UrlPath.Reserve(UrlPathLength);
UrlPath.Add('/');
UrlPath.Append(TmpUrlPath, UrlPathLength - 2);
UrlPath.Add('\0');
*/
TArray<ANSICHAR> UrlPath;
// Check if TmpUrlPath starts with '/'
if (TmpUrlPath[0] != '/') {
int32 UrlPathLength = FCStringAnsi::Strlen(TmpUrlPath) + 2; // Extra space for adding '/' at the beginning
UrlPath.Reserve(UrlPathLength);
UrlPath.Add('/'); // Add '/' at the beginning if it doesn't start with '/'
UrlPath.Append(TmpUrlPath, UrlPathLength - 2); // Append the existing path
UrlPath.Add('\0'); // Null-terminate
}
else {
// If TmpUrlPath already starts with '/', use it as is
int32 UrlPathLength = FCStringAnsi::Strlen(TmpUrlPath) + 1;
UrlPath.Reserve(UrlPathLength);
UrlPath.Append(TmpUrlPath, UrlPathLength - 1); // Append the path
UrlPath.Add('\0'); // Null-terminate
}
困ったタイミング
ROS2のRosbridge_suiteを使ってUnreal EngineとROS2をWebsocket通信で接続しようとした際に、ROSBridgeが[rosbridge_websocket-1] WARNING:tornado.access:404 GET //
と怒ってきて困ってしまった。
原因
lws_parse_uri()
が、ws://localhost
のようにエンドポイントを指定しないURIに、/
を加え、ws://localhost/
とするようになっているにも関わらず、ConnectInternal
内で/
が加えられており、URLがws://localhost//
のようになっている。
もう少し詳細には、エンドポイントを指定しない場合にエンドポイント名を/
とする処理をしている。
解決法の解説
末尾がすでに/
になっているときは、/
を加えないようにすることで応急処置した。