草庐IT

python - 在 Python 中缓存代理服务器

coder 2023-09-19 原文

我有一项家庭作业涉及用 Python 实现代理缓存服务器。我的想法是将我访问的网页写入本地计算机上的临时文件,然后在请求进入时访问它们(如果它们已存储)。现在代码看起来像这样:

from socket import *
import sys

def main():
    #Create a server socket, bind it to a port and start listening
    tcpSerSock = socket(AF_INET, SOCK_STREAM) #Initializing socket
    tcpSerSock.bind(("", 8030)) #Binding socket to port
    tcpSerSock.listen(5) #Listening for page requests
    while True:
        #Start receiving data from the client
        print 'Ready to serve...'
        tcpCliSock, addr = tcpSerSock.accept()
        print 'Received a connection from:', addr
        message = tcpCliSock.recv(1024)
        print message

        #Extract the filename from the given message
        print message.split()[1]
        filename = message.split()[1].partition("/")[2]
        print filename
        fileExist = "false"
        filetouse = "/" + filename
        print filetouse

        try: #Check whether the file exists in the cache
            f = open(filetouse[1:], "r")
            outputdata = f.readlines()
            fileExist = "true"
            #ProxyServer finds a cache hit and generates a response message
            tcpCliSock.send("HTTP/1.0 200 OK\r\n")
            tcpCliSock.send("Content-Type:text/html\r\n")
            for data in outputdata:
                tcpCliSock.send(data)
            print 'Read from cache'
        except IOError: #Error handling for file not found in cache
            if fileExist == "false":

                c = socket(AF_INET, SOCK_STREAM) #Create a socket on the proxyserver
                hostn = filename.replace("www.","",1) 
                print hostn
                try:
                    c.connect((hostn, 80)) #https://docs.python.org/2/library/socket.html
                    # Create a temporary file on this socket and ask port 80 for
                    # the file requested by the client
                    fileobj = c.makefile('r', 0)
                    fileobj.write("GET " + "http://" + filename + "HTTP/1.0\r\n")
                    # Read the response into buffer
                    buffr = fileobj.readlines()
                    # Create a new file in the cache for the requested file.
                    # Also send the response in the buffer to client socket and the
                    # corresponding file in the cache
                    tmpFile = open(filename,"wb")
                    for data in buffr:
                        tmpFile.write(data)
                        tcpCliSock.send(data)
                except:
                    print "Illegal request"
            else: #File not found
                print "404: File Not Found"
        tcpCliSock.close() #Close the client and the server sockets

main()

为了测试我的代码,我在我的本地主机上运行代理缓存并相应地设置我的浏览器代理设置

但是,当我运行这段代码并尝试使用 Chrome 访问 google 时,我收到了一个错误页面,上面写着 err_empty_response。

使用调试器单步执行代码让我意识到它在这一行失败了

c.connect((hostn, 80))

我不知道为什么。任何帮助将不胜感激。

附言我正在使用 Google Chrome、Python 2.7 和 Windows 10 对此进行测试

最佳答案

您不能在连接上使用名称。 Connect 需要一个 IP 地址来连接。

您可以使用getaddrinfo() 获取建立连接所需的套接字信息。 .在我的 pure-python-whois包我使用以下代码创建连接:

def _openconn(self, server, timeout, port=None):
    port = port if port else 'nicname'
    try:
        for srv in socket.getaddrinfo(server, port, socket.AF_UNSPEC, socket.SOCK_STREAM, 0, socket.AI_ADDRCONFIG):
            af, socktype, proto, _, sa = srv
            try:
                c = socket.socket(af, socktype, proto)
            except socket.error:
                c = None
                continue
            try:
                if self.source_addr:
                    c.bind(self.source_addr)
                c.settimeout(timeout)
                c.connect(sa)
            except socket.error:
                c.close()
                c = None
                continue
            break
    except socket.gaierror:
        return False

    return c

请注意,这不是很好的代码,因为循环实际上是无用的,而不是使用不同的替代方法。建立连接后,您才应该打破循环。但是,这应该作为使用 getaddrinfo()

的说明

编辑: 您也没有正确清理主机名。当我尝试访问 http://www.example.com/ 时,我得到了 /www.example.com/ ,这显然无法解决。我建议您使用正则表达式来获取缓存的文件名。

关于python - 在 Python 中缓存代理服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35714834/

有关python - 在 Python 中缓存代理服务器的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

    最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

  4. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

    在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

  5. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  6. ruby-on-rails - 在 Rails 中调试生产服务器 - 2

    您如何在Rails中的实时服务器上进行有效调试,无论是在测试版/生产服务器上?我试过直接在服务器上修改文件,然后重启应用,但是修改好像没有生效,或者需要很长时间(缓存?)我也试过在本地做“脚本/服务器生产”,但是那很慢另一种选择是编码和部署,但效率很低。有人对他们如何有效地做到这一点有任何见解吗? 最佳答案 我会回答你的问题,即使我不同意这种热修补服务器代码的方式:)首先,你真的确定你已经重启了服务器吗?您可以通过跟踪日志文件来检查它。您更改的代码显示的View可能会被缓存。缓存页面位于tmp/cache文件夹下。您可以尝试手动删除

  7. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  8. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

随机推荐