mirror of
				https://git.wownero.com/wownero/wownero.git
				synced 2024-08-15 01:03:23 +00:00 
			
		
		
		
	http_client: reduce number of packets sent for small bodies
This commit is contained in:
		
							parent
							
								
									2656cdf505
								
							
						
					
					
						commit
						e0b2123c32
					
				
					 1 changed files with 26 additions and 16 deletions
				
			
		| 
						 | 
					@ -245,8 +245,18 @@ namespace net_utils
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// This magic var determines the maximum length for when copying the body message in
 | 
				
			||||||
 | 
									// memory is faster/more preferable than the round-trip time for one packet
 | 
				
			||||||
 | 
									constexpr size_t BODY_NO_COPY_CUTOFF = 128 * 1024; // ~262 KB or ~175 packets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									// Maximum expected total headers bytes
 | 
				
			||||||
 | 
									constexpr size_t HEADER_RESERVE_SIZE = 2048;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									const bool do_copy_body = body.size() <= BODY_NO_COPY_CUTOFF;
 | 
				
			||||||
 | 
									const size_t req_buff_cap = HEADER_RESERVE_SIZE + (do_copy_body ? body.size() : 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				std::string req_buff{};
 | 
									std::string req_buff{};
 | 
				
			||||||
				req_buff.reserve(2048);
 | 
									req_buff.reserve(req_buff_cap);
 | 
				
			||||||
				req_buff.append(method.data(), method.size()).append(" ").append(uri.data(), uri.size()).append(" HTTP/1.1\r\n");
 | 
									req_buff.append(method.data(), method.size()).append(" ").append(uri.data(), uri.size()).append(" HTTP/1.1\r\n");
 | 
				
			||||||
				add_field(req_buff, "Host", m_host_buff);
 | 
									add_field(req_buff, "Host", m_host_buff);
 | 
				
			||||||
				add_field(req_buff, "Content-Length", std::to_string(body.size()));
 | 
									add_field(req_buff, "Content-Length", std::to_string(body.size()));
 | 
				
			||||||
| 
						 | 
					@ -255,9 +265,7 @@ namespace net_utils
 | 
				
			||||||
				for(const auto& field : additional_params)
 | 
									for(const auto& field : additional_params)
 | 
				
			||||||
					add_field(req_buff, field);
 | 
										add_field(req_buff, field);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				for (unsigned sends = 0; sends < 2; ++sends)
 | 
					 | 
				
			||||||
				{
 | 
									{
 | 
				
			||||||
					const std::size_t initial_size = req_buff.size();
 | 
					 | 
				
			||||||
					const auto auth = m_auth.get_auth_field(method, uri);
 | 
										const auto auth = m_auth.get_auth_field(method, uri);
 | 
				
			||||||
					if (auth)
 | 
										if (auth)
 | 
				
			||||||
						add_field(req_buff, *auth);
 | 
											add_field(req_buff, *auth);
 | 
				
			||||||
| 
						 | 
					@ -265,11 +273,21 @@ namespace net_utils
 | 
				
			||||||
					req_buff += "\r\n";
 | 
										req_buff += "\r\n";
 | 
				
			||||||
					//--
 | 
										//--
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					bool res = m_net_client.send(req_buff, timeout);
 | 
										if (do_copy_body) // small body
 | 
				
			||||||
					CHECK_AND_ASSERT_MES(res, false, "HTTP_CLIENT: Failed to SEND");
 | 
										{
 | 
				
			||||||
					if(body.size())
 | 
											// Copy headers + body together and potentially send one fewer packet
 | 
				
			||||||
 | 
											req_buff.append(body.data(), body.size());
 | 
				
			||||||
 | 
											const bool res = m_net_client.send(req_buff, timeout);
 | 
				
			||||||
 | 
											CHECK_AND_ASSERT_MES(res, false, "HTTP_CLIENT: Failed to SEND");
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										else // large body
 | 
				
			||||||
 | 
										{
 | 
				
			||||||
 | 
											// Send headers and body seperately to avoid copying heavy body message
 | 
				
			||||||
 | 
											bool res = m_net_client.send(req_buff, timeout);
 | 
				
			||||||
 | 
											CHECK_AND_ASSERT_MES(res, false, "HTTP_CLIENT: Failed to SEND");
 | 
				
			||||||
						res = m_net_client.send(body, timeout);
 | 
											res = m_net_client.send(body, timeout);
 | 
				
			||||||
					CHECK_AND_ASSERT_MES(res, false, "HTTP_CLIENT: Failed to SEND");
 | 
											CHECK_AND_ASSERT_MES(res, false, "HTTP_CLIENT: Failed to SEND");
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					m_response_info.clear();
 | 
										m_response_info.clear();
 | 
				
			||||||
					m_state = reciev_machine_state_header;
 | 
										m_state = reciev_machine_state_header;
 | 
				
			||||||
| 
						 | 
					@ -282,19 +300,11 @@ namespace net_utils
 | 
				
			||||||
						return true;
 | 
											return true;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
					switch (m_auth.handle_401(m_response_info))
 | 
										if (m_auth.handle_401(m_response_info) == http_client_auth::kParseFailure)
 | 
				
			||||||
					{
 | 
										{
 | 
				
			||||||
					case http_client_auth::kSuccess:
 | 
					 | 
				
			||||||
						break;
 | 
					 | 
				
			||||||
					case http_client_auth::kBadPassword:
 | 
					 | 
				
			||||||
                                                sends = 2;
 | 
					 | 
				
			||||||
						break;
 | 
					 | 
				
			||||||
					default:
 | 
					 | 
				
			||||||
					case http_client_auth::kParseFailure:
 | 
					 | 
				
			||||||
						LOG_ERROR("Bad server response for authentication");
 | 
											LOG_ERROR("Bad server response for authentication");
 | 
				
			||||||
						return false;
 | 
											return false;
 | 
				
			||||||
					}
 | 
										}
 | 
				
			||||||
					req_buff.resize(initial_size); // rollback for new auth generation
 | 
					 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				LOG_ERROR("Client has incorrect username/password for server requiring authentication");
 | 
									LOG_ERROR("Client has incorrect username/password for server requiring authentication");
 | 
				
			||||||
				return false;
 | 
									return false;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue