Using Fiddler as a Https Reverse Proxy


The Problem
To help debug and monitor http request between the java application and the remote server, I configure Fiddler in machineA as a reverse proxy which forwards request to  http://machineA:8888 to http://remoteServer:8080. This is easy: follow the guide: Use Fiddler as a Reverse Proxy
Ensure Allow remote clients to connect is checked.
Click Rules > Customize Rules, Inside the OnBeforeRequest handler*, add a new line of code:
static function OnBeforeRequest(oSession: Session) {
if (oSession.host.toLowerCase() == "machineA:8888") 
{  
 oSession.host = "remoteServer:8080";
}

But today, I need pointer to one remote server which uses https: https://remoteServerB.

The Solution

The solution is almost same as http reverse proxy, we just need change http to https additionally.
Click Rules > Customize Rules, Inside the OnBeforeRequest handler, add a new line of code:
static function OnBeforeRequest(oSession: Session) {
if (oSession.host.toLowerCase() == "machineA:8888") 
{  
   oSession.host = "remoteServerB";
   oSession.oRequest.headers.UriScheme = "https";
}

One additional bonus is that due to the additional proxy layer, the complexity of https protocol, such as https handshake is hidden. We can raw decrypted request and response between the application and remote https://remoteServerB.

Resource
Use Fiddler as a Reverse Proxy

Using Chrome DevTools to Bring Default Context Menu: Enable Copy Text


The Problem
Sometimes site owners disable right-click context menu for some reason: to disallow copy text, or to protect better user experience such as Google Drive and Dropbox:  remove browser context menu and add customized context menu.

As web developer, or hackers, we use Chrome Devtools often, especially its "Inspect Element" function, so sometimes we want to remove this limitation: to bring back the browser default context menu.


Enable Copy - Chrome extension
Simple Solution that Works Most Time: document.oncontextmenu = null
or document.designMode = "on"
Site owner usually add javascript like below to disable context menu: <body oncontextmenu="return false;">
Or:
document.oncontextmenu = function() {
    return false;
};
In this case, we can just execute document.oncontextmenu = null in Chrome Devtools to remove the handler.

But sometimes, things are harder. Let's take a look at how to show default context menu in Google Drive as an example.

If this doesn't work you may run the following javascript code in devtools:
window.oncontextmenu=null;;
window.onmousedown=null;
window.onkeydown=null;
window.onclick=null;

document.oncontextmenu=null;
document.onmousedown=null;
document.onkeydown=null;
document.onclick=null;

document.onselectstart=null;
Re-enable Default Context Menu in Google Drive: by Changing Definition of hca function
To restore the default browser context menu in Google Drive, we first open Chrome Devtools(Using Ctrl+Shift+I), in the bottom panel, go to search tab, type "contextmenu".

It will find matches in js file: 2222407164-doclist_modularized_core.js


Clicking one match will bring you to the line, but this js file is minified, and ubale to read. SO click on the pretty button {}, this will format the js file to make it more readable.


Then search "contextmenu" again in the button search tab. Now it will show matches in the formatted js file. 


The following code seems interesting to us. e.Yqa prevent context menu default behaviour.
e.initialize = function(a) {
    b.listen(a, "contextmenu", this.Yqa);
};
e.Yqa = function(a) {
    a.shiftKey || (a.stopPropagation(), a.preventDefault(), pCa(this, a.clientX, a.clientY, a.target))
};
Let's add a breakpoint in the e.Yqa function, right click on Google Drive, now it stops at the Yqa function. This is great.

From the Call Stack view, we can see that e.Yqa function is called by function hca.
function hca(a, b) {
    var c = a.Gn, d = a.Xd || a.src;
    a.Ooa && Ze(a);
    return c.call(d, b)
}
hca is a global function, we can change its definition in the console to change its behavior.


Check the value of parameter a, and b. Found out when we right click in Google Drive, the value of a.type is "contextmenu".

So we can change hca like below: if a.type="contextmenu", do nothing, return directly.
function hca(a, b) {
   if( a.type == "contextmenu" ) return;
    var c = a.Gn, d = a.Xd || a.src;
    a.Ooa && Ze(a);
    return c.call(d, b)
}
So every time, we want to show Chrome's default context menu in Google Drive, run the previous js code in the console to change the definition of hca. Then right click on Google Drive, it will show default context menu.

Happy hacking!!!

Resource
Don’t Disable Right Click!

Eclipse: Only Show Problems for Current Project


The Problem
By default, Eclipse Problem View shows errors and warnings for all projects. To boost our development productivity, we may only want it to show errors and warning for current project, especially when there are too many project.

The Solution
We can configure this in Eclipse Problem View like below:

We can easily switch between show all errors, errors/warning in current project or only errors/warning in selection.

GAE: Java compiler level does not match the version of the installed Java project facet


The Problem
I am creating a new GAE(1.9.1) project today. There is no place to set JDK version during creating Google Web Application Project, and the default JRE in Eclipse is 1.6, and I don't want to change the default JRE to JDK 7 as most of our projects still uses Java 6.

So after creating the GAE project, I want to change GAE project to use JDK 7, so I can use new features in JDK 7.
I right click on the project -> Properties -> Java Build Path -> Libaries, remove JDK 6 runtime and add JDK 7 runtime, also in Java Compiler tab, change Complier compliance level to 1.7.

This will rebuild the project. After it's done, in eclipse Problems views, it shows error:
Java compiler level does not match the version of the installed Java project facet. HelloGAE Unknown Faceted Project Problem (Java Version Mismatch)

We can still write code, run this GAE project, but if there is syntax(commpiler level) error in our code, it will not show in the Problems view. This is kind of annoying.
The Solution
This is because when we create GAE project, it uses JDK 6, thus sets the Java Project Facet level to 1.6.
The value can alos be seen in .settings/org.eclipse.wst.common.project.facet.core.xml

The fix is to change Java Project Facet level to 1.7: right click on the GAE project -> Properties -> Project Facet, in the right panel, change the Java version to 1.7.

It will rebuild the project, now we can see the errors, warnings in Problems view.

Happy coding :)

Labels

adsense (5) Algorithm (69) Algorithm Series (35) Android (7) ANT (6) bat (8) Big Data (7) Blogger (14) Bugs (6) Cache (5) Chrome (19) Code Example (29) Code Quality (7) Coding Skills (5) Database (7) Debug (16) Design (5) Dev Tips (63) Eclipse (32) Git (5) Google (33) Guava (7) How to (9) Http Client (8) IDE (7) Interview (88) J2EE (13) J2SE (49) Java (186) JavaScript (27) JSON (7) Learning code (9) Lesson Learned (6) Linux (26) Lucene-Solr (112) Mac (10) Maven (8) Network (9) Nutch2 (18) Performance (9) PowerShell (11) Problem Solving (11) Programmer Skills (6) regex (5) Scala (6) Security (9) Soft Skills (38) Spring (22) System Design (11) Testing (7) Text Mining (14) Tips (17) Tools (24) Troubleshooting (29) UIMA (9) Web Development (19) Windows (21) xml (5)