@@ -180,7 +180,7 @@ void copy_str(char *dst, ssize_t size, const char *begin, const char *end)
180180 }
181181
182182 memcpy (dst, begin, len);
183-
183+
184184 if (len >= 1 && dst[len - 1 ] == ' \n ' ) {
185185 len--;
186186 }
@@ -201,7 +201,11 @@ bool HTTPPlugin::is_request(const char *data, int payload_len)
201201 }
202202 memcpy (chars, data, 4 );
203203 chars[4 ] = 0 ;
204- return valid_http_method (chars);
204+
205+ // 'valid_http_method' can quicky confirm valid http methods.
206+ // 'invalid_http_method' is slower but can check if it is http request even
207+ // if the method is invalid.
208+ return valid_http_method (chars) || invalid_http_method (data, payload_len);
205209}
206210
207211bool HTTPPlugin::is_response (const char *data, int payload_len)
@@ -521,6 +525,42 @@ bool HTTPPlugin::valid_http_method(const char *method) const
521525 !strcmp (method, " PATC" ));
522526}
523527
528+ /* *
529+ * @brief Check if the payload is http request even with invalid method.
530+ *
531+ * @param [in] payload Packet payload data.
532+ * @param payload_len Length packet payload.
533+ * @return True if the packet is http request.
534+ */
535+ bool HTTPPlugin::invalid_http_method (const char *data, int payload_len) const
536+ {
537+ // METHOD URI HTTP/VERSION
538+ // | | |
539+ // | | +---- uri_end
540+ // | +---- method_end
541+ // +---- data
542+
543+ // check if there is space in the first HTTP_MAX_METHOD_LENGTH chars
544+ int len = std::min (payload_len, HTTP_MAX_METHOD_LENGTH);
545+ auto method_end = static_cast <const char *>(memchr (data, ' ' , len));
546+ if (method_end == nullptr )
547+ return false ;
548+
549+ payload_len -= method_end - data - 1 ;
550+ if (payload_len <= 0 )
551+ return false ;
552+
553+ auto uri_end = static_cast <const char *>(memchr (method_end + 1 , ' ' , payload_len));
554+ if (method_end == nullptr )
555+ return false ;
556+
557+ payload_len -= uri_end - method_end;
558+ if (payload_len <= 4 )
559+ return false ;
560+
561+ return memcmp (uri_end + 1 , " HTTP" , 4 ) == 0 ;
562+ }
563+
524564/* *
525565 * \brief Add new extension http request header into flow record.
526566 * \param [in] data Packet payload data.
0 commit comments