Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
T
Titanium-Web-Proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Administrator
Titanium-Web-Proxy
Commits
14d03dee
Commit
14d03dee
authored
May 31, 2017
by
justcoding121
Committed by
justcoding121
May 31, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
AddHeader Api
parent
0decbffa
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
273 additions
and
19 deletions
+273
-19
Request.cs
Titanium.Web.Proxy/Http/Request.cs
+88
-0
Response.cs
Titanium.Web.Proxy/Http/Response.cs
+121
-0
RequestHandler.cs
Titanium.Web.Proxy/RequestHandler.cs
+20
-16
WinAuthHandler.cs
Titanium.Web.Proxy/WinAuthHandler.cs
+44
-3
No files found.
Titanium.Web.Proxy/Http/Request.cs
View file @
14d03dee
...
...
@@ -306,6 +306,92 @@ namespace Titanium.Web.Proxy.Http
NonUniqueRequestHeaders
=
new
Dictionary
<
string
,
List
<
HttpHeader
>>(
StringComparer
.
OrdinalIgnoreCase
);
}
/// <summary>
/// Add a new header with given name and value
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
public
void
AddHeader
(
string
name
,
string
value
)
{
AddHeader
(
new
HttpHeader
(
name
,
value
));
}
/// <summary>
/// Adds the given header object to Request
/// </summary>
/// <param name="newHeader"></param>
public
void
AddHeader
(
HttpHeader
newHeader
)
{
if
(
NonUniqueRequestHeaders
.
ContainsKey
(
newHeader
.
Name
))
{
NonUniqueRequestHeaders
[
newHeader
.
Name
].
Add
(
newHeader
);
return
;
}
if
(
RequestHeaders
.
ContainsKey
(
newHeader
.
Name
))
{
var
existing
=
RequestHeaders
[
newHeader
.
Name
];
RequestHeaders
.
Remove
(
newHeader
.
Name
);
NonUniqueRequestHeaders
.
Add
(
newHeader
.
Name
,
new
List
<
HttpHeader
>()
{
existing
,
newHeader
});
}
else
{
RequestHeaders
.
Add
(
newHeader
.
Name
,
newHeader
);
}
}
/// <summary>
/// removes all headers with given name
/// </summary>
/// <param name="headerName"></param>
/// <returns>True if header was removed
/// False if no header exists with given name</returns>
public
bool
RemoveHeader
(
string
headerName
)
{
if
(
RequestHeaders
.
ContainsKey
(
headerName
))
{
RequestHeaders
.
Remove
(
headerName
);
return
true
;
}
else
if
(
NonUniqueRequestHeaders
.
ContainsKey
(
headerName
))
{
NonUniqueRequestHeaders
.
Remove
(
headerName
);
return
true
;
}
return
false
;
}
/// <summary>
/// Removes given header object if it exist
/// </summary>
/// <param name="header">Returns true if header exists and was removed </param>
public
bool
RemoveHeader
(
HttpHeader
header
)
{
if
(
RequestHeaders
.
ContainsKey
(
header
.
Name
))
{
if
(
RequestHeaders
[
header
.
Name
].
Equals
(
header
))
{
RequestHeaders
.
Remove
(
header
.
Name
);
return
true
;
}
}
else
if
(
NonUniqueRequestHeaders
.
ContainsKey
(
header
.
Name
))
{
if
(
NonUniqueRequestHeaders
[
header
.
Name
]
.
RemoveAll
(
x
=>
x
.
Equals
(
header
))
>
0
)
{
return
true
;
}
}
return
false
;
}
/// <summary>
/// Dispose off
/// </summary>
...
...
@@ -320,5 +406,7 @@ namespace Titanium.Web.Proxy.Http
RequestBody
=
null
;
RequestBody
=
null
;
}
}
}
Titanium.Web.Proxy/Http/Response.cs
View file @
14d03dee
...
...
@@ -242,6 +242,127 @@ namespace Titanium.Web.Proxy.Http
NonUniqueResponseHeaders
=
new
Dictionary
<
string
,
List
<
HttpHeader
>>(
StringComparer
.
OrdinalIgnoreCase
);
}
/// <summary>
/// True if header exists
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public
bool
HeaderExists
(
string
name
)
{
if
(
ResponseHeaders
.
ContainsKey
(
name
)
||
NonUniqueResponseHeaders
.
ContainsKey
(
name
))
{
return
true
;
}
return
false
;
}
/// <summary>
/// Returns all headers with given name if exists
/// Returns null if does'nt exist
/// </summary>
/// <param name="name"></param>
/// <returns></returns>
public
List
<
HttpHeader
>
GetHeaders
(
string
name
)
{
if
(
ResponseHeaders
.
ContainsKey
(
name
))
{
return
new
List
<
HttpHeader
>()
{
ResponseHeaders
[
name
]
};
}
else
if
(
NonUniqueResponseHeaders
.
ContainsKey
(
name
))
{
return
new
List
<
HttpHeader
>(
NonUniqueResponseHeaders
[
name
]);
}
return
null
;
}
/// <summary>
/// Add a new header with given name and value
/// </summary>
/// <param name="name"></param>
/// <param name="value"></param>
public
void
AddHeader
(
string
name
,
string
value
)
{
AddHeader
(
new
HttpHeader
(
name
,
value
));
}
/// <summary>
/// Adds the given header object to Response
/// </summary>
/// <param name="newHeader"></param>
public
void
AddHeader
(
HttpHeader
newHeader
)
{
if
(
NonUniqueResponseHeaders
.
ContainsKey
(
newHeader
.
Name
))
{
NonUniqueResponseHeaders
[
newHeader
.
Name
].
Add
(
newHeader
);
return
;
}
if
(
ResponseHeaders
.
ContainsKey
(
newHeader
.
Name
))
{
var
existing
=
ResponseHeaders
[
newHeader
.
Name
];
ResponseHeaders
.
Remove
(
newHeader
.
Name
);
NonUniqueResponseHeaders
.
Add
(
newHeader
.
Name
,
new
List
<
HttpHeader
>()
{
existing
,
newHeader
});
}
else
{
ResponseHeaders
.
Add
(
newHeader
.
Name
,
newHeader
);
}
}
/// <summary>
/// removes all headers with given name
/// </summary>
/// <param name="headerName"></param>
/// <returns>True if header was removed
/// False if no header exists with given name</returns>
public
bool
RemoveHeader
(
string
headerName
)
{
if
(
ResponseHeaders
.
ContainsKey
(
headerName
))
{
ResponseHeaders
.
Remove
(
headerName
);
return
true
;
}
else
if
(
NonUniqueResponseHeaders
.
ContainsKey
(
headerName
))
{
NonUniqueResponseHeaders
.
Remove
(
headerName
);
return
true
;
}
return
false
;
}
/// <summary>
/// Removes given header object if it exist
/// </summary>
/// <param name="header">Returns true if header exists and was removed </param>
public
bool
RemoveHeader
(
HttpHeader
header
)
{
if
(
ResponseHeaders
.
ContainsKey
(
header
.
Name
))
{
if
(
ResponseHeaders
[
header
.
Name
].
Equals
(
header
))
{
ResponseHeaders
.
Remove
(
header
.
Name
);
return
true
;
}
}
else
if
(
NonUniqueResponseHeaders
.
ContainsKey
(
header
.
Name
))
{
if
(
NonUniqueResponseHeaders
[
header
.
Name
]
.
RemoveAll
(
x
=>
x
.
Equals
(
header
))
>
0
)
{
return
true
;
}
}
return
false
;
}
/// <summary>
/// Dispose off
/// </summary>
...
...
Titanium.Web.Proxy/RequestHandler.cs
View file @
14d03dee
...
...
@@ -453,27 +453,31 @@ namespace Titanium.Web.Proxy
await
args
.
WebSession
.
SendRequest
(
Enable100ContinueBehaviour
);
}
//
If request was modified by user
if
(
args
.
WebSession
.
Request
.
RequestBodyRead
)
//
check if content-length is > 0
if
(
args
.
WebSession
.
Request
.
ContentLength
>
0
)
{
if
(
args
.
WebSession
.
Request
.
ContentEncoding
!=
null
)
//If request was modified by user
if
(
args
.
WebSession
.
Request
.
RequestBodyRead
)
{
args
.
WebSession
.
Request
.
RequestBody
=
await
GetCompressedResponseBody
(
args
.
WebSession
.
Request
.
ContentEncoding
,
args
.
WebSession
.
Request
.
RequestBody
);
}
//chunked send is not supported as of now
args
.
WebSession
.
Request
.
ContentLength
=
args
.
WebSession
.
Request
.
RequestBody
.
Length
;
if
(
args
.
WebSession
.
Request
.
ContentEncoding
!=
null
)
{
args
.
WebSession
.
Request
.
RequestBody
=
await
GetCompressedResponseBody
(
args
.
WebSession
.
Request
.
ContentEncoding
,
args
.
WebSession
.
Request
.
RequestBody
);
}
//chunked send is not supported as of now
args
.
WebSession
.
Request
.
ContentLength
=
args
.
WebSession
.
Request
.
RequestBody
.
Length
;
var
newStream
=
args
.
WebSession
.
ServerConnection
.
Stream
;
await
newStream
.
WriteAsync
(
args
.
WebSession
.
Request
.
RequestBody
,
0
,
args
.
WebSession
.
Request
.
RequestBody
.
Length
);
}
else
{
if
(!
args
.
WebSession
.
Request
.
ExpectationFailed
)
var
newStream
=
args
.
WebSession
.
ServerConnection
.
Stream
;
await
newStream
.
WriteAsync
(
args
.
WebSession
.
Request
.
RequestBody
,
0
,
args
.
WebSession
.
Request
.
RequestBody
.
Length
);
}
else
{
//If its a post/put/patch request, then read the client html body and send it to server
if
(
args
.
WebSession
.
Request
.
HasBody
)
if
(!
args
.
WebSession
.
Request
.
ExpectationFailed
)
{
await
SendClientRequestBody
(
args
);
//If its a post/put/patch request, then read the client html body and send it to server
if
(
args
.
WebSession
.
Request
.
HasBody
)
{
await
SendClientRequestBody
(
args
);
}
}
}
}
...
...
Titanium.Web.Proxy/WinAuthHandler.cs
View file @
14d03dee
...
...
@@ -5,6 +5,8 @@ using System.Threading.Tasks;
using
Titanium.Web.Proxy.EventArguments
;
using
Titanium.Web.Proxy.Models
;
using
Titanium.Web.Proxy.Network.WinAuth
;
using
Titanium.Web.Proxy.Extensions
;
using
Titanium.Web.Proxy.Helpers
;
namespace
Titanium.Web.Proxy
{
...
...
@@ -87,11 +89,35 @@ namespace Titanium.Web.Proxy
{
var
scheme
=
authSchemes
.
FirstOrDefault
(
x
=>
authHeader
.
Value
.
Equals
(
x
,
StringComparison
.
OrdinalIgnoreCase
));
//clear any existing headers to avoid confusing bad servers
if
(
args
.
WebSession
.
Request
.
NonUniqueRequestHeaders
.
ContainsKey
(
"Authorization"
))
{
args
.
WebSession
.
Request
.
NonUniqueRequestHeaders
.
Remove
(
"Authorization"
);
}
//initial value will match exactly any of the schemes
if
(
scheme
!=
null
)
{
var
clientToken
=
WinAuthHandler
.
GetInitialAuthToken
(
args
.
WebSession
.
Request
.
Host
,
scheme
,
args
.
Id
);
args
.
WebSession
.
Request
.
RequestHeaders
.
Add
(
"Authorization"
,
new
HttpHeader
(
"Authorization"
,
string
.
Concat
(
scheme
,
clientToken
)));
var
auth
=
new
HttpHeader
(
"Authorization"
,
string
.
Concat
(
scheme
,
clientToken
));
//replace existing authorization header if any
if
(
args
.
WebSession
.
Request
.
RequestHeaders
.
ContainsKey
(
"Authorization"
))
{
args
.
WebSession
.
Request
.
RequestHeaders
[
"Authorization"
]
=
auth
;
}
else
{
args
.
WebSession
.
Request
.
RequestHeaders
.
Add
(
"Authorization"
,
auth
);
}
//don't need to send body for Authorization request
if
(
args
.
WebSession
.
Request
.
HasBody
)
{
args
.
WebSession
.
Request
.
ContentLength
=
0
;
}
}
//challenge value will start with any of the scheme selected
else
...
...
@@ -102,13 +128,28 @@ namespace Titanium.Web.Proxy
var
serverToken
=
authHeader
.
Value
.
Substring
(
scheme
.
Length
+
1
);
var
clientToken
=
WinAuthHandler
.
GetFinalAuthToken
(
args
.
WebSession
.
Request
.
Host
,
serverToken
,
args
.
Id
);
//there will be an existing header from initial client request
args
.
WebSession
.
Request
.
RequestHeaders
[
"Authorization"
]
=
new
HttpHeader
(
"Authorization"
,
string
.
Concat
(
scheme
,
clientToken
));
//send body for final auth request
if
(
args
.
WebSession
.
Request
.
HasBody
)
{
args
.
WebSession
.
Request
.
ContentLength
=
args
.
WebSession
.
Request
.
RequestBody
.
Length
;
}
}
//clear current response
//Need to revisit this.
//Should we cache all Set-Cokiee headers from server during auth process
//and send it to client after auth?
//clear current server response
await
args
.
ClearResponse
();
//request again with updated authorization header
//and server cookies
var
disposed
=
await
HandleHttpSessionRequestInternal
(
args
.
WebSession
.
ServerConnection
,
args
,
false
);
return
disposed
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment