1/*
2 * Copyright 2010-2017 Haiku Inc. All rights reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 *		Christophe Huriaux, c.huriaux@gmail.com
7 *		Adrien Destugues, pulkomandy@pulkomandy.tk
8 */
9
10
11#include <UrlProtocolDispatchingListener.h>
12
13#include <Debug.h>
14#include <UrlResult.h>
15
16#include <assert.h>
17
18using namespace BPrivate::Network;
19
20
21const char* kUrlProtocolMessageType = "be:urlProtocolMessageType";
22const char* kUrlProtocolCaller = "be:urlProtocolCaller";
23
24
25BUrlProtocolDispatchingListener::BUrlProtocolDispatchingListener
26	(BHandler* handler)
27	:
28	fMessenger(handler)
29{
30}
31
32
33BUrlProtocolDispatchingListener::BUrlProtocolDispatchingListener
34	(const BMessenger& messenger)
35	:
36	fMessenger(messenger)
37{
38}
39
40
41BUrlProtocolDispatchingListener::~BUrlProtocolDispatchingListener()
42{
43}
44
45
46void
47BUrlProtocolDispatchingListener::ConnectionOpened(BUrlRequest* caller)
48{
49	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
50	_SendMessage(&message, B_URL_PROTOCOL_CONNECTION_OPENED, caller);
51}
52
53
54void
55BUrlProtocolDispatchingListener::HostnameResolved(BUrlRequest* caller,
56	const char* ip)
57{
58	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
59	message.AddString("url:hostIp", ip);
60
61	_SendMessage(&message, B_URL_PROTOCOL_HOSTNAME_RESOLVED, caller);
62}
63
64
65void
66BUrlProtocolDispatchingListener::ResponseStarted(BUrlRequest* caller)
67{
68	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
69	_SendMessage(&message, B_URL_PROTOCOL_RESPONSE_STARTED, caller);
70}
71
72
73void
74BUrlProtocolDispatchingListener::HeadersReceived(BUrlRequest* caller)
75{
76	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
77	_SendMessage(&message, B_URL_PROTOCOL_HEADERS_RECEIVED, caller);
78}
79
80
81void
82BUrlProtocolDispatchingListener::BytesWritten(BUrlRequest* caller,
83	size_t bytesWritten)
84{
85	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
86	message.AddInt32("url:bytesWritten", bytesWritten);
87
88	_SendMessage(&message, B_URL_PROTOCOL_BYTES_WRITTEN, caller);
89}
90
91
92void
93BUrlProtocolDispatchingListener::DownloadProgress(BUrlRequest* caller,
94	off_t bytesReceived, off_t bytesTotal)
95{
96	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
97	message.AddInt64("url:bytesReceived", bytesReceived);
98	message.AddInt64("url:bytesTotal", bytesTotal);
99
100	_SendMessage(&message, B_URL_PROTOCOL_DOWNLOAD_PROGRESS, caller);
101}
102
103
104void
105BUrlProtocolDispatchingListener::UploadProgress(BUrlRequest* caller,
106	off_t bytesSent, off_t bytesTotal)
107{
108	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
109	message.AddInt64("url:bytesSent", bytesSent);
110	message.AddInt64("url:bytesTotal", bytesTotal);
111
112	_SendMessage(&message, B_URL_PROTOCOL_UPLOAD_PROGRESS, caller);
113}
114
115
116void
117BUrlProtocolDispatchingListener::RequestCompleted(BUrlRequest* caller,
118	bool success)
119{
120	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
121	message.AddBool("url:success", success);
122
123	_SendMessage(&message, B_URL_PROTOCOL_REQUEST_COMPLETED, caller);
124}
125
126
127void
128BUrlProtocolDispatchingListener::DebugMessage(BUrlRequest* caller,
129	BUrlProtocolDebugMessage type, const char* text)
130{
131	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
132	message.AddInt32("url:type", type);
133	message.AddString("url:text", text);
134
135	_SendMessage(&message, B_URL_PROTOCOL_DEBUG_MESSAGE, caller);
136}
137
138
139bool
140BUrlProtocolDispatchingListener::CertificateVerificationFailed(
141	BUrlRequest* caller, BCertificate& certificate, const char* error)
142{
143	BMessage message(B_URL_PROTOCOL_NOTIFICATION);
144	message.AddString("url:error", error);
145	message.AddPointer("url:certificate", &certificate);
146	message.AddInt8(kUrlProtocolMessageType,
147		B_URL_PROTOCOL_CERTIFICATE_VERIFICATION_FAILED);
148	message.AddPointer(kUrlProtocolCaller, caller);
149
150	// Warning: synchronous reply
151	BMessage reply;
152	fMessenger.SendMessage(&message, &reply);
153
154	return reply.FindBool("url:continue");
155}
156
157
158void
159BUrlProtocolDispatchingListener::_SendMessage(BMessage* message,
160	int8 notification, BUrlRequest* caller)
161{
162	ASSERT(message != NULL);
163
164	message->AddPointer(kUrlProtocolCaller, caller);
165	message->AddInt8(kUrlProtocolMessageType, notification);
166
167#ifdef DEBUG
168	status_t result = fMessenger.SendMessage(message);
169	ASSERT(result == B_OK);
170#else
171	fMessenger.SendMessage(message);
172#endif
173}
174