-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrailway.cbl
130 lines (116 loc) · 4.75 KB
/
railway.cbl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
IDENTIFICATION DIVISION.
PROGRAM-ID. COBOL-WEB-SERVER.
ENVIRONMENT DIVISION.
CONFIGURATION SECTION.
SPECIAL-NAMES.
SYMBOLIC CHARACTERS SOH IS 1.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-LAST-ERROR PIC S9(9) COMP.
01 WS-SOCKET-DESCRIPTOR PIC 9(8) COMP.
01 WS-CLIENT-SOCKET PIC 9(8) COMP.
01 WS-BUFFER.
05 WS-RECV-BUFFER PIC X(1024).
05 WS-SEND-BUFFER PIC X(1024).
01 WS-RECV-LENGTH PIC 9(8) COMP.
01 WS-SEND-LENGTH PIC 9(8) COMP.
01 WS-FLAGS PIC 9(8) COMP VALUE 0.
01 WS-RESULT PIC S9(9) COMP.
01 WS-SOCKADDR-IN.
05 SIN-FAMILY PIC 9(4) COMP VALUE 2.
05 SIN-PORT PIC 9(4) COMP VALUE 8080.
05 SIN-ADDR PIC 9(8) COMP VALUE 0.
*> 05 SIN-ZERO PIC X(8) VALUE LOW-VALUES.
05 SIN-ZERO PIC X(8) VALUE SPACES.
PROCEDURE DIVISION.
MAIN-PROCEDURE.
PERFORM INITIALIZE-SERVER
PERFORM ACCEPT-CONNECTIONS
PERFORM CLEANUP
STOP RUN.
INITIALIZE-SERVER.
CALL "socket" USING BY VALUE 2
BY VALUE 1
BY VALUE 6
RETURNING WS-SOCKET-DESCRIPTOR
IF WS-SOCKET-DESCRIPTOR < 0
DISPLAY "Failed to create socket"
STOP RUN
END-IF
DISPLAY "Socket created, descriptor: " WS-SOCKET-DESCRIPTOR
DISPLAY "Binding to address: " SIN-ADDR " on port: " SIN-PORT " with family: " SIN-FAMILY
CALL "bind" USING BY VALUE WS-SOCKET-DESCRIPTOR
BY REFERENCE WS-SOCKADDR-IN
BY VALUE LENGTH OF WS-SOCKADDR-IN
RETURNING WS-RESULT
IF WS-RESULT < 0
DISPLAY "Failed to bind socket, error code: " WS-RESULT
DISPLAY "Calling get_socket_error."
CALL "geterr" RETURNING WS-LAST-ERROR
DISPLAY "Returned from get_socket_error."
DISPLAY "Socket error code: " WS-LAST-ERROR
STOP RUN
ELSE
DISPLAY "Bind successful, using port 8080 and address 0.0.0.0"
END-IF
DISPLAY "WS-SOCKADDR-IN details: "
DISPLAY "Family: " SIN-FAMILY
DISPLAY "Port: " SIN-PORT
DISPLAY "Address: " SIN-ADDR
CALL "listen" USING BY VALUE WS-SOCKET-DESCRIPTOR
BY VALUE 5
RETURNING WS-RESULT
IF WS-RESULT < 0
DISPLAY "Failed to listen on socket"
STOP RUN
ELSE
DISPLAY "Server listening on port 8080"
END-IF.
ACCEPT-CONNECTIONS.
PERFORM UNTIL EXIT
CALL "accept" USING BY VALUE WS-SOCKET-DESCRIPTOR
BY REFERENCE WS-SOCKADDR-IN
BY REFERENCE LENGTH OF WS-SOCKADDR-IN
RETURNING WS-CLIENT-SOCKET
IF WS-CLIENT-SOCKET < 0
DISPLAY "Failed to accept connection"
EXIT PERFORM
END-IF
PERFORM HANDLE-REQUEST
END-PERFORM.
HANDLE-REQUEST.
MOVE SPACES TO WS-RECV-BUFFER
CALL "recv" USING BY VALUE WS-CLIENT-SOCKET
BY REFERENCE WS-RECV-BUFFER
BY VALUE LENGTH OF WS-RECV-BUFFER
BY VALUE WS-FLAGS
RETURNING WS-RECV-LENGTH
IF WS-RECV-LENGTH < 0
DISPLAY "Failed to receive data"
EXIT PARAGRAPH
END-IF
MOVE
"HTTP/1.1 200 OK" & X"0D0A" &
"Content-Type: text/html" & X"0D0A" &
"Connection: close" & X"0D0A" &
X"0D0A" &
"<html><body><h1>Railway is awesome :)</h1></body></html>"
TO WS-SEND-BUFFER
MOVE LENGTH OF FUNCTION TRIM(WS-SEND-BUFFER) TO WS-SEND-LENGTH
CALL "send" USING BY VALUE WS-CLIENT-SOCKET
BY REFERENCE WS-SEND-BUFFER
BY VALUE WS-SEND-LENGTH
BY VALUE WS-FLAGS
RETURNING WS-RESULT
IF WS-RESULT < 0
DISPLAY "Failed to send response"
END-IF
CALL "close" USING BY VALUE WS-CLIENT-SOCKET.
CLEANUP.
CALL "close" USING BY VALUE WS-SOCKET-DESCRIPTOR
RETURNING WS-RESULT
IF WS-RESULT < 0
DISPLAY "Failed to close server socket"
ELSE
DISPLAY "Server socket closed successfully"
END-IF.