Skip to content

Commit 158927a

Browse files
committed
Handle server response with missing content-length
If server does not return if content-length header, we still can get We only lose the post condition assurance that what we read is the same as what we got from the server. This should not matter most of the time.
1 parent 370be02 commit 158927a

File tree

2 files changed

+32
-21
lines changed

2 files changed

+32
-21
lines changed

lib/junethack/fetch_games.rb

Lines changed: 26 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ def fetch_all
2323
@fetch_logger.info "File #{@stop_fetching_games} exists, don't get new games."
2424
return
2525
end
26+
2627
@fetch_logger.info "Looking for new games..."
2728
for server in Server.all
2829
begin
@@ -37,10 +38,10 @@ def fetch_all
3738
@fetch_logger.debug "fetched header #{header.inspect}"
3839
@fetch_logger.debug "current offset: #{server.xlogcurrentoffset}"
3940
if server.xlogcurrentoffset == nil
40-
server.xlogcurrentoffset = header['content-length'].to_i
41-
server.xloglastmodified = header['last-modified'] || 'Thu, 01 Jan 1970 00:00:00 GMT'
42-
$db_access.synchronize { server.save }
43-
next
41+
server.xlogcurrentoffset = header['content-length'].to_i
42+
server.xloglastmodified = header['last-modified'] || 'Thu, 01 Jan 1970 00:00:00 GMT'
43+
$db_access.synchronize { server.save }
44+
next
4445
end
4546

4647
# in case the web server doesn't send Last-Modified, use current time
@@ -75,21 +76,21 @@ def fetch_all
7576
junk = (ignored_game_modes & modes).size > 0
7677
if server.name == 'acc_gnl'
7778
junk ||= hgame['tournament'] == 'no' # Gnollhack tournament mode
78-
junk ||= hgame['seclvl'] < 1 # Gnollhack security level
79+
junk ||= hgame['seclvl'].to_i < 1 # Gnollhack security level
7980
end
8081

8182
if start_scummed then
82-
game = StartScummedGame.create({server: server}.merge(hgame))
83-
@fetch_logger.debug "start scummed game"
84-
count_scummed_games += 1
83+
game = StartScummedGame.create({server: server}.merge(hgame))
84+
@fetch_logger.debug "start scummed game"
85+
count_scummed_games += 1
8586
elsif junk then
86-
game = JunkGame.create({server: server}.merge(hgame))
87-
@fetch_logger.debug "junk game"
88-
count_junk_games += 1
87+
game = JunkGame.create({server: server}.merge(hgame))
88+
@fetch_logger.debug "junk game"
89+
count_junk_games += 1
8990
elsif ([nil, 'hah', 'hoh', 'normal', 'solo', 'challenge'] & modes) != [] then
9091
game = Game.create({server: server}.merge(hgame))
91-
count_games += 1
92-
regular_game = true
92+
count_games += 1
93+
regular_game = true
9394
else
9495
raise "Unknown 'mode' value: #{modes.inspect}"
9596
end
@@ -130,8 +131,16 @@ def fetch_all
130131
end
131132
end
132133
#repository.adapter.execute("COMMIT");
133-
raise "xlogcurrentoffset mismatch: #{server.xlogcurrentoffset} != #{header['content-length'].to_i}" if server.xlogcurrentoffset != header['content-length'].to_i
134-
@fetch_logger.info "Inserted #{count_games} tournament, #{count_non_tournament_games} non tournament, #{count_scummed_games} start scummed, and #{count_junk_games} junk games on #{server.name}."
134+
if header['content-length'] && server.xlogcurrentoffset != header['content-length'].to_i
135+
raise "xlogcurrentoffset mismatch: #{server.xlogcurrentoffset} != #{header['content-length'].to_i}"
136+
end
137+
138+
@fetch_logger.info([
139+
"Inserted #{count_games} tournament",
140+
"#{count_non_tournament_games} non tournament",
141+
"#{count_scummed_games} start scummed",
142+
"and #{count_junk_games} junk games on #{server.name}."
143+
].join(', '))
135144
else
136145
@fetch_logger.debug "No games at all on #{server.name}!"
137146
end
@@ -141,8 +150,8 @@ def fetch_all
141150
@fetch_logger.debug "No new games on #{server.name}."
142151
end
143152
rescue Exception => e
144-
@fetch_logger.error e.to_s
145-
@fetch_logger_error.error e
153+
@fetch_logger.error e.to_s
154+
@fetch_logger_error.error e
146155
end
147156
end
148157
end

lib/junethack/parse.rb

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ def self.fetch_header xlog_url
2929
if head.start_with?('HTTP/2 405')
3030
# web server not supporting HEAD
3131
puts "workaround for #{xlog_url}"
32-
head = %x{ curl -L -i -s #{xlog_url}}.split("\r\n\r\n").first
32+
head = %x{ curl -L -i -s --http2 -H "Range: bytes=0-4095" #{xlog_url}}.split("\r\n\r\n").first
3333
end
3434
head
3535
end
@@ -40,14 +40,16 @@ def self.parse_header raw_header
4040
end
4141

4242
def self.fetch_from_xlog xlog_url, startp, endp
43-
return false if startp.to_i >= endp.to_i-1
43+
return false if endp != nil && startp.to_i >= endp.to_i-1
44+
# open end for byte range if content length is unknown
45+
endp = endp ? endp.to_i-1 : nil
4446

4547
if ENV['JUNETHACK_TRACE']
4648
time = Time.new.iso8601
47-
xlogdiff = %x{ curl -L --trace-time --trace-ascii "trace/#{time}_trace.log" -s -r #{startp}-#{endp.to_i-1} #{xlog_url}}
49+
xlogdiff = %x{ curl -L --trace-time --trace-ascii "trace/#{time}_trace.log" -s -r #{startp}-#{endp} #{xlog_url}}
4850
File.open("trace/#{time}_xlogfile.txt", 'w') {|f| f.write(xlogdiff) }
4951
else
50-
xlogdiff = %x{ curl -L -s -r #{startp}-#{endp.to_i-1} #{xlog_url}}
52+
xlogdiff = %x{ curl -L -s -r #{startp}-#{endp} #{xlog_url}}
5153
end
5254
StringIO.new xlogdiff
5355
end

0 commit comments

Comments
 (0)