1
+ package dk.anderslangballe.attack
2
+
3
+ import dk.anderslangballe.ssl.getSecureSocketFactory
4
+ import java.io.OutputStream
5
+ import java.net.Socket
6
+ import java.util.concurrent.CountDownLatch
7
+
8
+ class HttpRequest (private val targetHost : String , private val targetPort : Int , private val secureConnection : Boolean ,
9
+ private val launchLatch : CountDownLatch , private val completeLatch : CountDownLatch ,
10
+ private val requestContent : String ) {
11
+ private val withheldBytes = 1
12
+
13
+ fun start () {
14
+ val socket: Socket = getSocket()
15
+ val outputStream = socket.getOutputStream()
16
+ val requestBytes = getRequestBytes()
17
+
18
+ writeInitial(requestBytes, outputStream)
19
+
20
+ launchLatch.await()
21
+
22
+ writeFinal(requestBytes, outputStream)
23
+ }
24
+
25
+ private fun getRequestBytes (): ByteArray = requestContent.toByteArray(Charsets .UTF_8 )
26
+
27
+ private fun writeFinal (requestBytes : ByteArray , outputStream : OutputStream ) {
28
+ outputStream.write(requestBytes, requestBytes.size - 1 , withheldBytes)
29
+ outputStream.close()
30
+
31
+ completeLatch.countDown()
32
+ }
33
+
34
+ private fun writeInitial (requestBytes : ByteArray , outputStream : OutputStream ) {
35
+ outputStream.write(requestBytes, 0 , requestBytes.size - withheldBytes)
36
+ outputStream.flush()
37
+
38
+ launchLatch.countDown()
39
+ }
40
+
41
+ private fun getSocket (): Socket {
42
+ val socket: Socket = if (secureConnection) {
43
+ getSecureSocketFactory().createSocket(targetHost, targetPort)
44
+ } else {
45
+ Socket (targetHost, targetPort)
46
+ }
47
+
48
+ socket.tcpNoDelay = true
49
+
50
+ return socket
51
+ }
52
+ }
0 commit comments