java


I'm trying to use Java's HttpURLConnection to do a “conditional get”, but I never get a 304 status code


Here is my code:
final HttpURLConnection conn = (HttpURLConnection) sourceURL.openConnection();
if (cachedPage != null) {
if (cachedPage.eTag != null) {
conn.setRequestProperty("If-None-Match", cachedPage.eTag);
}
conn.setIfModifiedSince(cachedPage.pageLastModified);
}
conn.connect();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
newCachedPage.eTag = conn.getHeaderField("ETag");
newCachedPage.pageLastModified = conn.getHeaderFieldDate("Last-Modified", 0);
} else if (conn.getResponseCode() == HttpURLConnection.HTTP_NOT_MODIFIED) {
// Never reaches here
}
I never seem to get the HTTP_NOT_MODIFIED response code, even hitting the same server several times in quick succession - where there is definitely no change to the page. Also, conn.getHeaderField("ETag") always seems to respond null, and sometimes conn.getHeaderFieldDate("Last-Modified", 0) returns 0. I've tried this against a variety of web servers.
Can anyone tell me what I'm doing wrong?
You're all dependent on the server config.
If you get an Expires response header, then it just means that you don't need to request anything until the specified expire time. If you get a Last-Modified response header, then it means that you should be able to use If-Modified-Since to test it. If you get an ETag response header, then it means that you should be able to use If-None-Match to test it.
Lets take http://cdn3.sstatic.net/stackoverflow/img/favicon.ico as an example (the Stackoverflow's favicon image):
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
System.out.println(connection.getHeaderFields());
This gives:
{null=[HTTP/1.1 200 OK], ETag=["9d9bd8b1165cb1:0"], Date=[Wed, 17 Aug 2011 17:57:07 GMT], Content-Length=[1150], Last-Modified=[Wed, 06 Oct 2010 02:53:46 GMT], Content-Type=[image/x-icon], Connection=[keep-alive], Accept-Ranges=[bytes], Server=[nginx/0.8.36], X-Cache=[HIT], Cache-Control=[max-age=604800]}
Now, do a If-Modified-Since with the same value as Last-Modified:
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
connection.setRequestProperty("If-Modified-Since", "Wed, 06 Oct 2010 02:53:46 GMT");
System.out.println(connection.getHeaderFields());
This gives as expected a 304:
{null=[HTTP/1.1 304 Not Modified], ETag=["9d9bd8b1165cb1:0"], Date=[Wed, 17 Aug 2011 17:57:42 GMT], Last-Modified=[Wed, 06 Oct 2010 02:53:46 GMT], Connection=[keep-alive], Server=[nginx/0.8.36], X-Cache=[HIT], Cache-Control=[max-age=604800]}
Now, do a If-None-Match with the same value as ETag:
URLConnection connection = new URL("http://cdn3.sstatic.net/stackoverflow/img/favicon.ico").openConnection();
connection.setRequestProperty("If-None-Match", "9d9bd8b1165cb1:0");
System.out.println(connection.getHeaderFields());
This gives unexpectedly a 200:
{null=[HTTP/1.1 200 OK], ETag=["9d9bd8b1165cb1:0"], Date=[Wed, 17 Aug 2011 18:01:42 GMT], Content-Length=[1150], Last-Modified=[Wed, 06 Oct 2010 02:53:46 GMT], Content-Type=[image/x-icon], Connection=[keep-alive], Accept-Ranges=[bytes], Server=[nginx/0.8.36], X-Cache=[HIT], Cache-Control=[max-age=604800]}
Even more surprising, when the both headers are set with random garbage value as ETag, the server still gives a 304. This is an indication that the If-None-Match is completely ignored by the server behind http://cdn3.sstatic.net. That might be a (proxy) configuration issue or be done fully awarely (not for obvious reasons imho).
Or shorter :)
Just try set connection timeout other than 0.
conn.setConnectionTimeout( 3000);
Do it after .openConnection()
final HttpURLConnection conn = (HttpURLConnection) sourceURL.openConnection();
conn.setConnectionTimeout( 3000);
If not set also readTimeout other than 0.
conn.setReadTimeout( 3000);

Related Links

Crashing when reading a file through JNI but successful when running just the C element of code
Registering User PHP with Android Studio
Trouble displaying dice images in a JApplet
Java : I want to change an integer array into a mathematical number [duplicate]
Buffered writer not writing to file
Width of a VBox is still 0 even though it's larger than 0 in the scene
How to add two numbers accepted in String form in Java?
Accessing Images from image folder in JAVA
Why Request doesn't reach to controller in spring mvc?
Proper POJO for serializing JSON with Jackson library
Error while launching the app
Could not load JDBC driver class [com.mysql.jdbc.Driver]
Code Won't Drop Students From a Course [Java]
Deploying a simple Java Spark web app
JPasswordField.getPassword() is still not secured?
char[] to full quantified name of java class for method parameter

Categories

HOME
hook
netsuite
azure-data-factory
server
plone
plot
lodash
octobercms
setup-deployment
spring-cloud-stream
microservices
icloud
retrofit
ebean
ravendb
ezpublish
directx
android-youtube-api
kibana-4
fancybox-3
rascal
modx-revolution
mapserver
quickbooks
nstableview
spring-tool-suite
task
quartz-scheduler
opentracing
libtiff
seaborn
serilog
code-review
paging
functional-testing
sylius
accessor
intel-pin
pingfederate
maxmind
vision
bpel
nouislider
tinymce-4
iframe-resizer
bosh
create-table
scorm2004
copying
windows-dev-center
amazon-kinesis-kpl
http-digest
main
lto
az-application-insights
jna
ansible-playbook
awt
android-mediaprojection
mime
checkboxlist
galleria
fault
youcompleteme
jquery-nestable
git-diff
svmlight
magma
qtwebview
sqldf
color-profile
titanium-android
redundancy
spring-android
slicknav
adxstudio-portals
measures
thrust
merge-conflict-resolution
player
websitepanel
blackberry-10
whois
pagerank
asp.net5
wapiti
srand
python-3.2
php-ci
interrupted-exception
iiviewdeckcontroller
census
nsmutabledictionary
gadt
android-imagebutton
id3v2
device-manager
issuu
html-helper
project-planning
mesa
sgen
aapt
rebol3
imdbpy
ivyde
commoncrypto
inbox
runtime.exec
ftps
spring-validator
sharp-repository
ember-app-kit
http-unit
jelly
clipper
e4x
jquery-knob
runas
pysimplesoap
pydot
psi
yetanotherforum
netbeans-7.1
floating
remember-me
paster
suppress
nsviewanimation
perfect-hash
webkit.net
kdbg
microsoft-virtualization
text-coloring

Resources

Mobile Apps Dev
Database Users
javascript
java
csharp
php
android
MS Developer
developer works
python
ios
c
html
jquery
RDBMS discuss
Cloud Virtualization
Database Dev&Adm
javascript
java
csharp
php
python
android
jquery
ruby
ios
html
Mobile App
Mobile App
Mobile App