32
32
#define MAX_EVENTS 10
33
33
#define PORT "18898"
34
34
35
- void handle_request (int fd , char * raw_req , size_t size )
35
+ int handle_request (int fd , char * raw_req , size_t size )
36
36
{
37
37
assert (fd > 0 );
38
38
assert (raw_req != NULL );
39
39
if (size == 0 ) {
40
40
log_error ("handle_request: raw request size is zero" );
41
- return ;
41
+ return 1 ;
42
42
}
43
43
44
44
// Split and handle requests here
45
45
struct is_prime_request * req = NULL , * it = NULL ;
46
46
int r = is_prime_request_builder (& req , raw_req , size );
47
47
if (r <= 0 ) {
48
48
log_warn ("recv_and_handle: is_prime_request_builder returned '%d'" , r );
49
- return ;
49
+ return -1 ;
50
50
}
51
51
52
- int l = 0 , sl = 0 , res = 0 ;
52
+ int l = 0 , sl = 0 , res = 0 , mal = 0 ;
53
53
for (it = req ; it != NULL ; it = it -> next ) {
54
54
l = (int )strlen (it -> response );
55
55
sl = l ;
@@ -58,18 +58,24 @@ void handle_request(int fd, char* raw_req, size_t size)
58
58
log_error ("handle_request: failed during sendall function" );
59
59
if (req != NULL )
60
60
is_prime_free (& req );
61
- return ;
61
+ return -2 ;
62
62
}
63
63
if (sl != l ) {
64
64
log_error ("handle_request: failed to sendall the data" );
65
65
if (req != NULL )
66
66
is_prime_free (& req );
67
- return ;
67
+ return -3 ;
68
+ }
69
+
70
+ if (it -> number < 0 ) {
71
+ mal = 1 ;
72
+ break ;
68
73
}
69
74
}
70
75
71
76
if (req != NULL )
72
77
is_prime_free (& req );
78
+ return (mal == 1 ? 0 : 1 );
73
79
}
74
80
75
81
int main ()
@@ -151,11 +157,19 @@ int main()
151
157
152
158
// Handle there's data to process
153
159
if (size > 0 ) {
154
- log_trace (
155
- "main epoll loop: handling prime request of size '%d' on fd '%d'" ,
156
- size ,
157
- fd );
158
- handle_request (fd , data , (size_t )size );
160
+ log_trace ("main epoll loop: raw request(%d): '%s'" , fd , data );
161
+ int result = handle_request (fd , data , (size_t )size );
162
+ if (result <= 0 ) {
163
+ if (result == 0 )
164
+ log_info ("main epoll loop: there was a malformed respoonse. need to close socket" );
165
+ else
166
+ log_info ("main epoll loop: there was an error sending a response. need to close socket" );
167
+ if (fd_poll_del_and_close (& epci ) == -1 ) {
168
+ perror ("epoll_ctl: recv 0" );
169
+ exit (EXIT_FAILURE );
170
+ }
171
+ continue ;
172
+ }
159
173
}
160
174
161
175
// Handle socket still open
0 commit comments