1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/netwerk/test/TestServ.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,145 @@ 1.4 +/* vim:set ts=4 sw=4 et cindent: */ 1.5 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.6 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.7 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.8 + 1.9 +#include "TestCommon.h" 1.10 +#include <stdlib.h> 1.11 +#include "nsIServiceManager.h" 1.12 +#include "nsIServerSocket.h" 1.13 +#include "nsISocketTransport.h" 1.14 +#include "nsNetUtil.h" 1.15 +#include "nsStringAPI.h" 1.16 +#include "nsCOMPtr.h" 1.17 +#include "prlog.h" 1.18 + 1.19 +#if defined(PR_LOGGING) 1.20 +// 1.21 +// set NSPR_LOG_MODULES=Test:5 1.22 +// 1.23 +static PRLogModuleInfo *gTestLog = nullptr; 1.24 +#endif 1.25 +#define LOG(args) PR_LOG(gTestLog, PR_LOG_DEBUG, args) 1.26 + 1.27 +class MySocketListener : public nsIServerSocketListener 1.28 +{ 1.29 +public: 1.30 + NS_DECL_THREADSAFE_ISUPPORTS 1.31 + NS_DECL_NSISERVERSOCKETLISTENER 1.32 + 1.33 + MySocketListener() {} 1.34 + virtual ~MySocketListener() {} 1.35 +}; 1.36 + 1.37 +NS_IMPL_ISUPPORTS(MySocketListener, nsIServerSocketListener) 1.38 + 1.39 +NS_IMETHODIMP 1.40 +MySocketListener::OnSocketAccepted(nsIServerSocket *serv, 1.41 + nsISocketTransport *trans) 1.42 +{ 1.43 + LOG(("MySocketListener::OnSocketAccepted [serv=%p trans=%p]\n", serv, trans)); 1.44 + 1.45 + nsAutoCString host; 1.46 + int32_t port; 1.47 + 1.48 + trans->GetHost(host); 1.49 + trans->GetPort(&port); 1.50 + 1.51 + LOG((" -> %s:%d\n", host.get(), port)); 1.52 + 1.53 + nsCOMPtr<nsIInputStream> input; 1.54 + nsCOMPtr<nsIOutputStream> output; 1.55 + nsresult rv; 1.56 + 1.57 + rv = trans->OpenInputStream(nsITransport::OPEN_BLOCKING, 0, 0, getter_AddRefs(input)); 1.58 + if (NS_FAILED(rv)) 1.59 + return rv; 1.60 + 1.61 + rv = trans->OpenOutputStream(nsITransport::OPEN_BLOCKING, 0, 0, getter_AddRefs(output)); 1.62 + if (NS_FAILED(rv)) 1.63 + return rv; 1.64 + 1.65 + char buf[256]; 1.66 + uint32_t n; 1.67 + 1.68 + rv = input->Read(buf, sizeof(buf), &n); 1.69 + if (NS_FAILED(rv)) 1.70 + return rv; 1.71 + 1.72 + const char response[] = "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\n\r\nFooooopy!!\r\n"; 1.73 + rv = output->Write(response, sizeof(response) - 1, &n); 1.74 + if (NS_FAILED(rv)) 1.75 + return rv; 1.76 + 1.77 + input->Close(); 1.78 + output->Close(); 1.79 + return NS_OK; 1.80 +} 1.81 + 1.82 +NS_IMETHODIMP 1.83 +MySocketListener::OnStopListening(nsIServerSocket *serv, nsresult status) 1.84 +{ 1.85 + LOG(("MySocketListener::OnStopListening [serv=%p status=%x]\n", serv, status)); 1.86 + QuitPumpingEvents(); 1.87 + return NS_OK; 1.88 +} 1.89 + 1.90 +static nsresult 1.91 +MakeServer(int32_t port) 1.92 +{ 1.93 + nsresult rv; 1.94 + nsCOMPtr<nsIServerSocket> serv = do_CreateInstance(NS_SERVERSOCKET_CONTRACTID, &rv); 1.95 + if (NS_FAILED(rv)) 1.96 + return rv; 1.97 + 1.98 + rv = serv->Init(port, true, 5); 1.99 + if (NS_FAILED(rv)) 1.100 + return rv; 1.101 + 1.102 + rv = serv->GetPort(&port); 1.103 + if (NS_FAILED(rv)) 1.104 + return rv; 1.105 + LOG((" listening on port %d\n", port)); 1.106 + 1.107 + rv = serv->AsyncListen(new MySocketListener()); 1.108 + return rv; 1.109 +} 1.110 + 1.111 +int 1.112 +main(int argc, char* argv[]) 1.113 +{ 1.114 + if (test_common_init(&argc, &argv) != 0) 1.115 + return -1; 1.116 + 1.117 + nsresult rv= (nsresult)-1; 1.118 + if (argc < 2) { 1.119 + printf("usage: %s <port>\n", argv[0]); 1.120 + return -1; 1.121 + } 1.122 + 1.123 +#if defined(PR_LOGGING) 1.124 + gTestLog = PR_NewLogModule("Test"); 1.125 +#endif 1.126 + 1.127 + /* 1.128 + * The following code only deals with XPCOM registration stuff. and setting 1.129 + * up the event queues. Copied from TestSocketIO.cpp 1.130 + */ 1.131 + 1.132 + rv = NS_InitXPCOM2(nullptr, nullptr, nullptr); 1.133 + if (NS_FAILED(rv)) return -1; 1.134 + 1.135 + { 1.136 + rv = MakeServer(atoi(argv[1])); 1.137 + if (NS_FAILED(rv)) { 1.138 + LOG(("MakeServer failed [rv=%x]\n", rv)); 1.139 + return -1; 1.140 + } 1.141 + 1.142 + // Enter the message pump to allow the URL load to proceed. 1.143 + PumpEvents(); 1.144 + } // this scopes the nsCOMPtrs 1.145 + // no nsCOMPtrs are allowed to be alive when you call NS_ShutdownXPCOM 1.146 + NS_ShutdownXPCOM(nullptr); 1.147 + return 0; 1.148 +}