付费客户自动化更新数据文件说明

通过 HTTP 响应头 ETag 校验下载的数据文件是否完整

1ETag 校验说明

为了确保用户下载的数据完整,我们增加了 HTTP 下载响应头 ETag 字段来供用户做验证。

ETag 字段格式为 算法名称-验证字符串,例如 sha1- 后接文件内容的 SHA1 值。

2更新流程

  1. 请求新版本下载地址,状态码非 200 时输出错误提示并退出
  2. 读取响应头中的 ETag,不存在则退出
  3. 将响应内容写入临时文件
  4. 计算临时文件的 SHA1,与 ETag 中的验证字符串比对,不一致则退出
  5. 使用 ipdb 加载临时文件做自检,出错则不覆盖,重新下载
  6. 校验通过后用临时文件覆盖正式文件(目标目录必须有可写权限)

3Golang 示例代码

4Python 示例代码

Python
# encoding=utf8

import requests
import hashlib,sys,os,shutil,ipdb
down_url = "https://user.ipip.net/download.php?a=custom&token=TOKEN&lang=CN&name=ipv4_cn.ipdb.zip" #新版本下载地址
response = requests.get(down_url) # 发起http请求
if response.status_code != 200:
    print(response.content.decode('utf-8')) # 错误提示
    sys.exit(0)
etag_value = response.headers.get("ETag") #获取ETag值
if not etag_value:           # ETag不存在就退出
    print("etag not exists")
    sys.exit(0)
with open("c:/tmp/ipip_temp.ipdb", 'wb+') as fd: #写临时文件
    for chunk in response.iter_content(4096):
        fd.write(chunk)
with open("c:/tmp/ipip_temp.ipdb", 'rb') as fd: #读取临时文件
    sha1 = hashlib.sha1()
    while True:
        content = fd.read(4096)
        if not content:
            break
        sha1.update(content)
    content_sha1_value = sha1.hexdigest() #计算临时文件sha1
    etag_sha1_value = etag_value[5:]
    if etag_sha1_value != content_sha1_value: # sha1 不一致退出
        print("etag err")
        sys.exit(0)
ipdb.City("c:/tmp/ipip_temp.ipdb") # ipdb自检,可能 Error,则不覆盖 重新下载。
shutil.copyfile("c:/tmp/ipip_temp.ipdb", "c:/tmp/ipip.ipdb") # 覆盖正式文件,目标目录必须有可写权限。
print("ok")
行业报告
云计算服务商2019-1H
云计算服务商2018-2H
云计算服务商2018-1H
云计算服务商2017-2H
云计算服务商2017-1H
产品服务
IP 地理位置定位
IP 应用场景
IPv4 高精度定位
IPv6 地理位置库
IPv4 风险画像
网络安全基础数据
BestTrace
Windows
Mac OS
iOS
Android
Linux
网络拨测
TraceRoute
PING
IP/ASN Whois 查询
Country ASNs
Internet eXchange
Best NetTools
关于IPIP
公司简介
工作机会
隐私声明
联系我们
联系我们
电话:010-85867767
售后技术QQ:290525907
邮件:sales(at)ipip.com
用户交流群:907401083
数据反馈:correction(at)ipip.com

本网站 SSL 证书由 TRUSTASIA 提供 本网站安全防护服务由 上海云盾 提供 京ICP备15064887号-6 京公网安备 11010502045129号