Skip to content

Commit

Permalink
For #1488, support parsing original ip from header for proxy
Browse files Browse the repository at this point in the history
  • Loading branch information
winlinvip committed Dec 26, 2019
1 parent 09b65af commit d367730
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 0 deletions.
6 changes: 6 additions & 0 deletions trunk/src/app/srs_app_http_conn.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -875,6 +875,12 @@ SrsRequest* SrsHttpMessage::to_request(string vhost)
if (conn) {
req->ip = conn->remote_ip();
}

// Overwrite by ip from proxy.
string oip = srs_get_original_ip(this);
if (!oip.empty()) {
req->ip = oip;
}

return req;
}
Expand Down
32 changes: 32 additions & 0 deletions trunk/src/app/srs_app_utility.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ using namespace std;
#include <srs_protocol_json.hpp>
#include <srs_kernel_stream.hpp>
#include <srs_kernel_utility.hpp>
#include <srs_http_stack.hpp>

// the longest time to wait for a process to quit.
#define SRS_PROCESS_QUIT_TIMEOUT_MS 1000
Expand Down Expand Up @@ -1541,3 +1542,34 @@ void srs_api_dump_summaries(std::stringstream& ss)
<< SRS_JOBJECT_END;
}

string srs_get_original_ip(ISrsHttpMessage* r)
{
string x_forwarded_for, x_real_ip;
for (int i = 0; i < r->request_header_count(); i++) {
string k = r->request_header_key_at(i);
if (k == "X-Forwarded-For") {
x_forwarded_for = r->request_header_value_at(i);
} else if (k == "X-Real-IP") {
x_real_ip = r->request_header_value_at(i);
}
}

if (!x_forwarded_for.empty()) {
size_t pos = string::npos;
if ((pos = x_forwarded_for.find(",")) == string::npos) {
return x_forwarded_for;
}
return x_forwarded_for.substr(0, pos);
}

if (!x_real_ip.empty()) {
size_t pos = string::npos;
if ((pos = x_real_ip.find(":")) == string::npos) {
return x_real_ip;
}
return x_real_ip.substr(0, pos);
}

return "";
}

4 changes: 4 additions & 0 deletions trunk/src/app/srs_app_utility.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

class SrsKbps;
class SrsStream;
class ISrsHttpMessage;

// client open socket and connect to server.
extern int srs_socket_connect(std::string server, int port, int64_t timeout, st_netfd_t* pstfd);
Expand Down Expand Up @@ -689,5 +690,8 @@ extern bool srs_is_boolean(const std::string& str);
// dump summaries for /api/v1/summaries.
extern void srs_api_dump_summaries(std::stringstream& ss);

// Get the original ip from query and header by proxy.
extern std::string srs_get_original_ip(ISrsHttpMessage* r);

#endif

0 comments on commit d367730

Please sign in to comment.