1aa8ca18aSNiels Sascha Reedijk /*
2aa8ca18aSNiels Sascha Reedijk * Copyright 2022 Haiku Inc. All rights reserved.
3aa8ca18aSNiels Sascha Reedijk * Distributed under the terms of the MIT License.
4aa8ca18aSNiels Sascha Reedijk *
5aa8ca18aSNiels Sascha Reedijk * Authors:
6aa8ca18aSNiels Sascha Reedijk * Niels Sascha Reedijk, niels.reedijk@gmail.com
7aa8ca18aSNiels Sascha Reedijk */
8aa8ca18aSNiels Sascha Reedijk
9aa8ca18aSNiels Sascha Reedijk #include "HttpDebugLogger.h"
10aa8ca18aSNiels Sascha Reedijk
11aa8ca18aSNiels Sascha Reedijk #include <iostream>
12aa8ca18aSNiels Sascha Reedijk
13aa8ca18aSNiels Sascha Reedijk #include <ErrorsExt.h>
14aa8ca18aSNiels Sascha Reedijk #include <HttpSession.h>
15aa8ca18aSNiels Sascha Reedijk #include <NetServicesDefs.h>
16aa8ca18aSNiels Sascha Reedijk
17aa8ca18aSNiels Sascha Reedijk using namespace BPrivate::Network;
18aa8ca18aSNiels Sascha Reedijk
19aa8ca18aSNiels Sascha Reedijk
HttpDebugLogger()20aa8ca18aSNiels Sascha Reedijk HttpDebugLogger::HttpDebugLogger()
21*71e29bbeSNiels Sascha Reedijk :
22*71e29bbeSNiels Sascha Reedijk BLooper("HttpDebugLogger")
23aa8ca18aSNiels Sascha Reedijk {
24aa8ca18aSNiels Sascha Reedijk }
25aa8ca18aSNiels Sascha Reedijk
26aa8ca18aSNiels Sascha Reedijk
27aa8ca18aSNiels Sascha Reedijk void
SetConsoleLogging(bool enabled)28aa8ca18aSNiels Sascha Reedijk HttpDebugLogger::SetConsoleLogging(bool enabled)
29aa8ca18aSNiels Sascha Reedijk {
30aa8ca18aSNiels Sascha Reedijk fConsoleLogging = enabled;
31aa8ca18aSNiels Sascha Reedijk }
32aa8ca18aSNiels Sascha Reedijk
33aa8ca18aSNiels Sascha Reedijk
34aa8ca18aSNiels Sascha Reedijk void
SetFileLogging(const char * path)35aa8ca18aSNiels Sascha Reedijk HttpDebugLogger::SetFileLogging(const char* path)
36aa8ca18aSNiels Sascha Reedijk {
37aa8ca18aSNiels Sascha Reedijk if (auto status = fLogFile.SetTo(path, B_WRITE_ONLY | B_CREATE_FILE | B_OPEN_AT_END);
38aa8ca18aSNiels Sascha Reedijk status != B_OK)
39aa8ca18aSNiels Sascha Reedijk throw BSystemError("BFile::SetTo()", status);
40aa8ca18aSNiels Sascha Reedijk }
41aa8ca18aSNiels Sascha Reedijk
42*71e29bbeSNiels Sascha Reedijk
43aa8ca18aSNiels Sascha Reedijk void
MessageReceived(BMessage * message)44aa8ca18aSNiels Sascha Reedijk HttpDebugLogger::MessageReceived(BMessage* message)
45aa8ca18aSNiels Sascha Reedijk {
46aa8ca18aSNiels Sascha Reedijk BString output;
47aa8ca18aSNiels Sascha Reedijk
48aa8ca18aSNiels Sascha Reedijk if (!message->HasInt32(UrlEventData::Id))
49aa8ca18aSNiels Sascha Reedijk return BLooper::MessageReceived(message);
50aa8ca18aSNiels Sascha Reedijk int32 id = message->FindInt32(UrlEventData::Id);
51aa8ca18aSNiels Sascha Reedijk output << "[" << id << "] ";
52aa8ca18aSNiels Sascha Reedijk
53aa8ca18aSNiels Sascha Reedijk switch (message->what) {
54aa8ca18aSNiels Sascha Reedijk case UrlEvent::HostNameResolved:
55aa8ca18aSNiels Sascha Reedijk {
56aa8ca18aSNiels Sascha Reedijk BString hostname;
57aa8ca18aSNiels Sascha Reedijk message->FindString(UrlEventData::HostName, &hostname);
58aa8ca18aSNiels Sascha Reedijk output << "<HostNameResolved> " << hostname;
59aa8ca18aSNiels Sascha Reedijk break;
60aa8ca18aSNiels Sascha Reedijk }
61aa8ca18aSNiels Sascha Reedijk case UrlEvent::ConnectionOpened:
62aa8ca18aSNiels Sascha Reedijk output << "<ConnectionOpened>";
63aa8ca18aSNiels Sascha Reedijk break;
64aa8ca18aSNiels Sascha Reedijk case UrlEvent::UploadProgress:
65aa8ca18aSNiels Sascha Reedijk {
66aa8ca18aSNiels Sascha Reedijk off_t numBytes = message->GetInt64(UrlEventData::NumBytes, -1);
67aa8ca18aSNiels Sascha Reedijk off_t totalBytes = message->GetInt64(UrlEventData::TotalBytes, -1);
68aa8ca18aSNiels Sascha Reedijk output << "<UploadProgress> bytes uploaded " << numBytes;
69aa8ca18aSNiels Sascha Reedijk if (totalBytes == -1)
70aa8ca18aSNiels Sascha Reedijk output << " (total unknown)";
71aa8ca18aSNiels Sascha Reedijk else
72aa8ca18aSNiels Sascha Reedijk output << " (" << totalBytes << " total)";
73aa8ca18aSNiels Sascha Reedijk break;
74aa8ca18aSNiels Sascha Reedijk }
75aa8ca18aSNiels Sascha Reedijk case UrlEvent::ResponseStarted:
76aa8ca18aSNiels Sascha Reedijk {
77aa8ca18aSNiels Sascha Reedijk output << "<ResponseStarted>";
78aa8ca18aSNiels Sascha Reedijk break;
79aa8ca18aSNiels Sascha Reedijk }
80aa8ca18aSNiels Sascha Reedijk case UrlEvent::HttpRedirect:
81aa8ca18aSNiels Sascha Reedijk {
82aa8ca18aSNiels Sascha Reedijk BString redirectUrl;
83aa8ca18aSNiels Sascha Reedijk message->FindString(UrlEventData::HttpRedirectUrl, &redirectUrl);
84aa8ca18aSNiels Sascha Reedijk output << "<HttpRedirect> to: " << redirectUrl;
85aa8ca18aSNiels Sascha Reedijk break;
86aa8ca18aSNiels Sascha Reedijk }
87aa8ca18aSNiels Sascha Reedijk case UrlEvent::HttpStatus:
88aa8ca18aSNiels Sascha Reedijk {
89aa8ca18aSNiels Sascha Reedijk int16 status = message->FindInt16(UrlEventData::HttpStatusCode);
90aa8ca18aSNiels Sascha Reedijk output << "<HttpStatus> code: " << status;
91aa8ca18aSNiels Sascha Reedijk break;
92aa8ca18aSNiels Sascha Reedijk }
93aa8ca18aSNiels Sascha Reedijk case UrlEvent::HttpFields:
94aa8ca18aSNiels Sascha Reedijk {
95aa8ca18aSNiels Sascha Reedijk output << "<HttpFields> All fields parsed";
96aa8ca18aSNiels Sascha Reedijk break;
97aa8ca18aSNiels Sascha Reedijk }
98aa8ca18aSNiels Sascha Reedijk case UrlEvent::DownloadProgress:
99aa8ca18aSNiels Sascha Reedijk {
100aa8ca18aSNiels Sascha Reedijk off_t numBytes = message->GetInt64(UrlEventData::NumBytes, -1);
101aa8ca18aSNiels Sascha Reedijk off_t totalBytes = message->GetInt64(UrlEventData::TotalBytes, -1);
102aa8ca18aSNiels Sascha Reedijk output << "<DownloadProgress> bytes downloaded " << numBytes;
103aa8ca18aSNiels Sascha Reedijk if (totalBytes == -1)
104aa8ca18aSNiels Sascha Reedijk output << " (total unknown)";
105aa8ca18aSNiels Sascha Reedijk else
106aa8ca18aSNiels Sascha Reedijk output << " (" << totalBytes << " total)";
107aa8ca18aSNiels Sascha Reedijk break;
108aa8ca18aSNiels Sascha Reedijk }
109aa8ca18aSNiels Sascha Reedijk case UrlEvent::BytesWritten:
110aa8ca18aSNiels Sascha Reedijk {
111aa8ca18aSNiels Sascha Reedijk off_t numBytes = message->GetInt64(UrlEventData::NumBytes, -1);
112aa8ca18aSNiels Sascha Reedijk output << "<BytesWritten> bytes written to output: " << numBytes;
113aa8ca18aSNiels Sascha Reedijk break;
114aa8ca18aSNiels Sascha Reedijk }
115aa8ca18aSNiels Sascha Reedijk case UrlEvent::RequestCompleted:
116aa8ca18aSNiels Sascha Reedijk {
1178a16ecbcSNiels Sascha Reedijk bool success = message->GetBool(UrlEventData::Success, false);
118aa8ca18aSNiels Sascha Reedijk output << "<RequestCompleted> success: ";
119aa8ca18aSNiels Sascha Reedijk if (success)
120aa8ca18aSNiels Sascha Reedijk output << "true";
121aa8ca18aSNiels Sascha Reedijk else
122aa8ca18aSNiels Sascha Reedijk output << "false";
123aa8ca18aSNiels Sascha Reedijk break;
124aa8ca18aSNiels Sascha Reedijk }
125aa8ca18aSNiels Sascha Reedijk case UrlEvent::DebugMessage:
126aa8ca18aSNiels Sascha Reedijk {
1278a16ecbcSNiels Sascha Reedijk uint32 debugType = message->GetUInt32(UrlEventData::DebugType, 0);
1288a16ecbcSNiels Sascha Reedijk BString debugMessage;
1298a16ecbcSNiels Sascha Reedijk message->FindString(UrlEventData::DebugMessage, &debugMessage);
1308a16ecbcSNiels Sascha Reedijk output << "<DebugMessage> ";
1318a16ecbcSNiels Sascha Reedijk switch (debugType) {
1328a16ecbcSNiels Sascha Reedijk case UrlEventData::DebugInfo:
1338a16ecbcSNiels Sascha Reedijk output << "INFO: ";
1348a16ecbcSNiels Sascha Reedijk break;
1358a16ecbcSNiels Sascha Reedijk case UrlEventData::DebugWarning:
1368a16ecbcSNiels Sascha Reedijk output << "WARNING: ";
1378a16ecbcSNiels Sascha Reedijk break;
1388a16ecbcSNiels Sascha Reedijk case UrlEventData::DebugError:
1398a16ecbcSNiels Sascha Reedijk output << "ERROR: ";
1408a16ecbcSNiels Sascha Reedijk break;
1418a16ecbcSNiels Sascha Reedijk default:
1428a16ecbcSNiels Sascha Reedijk output << "UNKNOWN: ";
1438a16ecbcSNiels Sascha Reedijk break;
1448a16ecbcSNiels Sascha Reedijk }
1458a16ecbcSNiels Sascha Reedijk output << debugMessage;
146aa8ca18aSNiels Sascha Reedijk break;
147aa8ca18aSNiels Sascha Reedijk }
148aa8ca18aSNiels Sascha Reedijk default:
149aa8ca18aSNiels Sascha Reedijk return BLooper::MessageReceived(message);
150aa8ca18aSNiels Sascha Reedijk }
151aa8ca18aSNiels Sascha Reedijk
152aa8ca18aSNiels Sascha Reedijk if (fConsoleLogging)
153aa8ca18aSNiels Sascha Reedijk std::cout << output.String() << std::endl;
154aa8ca18aSNiels Sascha Reedijk
155aa8ca18aSNiels Sascha Reedijk if (fLogFile.InitCheck() == B_OK) {
156aa8ca18aSNiels Sascha Reedijk output += '\n';
157aa8ca18aSNiels Sascha Reedijk if (auto status = fLogFile.WriteExactly(output.String(), output.Length()); status != B_OK)
158aa8ca18aSNiels Sascha Reedijk throw BSystemError("BFile::WriteExactly()", status);
159aa8ca18aSNiels Sascha Reedijk if (auto status = fLogFile.Flush(); status != B_OK)
160aa8ca18aSNiels Sascha Reedijk throw BSystemError("BFile::Flush()", status);
161aa8ca18aSNiels Sascha Reedijk }
162aa8ca18aSNiels Sascha Reedijk }
163