@@ -445,11 +445,21 @@ int Transaction::processURI(const char *uri, const char *method,
445445 m_httpVersion = http_version;
446446 m_uri = uri;
447447 std::string uri_s (uri);
448- m_uri_decoded = utils::uri_decode (uri);
449448
450- size_t pos = m_uri_decoded.find (" ?" );
451- size_t pos_raw = uri_s.find (" ?" );
452- size_t var_size = pos_raw;
449+ // any uri-fragment that was received should only be retained in
450+ // - m_uri
451+ // - m_variableRequestURIRaw
452+ // - m_variableRequestLine
453+ size_t pos_raw_fragment = uri_s.find (" #" );
454+ if (pos_raw_fragment != std::string::npos) {
455+ uri_s = uri_s.substr (0 , pos_raw_fragment);
456+ }
457+
458+ size_t pos_raw_query = uri_s.find (" ?" );
459+
460+ m_uri_decoded = utils::uri_decode (uri_s);
461+
462+ size_t var_size = pos_raw_query;
453463
454464 m_variableRequestMethod.set (method, 0 );
455465
@@ -462,28 +472,28 @@ int Transaction::processURI(const char *uri, const char *method,
462472 m_variableOffset + requestLine.size () + 1 );
463473
464474
465-
466- if (pos != std::string::npos) {
475+ size_t pos_query = m_uri_decoded. find ( " ? " );
476+ if (pos_query != std::string::npos) {
467477 m_uri_no_query_string_decoded = std::unique_ptr<std::string>(
468- new std::string (m_uri_decoded, 0 , pos ));
478+ new std::string (m_uri_decoded, 0 , pos_query ));
469479 } else {
470480 m_uri_no_query_string_decoded = std::unique_ptr<std::string>(
471481 new std::string (m_uri_decoded));
472482 }
473483
474484
475- if (pos_raw != std::string::npos) {
476- std::string qry = std::string (uri_s, pos_raw + 1 ,
477- uri_s.length () - (pos_raw + 1 ));
478- m_variableQueryString.set (qry, pos_raw + 1
485+ if (pos_raw_query != std::string::npos) {
486+ std::string qry = std::string (uri_s, pos_raw_query + 1 ,
487+ uri_s.length () - (pos_raw_query + 1 ));
488+ m_variableQueryString.set (qry, pos_raw_query + 1
479489 + std::string (method).size () + 1 );
480490 }
481491
482492 std::string path_info;
483- if (pos == std::string::npos) {
493+ if (pos_query == std::string::npos) {
484494 path_info = std::string (m_uri_decoded, 0 );
485495 } else {
486- path_info = std::string (m_uri_decoded, 0 , pos );
496+ path_info = std::string (m_uri_decoded, 0 , pos_query );
487497 }
488498 if (var_size == std::string::npos) {
489499 var_size = uri_s.size ();
@@ -495,7 +505,6 @@ int Transaction::processURI(const char *uri, const char *method,
495505 strlen (method) + 1 , var_size);
496506
497507
498-
499508 size_t offset = path_info.find_last_of (" /\\ " );
500509 if (offset != std::string::npos && path_info.length () > offset + 1 ) {
501510 std::string basename = std::string (path_info, offset + 1 ,
0 commit comments