xref: /haiku/src/tests/kits/net/netservices2/HttpDebugLogger.cpp (revision 71e29bbeea760848317843508c711f2a0b446fbb)
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